/**
* innerFilterComplete: Je plugin pro filtrovani hodnot v dropdownlistu.  
*
* 
* Version 1.0.1: 2010-06-23 First public version
* Author: Ruodlf Kanak (rudolfkanak@gmail.com)
*/

(function($) {

    $.fn.innerFilterComplete = function(options) {
        var $input = $(this);
        var i = i + 1;
        // Globals variables
        var defaultMaxCountKeyPress = 3;
        var optionsArray = [];

        var KEY = {
            UP: 38,
            DOWN: 40,
            DEL: 46,
            TAB: 9,
            RETURN: 13,
            ESC: 27,
            PAGEUP: 33,
            PAGEDOWN: 34,
            BACKSPACE: 8
        };

        var settings = $.extend({

    }, options);

    runinnerFilterCompleteByPress = (function(event) {
        if ($input.val().length >= settings.maxCountKeyPress) {
            var name = $input;

            if(event != null && event.keyCode != null)
            {
                switch (event.keyCode) {
                    case KEY.BACKSPACE:
                        innerFilterComplete(jQuery.trim($input.val()), optionsArray[name]);
                        break;
                    default:
                        innerFilterComplete(jQuery.trim($input.val()), optionsArray[name]);
                        break;
                }
            }
            else
            {
                innerFilterComplete(jQuery.trim($input.val()), optionsArray[name]);
            }
        }
    }),

    /**
    * Metoda nacte obsah select listu do objectu aby se dalo
    * s nim pozdeji pracovat.
    */
		initialize = (function() {
		    var name = $input;
		    
		            var array = new Array();
		            try {
		                $(settings.dropDownList + " option").each(function(index, obj) {
		                    var matchVaule = ({
		                        selectListId: settings.dropDownList,
		                        optionText: jQuery(obj).attr('title').toUpperCase(),
		                        optionAttr: jQuery(obj),
		                        optionLength: jQuery(obj).attr('title').length,
		                        optionPriority: 0
		                    });
		                    array[index] = matchVaule;
		                });
		            }
		            catch (ex) {
		                $.log.error('V metode autoRuninnerFilterComplete doslo k chybe: ', ex.message);
		            }

		            optionsArray[name] = array;
		    
		})(),

    // If is events ctrl+v so run validate
		runinnerFilterCompleteByPaste = (function(e) {
		    if ($input.val().length >= settings.maxCountKeyPress) {
		        var name = $input;
		        innerFilterComplete(jQuery.trim($input.val()), optionsArray[name]);
		    }
		}),

    /**
    * Metoda prida option do selectu
    * 
    * @param {Object} selectListId - id attridubu select listu
    * @param {Object} optionAttr - puvodni hodnota select listu
    */
		addMatchOptionToSelectList = (function(selectListId, optionAttr) {
		    $(selectListId).append(optionAttr);
		}),

		addAllIntoSelectList = (function(optionArray) {
		    if(optionArray[0] != null && optionArray[0].selectListId != null)
		        {
		        $(optionArray[0].selectListId).empty();
		        for (var i = 0; i < optionArray.length; i++) {
		            $(optionArray[0].selectListId).append(optionArray[i].optionAttr);
		        }
		    }
		}),

    /***
    * Metoda prohledava pole slect listu a podle algoritmu vyhledava schodu
    * @param {Object} letters - hodnoty z inputu
    * @param {Object} optionArray - pole objectu
    */
		innerFilterComplete = (function(letters, optionArray) {
		    // Vynuluje selectList
		    if(optionArray[0] != null && optionArray[0].selectListId != null)
		    {
		        $(optionArray[0].selectListId).empty();
		    }

		    if (letters.length > 0) {
		        for (var i = 0; i < optionArray.length; i++) {
		            var flag = true;
		            /*for (var y = 0; y < letters.length; y++) {
		                if (optionArray[i].optionText.charAt(y) != letters.charAt(y).toUpperCase()) {
		                    flag = false;
		                }
		            }*/
		            var regex = new RegExp(letters.replace(".", "\\."), "i");
		            
		            if (optionArray[i].optionText.search(regex) == -1)
		            {
		                flag = false;
		            }

		            if (flag) {
		                addMatchOptionToSelectList(optionArray[i].selectListId, optionArray[i].optionAttr);
		            }
		        }
		    } else {
		        //Kdyz je letters empty tak vypisu vsechno
		        addAllIntoSelectList(optionArray);
		    }
		    // JH - resi problem v kompatibilnim zobrazeni IE8
		    $(settings.dropDownList).width($input.width());
		}),

		$input
		.unbind('.valFilter')
		.bind('keyup.valFilter', runinnerFilterCompleteByPress)
        .bind('keypress.valFilter', runinnerFilterCompleteByPress)
		.bind('paste.valFilter', runinnerFilterCompleteByPaste); // Validate for ctrl+v

		runinnerFilterCompleteByPress();

    return this;
};

})(jQuery);
