var http_request ;        // global http_request
var browser ;             // browser name
var common_folder ;       // Folder where to find the xmlburst for backend process

// Initializes the objects used in AJAX things 
function initAjaxEngine(http_request_prefix , xmlburst_folder)
{
  browser = navigator.appName; //find the browser name  
  if(browser == "Microsoft Internet Explorer")/* Create the object using MSIE's method */
	http_request = new ActiveXObject("Microsoft.XMLHTTP");
  else  /* Create the object using other browser's method */
	http_request = new XMLHttpRequest();
  
  common_folder = http_request_prefix + "/" + xmlburst_folder ;	
} // initAjaxEngine

function debug(val , name) 
{
  alert(name + ": " + val) ;
}

function getElementContent(parent_element , element_name)
{
  var final_result = checkElementContent(parent_element,element_name) ;
  
  if (final_result == null)
    alert("Element: " + element_name + " not found under " + parent_element.nodeName);
  
  return trim(final_result) ; 
}

// Tries to find the content of element name under parent_element. Returns null if not found
function checkElementContent(parent_element , element_name)
{
  var final_result = null ;
  
  var child_nodes = parent_element.childNodes ;
	
  // Now find which of the found nodes are directly under parent element
  var no_of_nodes_found = 0 ;
  for (var i = 0 ; i < child_nodes.length ; i++)
  {
    if (child_nodes[i].nodeName == element_name)
	{
	  no_of_nodes_found++ ;
	  final_result = child_nodes[i].childNodes[0].nodeValue ;
    }	
  }  
  if (no_of_nodes_found > 1)
    alert("Element element_name found more than once under " + parent_element.nodeName);
  
  if (final_result != null)
    final_result = trim(final_result) ;
	
  return final_result ; 
} // checkElementContent

// Tries to find the content of element name under parent_element. Returns null if not found
function checkElementRoot(parent_element , element_name)
{
  var final_result = null ;
  
  var child_nodes = parent_element.childNodes ;
	
  // Now find which of the found nodes are directly under parent element
  var no_of_nodes_found = 0 ;
  for (var i = 0 ; i < child_nodes.length ; i++)
  {
    if (child_nodes[i].nodeName == element_name)
	{
	  no_of_nodes_found++ ;
	  final_result = child_nodes[i] ;
    }	
  }  
  if (no_of_nodes_found > 1)
    alert("Element element_name found more than once under " + parent_element.nodeName);
  
  return final_result ; 
} // checkElementRoot

// Causes an ajax object be created and returned by calling the file create_ajax_object.php
function loadAjaxObject(params)
{
  
  // Show the wait object
  //var ajax_wait = document.getElementById("ajax_obj") ; // hidden wait indicator // debug later
  //ajax_wait.style.display = "block" ;// debug later
  
  var create_obj_path = common_folder + "/create_ajax_object.php?" + params + "&seconds=" + new Date().getTime() ;
  // alert("create_obj_path: " + create_obj_path) ; //debug
  http_request.open("GET",create_obj_path,true);
  http_request.send(null); 
  http_request.onreadystatechange = function()
  {
	if (http_request.readyState == 4)
    {
	  //debug later ajax_wait.style.display = "none" ; // hide the wait object

	  var xml_doc ;
	  var error_msg = "" ;
	  
	  //document.write(http_request.responseText) ;
	  if (browser == "Microsoft Internet Explorer")
	  {
	    // Use Microsoft XML object to parse the returned XML and show on screen
        xml_doc = new ActiveXObject("Microsoft.XMLDOM") ;
        xml_doc.async = "false" ;
	    xml_doc.loadXML(http_request.responseText) ;
		//alert(http_request.responseText) ;
		if (xml_doc.parseError.errorCode != 0)
		  error_msg = "Error in XML " + xml_doc.parseError.reason ; 
	  }
	  else // other browsers
      {
        var parser = new DOMParser(); 
        xml_doc = parser.parseFromString(http_request.responseText,"text/xml"); 
        xml_doc.async = "false" ;
        if (xml_doc.documentElement.nodeName == "parsererror") 
		  error_msg = "Error in XML " ; 
      }	  
	  
	  // If no error continue
	  if (error_msg == "") 
	  {	
	    // If there is no error then show the returned object in a dialog box
		// **************************************************************
		
		var xml_root = xml_doc.documentElement ; // first create the xml doc
		var returned_html = getElementContent(xml_root,"html_source") ;
		
		// See in which object we should show the content  
		var ajax_obj_id = checkElementContent(xml_root,"show_in_element") ;
        if (ajax_obj_id == null) // If page layout not specified for this page, then use the default for this web site 
 		  ajax_obj_id = "ajax_obj" ;
		$("#" + ajax_obj_id).html(returned_html) ;
		$("#" + ajax_obj_id).dialog({modal: true, autoOpen: false}) ; // do not open before setting all attributes
		
		// Set the width of the dialog
		var obj_width = checkElementContent(xml_root,"width") ;
		if (obj_width != null)
		  $("#" + ajax_obj_id).dialog('option','width',parseInt(obj_width)) ;
		  
		// Set the title of the dialog
		var obj_title = checkElementContent(xml_root,"title") ;
		if (obj_title != null)
		  $("#" + ajax_obj_id).dialog('option','title',obj_title) ;
		  
		// Set the css class of the dialog
		var obj_class = checkElementContent(xml_root,"css_class") ;
		if (obj_class == null)
		  obj_class = "ajax_obj" ;
		$("#" + ajax_obj_id).dialog('option','dialogClass',obj_class) ;
		  
		// Finally open the dialog  
		$("#" + ajax_obj_id).dialog("open") ;
	  }
      else
	  {
        alert(error_msg) ;
		alert("http_request.responseText: " + http_request.responseText) ; //debug
		document.write(http_request.responseText) ;
      }		
	}  
  } // onreadystatechange 
  return false ;  
} // loadAjaxObject

function unloadAjaxObject() 
{
  document.getElementById("ajax_obj").style.display = "none" ;
  //debug later Effect.DropOut('ajax_obj') ;
  return false ;
}

// Updates a child select element when the parent element changes. This is called when the parent of a child element gets updated, so child element also updates 
function updateChildElement(element_id , link_field , link_value , element_name , show_on_no_value , show_on_no_rec)
{
  // If no record found and is show_on_no_rec is not defined then show_on_no_value instead
  show_on_no_value = typeof(show_on_no_value) != 'undefined' ? show_on_no_value : "" ;
  show_on_no_rec = typeof(show_on_no_rec) != 'undefined' ? show_on_no_rec : show_on_no_value ;
   
  request_str = common_folder + "/create_ajax_object.php?obj=elm&element_id=" + element_id + "&lnk_field=" + link_field + "&lnk_val=" + link_value + "&show_on_no_value=" + show_on_no_value ;
  // alert("request_str: " + request_str) ; //debug
  http_request.open("GET",request_str,true);
  http_request.send(null); 
  http_request.onreadystatechange = function()
  {
    if (http_request.readyState == 4)
    {
      // alert(browser) ;
	  var cur_obj = document.forms[0].elements[element_name] ;
	  
	  // If it is Internet Explorer because of IE bug, I can not simply assign the return value to innerHTML. This is a known bug
	  if (browser == "Microsoft Internet Explorer")
	  {
	    var initial_len = cur_obj.options.length ;
        for (var i = 0 ; i < initial_len ; i++)
          cur_obj.remove(0) ;
  
        var xml_doc = new ActiveXObject("Microsoft.XMLDOM") ;
        xml_doc.async = "false" ;
	    xml_doc.loadXML(http_request.responseText) ;
		//alert(http_request.responseText) ;
        if (xml_doc.parseError.errorCode == 0) 
	    {	  
	      var xml_root = xml_doc.documentElement ;
          for (i = 0 ; i < xml_root.childNodes.length ; i++)
	        cur_obj.options[i] = new Option(xml_root.childNodes[i].childNodes[0].nodeValue,xml_root.childNodes[i].attributes.item(0).value) ;
		  // If no record found the put the record not found message
		  if (i ==  0)
	  	  {
	        // cur_obj.options[i] = new Option("--No Record Found--","--No Record Found--") ;
	        cur_obj.options[i] = new Option(show_on_no_rec,show_on_no_rec) ;
		    cur_obj.disabled = true ; 
		  }  
		  else
		    cur_obj.disabled = false ;  
	    }
        else
          alert("Error in XML: " + xml_doc.parseError.reason) ;
	  }	
      else  // Browsers other than Internet Explorer
	  {
	    var return_val = http_request.responseText ;
        if(return_val == "<options></options>")
		{
		  cur_obj.innerHTML = "<option value='--No Record Found--'>--No Record Found--</option>" ; 	
		  cur_obj.disabled = true ; 
		}
		else
		{
		  // can not simply use cur_obj.innerHTML = return_val because of the use of CDATA we need to parse the XML and create the innerHTML
          parser = new DOMParser();
		  //alert("return_val: " + return_val) ; //debug
          xml_doc = parser.parseFromString(return_val,"text/xml");
	      
		  var xml_root = xml_doc.documentElement ;
		  var new_inner_html = "" ;
          for (i = 0 ; i < xml_root.childNodes.length ; i++)
		  {
		    cur_node = xml_root.childNodes[i] ;
	        new_inner_html += "<option value='" + cur_node.getAttribute("VALUE") + "'>" ;
	        new_inner_html += cur_node.textContent + "</option>" ;
		  }
		  cur_obj.innerHTML = new_inner_html ; 
          cur_obj.disabled = false ; 		  
		}
	  }	
	}  
  } 
} // updateChildElement

// Runs the program code in the back end.
function runBackEndProg(program_code , args)
{
  var call_url = common_folder + "/run_backend_script.php?prog=" + program_code + "&" + args + "&seconds=" + new Date().getTime() ;
  
  // alert("call_url: " + call_url) ; //debug
  
  http_request.open("GET",call_url,true); // call the url to run the program
  http_request.send(null); 
  
  //return true ;
  http_request.onreadystatechange = function()
  {
    if (http_request.readyState == 4)
    {
	  var xml_doc ;
	  var error_msg = "" ;
	  
	  // alert("http_request.responseText: " + http_request.responseText) ; //debug
	  if (browser == "Microsoft Internet Explorer")
	  {
	    // Use Microsoft XML object to parse the returned XML and show on screen
        xml_doc = new ActiveXObject("Microsoft.XMLDOM") ;
        xml_doc.async = "false" ;
	    xml_doc.loadXML(http_request.responseText) ;
		if (xml_doc.parseError.errorCode != 0)
		  error_msg = xml_doc.parseError.reason ; 
	  }
	  else // other browsers
      {
        var parser = new DOMParser(); 
        xml_doc = parser.parseFromString(http_request.responseText,"text/xml"); 
        xml_doc.async = "false" ;
        if (xml_doc.documentElement.nodeName == "parsererror") 
		  error_msg = http_request.responseText ; 
      }	  
	  // If no error continue
	  if (error_msg == "") 
	  {	  
	    var xml_root = xml_doc.documentElement ;
		var prog_result = checkElementContent(xml_root,"prog_result") ;
		//alert("prog_result: " + prog_result) ; //debug
		if (prog_result != null)
		  eval(prog_result) ;
	  }
      else
	  {
        alert("Error in XML Response: " + error_msg) ;
		return false ;
      }		
	}  
  } 
} // runBackEndProg

// In a heirarchy of 3 elements when the top parent changes, its child will also update, this function resets its second level child
// or its grand child
function resetGrandChild(element_name , reset_message)
{
  var cur_obj = document.forms[0].elements[element_name] ;
  var initial_len = cur_obj.options.length ;
      for (var i = 0 ; i < initial_len ; i++)
        cur_obj.remove(0) ;
  cur_obj.options[0] = new Option(reset_message,reset_message) ;
  cur_obj.disabled = true ;
}

// Converts the xml_text to the DOM XML object and returns it. Returns false if it fails
function xmlRoot(xml_text)
{
  if (browser == "Microsoft Internet Explorer")
  {
	// Use Microsoft XML object to parse the returned XML and show on screen
    xml_doc = new ActiveXObject("Microsoft.XMLDOM") ;
    xml_doc.async = "false" ;
	xml_doc.loadXML(xml_text) ;
	if (xml_doc.parseError.errorCode != 0)
	{
	  alert("Error in XML Response: " + xml_doc.parseError.reason) ; 
	  return false ;
	}  
  }
  else // other browsers
  {
    var parser = new DOMParser(); 
    xml_doc = parser.parseFromString(xml_text,"text/xml"); 
    xml_doc.async = "false" ;
    if (xml_doc.documentElement.nodeName == "parsererror") 
	{
      alert("Error in XML Response: " + xml_text) ; 
	  return false ;
	}  
  }	
  var xml_root = xml_doc.documentElement ;
  return xml_root ;
} // xmlRoot

function updateJEdittable(elm_id , new_value , uid)
{
  runBackEndProg('updateJEdittable("' + elm_id + '","' + new_value + '",' + uid + ') ;') ;
} // updateJEdittable
