/*******************
 utils.js for EA.com
 js code for EA.com redesign prototype
 (byron(AT)blastradius(DOT)com)
******************/

/*****************************************
 BLOATED CLUDGE CODE 
 
 FOR BETA ENV ISSUES
****************************************/

/****************************************************************************
BASIC LOAD FUNCTION BASED ON CODE FROM 
http://developer.apple.com/internet/webcontent/xmlhttpreq.html

PROPERTIES
onreadystatechange - Event handler for an event that fires at every state change
readyState - Object status integer:
0 = uninitialized
1 = loading
2 = loaded
3 = interactive
4 = complete
responseText - String version of data returned from server process
responseXML	- DOM-compatible document object of data returned from server process
status - Numeric code returned by server, such as 404 for "Not Found" or 200 for "OK"
statusText - String message accompanying the status code

METHODS (http://www.xulplanet.com/references/objref/XMLHttpRequest.html)
void abort ( )   
void addEventListener ( String type , EventListener listener , boolean useCapture )   
boolean dispatchEvent ( Event evt )   
char* getAllResponseHeaders ( )   
ACString getResponseHeader ( AUTF8String header )   
void open ( AUTF8String method , AUTF8String url )  
void openRequest ( AUTF8String method , AUTF8String url , boolean async , AString user , AString password )   
void overrideMimeType ( AUTF8String mimetype )   
void removeEventListener ( String type , EventListener listener , boolean useCapture )   
void send ( nsIVariant body )   
void setRequestHeader ( AUTF8String header , AUTF8String value )
***************************************************************************/

var xmlDocs = new Array();
window.badXMLref = new Array();
var reloadtimer = null;

if(!window.Node){
  var Node = {
    ELEMENT_NODE : 1,
    ATTRIBUTE_NODE : 2,
    TEXT_NODE : 3,
    CDATA_SECTION_NODE : 4,
    ENTITY_REFERENCE_NODE : 5,
    ENTITIY_NODE : 6,
    PROCESSING_INSTRUCTION_NODE : 7,
    COMMENT_NODE : 8,
    DOCUMENT_NODE : 9,
    DOCUMENT_TYPE_NODE : 10,
    DOCUMENT_FRAGMENT_NODE : 11,
    NOTATION_NODE : 12
  }
}

function loadXMLDoc(url,ref,returnFunc,waitFunc,usePost) {
    var xmlRequest = null;
    if(window.XMLHttpRequest) 
        xmlRequest = new XMLHttpRequest();
    else if(window.ActiveXObject) 
        xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");

    if(xmlRequest){
      if(!xmlDocs[ref])
         xmlDocs[ref] = new Object();
         
      if (usePost) {
         var urlBits = url.split('?');
         xmlDocs[ref].url = urlBits[0];
         xmlDocs[ref].body = urlBits[1];
      }
      else {
         xmlDocs[ref].url = url;
      }
      xmlDocs[ref].onWait = waitFunc;
      xmlDocs[ref].onLoad = returnFunc;
      xmlDocs[ref].error = false;
      if(true){   // !xmlDocs[ref].requestObj
         xmlDocs[ref].requestObj = xmlRequest;
         xmlDocs[ref].requestObj.onreadystatechange = function(){processReqChange(ref)};
         if (usePost) {
            xmlDocs[ref].requestObj.open("POST", xmlDocs[ref].url, true);
            xmlDocs[ref].requestObj.send(xmlDocs[ref].body);
         }
         else {
            xmlDocs[ref].requestObj.open("GET", xmlDocs[ref].url, true);
            xmlDocs[ref].requestObj.send(null);
         }
      }else{
         // if we already have a complete xml call teh on load func if not do nothing as we are waiting for callback
         if(xmlDocs[ref].requestObj.readyState == 4)
         {
            if(xmlDocs[ref].requestObj.status == 200){
               xmlDocs[ref].xml = xmlDocs[ref].requestObj.responseXML;
               xmlDocs[ref].onLoad(ref);
            }else{
               xmlDocs[ref].requestObj.abort();
               xmlDocs[ref].requestObj = xmlRequest;
               xmlDocs[ref].requestObj.onreadystatechange = function(){processReqChange(ref)};
               xmlDocs[ref].requestObj.open("GET", url, true);
               xmlDocs[ref].requestObj.send(null);
            }
         }
      }
   }
}

function processReqChange(ref) {
   if(!xmlDocs[ref]){
      return;
   }   
   if(!xmlDocs[ref].requestObj){
      return;
   }
  if(xmlDocs[ref].requestObj.readyState == 4){

     if(xmlDocs[ref].requestObj.status == 200){
         xmlDocs[ref].xml = xmlDocs[ref].requestObj.responseXML;
         xmlDocs[ref].error = false;  
         xmlDocs[ref].onLoad(ref);
      }else{
         if(xmlDocs[ref].requestObj.status == 0){
            //really bad - but if there is an unknown error blow it away and try again
            xmlDocs[ref].requestObj.abort();
            xmlDocs[ref].requestObj = null;
            xmlDocs[ref].error = true;
            window.badXMLref[window.badXMLref.length] = ref;
            clearTimeout(reloadtimer);
            reloadtimer = setTimeout("reLoad()",1000);
         }else{
            //Temporarily removed if statusCode is not 200 (success).
            //alert("There was a problem retrieving the XML data:\n code : " + xmlDocs[ref].requestObj.status + "\n" + xmlDocs[ref].requestObj.statusText + "\nPlease try again at a later time."  );
         }
      }
  }else{
      xmlDocs[ref].onWait(ref);
  }
}

function reLoad(){
   for(var bXML in window.badXMLref)
   {
      var bXMLref = window.badXMLref[bXML];
      if(xmlDocs[bXMLref])
      {
         if(xmlDocs[bXMLref].error)
         {
            loadXMLDoc(xmlDocs[bXMLref].url,bXMLref,xmlDocs[bXMLref].onLoad,xmlDocs[bXMLref].onWait)
         }
      }
      window.badXMLref.splice(0);
   }
}

function getNodeValue(node)
{
   if (node && node.childNodes) {
      for(var i=0; i < node.childNodes.length; i++)
      {
         if(node.childNodes[i].nodeType == Node.TEXT_NODE || node.childNodes[i].nodeType == Node.CDATA_SECTION_NODE )
         {
            return node.childNodes[i].nodeValue;
            break;
         }
      }/*
     if (node.childNodes.length > 1)
         return node.childNodes[1].nodeValue;
      else
         return node.childNodes[0].nodeValue;   
         */
   }
}

function getNodeByAttributeValue(xmlSeg,attrib,value)
{
	var node = null;
	var treeLength = (xmlSeg && xmlSeg.childNodes)? xmlSeg.childNodes.length : 0;
	for( var i=treeLength-1; i >= 0; i--)
	{
		var tNode = xmlSeg.childNodes[i];
      if(!tNode.attributes)
         continue;
         //alert(tNode.getAttribute(attrib) +" "+value)
		if(tNode.getAttribute(attrib) == value)
		{
         node = tNode;
			break;
		}else{
		   newtNode = getNodeByAttributeValue(tNode,attrib,value);
         if(newtNode != null)
         {
            node = newtNode;
            break;
         }
		}
	}
	return node;
}
function getNodeById(xmlSeg,nodeID)
{
   return getNodeByAttributeValue(xmlSeg,'id',nodeID);
}

// CN: Added 08/08/2005
function sendXMLDoc(url, ref, xmlBody, responseHandlerFunc){
   var xmlRequest = null;
   if (window.XMLHttpRequest)  {
      xmlRequest = new XMLHttpRequest();
   }
   else if (window.ActiveXObject) {
      xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
   }
   
   if (xmlRequest){
      if (!xmlDocs[ref]) {
         xmlDocs[ref] = new Object();
      }

      xmlDocs[ref].open('POST', url, true);
      xmlDocs[ref].onreadystatechange = responseHandlerFunc;
      xmlDocs[ref].setRequestHeader('Content-Type', 'text/xml');
      xmlDocs[ref].send("<?xml version='1.0' encoding='UTF-8'?>" + xmlBody);
   }
}
