// properly format request object options for a form submission via post
Rico.AjaxEngine.prototype._formRequestOptions = function(queryString, doc) {
      var self = this;

      var requestHeaders = ['X-Rico-Version', Rico.Version ];
	  
		requestHeaders.push( 'Content-type', 'application/x-www-form-urlencoded' );
		requestHeaders.push( 'Content-length', doc.length);

      return { requestHeaders: requestHeaders,
               parameters:     queryString,
               postBody:       doc,
               method:         "post",
               onComplete:     self._onRequestComplete.bind(self) };
   };

// submit an request with a form encoded as a post
Rico.AjaxEngine.prototype.sendRequestWithFormData = function(requestName, f) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 2 )
         queryString = this._createQueryString(arguments, 2);

      new Ajax.Request(requestURL + "?" + queryString, this._formRequestOptions(null,Form.serialize(f)));
   };
   
// handler for iframe-based submission targets... allows iframe to act exactly as a response object
// in iframe tag, put onLoad="ajaxEngine._onRequestCompleteIFrame(this)" to invoke handler on XML received
// note this fails silently since often an iframe will be initialized without a src document
Rico.AjaxEngine.prototype._onRequestCompleteIFrame = function(fr) {

	if (window["ricoDebug"] != undefined && ricoDebug > 1)
		debug("Iframe Response Received from: " + frames[fr.name].document.URL);

      var response = frames[fr.name].document.getElementsByTagName("ajax-response");
      if (response == null || response.length != 1)
	  	return;
	
       $(fr.name).handler._handleAjaxResponse( response[0] );
   };

Rico.AjaxEngine.prototype.registerAjaxForm = function(fName, handler) {
	// add an iframe for this form
	document.write("<iframe name='"+fName+"iFrame' id='"+fName+"iFrame' class='hiddenFrame' onload='ajaxEngine._onRequestCompleteIFrame(this)'></iframe>");
	
	// add a "handler" to the iframe
	$(fName+"iFrame").handler = handler;
	
	// set the target of the form to this iframe
	$(fName).target = fName+"iFrame";
	
	$(fName).doSubmit = function() {
	
		display.working();
	
		this.submit();
	};
	
} ;  

Rico.AjaxEngine.prototype.registerAllAjaxForms = function(handler) {

	// make sure to call before page load is complete, or else document is overwritten
	for(aforms = document.getElementsByClassName("ajaxForm"), i=0; i<aforms.length; i++)
		this.registerAjaxForm(aforms[i].name, handler);

};

Rico.AjaxEngine.prototype.initUnhideables = function(classn) {

	for(unhideme = document.getElementsByClassName(classn), i=0; i<unhideme.length; i++)
	{
		Element.hide(unhideme[i]);
		unhideme[i].style.visibility =  'visible';
	}

};

Rico.AjaxEngine.prototype._processAjaxResponse = function( xmlResponseElements ) {

     for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) {
         var responseElement = xmlResponseElements[i];

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

       var responseType = responseElement.getAttribute("type");
       var responseId   = responseElement.getAttribute("id");

       if ( responseType == "object" )
          this._processAjaxObjectUpdate( this.ajaxObjects[ responseId ], responseElement );
       else if ( responseType == "element" )
          this._processAjaxElementUpdate( this.ajaxElements[ responseId ], responseElement );
       else
          alert('unrecognized AjaxResponse type : ' + responseType );
    }
};

Rico.AjaxEngine.prototype.sendMyRequest = function(requester, requestName) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 1 )
         queryString = this._createQueryString(arguments, 1);

      new Ajax.Request(requestURL, this._requestMyOptions(requester, queryString));
   };

   
Rico.AjaxEngine.prototype._requestMyOptions = function(requester,queryString,xmlDoc) {
      var self = this;

      var requestHeaders = ['X-Rico-Version', Rico.Version ];
      var sendMethod = "post";
	  
      if ( arguments[2] )
         requestHeaders.push( 'Content-type', 'text/xml' );
      else
         sendMethod = "get";

      return { requestHeaders: requestHeaders,
               parameters:     queryString,
               postBody:       arguments[1] ? xmlDoc : null,
               method:         sendMethod,
               onComplete:     requester._onRequestComplete.bind(requester) };
  };


