
(function($){

	$.ns('App.autocomplete');

	var defaultParams = {
		delay: 10,
		minChars: 2,
		matchSubset: 1,
		matchContains: 1,
		cacheLength: 10,
		autoFill: true,
		selectFirst: true,
		formatItem: function(row){
			return row[0];
		},
		onItemSelect: function (li) {
			if(null == li) {
				alert("No match!");
				return false;
			}

			if(!!li.extra) {
				return li.extra[0];
			}
			else {
				return li.selectValue;
			}
		}
	};

	/**
	 * state params
	 */
	var state = {
		el: null, // jQuery
		id: 0,
		list: {},
		autocomplete: $.extend({}, defaultParams, {
			minChars: 1,
			onItemSelect: function(li) {
				state.id = defaultParams.onItemSelect.call(this, li);

				if (state.id) {
					county.el[0].autocompleter.setExtraParams({stateID: state.id});
					county.el.attr('readonly',false).val('').focus();
				}
			}
		}),
		click: function(){
			state.el.val('');
			county.el.val('').attr('readonly', true);
	        city.el.val('').attr('readonly', true);

	        county.id = 0;
	        city.id = 0;
	    }
	};

	/**
	 * county params
	 */
	var county = {
		el: null, // jQuery
		id: 0,
		url: '/search/county',
		autocomplete: $.extend({}, defaultParams, {
			onItemSelect: function(li) {
				county.id = defaultParams.onItemSelect.call(this, li);

				if (county.id) {
					city.el[0].autocompleter.setExtraParams({countyID: county.id, stateID: state.id});
					city.el.attr('readonly', false);
				}
			}
		}),
		click: function(){
	        county.el.val('');
	        city.el.val('').attr('readonly', true);
	        city.id = 0;
	    }
	};

	/**
	 * city params
	 */
	var city = {
		el: null, // jQuery
		id: 0,
		url: '/search/city',
		autocomplete: $.extend({}, defaultParams, {
			onItemSelect: function(li) {
				city.id = defaultParams.onItemSelect.call(this, li);
			}
		}),
        click: function(){
        	if ('' == city.el.val()) {
        		city.el.val('');
        	}
        },
        blur: function(){
            var val = city.el.val();
            if (!val.length) {
            	city.el.val('');
            }
        }
	};

	/**
	 * form params
	 */	
	var form = {
		el: null, // jQuery
		submit: function(){
	        if (0 < state.id && 0 < county.id) {
	            $('#cid').val(county.id);
	            $('#ci_id').val(city.id);

	            return true;
	        }

        	alert('Please fill the form!');
        	return false;
	    }
	};

	/**
	 * public methods
	 */
	var ac = {
		setStateList: function(list){
			state.list = list;
		},
		init: function(){
			state.el = $("#state");

			state.el.autocompleteArray(state.list, state.autocomplete)
					.click(state.click)
					.val('').attr('readonly', false);
			
			county.el = $("#county");
			county.el.autocomplete(county.url, county.autocomplete)
					 .click(county.click);

			city.el = $("#city");
			city.el.autocomplete(city.url, city.autocomplete)
				   .click(city.click)
				   .blur(city.blur);

			form.el = $('#getfile');
			form.el.submit(form.submit);

			$('#submiter').click(function(e){
				form.el.submit();
				return false;
			});
		}
	};

	App.autocomplete = ac;

})(jQuery);

