/**
*		Suggest Control. 
*
* Copyright (c) 2009 Hermes Gadella
* Licensed under the GPL licenses.
* http://www.gnu.org/licenses/gpl.txt
**/

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}


String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}

String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}


 
$$ = $.fn.Suggest = function($options) {
		//Valores por defecto
		var $defaults = {
			main_control : '#txt_Container',
			info_layer : '#lyr_Suggest',
			list_type: 'list',
			suggest_file: 'suggest.asp',
			min_chars: 2, 
			bind_object: '',
			bind_attr: '',
			bind_exclude: '',
			enable_focus: '',
			original_value: ''
		};
	
		//Sets para las opcion
		var $opts = $.extend($defaults, $options);
		var currentUrl = '';
		var currentBindValue = '';
		var currentAttrValue = '';
		var currentSelection = -1;
		var do_Search = true;
		
		var main_obj = this;
		
		$(this).mousedown(function(){
			if ($opts.enable_focus == 'true')
			{
				//alert("hola");
				search(this);
			}
		});
		
		$(this).keyup(function(e){
			switch(e.keyCode) { 
				// User pressed "up" arrow
				case 38:
					navigate('up');
				break;
				// User pressed "down" arrow
				case 40:
					navigate('down');
				break;
				// User pressed "enter"
				case 13:
					if(currentUrl != '') {
						var str = currentUrl;
						str = stripHtml(str);						
						
						$(this).val(str.ltrim().rtrim());
						
						$($opts.info_layer).hide();
					}
					
					if(currentAttrValue != '' && currentBindValue != '')
					{
						//alert(currentAttrValue + " - " + currentBindValue);
						$(document).find(currentAttrValue).val(currentBindValue);
					}
				break;
			}			
		});
		
		$(this).keydown(function(e){
			switch(e.keyCode) { 
				case 9:
					if(currentUrl != '') {
						var str = currentUrl;
						str = stripHtml(str);						
						
						$(this).val(str.ltrim().rtrim());
						
						$($opts.info_layer).hide();
					}
					
					if(currentAttrValue != '' && currentBindValue != '')
					{
						//alert(currentAttrValue + " - " + currentBindValue);
						$(document).find(currentAttrValue).val(currentBindValue);
					}
					do_Search = true;
				break;
			}			
		});		
		
		$(this).keyup(function(e){
			//alert(e.keyCode);
			switch(e.keyCode) { 
				//User pressed "up" arrow
				case 38:
					break;
				//User pressed "right" arrow
				case 39:
					break;	
				//User pressed "left" arrow
				case 37:
					break;											
				//User pressed "down" arrow
				case 40:
					break;
				//User pressed "enter"
				case 13:
					break;
				//User pressed "shift"
				case 16:
					break;
				//User pressed "tab"
				case 9:
					break;					
				//User pressed "alt"
				case 18:
					break;										
				//User pressed "ctrl"
				case 17:
					break;								
				//User pressed "esc"
				case 27:
					$(main_obj).val('');
					$($opts.info_layer).hide();
					break;					
				default:
				if(do_Search)
				{
						search(this);
				}			
				break;
			}	
		});
		
		$(document).click(function(){
			$($opts.info_layer).hide();
		});
		
		var search = (function(obj)
		{
				if ($(obj).val().length > $opts.min_chars)
				{
					var suggest = $(obj).val();
					
					if ($opts.original_value!='')
					{
						suggest=$opts.original_value;
					}
					
					var sURL;
					
					if ($opts.suggest_file.indexOf("?") > -1)
					{
						sURL = $opts.suggest_file+'&suggest=' + escape(suggest) + '&rqdTS='+fsTimeStamp();
					}
					else
					{
						sURL = $opts.suggest_file+'?suggest=' + escape(suggest) + '&rqdTS='+fsTimeStamp();
					}
					//return;
					//alert(escape(suggest));
					do_Search = false;
					
					$($opts.info_layer).load(sURL, function(response, status, xhr){
						if (response.trim() != "")
						{
							var eleOffset = $(main_obj).offset();
							$($opts.info_layer).css("position","absolute");
							$($opts.info_layer).css("z-index","1000");
							$($opts.info_layer).css("left",(eleOffset.left-5) + "px");
							$($opts.info_layer).css("top",eleOffset.top+$(main_obj).height() + "px");
							
							$($opts.info_layer).show();					
							$($opts.info_layer).html(response);
							
							
	
							$($opts.info_layer).find("a").click(function(menuitem){
								var str = $(this).html();
								str = stripHtml(str);
								
								$(main_obj).val(str.ltrim().rtrim());
								$($opts.info_layer).hide();
								
								if($opts.bind_object != '' && $opts.bind_attr != '')
								{
									var bnd_objects = $opts.bind_object.split(",");
									var bnd_attrs = $opts.bind_attr.split(",");
									
									for (var i = 0; i < bnd_objects.length; i++)
									{
										//alert(bnd_attrs[i] + " - " + bnd_objects[i]);
										if($(this).attr(bnd_attrs[i]) != "" && $(this).attr(bnd_attrs[i]) != null)
										{
											currentBindValue = $(this).attr(bnd_attrs[i]);
											currentAttrValue = bnd_objects[i];
											
											//alert(currentBindValue + " - " + currentAttrValue);
											$(document).find(currentAttrValue).val(currentBindValue);
										}
										else
										{
											$(document).find(bnd_objects[i]).val('');
										}
									}
								}
																					
								if(currentAttrValue != '' && currentBindValue != '')
								{
									$(document).find(currentAttrValue).val(currentBindValue);
								}
							});	
							
							navigate('down');	
						}	else {
							$($opts.info_layer).hide();		
						}	
					
						do_Search = true;	
						if ($opts.original_value=='')
						{						
							if(suggest != $(obj).val())
							{
								search(obj);
							}		
						}				
					});
				}else{
					$($opts.info_layer).hide();
					$($opts.info_layer).html('');
				}			
		});

		var stripHtml = (function(s){
	 		var strInputCode = s;

	 	 	strInputCode = strInputCode.replace(/&(lt|gt);/g, function (strMatch, p1){
	 		 	return (p1 == "lt")? "<" : ">";
	 		});

	 		var strTagStrippedText = strInputCode.replace(/<\/?[^>]+(>|$)/g, "");
	 		return strTagStrippedText.replace("&nbsp;","");		 		
		});
	
		var fsTimeStamp = (function(){
				var liTS = new Date();
				var lsTS = '';
				
				lsTS += liTS.getYear() 
				lsTS += (liTS.getMonth()+1); 
				lsTS += (liTS.getDay()+1);
				lsTS += (liTS.getHours()+1);
				lsTS += (liTS.getMinutes()+1);
				lsTS += (liTS.getSeconds()+1);
				
				return lsTS;			
		});
		
		var navigate = (function(direction){
			// Check if any of the menu items is selected
			if($($opts.info_layer + " ul li .itemhover").size() == 0) {
				currentSelection = -1;
			}
			
			if(direction == 'up' && currentSelection != -1) {
				if(currentSelection != 0) {
					currentSelection--;
				}
			} else if (direction == 'down') {
				if(currentSelection != $($opts.info_layer + " ul li").size() -1) {
					currentSelection++;
				}
			}
			setSelected(currentSelection);
		});
		
		var setSelected = (function(menuitem){
			$($opts.info_layer + " ul li a").removeClass("itemhover");
			$($opts.info_layer + " ul li a").eq(menuitem).addClass("itemhover");
			//currentUrl = $($opts.info_layer + " ul li a").eq(menuitem).html();			
			currentUrl = $($opts.info_layer + " ul li a").eq(menuitem).html();			
			
			if($opts.bind_object != '' && $opts.bind_attr != '')
			{
				var bnd_objects = $opts.bind_object.split(",");
				var bnd_attrs = $opts.bind_attr.split(",");
				
				for (var i = 0; i < bnd_objects.length; i++)
				{
					if($($opts.info_layer + " ul li a").eq(menuitem).attr(bnd_attrs[i]) != "" && $($opts.info_layer + " ul li a").eq(menuitem).attr(bnd_attrs[i]) != null)
					{
						currentBindValue = $($opts.info_layer + " ul li a").eq(menuitem).attr(bnd_attrs[i]);
						currentAttrValue = bnd_objects[i];
						//alert(currentAttrValue + " - " + currentBindValue);
						
						$(document).find(currentAttrValue).val(currentBindValue);
					}
					else
					{
						$(document).find(bnd_objects[i]).val('');
					}
				}
			}					
		});
		
 };

