//Company           : Webtech Software & Services Ltd.
//Devloper          : Avik Das
//Project Leader    : Bhaskar Maity

//Date              : 24th Jan, 2008

//------------------------------------Usefull functions/variables-----------------------------------------
var ajaxRequestQueueHead=null;
//-----------------------------------------------------------------------------------------------
//function findAbsPos(obj){
//    var curLeft=curTop=0;
//    if(obj.offsetParent){
//        curLeft=obj.offsetLeft;
//        curTop=obj.offsetTop;
//        while(obj=obj.offsetParent){
//            curLeft+=obj.offsetLeft;
//            curTop+=obj.offsetTop;
//        }
//    }
//    return [curLeft,curTop];
//}
//------------------------------------------STATUS CODE--------------------------------------------
var Res_Code_Continue=100;
var Res_Code_Switching_protocols=101;
var Res_Code_OK=200;
var Res_Code_Created=201;
var Res_Code_Accepted=202;
var Res_Code_Non_Authoritative_Information=203;
var Res_Code_No_Content=204;
var Res_Code_Reset_Content=205;
var Res_Code_Partial_Content=206;
var Res_Code_Multiple_Choices=300;
var Res_Code_Moved_Permanently=301;
var Res_Code_Found=302;
var Res_Code_See_Other=303; 
var Res_Code_Not_Modified=304;
var Res_Code_Use_Proxy=305;
var Res_Code_Temporary_Redirect=307;
var Res_Code_Bad_Request=400;
var Res_Code_Unauthorized=401;
var Res_Code_Payment_Required=402;
var Res_Code_Forbidden=403;
var Res_Code_Not_Found=404;
var Res_Code_Method_Not_Allowed=405;
var Res_Code_Not_Acceptable=406;
var Res_Code_Proxy_Authentication_Required=407;
var Res_Code_Request_Timeout=408;
var Res_Code_Conflict=409;
var Res_Code_Gone=410;
var Res_Code_Length_Required=411;
var Res_Code_Precondition_Failed=412;
var Res_Code_Request_Entity_Too_Large=413;
var Res_Code_Request_URI_Too_Long=414;
var Res_Code_Unsupported_Media_Type=415;
var Res_Code_Requested_Range_Not_Suitable=416;
var Res_Code_Expectation_Failed=417;
var Res_Code_Internal_Server_Error=500;
var Res_Code_Not_Implemented=501;
var Res_Code_Bad_Gateway=502;
var Res_Code_Service_Unavailable=503;
var Res_Code_Gateway_Timeout=504;
var Res_Code_HTTP_Version_Not_Supported=505;
//------------------------------------READY STATE------------------------------------------------
var Res_Ready_Uninitialized=0;
var Res_Ready_Open=1;
var Res_Ready_Send=2;
var Res_Ready_Receiving=3;
var Res_Ready_Loaded=4;
//------------------------------clsWsslContentProxyManager---------------------------------------
var REQUEST_TIMEOUT=30000;//Declare in culture handlers
var PostedFileContCallback=null;
function clsWsslContentProxyManager(contentPlaceHolder,url){
	var xmlHttp;
	var _thisRef=this;
	var objLockDiv;
	var reqStart,reqResive,reqEnd;//for calculate time
	this.startupFunction=null;
	this.onError=null;
	
	this.getResponse=function(callbackFunction, errorCallbackFunction, reqUrl){
	    xmlHttp=GetXmlHttpObject();
	    _thisRef.startupFunction=callbackFunction;
	    _thisRef.onError=errorCallbackFunction;
		xmlHttp.onreadystatechange =onGetResponse;
		xmlHttp.open("GET", reqUrl, true);
	    xmlHttp.send(null);	
	}
	function onGetResponse(){
        if(xmlHttp.readyState == Res_Ready_Loaded){
            if(xmlHttp.status == Res_Code_OK){
                if(_thisRef.startupFunction) _thisRef.startupFunction(xmlHttp.responseText);
            }else{
                if(_thisRef.onError) _thisRef.onError(xmlHttp.responseText);
            }			                                
        }
    }
    
	this.updateContent=function(){
		try{
		    if(!addInRequestQueue(url)) return false;
			xmlHttp=GetXmlHttpObject();
			xmlHttp.onreadystatechange = changeContent;		
			
			setTimer(xmlHttp);
			
			xmlHttp.open("GET",url,true);
			
			if(contentPlaceHolder){
			    var containerAbsPos=findAbsPos(contentPlaceHolder);
	            showAjaxBlocker(true,containerAbsPos[0],containerAbsPos[1],contentPlaceHolder.offsetHeight,contentPlaceHolder.offsetWidth);
	        }
	        
	        reqStart=new Date();
	        xmlHttp.send(null);	
		}
		catch(e){
			alert("Error:" + e.message);
			if(contentPlaceHolder) showAjaxBlocker(false);
		}
	}
	
	this.postForm=function(strRequest){
	    try{   
			var containerAbsPos=findAbsPos(contentPlaceHolder);
			showAjaxBlocker(true,containerAbsPos[0],containerAbsPos[1],contentPlaceHolder.offsetHeight,contentPlaceHolder.offsetWidth);
			
			xmlHttp=GetXmlHttpObject();
			xmlHttp.onreadystatechange = changeContent;
			
		    setTimer(xmlHttp);
		    
			//contentPlaceHolder.innerHTML="WAIT....................";
			disableElement(contentPlaceHolder); 
			xmlHttp.open("POST",url,true);
			xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlHttp.setRequestHeader("Content-length", strRequest.length);
            xmlHttp.setRequestHeader("Connection", "close");
			
			reqStart=new Date();
			xmlHttp.send(strRequest);
		}
		catch(e){
		    showAjaxBlocker(false);
			alert("Error:" + e.message);
		}
	}
	
	var bufferFrame;
	this.postFileContainerForm=function(conForm){
	    
	    bufferFrame=document.getElementById("frmBufferFrame");
	    if(!bufferFrame){
	        var bufferContainer=document.createElement("div");
	        bufferContainer.style.display="none";
	        bufferContainer.innerHTML="<iframe src=\"#\" id=\"frmBufferFrame\" name=\"frmBufferFrame\"/>";
	        document.body.appendChild(bufferContainer);
	        bufferFrame=document.getElementById("frmBufferFrame");
	    }
	    
	    conForm.target="frmBufferFrame";
	    conForm.onsubmit=null;
	    PostedFileContCallback=FileContFormCallback;
	    conForm.submit();
	}
	
	function FileContFormCallback(doc){
	    contentPlaceHolder.innerHTML="";
	    if(contentPlaceHolder!=null)
            contentPlaceHolder.appendChild(doc.body.cloneNode(true));
	}
	
	function setTimer(httpobj){
	    return setTimeout(function(){
			                    if((typeof httpobj.abort) && httpobj.readyState != Res_Ready_Loaded){
			                        xmlHttp.abort();
			                        document.location=TIMEOUTPAGE + "?returnUrl=" + document.location;
			                        //contentPlaceHolder.innerHTML="Request Timeout";
			                    }
			              },REQUEST_TIMEOUT);
	}
	
	function changeContent(){   
		if(xmlHttp.readyState == Res_Ready_Loaded){
		     reqResive=new Date();
		     showAjaxBlocker(false);
			 removeFromRequestQueue();
			 try{
			     if(xmlHttp.status == Res_Code_OK){//start on success part----------------------------------------
				    //set html
                    if(contentPlaceHolder!=null){
                        contentPlaceHolder.innerHTML=xmlHttp.responseText;
                        
                        var setTargetRef;
                        var defaultButton;
                        var ajaxForms=contentPlaceHolder.getElementsByTagName("form");
                        if(ajaxForms!=null){
                            for(var fIndex=0;fIndex<ajaxForms.length;fIndex++){
                                defaultButton=null;
                                for(var bIndex=0;bIndex<ajaxForms[fIndex].length;bIndex++){
                                    if(ajaxForms[fIndex][bIndex].type=="submit"){
                                        defaultButton=ajaxForms[fIndex][bIndex];
                                        break;
                                    }
                                }
                                if(defaultButton!=null) ajaxForms[fIndex].setAttribute("eventTarget",defaultButton.name)
                                setTargetRef=new setEventTarget(ajaxForms[fIndex]);
                                wssl.addEvent(ajaxForms[fIndex],"click",onclick=setTargetRef.setTarget,false);
                            }
                        }
				        //register client Scripts
				        var reg=new RegExp("<script[^>]*>([\u0001-\uFFFF]*?)</script>","gim");
                        var scriptBlocks=xmlHttp.responseText.match(reg);              
                        if(scriptBlocks!=null){
                            var script;
                            var scriptBlock;
				            var nodeValue="";
                            reg=new RegExp("(<script[^>]*>|</script>)","gim");
                            var tagSrcExp=new RegExp("src=\"[\u0001-\uFFFF][^\"]+\"","gim");
                            var srcExpression=new RegExp("\"[\u0001-\uFFFF][^\"]+\"","gim");
                            var matches;
                            var src;
                            for(var index=0;index<scriptBlocks.length;index++){
                                matches=scriptBlocks[index].match(reg);
                                if(matches!=null && matches.length>0){
                                    matches=matches[0].match(tagSrcExp);
                                    if(matches!=null && matches.length>0){
                                        src=matches[0];
                                    }
                                }
                                script=scriptBlocks[index].replace(reg,"");
				                scriptBlock=document.createElement("script");
				                scriptBlock.type="text/javascript";
    				            
				                if(src!=null) scriptBlock.src=src.match(srcExpression)[0].replace(new RegExp("\"","g"),"");
				                else{
				                    if(typeof scriptBlock.text!="Undefined")
				                        scriptBlock.text=script;
				                    else
				                        scriptBlock.nodeValue=script;
				                }
				                contentPlaceHolder.appendChild(scriptBlock);
				                src=null;
                            }
				        }
    				}
    				//raiseCallbackEvent:
				    if(_thisRef.startupFunction!=null){
				    
				       if(typeof _thisRef.startupFunction=='string')
				            eval(_thisRef.startupFunction);
				       else if(contentPlaceHolder==null)
				             _thisRef.startupFunction(xmlHttp.responseText);
				       else
				            _thisRef.startupFunction(contentPlaceHolder);
				    }
				    //alert(contentPlaceHolder.innerHTML);
                 
                 }//end on success part-----------------------------------------------------------------
                 
                 else if(xmlHttp.status == 201){//start redirect part
                    var redirectLocation=xmlHttp.getResponseHeader("Location");
                    if(redirectLocation!=null) document.location=redirectLocation;
                 }//end redirect part

                 else {//else error part
                   contentPlaceHolder.innerHTML="Status: "+ xmlHttp.statusText + ".\nResponseText: " + xmlHttp.responseText;
                }
                
                reqEnd=new Date();
                //alert("Start at:" + reqStart.toTimeString() + "\nReceive at:" + reqResive.toTimeString() + "\n[" + ((reqResive-reqStart)/100) + " sc]\nEnd at:" + reqEnd.toTimeString() + "\n[" + ((reqEnd-reqStart)/100) + " sc]");
           }//end try
           catch(e){
                reqEnd=new Date();
                alert("Start at:" + reqStart.toTimeString() + "\nReceive at:" + reqResive.toTimeString() + "\n[" + ((reqResive-reqStart)/100) + " sc]\nEnd at:" + reqEnd.toTimeString() + "\n[" + ((reqEnd-reqStart)/100) + " sc]");
                contentPlaceHolder.innerHTML=e.message;
           }
        }
        else{
            //contentPlaceHolder.innerHTML="Wait....";
        }  		
	}
	
	function showAjaxBlocker(show,left,top,height,width){
	    var objLoader;
        if(show){
            
            objLockDiv=document.createElement("div");
            
            contentPlaceHolder.appendChild(objLockDiv);
            
            
            objLockDiv.className='ajaxBlocker';
            objLockDiv.id=contentPlaceHolder.id + "_AjaxBlocker";
            //objLockDiv.innerHTML+=objLockDiv.id + "<br>";
            objLockDiv.innerHTML+="<br/><br/><br/>" + "Loading .....";
            
            //contentPlaceHolder.
            objLockDiv.style.top=parseInt(top) + "px";
            //objLockDiv.style.left=parseInt(left) + "px";
            objLockDiv.style.height=parseInt(height) + "px";
            objLockDiv.style.width=parseInt(width) + "px";
            
            objLoader=document.createElement("div");
            objLoader.style.top=(parseInt(objLockDiv.style.height)/2-16) + "px";
            objLoader.style.left=(parseInt(objLockDiv.style.width)/2)-16 + "px";
            
            objLockDiv.style.display="";
            objLoader.style.display="";
            
            
            objLockDiv.appendChild(objLoader);
            
            //add into document
            
            //alert("Added " + objLockDiv.id);
            
        }
        else {
            //objLockDiv=document.getElementById(contentPlaceHolder.id + "_AjaxBlocker");
            
            if(objLockDiv!=null) 
            {   objLockDiv.style.display='none';
                objLockDiv.parentNode.removeChild(objLockDiv);
                objLockDiv=null;
            }
            else{
                if(contentPlaceHolder!=null)
                    alert(contentPlaceHolder.id + "_AjaxBlocker " + " not found!");
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //using for protected from duplicate request
    function addInRequestQueue(){
        var currentHead;
        var isExist=false;
        if(ajaxRequestQueueHead!=null){
            currentHead=ajaxRequestQueueHead;
            do{
                if(currentHead.url==url){
                    isExist=true;
                    return false;
                }
                else{
                    currentHead=currentHead.next;
                }
            }while(currentHead.next!=null)
            
            currentHead.next={"url":url,"next":null};    
        }
        else{
            ajaxRequestQueueHead={"url":url,"next":null};   
        }
        return true;
    }
    //============================================================================================
    function removeFromRequestQueue(){
        var currentHead;
        var prevHead=null;
        if(ajaxRequestQueueHead!=null){
            currentHead=ajaxRequestQueueHead; 
            do{
                if(currentHead.url==url){
                    if(prevHead==null) ajaxRequestQueueHead=currentHead.next;
                    else prevHead.next=currentHead.next;
                    currentHead=null;
                    break;
                }
                else{
                    prevHead=currentHead;
                    currentHead=currentHead.next;
                }
            }while(currentHead.next!=null)
        }
        return true;
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////////
	function GetXmlHttpObject(){
		var xmlHttp=null;
		try{
  			// Firefox, Opera 8.0+, Safari
  			xmlHttp=new XMLHttpRequest();
  		}
		catch (e){
  			// Internet Explorer
  			try{
    			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    		}
  			catch (e){
    			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    		}
  		}
		return xmlHttp;
	}
}

//-----------------------------------clsContentPlaceHolders-----------------------------------------
function clsContentPlaceHolders(){
	var contentPlaceHoldersArr=new Array();

	this.add=function(holderId,url){
		contentPlaceHoldersArr.push(new clsContentPlaceHolder(holderId,url));
	}
	
	this.update=function(startupFunction){
		for(var Index=0;Index<contentPlaceHoldersArr.length;Index++){
			var objProxy=new clsWsslContentProxyManager(contentPlaceHoldersArr[Index].holder,contentPlaceHoldersArr[Index].url);
			objProxy.startupFunction=startupFunction;
			objProxy.updateContent();
		}
	}
	
	this.updateContainer=function(holderId,url,startupFunction){
	        
		    var holder=document.getElementById(holderId);
		    var objProxy=new clsWsslContentProxyManager(holder,url);
		    objProxy.startupFunction=startupFunction;
		    objProxy.updateContent();
	}
}
//----------------------------------------------------------------------------------------------------------
//Post any form as ajax form
function ourDoPostBack(eventTarget,formId)
{
    var hdnEventTaget=document.getElementById("__MYEVENTTARGET");
    var reqForm=document.getElementById(formId);
    if(hdnEventTaget) hdnEventTaget.value=eventTarget;
    submitMeAsAjaxForm(reqForm);
}
//-----------------------------------------------------------------------------------------------------------
//Submit any from ajax request return true(if unable to submit this form)
//the form will be submited with normal method
function submitMeAsAjaxForm(reqForm){   
    try{
        var holder;
        var target=reqForm.target;
        var requestUrl=reqForm.getAttribute("requestUrl");
        
        if (requestUrl==null) requestUrl=reqForm.action;
        else reqForm.action=requestUrl;
        
        
        if(target!=null && target!="") holder=document.getElementById(target);
        else holder=reqForm.parentNode.parentNode;
        
        if(holder!=null){
            var objProxy=new clsWsslContentProxyManager(holder,requestUrl);
            //objProxy.startupFunction=formResponseSuccess;
            objProxy.postForm(createFormPacket(reqForm));
            //objProxy.postFileContainerForm(reqForm);
        }
        else{
            alert("Target not found");
        }
        return false;
    }
    catch(e){
        alert(e.message);
        return true;
    }
}
////Sucess on Form Post
//function formResponseSuccess(activeContainer){
//    //do somthing if required
//    
//}
//Set Event Target
function setEventTarget(ele){
    this.setTarget=function(eve){
                        var target=typeof eve.srcElement!="undefined"?eve.srcElement:eve.target;
                        //alert(ele.defaultButton);
                        if(target.name!="undefined" && target.type=="submit")
                            ele.setAttribute("eventTarget",target.name)
                   }
}
//Create a form submit request string
function createFormPacket(reqForm){
    var strPacket=new String();
    strPacket="";
    var isFirst=true;
    var hdnEventTarget=document.getElementById("__MYEVENTTARGET");
    var eventTarget=reqForm.getAttribute("eventTarget");
    if(eventTarget!=null) eventTarget=reqForm[eventTarget];
    var isInclude;
    
    for(var index=0;index<reqForm.length;index++){        
        isInclude=false;
        
        if(eventTarget!=null && eventTarget==reqForm[index]) isInclude=true;
        else if(reqForm[index].type=='button' || reqForm[index].type=='submit') continue;
              
        if((reqForm[index].type=="radio" || reqForm[index].type=="checkbox") && reqForm[index].checked==true)
            isInclude=true;
        else if((reqForm[index].type!="radio" && reqForm[index].type!="checkbox")) isInclude=true;
        
        if(isInclude){
            if(!isFirst){ strPacket+="&";} else {isFirst=false;}
            strPacket+=reqForm[index].name + "=" + encodeURIComponent(reqForm[index].value);
        }
            
    }
            
    if(hdnEventTarget!=null){
        strPacket+="&__MYEVENTTARGET=" + encodeURI(hdnEventTarget.value);
        hdnEventTarget.value=""; 
    }
    
    //alert(strPacket);
    return strPacket;
}

//-----------------------------------clsContentPlaceHolder-----------------------------------------
function clsContentPlaceHolder(holderId,url){
	this.holderId=holderId;
	this.holder=document.getElementById(holderId);
	this.url=url;
}


//User Just use this object and its method only to update contents
var contentPlaceHolders=new clsContentPlaceHolders();

function updateContainer(holderId,url,startupFunction){
    //alert(startupFunction);
    var holder=(holderId!=null)?document.getElementById(holderId):null;
    url=resolveClientUrl(url);
    if(holder) disableElement(holder);    
    
    var objProxy=new clsWsslContentProxyManager(holder,url);
    //alert(objProxy);
    objProxy.startupFunction=startupFunction;
    objProxy.updateContent();
}


