/* 
  Get the HTTPRequestObject 
*/ 
function getHTTPObject()
{
      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 (e) {}
         }
		      return xmlHttpReq;
      }
 }
        
//Do the ajax call and determine if the response is good        
function performCommand(url,parameters,successCmd)
{
	xmlHttpReq =  getHTTPObject();
	if (!xmlHttpReq) {
         alert('Cannot create XMLHTTP instance');
         return false;
  }
	
	xmlHttpReq.onreadystatechange=function() {
	  	if (xmlHttpReq.readyState == 4) {
           		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=null;
                        	var data=null;
                        	for(var x=0;x<docEle.childNodes.length;x++){
								if (docEle.childNodes[x].tagName=="messages"){
                        			messages= parseMessageNodes(docEle.childNodes[x]);
								}
                        		else if(docEle.childNodes[x].tagName=="data"){
                        			data=parseDataNodes(docEle.childNodes[x]);
                        		}
                        	}                      
                            // Call the desired result function with the status
       	                   successCmd(messages,data);        	                   	                                           	           
                      	   break;
        	           case 404:
                	           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:
                	           handleErrFullPage(strResponse);
                        	   break; 
    	           	   default: //Any other response from server is treated as an error
                  	    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');
  	xmlHttpReq.send(parameters);
	try{
    	xmlHttpReq.send("");
    }catch(e){}
}

//handle a 404 or 500 error
function handleErrFullPage(strIn)
{
        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.');
        }
}

//Global vars needed by the axaj call back functions to rememeber states
var _AJAXVARS_={
    currentFile:null,
    newFile:null,
    deletedIndex:null
    };

//Add a trim function to the String class
String.prototype.trim=function()
{
   return this.replace(/^\s+|\s+$/g,"");
}
//an external function that does the same great for passing to Array.forEach() see below
function trim(str)
{
  if(typeof(str)!="String") return str;
  return str.replace(/^\s+|\s+$/g,"");
}

/* 
  For FF when traversing the HTTPRequestObject.requestXML to get a 
  node value it uses textContent.  ie Uses .text so instead of using ugly code
  to test for the browser we make FF act like ie
*/ 
if(!document.all){
  Node.prototype.__defineGetter__("text", function() { return this.textContent; });
}

/* 
A Dean Edwards 'lil gem.  extend the Arrays 
so instead of wrtting  for (var i in arry) fn(arry[i]);
        we can write-> Array.forEach(arry,fn);
*/

if (!Array.forEach) { // mozilla already supports this
    Array.forEach = function(object, block, context) {
        for (var i = 0; i < object.length; i++) {
            block.call(context, object[i], i, object);
        }
    };
}

function parseMessageNodes(xml){
	var idx;
	var messages=new Array();
	for(x=0; x<xml.childNodes.length;x++){
		idx=xml.childNodes[x];
		var element=new Array();
		element['name']=idx.childNodes[0].text;
		element['status']=idx.childNodes[1].text;
		element['value']=idx.childNodes[2].text;
		messages[messages.length]=element;
	}	
	return messages;
}

function parseDataNodes(xml){
	var idx;
	var data=new Array();
	for(x=0; x<xml.childNodes.length;x++){
		idx=xml.childNodes[x];
		var element=new Array();		
		element['name']=idx.childNodes[0].text;
		element['value']=idx.childNodes[1].text;
		data[data.length]=element;
	}
	return data;
}

function getFatalMessage(messages){
	var error='';
	for(var idx in messages){
		if(messages[idx]["status"]==8){
			error+=messages[idx]["value"]+"\n";
		}
	}
	return error;
}