(function( $ ){

  $.fn.locationList = function(options) {

	  var settings = {
    	      'country_field'			:	'#country',
    	      'location_field'			:	'#location',
    	      'location_label'			:	'#location_label',
			  'initial_status'			:	null,
			  'location_display'		:	null,
			  'status_display'			:	null,
			  'verify_ok'				:	null,
			  'verify_fail'				:	null
    	    };
	  
      if (options) { 
          $.extend( settings, options );
        }
	  
	  countryObj = $(settings.country_field);
	  locationObj  = $(settings.location_field);
	  
	  if(typeof settings.location_label != 'function')
		  locationLblObj  = $(settings.location_label);
	  locationIcnObj  = $(settings.location_status_icon);
	  
	  if ( typeof settings.status_display == 'undefined' )
		  locationStatusDisplayObj = null;
	  else
		  locationStatusDisplayObj = $(settings.status_display);
	  
	  if ( typeof settings.location_display == 'undefined' )
		  locationDisplayObj = null;
	  else
		  locationDisplayObj = $(settings.location_display);
	  
	  last_selection = "";
	  
//	  if(countryObj.val() == '0')
//	  {
//	  	locationIcnObj.hide();
//		locationObj.hide();
//		locationLblObj.hide();
//	  }else if(countryObj.val() != last_selection))
//	  {
//		locationIcnObj.hide();
//		locationObj.val("");
//	  }

	  
	  country_function = function() {

		if(countryObj.val() != "" && countryObj.val() != "0")
		{
			if(last_selection != "" && last_selection != countryObj.val())
			{
				locationObj.val("");
				set_display_status('searching');
			}else
				last_selection = countryObj.val();
			$.ajax(
				{
					url: "/includes/ajax_location_list.php",
					data: {
							country: countryObj.val(),    //Pass the email value
							type: "get_country_data",
							format: "json"
						},       
					type: "POST",  // a jQuery ajax POST transmits in querystring format in utf-8
					dataType: "json",   //return data in json format                                                                                                                                   
					success: function( data )
					{
							set_display_status('opening');
							if(data.location_type_name == "")
								data.location_type_name = 'City';
							if(typeof settings.location_label == 'function')
							{
								//not implemented or tested yet
								settings.location_label(data.location_type_name);
							}else{
								locationLblObj.html(data.location_type_name + ":");
								locationObj.show();
							}
							
							
					}

					
				});
		} 
	}
	  
	  
	  default_verify_ok_callback = function(data) {
		  if ( typeof locationDisplayObj != "undefined" ) {
				location_arr = [];
				if ( data.city )
					location_arr.push(data.city);
				if ( data.region )
					location_arr.push(data.region);
				location_string = location_arr.join(', ');
				if ( locationDisplayObj.is("input") )
					locationDisplayObj.val(location_string);
				else
					locationDisplayObj.html(location_string);
		  }
		  set_display_status('verified');
		  
		  if ( typeof settings.verify_ok == 'function' ) {
			  settings.verify_ok(data);
		}
	  }
	  
	  default_verify_fail_callback = function(data) {
		  if ( typeof locationDisplayObj != "undefined" ) {
				if ( locationDisplayObj.is("input") )
					locationDisplayObj.val('');
				else
					locationDisplayObj.html('');
		  }
		  set_display_status('unverified');
		  if ( typeof settings.verify_fail == 'function' )
			  settings.verify_fail(data);
	  }
	  
	 verify_function = function(){
		 	if(locationObj.val() == '') return;
			jQuery.ajax({
				url: "/includes/ajax_location_list.php",
				data: { type: "verify_location", response_type: "long", country: countryObj.val(), location: locationObj.val(), format: 'json' },
				type: "POST",
				dataType: "json",
				success: function(data, textStatus, jqXHR){
					if(jQuery.trim(data.result) == 'verified') {
						default_verify_ok_callback(data);
					} else {
						default_verify_fail_callback(data);
					}
				}
			});
		}
	
	  countryObj.bind('change', country_function); //country listener ends here
	  
	  locationObj.bind('blur', verify_function);
	  
      locationObj.autocomplete
      ({
          source: function( request, response )
          {                     
              $.ajax(
              {
                  url: "/includes/ajax_location_list.php",
                  data: {
                          term: request.term,
                          country: countryObj.val(),    //Pass the selected country to php
                          type: "get_suggestions_json"
                        },       
                  type: "POST",  // a jQuery ajax POST transmits in querystring format in utf-8
                  dataType: "json",   //return data in json format                                                                                                                                   
                  success: function( data )
                  {
                      response( $.map( data, function( item )
                      {
                          return{
                                  label: item.name,
                                  value: item.value                             
                                 }
                      }));
                  }

                  
              });               
          },
      select: function( event, ui )
        {
        	if( ui.item.value.search(/\(.+\)/) != -1 ) {
	            newvalue = ui.item.value.replace(/^[^(]+\(/, '');
	           	newvalue = newvalue.replace(')', '');
	           	ui.item.value = newvalue;
			}
        },
		close: function(event, ui) {
			verify_function();
		},
		search: function(event, ui) {
			set_display_status('searching');
		},
		open: function(event, ui) {
			set_display_status('opening');
		},
          minLength: 4
      });
	  
	set_display_status = function(status) {
		switch ( status ) {
			case 'opening':
				if ( locationIcnObj ) 
					locationIcnObj.attr({ src: settings.location_blank_icon });
				if ( typeof locationStatusDisplayObj != "undefined" ) {
					locationStatusDisplayObj.html('');
					locationStatusDisplayObj.css('color', 'black');
				}
				break;
			case 'searching':
				if ( locationIcnObj ) 
					locationIcnObj.attr({ src: settings.location_search_icon });
				if ( typeof locationStatusDisplayObj != "undefined" ) {
					locationStatusDisplayObj.html('Verifying...');
					locationStatusDisplayObj.css('color', 'blue');
				}
				break;
			case 'verified':
				if ( locationIcnObj ) 
					locationIcnObj.attr({ src: settings.location_success_icon });
				if ( typeof locationStatusDisplayObj != "undefined" ) {
					locationStatusDisplayObj.html('Verified');
					locationStatusDisplayObj.css('color', 'green');
				}
				break;
			case 'unverified':
				if ( locationIcnObj ) 
					locationIcnObj.attr({ src: settings.location_error_icon });
				if ( typeof locationStatusDisplayObj != "undefined" ) {
					locationStatusDisplayObj.html('Unverified');
					locationStatusDisplayObj.css('color', 'red');
				}
				break;
			
		}
	};
	
	if ( settings.initial_status ) {
		set_display_status(settings.initial_status);
	} else {
		country_function();
	}
  };
  
})( jQuery );
