
;(function($){
	$.fn.autoComplete = function(css){
		this.each(function(){
			// Cache objects
			var $obj = $(this), 
				$input = $("input[type='text']", $obj), 
			//	$cnid = $("input[name='countryid']", $obj), 
				$ctid = $("input[name='searchbox']", $obj), 
				
				settings = {
					opt: -1,
					inputval: '',
					cityid:'',
					css: (css) ? css : 'non-404',
					ajax: $("input[name='href']", $obj).val()
				};
				

			// Run on keyup
			$input.keyup(function(e){
				var key = e.keyCode;
				if ((key > 47 && key < 91) || key == 8){
				   //call ajax
					settings.opt = -1;
					settings.inputval = $input.val();
					sendRequest(settings.inputval);
				}
				
				
				else if (key == 37 || key == 39){
					settings.opt = -1;
					$('ul', $obj).html('');
				}
				
				else if (key == 13){
				      settings.opt = -1;
					var val = $('ul li', $obj).removeClass(settings.css).eq(settings.opt).addClass(settings.css).attr('rel');
					
					 var value2 = $('ul li', $obj).eq(settings.opt).addClass(settings.css).attr('cityid');
						      $input.val(val);
					
							  $ctid.val(value2);
						   	$('ul', $obj).html('');
								$('ul',$obj).css("visibility", "hidden");
				}
				else if (key == 38){
					if (settings.opt >= 0){
						settings.opt--;
						var val = $('ul li', $obj).removeClass(settings.css).eq(settings.opt).addClass(settings.css).attr('rel');
						val = (settings.opt < 0) ? settings.inputval : val;
						if (val) $input.val(val);
						
						
						  var value2 = $('ul li', $obj).removeClass(settings.css).eq(settings.opt).addClass(settings.css).attr('cityid');		     				
						  value2 = (settings.opt < 0) ? settings.cityid : value2;
							if (value2) $ctid.val(value2);
			
                     		$input.val(val);
						$ctid.val(value2);
						
						
						
					}
				}
				
				else if (key == 40){
					if (settings.opt < $('ul li', $obj).length-1){
						settings.opt++;
						var val = $('ul li', $obj).removeClass(settings.css).eq(settings.opt).addClass(settings.css).attr('rel');
						if (val) $input.val(val);
						 var value2 = $('ul li', $obj).eq(settings.opt).addClass(settings.css).attr('cityid');
					            if (value2) $ctid.val(value2);
								
						      $input.val(val);
							 $ctid.val(value2);
					}
				}
			}).blur(function(){
				settings.opt = -1;
				$('ul', $obj).html('');
					$('ul',$obj).css("visibility", "hidden");
			});
	
			// Ajax Request
			var sendRequest = function(val){
				$.post(settings.ajax, {value: val}, function(json){
					// Clear the List
					$('ul', $obj).html('');
					$('ul',$obj).css("visibility", "visible");
					// Evaluate the return obj
					json = eval(json);
					// Show the list if there is a return
					if (json && json.length > 0){
						for (i in json){
						    json[i].cityname = base64_decode(json[i].cityname);
							json[i].countryname = base64_decode(json[i].countryname);
							$display = json[i].cityname + ", " +json[i].countryname;
							$rel = json[i].cityname + ", " +json[i].countryname;
							$('ul', $obj).append('<li rel="'+$rel+'" cntryid = "'+json[i].cntryid+'" cityid = "'+json[i].cityid+'">'+$display +'</li>');
						}
						// Start mouse actions after list is set
						mouseaction();
					}
				});
			}
	
			// Run Mouse Actions
			function mouseaction(){
				// List effects
				$('ul li', $obj).mouseover(function(){
					$('ul li', $obj).removeClass(settings.css);
				   $input.val( $(this).addClass(settings.css).attr('rel') );
					//$cnid.val( $(this).addClass(settings.css).attr('cntryid') );
					$ctid.val( $(this).addClass(settings.css).attr('cityid') );
			   }).click(function(){
			 	$('ul', $obj).html('');
					$('ul',$obj).css("visibility", "hidden");
				});
	
				// Return orignal val when not hovering
				$('ul', $obj).mouseout(function(){
					$input.val(settings.inputval);
					$ctid.val(settings.cityid);
				});
			}
		});
	};
})(jQuery);
 
 
 
 
 
 
 
 
function base64_decode( data ) {
   var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];
 
    if (!data) {
        return data;
    }
 
    data += '';
 
    do {  // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
 
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
 
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);
 
    dec = tmp_arr.join('');
    dec = utf8_decode(dec);
 
    return dec;
}



function utf8_decode ( str_data ) {
   
    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    
    str_data += '';
    
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
 
    return tmp_arr.join('');
} 