/* 

Module:      Javascript Document

File Name:   xml.js

Description: This handles all javascript functions to load and manipulate xml requests


Developer:   Marc Donaldson

History:       

Comments: 

*/

/*
	
	
*/
var g_xmlinprogress;
var g_retries=0;
var g_xmlqueue = new Array();


//
// Function:        CSRT_XML
//
// Module:          xml.js
//
// Developer:       Marc Donaldson
//
// Description:     Creation of XML Class object
//
// Modifications:   none
//

function XMLtoArray(xmlroot)
{
	var arr_values=new Array();				
	
	if (xmlroot!=null)
	{
		for(var k=0;k<xmlroot.childNodes.length;k++){	
			var childNode=xmlroot.childNodes[k];		
			var node_obj=new Object;
				node_obj["value"]=childNode.text;		
				node_obj["attributes"]=new Object();
		
	
			for (attrs=0;attrs<childNode.attributes.length;attrs++)
			{			
				var attribute=childNode.attributes[attrs];
				var fieldname=attribute.name;
				var fieldvalue=attribute.value;			
				node_obj["attributes"][fieldname]=fieldvalue;			
			}		
			arr_values.push(node_obj);			
		}
	}
	
	return(arr_values);
}

function CSRT_XML(xmlhandler,async)
{
	var obj_xml;
	var id=null;
	var callback=xmlhandler;
	var return_obj=null;
	var content_url='';
	var called_once = false;
	
	this.load=load;
	this.get_xml=get_xml;	
	
	if(window.XMLHttpRequest) {
		try {
			obj_xml = new XMLHttpRequest();
		} catch(e) {
			obj_xml = null;
		}
	} else if(window.ActiveXObject) {     
		try {
		obj_xml = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
			obj_xml = new ActiveXObject("Microsoft.XMLHTTP");			
			} catch(e) {
			obj_xml = null;					
			}
		}
	
	}
	
	//
	// Function:        get_xml
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Returns the xml object
	//
	// Modifications:   none
	//
	
	function get_xml() { return(obj_xml); }
	
	//
	// Function:        on_error
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Displays error dialog with string passed
	//
	// Modifications:   none
	//
	
	function on_error(str) { alert(str); }
	
	//
	// Function:        check_if_httpexists
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Checks to see if HTTP/1 Exists within content
	//
	// Modifications:   none
	//
	// Reason:          Some IEs show the responseText followed by the complete  
	//                  response (header and body again)
	
	function check_if_httpexists(content)
	{
		var i = content.indexOf("HTTP/1");
		if (i > -1) {
			content = content.substring(i, content.length);
			i = content.indexOf(String.fromCharCode(13, 10, 13, 10));
			if (i > -1) {
				content = content.substring(i + 2, content.length);
			}
		}		
		return(content);
	}
	
	//
	// Function:        handle_response
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Handles and returns the correct format of the data loaded
	//
	// Modifications:   none
	//
	
	function handle_response()
	{		
		var content_type=obj_xml.getResponseHeader("Content-Type").split(';')[0];
		
		if (content_type=='text/xml') { return(obj_xml.responseXML); }
		
		var content_str = obj_xml.responseText;	
		
		if (document.getElementById('debugger')!=null)
		{
			try {
			document.getElementById('debugger').value+='\nResult:\n'+content_str+'\n\n';
			} catch(e) { }
		}

		content_str=check_if_httpexists(content_str);
		
		//
		// Check if response is WDDXPACKET
		//
				
		if(content_str.indexOf("<wddxPacket") > -1) { return parseWDDX(content_str); }
		
		content_str=content_str.replace(new RegExp('WddxRecordset','g'),'Object');						


		try{
			return parseJS(content_str);
		}catch(e){
			try{				
				return parseJSON(content_str);
			} catch(e) {				
			}
		}
	}
	
	
	// 
	// Function:        process_readystate
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Process the state of the xml request
	//
	// Modifications:   none
	//
		
	function process_readystate()
	{		
		var success=false;
		switch(obj_xml.readyState){
			case 1: 
				if(!called_once){ called_once = true; 	}
				break;
			case 2: break;
			case 3: break;
			case 4:
				if ( obj_xml.status == 200 ){// only if "OK"
					try{
						return_obj = handle_response() ;
						success = true;
					}catch(e){ 
						on_error('Parsing Error: The value returned could not be evaluated.');
						success = false;
					}
					if (callback!=null) {
						if(success) callback( return_obj );
					}
				}else{ 
					on_error("There was a problem retrieving the data:\n" + obj_xml.statusText);
				}
				break;
		}
				
	}
	//
	// Function:        load
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Iniates the load of the xml
	//
	// Modifications:   none
	//

	function load(content_url,query_string)
	{				 
		if (async!=false) { obj_xml.onreadystatechange = process_readystate; }
		if (document.getElementById('debugger')!=null)
		{
			try {
				document.getElementById('debugger').value+='\nURL:\n'+content_url+'\n';
			} catch(e) { }
		}
		
		obj_xml.open('GET', no_cache_url(content_url) , async );
		obj_xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");		
		obj_xml.setRequestHeader("Content-Length", "0");
		obj_xml.send(null); 
		
		if (async == false) {		
				try {
					
						if(obj_xml.readyState  == 4) {
							if ( obj_xml.status == 200)
							{
								try{
									return_obj = handle_response() ;
									success = true;
								}catch(e){ 
									alert('AJAX Parsing Error: The value returned could not be evaluated.');
									success = false;
								}
								if (callback!=null) {
									if(success) callback( return_obj );
								}
								return(return_obj);
							} else {
							 alert('AJAX Request: '+obj_xml.statusText);
							}
						} else {
							alert('AJAX Reques: Error has occurred please try again.');
						}
				} catch(e){
					alert(e);
				}
		}
	}
	
	//
	// Function:        no_cache_url
	//
	// Module:          xml.js
	//
	// Developer:       Marc Donaldson
	//
	// Description:     Returns a non cachable url string
	//
	// Modifications:   none
	//
	
	function no_cache_url(url){
		var qs = new Array();
		var arr = url.split('?');
		var scr = arr[0];
		if(arr[1]) { qs = arr[1].split('&'); }
		qs[qs.length]='nocache='+new Date().getTime();
		return scr+'?'+qs.join('&');
	}
	
	//
	// JAVASCRIPT Parse
	//
	
	function parseJS(str){ 
		eval(str);
		var r=eval(str.split('=')[0]);
		return r;
	}
	function parseJSON(str){
		return eval('('+str+')');
	}
	
	//
	// WDDX Functions
	//

	function parseWDDX(str){ var wddx = ConvertXMLtoDOC(str); var data = wddx.getElementsByTagName("data"); return __parseWDDXnode(data[0].firstChild); } 
	
	function ConvertXMLtoDOC(str){ var xml; if(typeof(DOMParser) == 'undefined'){ xml=new ActiveXObject("Microsoft.XMLDOM"); xml.async="false"; xml.loadXML(str); } else { var domParser = new DOMParser(); xml = domParser.parseFromString(str, 'application/xml'); } return xml; } 
	
	function __parseWDDXnode(n){ var val; switch(n.tagName){ case 'string': val = __parseWDDXstring(n); 	break; 	case 'number': 	val = parseInt(n.firstChild.data); 	break; 	case 'boolean': val = n.getAttribute('value'); 	break; case 'dateTime': val = Date(n.firstChild.data); break; case 'array': 	val = __parseWDDXarray(n); break; case 'struct': val = __parseWDDXstruct(n); break; case 'recordset': val = __parseWDDXrecordset(n); break; case 'binary': val = n.firstChild.data; break; case 'char': val = __parseWDDXchar(n);break; case 'null': val = ''; break; default: val = n.tagName; break; } return val; 
	} 
	
	function __parseWDDXstring(node){ var items = node.childNodes; var str = ''; for(var x=0;x < items.length;x++){ if(typeof(items[x].data) != 'undefined') str += items[x].data; else str += __parseWDDXnode(items[x]); } return str; } 
	
	function __parseWDDXchar(node){ switch(node.getAttribute('code')){ case '0d': return '\r'; case '0c': return '\f'; case '0a': return '\n'; case '09': return '\t'; } } function __parseWDDXarray(node){ var items = node.childNodes; var arr = new Array(); for(var i=0;i < items.length;i++){ arr[i] = __parseWDDXnode(items[i]); } return arr; } 
	
	function __parseWDDXstruct(node){ var items = node.childNodes; var obj = new Object(); for(var i=0;i < items.length;i++){ obj[items[i].getAttribute('name').toLowerCase()] = __parseWDDXnode(items[i].childNodes[0]); } return obj; 
	} 
	
	function __parseWDDXrecordset(node){ var qry = new Object(); var fields = node.getElementsByTagName("field"); var items; var dataType; var values; for(var x = 0; x < fields.length; x++){ items = fields[x].childNodes; values = new Array(); for(var i = 0; i < items.length; i++){ values[values.length] = __parseWDDXnode(items[i]); } qry[fields[x].getAttribute('name').toLowerCase()] = values; } return qry; }

}
