/**
 Extention for GMNav
 
 
 */
 
 
var GMNavAjax = {
  Version: '1.0'
};


GMNavAjax.UpdateFieldSelect = Class.create(AjaxJspTag, {
  initialize: function(url, options) {
    this.url = url;
    this.setOptions(options);
    this.setListeners();
    addAjaxListener(this);
  },
  reload: function () {
    this.setListeners();
  },
  setOptions: function(options) {
    this.options = Object.extend({
      parameters: options.parameters || '',
      doPost: options.doPost || false,
      valueUpdateByName:  options.valueUpdateByName || false,
      eventType: options.eventType ? options.eventType : "click",
      parser: options.parser ? options.parser :  new ResponseXmlParser(),
      handler: options.handler ? options.handler : this.handler
    }, options || {});
  },

  setListeners: function() {
    eval("$(this.options.action).on"+this.options.eventType+" = this.execute.bindAsEventListener(this)");
  },

  execute: function(e) {
    if (isFunction(this.options.preFunction)) 
    {
    	this.options.preFunction();
	}
	if (this.options.cancelExecution) {
	    this.cancelExecution = false;
	    return ;
      }
    // parse parameters and do replacements
    var params = buildParameterString(this.options.parameters);

    // parse targets
    var targetList = this.options.target.split(',');

    var obj = this; // required because 'this' conflict with Ajax.Request
    var setFunc = this.setField;
    var aj = new Ajax.Request(this.url, {
      asynchronous: true,
      method: obj.options.doPost ? 'post':'get',
      evalScripts: true,
      parameters: params,
      onSuccess: function(request) {
        obj.options.parser.load(request);
        var results = obj.options.parser.itemList;
        obj.options.handler(request, {target: obj.options.target, items: results});
      },
      onFailure: function(request) {
        if (isFunction(obj.options.errorFunction)){
         obj.options.errorFunction(request,obj.options.parser);
     	}
      },
      onComplete: function(request) {
        if (isFunction(obj.options.postFunction)) { obj.options.postFunction(); }
      }
    });
  },

  handler: function(request, options) {
    // build an array of option values to be set as selected
    GMNavAjax.loadSelectOptions($(options.target), options.items);
  }

});

/**
Class will filter the first Item value and redirect to the correct handler 

*/
GMNavAjax.UpdateFieldController = Class.create(AjaxJspTag, {
  initialize: function(url, options) {
    this.url = url;
    this.setOptions(options);
    this.setListeners();
    addAjaxListener(this);
    this.handlers = this.options.handlers;
  },
  reload: function () {
    this.setListeners();
  },
  setOptions: function(options) {
    this.options = Object.extend({
      parameters: options.parameters || '',
      doPost: options.doPost || false,
      valueUpdateByName:  false,
      target:"",
      eventType: options.eventType ? options.eventType : "click",
      parser: options.parser ? options.parser :  new ResponseXmlParser(),
      handlers: $H(options.handlers),
      handler: this.handler
    }, options || {});
  },

  setListeners: function() {
    eval("$(this.options.action).on"+this.options.eventType+" = this.execute.bindAsEventListener(this)");
  },

  execute: function(e) {
    if (isFunction(this.options.preFunction)) 
    {
    	this.options.preFunction();
	}
	if (this.options.cancelExecution) {
	    this.cancelExecution = false;
	    return ;
      }
    // parse parameters and do replacements
    var params = buildParameterString(this.options.parameters);

    // parse targets
    var targetList = this.options.target.split(',');

    var obj = this; // required because 'this' conflict with Ajax.Request
    var setFunc = this.setField;
    var aj = new Ajax.Request(this.url, {
      asynchronous: true,
      method: obj.options.doPost ? 'post':'get',
      evalScripts: true,
      parameters: params,
      onSuccess: function(request) {
        tryCall(function(){
           obj.options.parser.load(request);
           var results = obj.options.parser.itemList;
           obj.options.handler(request, {target: obj.options.target, items: results});
        });
      },
      onFailure: function(request) {
        if (isFunction(obj.options.errorFunction)){
         obj.options.errorFunction(request,obj.options.parser);
     	}
      },
      onComplete: function(request) {
        if (isFunction(obj.options.postFunction)) { obj.options.postFunction(); }
      }
    });
  },

  handler: function(request, options) {
	    // build an array of option values to be set as selected
	    var key = getItemsValue("action", options.items);
		if (!this.handlers.get(key))
		{
			throw new Error(" Key '" + key + "' is not in " + this.handlers.keys() + "," + this.handlers.get(key));
		}
	    var values = new Array();
	    for (var i=1; i<options.items.length; i++) {
	    	var row =options.items[i];
	    	values[values.length] = row;
	    }
		var handlerFunction = this.handlers.get(key);
		handlerFunction(values);
		
	}
});

GMNavAjax.selectOption = function (select, optionValue)
{
    $A(select.options).each(function(option, index) {
    	if (option.value == optionValue)
           option.selected = true;
    });
}

GMNavAjax.loadSelectOptions = function (target, options)
{
    target.options.length = 0;
    target.disabled = false;
    var selectedIndex = 0;
    options = $A(options);
    for (var i=0; i<options.length; i++) {
    	
      var newOption = new Option(options[i][0], options[i][1]);
      //target.options[i] = new Option(options[i][0], options[i][1]);
      // set the option as selected if it is in the default list
      if ( newOption.selected == false && options[i].length == 3 && parseBoolean(options[i][2]) ){
           //alert(["selected", newOption.text, newOption.value]);
           newOption.selected = true;
           selectedIndex = i;
      }
      target.options[i] = newOption;
    }
    //Bug In IE
    target.selectedIndex = selectedIndex;
    
   /* if (options.length == 0)
    {
      target.options[i] = new Option("","");
   	  target.disabled = true;
    }

   	if (target.ajaxSelect && target.ajaxSelect.execute)
   	{
   		
   	  target.ajaxSelect.execute();
   	} */
};
function getItemsValue(keyName, items)
{
   var result=null;
   items.each(function(row, index) {
      if (keyName==row[0])
      {
         result = row[1];
      }
   });
   if (result==null)
   {
      throw ["Couldn't find Key:", keyName, "--items--", items];
   }
   return result;
}

function tryCall(func)
{  
   try{
      func();
   }catch(err)
   {
      alert([err, "from Try Error calling :", func]);
   }
};

function assert(value, name)
{
   if (!value)
   {
      throw name + " must be declared ";
   }
}

function parseLineToSelectOptions(s)
{
  var result = new Array();    
  var options = s.split("|");
  options.each(function(element, index) {
    var line = new Array();
    var option = element.split("=");
    line.push(option[0], (option[1] || "").strip(), (option[2] || "false").strip());
    result.push(line);
  });
  return result;
}

