// start zzAjax.js
////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////
var zzQueuedReqs = new Array(); // array of queued request objects
//var zzHttpObject = ''; //'';  // contains reference to active XMLHttpRequest object
var zzDataObject = '';  // contains reference to active parameter data object
var zzInProgress = 0; // 0=NOT in progress   1=In progress
//alert(zzInProgress);
var zzLoadMsg = '<b>Loading...</b>';  // Contains html to display a loading msg
//alert(zzLoadMsg);
var zzErrorMsg = '<b>Your Browser does NOT support XMLHttpRequest ..... Bye!</b>';
//alert(zzErrorMsg);
var zzLoc = '';
var zzErr = '';
var zzMsg = '';
////////////////////////////////////////////////////////////
//
//
//
////////////////////////////////////////////////////////////
function zzGetPostData1()
{
	var userid = 'David';
	var password = 'Badboys'; 
	var querystring = 'userid='+encodeURIComponent(userid)+'&password='+encodeURIComponent(password);
	alert(querystring);
	return querystring;
}

function zzGetPostData(  ){
    var queryString = '';
    var frm = document.forms[0];
    var numberElements =  frm.elements.length;
    for(var i = 0; i < numberElements; i++) {
        if(i < numberElements-1) {
            queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value)+"&";
        } else {
            queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value);
        }

    }
	//alert(queryString);
    return queryString;	
}

function zzGetPostData2()
{
	var data="";
      var first="";
      for (name in document.forms[0].elements) {
      	data += first + name + "=" + escape(document.forms[0].elements[name].value);
            first="&";
      }
	document.forms[0].elements['userid'].value = data;
      return data;
}	

function zzAjaxGet(reqUri,msgElementId,errElementId,locElementId,reqHandler,reqHeaderType)
{
    //alert(reqUri);
    var zzReqObject = new ZZRequestData();
    if(zzReqObject){
        if(reqUri){
            zzReqObject.reqUri = ZZParseUri(reqUri);
        } else {
            alert('The URI parameter is required to use ZZAjax');
        }         
        //alert(zzReqObject.reqUri);
        zzReqObject.reqType = 'GET';
        if(reqHeaderType){
            zzReqObject.reqHeaderType = reqHeaderType;
        } else {
            zzReqObject.reqHeaderType = 'HTML'
        }        
        if(msgElementId){
            zzReqObject.reqMsgElementId = msgElementId;
        } else { 
            zzReqObject.reqMsgElementId = '';
        }
        if(errElementId){
            zzReqObject.reqErrElementId = errElementId;
        } else {
            zzReqObject.reqErrElementId = '';
        }    
        if(locElementId){
            zzReqObject.reqLocElementId = locElementId;
        } else {
            zzReqObject.reqLocElementId = '';
        }    
        if(reqHandler){
            zzReqObject.reqHandler = reqHandler;
        } 
        ZZQueueRequest(zzReqObject);
        //zzMsg = zzReqObject.reqMsgElementId;
        //ZZAjaxSend(zzReqObject);
    }              
}

function ZZRequestData(){
    this.objId = 'DATAREQ';
    this.reqUri = '';
    this.reqType = 'GET';
    this.reqHandler = '';
    this.reqHeaderType = 'HTML';
    this.reqMsgElementId = '';
    this.reqErrElementId = '';
    this.reqLocElementId = '';
    this.postdata = '';		
    this.reqMsgDataFlag = 0;
    this.reqErrDataFlag = 0;
    this.reqMsgData = '';
    this.reqErrData = '';
}




function ZZParseUri(reqUri){
    var uri = reqUri;
    var newUri = '';
    var first = 0;
    var second = 0;
    var elementId = '';
    // make a random string to prevent caching
    var random = Math.random() * Date.parse(new Date()); 
    if(uri.indexOf('::') > 0){
        while (uri.length > 0){
            first = uri.indexOf('::');
            if(first>0){
                newUri = newUri + uri.substring(0,first);
                uri = uri.substring(first+2);
            } else {
                newUri = newUri + uri;
                uri = '';
            }    
            if(uri.length>0){
                second = uri.indexOf('::');
                if(second>0){
                    elementId = uri.substring(0,second);
                    uri = uri.substring(second+2);
                } else {
                    elementId = uri.substring(0);
                    uri = '';
                }
            }
            newUri = newUri + document.getElementById(elementId).value;
        }
    } else {
        newUri = uri;
    }    
    
    if(newUri.indexOf('?')>0){
        newUri = newUri + '&zzon=1&pagename=home&rand=' + random;
    } else {
        newUri = newUri + '?zzon=1&pagename=home&rand=' + random;
    }
    //alert(newUri);          
    return newUri;             
}

function ZZQueueRequest(zzObject){
	if(zzObject){
	    if(zzObject.objId == 'DATAREQ'){   // process only data request objects             
	        zzQueuedReqs[zzQueuedReqs.length] = zzObject;
	        //zzQueuedReqs.unshift(zzObject); // add object to array
	    }
	}
	if(zzQueuedReqs.length > 0){
	    if(zzInProgress == 0){  //No request in progress lets check queue and proceed
	        zzDataObject = zzQueuedReqs[0];
	        if(zzDataObject){
	            if(zzDataObject.objId == 'DATAREQ'){
	                zzQueuedReqs.shift();
	                zzInProgress = 1;
	                ZZAjaxSend();
	            } else {
	                zzQueuedReqs.shift();
	            }    
	        } else {
	            zzQueuedReqs.shift();
	        }    
	    }
	}                
}

function ZZAjaxSend(zzObject){
    var zzHttpObject = false;
    //zzLoc = '';
    //zzMsg = '';
    //zzErr = '';
    //var zzDataObject = false;
    //alert('in to send');
    if(zzObject){
        if(zzObject.objId == 'DATAREQ'){
            zzDataObject = zzObject;
            //zzLoc = zzObject.reqLocElementId;
            //zzErr = zzObject.reqErrElementId;
            //zzMsg = zzObject.reqMsgElementId;
        }    
    }
    if(zzDataObject){
        //alert('got data object');
        if(zzDataObject.objId == 'DATAREQ'){
            
            //if(!zzHttpObject){
            if(window.XMLHttpRequest){ // client use Firefox, Opera etc - Non Microsoft product
                try {
                    zzHttpObject = new XMLHttpRequest();
                } catch(e) {
                    zzHttpObject = false;
                }
            } else {
                if(window.ActiveXObject){ // client use Internet Explorer
                    try {
                        zzHttpObject = new ActiveXObject("Msxml2.XMLHTTP");
                    } catch(e) {
                        try {
                            zzHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch(e) {
                            zzHttpObject = false;
                        }
                    }
                } else {
                    zzHttpObject = false;
                    if(zzDataObject.reqErrElementId == ''){
                        // some work
                    } else {    
                        document.getElementById(zzDataObject.reqErrElementId).innerHTML = zzErrorMsg;
                    }    
                }
            }
            
            if(zzHttpObject){
                //alert('into http');
                if(zzDataObject.reqType == 'POST'){
                    zzHttpObject.open("POST", ZZUrlEncode(zzDataObject.reqUri), true);
                    zzDataObject.postdata = "?"+zzGetPostData();
			  if(zzDataObject.reqHeaderType == 'XML'){
                        zzHttpObject.setRequestHeader('Content-Type', "text/xml");
                    } else {
                        
				zzHttpObject.setRequestHeader('Content-Type', "application/x-www-form-urlencoded");
				zzHttpObject.setRequestHeader('Content-Type', "text/plain");

                    }
                } else {
                    //alert('get request');
                    zzHttpObject.open("GET", ZZUrlEncode(zzDataObject.reqUri), true);
                    zzDataObject.postdata = '';
			  if(zzDataObject.reqHeaderType == 'XML'){
                        zzHttpObject.setRequestHeader('Content-Type', "text/xml");
                    } else {
                        zzHttpObject.setRequestHeader('Content-Type', "text/plain");
                    }                                
                }
                zzHttpObject.onreadystatechange = function ()
                { 
                if(zzHttpObject.readyState == 4){ //&& (zzHttpObject.status == 200)){        
                    //alert('into response function');
                    //alert(zzDataObject.reqLocElementId);
                    //alert(zzHttpObject.responseText);
			//  document.all.loading.style.visibility="hidden";	
                    //if(zzDataObject.reqHandler == ''){
                        if(zzDataObject.reqLocElementId == ''){
                            var zzStr = '';
                            var zzId = '';
                            var zzHtml = zzHttpObject.responseText;
                            var zzPos1 = 0;
                            var zzPos2 = 0;
                            var zzPos3 = 0;
				    var zzTag2 = 'div';
				    var zzTag = '';	
                            while (zzHtml.length>0){
                                zzPos1 = zzHtml.indexOf('>');
                                zzStr = trim(zzHtml.substring(0,zzPos1+1));
                                zzPos3 = zzStr.indexOf('id=');
                                zzChar = zzStr.substring(zzPos3+3,zzPos3+4);
                                zzPos4 = zzStr.indexOf(zzChar,zzPos3+5);
                                zzId = zzStr.substring(zzPos3+4,zzPos4);
					  zzStr = trim(zzStr);	
                                zzPos5 = zzStr.indexOf(" ",0);
					  if(zzPos5>0){
						zzTag2 = zzStr.substring(1,zzPos5);
					  }
					  if(zzPos5=-1){
						zzTag2 = zzStr.substring(1,4);
					  }
					  //zzTag2 = zzStr.substring(1,zzPos3-1);		
				        zzTag = '</' + zzTag2 + ' ' + zzId + '>';
					  zzPos2 = zzHtml.indexOf(zzTag);

                                //alert('Char '+zzChar);
                                //alert('id '+zzId);
                                //alert('tag2 '+zzTag2);
					  //alert('tag '+zzTag);
                                //alert('str '+zzStr);
                                if(document.getElementById(zzId)){
                                    document.getElementById(zzId).innerHTML = zzHtml.substring(zzPos1+1,zzPos2);
                                }
                                zzHtml = zzHtml.substring(zzPos2 + zzTag.length);
                            }
                            if(zzDataObject.reqMsgDataFlag = 1){
                                if(zzDataObject.reqMsgElementId == ''){
                                    // do nothing yet
                                } else {
                                    if(document.getElementById(zzDataObject.reqMsgElementId)){
                                        document.getElementById(zzDataObject.reqMsgElementId).innerHTML = zzDataObject.reqMsgData;
                                    }    
                                }   
                            }                                    
                            zzInProgress = 0;
                            ZZQueueRequest();
                        } else {
                            if(document.getElementById(zzDataObject.reqLocElementId)){
                                document.getElementById(zzDataObject.reqLocElementId).innerHTML = zzHttpObject.responseText;
                            }
                        }    
                    //}
                } else {
                    if(zzDataObject.reqMsgElementId == ''){ // &&
                        // nothing to do yet
                    } else {
                        if(zzDataObject.reqMsgDataFlag == 0){
                            if(document.getElementById(zzDataObject.reqMsgElementId)){
                                zzDataObject.reqMsgData = document.getElementById(zzDataObject.reqMsgElementId).innerHTML;
                                zzDataObject.reqMsgDataFlag = 1;
                                document.getElementById(zzDataObject.reqMsgElementId).innerHTML = zzLoadMsg;
                            }
                        }
                    }
                    
                }            
                }
                if(zzDataObject.reqMsgElementId == 'YES') { 
		        document.all.loading.style.visibility="visible";
                    //document.write('<div id="loading" STYLE="position:absolute;z-index:5;top:30%;left:42%;background-color:blue;"><br><br>Please wait...</div>');
		    }	
                        
                //alert('sending...');
		    zzHttpObject.send(zzDataObject.postdata);
		    
            } else {
                if(zzDataObject.reqErrElementId == ''){
                    // do nothing yet
                } else {
                    if(zzDataObject.reqErrDataFlag == 0){
                        if(document.getElementById(zzDataObject.reqErrElementId)){
                            zzDataObject.reqErrData = document.getElementById(zzDataObject.reqErrElementId).innerHTML;
                            zzDataObject.reqErrDataFlag = 1;
                            document.getElementById(zzDataObject.reqErrElementId).innerHTML = zzErrorMsg;
                        }
                    }    
                }
                zzInProgress = 0;
                ZZQueueRequest();
            }    
        } else {
            zzInProgress = 0;
            ZZQueueRequest();
        }    
    } else {
        zzInProgress = 0;
        ZZQueueRequest();
    }                
}	


function zzAjaxPost(reqUri,msgElementId,errElementId,locElementId,reqHandler,reqHeaderType,reqPost)
{
    //alert(reqUri);
    var zzReqObject = new ZZRequestData();
    if(zzReqObject){
        if(reqUri){
            zzReqObject.reqUri = ZZParseUri(reqUri);
        } else {
            alert('The URI parameter is required to use ZZAjax');
        }         
        //alert(zzReqObject.reqUri);
        zzReqObject.reqType = 'POST';
        if(reqHeaderType){
            zzReqObject.reqHeaderType = reqHeaderType;
        } else {
            zzReqObject.reqHeaderType = 'HTML'
        }
	  //if(reqPost){
	//	zzReqObject.postdata = reqPost;
	 // }else{
	//	zzReqObject.postdata = 'NULL';
	//  }		        
        if(msgElementId){
            zzReqObject.reqMsgElementId = msgElementId;
        } else { 
            zzReqObject.reqMsgElementId = '';
        }
        if(errElementId){
            zzReqObject.reqErrElementId = errElementId;
        } else {
            zzReqObject.reqErrElementId = '';
        }    
        if(locElementId){
            zzReqObject.reqLocElementId = locElementId;
        } else {
            zzReqObject.reqLocElementId = '';
        }    
        if(reqHandler){
            zzReqObject.reqHandler = reqHandler;
        } 
        ZZQueueRequest(zzReqObject);
        //zzMsg = zzReqObject.reqMsgElementId;
        //ZZAjaxSend(zzReqObject);
    }              
}






function ZZAjaxPost2(reqUri,msgElementId,ErrElementId,locElementId,reqHandler,reqHeaderType){
    var zzReqObject = new ZZRequestData();
    if(zzReqObject){
        zzReqObject.reqUri = ZZParseUri(reqUri);
        zzReqObject.reqType = 'POST';
        if(reqHeaderType){
            zzReqObject.reqHeaderType = reqHeaderType;
        }    
        zzReqObject.reqMsgElementId = msgElementId;
        zzReqObject.reqErrElementId = errElementId;
        zzReqObject.reqLocElementId = locElementId;
        if(reqHandler){
            zzReqObject.reqHandler = reqHandler;
        }
        ZZQueueRequest(zzReqObject);
    }              
}    

function ZZUrlEncode(string) {
    var string;
    var safechars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/-_.&?=";
    var hex = "0123456789ABCDEF";
    var encoded_string = "";
    for (var i = 0; i < string.length; i++){
        var character = string.charAt(i);
        if(character == " "){
            encoded_string += "+";
        } else {
            if(safechars.indexOf(character) != -1) {
                encoded_string += character;
            } else {
                var hexchar = character.charCodeAt(0);
                if(hexchar > 255) {
                    encoded_string += "+";
                } else {
                    encoded_string += "%";
                    encoded_string += hex.charAt((hexchar >> 4) & 0xF);
                    encoded_string += hex.charAt(hexchar & 0xF);
                }
            }
        }
    }     
    return encoded_string;
}

function testresponse(){
    alert('into function');
}

function ZZHtmlHandler(xxHttp,xxHtml) {
    if(zzHttpObject.readyState == 4){ //&& (zzHttpObject.status == 200)){        
        alert('into response function');
        //alert(xxHtml);
        alert(zzHttpObject.responseText);
        if(zzDataObject.reqHandler){
            if(zzDataObject.reqLocElementId){
                document.getElementById(zzDataObject.reqLocElementId).innerHTML = zzHttpObject.responseText;
            } else {
                var zzStr = '';
                var zzId = '';
                //var zzHtml = zzHttpObject.responseText;
                var zzPos1 = 0;
                var zzPos2 = 0;
                while (zzHtml.length>0){
                    zzPos1 = zzHtml.indexOf('>')+1;
                    zzStr = zzHtml.substring(0,zzPos1);
                    zzId = zzStr.substring(zzStr.indexOf('id=')+4,zzStr.indexOf('"', zzStr.indexOf('id=')+4));
                    zzTag = zzStr.substring(1,zzStr.indexOf(' '));
                    zzTag = '</' + zzTag + ' ' + zzId + '>';
                    zzPos2 = zzHtml.indexOf(zzTag);
                    alert(zzId);
                    alert(zzTag);
                    alert(zzStr);
                    if(document.getElementById(zzId)){
                        document.getElementById(zzId).innerHTML = zzHtml.substring(0,zzPos2);
                    }
                    zzHtml = zzHtml.substring(zzPos2 + (zzTag.length-1));
                }        
                zzInProgress = 0;
                ZZQueueRequest();
            }    
        }
    } else {
        if(zzDataObject.reqMsgElementId != ''){ // && 
            if(zzDataObject.reqMsgData == ''){
                if(document.getElementById(zzDataObject.reqMsgElementId)){
                    zzDataObject.reqMsgData = document.GetElementById(zzDataObject.reqMsgElementId).innerHTML;
                    document.GetElementById(zzDataObject.reqMsgElementId).innerHTML = zzLoadMsg;
                }
            }
        }
    }            
}

function ltrim(str) {
	for(var k = 0; k < str.length && isWhitespace(str.charAt(k)); k++); 
	return str.substring(k, str.length); 
} 

function rtrim(str) { 
	for(var j=str.length-1; j>=0 && isWhitespace(str.charAt(j)) ; j--) ;
	return str.substring(0,j+1);
} 

function trim(str) { 
	return ltrim(rtrim(str));
} 

function isWhitespace(charToCheck) {
	var whitespaceChars = " \t\n\r\f"; 
	return (whitespaceChars.indexOf(charToCheck) != -1);
}
