/** 
  *Get the HTTPRequestObject 
  * The AJAX is instantiated on load to send a request it's simply
  _AJAX_.submitRequest(url, parameter string, call_back_function, parameter_string_to_pass_to_call_back_function)
  Since this is tied into zMedia's AJAX framework the call back function can expect at minimum to argumanets
  call_back_function(messages,data){}
  messages is an array of messages returned by the ajax call (zmedia framework)
  call __AJAX__.getFatalMessage(messages) to return any messages marked as fatal to see if you need to bail on the call back the order is as found in the return xml
  data is an array of objects with a name and value property,  the order is as found in the return xml
*/ 

//x
var _AJAX_ = {
	'processing': false,
	'getHTTPObject': function () {
		 var xmlHttpReq = false; 
        	// Mozilla/Safari
      	 if (window.XMLHttpRequest) {
          	xmlHttpReq = new XMLHttpRequest();
          	if (xmlHttpReq.overrideMimeType) {
         	  	// set type accordingly to anticipated content type
            	xmlHttpReq.overrideMimeType('text/xml');
            	//xmlHttpReq.overrideMimeType('text/html');
         	}
		    return xmlHttpReq;
      	}else if (window.ActiveXObject) { // IE
          	try {
            	xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
         	} catch (e) {
            	try {
               		xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
            	} catch (e2) {}
         	}
		     return xmlHttpReq;
      	}
 	},        
	'submitRequest': function (url,parameters,successCmd,additionalParameters) {
		var xmlHttpReq =  _AJAX_.getHTTPObject();
		if (!xmlHttpReq) {
         	alert('Cannot create XMLHTTP instance');
         	return false;
  		}
  		if(_AJAX_.processing){
  			alert("An Ajax request is already pending please wait.");
  		}
  		_AJAX_.processing=true;	
		xmlHttpReq.onreadystatechange=function() {
	  		if (xmlHttpReq.readyState == 4) {
           		var strResponse = xmlHttpReq.responseText;
           		switch (xmlHttpReq.status) {
	                   // Page-not-found error
	                   case 200: // a success fule response
        	                   // Call JS alert for custom error or debug messages
                        	var docEle=xmlHttpReq.responseXML.documentElement;//response element
                        	var errorOccurred=false;
                        	var messages=[];
                        	var data=[];
                        	for(var x=0;x<docEle.childNodes.length;x++){
								if (docEle.childNodes[x].tagName=="messages"){
                        			messages= _AJAX_.parseMessageNodes(docEle.childNodes[x]);
								}
                        		else if(docEle.childNodes[x].tagName=="data"){
                        			data=_AJAX_.parseDataNodes(docEle.childNodes[x]);
                        		}
                        	}                      
                            // Call the desired result function with the status
                            _AJAX_.processing=false;	 	                                           	           
       	                   successCmd(messages,data,additionalParameters);        	                         	                   
                      	   break;
        	           case 404:
        	           		   _AJAX_.processing=false;	 	                                           	           
                	           alert('Error: Not Found. The requested URL ' + url + ' could not be found.');
                        	   break;
	                   // Display results in a full window for server-side errors
        	           case 500:
        	           			_AJAX_.processing=false;	 	                                           	           
                	           _AJAX_.handleErrFullPage(strResponse);
                        	   break; 
    	           	   default: //Any other response from server is treated as an error
    	           	   		_AJAX_.processing=false;	 	                                           	           
                  	    	_AJAX_.handleErrFullPage(strResponse);
                        	break;
	           	}
   			}
		};
		xmlHttpReq.open("post", url,true);
		xmlHttpReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  		xmlHttpReq.setRequestHeader("Content-length", parameters.length);
  		xmlHttpReq.setRequestHeader("Connection", "close");
  		if(xmlHttpReq.overrideMimeType){ xmlHttpReq.overrideMimeType('text/xml');  	}
		try{
    		xmlHttpReq.send(parameters);
    	}catch(e){}
	},


	'handleErrFullPage':function(strIn){//handle a 404 or 500 error
        var errorWin;
        // Create new window and display error
        try {
                errorWin = window.open('', 'errorWin');
                errorWin.document.body.innerHTML = strIn;
        }
        // If pop-up gets blocked, inform user
        catch(e) {
                alert('An error occurred, but the error message cannot be' +
                        ' displayed because of your browser\'s pop-up blocker.\n' +
                        'Please allow pop-ups from this Web site.');
        }
	},
	'parseMessageNodes':function (xml){
		var idx;
		var messages=[];
		for(var x=0; x<xml.childNodes.length;x++){
			idx=xml.childNodes[x];
			var element={};
			element.name=(idx.childNodes[0].text)?idx.childNodes[0].text:idx.childNodes[0].textContent;
			element.status=(idx.childNodes[1].text)?idx.childNodes[1].text:idx.childNodes[1].textContent;
			element.value=(idx.childNodes[2].text)?idx.childNodes[2].text:idx.childNodes[2].textContent;
			messages[messages.length]=element;
		}	
		return messages;
	},
	'parseDataNodes':function (xml){
		var idx,my_JSON_object ;
		var data=[];	
		for(var x=0; x<xml.childNodes.length;x++){
			idx=xml.childNodes[x];
			var element={};
			//need to tell if this is a cdata node or not if it is then we have an array ..			
			element.name=(idx.childNodes[0].text)?idx.childNodes[0].text:idx.childNodes[0].textContent;
			if(idx.childNodes[1].childNodes.length==1){
				if(idx.childNodes[1].attributes.length==0){
					element.value=(idx.childNodes[1].text)?idx.childNodes[1].text:idx.childNodes[1].textContent;
				}else{
						jsonStr=(idx.childNodes[1].text)?idx.childNodes[1].text:idx.childNodes[1].textContent;
						my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(jsonStr.replace(/"(\\.|[^"\\])*"/g, ''))) &&eval('(' + jsonStr + ')');
						element.value=my_JSON_object;
				}
			}else{
				element.value=[];
				var arrayVal,arrayEle,arrayIdx;
				for(var i=0;i<idx.childNodes[1].childNodes.length;i+=2){
					arrayEle=idx.childNodes[1].childNodes[i];
					arrayIdx=(arrayEle.text)?arrayEle.text:arrayEle.textContent;
					arrayEle=idx.childNodes[1].childNodes[i+1];
					if(arrayEle.attributes.length==0){
						arrayVal=(arrayEle.text)?arrayEle.text:arrayEle.textContent;
					}else{//assume json for now
						arrayVal=(arrayEle.text)?arrayEle.text:arrayEle.textContent;
						my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(arrayVal.replace(/"(\\.|[^"\\])*"/g, ''))) &&eval('(' + arrayVal + ')');
						arrayVal=my_JSON_object;
					}
					element.value.push({key:arrayIdx,value:arrayVal});
				}
			}
			
			data[data.length]=element;
		}
		return data;
	},
	'getFatalMessage':function (messages){
		var error='';
		for(var idx=0; idx<messages.length;idx++){
			//Error ==8
			//FATAL == 16 [Fatal is used by the contrler for internal procesing error
			if(messages[idx].status==8 || messages[idx].status==16){
				error+=messages[idx].value+"\n";
			}
		}
		return error;
	}
};

//older compatability
function performCommand(url,parameters,successCmd){
	_AJAX_.submitRequest(url,parameters,successCmd);
}
function getFatalMessage(messages){
	return _AJAX_.getFatalMessage(messages);
}
//Global vars needed by the axaj call back functions to rememeber states
//I beliebve this can be safely removed
var _AJAXVARS_={
    currentFile:null,
    newFile:null,
    deletedIndex:null
};