/*
* AUSU jQuery-Ajax Auto Suggest
* http://www.oslund.ca/
*
* @version
* 1.0.1 (Jan 28 2011)
*
* @copyright
* Copyright (C) 2011 Isaac Oslund
* Dual licensed under the MIT and GPL licenses.
* http://www.opensource.org/licenses/mit-license.php
* http://www.opensource.org/licenses/gpl-license.php
*/

(function(jQuery){
    jQuery.fn.autosugguest = function(config) {

        var defaults = {
			className: 'autosuggest',
			methodType: 'POST',
			addParams: null,
			rtnIDs: true,
			dataFile: 'data.php',
			minChars:  1,
			fadeTime:  0
          };
    
        var config = jQuery.extend(defaults, config);

        config.addParams = (config.addParams != '') ? '&' + config.addParams : '';

        jQuery('<div class="ausu-suggestionsBox"><img src="/img/arrow.png" /><ul></ul></div>').appendTo('.' + config.className);
        jQuery(".ausu-suggestionsBox > ul li").live('mouseover', function()
        {	
			var sel = jQuery(this).parent().find("li[class='selected']").removeClass('selected');
			jQuery(this).addClass('selected');
		});
		
		jQuery("." + config.className + " > input").keyup(function(event)
        {
           var fieldParent = jQuery(this).parents('div.' + config.className);

           if (event.which != 39 && event.which != 37 && event.which != 38 && event.which != 40 && event.which != 13 && event.which != 9 ) {
                
                fieldVal = fieldParent.find('input:eq(0)').val();
                suggest(fieldVal,this.id);
           } else {
             
             var fieldChild  = fieldParent.find('.ausu-suggestionsBox > ul');

             switch (event.which)
                {
                 case 40: { keyEvent(fieldChild,'next');break; }
                 case 38: { keyEvent(fieldChild,'prev');break; }
                 case 13:
                 {
                        if (config.rtnIDs == true) {
							fieldParent.children('input:eq(0)').val(jQuery("li[class='selected']").attr("id"));
						}
						else {
	                        fieldParent.children('input:eq(0)').val(jQuery("li[class='selected'] a").text());
						}
                        fieldParent.children('div.ausu-suggestionsBox').hide();
                        return false;
                        break;
                 }
                 case 9:
                 {
                        offFocus(this); jQuery("li").removeClass("selected");
                        break;
                 }
             }
         }
        });

		jQuery("." + config.className).bind("keypress", function(event) {
		  if (event.keyCode == 13) return false;
		});

		jQuery("." + config.className + " > input").live("blur", function(){ offFocus(this); jQuery("li").removeClass("selected"); });
    
        function suggest(dataInput, id)
        {
            if(dataInput.length < config.minChars) {
                    jQuery('#'+id).parent('.' + config.className).children('div.ausu-suggestionsBox').fadeOut();
            } else {
            jQuery('#' + id + ":eq(0)").addClass('ausu-load');
                jQuery.ajax({
                   type: config.methodType,
                    url: config.dataFile,
               dataType: "html",
                   data: "data=" + dataInput + "&id=" + id + config.addParams,
                success: function(data){
                    if(data.length >0)
                    {
                        jQuery('#'+id).parent('div.' + config.className).children('div.ausu-suggestionsBox').fadeIn();
                        jQuery('#'+id).parent('div.' + config.className).find('.ausu-suggestionsBox > ul').html(data);
                        jQuery('#'+ id + ":eq(0)").removeClass('ausu-load');
                    }
                    else
                    {
                        jQuery('#' + id + ":eq(0)").removeClass('ausu-load');
                    }
                }
              });
            }
        }

		function keyEvent (fieldChild,action)
		{
			yx = 0;
			fieldChild.find("li").each(function(){
				if(jQuery(this).attr("class") == "selected")
                yx = 1;
            });
            
			if(yx == 1)
            {
				var sel = fieldChild.find("li[class='selected']");
				(action=='next') ? sel.next().addClass("selected") : sel.prev().addClass("selected");
				sel.removeClass("selected");
            }
            else
			{
				(action=='next') ? fieldChild.find("li:first").addClass("selected") : fieldChild.find("li:last").addClass("selected");
			}
        }

        function offFocus(fieldChild)
        {
            var fieldParent =  jQuery(fieldChild).parents('div.' + config.className);
            fieldParent.children('div.ausu-suggestionsBox').delay(config.fadeTime).fadeOut();
        }

        jQuery(".ausu-suggestionsBox > ul li").live("click", function()
        {
            var fieldParent = jQuery(this).parents('div.' + config.className);
            if (config.rtnIDs==true) {
				fieldParent.children('input:eq(0)').val(jQuery(this).attr("id"));
			}
			else {
	            fieldParent.children('input:eq(0)').val(jQuery(this).text());
			}
            fieldParent.children('div.ausu-suggestionsBox').hide();
        });

    };
})(jQuery);
