function isNull(a) {
  return typeof a == 'object' && !a;
}

function isset(a) {
  return !isNull(a) ;
}

var commandCue = Array() ;

function neatValue(value) {
  if (isNull(value) || (value=="undefined") || (value=="")) {
    return "null" ;
  }
  else {
    return value ;
  }
}

function neatValueNotNull(value) {
  if (isNull(value) || (value=="undefined")) {
    return "" ;
  }
  else {
    return value ;
  }
}

function cueXMLHTTPPost(service, command, params, callBack) {
  var cuecount = commandCue.length ;

  var commandArray = Array()
  commandArray['service'] = service ;
  commandArray['command'] = command ;
  commandArray['callBack'] = callBack ;
  commandArray['params'] = params ;

  commandCue[cuecount] = commandArray ;

  if (cuecount ==0) {
    // because the cue was empty, kick the cue in to action
    setTimeout("postCue()", 10) ;
  }
}

function cueHTMLHTTPGet(service, command, callBack) {
  var cuecount = commandCue.length ;

  var commandArray = Array()
  commandArray['service'] = service ;
  commandArray['command'] = command ;
  commandArray['callBack'] = callBack ;
  commandArray['params'] = '' ;

  commandCue[cuecount] = commandArray ;

  if (cuecount ==0) {
    // because the cue was empty, kick the cue in to action
    setTimeout("postCue()", 10) ;
  }
}

function postCue() {
  var cuecount = commandCue.length ;

  if (cuecount > 0) {
     var command = commandCue.shift() ;
     xmlhttpPost(command['service'], command['command'], command['params'], command['callBack']) ;
  }
}

function parseXML(xmlText) {
  var xmlDoc;

  // code for IE
  if (window.ActiveXObject) {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async=false;
    xmlDoc.loadXML(xmlText) ;
  }
  // code for Mozilla, Firefox, Opera, etc.
  else {
    var parser=new DOMParser();
    var xmlDoc=parser.parseFromString(xmlText,"text/xml");
  }

  return xmlDoc ;
}

function appendElement(parentElement, newElement) {
  parentElement.appendChild(newElement);

  return newElement ;
}

function addElement(parentElement, ElementType, newElementId) {
  var newElement = document.createElement(ElementType);
  var divIdName = newElementId ;
  newElement.setAttribute('id',divIdName);
  newElement.setAttribute('name',divIdName);

  parentElement.appendChild(newElement);

  return newElement ;
}

function addElementById(parentElement, ElementType, newElementId) {
  var pe = document.getElementById(parentElement);
  return addElement(pe, ElementType, newElementId) ;
}

function removeElement(parentElement, elementName) {
  var d = document.getElementById(parentElement);
  var olddiv = document.getElementById(elementName);
  d.removeChild(olddiv);
}

function removeXMLElement(xmldoc,psd_element, event_id) {
  /*var d = xmldoc.getElementById(parentElement);
  var olddiv = xmldoc.getElementById(elementName);
  d.removeChild(olddiv);*/

//  var s = new XMLSerializer();
//  alert(s.serializeToString(xmlDoc));

  var theXML = xmlDoc.childNodes[0] ;
  
  for (var i=0; i<theXML.childNodes.length; i++) {
  	var element = theXML.childNodes[i] ;
  	
    if (element.getAttribute('event_id') == event_id){
      xmlDoc.removeChild(xmlDoc.childNodes[i])
    }
 }
}

function isNull(a) {
  return typeof a == 'object' && !a;
}

var commandCue = Array() ;


function ajaxStatusMessage(message) {
  var statusDisplay ;
  statusDisplay = document.getElementById('AJAXStatus') ;

  if (!isNull(statusDisplay)) {
    statusDisplay.innerHTML = message ;
    jQuery("#AJAXStatus").fadeIn();
    setTimeout("jQuery(\"#AJAXStatus\").fadeOut();", 3000) ;
  }
}

function ajaxCallBack(callBack, responceText) {
  var statusDisplay ;
  statusDisplay = document.getElementById('AJAXStatus') ;

  if (!isNull(statusDisplay)) {
    jQuery("#AJAXStatus").fadeOut();
  }

  eval(callBack+'(\''+responceText+'\')') ;
  setTimeout("postCue()", 10) ;
}

function xmlhttpPost(service, command, params, callBack) {
  var browserFlag = 'ie' ;
  var statusDisplay ;
  statusDisplay = document.getElementById('AJAXStatus') ;

  if (!isNull(statusDisplay)) {
    statusDisplay.innerHTML = 'Please wait..' ;
    statusDisplay.style.display = 'block' ;
  }

  var xmlHttpReq = false;
  var self = this;
  var tempString ;

  if (window.XMLHttpRequest) {
    // Mozilla/Safari
    self.xmlHttpReq = new XMLHttpRequest();
    browserFlag = 'ff' ;
  }
  else if (window.ActiveXObject) {
    // IE
    self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
  }

  self.xmlHttpReq.open('POST', "/"+service+"/"+command+"/", true);
  self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
  self.xmlHttpReq.onreadystatechange =

     function() {
       var responceText = "" ;
       if (self.xmlHttpReq.readyState == 4) {
         responceText = self.xmlHttpReq.responseText ;
         var tempResponcText = escape(responceText) ;
         ajaxCallBack(callBack, tempResponcText) ;
       }
     }

  if(typeof(params) == 'object'){
    if(params.xml){
      self.xmlHttpReq.send('xmldata='+params.xml);
    }else{
      var s = new XMLSerializer();
      self.xmlHttpReq.send('xmldata='+s.serializeToString(params));
    }
  }else{
    self.xmlHttpReq.send(params);
  }
}

function setAttributeNode(xmlDoc, node, attribute, value) {
    var newAttribute = xmlDoc.createAttribute(attribute);
    newAttribute.nodeValue = value ;

    node.setAttributeNode(newAttribute);
  return node ;
}

function ajaxPostFormAsXML(formName, service, action, callBack) {
  var browser='ie' ;
  whatForm = document.getElementById(formName) ;

  var xmlDoc;

  var xmlText ;
  xmlText = "<?xml version=\"1.0\"?>" ;

  // code for IE
  if (window.ActiveXObject){
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async=false;
    xmlDoc.loadXML(xmlText) ;
  }
  // code for Mozilla, Firefox, Opera, etc.
  else {
    browser='ff' ;
    var xmlDoc=document.implementation.createDocument("","",null);
  }

  var formXML = xmlDoc.createElement("form");
  setAttributeNode(xmlDoc, formXML, "name", formName) ;

  xmlDoc.appendChild(formXML) ;

  var fieldCount = whatForm.length - 1 ;
  var i ;
  var controlType ;
  var ajaxParams  = "" ;
  var value ;
  var skipRadio ;
  var checked ;
  
  for (i=0;i<=fieldCount;i++) {
    controlType = whatForm[i].type ;
    skipRadio = false ;
    value = '' ;
    checked = '' ;

    if ((controlType != "button") && (controlType != "submit")) {
      if (whatForm[i].id != "") {
        if (controlType == "checkbox") {
          if (whatForm[i].checked) {
            checked = 'true' ;
            value = whatForm[i].value ;
          }
          else {
            checked = 'false' ;
          }
          
        }
        else if (controlType == "radio") {
        
          if (whatForm[i].checked) {
            value = whatForm[i].value ;
          }
          else {
            skipRadio = true ;            
          }
        }
        else if(whatForm[i].value != undefined) {			
          value = whatForm[i].value ;
        }

 	if (!skipRadio) {
          var fieldValue = xmlDoc.createElement("field");

          var valueVar = xmlDoc.createElement("value");
          valueVar.appendChild(xmlDoc.createCDATASection(neatValueNotNull(utf8Encode(value), false))) ;
        
          var fieldName = whatForm[i].name ;
        
          if (fieldName == '') {
            fieldName = whatForm[i].id ;
          }
        
          
          setAttributeNode(xmlDoc, fieldValue, "name", fieldName) ;
          if (checked != '') {
            setAttributeNode(xmlDoc, fieldValue, "checked", checked) ;
          }
          
          fieldValue.appendChild(valueVar) ;
        
          formXML.appendChild(fieldValue) ;
        }
      }
    }
  }
    //alert(xmlDoc);
  cueXMLHTTPPost(service, action, xmlDoc, callBack) ;

  return false ;
}

function ajaxPostValuesAsXML(values, service, action, callBack) {
  var browser='ie' ;

  var xmlDoc;

  var xmlText ;
  xmlText = "<?xml version=\"1.0\"?>" ;

  // code for IE
  if (window.ActiveXObject){
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async=false;
    xmlDoc.loadXML(xmlText) ;
  }
  // code for Mozilla, Firefox, Opera, etc.
  else {
    browser='ff' ;
    var xmlDoc=document.implementation.createDocument("","",null);
  }

  var formXML = xmlDoc.createElement("form");
  setAttributeNode(xmlDoc, formXML, "name", 'values') ;

  xmlDoc.appendChild(formXML) ;

  var fieldCount = values.length - 1 ;
  var i ;
  var ajaxParams  = "" ;

  for (i=0;i<=fieldCount;i++) {
      var fieldValue = xmlDoc.createElement("field");
      var valueVar = xmlDoc.createElement("value");
      var val = ''+values[i]['value'] ; 
      valueVar.appendChild(xmlDoc.createCDATASection(neatValueNotNull(utf8Encode(val), false))) ;

      var name ;
      name = values[i]['name'] ; 
      setAttributeNode(xmlDoc, fieldValue, "name", name) ;
      fieldValue.appendChild(valueVar) ;
      formXML.appendChild(fieldValue) ;
  }
    //alert(xmlDoc);
  cueXMLHTTPPost(service, action, xmlDoc, callBack) ;

  return false ;
}

// function to show the result of the ajax
function debugAjaxOutput(responceText) {
alert(unescape(responceText)) ;
}



function convert_to_safe_chars_lang(str){

  var temp_str = '';

  for(var i=0;i<str.length;i++){
    if(!(str.charCodeAt(i) >= 32 && str.charCodeAt(i) <= 126) || (str.charCodeAt(i) == 38)){
       var temp_temp_str = str.charAt(i).replace(String.fromCharCode(str.charCodeAt(i)), '&#'+str.charCodeAt(i)+';');
    }else{
       var temp_temp_str = str.charAt(i);
    }

    temp_str = temp_str+temp_temp_str;
  }
  return temp_str;

}


function convert_from_safe_chars_lang(str){

  str = str.replace(/&#([0-9]*);/gm,function(psd_str){ var temp_str = psd_str.match(/([0-9]*);/m); return String.fromCharCode(temp_str[1])});
  return str;

}

function utf8Encode(str) {


  var string = str.replace(/\r\n/g,"\n");
  var utftext = "";

  for (var n = 0; n < string.length; n++) {
    var c = string.charCodeAt(n);

    if (c < 128) {
      utftext += escape(String.fromCharCode(c));
    }
    else if((c > 127) && (c < 2048)) {
      utftext += String.fromCharCode((c >> 6) | 192);
      utftext += String.fromCharCode((c & 63) | 128);
    }
    else {
      utftext += String.fromCharCode((c >> 12) | 224);
      utftext += String.fromCharCode(((c >> 6) & 63) | 128);
      utftext += String.fromCharCode((c & 63) | 128);
    }
  }

  return utftext;
}

function getPageElement(page, div, callBack) {
  jQuery("#"+div).fadeOut();  
  cueHTMLHTTPGet(page, 'c', callBack) ;
}

function getPageHTML(page, callBack) {
var s = callBack+"ZZZ"; // when not set at all, JS doesn't really get it
  if (isNull(s) || (s=="undefinedZZZ") || (s=="")) {
    callBack='pageLoader';
  }
  else {
  }
  
  var stringArray ;
  stringArray = page.split('/') ;
  
  var method ;
  method = stringArray[0] ;
  
  var action = '' ;
  
  for (var i =1;i<stringArray.length;i++) {
    action = action + stringArray[i] + '/' ;
  }
  
  cueHTMLHTTPGet(method, action, callBack) ;
  jQuery("#body_content").fadeOut();
}

function processResponceErrors(errorResponce, errorDivId) { 
   var doc = parseXML(unescape(errorResponce)) ;
   var errors = doc.getElementsByTagName('error') ;   
   var returnVal ;
   
   returnVal = false ;
   
   if (isset(errors)) {
     var errorDiv = document.getElementById(errorDivId) ;
     
     if (isset(errorDiv)) {
       errorDiv.innerHTML = '' ;
       
       var errorCount = errors.length ;
       var i ;
     
       returnVal = errorCount > 0 ;
       for (i=0;i<errorCount;i++) {
         errorDiv.innerHTML = errorDiv.innerHTML + '<div class="error">'+errors[i].childNodes[0].nodeValue+'</div>';
       }
       errorDiv.innerHTML = errorDiv.innerHTML + "<br>";
     }
   }
   
   return returnVal ;
}

function pageResponceProcessor(pageHTML, contentDiv) {
//alert(unescape(pageHTML));
  var div = document.getElementById(contentDiv) ;
  
  var xmlDoc = parseXML(unescape(pageHTML)) ;

  var script ;
  var body ;
  
  if (ie) {
    script = xmlDoc.getElementsByTagName('script').item(0).firstChild.data;
    body = xmlDoc.getElementsByTagName('body').item(0).firstChild.data;
  }
  else {
	if (xmlDoc.getElementsByTagName('script').item(0)){
		script = xmlDoc.getElementsByTagName('script').item(0).childNodes.item(1).data;
	}
    body = xmlDoc.getElementsByTagName('body').item(0).childNodes.item(1).data ; 
  }

  div.innerHTML = body ;
  eval(script) ;
}

function pageLoader(pageHTML) {
  pageResponceProcessor(pageHTML, "body_content") ;
  jQuery("#body_content").fadeIn();
}



// basic browser detection because I need to know if its early versions of safari.
// Versions of safari prior to version 3 do not support xml attributes. So to make things work, 
// I will need to put in a work around. Its nasty, I don't like it but what can you do?

var d, dom, ie, ie4, ie5x, moz, mac, win, lin, old, ie5mac, ie5xwin, op;

d = document;
n = navigator;
na = n.appVersion;
nua = n.userAgent;
win = ( na.indexOf( 'Win' ) != -1 );
mac = ( na.indexOf( 'Mac' ) != -1 );
lin = ( nua.indexOf( 'Linux' ) != -1 );

if ( !d.layers ){
	dom = ( d.getElementById );
	op = ( nua.indexOf( 'Opera' ) != -1 );
	konq = ( nua.indexOf( 'Konqueror' ) != -1 );
	saf = ( nua.indexOf( 'Safari' ) != -1 );
	moz = ( nua.indexOf( 'Gecko' ) != -1 && !saf && !konq);
	ie = ( d.all && !op );
	ie4 = ( ie && !dom );

	/*
	ie5x tests only for functionality. ( dom||ie5x ) would be default settings. 
	Opera will register true in this test if set to identify as IE 5
	*/

	ie5x = ( d.all && dom );
	ie5mac = ( mac && ie5x );
	ie5xwin = ( win && ie5x );
}
