var $netz98 = $netz98 || {};
// namespace $netz98.Utils

jQuery.extend(true, $netz98, {
    Utils: function() {

    /**
     * Animated scrolling to a given id in the dom
     *
     * @param id string
     * @param speed string (optional)
     *
     * @return void
     */

        this.scrollToId = function(id, speed) {
            speed = (speed != undefined) ? speed : 'slow';
            if (jQuery(id).length > 0) {
                jQuery('html,body').animate({
                    scrollTop: jQuery(id).offset().top
                }, speed);
            }
        },

        /**
         * Creates autocompleter
         *
         * @param inputElement
         * @param resultListElement
         * @param url
         */
        this.autocomplete = function(inputElement, resultListElement, url) {

            this.hasResults = false;
            this.input = jQuery(inputElement);
            this.layer = jQuery(resultListElement);
            this.keycodes = {
                'backSpace': 8,
                'arrowUp': 38,
                'arrowDown': 40,
                'arrowLeft': 37,
                'arrowRight': 39,
                'enter': 13
            };

            // listContainer = resultListElement;

            this.init = function(inputElement, resultListElement, url) {
                var self = this;
                // alert(url);
                var _timer;

                this.input.keyup(function(event) {
                    if (!self.input.hasClass('tying')) {
                        self.input.addClass('typing');
                    }

                    if (event.keyCode == self.keycodes.enter) {
                        return self.moveSelection(event);
                    }

                    if (event.keyCode == self.keycodes.backSpace) {
                        if (self.input.val().length <= 3) {
                            self.hideLayer();
                        } else {
                            if (event.keyCode != self.keycodes.arrowUp && event.keyCode != self.keycodes.arrowDown && event.keyCode != self.keycodes.arrowLeft && event.keyCode != self.keycodes.arrowRight) {
                                clearTimeout(_timer);
                                _timer = setTimeout(function() {
                                    self.getResults(event);
                                }, 650);
                            }
                        }
                    } else {
                        if (self.input.val().length >= 3) {
                            if (event.keyCode != self.keycodes.arrowUp && event.keyCode != self.keycodes.arrowDown && event.keyCode != self.keycodes.arrowLeft && event.keyCode != self.keycodes.arrowRight || !self.hasResults) {
                                clearTimeout(_timer);
                                _timer = setTimeout(function() {
                                    self.getResults(event);
                                }, 650);
                            }

                            else if (event.keyCode == self.keycodes.arrowUp || event.keyCode == self.keycodes.arrowDown) {
                                self.moveSelection(event);
                                self.input.data('origin_query', self.input.val());
                            }
                        } else {
                            self.hideLayer();
                        }
                    }

                    self.markWords();
                });

                jQuery('body').click(function() {
                    self.hideLayer();
                });
                this.input.focus(function() {
                    self.toggleLayer();
                });
                this.input.click(function() {
                    return false;
                });
            /*
            this.input.live('paste', function(e) {
                self.searchOnPaste();
            });
            */
            };

            this.getResults = function() {
                var self = this;

                if (self.input.val().length >= 3) {
                    jQuery.get(url, {
                        'q': self.input.val()
                    },
                    function(data) {
                        if (data) {
                            self.hasResults = true;
                            self.layer.removeAttr('style').html(data);
                            self.showLayer();
                            self.markWords();
                        } else {
                            self.hasResults = false;
                            self.input.removeClass('typing');
                            self.layer.html('');
                            self.hideLayer();
                        }

                        if (jQuery(data).find('li').length >= 10) {
                            self.layer.css('height', 240);
                        }

                        if (jQuery(data).find('li').length < 10) {
                            self.layer.css('height', 'auto');
                        }
                    });
                } else {
                    self.input.removeClass('typing');
                }
            };

            this.showLayer = function() {
                //                var self = this;
                this.input.removeClass('typing');

                this.layer.show();

                this.layer.find('li').mouseenter(function() {
                    jQuery(this).addClass('selected');
                });
                this.layer.find('li').mouseleave(function() {
                    jQuery(this).removeClass('selected');
                });

            /*
            this.layer.find('li').click(function() {
                self.input.val(jQuery(this).attr('title'));
                jQuery('#search_mini_form').submit();
            });
            */
            };

            this.hideLayer = function() {
                this.input.removeClass('typing');
                this.layer.hide();
            };

            this.toggleLayer = function() {
                if (this.layer.html().length > 0) {
                    this.showLayer();
                }
            };

            this.moveSelection = function(event) {
                event.preventDefault();
                event.stopPropagation();

                var current = this.layer.find('li.selected');

                switch(event.keyCode) {
                    case this.keycodes.arrowUp:
                        if (current.length > 0) {
                            current.removeClass('selected');
                            var prev = current.prev('li');
                            if (prev.length > 0) {
                                prev.addClass('selected');
                                this.scroll();
                            }
                        //                            else
                        //                                this.layer.find('li.last').addClass('selected');

                        } else {
                            this.layer.find('li.last').addClass('selected');
                            this.scroll();
                        }
                        //                    this.update();
                        break;
                    case this.keycodes.arrowDown:
                        if (current.length > 0) {
                            current.removeClass('selected');

                            var next = current.next('li');
                            if (next.length > 0) {
                                next.addClass('selected');
                                this.scroll();
                            }
                        //                            else
                        //                                this.layer.find('li.first').addClass('selected');
                        } else {
                            this.layer.find('li.first').addClass('selected');
                            this.scroll();
                        }
                        //                    this.update();
                        break;
                    case this.keycodes.enter:
                        this.hideLayer();
                        current.click();
                        //                    jQuery('#search_mini_form').submit();
                        break;
                    default:
                        break;
                }

                this.input.removeClass('typing');
                return false;
            };

            this.update = function() {
                this.input.val(this.layer.find('li.selected').attr('title'));
            };

            this.scroll = function() {
                var diff = this.layer.height() - this.layer.find('li.selected').position().top;
                if (diff <= 0) {
                    this.layer.find('ul').css('top', diff - this.layer.find('li.selected').height());
                }
            };

            this.markWords = function(){
                var self = this;
                this.layer.find('li').each(function() {
                    var item = jQuery(this).find('span.match');
                    if (jQuery(this).attr('class')) {
                        var newText = item.text(); //toLowerCase().replace(self.input.val(), '<strong>' + self.input.val() + '</strong>');
                        item.html(newText);
                    }
                });
            };

            /*
             * initalize autocomplete
             */
            this.init(inputElement, resultListElement, url);
        }

        return this;
    }
});

