/*
 * GenderLocation - jQuery Plugin
 *
 * Progressive Computing LLC.
 * jQuery 1.4.x
 *
 * Date: August 31, 2010
 * 
 * Impliments controls for choosing a gender experience, zip code
 * or area code or city and state. Can be used to find a local number.
 */
(function($) {

	$.fn.GenderLocation = function(options) {
	
		/**
		 * @options
		 * @experienceImages {Object}A defined list of URL's to experience images
		 */
		$.fn.GenderLocation.defaultOptions = {
			experienceImages:{mf:'', mm:'', fm:'', ff:''},
			genderSelectSelector:'.genderSettings select',
			userGenderSelector:'.genderSettings .userGender',
			lookingGenderSelector:'.genderSettings .lookingGender',
			zipCodeSelector:'.zipCodeTxt',
			areaCodeSelector:'.areaCodeTxt',
			stateSelectSelector:'.stateListSelect',
			citySelectSelector:'.cityListSelect',
			experienceImageSelector:'.imgExperience',
			findNumberSelector:null
		}

		// A member variable used to store the container element.
		var m_container = this,
		
			m_megaTele = 't',

			// If an options object is sent at runtime merge default options with user specified
			// options into a single options object. If none specified use default options.
			m_options = (typeof(options) == 'object') ?
			$.extend({}, $.fn.GenderLocation.defaultOptions, options) :
			$.fn.GenderLocation.defaultOptions;

		// Add event for gender options selected
		$(m_options.genderSelectSelector, m_container).change(genderChange);

        function keyCheck(event){

			var keyCode = (event.which) ? event.which : event.keyCode;
			
            if (keyCode > 31 && (keyCode < 48 || keyCode > 57))
            {
                // Non-Numeric KeyPress
                return false;
            }
            else if(keyCode == 13)
            {
                // Enter Key
                document.getElementById('btnFindNumber').click();
                return false;
            }
            return true;
        }
        
        
		// Add constraints for numbers only
		$(m_options.zipCodeSelector, m_container).bind('keypress', keyCheck);
		$(m_options.areaCodeSelector, m_container).bind('keypress',keyCheck);

        
		// Preload dynamic displayed images
		$.preLoadImg(
			m_options.experienceImages.mf,
			m_options.experienceImages.mm,
			m_options.experienceImages.fm,
			m_options.experienceImages.ff
		);

		// Setup Click Event For Find Number Button
		if(m_options.findNumberSelector != null){
			$(m_options.findNumberSelector, m_container).click(getNumberList);
		}

		// Request state list
		initAjax('/phone-dating/StateList.aspx', {callback:stateListLoaded});
		
		function genderChange(){

			var experience = $(m_options.userGenderSelector, m_container).val() + $(m_options.lookingGenderSelector, m_container).val(),
				imgSrc;

			switch(experience){
				case "MaleFemale":
					imgSrc = m_options.experienceImages.mf;
					m_megaTele = 't';
					break;
				case "MaleMale":
					imgSrc = m_options.experienceImages.mm;
					m_megaTele = 'm';
					break;
				case "FemaleMale":
					imgSrc = m_options.experienceImages.fm;
					m_megaTele = 't';
					break;
				case "FemaleFemale":
					imgSrc = m_options.experienceImages.ff;
					m_megaTele = 'm';
					break;
			}

			$(m_options.experienceImageSelector, m_container).attr('src', imgSrc);		
		}
		
		function stateListLoaded(p_result, p_data){
		
			var stateList = p_data.getElementsByTagName('Table'),
				stateListLength = stateList.length,
				stateListElement = $(m_options.stateSelectSelector, m_container).get(0),
				optionItem,
				i;

			var cityListSelect = $(m_options.citySelectSelector, m_container).get(0);
			cityListSelect.options.length = 0;
			cityListSelect.options[0] = new Option("Pick A State First","null");

			// Add a single option for alert to choose
			stateListElement.options[0] = new Option("--","null");

			// Add options returned
			for(i = 0; i < stateListLength; i++){			
				optionItem = $(stateList[i]).find('StateAbbr').text();
				stateListElement.options[(i+1)] = new Option(optionItem, optionItem);
			}

			// Add event for option selected
			$(m_options.stateSelectSelector, m_container).change(onStateChange);
		}

		function onStateChange(){

			// Setup City Loaded Callback
			var cityListLoaded = function(p_result, p_data){
				var cityList = p_data.getElementsByTagName('Table'),
					cityListLength = cityList.length,
					cityListElement = $(m_options.citySelectSelector, m_container).get(0),
					optionItem,
					i;

				// Add a single option for alert to choose
				cityListElement.options[0] = new Option("--","null");

				// Add options returned
				for(i = 0; i < cityListLength; i++){			
					optionItem = $(cityList[i]).find('City').text();
					cityListElement.options[(i+1)] = new Option(optionItem, optionItem);
				}
			}

			// Request state list
			initAjax('/phone-dating/CityList.aspx?state=' + $(m_options.stateSelectSelector, m_container).val(), {callback:cityListLoaded});	
		}

		// AJAX call to request data
		function initAjax(p_href, p_options){
			var defaults = { data: null, method: 'GET', callback: null },
				settings = $.extend({}, defaults, p_options);

			$.ajax({
				url: p_href,
				data: settings.data,
				type: settings.method,
				success: function (data, textStatus) {
					if (settings.callback) settings.callback(true, data);
				},
				error: function (data) {
					if (settings.callback) settings.callback(false, null);
				}
			});				
		}

		function getNumberList(){
			var experience = $(m_options.userGenderSelector, m_container).val() + $(m_options.lookingGenderSelector, m_container).val()
            var megaTele = 't';
            
			switch(experience){
				case "MaleFemale":
					megaTele = 't';
					break;
				case "MaleMale":
					megaTele = 'm';
					break;
				case "FemaleMale":
					megaTele = 't';
					break;
				case "FemaleFemale":
					megaTele = 'm';
					break;
			}
			
			
         
			var zipCode = $(m_options.zipCodeSelector, m_container).val(),
				areaCode = $(m_options.areaCodeSelector, m_container).val(),
				stateList = $(m_options.stateSelectSelector, m_container).val(),
				cityList = $(m_options.citySelectSelector, m_container).val()

				if(stateList == 'null' || cityList == 'null'){
					stateList = cityList = null;
				}

			if(zipCode.length == 5 || areaCode.length == 3 || stateList != null){
				var queryData = 'zipcode=' + zipCode;
					queryData += '&areacode=' + areaCode;
					queryData += '&city=' + cityList;
					queryData += '&state=' + stateList;
					queryData += '&megatele=' + megaTele;

				document.location.href = '/phone-dating/local-number-list.aspx?' + queryData;
                return false;
			}else{
				alert('Please enter a zip or area code or a state and city');
			}
		}

	}
})(jQuery);
