/////////////////////////////////////////////////////////////////////
// $Id: XMLloader.js,v 1.6 2007/05/29 20:13:47 arleigh Exp $

// This is a generic front-end on XMLload.  It is an XML parser for
// a listed content item.  It exports its data through its row
// method, which is suitable for use with HTMLTemplate.
//
// url      - the URL of the XML to load (web service or flat file)
function XMLrows( url ) {
	var _this          = this;
	var _rows          = new Array();
	var _sortElement   = 'SELECTED';
	var _selectedValue = '';
	var _selectedField = '';

	_this.row = function( selectedValue, selectedField ) {
			var i;

			_selectedValue = selectedValue;
			_selectedField = selectedField;

			for( i = 0; i < _rows.length; i++ ) {
				if( _rows[i][_selectedField] == selectedValue ) {
					_rows[i].SELECTED = 'on';
				} else {
					_rows[i].SELECTED = 'off';
				}
			}
			return _rows;
		};

	_this.loadResponse = function( doc ) {
			var i, j;
			var root = doc.documentElement;
			var children = root.childNodes;

			for( i = 0; i < children.length; i++ ) {
				if( children[i].nodeType == 1 ) {	//Node Element
					// Found a row, need to get the row's children, now.
					var child     = children[i];
					var grandkids = child.childNodes;
					var row = new Object();

					for( j = 0; j < grandkids.length; j++ ) {
						if( grandkids[j].nodeType == 1 ) {	//Node Element
							var name  = grandkids[j].nodeName.toUpperCase();
							var value = grandkids[j].firstChild.nodeValue;
							row[name] = value;
						}
					}
					row.SELECTED = 'off';
					_rows.push( row );
				}
			}
		};

	_this.sort = function( element ) {
			_sortElement = element;
			_rows.sort(_this.order);
		};

	_this.order = function ( a, b ) {
			var bval = b[_sortElement];
			var aval = a[_sortElement];
			if( aval == bval ) {
				return 0;
			} else if( aval > bval ) {
				return -1;
			} else {
				return 1;
			}
		};

	_this.first = function() {
			return _rows[0];
		};

	_this.count = function() {
			return _rows.length;
		};

	var xml = new XMLload( url, _this.loadResponse );
}

// This is a generic front-end on XMLload.  It is an XML parser for
// a content item (not a list).  It dynamically creates accessor
// methods named after the child nodes of the root document in the
// document pointed to by the url.
//
// url      - the URL of the XML to load (web service or flat file)
function XMLdocument( url ) {
	var _this     = this;
	var _url      = url;
	var _elements = new Object();

	_this.loadResponse = function( doc ) {
			var root = doc.documentElement;
			var children = root.childNodes;

			for( var i = 0; i < children.length; i++ ) {
				if( children[i].nodeType == 1 ) {	//Node Element
					var name = children[i].nodeName;
					_elements[name] = children[i].firstChild.nodeValue;
					var fn = '_this.'+name+' = function() { return _elements.'+name+'; }';
					eval( fn );
				}
			}
		};

	_this.has = function( name ) {
			return( _elements[name] ? true : false );
		};

	var xml = new XMLload( url, _this.loadResponse );
}

// This is an abstract object that serves as a template
// for XMLHandler objects. These objects know how to find
// their data within an XML document 
function XMLHandler( name ){
	this.name = name;
	this.querystring = 'get' + name + '=1&';
	this.trigger = '';
	this.loadResponse = function( doc ){
		 // overload this method in specific implementations.
	};
}

// This is a generic front-end on XMLload.  It is a collection of
// XMLHandler objects.
//
// url      - the URL of the XML to load (web service or flat file)
function XMLHandlerCollection( url ) {
	var _url = url;
	var _this = this;
	_this.handlers = new Object();
	_this.handlerList = new Array();
	//_this.querystring = 'getprofile=1&';
	_this.querystring = '';	
	_this.trigger = '?';

	_this.addHandler = function( handler ){
		_this.handlers[ handler.name ] = handler;
		_this.handlerList.push( handler.name );
		if( handler.querystring.length > 0 && _this.querystring.indexOf( handler.querystring ) == -1 ){
			_this.querystring += handler.querystring;
		}
		if( handler.trigger.length > 0 && _this.trigger.indexOf( handler.trigger ) == -1 ){
			_this.trigger += handler.trigger;
		}
	};

	_this.loadResponse = function( doc ) {
		for ( var i=0; i<_this.handlerList.length; i++ ){
			_this.handlers[_this.handlerList[i]].loadResponse( doc );
		}
	};
	_this.loadDoc = function( url ){
		// strip off trailing ampersand
		var querystring = _this.querystring + 'lang=' + _this.language;
		var xml = new XMLload( url + _this.trigger + querystring, _this.loadResponse );
	};
}
// This is the AJAX workhorse, it actually manages the HTTP request
// for the XML document.  Once it has the document, it calls the
// callback function with the XML response's DOM as the only
// parameter.
//
// url      - the URL of the XML to load (web service or flat file)
// callback - function called after XML has been downloaded
//            called with the XML DOM as the only parameter
function XMLload( url, callback, onerror ) {
	var _this      = this;
	var _url       = url;
	var _callback  = callback;
	var _onerror   = onerror;
	var _supported = true;
	var _error     = false;
	var _response  = '';
	var _xmlReq;

	_this.isSupported = function() {
			return _supported;
		};

	_this.isError = function() {
			return _error;
		};

	_this.response = function() {
			return _response;
		};

	_this.processRequest = function() {
			if( _xmlReq.readyState == 4 ) {
				if( _xmlReq.status == 200 ) {
					_callback( _xmlReq.responseXML );
				} else {
					_error    = true;
					_response = _xmlReq.responseText;
					_onerror( _xmlReq.responseText );
				}
			}
		};

	// Select and test a HTML request object
	if( window.XMLHttpRequest ) {
		try {
			_xmlReq = new XMLHttpRequest();
		} catch(ex) {
			_error     = true;
			_supported = false;
		}
	} else if( window.ActiveXObject ) {
		try {
			_xmlReq = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(ex) {
			_error     = true;
			_supported = false;
		}
	} else {
		_error     = true;
		_supported = false;
	}

	if( _supported ) {
		//_xmlReq.onreadystatechange = _this.processRequest;
		//prompt( "getting: ", url );
		_xmlReq.open("GET", url, false);	// Last parm is async flag
		_xmlReq.send('');
		_this.processRequest();
	} else {
		_error    = true;
		_response = 'AJAX not supported on this browser.';
	}
}
