var ShopEngine = Class.create();

ShopEngine.prototype = {
	
	initialize: function() {
		this.ajaxElements = new Array();
		this.ajaxObjects  = new Array();
		this.requestURLS  = new Array();
	},
	
	registerAjaxElement: function( anId, anElement ) {
	if ( arguments.length == 1 )
		anElement = document.getElementById(anId);
		//anElement = $(anId);
	this.ajaxElements[anId] = anElement;
	},
	
	registerAjaxObject: function( anId, anObject ) {
		this.ajaxObjects[anId] = anObject;
	},
	registerRequest: function (requestLogicalName, requestURL) {
		this.requestURLS[requestLogicalName] = requestURL;
	},
	
	sendRequest: function(requestName) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

      var queryString = "";
      if ( arguments.length > 1 )
         queryString = this._createQueryString(arguments, 1);
			
     // if (this.requestURLS[requestName]=='/calendar/changeCal') {var requestURL = 'http://localhost/xampp/milosz/filharmonia/zserwera/calendar/changeCal'};
      new Ajax.Request(requestURL, this._requestOptions(queryString));
      
   },
	
	_createQueryString: function( theArgs, offset ) {
      var queryString = ""
      for ( var i = offset ; i < theArgs.length ; i++ ) {
          if ( i != offset )
            queryString += "&";

          var anArg = theArgs[i];

          if ( anArg.name != undefined && anArg.value != undefined ) {
            queryString += anArg.name +  "=" + escape(anArg.value);
          }
          else {
             var ePos  = anArg.indexOf('=');
             var argName  = anArg.substring( 0, ePos );
             var argValue = anArg.substring( ePos + 1 );
             queryString += argName + "=" + escape(argValue);
          }
      }

      return queryString;
   },
   
   _requestOptions: function(queryString) {
      var self = this;

      //var requestHeaders = ['Slot.Info', '1.0' ];
      var sendMethod = "post"
	  //requestHeaders.push( 'Content-type', 'text/xml' );
      
      return { //requestHeaders: requestHeaders,
               //parameters:     queryString,
               postBody:       queryString, //arguments[1] ? xmlDoc : null,
               method:         sendMethod,
               onComplete:     self._onRequestComplete.bind(self) };
   },
   
   _onRequestComplete : function(request) {
		//alert(request.status);
      //!!TODO: error handling infrastructure?? 
      if (request.status != 200)
        return;

      var response = request.responseXML.getElementsByTagName("ajax-response");
      //alert('response'+response);
      if (response == null || response.length != 1)
         return;
      this._processAjaxResponse( response[0].childNodes );
   },

   _processAjaxResponse: function( xmlResponseElements ) {
      for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) {
         var responseElement = xmlResponseElements[i];
			
         // 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 );
      }
   },

   _processAjaxObjectUpdate: function( ajaxObject, responseElement ) {
      ajaxObject.ajaxUpdate( responseElement );
   },

   _processAjaxElementUpdate: function( ajaxElement, responseElement ) {
      if ( responseElement.xml != undefined )
         this._processAjaxElementUpdateIE( ajaxElement, responseElement );
      else
         this._processAjaxElementUpdateMozilla( ajaxElement, responseElement );
   },

   _processAjaxElementUpdateIE: function( ajaxElement, responseElement ) {
      var newHTML = "";
      for ( var i = 0 ; i < responseElement.childNodes.length ; i++ )
         newHTML += responseElement.childNodes[i].xml;

      ajaxElement.innerHTML = newHTML;
   },

   _processAjaxElementUpdateMozilla: function( ajaxElement, responseElement ) {
      var xmlSerializer = new XMLSerializer();
      var newHTML = "";
      for ( var i = 0 ; i < responseElement.childNodes.length ; i++ )
         newHTML += xmlSerializer.serializeToString(responseElement.childNodes[i]);
		ajaxElement.innerHTML = newHTML;
   }
}
var shopEngine = new ShopEngine();
