var Popup = function() {        
    //variable de stockage du div servant à empêcher les actions avec la souris par l'utilisateur pendant que la popup est active
    var popUid = "popup_"+(Math.random()*Math.random()).toString().replace("0.","");
    var dom = null;
    var lifeTimeTimer = null;
    //Callback ajax
    function DoCallback(url,method,params,successHandler,errorHandler) 
    {
        function DecodeResponse(responseText) {
            if (responseText.indexOf("{") == 0) return eval("(" + responseText + ")");
            else return responseText;
            //else return eval("(\"" + responseText + "\")");
        }
        function AjaxCallback(config) 
        {
            var paramsStr = "";
            var url = config.Url;
            var method = config.Method;
            method = method.toUpperCase();
            if(method!="POST" && method!="GET") alert("No http request method defined for ajax callback");
            if(typeof(config.Params)=="object") {
                for(param in config.Params) 
                {
                    if(paramsStr!="") paramsStr+="&";
                    paramsStr+=param+"="+config.Params[param].toString();
                }
            }
            var request = new XMLHttpRequest();
            switch (method) {
                case "POST":
                    request.open("POST", url, true);
                    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    request.setRequestHeader("Content-length", paramsStr.length);
                    request.setRequestHeader("Connection", "close");
                    request.onreadystatechange = function() {//Call a function when the state changes.
                        if (request.readyState == 4) {
                            if (request.status == 200) 
                            {
                                if(!IsNull(successHandler) && (typeof(successHandler) == "function")) {
                                    
                                    successHandler(DecodeResponse(request.responseText));
                                }
                                else return DecodeResponse(request.responseText);
                            }
                            else if ((errorHandler != null) && (typeof(errorHandler) == "function")) {
                                //alert('ok'+request.status);
                                errorHandler(request.status);
                            }
                            else alert("Erreur HTTP: " + request.status);
                        }
                    }
                    request.send(paramsStr);
                    break;
                case "GET":
                    if (url.indexOf("?") > 0) url += "&" + paramsStr;
                    else url += "?" + paramsStr;
                    request.open("GET", url, true);
                    request.onreadystatechange = function() {//Call a function when the state changes.
                        if (request.readyState == 4) {
                            if (request.status == 200) {
                                if ((successHandler != null) && (typeof (successHandler) == "function")) {
                                    successHandler(DecodeResponse(request.responseText));
                                }
                                else return DecodeResponse(request.responseText);
                            }
                            else if ((errorHandler != null) && (typeof (successHandler) == "function")) {
                                errorHandler(request.status);
                            }
                            else alert("Erreur HTTP: " + request.status);
                        }
                    }
                    request.send(null);
                    break;
                default:
                    alert("Invalid http method for callback");
                    break;
            }
        };
        new AjaxCallback({Url:url,Method:method,Params:params});
    }
    //Events handlers
    function Close() {
        if(!IsNull(dom)) {
            var body = document.getElementsByTagName("body")[0];
            body.removeChild(dom);
            dom=null;
            DomHelper.DisablePage(false);
            clearTimeout(lifeTimeTimer);
            if(typeof(SetAutomaticPosition)=="function") {
                RemoveListener(window,"resize",SetAutomaticPosition);
                RemoveListener(window,"scroll",SetAutomaticPosition);
                SetAutomaticPosition = null;
            }
        }
    }
    //fonctions internes
    function SetPopupTheme(theme) {
        //dom elements css class settings
        dom.className = theme+"_container";   
        document.getElementById(popUid+"_header").className = theme+"_header";
        document.getElementById(popUid+"_headerLeft").className = theme+"_header_left";
        document.getElementById(popUid+"_headerRight").className = theme+"_header_right";              
        document.getElementById(popUid+"_headerCenter").className = theme+"_header_center";  
        document.getElementById(popUid+"_headerTitle").className = theme+"_header_title";
        document.getElementById(popUid+"_headerCloseButton").className = theme+"_header_closeButton";
        document.getElementById(popUid+"_contentContainer").className = theme+"_content_container";            
        document.getElementById(popUid+"_contentContainerTop").className = theme+"_content_container_top";
        document.getElementById(popUid+"_contentContainerTopLeft").className = theme+"_content_container_top_left";
        document.getElementById(popUid+"_contentContainerTopRight").className = theme+"_content_container_top_right";            
        document.getElementById(popUid+"_contentContainerMiddle").className = theme+"_content_container_middle";
        document.getElementById(popUid+"_contentContainerMiddleLeft").className = theme+"_content_container_middle_left";
        document.getElementById(popUid+"_contentContainerMiddleRight").className = theme+"_content_container_middle_right";            
        document.getElementById(popUid+"_contentContainerMiddle").className = theme+"_content_container_middle_content";           
        document.getElementById(popUid+"_contentContainerBottom").className = theme+"_content_container_bottom";
        document.getElementById(popUid+"_contentContainerBottomLeft").className = theme+"_content_container_bottom_left";
        document.getElementById(popUid+"_contentContainerBottomRight").className = theme+"_content_container_bottom_right";
        //_content_container_top
    }
    function SetPopupPosition(newPosX,newPosY) {
        var isAutomaticPosition = false;
        if(IsNull(newPosX)) newPosX = "center";
        if(IsNull(newPosY)) newPosY = "middle";  
        if(typeof(newPosX) == "string") {
            switch(newPosX.toLowerCase()) {
                case "left":
                    newPosX=0;
                break;
                case "center":
                    newPosX = ((Browser.GetWidth()/2)-(DomHelper.GetWidth(dom)/2))+Browser.GetScrollX();
                    isAutomaticPosition = true;
                break;
                case "right":
                    newPosX = (Browser.GetWidth()-DomHelper.GetWidth(dom))+Browser.GetScrollX();
                    isAutomaticPosition = true;
                break;
                case "mouse":
                    newPosX = Browser.GetMouseX();
                break;
            }
        }
        if(typeof(newPosX) == "number") {
            if(newPosX<0) {
                newPosX=0;
            }
            else if((newPosX+DomHelper.GetWidth(dom)) > (Browser.GetWidth()+Browser.GetScrollX())) 
            {
                newPosX = (Browser.GetWidth()+Browser.GetScrollX())-DomHelper.GetWidth(dom);
            }
            dom.style.left = newPosX+"px";
        }
        if(typeof(newPosY) == "string") {
            switch(newPosY.toLowerCase()) {
                case "top":
                    newPosY=0;
                break;
                case "middle":
                    newPosY = ((Browser.GetHeight()/2)-(DomHelper.GetHeight(dom)/2))+Browser.GetScrollY();
                    isAutomaticPosition = true;
                break;
                case "bottom":
                    
                    newPosY = (Browser.GetHeight()-DomHelper.GetHeight(dom))+Browser.GetScrollY();
                    window.status = newPosY;
                    isAutomaticPosition = true;
                break;
                case "mouse":
                    newPosY = Browser.GetMouseY();
                break;
            }
        }
        if(typeof(newPosY) == "number") {
            if(newPosY<0) {
                newPosY=0;
            }
            else if((newPosY+DomHelper.GetHeight(dom)) > (Browser.GetHeight()+Browser.GetScrollY())) 
            {
                newPosY = (Browser.GetHeight()+Browser.GetScrollY())-DomHelper.GetHeight(dom);
            }
            dom.style.top = newPosY+"px";
        }
        return isAutomaticPosition;
    } 
    var SetAutomaticPosition=null;
    function ApplyPopupSettings(settings) {
        for(var prop in defaultSettings) {
            if(IsNull(settings[prop])) settings[prop] = defaultSettings[prop];
        }
        //apply popup theme if defined.
        if(!INES(settings["Theme"])) SetPopupTheme(settings["Theme"]);
        //set display closing button
        document.getElementById(popUid+"_headerCloseButton").style.display =(!IsNull(settings["AllowClose"]) && (settings["AllowClose"]===true))?"block":"none";
        //set size params
        var minWidth = settings["MinWidth"];
        var minHeight = settings["MinHeight"];
        if(minWidth <= 50) minWidth=100;
        if(minHeight <= 50) minHeight = 100;
        var maxWidth =settings["MaxWidth"];
        var maxHeight =settings["MaxHeight"];
        var width = settings["Width"];
        var height = settings["Height"];
        if(width<=0) width = DomHelper.GetWidth(dom);
        if(height<=0) height = DomHelper.GetHeight(dom);
        if((maxWidth>0) && (width>maxWidth)) width = maxWidth;
        if((maxHeight>0) && (height>maxHeight)) height = maxHeight;
        if((minWidth>0) && (width<minWidth)) width = minWidth;
        if((minHeight>0) && (height<minHeight)) height = minHeight;
        dom.style.width=width+"px";
        dom.style.height=height+"px";
        //Set title if defined in the header title div container
        if(!INES(settings["Title"])) document.getElementById(popUid+"_headerTitle").innerHTML = settings["Title"];
        //content container type
        var contentContainerDom = document.getElementById(popUid+"_contentContainer");
        var contentcontainerTop=parseInt(DomHelper.GetStyle(contentContainerDom,"top"));
        //TODO : check and adjust for opera and ie.
        var contentContainerDomHeight = (height-contentContainerDom.offsetTop) + contentcontainerTop;
        contentContainerDom.style.height = contentContainerDomHeight+"px";     
        //content container middle height
        var contentContainerTopHeight = DomHelper.GetHeight(document.getElementById(popUid+"_contentContainerTop"));
        var contentContainerBottomHeight = DomHelper.GetHeight(document.getElementById(popUid+"_contentContainerBottom"));            
        var contentContainerMiddleHeight = contentContainerDomHeight-(contentContainerTopHeight+contentContainerBottomHeight);
        document.getElementById(popUid+"_contentContainerMiddle").style.height = contentContainerMiddleHeight+"px";
        //content container content holder            
        var contentContainerType = "iframe";
        var contentContainerMiddleContentHolder = document.getElementById(popUid+"_contentContainerMiddleContent");
        contentContainerMiddleContentHolder.style.position="relative";
        contentContainerMiddleContentHolder.style.left = DomHelper.GetWidth(document.getElementById(popUid+"_contentContainerMiddleLeft"))+"px";
        contentContainerMiddleContentHolder.style.width = DomHelper.GetWidth(contentContainerDom)-DomHelper.GetWidth(document.getElementById(popUid+"_contentContainerMiddleLeft"))-DomHelper.GetWidth(document.getElementById(popUid+"_contentContainerMiddleRight"))+"px";
        contentContainerMiddleContentHolder.style.height = DomHelper.GetHeight(contentContainerDom)-DomHelper.GetHeight(document.getElementById(popUid+"_contentContainerTop"))-DomHelper.GetHeight(document.getElementById(popUid+"_contentContainerBottom"))+"px";
        
        //Set pop position
        var posX = settings["X"];
        var posY = settings["Y"];
        var isAutomaticPosition = SetPopupPosition(posX,posY);
        SetAutomaticPosition=function() {SetPopupPosition(posX,posY);}             
        if(isAutomaticPosition===true) {
            AddListener(window,"resize",SetAutomaticPosition);
            AddListener(window,"scroll",SetAutomaticPosition);
        }
        else {
            RemoveListener(window,"resize",SetAutomaticPosition);
            RemoveListener(window,"scroll",SetAutomaticPosition);
        }
        var disablingPageSettings = settings["DisablePageSettings"];
        if(!IsNull(disablingPageSettings)) {
            var disable = (disablingPageSettings["Disable"]===true)?true:false;
            DomHelper.DisablePage(disable,disablingPageSettings);
        }
        dom.style.zIndex = 1000001;//DomHelper.GetMaxDepth();
        //content container content holder            
        var contentContainerType = (!INES(settings["ContainerType"]))?settings["ContainerType"].toLowerCase():"div";
        var contentContainerMiddleContentHolder = document.getElementById(popUid+"_contentContainerMiddleContent");
		var contentUrl = settings["ContentUrl"];
		var content = "";
		function OnCallbackSuccess(response) {
            contentContainerMiddleContentHolder.innerHTML = ((typeof(response)=="object") && (!IsNull(response.Message)))?response.Message:response;
             if(IsNull(settings['ShowAfterDataLoad']) || settings['ShowAfterDataLoad']!==false) {
                ShowPopup(settings);
            }
            if(!IsNull(settings["OnSuccessExternalHandler"]) && typeof(settings["OnSuccessExternalHandler"])=="function") {
                settings["OnSuccessExternalHandler"](response);
            }
        }
        function OnCallbackError() {
            contentContainerMiddleContentHolder.innerHTML = (!IsNull(settings["AjaxCallErrorMessage"]))?settings["AjaxCallErrorMessage"]:"Une erreur s'est produite. L'action n'a pas pu &ecirc;tre termin&eacute;";
            if(IsNull(settings['ShowAfterDataLoad']) || settings['ShowAfterDataLoad']!==false) {
                ShowPopup(settings);
            }            
            if(!IsNull(settings["OnErrorExternalHandler"]) && typeof(settings["OnErrorExternalHandler"])=="function") {
                settings["OnErrorExternalHandler"]();
            }
        }
		if (!INES(settings["Content"])) {
		    content=settings["Content"];
		    if(IsNull(settings['ShowAfterDataLoad']) || settings['ShowAfterDataLoad']!==false) {
                ShowPopup(settings);
            }
		}
		else if(!IsNull(settings["Content"])) 
		{
		    content = (!IsNull(settings["Content"].LoadingMessage))?settings["Content"].LoadingMessage:"Chargement en cours...";
		    DoCallback(settings["Content"].Url,settings["Content"].Method,settings["Content"].Params,OnCallbackSuccess,OnCallbackError);
		}
		else content = "No content defined";
        if(contentContainerType!="iframe") {
            contentContainerMiddleContentHolder.style.overflow="auto";
            contentContainerMiddleContentHolder.innerHTML = content;
        }
        if(contentContainerType.toLowerCase() == "iframe") {
            contentContainerMiddleContentHolder.innerHTML = "<iframe src='"+contentUrl+"' width='98%' height='100%' allowtransparency='true' style='background-color:transparent;border-width:0px' frameborder='0'></iframe>";
        }
    }
    function BuildPopupDom() {
        //dom elements creation
        dom = document.createElement("div");
        var headerDom = document.createElement("div");
        var headerLeftDom = document.createElement("div");           
        var headerRightDom = document.createElement("div");
        var headerCenterDom = document.createElement("div"); 
        var headerCloseButtonDom = document.createElement("div");
        var headerTitleDom = document.createElement("div");  
        var contentContainerDom = document.createElement("div");
        var contentContainerTopDom = document.createElement("div");
        var contentContainerTopLeftDom = document.createElement("div");
        var contentContainerTopRightDom = document.createElement("div");
        var contentContainerBottomDom = document.createElement("div");
        var contentContainerBottomLeftDom = document.createElement("div");
        var contentContainerBottomRightDom = document.createElement("div");
        var contentContainerMiddleDom = document.createElement("div");
        var contentContainerMiddleLeftDom = document.createElement("div");
        var contentContainerMiddleRightDom = document.createElement("div");
        var contentContainerMiddleContentDom = document.createElement("div");
        //dom elements id attribute settings 
        dom.setAttribute("id",popUid+"_container");
        headerDom.setAttribute("id",popUid+"_header");
        headerLeftDom.setAttribute("id",popUid+"_headerLeft"); 
        headerRightDom.setAttribute("id",popUid+"_headerRight");
        headerCenterDom.setAttribute("id",popUid+"_headerCenter");
        headerCloseButtonDom.setAttribute("id",popUid+"_headerCloseButton");
        headerCloseButtonDom.innerHTML = "<img src='/images/dot.gif' width='20' height='20' alt='Fermer' title='Fermer' />";
        headerTitleDom.setAttribute("id",popUid+"_headerTitle");            
        contentContainerDom.setAttribute("id",popUid+"_contentContainer");
        contentContainerTopDom.setAttribute("id",popUid+"_contentContainerTop");
        contentContainerTopLeftDom.setAttribute("id",popUid+"_contentContainerTopLeft");
        contentContainerTopRightDom.setAttribute("id",popUid+"_contentContainerTopRight");
        contentContainerBottomDom.setAttribute("id",popUid+"_contentContainerBottom");
        contentContainerBottomLeftDom.setAttribute("id",popUid+"_contentContainerBottomLeft");
        contentContainerBottomRightDom.setAttribute("id",popUid+"_contentContainerBottomRight");
        contentContainerMiddleDom.setAttribute("id",popUid+"_contentContainerMiddle");
        contentContainerMiddleLeftDom.setAttribute("id",popUid+"_contentContainerMiddleLeft");
        contentContainerMiddleRightDom.setAttribute("id",popUid+"_contentContainerMiddleRight");
        contentContainerMiddleContentDom.setAttribute("id",popUid+"_contentContainerMiddleContent");
        //dom elements event handlers
        AddListener(headerCloseButtonDom,"click",Close);
        //dom elements aggregation  
        headerDom.appendChild(headerLeftDom);
        headerDom.appendChild(headerRightDom);
        headerDom.appendChild(headerCenterDom); 
        headerCenterDom.appendChild(headerCloseButtonDom);
        headerCenterDom.appendChild(headerTitleDom);
                    
        contentContainerTopDom.appendChild(contentContainerTopLeftDom);
        contentContainerTopDom.appendChild(contentContainerTopRightDom);            
        contentContainerMiddleDom.appendChild(contentContainerMiddleLeftDom);
        contentContainerMiddleDom.appendChild(contentContainerMiddleRightDom);   
        contentContainerMiddleDom.appendChild(contentContainerMiddleContentDom);            
        contentContainerBottomDom.appendChild(contentContainerBottomLeftDom);
        contentContainerBottomDom.appendChild(contentContainerBottomRightDom);
        contentContainerDom.appendChild(contentContainerTopDom);
        contentContainerDom.appendChild(contentContainerMiddleDom);
        contentContainerDom.appendChild(contentContainerBottomDom);            
        dom.appendChild(headerDom);
        dom.appendChild(contentContainerDom);
    } 
    function ShowPopup(settings) {
        var lifeTime = settings["LifeTime"]; 
        if(!IsNull(lifeTime) && typeof(lifeTime)=="number" && lifeTime>0) {
            lifeTimeTimer=setTimeout(Close,lifeTime);
        }
        dom.style.visibility="visible";
    }
    var defaultSettings = {
        Theme:"popup",
        AllowClose:true,
        X:"center",
        Y:"middle",
        MinWidth:100,
        MinHeight:100,
        MaxWidth:700,
        MaxHeight:500,
        LifeTime:0,
        Width:0,
        Height:0,
        DisablePageSettings:{
            Disable:true,
            Color:"#000",
            Opacity:10,
            Depth:2000000
        },
        Content:"No content defined"
    };         
    this.DefaultSettings = defaultSettings;
    this.Open=function(settings) 
    {
        if(IsNull(settings) || (typeof(settings)!="object")) settings={};
        if(IsNull(dom))
        {
            BuildPopupDom();
        }
        if(IsNull(document.getElementById(dom.id)))
        {            
            dom.style.visibility="hidden";
            document.getElementsByTagName('body')[0].appendChild(dom); 
        }
        ApplyPopupSettings(settings);
        if(!IsNull(settings['ShowAfterDataLoad']) || settings['ShowAfterDataLoad']===false) {
            ShowPopup(settings);
        }
    }
    this.LoadContent=function(content) {}
    this.LoadUrl=function(url) {}
    this.Close=function() {Close();}
}
window["Popup"] = new Popup();