var netc = new Object();
netc.READY_STATE_UNINITIALIZED = 0;
netc.READY_STATE_LOADING = 1;
netc.READY_STATE_LOADED = 2;
netc.READY_STATE_INTERACTIVE = 3;
netc.READY_STATE_COMPLETE = 4;

netc.ContentLoader=function(component, url, method, requestParams, contentType){
	this.component = component;
	this.url = url;
	this.requestParams = requestParams;
	this.method = method;
	this.contentType = contentType;
}

netc.ContentLoader.prototype={

	getTransport:function(){
		var transport;
		if (window.ActiveXObject){
			try{
				transport = new ActiveXObject('Msxml2.XMLHTTP');
			}
			catch(err){
				transport = new ActiveXObject('Microsoft.XMLHTTP');
			}
		}else if(window.XMLHttpRequest)
			transport = new XMLHttpRequest();
		return transport;
	},

	sendRequest:function(){
		var requestParams = [];
		var contentType;
		for( var i =0; i < arguments.length ; i++){
			requestParams.push(arguments[i]);
		}
		if(!this.contentType && this.method=="POST"){
			contentType = "application/x-www-form-urlencoded";
		}else{
			contentType = this.contentType;
		}
		var request = this.getTransport();
		request.open(this.method, this.url, true);
		request.setRequestHeader('Content-Type', contentType);

		var oThis = this;
		request.onreadystatechange = function(){
			oThis.handleAjaxResponse(request);
		}
		request.send(this.queryString(requestParams));
	},
	
	queryString: function(args) {
		var requestParams = [];
		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 += this.requestParams;
		return queryString;
	},

	handleAjaxResponse:function(request){
		if(request.readyState == netc.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);
	}
}

function DoubleCombo( masterId, slaveId, url, options ) {
   this.master     = document.getElementById(masterId);
   this.slave      = document.getElementById(slaveId);
   this.options    = options;
   this.ajaxHelper = new netc.ContentLoader( this, url, "POST", options.requestParameters || [] );

   this.initializeBehavior();
}

DoubleCombo.prototype = {

   initializeBehavior: function() {
      var oThis = this;
      this.master.onchange = function() { oThis.masterComboChanged(); };
   },

   masterComboChanged: function() {
      var query = this.master.options[this.master.selectedIndex].value;
      this.ajaxHelper.sendRequest( 'q=' + query );
   },

   ajaxUpdate:  function(request) {
      var slaveOptions = this.createOptions(request.responseXML.documentElement);
      this.slave.length = 0;
      var optionsObj = this.slave.options;
      for ( var i = 0 ; i < slaveOptions.length ; i++ )
         optionsObj.add( slaveOptions[i] );
   },

   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;
   },

   handleError: function(request) {
      if ( this.options.errorHandler )
         this.options.errorHandler(request);
   },

   getElementContent: function(element,tagName) {
      var childElement = element.getElementsByTagName(tagName)[0];
      return childElement.text != undefined ? childElement.text : childElement.textContent;
   }

};
