(function ($) {

    var Config = {
        Container: "",
        CurrentPlugin: "",
        IsFirefox: false,
        IsFirstCall: false
    }

    $.fn.Travelmind = function (options) {
        // sovrascrivo le proprietà con quelle eventualmente passate
        if (options) {
            Config = $.extend(Config, options);
        }
        Config.Container = $(this);

        Init();
    };

    function Init() {

        // ricavo il tipo di browser
        BrowserDetect();

        //
        InitLogin();

        // avvio il plugin per la gestione degli stati di pagina
        InitHistoryBrowser();

        // avvio il plugin di utility
        $.fn.Utility();

        // imposto i bindings
        Bindings();
    }


    function BrowserDetect() {
        if (navigator.userAgent.indexOf("Firefox") != -1) {
            Config.IsFirefox = true;
        }
    }

    function Bindings() {
        // gestisco il refresh del browser        
        window.onbeforeunload = function () {
            if (Config.IsFirefox) {
                RestorePlugin(Config.CurrentPlugin);
            } else {
                var result = true; // confirm("L'operazione richiesta comporta il riavvio o il termine dell'applicazione.\nSi desidera proseguire?");
                if (result) {
                    $.history.load("Home");
                } else {
                    return false;
                }
            }
        };
    }


    function InitLogin() {
        // Omer 19/04/2011
        // CREAZIONE CANALE FRIGERIO B2C
        // Attenzione modifica eseguita per agganciare al b2c il markup b2b
        // E' necessario impostare il sid = 0 così valorizza l'oggetto agenzia nella loginautomatica
        // ma non trovando un agenzia valida mette l'idagenzia a 0 
        // quindi con idagenzia a 0 e isb2b =true possiamo applicre il markupb2b anche in accesso b2c 
        // senza cambiare nulla nel resto della applicativo se non qui con queste 2 istruzioni

        // Stefano
        // "senza cambiare nulla nel resto dell'applicativo?", ma ci abbiamo pensato bene?
        // tutte le logiche dell'applicativo che accendono/spengono le funzionalità b2b/b2c si basano su queste variabili.
        // di fatto ora il b2c ha accesso a funzionalità b2b che non dovrebbe poter accedere.
        // ora per correggere questo problema dobbiamo inserire altre pezze (un po' dappertutto), e il programma degenera sempre di più..
        // questo tipo di interventi deve essere assolutamente essere abolito se vogliamo garantire un minimo di longevità al programma.
        // è da pianificare un intervento di bonifica x questa parte.

        var isB2B2C = false;
        var isB2b = true;
        var sid = "0";
        // ***********************************************************************************
        $("#box_login").Login({ Sid: sid, IsB2B2C: isB2B2C, IsB2B: isB2b });
    }



    function InitHistoryBrowser() {
        $.history.init(function (plugin) {
            if (plugin == "") {
                Config.IsFirstCall = true;
                InitApplication();
            } else {
                Config.IsFirstCall = false;
                if (plugin != Config.CurrentPlugin) {
                    RestorePlugin(plugin);
                }
            }
        }, { unescape: ",/" });
    }


    function LoadPlugin(plugin, config) {
        // distruggo il plugin corrente prima di passare al successivo
        if (Config.CurrentPlugin != "" && Config.CurrentPlugin != plugin) {
            eval("$.fn." + Config.CurrentPlugin + ".Destroy();");
        }
        // setto il nome del nuovo plugin che vado a caricare
        Config.CurrentPlugin = plugin;

        // avvio il plugin        
        $("#page").fadeOut("fast", function () {
            if (!Config.IsFirstCall) {
                ShowLoader();
            }
            eval('$("#page").' + plugin + '(config);');
            $("#page").unbind("ComponentLoaded");
            $("#page").bind("ComponentLoaded", function () {
                $("#page").fadeIn("fast", function () {
                    if (!Config.IsFirstCall) {
                        CloseLoader();
                    }
                    $("html, body").animate({ scrollTop: 0 }, 'slow');
                });
            });
        });

    }


    // ricava le configurazioni salvate e riavvia il plugin
    function RestorePlugin(plugin) {

        // ricavo le configurazioni del plugin
        var config = {};
        if (Config.IsFirefox) {
            var sessionData = $("#session" + plugin).val();
            config = $.parseJSON(sessionData);
        } else {
            config = $.data(Config.Container, plugin);
        }

        LoadPlugin(plugin, config);
    }

    // salva lo stato del plugin nell'history del browser
    function SalvaStato(plugin, config) {
        if (Config.IsFirefox) {
            var sessionData = JSON.stringify(config);
            $("#session" + plugin).val(sessionData);
        } else {
            var newConfig = $.extend(true, {}, config);
            $.data(Config.Container, plugin, newConfig);
        }
        $.history.load(plugin);
    }

    // inizializza l'applicazione
    function InitApplication() {
        plugin = $.request("Page");
        plugin = (plugin == "") ? "Home" : plugin;
        Config.IsFirstCall = (plugin == "Home") ? true : false;
        var parameters = $.requestAll();
        parameters = (parameters != "") ? parameters : {};
        var config = { FormData: parameters };
        LoadPlugin(plugin, config);
    }



    // FUNZIONI DI PUBBLICO ACCESSO
    $.fn.Travelmind.LoadPlugin = function (plugin, formData) {
        var config = { "FormData": formData };
        LoadPlugin(plugin, config);
    }

    $.fn.Travelmind.RestorePlugin = function (plugin) {
        RestorePlugin(plugin);
    }

    $.fn.Travelmind.SaveState = function (plugin, config) {
        SalvaStato(plugin, config);
    }



    function ShowLoader() {
        $("#loader").dialog({
            width: 410,
            title: "Caricamento...",
            modal: true,
            draggable: false,
            close: function () {
                $(this).dialog("destroy");
            }
        });
        $("#loader").dialog('open');
    }

    function CloseLoader() {
        $("#loader").dialog("close");
    }


    $.fn.Travelmind.AdjustBoxHeight = function (box1, box2) {
        var filler = 60;
        var box1Height = $(box1).height();
        var box2Height = $(box2).height();
        if (box1Height > box2Height) {
            $(box2).height(box1Height + filler);
        } else {
            $(box1).height(box2Height + filler);
        }
    }

    $.fn.Travelmind.RoundCorners = function () {
        $(".rounded").corner();
        $(".rounded_top").corner("top");
        $(".rounded_right").corner("right");
        $(".rounded_bottom").corner("bottom");
        $(".rounded_left").corner("left");
        $(".rounded_input").corner("2px");
        $(".rounded_check").corner("2px");
    }

})(jQuery);
