
// Standard ContentLoad (Rico.js)
var net = new Object();

net.READY_STATE_UNINITIALIZED= 0;
net.READY_STATE_LOADING      = 1;
net.READY_STATE_LOADED       = 2;
net.READY_STATE_INTERACTIVE  = 3;
net.READY_STATE_COMPLETE     = 4;

net.ContentLoader = function( component, url, method, requestParams ) {
   this.component     = component;
   this.url           = url;
   this.requestParams = requestParams;
   this.method        = method;
}

net.ContentLoader.prototype = {

   getTransport: function() {
      var transport;
      if ( window.XMLHttpRequest )
         transport = new XMLHttpRequest();
      else if ( window.ActiveXObject ) {
         try {
            transport = new ActiveXObject('Msxml2.XMLHTTP');
         }
         catch(err) {
            transport = new ActiveXObject('Microsoft.XMLHTTP');
         }
      }
      return transport;
   },

   sendRequest: function() {

      //if ( window.netscape && window.netscape.security.PrivilegeManager.enablePrivilege)
      //   netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');

      var requestParams = []
      for ( var i = 0 ; i < arguments.length ;  i++ )
         requestParams.push(arguments[i]);

      var oThis = this;
      var request = this.getTransport();
      request.open( this.method, this.url, true );
      request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded');
      request.onreadystatechange = function() { oThis.handleAjaxResponse(request) };
      request.send( this.queryString(requestParams) );
  },

  queryString: function(args) {

     var requestParams = [];
     for ( var i = 0 ; i < this.requestParams.length ; i++ )
        requestParams.push(this.requestParams[i]);
     for ( var j = 0 ; j < args.length ; j++ )
        requestParams.push(args[j]);

     var queryString = "";
     if ( requestParams && requestParams.length > 0 ) {
        for ( var i = 0 ; i < requestParams.length ; i++ )
           queryString += requestParams[i] + '&';
        queryString = queryString.substring(0, queryString.length-1);
     }
     return queryString;
  },

  handleAjaxResponse: function(request) {
     if ( request.readyState == net.READY_STATE_COMPLETE ) {
        if ( this.isSuccess(request) )
           this.component.ajaxUpdate(request);
        else
           this.component.handleError(request);
     }
  },

  isSuccess: function(request) {
    return  request.status == 0 
        || (request.status >= 200 && request.status < 300);
  }

};


// Constructor Function

function LCONPCServiceClient( targetId, url, options, isbooktool ) {
	 this.cache      = new Array(); // cache the requests.
	 this.data       = new Array(); // initialize b4 first call
	 this.cacheKey   = "";
   this.target     = document.getElementById(targetId);  // use to change/filter the defaults !
   this.options    = options;
   this.ajaxHelper = new net.ContentLoader( this, url, "POST", options.requestParameters || [] );
	 this.reqFields  = new Array("village","adult","teenagers","infants","babies"); // should be in constructor arg option !
	 this.villasField = (isbooktool) ? "villas" : "villasSelect";
}

LCONPCServiceClient.prototype = {

	 refreshData: function() {
	 	
	 	// TODO : disallow multiple requests (what's the behaviour of .abort() for the server side ?
	 	
	 	// build arguments & cache key
	 	var request_params = "";
	 	var cache_key = "";
	 	for ( var i = 0 ; i < this.reqFields.length ; i++ ) {
	 			if (i > 0) { 
	 					request_params += '&';
	 					cache_key += ':';
	 			}
	 			var field_name  = this.reqFields[i];
	 			var field_value = document.getElementById(field_name).value;
	 			request_params += field_name + '=' + field_value;
	 			cache_key += field_value;
	 	}
	 	// villas not a normal id  => villasSelect
	 	var field_name = this.villasField
	 	var field_value = document.getElementById(field_name).value;
	 	request_params +=  '&' + 'villas' + '=' + field_value;
	 	cache_key += ':' + field_value;
	 		
	 	this.requestData(cache_key, request_params);	
	 },

   requestData: function(cache_key, request_params) {
   			// build cache key.
   			this.cacheKey = ""; // clear for debug !
   		  this.cacheKey = cache_key;
    		var in_cache = this.cache[this.cacheKey];

    		if (in_cache == null) { // damn not found in cache
    			this.ajaxHelper.sendRequest(request_params);
    		}	else {
    			this.debug('[' + this.cacheKey + '] : CACHED');
					this.processResult();	    			
    		}
      // 
   },

	 
   ajaxUpdate:  function(request) {
   	// 1. get data from response
   	// 2. store in cache after EVAL
   	// 3. if data build options else leave data
   	// 3a. get options from target
   	// 3b. filter out
   		var response_text = request.responseText;
   		var response_data;
    	try {
    		//alert('resp:' + response_data);
    		response_data = eval(response_text);
    		this.cache[this.cacheKey] = response_data;
    		} catch (err) { this.debug('[' + this.cacheKey + '] : Exception:' + err); }

   		this.processResult();
   },


	 processResult: function() {
	 	var filter_lconpc = this.cache[this.cacheKey];
		if (filter_lconpc != null && filter_lconpc.length > 0) {
			this.debug('[' + this.cacheKey + '] = {' + filter_lconpc + '}');

    	var default_options = this.getDefaultCategories(document.getElementById('village').value);
    	var new_options = new Array();
    		
  		// Filter allowed categories
  		for (var i=0; i<default_options.length; i++) {
  			var def_option = default_options[i];
	      if ( filter_lconpc.indexOf(def_option.value) != -1 ) {
		      new_options[new_options.length] = ( new Option(def_option.text, def_option.value));
	    	}
  		}
    	
    	var selected_cat = this.target.value;
    		
  		// insert filtered categories
  		this.target.length = 1;
  		var optionsObj = this.target.options;
    	for ( var i = 0 ; i < new_options.length ; i++ )
      		optionsObj.add( new_options[i] );
			
			setSelectedOption(this.target, selected_cat);
			
		} // else do nothing, keep defaults.	 	
	 },	


	 // mandatory for loader
	 handleError: function(request) {
      if ( this.options.errorHandler ) // only for development you can give this option along to constructor option arg.
         this.options.errorHandler(request);
   },

	 getDefaultCategories: function(code) {
		var countryCode = null;
		var villageCode = null;
		
		// Determine what's passed in 
    var isVillage = false;
    for(i=0;i< villages.length && !isVillage; i++) {
      if (villages[i][0] == code) {
        isVillage = true;
        break;
      }
    }
		
  	if (! isVillage) {
     	countryCode = code;
     	villageCode = "";
    } else {
    	countryCode = "";
    	villageCode = code;
    }
			return getCategoryOptions(countryCode, villageCode);

	 },

   createOptions: function(ajaxResponse) {
      var newOptions = [];
      var entries = ajaxResponse.getElementsByTagName('entry');
      for ( var i = 0 ; i < entries.length ; i++ ) {
         var text  = this.getElementContent(entries[i],'optionText');
         var value = this.getElementContent(entries[i],'optionValue');
         newOptions.push( new Option(text, value) );
      }
      return newOptions;
   },

   
	 // IE vs Gecko (real browser) helper method.
   getElementContent: function(element,tagName) {
      var childElement = element.getElementsByTagName(tagName)[0];
      return childElement.text != undefined ? childElement.text : childElement.textContent;
   },
      
   debug: function(str) {
   	var console=document.getElementById('console');
   	if (str && console) {
   		console.innerHTML+=str+"\n";
   	}
   }

};
