/**
 * @package	jquery.jQfilter.js jQuery plugin to filter chained select boxes
 * @version	1.0 Initial Version
 * @author	Sasa Bogdanovic
 * @website http://www.rudibela.com
 * @licence
 * @usage	$(vTarget).filter({options});
 * @param	bindEvents - Space separated list of events on which the filter-control action will be done. Default 'load change'.
 * @param	controllerId - id of the HTML element based on value of which the target is filtered. Cannot be null.
 * @param	disablingVal - value od controllerId for which the target is disabled. Default '%'.
 * @param	disablingOperator - Relational operator to use for comparison of value of controllerId agains disablingVal. Default '=='.
 * @param	disableTarget - To disable target control if value of controllerId is equal to disablingVal. Default false.
 * @param	filterTarget - Flog to filter target control or not. filterServer cannot be null. Default false.
 * @param	filterServer - server-side logic to do the filtering of the target using AJAX call.
 */

(function($) {
	// plugin definition
	$.fn.filterControl = function(options){
		var target = "#"+$(this).attr("id");
		var opts = $.extend({}, $.fn.filter.defaults, options);

		var optBindEvents = opts.bindEvents;
		var optControllerId = "#"+opts.controllerId;
		var optDisablingVal = opts.disablingVal;
		var optDisablingOperator = opts.disablingOperator;
		var optDisableTarget = opts.disableTarget;
		var optFilterTarget = opts.filterTarget;
		var optFilterServer = opts.filterServer;

		var controllerValue = $(optControllerId).val();
		var filterQryString = optFilterServer+"&"+opts.controllerId+"="+controllerValue+"&"+$(target).attr("name")+"="+$(target).val();
		if (controllerValue != optDisablingVal)
		{
			if (optFilterTarget)
			{
				filterTarget(target,filterQryString);
			}
		}
		else
		{
			if (optDisableTarget)
			{
				disableTarget(target,controllerValue,optDisablingVal,optDisablingOperator);
			}
		};

		$(optControllerId).bind(optBindEvents, function(){
			var controllerValue = $(optControllerId).val();
			var filterQryString = optFilterServer+"&"+opts.controllerId+"="+controllerValue;
			if (optDisableTarget)
			{
				disableTarget(target,controllerValue,optDisablingVal,optDisablingOperator);
			}
			if (optFilterTarget)
			{
				filterTarget(target,filterQryString);
			}
		});

//		$(target).bind("load", function(){
//			var controllerValue = $(optControllerId).val();
//			var filterQryString = optFilterServer+"?"+opts.controllerId+"="+controllerValue;
			if (optDisableTarget)
			{
				disableTarget(target,controllerValue,optDisablingVal,optDisablingOperator);
			}
			if (optFilterTarget)
			{
				filterTarget(target,filterQryString);
			}
//		});
	};

	// private function to disable the target element based on the comparison
	// of the value of the controller control against the reference value
	function disableTarget(target,controllerValue,disablingVal,disablingOperator){
		var comparisonResult = returnComparisonResult(controllerValue,disablingVal,disablingOperator);
		if (comparisonResult)
		{
			$(target).each(function(){
				$(target).attr("disabled","disabled");
			});
            $(target+" option:eq(0)").attr("selected", "selected");
            $(target).trigger('change');
		}
		else
		{
			$(target).each(function(){
				$(target).removeAttr("disabled");
			});
		}
		return true;
	};

	// private function to do relational comparison of controllerValue and disablingVal against optDisablingOperator
	// if optDisableTarget is TRUE
	function returnComparisonResult(controllerValue,disablingVal,optDisablingOperator)
	{
		var comparisonResult;
		switch(optDisablingOperator)
		{
			case '==':
				if (controllerValue == disablingVal)
				{
					comparisonResult = true;
				}
				break;
			case '!=':
				if (controllerValue != disablingVal)
				{
					comparisonResult = true;
				}
				break;
			case '>':
				if (controllerValue > disablingVal)
				{
					comparisonResult = true;
				}
				break;
			case '<':
				if (controllerValue < disablingVal)
				{
					comparisonResult = true;
				}
				break;
			case '>=':
				if (controllerValue >= disablingVal)
				{
					comparisonResult = true;
				}
				break;
			case '<=':
				if (controllerValue <= disablingVal)
				{
					comparisonResult = true;
				}
				break;
			default:
				comparisonResult = false;
		}
		return comparisonResult;
	}

	// private function to filter the target element based on the value
	// of the controller control
	function filterTarget(target,filterServer){
        if (filterServer != '')
        {
            $(target).html();
            $(target).load(filterServer);
        }
	};

	// plugin defaults - added as a property on plugin function
	$.fn.filter.defaults = {
		bindEvents: 'change',
		controllerId: '',
		disablingVal: '%',
		disablingOperator: '==',
		disableTarget: false,
		filterTarget: false,
		filterServer: 'filter.php'
	}
})(jQuery);