/**
AJAX CORE OBJECTS/CODE
**/
//START XML LOADER FUNC
var Browser=null;
if (window.ActiveXObject) Browser="IE";
else Browser="FF";

function loadXMLDoc(url,format)
{
    var req;
    var xDoc
    if(!format) format="XML";
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        req.open("GET", url, false);
        req.send(null);
    }
    else if (window.ActiveXObject)
    {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req)
        {
            req.open("GET", url, false);
            req.send(null);
        } //inner if
     } //else
     if (req)
     {
	
         if (req.status == 200)
          {
              xDoc = req.responseXML;
	     //alert(req.responseText);
              if (xDoc && typeof (xDoc.childNodes) != "undefined" && xDoc.childNodes.length == 0){xDoc = null;} // xDoc check
          } //req.status check/iff
	else {alert("There was a problem retrieving the XML data (run from server only):\n" );} //req.status else   
    } //if (req)
    else{alert("Sorry, this browser isn\'t equipped to read XML data.");}
    if(format=="TEXT") return req.responseText;
    if(document.all) //IE
    {
       var xmldoc= new ActiveXObject("Microsoft.XMLDOM");


       xmldoc.loadXML(req.responseText);
    } 
    else //mozilla
    {
        var parser = new DOMParser();
        var xmldoc= parser.parseFromString(req.responseText,"text/xml");
    }
   return xmldoc;
} //end loadXMLDoc func

//END XML LOATER FUNC
//START RECORD SET OBJECT
RecordSet=function(xmldoc)
{
	/*DEFINE VARIABLES*/
	this.XML=xmldoc; 
	this.FIELD_NAMES=new Array();
	this.FIELD_LABELS=new Array();
	this.Init=initRecordSet;
	this.Records=null; // var to hold records
	this.NumRecords=0; 
	this.getRecord=getRecord;
	this.getFieldValue=getFieldValue;
	this.asRDB=printTable;
	this.getColumnValues=getColumnValues;
	this.getRowValues=getRowValues;
	this.mergeFields=mergeFields;
	//AS A LAST STEP, INITIALZE
	this.Init(); //initilize record set
}
function initRecordSet()
{
	if(!this.XML)
		throw("ValueError","xmldoc is null")
	//GET FIELDS
	if (this.XML==null) return false;
	
	var Fields=this.XML.getElementsByTagName("FIELDS")[0];
	if(Fields==null) {alert("no fields");return true;} //no fields--empty record set
	var numFields=Fields.getElementsByTagName("FIELD").length;
	
	for(var i=0;i<numFields;i++) 
	{
		try
		{
			var value=Fields.getElementsByTagName("FIELD")[i].firstChild.data
		}
		catch(e)
		{
			throw("ValueError","Invalid Field Name" );
		}
		this.FIELD_NAMES.push(value)
	}
	this.Records=this.XML.getElementsByTagName("RECORDSET")[0];
	this.NumRecords=this.Records.getElementsByTagName("RECORD").length;
}
function getRecord(index)
{
	if(record>this.NumRecords) throw("IndexError","Index is greater then the record set length");
	return this.Record.getElementsByTagName("RECORD")[index] ;
} //end getRecor
function getFieldValue(record,field)
{
	//get field value for this record index and field name
	if(record>this.NumRecords) throw("IndexError","Index ["+record+"] is greater then the record set length ["+this.NumRecords+"]")
	try
	{
		return this.Records.getElementsByTagName(field)[record].firstChild.data;
	}
	catch(e){return " ";}	
} //end getFieldValue
function printTable()
{
	//CREATES ELEMENTS
	var table=document.createElement("TABLE");
	table.setAttribute("ID","xml_doc_dynamic_table");
	table.setAttribute("CLASS","tablestyle");
	table.setAttribute("BORDER","1");
	var tbody=document.createElement("TBODY");
	table.appendChild(tbody);
	//CREATE HEADINGS
	var row=document.createElement("TR");
	for(var i=0;i<this.FIELD_NAMES.length;i++)
	{
		var container=document.createElement("TH");
		var data=document.createTextNode(this.FIELD_NAMES[i]);
		container.appendChild(data);
		row.appendChild(container);
	} //end for
	tbody.appendChild(row);
	for(var i=0;i<this.NumRecords;i++)
	{
		var row=document.createElement("TR")
		for(var j=0;j<this.FIELD_NAMES.length;j++)
		{
			var container=document.createElement("TD");
			var data=document.createTextNode( this.getFieldValue(i,this.FIELD_NAMES[j]) );
			container.appendChild(data);
			row.appendChild(container);
		} //end inner for
		tbody.appendChild(row);
	} //end outer for
	return table;
} //end printTable

function printTable2()
{
  //CREATES AS STRING
	var table="<TABLE BORDER=1 CLASS=\"tablestyle\">";
	//CREATE HEADINGS
	var row="<TR>";
	for(var i=0;i<this.FIELD_NAMES.length;i++)
	{
		var data=this.FIELD_NAMES[i];
		var th="<TH>" + data + "</TH>"
		row+=th;
	} //end for
	row+="</TR>"
	table+=row;
	for(var i=0;i<this.NumRecords;i++)
	{
		var row="<TR>"
		for(var j=0;j<this.FIELD_NAMES.length;j++)
		{
			var data= this.getFieldValue(i,this.FIELD_NAMES[j]) ;
			var td="<TD>"+data+"</TD>";
			row+=td;
		} //end inner for
		row+="</TR>";
		table+=row;
	} //end outer for
	return table;
} //end printTable

function getColumnValues(col)
{
	//get entire column (returned as array)
	var ret=new Array();
	for(var i=0;i<this.NumRecords;i++) ret.push(this.getFieldValue(i,col));
	return ret
} //end getColumn
function getRowValues(index)
{
	var ret= new Array();
	for(var i=0;i<this.FIELD_NAMES.length;i++) ret.push(this.getFieldValue(index,this.FIELD_NAMES[i]) );
	return ret;
} //end getRowValues;
function mergeFields(fieldsString)
{
	//return list(array) of merged fields/COLUMNS
	var Fields=String(fieldsString).split(",");
	var ret= new Array();
	for(var i=0;i<this.NumRecords;i++)
	{
		var val="";
		for(var j=0;j<Fields.length;j++)
		{
			val+=this.getFieldValue(i,Fields[j]) + " ";
		} //end inner for
		ret.push(val);
	}	 //end outer for
	return ret;
} //end mergeFields
//END RECORD SET OBJECT
//SELECT/COMBO BOX 
function loadSELECT(selectName,labels,values)
{
    //SELECT NAME IS STRING NAME FOR COMBO/SELECT BOX
    //LABELS IS ARRAY WITH COMBO LABELS
    //VALUES IS ARRAY VALUES FOR COMBO
    combo=document.getElementById(selectName);
    clearSELECT(selectName);
    for(var i=0;i<values.length;i++)
    {
        var op = new Option(labels[i],values[i]);
	if (Browser=="IE") combo.add(op);
        else combo.add(op,null,null);
    }
    
} //end loadSELECT
function clearSELECT(selectName)
{
    var i;
    combo=document.getElementById(selectName);
    sz=combo.length
    for(i=1;i<=sz;i++)
    {
        combo.remove(1);
    }
}
function createRecordSet(url)
{
  //URL VAR IS THE URL TO FETCH XML FROM
  var xmldoc=loadXMLDoc(url);
  var rst=new RecordSet(xmldoc)
  return rst;
}
function loadComboFromURL(url,selectName,labelsCol,valuesCol)
{
    /*
        GIVEN URL, CREATE A RECORD SET, AND POPULATE COMBO BOX WITH LABELS AND VALUES
        CORRESPONDING TO labels, values COLUMNS
    */
    var rst=createRecordSet(url); 
    var labels=rst.getColumnValues(labelsCol);
    var values=rst.getColumnValues(valuesCol);
    loadSELECT(selectName,labels,values);
}
function openNoPropWindow(url,title)
{
	var status="status=0";
	var toolbar="toolbar=0";
	var location="location=0";
	var menubar="menubar=0";
	var scrollbar="scrollbar=0";
	
	window.open(url,title,status,toolbar,location,menubar,scrollbar);
}
