AjaxEngine = Class.create();

AjaxEngine.prototype = {

   initialize: function() {
      this.ajaxElements = new Array();
      this.ajaxObjects  = new Array();
      this.requestURLS  = new Array();
   },

   registerAjaxElement: function( anId, anElement ) {
      if ( arguments.length == 1 )
         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);

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

   sendRequestWithData: function(requestName, xmlDocument) {
      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._requestOptions(null,xmlDocument));
   },

   sendRequestAndUpdate: function(requestName,container,options) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

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

      var updaterOptions = this._requestOptions(queryString);
      updaterOptions.onComplete = null;
      updaterOptions.extend(options);

      new Ajax.Updater(container, requestURL, updaterOptions);
   },

   sendRequestWithDataAndUpdate: function(requestName,xmlDocument,container,options) {
      var requestURL = this.requestURLS[requestName];
      if ( requestURL == null )
         return;

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


      var updaterOptions = this._requestOptions(queryString,xmlDocument);
      updaterOptions.onComplete = null;
      updaterOptions.extend(options);

      new Ajax.Updater(container, requestURL + "?" + queryString, updaterOptions);
   },

   // Private -- not part of intended engine API --------------------------------------------------------------------

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

      var requestHeaders = ['Slot.Info', '1.0' ];
      var sendMethod = "post"
      if ( arguments[1] )
         requestHeaders.push( 'Content-type', 'text/xml' );
      else
         sendMethod = "get";

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

   _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;
   },

   _onRequestComplete : function(request) {

      //!!TODO: error handling infrastructure??
      if (request.status != 200)
        return;

      var response = request.responseXML.getElementsByTagName("ajax-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 ajaxEngine = new AjaxEngine(); //ajax object
var nCurrentCat = 0; //currently desplayed cat
var aReqItems = {}; //All the required items in an associative array
var aAllItems = {}; //All the items in an associative array
var bPageLoadedAndReady = false;

var aIncompatibleItems = {}; //All the incompatible items in an associative array
var aPartialItems = {}; //items that show partial lists dependent on another cat

function loadCategory(nCatID,sType){
	if(aPartialItems[sType]){
		if(document.getElementById('form_value_'+aPartialItems[sType]).value){
			ajaxEngine.sendRequest('get_category', "cat="+nCatID , "restrictCat="+aIncompatibleItems[aPartialItems[sType]][document.getElementById('form_value_'+aPartialItems[sType]).value]['id']);
		}else{
			document.getElementById('selector-container').innerHTML = "<p>Please select "+aPartialItems[sType]+" first.";
		}
	}else{
		nCurrentCat = nCatID;
		ajaxEngine.sendRequest('get_category', "cat="+nCatID );
	}
}

function changeDummy(sCatName, sImageName){
	if(!bPageLoadedAndReady) return;

	var oldVal = document.getElementById('form_value_'+sCatName).value;

	if(typeof(aIncompatibleItems)=="object" && typeof(aIncompatibleItems[sCatName])=="object" && typeof(aIncompatibleItems[sCatName][sImageName])=="object" && typeof(aIncompatibleItems[sCatName][oldVal])=="object"){
		//They have different type cats
		if(aIncompatibleItems[sCatName][sImageName]['id'] != aIncompatibleItems[sCatName][oldVal]['id']){
			var aClear = aIncompatibleItems[sCatName][sImageName]['clearcat'].split(",");
			for (i = 0; i < aClear.length; i++){
				document.getElementById('form_value_'+aClear[i]).value = "";
				document.getElementById('dummy-'+aClear[i]).innerHTML = "";
			}
		}//empty the incompatible cat
	}

	if(aPartialItems[sCatName] && !document.getElementById('form_value_'+aPartialItems[sCatName]).value){
		//This item is dependent on something that is not set
		return false;
	}

	ajaxEngine.sendRequest('set_dummy', "type="+sCatName, "name="+sImageName );
	document.getElementById('form_value_'+sCatName).value = sImageName

	if(aReqItems[sCatName] === false){
		aReqItems[sCatName] = true;
	}
	aAllItems[sCatName] = true;

	setSaveClearButtons();
}

function clearDummy(){

	for(i=0; i < document.avatar_post.elements.length; i++){
		if(document.avatar_post.elements[i].type == 'hidden'){
			var piece = document.avatar_post.elements[i].id.replace(/^form_value_/,'');
			document.avatar_post.elements[i].value = "";
			document.getElementById('dummy-'+piece).innerHTML = "";
			if(aReqItems[piece] === true) aReqItems[piece] = false;
			aAllItems[piece] = false;
		}
	}

	setSaveClearButtons();

}

function setSaveClearButtons(){

	var bAllGood = true;
	var bAnyGood = false;

	for (var cat in aReqItems){
		if(!aReqItems[cat]){
			bAllGood = false;
		}
	}

	if(bAllGood){
		document.getElementById('submit-post').disabled = false;
	}else{
		document.getElementById('submit-post').disabled = true;
	}

	for (var cat in aAllItems){
		if(aAllItems[cat]){
			bAnyGood = true;
		}
	}

	if(bAnyGood){
		document.getElementById('clear-builder').disabled = false;
	}else{
		document.getElementById('clear-builder').disabled = true;
	}

}

function fixpng(img){
	var ver = getInternetExplorerVersion();
	if (ver <= -1 || ver >= 7){
	    return true;
	}

  	var imgName = img.src.toUpperCase()
	if (imgName.substring(imgName.length-3, imgName.length) == "PNG")	      {
		var imgID = (img.id) ? "id='" + img.id + "' " : ""
		var imgClass = (img.className) ? "class='" + img.className + "' " : ""
		var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
		var imgStyle = "display:inline-block;" + img.style.cssText
		if (img.align == "left") imgStyle = "float:left;" + imgStyle
		if (img.align == "right") imgStyle = "float:right;" + imgStyle
		if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
		var strNewHTML = "<span " + imgID + imgClass + imgTitle
		+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
		+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
		+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
		img.outerHTML = strNewHTML
	}
}

function getInternetExplorerVersion(){
  var rv = -1; // Return value assumes failure
  if (navigator.appName == 'Microsoft Internet Explorer'){
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null){
   		rv = parseFloat( RegExp.$1 );
    }
  }
  return rv;
}

startBuilder();
