﻿/*
 *
 * AJAX IMPLEMENTATION
 * Version : 1.01
 * Posting XML To Webservice
 * Getting XML From Webservice
 * The content is on 3 nodes
 * 1 : CONTENT :The HTML of the content to be printed on the specific place on page
 * 2 : TRIGGEREDEVENTS : The event list to be called after successful operation
 * 3 : MESSAGE : The error/warning/operation completed message to be displayed
 *
 */
var DEBUG = true;
var glbXmlRequest;
var glbLoading;
var strLoadingDiv = "loading";
var strDebugDiv = "debug";


function SessionTimeout(strUrl){
	if(window.CollectGarbage) {
		window.CollectGarbage();
	}	
	location.href = strUrl ;
}


function AjaxRequest(url,data,contentID,messageID,keepEvents) {
	return glbXmlRequest.loadURL(url,data,contentID,messageID,keepEvents)
}

function AkimanXmlHTTP(loading, objDebug){ 
	this.xmlHttp=null;  
	this.isBusy=false;
	this.busyMessage="Loading... ";
	this.errorMessage="Connection Error";
	this.intGarbageCount=0;
	this.isLogging = false;
	
	if (window.ActiveXObject) {
		this.xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
    else {
		this.xmlHttp=new XMLHttpRequest();
	}

	this.setBusy = function(blnBusy){		
		this.isBusy=blnBusy;
		
		if(loading) {
			if (this.isBusy) {        
				loading.style.display="block";
			}
			else {
				loading.style.display="none";
			}
		}
	}

	this.loadURL=function(url,data,contentID,messageID,keepEvents) 
	{
		if (!this.isBusy)
		{
			// Id Of "Content" Element To Show The Result
			var objContent = null;
			if(contentID != null && contentID != "") 
			{
				objContent = document.getElementById(contentID);
			}
			if(objContent == null) 
			{
				objContent = document.getElementById("DynamicContent");
			}
			
			// Id Of "Message" Element To Show The Error
			var objMessage = null;
			if(messageID != null && messageID != "") 
			{
				objMessage = document.getElementById(messageID);
			}
			if(objMessage == null) 
			{
				objMessage = document.getElementById("ErrorMessage");
			}

			this.setBusy(true);
			this.intGarbageCount++;
			this.xmlHttp.open("POST", url, false);
			this.xmlHttp.setRequestHeader("Content-Type","application/soap+xml; charset=utf-8");        
			this.xmlHttp.setRequestHeader("Content-Length",data.length); 
			this.xmlHttp.send(data);
			
			if(DEBUG && objDebug) 
			{
				objDebug.innerHTML="Data Size:"+this.xmlHttp.responseText.length+" byte <br /><br />";        
				objDebug.innerHTML+= this.xmlHttp.responseText.replace(/</g,"&lt;").replace(/>/g,"&gt;<br>")+"<br />";
				objDebug.innerHTML+="data : "+data+"<br />";
			}
			
			if (this.xmlHttp.status==200) 
			{	
				var innerHTML = "";
				var errorHTML = "";
				var responseText = this.xmlHttp.responseText;
				var akimanXmlDocument = new AkimanXmlDocument(this.xmlHttp.responseText);
				this.resultXML = akimanXmlDocument.objXml; // The response is set
				akimanXmlDocument = null;
				if (this.resultXML) 
				{
					try 
					{
						var contentnode = this.resultXML.getElementsByTagName("Content");
						if (contentnode && contentnode.length > 0 && contentnode[0])
						{
							innerHTML  = contentnode[0].text ;
						}
					}
					catch(e) 
					{
					}
				}
						
				if (this.resultXML) 
				{
					try 
					{
						var errornode = this.resultXML.getElementsByTagName("ErrorMessage");
						if (errornode && errornode.length > 0 && errornode[0])
						{
							errorHTML  = errornode[0].text ;
						}
					}
					catch(e) 
					{}
				}
					

				this.setBusy(false);
				
				if(this.GotMessageOnly()) 
				{
					if(objMessage) objMessage.innerHTML = errorHTML;
				}
				else 
				{
					if(objContent) objContent.innerHTML = innerHTML;
					if(objMessage && errorHTML !="") objMessage.innerHTML = errorHTML;
				}	
				
				triggeredEventHandler();
				return responseText;
			}
			else 
			{
				return "";
			}
			this.setBusy(false);
		}
		else 
		{
			if(!this.isLogging) 
			{
				alert(this.busyMessage);
			}
		}
		
		if(window.CollectGarbage) 
		{
			if (this.intGarbageCount > 30) 
			{
				window.CollectGarbage();
				this.intGarbageCount=0;
			}
		}
	}
	
	this.ResponseText = function() {
		return this.xmlHttp.responseText;
	}

	this.GotMessageOnly = function() {
		return (this.xmlHttp.responseText.indexOf("<MessageOnly") > -1);
	}
}

function AkimanXmlAsyncHTTP(){ 
	this.xmlHttp=null;  
	this.isBusy=false;
	this.errorMessage="Connection error";
	this.busyMessage="Loading... ";
	this.xsl=null;

    if (window.ActiveXObject)
        this.xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    else
        this.xmlHttp=new XMLHttpRequest();

	this.setBusy = function(blnBusy){		
		this.isBusy = blnBusy;
		
//		if(loading) {
//			if (this.isBusy) {        
//				loading.style.display="block";
//			}
//			else {
//				loading.style.display="none";
//			}
//		}
	}
	
	this.loadURL=function(url, data, func){
		if (!this.isBusy){
			this.xmlHttp.open("POST",url,true);
			if(func != null) {
				this.xmlHttp.onreadystatechange = func;
			}		
			this.xmlHttp.setRequestHeader("Content-Type","application/soap+xml; charset=utf-8");        
			this.xmlHttp.setRequestHeader("Content-Length",data.length); 
			this.xmlHttp.send(data);
		}
		else{
			//alert(this.busyMessage);
		}
	}
	

	this.ReadyState = function() {
		return this.xmlHttp.readyState;
	}

	this.Status = function() {
		return this.xmlHttp.status;
	}

	this.ResponseText = function() {
		return this.xmlHttp.responseText;
	}
}

function Paging() {
	this.pageNumber = null;
	this.recordIndex = null;
	this.fromCache = null;
	this.pageSize = null;
	this.sortColumn = null;
	
	this.OutputXML = function() {
		var result = "";
		
		if(this.pageNumber != null) {
			result += "<pageNumber>"+this.pageNumber+"</pageNumber>";
		}
		if(this.recordIndex != null) {
			result += "<recordIndex>"+this.recordIndex+"</recordIndex>";
		}
		if(this.fromCache != null) {
			result += "<fromCache>"+this.fromCache+"</fromCache>";
		}							
		if(this.pageSize != null) {
			result += "<pageSize>"+this.pageSize+"</pageSize>";
		}
		if(this.sortColumn != null) {
			result += "<sortColumn>"+this.sortColumn+"</sortColumn>";
		}

		return result;
	}
}

function SoapDataBuilder(functionName,params,paging,strTask){
    if (strTask == null) strTask="";
    if (params == null) params="";

    var soapData= 
        "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
            "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"+
            "<soap12:Body>"+
                "<"+functionName+" xmlns=\"http://tempuri.org/\">"+
                "<serviceRequest>"+
                    "<requestData>"+
						"<strTask>"+strTask+"</strTask>"+
						"<postdata>"+params+"</postdata>"+
						"<paging>"
						
						if(paging && paging.OutputXML) {
							soapData += paging.OutputXML();
						}

	soapData +=			"</paging>"+
					"</requestData>"+
                "</serviceRequest>"+
            "</"+functionName+">"+
        "</soap12:Body>"+
        "</soap12:Envelope>";       
        return soapData;
}

function CustomParamBuilder(){    
	result="";
	for (i = 0; i< arguments.length;){
		result+="<item name=\"" + arguments[i] + "\"><![CDATA[" + arguments[i+1]+ "]]></item>";  
		i=i+2;
	}
	return result;
}

function triggeredEventHandler(){
	if (glbXmlRequest.resultXML){
		var eventList = glbXmlRequest.resultXML.getElementsByTagName("TriggeredEvent");
		for (var i=0; i<eventList.length; i++) {
			try {
//				alert(GetXmlNodeValue(eventList, i))
				eval(GetXmlNodeValue(eventList, i));
			}
			catch(e) {
				if(DEBUG) {
					alert("Triggered Event Handler Error:\n" + GetXmlNodeValue(eventList, i) + "\n" + e.message)
				}
			}
		}
	}
}


function EventList() {
	this.listEvents = new Array();

	this.add = function(obj, type, fn) {
		if(obj && obj.constructor && obj.constructor == String) {
			obj = document.getElementById(obj);
		}
		
		if(obj) {
			if (obj.addEventListener) {
				obj.addEventListener( type, fn, false );
				this.listEvents.push(new Array(obj,type,fn));
			}
			else if (obj.attachEvent) {
				obj["e"+type+fn] = fn;
				obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
				obj.attachEvent( "on"+type, obj[type+fn] );
				this.listEvents.push(new Array(obj,type,fn));
			}
		}
	}
	        
	this.clear = function() {
		var i, item, eventtype;
		
		while(this.listEvents.length > 0) {
			item = this.listEvents.pop();
			
			if(item[0].removeEventListener){
				item[0].removeEventListener(item[1], item[2], item[3]);
			}
			
			eventtype = item[1];
			 
			if(item[1].substring(0, 2) != "on"){
				item[1] = "on" + item[1];
			}
			
			if(item[0].detachEvent){
				item[0].detachEvent(item[1], item[0][eventtype+item[2]]);
			}
			item[0][item[1]] = null;
		}
	}
}

function GetEventKey(e) {
	if(e) {
		if (e.keyCode) 
			return e.keyCode;
		else if (e.which)
			return e.which;
		else
			return null;
	}
	else {
		return null;
	}
}

function GetEventSource(e) {
	if(e) {
		if(e.srcElement)
			return e.srcElement;
		else if(e.target)
			return e.target;
		else
			return null;
	}
	else {
		return null;
	}
}

function TrimTextAreas(strFormID) {
	var objForm = document.getElementById(strFormID);
	if(objForm) {
		for (i=0; i < objForm.elements.length; ++i){
			objElement = objForm.elements[i];
			if (objElement.type && objElement.type=="textarea" && objElement.value==" "){
				objElement.value = "";
			}
		}
	}
}

function ShowHideElements(blnShow, arrElements) {
	for (var i=0; i<arrElements.length; i++){
		var objElement = document.getElementById(arrElements[i]);
		if(objElement) {
			//objElement.style.visibility = blnShow ? "visible" : "hidden";		
			objElement.style.display = blnShow ? "block" : "none";
		}
	}
}

function IsValidDate (s, re, length) {
	//if(DEBUG) return true;	
	try {
		if(!length) {
			length = 10;
		}
		if(s.length != length) {
			return false;
		}
	
		if(!re) {
			re = /(\d{2})\/(\d{2})\/(\d{4})/;
		}
		var bits = re.exec(s);

		if(!bits) {
			return false;
		}
		else {
			var day = parseInt(bits[1], 10);
			var month = parseInt(bits[2], 10);
			var year = parseInt(bits[3], 10);
			
			if(year < 100) {	// 2 digits entered
				year += 1900;
			}
			
			if(day<=0) return false;
			if(month<=0 || month>12) return false;
			if(year<0 || year>9999) return false;

			if (month==2) {
				if (year%400==0 || (year%100!=0 && year%4==0) ) {
					return day<=29;
				}
				else {
					return day<=28;
				}
			}
			else if (month==4 || month==6 || month==9 || month==11) {
				return (day<=30);
			}
			else {
				return (day<=31);
			}
		}
	}
	catch(e) {
		if(DEBUG) {
			alert("IsValidDate Error:\n" + e.message)
		}
		return false;
	}   
}

function formatItem(strName, strValue) {
    if (strName && strName.length && strValue && strValue.length) {
        return "<item name=\"" + strName + "\"><![CDATA[" + strValue + "]]></item>";        
    }
    else {
        return "";
    }
}

function addMultipleSelect(objSelect) {
    var strReturnText = "";
    for (i=objSelect.selectedIndex; i<objSelect.options.length ; ++i){
        if (objSelect.options[i].selected) {
            strReturnText += formatItem(objSelect.name, objSelect.options[i].value);
        }
    }
}
function parseAspForm()
{
    return parseForm("aspnetForm");
}
function parseForm(strFormID) {
    var objForm = document.getElementById(strFormID);
    var strReturnText = "";
    var objElements, objElement;    
    
    if (objForm && objForm.elements){
        objElements = objForm.elements;
        for (i=0; i < objElements.length; ++i){
            objElement = objElements[i];
            if ((objElement && objElement.type)){
				if(objElement.disabled) continue;
                for (j=1;j<arguments.length;j++){
                    if(objElement.name == arguments[j]) continue;
                }
                
                switch (objElement.type) {
                    case "checkbox":
                    case "radio":
                        if (objElement.checked) {
                            strReturnText += formatItem(objElement.name, objElement.value);
                        }
						break;
                    case "hidden":
                    case "password":
                    case "text":
                    case "textarea":
                        strReturnText += formatItem(objElement.name, objElement.value);
						break;
                    case "select-one":
                    case "select-multiple":
                        if (objElement.selectedIndex >= 0) {
							strReturnText += formatItem(objElement.name, objElement.options[objElement.selectedIndex].value);
                        }
						break;
                    case "file":
                        alert("Don't know how to handle files yet!!\n/javascript/formParser.js/parseForm()");
						break;
                    default: 
						break;
                }
            }
        }
    }
   // strReturnText = "<postdata>" + strReturnText + "</postdata>";
    
    return strReturnText;
}

function AkimanXmlDocument(xml, async) {
	var innerXml = xml;
	this.objXml = null;     
	
	if(async==null || async.constructor != Boolean) {
		async = false;
	}
	
	if(window.ActiveXObject) {
		this.objXml = new ActiveXObject("Microsoft.XMLDOM");
		this.objXml.async = async;
		this.objXml.loadXML(xml);
	}
	else {
		var parser = new DOMParser();
		this.objXml = parser.parseFromString(xml, "text/xml");
	}

	this.innerXml = function() {
		return innerXml;
	}
}

function GetXmlNodeValue(nodes, index) {
	if(index == null) index = 0;
	
	if(nodes && nodes.length > index) {
		if (nodes[index].text) 
			return nodes[index].text;	
		else if(nodes[index].textContent) 
			return nodes[index].textContent
			
		else
			return "";
	}
	else {
		return null;
	}
}
//onerror = handleErr;
//function handleErr(msg,url,l)
//{
//	txt="There was an error on this page.\n\n"
//	txt+="Error: " + msg + "\n"
//	txt+="URL: " + url + "\n"
//	txt+="Line: " + l + "\n\n"
//	txt+="Click OK to continue.\n\n"
//	alert(txt)
//	return true;
//}
