var LockScreen = new lockScreenClass();
function lockScreenClass() {
	this.mainCover = null;
	this.loginDiv = null;
	this.method = null;
	this.form = null;
	this.args = null;
	this.reqType = null;
	this.req = null;
	
	this.hideLogin = function() {
		document.getElementById("main_cover").style.display = "none";
		if (top.document.getElementById("headerFrame")) {
			top.document.getElementById("headerFrame").contentWindow.document.getElementById("main_menu_cover").style.display = "none";
		}
	}
	
	this.logout = function() {
		if (top.document.getElementById("headerFrame")) {
			var menuCover = top.document.getElementById("headerFrame").contentWindow.document.getElementById("main_menu_cover");
			menuCover.style.display = "block";
			menuCover.style.height = document.body.scrollHeight + "px";
			menuCover.style.width = document.body.scrollWidth + "px";
		}
		
		var bodyCover = document.getElementById("main_cover");
		bodyCover.style.display = "block";
		bodyCover.style.height = document.body.scrollHeight + "px";
		bodyCover.style.width = document.body.scrollWidth + "px";
		
		var loginDiv = document.getElementById("loginFormDiv");
		loginDiv.style.left = ((document.body.offsetWidth/2) - (loginDiv.offsetWidth/2)) + "px";
		loginDiv.style.top = (document.body.scrollTop + 200) + "px";
	}
	
	this.login = function(form) {
		AjaxRequest.submit(form, {"onSuccess":function (req) {
			LockScreen.hideLogin();
			if (LockScreen.reqType) {
				AjaxRequest.doRequest(LockScreen.method, LockScreen.args);
			} else {
				AjaxRequest.submit(LockScreen.form, LockScreen.args);
			}
		}, "onError":function (req) {
			alert("error");
		}});
	}
}

function AjaxRequest() {
    var req = new Object();
    req.timeout = null;
    req.generateUniqueUrl = true;
    req.url = window.location.href;
    req.method = "GET";
    req.async = true;
    req.username = null;
    req.password = null;
    req.parameters = new Object();
    req.requestIndex = AjaxRequest.numAjaxRequests++;
    req.responseReceived = false;
    req.groupName = null;
    req.queryString = "";
    req.responseText = null;
    req.responseXML = null;
    req.status = null;
    req.statusText = null;
    req.aborted = false;
    req.xmlHttpRequest = null;
    req.onTimeout = null;
    req.onLoading = null;
    req.onLoaded = null;
    req.onInteractive = null;
    req.onComplete = null;
    req.onSuccess = null;
    req.onError = null;
    req.onGroupBegin = null;
    req.onGroupEnd = null;
    req.xmlHttpRequest = AjaxRequest.getXmlHttpRequest();
    if (req.xmlHttpRequest == null) {
        return null;
    }
    req.xmlHttpRequest.onreadystatechange =
    function() {
        if (req == null || req.xmlHttpRequest == null) {
            return;
        }
        if (req.xmlHttpRequest.readyState == 1) {
            req.onLoadingInternal(req);
        }
        if (req.xmlHttpRequest.readyState == 2) {
            req.onLoadedInternal(req);
        }
        if (req.xmlHttpRequest.readyState == 3) {
            req.onInteractiveInternal(req);
        }
        if (req.xmlHttpRequest.readyState == 4) {
            req.onCompleteInternal(req);
        }
    };
    req.onLoadingInternalHandled = false;
    req.onLoadedInternalHandled = false;
    req.onInteractiveInternalHandled = false;
    req.onCompleteInternalHandled = false;
    req.onLoadingInternal =
    function() {
        if (req.onLoadingInternalHandled) {
            return;
        }
        AjaxRequest.numActiveAjaxRequests++;
        if (AjaxRequest.numActiveAjaxRequests == 1 && typeof(window['AjaxRequestBegin']) == "function") {
            AjaxRequestBegin();
        }
        if (req.groupName != null) {
            if (typeof(AjaxRequest.numActiveAjaxGroupRequests[req.groupName]) == "undefined") {
                AjaxRequest.numActiveAjaxGroupRequests[req.groupName] = 0;
            }
            AjaxRequest.numActiveAjaxGroupRequests[req.groupName]++;
            if (AjaxRequest.numActiveAjaxGroupRequests[req.groupName] == 1 && typeof(req.onGroupBegin) == "function") {
                req.onGroupBegin(req.groupName);
            }
        }
        if (typeof(req.onLoading) == "function") {
            req.onLoading(req);
        }
        req.onLoadingInternalHandled = true;
    };
    req.onLoadedInternal =
    function() {
        if (req.onLoadedInternalHandled) {
            return;
        }
        if (typeof(req.onLoaded) == "function") {
            req.onLoaded(req);
        }
        req.onLoadedInternalHandled = true;
    };
    req.onInteractiveInternal =
    function() {
        if (req.onInteractiveInternalHandled) {
            return;
        }
        if (typeof(req.onInteractive) == "function") {
            req.onInteractive(req);
        }
        req.onInteractiveInternalHandled = true;
    };
    req.onCompleteInternal =
    function() {
        if (req.onCompleteInternalHandled || req.aborted) {
            return;
        }
        req.onCompleteInternalHandled = true;
        AjaxRequest.numActiveAjaxRequests--;
        if (AjaxRequest.numActiveAjaxRequests == 0 && typeof(window['AjaxRequestEnd']) == "function") {
            AjaxRequestEnd(req.groupName);
        }
        if (req.groupName != null) {
            AjaxRequest.numActiveAjaxGroupRequests[req.groupName]--;
            if (AjaxRequest.numActiveAjaxGroupRequests[req.groupName] == 0 && typeof(req.onGroupEnd) == "function") {
                req.onGroupEnd(req.groupName);
            }
        }
        req.responseReceived = true;
        try {
        	req.status = req.xmlHttpRequest.status;
	        req.statusText = req.xmlHttpRequest.statusText;
	        req.responseText = req.xmlHttpRequest.responseText;
	        req.responseXML = req.xmlHttpRequest.responseXML;
	        if (typeof(req.onComplete) == "function") {
	            req.onComplete(req);
	        }
	        if (req.xmlHttpRequest.status == 200 && typeof(req.onSuccess) == "function") {
	        	if (AjaxRequest.checkLogout(req)) {
	        		LockScreen.logout();
	        	} else {
		            req.onSuccess(req);
	        	}
	        } else if (typeof(req.onError) == "function") {
	            req.onError(req);
	        }
	        delete req.xmlHttpRequest['onreadystatechange'];
	        req.xmlHttpRequest = null;
        } catch (e) {
        	if (console != null)
        		console.log(e);
        }
    };
    req.onTimeoutInternal =
    function() {
        if (req != null && req.xmlHttpRequest != null && !req.onCompleteInternalHandled) {
            req.aborted = true;
            req.xmlHttpRequest.abort();
            AjaxRequest.numActiveAjaxRequests--;
            if (AjaxRequest.numActiveAjaxRequests == 0 && typeof(window['AjaxRequestEnd']) == "function") {
                AjaxRequestEnd(req.groupName);
            }
            if (req.groupName != null) {
                AjaxRequest.numActiveAjaxGroupRequests[req.groupName]--;
                if (AjaxRequest.numActiveAjaxGroupRequests[req.groupName] == 0 && typeof(req.onGroupEnd) == "function") {
                    req.onGroupEnd(req.groupName);
                }
            }
            if (typeof(req.onTimeout) == "function") {
                req.onTimeout(req);
            }
            delete req.xmlHttpRequest['onreadystatechange'];
            req.xmlHttpRequest = null;
        }
    };
    req.process =
    function() {
        if (req.xmlHttpRequest != null) {
            if (req.generateUniqueUrl && req.method == "GET") {
                req.parameters["AjaxRequestUniqueId"] = new Date().getTime() + "" + req.requestIndex;
            }
            var content = null;
            for (var i in req.parameters) {
                if (req.queryString.length > 0) {
                    req.queryString += "&";
                }
                req.queryString += encodeURIComponent(i) + "=" + encodeURIComponent(req.parameters[i]);
            }
            if (req.method == "GET") {
                if (req.queryString.length > 0) {
                    req.url += ((req.url.indexOf("?") > -1)?"&":"?") + req.queryString;
                }
            }
            req.xmlHttpRequest.open(req.method, req.url, req.async, req.username, req.password);
            if (req.method == "POST") {
                if (typeof(req.xmlHttpRequest.setRequestHeader) != "undefined") {
                    req.xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
                }
                content = req.queryString;
            }
            if (req.timeout > 0) {
                setTimeout(req.onTimeoutInternal, req.timeout);
            }
            req.xmlHttpRequest.send(content);
        }
    };
    req.handleArguments =
    function(args) {
        for (var i in args) {
            if (typeof(req[i]) == "undefined") {
                req.parameters[i] = args[i];
            } else {
                req[i] = args[i];
            }
        }
    };
    req.getAllResponseHeaders =
    function() {
        if (req.xmlHttpRequest != null) {
            if (req.responseReceived) {
                return req.xmlHttpRequest.getAllResponseHeaders();
            }
            alert("Cannot getAllResponseHeaders because a response has not yet been received");
        }
    };
    req.getResponseHeader =
    function(headerName) {
        if (req.xmlHttpRequest != null) {
            if (req.responseReceived) {
                return req.xmlHttpRequest.getResponseHeader(headerName);
            }
            alert("Cannot getResponseHeader because a response has not yet been received");
        }
    };
    return req;
}
AjaxRequest.getXmlHttpRequest = function() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if (window.ActiveXObject) {/*@cc_on @*/
        /*@if(@_jscript_version >=5)
  try{return new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(E){return null;}}@end @*/
    } else {
        return null;
    }
};
AjaxRequest.isActive = function() {
    return(AjaxRequest.numActiveAjaxRequests > 0);
};
AjaxRequest.get = function(args) {
    AjaxRequest.doRequest("GET", args);
};
AjaxRequest.post = function(args) {
    AjaxRequest.doRequest("POST", args);
};
AjaxRequest.doRequest = function(method, args) {
    if (typeof(args) != "undefined" && args != null) {
        var myRequest = new AjaxRequest();
        myRequest.method = method;
        myRequest.handleArguments(args);
        myRequest.process();
        
        LockScreen.method = method;
        LockScreen.args = args;
        LockScreen.reqType = 1;
    }
};
AjaxRequest.submit = function(theform, args) {
    var myRequest = new AjaxRequest();
    if (myRequest == null) {
        return false;
    }
    var serializedForm = AjaxRequest.serializeForm(theform);
    myRequest.method = theform.method.toUpperCase();
    myRequest.url = theform.action;
    myRequest.handleArguments(args);
    myRequest.queryString = serializedForm;
    myRequest.process();

    if (theform.name != "loginForm") {
	    LockScreen.form = theform;
	    LockScreen.args = args;
	    LockScreen.reqType = 0;
    }
    return true;
};
AjaxRequest.serializeForm = function(theform) {
    var els = theform.elements;
    var len = els.length;
    var queryString = "";
    this.addField =
    function(name, value) {
        if (queryString.length > 0) {
            queryString += "&";
        }
        queryString += encodeURIComponent(name) + "=" + encodeURIComponent(value);
    };
    for (var i = 0; i < len; i++) {
        var el = els[i];
        if (!el.disabled) {
            switch (el.type) {case 'text': case 'password': case 'hidden': case 'textarea':
                this.addField(el.name, el.value);
                break;
                case 'select-one':
                    if (el.selectedIndex >= 0) {
                        this.addField(el.name, el.options[el.selectedIndex].value);
                    }break;
                case 'select-multiple':
                    for (var j = 0; j < el.options.length; j++) {
                        if (el.options[j].selected) {
                            this.addField(el.name, el.options[j].value);
                        }
                    }break;
                case 'checkbox': case 'radio':
                if (el.checked) {
                    this.addField(el.name, el.value);
                }break;}
        }
    }
    return queryString;
};
AjaxRequest.numActiveAjaxRequests = 0;
AjaxRequest.numActiveAjaxGroupRequests = new Object();
AjaxRequest.numAjaxRequests = 0;

AjaxRequest.checkLogout = function(req) {
	if (req.responseText.slice(0, 12) == "<!--LOGIN-->") return true;
	return false;
}