
var GenericUpdater = Class.create();
GenericUpdater.prototype = {
initialize: function() {},

   _onRequestComplete : function(request) {

      //!!TODO: error handling infrastructure?? 

		if ($('debugArea'))
		{
			$('debugArea').innerHTML = request.responseText;
		}
		
		if (window["ricoDebug"] != undefined && ricoDebug > 2)
			debug("Ajax response received: \n" + request.responseText);
	
      var response = request.responseXML.getElementsByTagName("ajax-response");
      if (response == null || response.length != 1)
	  {
	  		alert("No ajax-response element found");
		   display.notWorking();
         	return;
		}

		this._handleAjaxResponse(response[0]);
	},

	_handleAjaxResponse: function( response )
	{

   display.notWorking();
	
      for ( var i = 0 ; i < response.childNodes.length ; i++ ) {
    	     var responseElement = response.childNodes[i];

	         // only process nodes of type element.....
        	 if ( responseElement.nodeType != 1 )
    	        continue;

			if (responseElement.nodeName == "response")
				this.ajaxUpdate(responseElement);
		}
	
	},
   
ajaxUpdate: function(ajaxResponse) {

	// intercept messages and errors
	if (cu = this.getFirstElement(ajaxResponse, 'Message'))
		this.message(this.getElementValue($cu));

	if (cu = this.getFirstElement(ajaxResponse, 'Error'))
		this.err(this.getElementValue($cu));

	// forward down to any ajaxUpdateExtension functions in this object
	if (this.AjaxUpdateExtension != null)
		this.AjaxUpdateExtension(ajaxResponse);
},

send: function()
{
	opts = "";
	for(i=0; i<arguments.length; i++)
		opts += "'"+arguments[i]+"', ";
		
	display.working();

	eval("ajaxEngine.sendMyRequest(this, 'request', "+opts+" 'rand="+Math.random()+"')");
},

getChildElement: function(root, name) {

	// go through direct decendents and find the first element with this name
	for(i=0; i<root.childNodes.length; i++)
		if (root.childNodes[i].nodeName == name)
			return root.childNodes[i];
			
	return null;

},

getChildElementValue: function(root, name) {
	return this.getElementValue(this.getChildElement(root, name));
},

// Gets the first element from the root of this tagname
getFirstElement: function(root, name)
{
	return this.getNthElement(root, name, 0);
},

getNthElement: function(root, name, n)
{
	return root.getElementsByTagName(name)[n];
},

getFirstElementValue: function(root, name) {
	return this.getElementValue(this.getFirstElement(root, name));
},

getElementValue: function(ele)
{
	if (ele == null)
		return '';
		
	// IE
	if (ele.text != null)
		return ele.text;

	// first try to get it directly by nodeValue
	if (ele.nodeValue != null)
		return ele.nodeValue;
	
	// try to get it from the first child
	if (ele.childNodes != null && ele.childNodes[0] != null && ele.childNodes[0].nodeValue != null)
		return ele.childNodes[0].nodeValue;
	
	return '';
},

deleteChildren: function(ele) {
	while($(ele).childNodes.length > 0)
		$(ele).removeChild($(ele).childNodes[0]);
},

getDateFromXML: function(ele) {
	// given an XML date object formatted as <Date><Year/><Month/><Day/><Hour/><Minute/></Date> return a js object

	year = this.getElementValue(this.getFirstElement(ele, "Year"));
	month = this.getElementValue(this.getFirstElement(ele, "Month"));
	day = this.getElementValue(this.getFirstElement(ele, "Day"));
	
	hour = this.getElementValue(this.getFirstElement(ele, "Hour"));
	minute = this.getElementValue(this.getFirstElement(ele, "Minute"));
	if ((second = this.getElementValue(this.getFirstElement(ele, "Second"))) == null)
		second = 0;
	
	if (hour != null && minute != null)
		return new Date(year, month, day, hour, minute, second);
	else
		return new Date(year, month, day);
	
},

err: function(msg)
{
	// add the text
	$(messageArea).innerHTML = msg;
	Element.show(messageArea);
	
	new Effect2.Pulsate(messageArea);
},

message: function(msg)
{

	if (this.messageDissapearTimer != null)
		clearTimeout(this.messageDissapearTimer);

	// add the text
	Element.hide(this.messageArea);
	$(this.messageArea).innerHTML = msg;
	new Effect2.Appear(this.messageArea);
	
	// make message disappear in three seconds
	this.messageDissapearTimer = setTimeout('new Effect2.Fade('+this.messageArea+')', 3000);
	
},

getParentElementByTagName: function(ele, tagname) {

	var e = ele;

	// given an element, get an element
	while((p = e.parentNode) != null)
	{
	
		if (p.nodeName.toLowerCase() == tagname.toLowerCase())
			return p;

		e = p;
	}
	
	return false;

},


// given a node on a response, get the request object
getRequestElement: function(start) {

	var root = this.getParentElementByTagName(start, 'ajax-response');
	return this.getFirstElement(root, 'request');

},

// get a request parameter value from the request object
getRequestParameterValue: function(start, name) {
	
	// get the request object
	req = this.getRequestElement(start);
	return this.getElementValue(this.getFirstElement(req, name));
}

};

var GenericFormUpdater = Class.create();
Object.extend(GenericFormUpdater.prototype, new GenericUpdater());
Object.extend(GenericFormUpdater.prototype,  {
initialize:  function(f) {
	this.f = $(f);
},


// setDateFromXML takes an XML representation of a Date and insert it into a form as published by jeffiel's CF_MAKE_DATE_FORM and CF_MAKE_TIME_FORM
setDateFromXML: function(root, name)
{
	// first, get the element of this name
	if ((ele = this.getFirstElement(root, name)) == null)
		return false;
	
	// set the year
	if (this.f.elements[name+"_yy"] != null && this.getElementValue(this.getFirstElement(ele, "Year")) != null)
		this.f.elements[name+"_yy"].value = this.getElementValue(this.getFirstElement(ele, "Year"));

	// set the month
	if (this.f.elements[name+"_mm"] != null && this.getElementValue(this.getFirstElement(ele, "Month")) != null)
		this.f.elements[name+"_mm"].value = this.getElementValue(this.getFirstElement(ele, "Month"));

	// set the day
	if (this.f.elements[name+"_dd"] != null && this.getElementValue(this.getFirstElement(ele, "Day")) != null)
		this.f.elements[name+"_dd"].value = this.getElementValue(this.getFirstElement(ele, "Day"));

	// set the hour
	if (this.f.elements[name+"_hh"] != null && this.getElementValue(this.getFirstElement(ele, "Hour")) != null)
		if (!isNaN(hr = parseInt(this.getElementValue(this.getFirstElement(ele, "Hour")))))
			if (hr > 12)
				this.f.elements[name+"_hh"].value = hr-12;
			else if (hr == 0)
				this.f.elements[name+"_hh"].value = 12;
			else
				this.f.elements[name+"_hh"].value = hr;

	// set the minute
	if (this.f.elements[name+"_mi"] != null && this.getElementValue(this.getFirstElement(ele, "Minute")) != null)
		this.f.elements[name+"_mi"].value = this.getElementValue(this.getFirstElement(ele, "Minute"));

	// set the AM/PM
	if (this.f.elements[name+"_pm"] != null && this.getElementValue(this.getFirstElement(ele, "Hour")) != null)
		if (!isNaN(hr = parseInt(this.getElementValue(this.getFirstElement(ele, "Hour")))))
			if (hr >= 12)
				this.f.elements[name+"_pm"].value = "PM";
			else
				this.f.elements[name+"_pm"].value = "AM";
		
		
}

});
