﻿var CriteriaFormController = function() 
{
	var countrySelector = null;
	var distanceCheckbox = null;
	var distanceContainer = null;
	
	var options = {
		countriesWithZips: [],
		elements: {
			countrySelector: '',
			distanceCheckbox: '',
			distanceContainer: ''
		}
	};
	
	var initElements = function()
	{
		countrySelector = $(options.elements.countrySelector);
		distanceCheckbox = $(options.elements.distanceCheckbox);
		distanceContainer = $(options.elements.distanceContainer);
		
		$("select[multiple]").multiSelection({
			containerClass: 'criterion'
		});				
	};
	
	var initEventHandlers = function()
	{
		distanceCheckbox.click(syncCheckDistanceState);
		
		countrySelector.change(function()
		{
			distanceContainer.find('input:text').val('');
			distanceContainer.find('select option:first').attr('selected', 'selected');
			
			checkDistanceAvailability();
		});
	};
	
	var distanceFieldRequiredCondition = function(element)
	{		
        return selectedCountryHasZips() && distanceCheckbox.is(':checked');
	};
	
	var selectedCountryHasZips = function()   
	{		
		if (!options.countriesWithZips || options.countriesWithZips.constructor!=Array)
		{
			return false;
		}
		
		var countryId = parseInt(countrySelector.val());
		return $.inArray(countryId, options.countriesWithZips) > -1;
	};
	
	var checkDistanceAvailability = function()
	{		
		var distanceCheckIsAvailable = selectedCountryHasZips();
		setCheckDistanceBlockView(distanceCheckIsAvailable);
	};
	
	var setCheckDistanceBlockView = function(distanceIsAvailable)
	{
		if (distanceIsAvailable)
		{
			if ($.browser.msie)
			{
				distanceContainer.show('fast');
			}
			else
			{
				distanceContainer.slideDown('fast');		
			}	
		}
		else
		{
			if ($.browser.msie)
			{
				distanceContainer.hide('fast');
			}
			else
			{
				distanceContainer.slideUp('fast');		
			}	
		}
	};
	
	var syncCheckDistanceState = function()
	{
		if (distanceCheckbox.is(':checked'))
		{
			distanceCheckbox.nextAll().removeAttr('disabled');
		}
		else
		{
			distanceCheckbox.nextAll().attr('disabled', 'disabled');
		}
	};		
    	
	//**************************************
	return {
		init: function(config)
		{
			options = $.extend(true, options, config);
			
			initElements();
			initEventHandlers();								
					
			$('#spSearchForm').validate({
		        debug: false,
		        rules: {
		            "spSearchCriteria.Distance.Zip": {
		                required: distanceFieldRequiredCondition
		            }
		        }
		    });
			
			syncCheckDistanceState();
            checkDistanceAvailability();
		}
	}
};