// @cvs-id $Id: ajax.js,v 1.8 2007/11/13 04:10:29 nsadmin Exp $ $Name: bridge-release-2_7_0 $
// AJAX utilities by Paul Meisel (paulm@oho.com)

// Check to make sure we haven't already run this script
if (!ajaxJsRunP) {

  var ajaxJsRunP = 1;

  var ad_host;
  var cookie_name;

  var post_ajax_command = '';
  var pre_ajax_command = '';

  var ajax_array = new Array();
  var ajax_concurrent = true;
  var ajax_debug_p = false;

  // Debug 
  if (typeof(console) != "undefined" && console.log) 
    function ajax_debug(message) {
      if (ajax_debug_p)
	console.log(message);
    }
  else
    function ajax_debug(message) {
      if (ajax_debug_p)
	writeError(message);
    }

  function unescapeAndEval(commands) {
    // Unescape special characters
    eval(commands.replace(/&amp;/g,"\&").replace(/&lt;/g,"\<").replace(/&gt;/g,"\>"));
  }


  function AJAX (url, alt_url, div, message, forcerefresh, vars, checkstate_func) {
    ajax_debug('Enter: AJAX');
    var req = getXMLRequest();
    if (!req && alt_url != "")
      location.replace(alt_url);

    this.req = req;
    this.div = div;
    this.url = url;
    this.message = message;
    this.forcerefresh = forcerefresh;
    this.vars = vars;
    this.checkstate_func = checkstate_func;
    ajax_debug('Exit: AJAX');
  }

  // global xml post begin 

  // Default onstatechange handler.  The parameter is passed in via a closure.
  function checkstate (ajax_id) {
    ajax_debug('Enter: checkstate');
    var req = ajax_array[ajax_id].req;
    var div = ajax_array[ajax_id].div;
    var url = ajax_array[ajax_id].url;
    var message = ajax_array[ajax_id].message;
    var forcerefresh = ajax_array[ajax_id].forcerefresh;
    var ajax_i;
    stats = getByID("output");
    ajax_debug('Checkstate: readyState: ' + req.readyState);
    if (stats) {
      stats.innerHTML = req.readyState;
    }
    if (req.readyState == 4) {
      // The full response is ready

      ajax_debug('Checkstate: status: ' + req.status);
	
      if (req.status == 500) {
	// We got an error so pop it up in a new window
	var the_error_obj = window.open("", "error",
					"width=800,height=600,resizable=yes,toolbar=no,location=on,scrollbars=yes,status=yes");	
	the_error_obj.focus();
	the_error_obj.moveTo(1,1);
	the_error_obj.document.write(req.responseText);
			
	ajax_debug('Exit: checkstate');
	return;
      }

      var use_xml = 0;
      if (isSafari) {
	// See if responseText has usable XML
	x = document.createElement('div');
	x.innerHTML = req.responseText;

	var thedocument = x.getElementsByTagName('thedocument');
	if (thedocument[0]) {
	  use_xml = 1;
	}
      }

      if ((isIE && req.responseXML.documentElement) || (isSafari && use_xml)) {
	// IE or sometimes Safari.  They both have quirks around responseXML
	// so we're pulling the XML from responseText instead
	getByID('ajaxOutPutMessage').innerHTML = "";
	var astring = req.responseText.replace(/[\n\r]+/g, " ");
	// Try to find a message
	var bstring = astring.replace(/.*<message>/, "").replace(/<\/message>.*/, "");
	if (astring != bstring) {
	  getByID('ajaxOutPutMessage').innerHTML = bstring;
	}
	if (div != "") {
	  getByID(div).innerHTML = "";
	  // Try to find the body
	  bstring = astring.replace(/.*<thebody>/, "").replace(/<\/thebody>.*/, "");
	  if (astring == bstring) {
	    // No thebody tag found
	    getByID(div).innerHTML = "";
	  } else {	
	    getByID(div).innerHTML = bstring.replace(/&apos;/g, "'");
	  }
	}
	if (isIE) {
	  var post_ajaxs = req.responseXML.getElementsByTagName('post_ajax');
	  for (ajax_i= 0; ajax_i< post_ajaxs.length; ajax_i++)
	     unescapeAndEval(post_ajaxs[ajax_i].firstChild.nodeValue);
	} else {
	  // Safari
	  // x is already defined earlier
	  var post_ajaxs = x.getElementsByTagName('post_ajax');
	  for (ajax_i= 0; ajax_i< post_ajaxs.length; ajax_i++)
	    unescapeAndEval(post_ajaxs[ajax_i].innerHTML);
	}

      } else if (!isIE && req.responseXML) {
	// Firefox, presumably

	var messages = req.responseXML.getElementsByTagName('message');
	getByID('ajaxOutPutMessage').innerHTML = "";
	if (messages[0]) {
	  x = document.createElement('xml');
	  x.appendChild(messages[0]);
	  getByID('ajaxOutPutMessage').appendChild(x);
	  getByID('ajaxOutPutMessage').innerHTML += "";
	}
	if (div != "") {
	  var body = req.responseXML.documentElement.getElementsByTagName('thebody');
	  getByID(div).innerHTML = "";
	  if (body[0]) {
	    x = document.createElement('xml');
	    x.appendChild(body[0]);
	    getByID(div).appendChild(x);
	    getByID(div).innerHTML += " "; // Is this to force it to resync or something?
	  }
	}
	var post_ajaxs = req.responseXML.getElementsByTagName('post_ajax');
		
	var ajax_commands;
	for (ajax_i= 0; ajax_i < post_ajaxs.length; ajax_i++)
	  unescapeAndEval(post_ajaxs[ajax_i].firstChild.nodeValue);

      } else {
	// Non-XML response
			
	if (div != "") {
	  getByID(div).innerHTML = req.responseText;
	}
	x = document.createElement('div');
	x.innerHTML = req.responseText;
				
	if (isIE) {
	  var result = req.responseText;
	  // Find all script tags by stripping out everything else
	  var multiline = RegExp.multiline;
	  RegExp.multiline = true;
	  result = result.replace(/\<\/script\>.*?<script>/gim, "OPENSCRIPTCLOSESCRIPT");
	  result = result.replace(/\<\/script\>.*/, "");
	  result = result.replace(/.*\<script\>/, "");
	  RegExp.multiline = multiline;
	  var post_ajaxs = result.split(/OPENSCRIPTCLOSESCRIPT/);
	  for (var ajax_i = 0; ajax_i < post_ajaxs.length; ajax_i++)
	    setTimeout(post_ajaxs[ajax_i]);					
	} else {
	  var post_ajaxs = x.getElementsByTagName('script');
	  for (var ajax_i = 0; ajax_i < post_ajaxs.length; ajax_i++)
	    setTimeout(post_ajaxs[ajax_i].innerHTML, 0);
	}

	if (div == "" && getByID('ajaxOutPutMessage')) {
	  getByID('ajaxOutPutMessage').innerHTML = "";
	}

      }
	
      if (post_ajax_command) {
	eval(post_ajax_command);
      }

      setTimeout(from_response_javascript, 0);
	    
      ajax_debug('Exit: checkstate');
      return req.status;

    } else if (req.readyState == 0) {
	
      ajax_debug('Exit: checkstate');
      return "";
    }

  }

  function format_form_element_for_ajax(obj) {
    ajax_debug('Enter: format_form_element_for_ajax');
    var str = "";
    str += obj.name + "="
      + ((obj.type != "checkbox" || obj.checked) ? escape(obj.value) : "")
      + "&";
    ajax_debug('Exit: format_form_element_for_ajax');
    return str;
  }

  function format_form_for_ajax (form) {
    ajax_debug('Enter: format_form_for_ajax');
    var str = "";
    for (var i =0 ; i < form.length; i++)
      str += format_form_element_for_ajax(form[i]);
    str += "from_ajax=true";
    ajax_debug('Exit: format_form_for_ajax');
    return str;
  }

  // Take a form and post it
  function xmlpostform(form, div, message, forcerefresh) {
    ajax_debug('Enter: xmlpostform');
    var str = format_form_for_ajax (form);
    xmlpost (form.action, '', div, message, forcerefresh, str);
    ajax_debug('Exit: xmlpostform');
    return false;
  }

  // A stripped-down call
  function xmlquick (url, div) {
    ajax_debug('Enter/Exit: xmlquick');
    return xmlpost (url, "", div, "", 0, "");
  }

  // No real diffierence between the two, so it's just a wrapper
  function xmlget (url, alt_url, div, message, forcerefresh) {
    ajax_debug('Enter/Exit: xmlget');
    return xmlpost (url, alt_url, div, message, forcerefresh, "");
  }

  function xmlpost (url, alt_url, div, message, forcerefresh, vars) {
	
    ajax_debug('Enter: xmlpost');
    ajax_debug('XMLPOST vars = ' + vars);
	
    var ajax_id = ajax_array.length;
    ajax_array[ajax_array.length]= new AJAX(url, alt_url, div, message, forcerefresh, vars, "");

    xmlprepost(ajax_id);
    ajax_debug('Exit: xmlpost');
  }

  function xmlprepost (ajax_id) {
	
    ajax_debug('Enter: prepost');
    var message = ajax_array[ajax_id].message;
    var div = ajax_array[ajax_id].div;

    var ajaxOutPutMessage = getByID('ajaxOutPutMessage');
    if (!ajaxOutPutMessage) {
      ajax_debug('Creating ajaxOutPutMessage');
      ajaxOutPutMessage = document.createElement('div');
      ajaxOutPutMessage.id = 'ajaxOutPutMessage';
      ajaxOutPutMessage.style.position = 'absolute'; 
      ajaxOutPutMessage.style.top = 0; 
      ajaxOutPutMessage.style.left = 0; 
      ajaxOutPutMessage.style.textAlign = "left";
      ajaxOutPutMessage.style.filter = "alpha(opacity=75)";
      ajaxOutPutMessage.style.opacity = .75;
      ajaxOutPutMessage.style.background = "#FFFFFF";
      document.body.insertBefore(ajaxOutPutMessage, document.body.childNodes[0]);
    }

    if (message != "" && div == "")
      ajaxOutPutMessage.innerHTML = message;

    if (div != "" && message != "") {
      getByID(div).innerHTML = message;
      setTimeout('xmlpost2(' + ajax_id + ')', 0);
    } else {
      xmlpost2(ajax_id);
    }
    ajax_debug('Exit: prepost');
  }

  function xmlpost2(ajax_id) {
	
    ajax_debug('Enter: xmlpost2');
    var req = ajax_array[ajax_id].req;
    var div = ajax_array[ajax_id].div;
    var url = ajax_array[ajax_id].url;
    var checkstate_func = ajax_array[ajax_id].checkstate_func;

    var message = ajax_array[ajax_id].message;
    var forcerefresh = ajax_array[ajax_id].forcerefresh;
    var vars = ajax_array[ajax_id].vars;
    if (pre_ajax_command) {
      eval(pre_ajax_command);
    }

    if (!ajax_concurrent) {
      if (ajax_id > 0) {
	if (ajax_array[ajax_id - 1].req.readyState < 4) {
	  setTimeout('xmlpost2(' + ajax_id + ')', 0);
	  ajax_debug('Exit: xmlpost2');
	  return;
	}
      }
    } 
    if (forcerefresh) {
      document.cookie = cookie_name + "=1; domain=." + ad_host + "; path=/";
    }	

    if (vars == "") {
      req.open("GET", url, true);
    } else {
      req.open("POST", url, true);
    }

    // If a function is supplied, use it, otherwise use the default
    if (checkstate_func == "") {	
      req.onreadystatechange = function () {checkstate(ajax_id)};
    } else {
      req.onreadystatechange = function () {checkstate_func(ajax_id)};
    }

    req.send(vars);
    
    ajax_debug('Exit: xmlpost2');
    return;
		
  }

  function from_response_javascript() {
	
    ajax_debug('Enter: from_response_javascript');
    var obj = getByID('post_ajax');
    if (obj && obj.innerHTML != "") {
      unescapeAndEval(obj.innerHTML);
			
      obj.innerHTML = "";
      obj.id = '';
      setTimeout(from_response_javascript, 0);
    }
    ajax_debug('Exit: from_response_javascript');
  }

  function readCookie(name)
  {
	
    ajax_debug('Enter: readCookie');
    var ca = document.cookie.split(';');
    var nameEQ = name + "=";
    for(var i=0; i < ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }

    ajax_debug('Exit: readCookie');
    return null;
  }
  // global xml get end 


  // Some string utilities

  function leftTrim(sString)
  {
	
    ajax_debug('Enter: leftTrim');
    while (sString.substring(0,1) == ' ')
      {
	sString = sString.substring(1, sString.length);
      }
    ajax_debug('Exit: leftTrim');
    return sString;
  }

  function rightTrim(sString)
  {

    ajax_debug('Enter: rightTrim');
    while (sString.substring(sString.length-1, sString.length) == ' ')
      {
	sString = sString.substring(0,sString.length-1);
      }
    ajax_debug('Exit: rightTrim');
    return sString;
  }


  function trimAll(sString)
  {
    return rightTrim(leftTrim(sString));
  }

  // End of if (!ajaxJsRunP) block
}

