
    // Application ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Application = Class.create();
    Application.prototype =
    {
        sVersion : null,
        sPath : null,

        initialize : function()
        {
            this.sVersion = "?";
            this.sPath = "";
        },

        getVersion : function()
        {
            return this.sVersion;
        },

        getPath : function()
        {
            return this.sPath;
        }
    };

    Application.oInstance = null;
    Application.getInstance = function(p_sString)
    {
        if(Application.oInstance == null)
        {
            Application.oInstance = new Application();
        }

        return Application.oInstance;
    };

    // Static methods
    {
        Application.getVersion = function()
        {
            return Application.getInstance().getVersion();
        };

        Application.getPath = function()
        {
            return Application.getInstance().getPath();
        };
    }



    // Localization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Localization = Class.create();
    Localization.prototype =
    {
        sLanguage : "fr_FR",
        aTranslations : null,

        initialize : function()
        {
            this.aTranslations = [];
        },

        setLanguage : function(p_sLanguage)
        {
            this.sLanguage = p_sLanguage;
        },

        getLanguage : function()
        {
            return this.sLanguage;
        },

        setTranslation : function(p_sString, p_sTranslation)
        {
            this.aTranslations[p_sString] = p_sTranslation;
        },

        getTranslation : function(p_sString)
        {
            return this.aTranslations[p_sString];
        }
    };

    Localization.oInstance = null;
    Localization.getInstance = function(p_sString)
    {
        if(Localization.oInstance == null)
        {
            Localization.oInstance = new Localization();
        }

        return Localization.oInstance;
    };

    // Static methods
    {
        Localization.setLanguage = function(p_sLanguage)
        {
            if(!bChanged || confirmChangesLoss())
            {
                window.location.href = setURLParameter(window.location.href, "language", p_sLanguage);
            }
        };

        Localization.getLanguage = function(p_sString)
        {
            return Localization.getInstance().getLanguage();
        };

        Localization.setTranslation = function(p_sString, p_sTranslation)
        {
            Localization.getInstance().setTranslation(p_sString, p_sTranslation);
        };

        Localization.getTranslation = function(p_sString)
        {
            return Localization.getInstance().getTranslation(p_sString);
        };

        // Load some strings from a XML element.
        Localization.load = function(xLocalization)
        {
            var aStrings = xLocalization.getElementsByTagName("string");
            var aTranslations;
            var iTranslationIndex;
            var xTranslation;
            var sTranslation
            var iIndex;
            for(iIndex = 0; iIndex < aStrings.length; ++iIndex)
            {
                // Select the appropiate translation, according to the current language.
                aTranslations = aStrings[iIndex].getElementsByTagName("translation");
                for(iTranslationIndex = 0; iTranslationIndex < aTranslations.length; ++iTranslationIndex)
                {
                    xTranslation = aTranslations[iTranslationIndex];
                    sTranslation = "";//"?" + aStrings[iIndex].getAttribute("id") + "?";
                    if(xTranslation.getAttribute("language") == Localization.getLanguage())
                    {
                        if(xTranslation["firstChild"] && xTranslation.firstChild.nodeType == 3)
                        {
                            sTranslation = xTranslation.firstChild.nodeValue;
                            break;
                        }
                    }
                }

                Localization.setTranslation(aStrings[iIndex].getAttribute("id"), sTranslation);
            }
        };
    }

	var oLanguageDialog = null;
	Event.observe(window, 'load', function()
	{
		var oLanguageItem = $('languageMenuItem');
		if(oLanguageItem)
		{
			oLanguageDialog = new Dialog(oLanguageItem.down("a"),
			{
			});
		}
	});

	function hideLanguageDialog()
	{
		if(oLanguageDialog)
		{
			oLanguageDialog.close();
		}
	}



    // Change detection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    {
        bChanged = false;

        function notifyChange()
        {
            bChanged = true;
        }

        function confirmChangesLoss()
        {
            return confirm(Localization.getTranslation("message.confirmChangesLoss"));
        }
    }


    // Navigation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    {
        function go(p_sURL)
        {
            if(!bChanged || confirmChangesLoss())
            {
                window.location.href = p_sURL;
            }
        }
        
        function search()
        {
            var sURL = "/searchResults.php";//window.location.href;
            var oSearchField = $("searchField");
            if(oSearchField.value)
            {
                sURL = setURLParameter(sURL, "search", escape(oSearchField.value));
                go(sURL);
            }
            else
            {
                sURL = removeURLParameter(sURL, "search");
                go(sURL);
            }
        }

        function getURLParameter(p_sURL, p_sParameter)
        {
            var r_sValue = null;
            var oPattern = new RegExp("[\\?&]" + p_sParameter + "=([^&#]*)");
            var aResults = oPattern.exec(p_sURL);
            if(aResults != null)
            {
                r_sValue  = unescape(aResults[1]);
            }
            return r_sValue;
        }

        function setURLParameter(p_sURL, p_sParameter, p_sValue)
        {
            var r_sURL = p_sURL;

            // First, remove the parameter if it exists yet.
            if(getURLParameter(p_sURL, p_sParameter))
            {
                r_sURL = removeURLParameter(p_sURL, p_sParameter);
            }

            // If the URL contains parameters, add the parameter after '&'
            if(r_sURL.indexOf("?") > -1)
            {
                r_sURL += "&";
            }
            else
            {
                // If the URL does not contain any parameter, add the parameter after '?'
                r_sURL += "?";
            }

            r_sURL += p_sParameter + "=" + p_sValue;

            return r_sURL;
        }

        function removeURLParameter(p_sURL, p_sParameter)
        {
            var r_sURL = p_sURL;
            if(getURLParameter(p_sURL, p_sParameter))
            {
                var iIndex = p_sURL.indexOf("?");
                var r_sURL = p_sURL.substring(0, iIndex);
                if(iIndex > -1)
                {
                    aParameters = p_sURL.substring(iIndex + 1).split("&");
                    var sParameter;
                    var bFirstParameter = true;
                    for(iIndex = 0; iIndex < aParameters.length; ++iIndex)
                    {
                        sParameter = aParameters[iIndex];
                        if(sParameter.split("=")[0] != p_sParameter)
                        {
                            if(bFirstParameter)
                            {
                                r_sURL += "?";
                                bFirstParameter = false;
                            }
                            else
                            {
                                r_sURL += "&";
                            }
                            r_sURL += sParameter;
                        }
                    }
                }
            }

            return r_sURL;
        }
    }



	// Authentication ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	var oLogInDialog = null;
	Event.observe(window, 'load', function()
	{
		var oLogInItem = $('logInMenuItem');
		if(oLogInItem)
		{
			oLogInDialog = new Dialog(oLogInItem.down("a"),
			{
			});
		}
	});

	function setUpLogInDialogFieldsListeners()
	{
		var logInOnKeyEnter = function(p_oEvent)
        {
            oKeyEvent = new KeyEvent(KeyEvent.Type.PRESSED, p_oEvent);
            if(oKeyEvent.getCode() == KeyEvent.ENTER)
            {
                logIn();
            }
        };

		$("logInDialogUserField").observe("keydown", logInOnKeyEnter);
		$("logInDialogPasswordField").observe("keydown", logInOnKeyEnter);
	}

	function showLogInDialog()
	{
		if(oLogInDialog)
		{
			oLogInDialog.open();
			$("logInDialogUserField").focus();
		}
	}

	function hideLogInDialog()
	{
		if(oLogInDialog)
		{
			oLogInDialog.close();
		}
	}

	function logIn()
	{
	    $('logInForm').submit();
	}


	function logOut()
	{
	    go("/logOut.php");
	}
    
    
    function sendPass() {
	    $('sendPassForm').submit();
	}
    
	function forgetPassForm() {
	   $('forgetPassForm').style.display='';
	   $('forgetPassLink').style.display='none';
	}
    
