var lt = String.fromCharCode(187);
var gt = String.fromCharCode(9559);
var XMLHttpRequest = function(method, url, async)
{
	this.method = method;
	this.url = url;
	this.async = async;
	this.readyState = 0;
	this.iframe = null;
	this.responseText = null;
	this.header = new Object();
	this.id = "_xmlhttp_" + new Date().getTime();
	this.container = document.body;
	this.inProcess = false;
	this.retry = false;
	
	this.iframe = document.createElement("IFRAME");
	this.iframe.style.visibility = "hidden";
	this.iframe.style.position = "absolute";
	this.iframe.style.top = "0px";
	this.iframe.style.left = "0px";
	this.iframe.style.width = "0px";
	this.iframe.style.height = "0px";
	this.iframe.style.zIndex = "-1";
	this.iframe.id = this.id;
	
	if(document.getElementById(this.id) == null)
		this.container.appendChild(this.iframe);
		
	this.setRequestHeader("___xmlhttp", "iframe");
};

XMLHttpRequest.prototype.cleanUp = function()
{
	this.iframe.onreadystatechange = function(){};
	this.container.removeChild(this.iframe);
	_callBack = new XMLHttpRequest(this.method,this.url,this.async);
	postProcess();
	
	return false;
};

XMLHttpRequest.prototype.tryAgain = function()
{
	try{
		document.frames[0].document.forms[0].submit();
		this.retry = true;
	}catch(e)
	{
		alert(__notTryable);
	}
	return false;
};

XMLHttpRequest.prototype.setRequestHeader = function(name, value)
{
	// if(typeof(this.header[name]) == "undefined")
		this.header[name] = value;
};

XMLHttpRequest.prototype.send = function(data)
{
	data = data.replace(/</g,String.fromCharCode(187));
	
	var html = [];
	var tmp = page.getObj(page.getObj('__EVENTTARGET').value);
	
	html[html.length] = '<html><body><form method="' + this.method + '" action="' + this.url + '">';

	if(page.getObj('__VIEWSTATE') != null)
	    html[html.length] = '<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="'+page.getObj('__VIEWSTATE').value+'" />';
	
	if(document.activeElement != null && document.activeElement.name != 'undefined' && page.getObj('__EVENTTARGET') != null && (page.getObj('__EVENTTARGET').value == 'undefined' || page.getObj('__EVENTTARGET').value.length == 0))
	{
		html[html.length] = '<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="'+document.activeElement.name+'" />';
		if(page.getObj('__EVENTARGUMENT') != null && page.getObj('__EVENTARGUMENT').value == 'undefined')
		    html[html.length] = '<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />';
		else
		    html[html.length] = '<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="'+page.getObj('__EVENTARGUMENT').value+'" />';
		if(document.activeElement.type == "submit")
			html[html.length] = '<input type="hidden" name="'+document.activeElement.name+'"/>';
	}
	else if (tmp != null && tmp.type == "submit")
	{
	    html[html.length] = '<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="'+tmp.id+'" />';
	    html[html.length] = '<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />';
	    html[html.length] = '<input type="hidden" name="'+tmp.name+'"/>';
	}
	else 	
	{
	    if( page.getObj('__EVENTTARGET') != null && page.getObj('__EVENTTARGET').value == 'undefined' )
		    html[html.length] = '<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />';
		else if( page.getObj('__EVENTTARGET') != null )
		    html[html.length] = '<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="'+page.getObj('__EVENTTARGET').value+'" />';
		
		if( page.getObj('__EVENTARGUMENT') != null && page.getObj('__EVENTARGUMENT').value == 'undefined' )
		    html[html.length] = '<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />';
		else
		    html[html.length] = '<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="'+page.getObj('__EVENTARGUMENT').value+'" />';		
	}
	
	for(name in this.header)
		html[html.length] = '<textarea name="' + name + '">' + this.header[name] + '</textarea>';
	
	if(data != null && data.length > 0)
	    html[html.length] = '<textarea name="_data">' + data + '</textarea>';
	else
		html[html.length] = '<textarea name="_data"></textarea>';

	html[html.length] = '<s'+'cript>try{setTimeout(\"document.forms[0].submit();\",1);}catch(e){}</s'+'cript>';
	//html[html.length] = '<s'+'cript>try{setTimeout(\"document.location.replace(document.forms[0].action);\",1);}catch(e){}</s'+'cript>';
	
	// html[html.length] = '<input type="submit">';
	
	html[html.length] = '</form></body></html>';
	
	this.iframe._xmlhttp = this;
	this.iframe._xmlhttp._fix = -1;
	this.iframe._xmlhttp.responseText = null;
	this.iframe.onreadystatechange = this._onreadystatechange;
	this.inProcess = true;
	//alert(html.join('').replace(/\'/g,"\\'").replace(/\r\n/g, "\\r\\n"));		
	document.frames[this.iframe.id].document.write(html.join('').replace(/\'/g,"\\'").replace(/\r\n/g, "\\r\\n"));
	//document.frames[this.iframe.id].document.location.href = this.url;
	//document.frames[this.iframe.id].document.location.replace(this.url);
};

XMLHttpRequest.prototype._onreadystatechange = function()	
{
	this._xmlhttp._fix++;
	
	if(this._xmlhttp._fix < 1)
		return;
	
	if(this._xmlhttp._fix == 1)
	{
		this._xmlhttp.readyState = 1;
	}
	else if(this._xmlhttp._fix > 1)
	{
		switch(this.readyState.toString())
		{
			case "loading":			    
				this._xmlhttp.readyState = 2;
				break;

			case "interactive":
				this._xmlhttp.readyState = 3;
				break;

			case "complete":
				try{
					this._xmlhttp.responseText = window.frames[this.id].document.childNodes[0].childNodes[1].innerHTML;
					_params.delAll();
				}catch(e)
				{
					if(window.frames[this.id].document.URLUnencoded.toLowerCase().indexOf('login.aspx') != -1)
					{
						document.location.href = window.frames[this.id].document.URLUnencoded;
						return false;
					}
					this.onreadystatechange = function(){};					
					this._xmlhttp.cleanUp();
					alert(__msgNotDonable);
					break;
				}
				if(this._xmlhttp.responseText.substring(0,4) != "&gt;")
				{
					this.onreadystatechange = function(){};					
					this._xmlhttp.cleanUp();
					alert(__msgNotDonable);
				}
				else
				{
					process(this._xmlhttp.responseText);
					this.onreadystatechange = function(){};
					this._xmlhttp.readyState = 4;
					if(!this._xmlhttp.retry)
						this._xmlhttp.inProcess = false;
					else
						this._xmlhttp.cleanUp();
					break;
				}
		}	
	}
	
	if(typeof(this._xmlhttp.onreadystatechange) == "function")
			this._xmlhttp.onreadystatechange();
};

function preProcess()
{
	var obj = page.getObj('cover');
	if(obj != null)
	{
	    obj.style.width = document.body.scrollWidth;
	    obj.style.height = document.body.scrollHeight;
	    obj.style.display = 'block';	
	    try{
	        Element.setOpacity(obj, 0.5);
	    }catch(e){};
    	
	    var selects =document.getElementsByTagName('select');
	    for(var i = 0; i < selects.length; i++)
	    {
	        selects[i]._disabled = selects[i].disabled;
		    selects[i].disabled = true;
	    }
    }
	var _process = page.getObj('_Process');
	if (_process != null)
	{
    	var scrollX,scrollY,width,height;
        if (self.pageYOffset) // all except Explorer
        {
	        scrollX = self.pageXOffset;
	        scrollY = self.pageYOffset;
	        width = window.outerWidth;
	        height = window.outerHeight;
        }
        else if (document.documentElement && document.documentElement.scrollTop != null)
        {   // Explorer 6 Strict
	        scrollX = document.documentElement.scrollLeft;
	        scrollY = document.documentElement.scrollTop;
	        width = document.documentElement.clientWidth;
	        height = document.documentElement.clientHeight;
        }
        else if (document.body) // all other Explorers        	        
        {
	        scrollX = document.body.scrollLeft;
	        scrollY = document.body.scrollTop;
	        width = document.body.clientWidth;
	        height = document.body.clientHeight;
        }     

		_process.style.top = ((height-(screen.height/6))/2)+scrollY;
		_process.style.left = ((width-(screen.width/3.5))/2)+scrollX;
		_process.style.display = "block";
		_process.style.zIndex = "1001";
	}
};

function postProcess()
{
	var _process = page.getObj('_Process');
	if (_process != null)
		_process.style.display = "none";
	var cover = page.getObj('cover');
	if (cover != null)
	{
		cover.style.display = "none";
		var selects =document.getElementsByTagName('select');
	    for(var i = 0; i < selects.length; i++)
		    selects[i].disabled = selects[i]._disabled;
	}
		
	page.setFocus('');
	//setDGFocus(0);
};

function runLoad()
{
	if(typeof(document.body.onload) == "function")
	{
		var _load = document.body.onload;
		_load();
	}
};

function process(xmlText)
{
	_top = document.body.scrollTop;	
	var tmp = xmlText.replace(/&gt;/g,"<").replace(/&lt;/g,">");
	var _script = "";
	var msg = "";
	var tag = Xparse(tmp);
	doTag(tag,null);
		
	var startIndex,endIndex = -1;
	if(((startIndex = tmp.indexOf('____script')) != -1) && ((endIndex = tmp.indexOf('/____script')) != -1))
	{
	    _script = tmp.substring(startIndex+20,endIndex-4);
	    if(_script.lastIndexOf("alert('") != -1)
	    {
	        msg = _script.substr(_script.lastIndexOf("alert('"));
	        _script = _script.replace("alert('","//alert('");
	    }
	    eval(_script);
	}
	
	if(tmp.indexOf('__dg') != -1)
		runLoad();
	    
	document.body.scrollTop = _top;
	postProcess();
	if(msg.length > 0)
	    eval(msg);
};

function doTag(tag,obj)
{

	for(var i = 0; i < tag.contents.length; i++)
	{
		if(tag.contents[i].type == "element")
		{
			//alert('Element  ' + entity(tag.contents[i].name) + '  ' + entity(tag.contents[i].value));
			doTag(tag.contents[i],page.getObj(tag.contents[i].name));
		}
		if(tag.contents[i].type == "chardata" && strip(tag.contents[i].value).length > 0)
		{
			//alert('CData  ' + entity(tag.contents[i].value));
			//alert(tag.contents[i].value + obj.tagName);
			if(obj != null)
			    if(tag.attributes['filltype'] != 'undefined' && tag.attributes['filltype'] == 'content')
			        if(obj.tagName == "INPUT")
					    obj.outerHTML = tag.contents[i].value;
			        else if(obj.tagName == "SELECT")
					    obj.outerHTML = tag.contents[i].value;
					else if(obj.tagName == "IMG")
					    obj.outerHTML = tag.contents[i].value;
				    else
					    obj.outerHTML = tag.contents[i].value;
			    else
				    if(obj.tagName == "INPUT")
					    obj.value = entity(tag.contents[i].value);
			        else if(obj.tagName == "SELECT")
					    obj.value = entity(tag.contents[i].value);
					else if(obj.tagName == "IMG")
					    obj.src = entity(tag.contents[i].value);
				    else
					    obj.outerHTML = tag.contents[i].value;
		}
		if(tag.contents[i].type == "pi")
		{
			//alert('Pi  ' + entity(tag.contents[i].value));
		}
		if(tag.contents[i].type == "comment")
		{
			//alert('Comment  ' + entity(tag.contents[i].value));
		}
	}

};

function strip(str)
{
	if(str == null) return str;
	str = str.replace(/\n/g,"").replace(/ /g,"").replace(/\t/g,"");
	return str;
};

function entity(str)
{
	if(str == null) return str;		
	str = str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
	return str;
};

//this is the function that postback whole the form
function postBack(eventTarget, eventArgument)
{//document.location.pathname  "http://localhost:1184/default.aspx"
	if( _callBack == null )
//	    if(doRewriteUrl)
//	        _callBack = new XMLHttpRequest("POST",mapUrl,true);
//	    else
		    _callBack = new XMLHttpRequest("POST",document.location.href,true);

	if(_callBack.inProcess)
	{
		//alert('Not Again...');			
		return false;
	}
	
	if(page.getObj('__EVENTTARGET') != null)// && eventTarget != undefined && eventArgument != undefined)
	{
		page.getObj('__EVENTTARGET').value = eventTarget;
		page.getObj('__EVENTARGUMENT').value = eventArgument;
	}
	
	var tmp = "";
	_params.add('clientScreenWidth',screen.width);
	_params.add('clientScreenHeight',screen.height);
	_params.add('reloadID',reloadID);
	//alert(_params.toString());
	if(page.getObj('hParams') != null)	
	    page.getObj('hParams').value = _params.toString();
	var controls = document.forms[0].elements;
	for(var i = 0; i < controls.length; i++)
	{
		if(controls[i].tagName == "SELECT" && controls[i].selectedIndex != -1)
			tmp += "<it"+ i+ " n=\"" + controls[i].id + "\"><![CDATA[" + controls[i].options[controls[i].selectedIndex].value + "]]></it" + i + ">";
		else if(controls[i].tagName == "INPUT" && controls[i].name != "__VIEWSTATE" && controls[i].type == "hidden" && controls[i].name != "__EVENTTARGET" && controls[i].name != "__EVENTARGUMENT")
			_callBack.setRequestHeader(controls[i].name,controls[i].value);
		else
			if(controls[i].tagName == "INPUT" && controls[i].id.length > 0 && controls[i].type != "submit" && controls[i].type != "button" && controls[i].type != "hidden")
				tmp += "<it"+ i+ " n=\"" + controls[i].id + "\"><![CDATA[" + controls[i].value + "]]></it" + i + ">";
	}

	preProcess();
	//setTimeout('_callBack.send(\''+tmp+'\');',0);
	_callBack.send(tmp);
	return false;
};

function paramClass()
{
    this.params = new Array();
    this.length = 0;
    function addRange(str)
    {
        var tmp = str.split(';');
        for(var i = 0; i < tmp.length;i++)
            this.params[tmp[i].split('=')[0].toString().toLowerCase()] = tmp[i].split('=')[1];
        this.length = this.params.length;
    };
    function add(key,value)
    {
        this.params[key.toString().toLowerCase()] = value;
        this.length = this.params.length;
    };
    function update(key,value)
    {
        this.params[key.toString().toLowerCase()] = value;
        this.length = this.params.length;
    };
    function del(key)
    {
        delete this.params[key.toString().toLowerCase()];
        this.length = this.params.length;
    };
    function delAll()
    {
        for(key in this.params)
            delete this.params[key.toString().toLowerCase()];
        this.length = this.params.length;
    };
    function item(key)
    {
        return this.params[key.toString().toLowerCase()];
    };
    function toString()
    {
        var tmp = '';
        for(key in this.params)
            tmp += (tmp.length !=0 ? '&':'') + key.replace(/&/g,'%%amp;') + '=' + this.params[key].toString().replace(/&/g,'%%amp;');
        return tmp;
    };
    
    this.add = add;
    this.addRange = addRange;
    this.del = del;
    this.delAll = delAll;
    this.item = item;
    this.toString = toString;
};

var _callBack;
var _params = new paramClass;
