$.firmSearch = {
    _lastQuery: 'this is last query',
    _stopTimer: null,
    _firmList: null,
    _active: -1,
    _firmArray: Array(),
    _jsonFirms: null,
    getLastQuery: function () {
        return this._lastQuery;
    },
    setLastQuery: function (q) {
        return this._lastQuery = q;
    },
    removeList: function () {
        if (this._firmList) {
            this._firmList.remove();
            this._firmList = null;
        }
    },
    removeList2: function () {
        if (this._firmList) {
            this._firmList.empty();
        }
    },
    createList: function (holder) {
        if (!this._firmList) {
            this._firmList = $('<div class="firmSearchList"></div>');
            this._firmList.css({
                margin: '0',
                padding: '0',
                position: 'absolute',
                zIndex: '10000',
                background: '#FFF'
            });
            //position and width
            if (holder) {
                var holderPos = holder.offset({
                    margin: true,
                    padding: false,
                    border: false
                });
                this._firmList.css({
                    width: (holder.outerWidth()) + 'px',
                    height: 'auto',
                    top: (holderPos.top + holder.outerHeight()) + 'px',
                    left: (holderPos.left) + 'px'
                });
            }
            $(document.body).append(this._firmList);
            this._firmList.bgiframe({
                width: this._firmList.width(),
                height:this._firmList.height()
            });
            //odstranit list ked sa klikne mimo
            this._firmList.mouseup(function () {
                return false;
            });
            $(document).one('mouseup',function () {
                $.firmSearch.removeList();
            });
        }
    },
    createList2: function (holder) {
        if (!this._firmList) {
            this._firmList = $('#similarFirm');
            this._firmList.empty();
        }
        else {
            this._firmList = $('#similarFirm');
            this._firmList.empty();
        }
    },
    _showError: function (msg) {
        this._createListObject('error').text(msg);
    },
    _createListObject: function (clsnm) {
        if (typeof(clsnm) == 'undefined') {
            clsnm = 'firmListEntry';
        }
        var listObject = $('<div class="' + clsnm + '"></div>');
        listObject.hover(function () {
            $(this).addClass(clsnm + 'Hover');
        },function () {
            $(this).removeClass(clsnm + 'Hover');
        });
        
        listObject.appendTo(this._firmList);
        this._firmArray.push(listObject);
        return listObject;
        
    },
    getFirms: function (q,params) {
        var self = this;
        if (!this.isTimerRunnig()) {
            this.startTimer();
            $.getJSON(Router('joblife/firms/search-json'),{
                q: q,
                limit: params.limit,
                registered: params.registered,
                registration: typeof(params.registration) != 'undefined' ? params.registration : 1
            },function (jsonList) {
                self._firmList.empty();
                if (jsonList.error) {
                    self._showError(jsonList.error);
                } else {
                    self._jsonFirms = jsonList.firms;
                    self._showFirms(jsonList.firms,params);
                    self._firmList.bgiframe({
                        width: self._firmList.width(),
                        height:self._firmList.height()
                    });
                }
            });
        }
    },
    getFirms2: function (q,params) {
        var self = this;
        if (!this.isTimerRunnig()) {
            this.startTimer();
            $.getJSON(Router('joblife/firms/search-json'),{
                q: q,
                limit: params.limit,
                registered: params.registered
            },function (jsonList) {
                self._firmList.empty();
                if (jsonList.error) {
                    self._showError(jsonList.error);
                } else {
                    self._showFirms2(jsonList.firms,params);
                    
                }
            });
        }
    },
    _showFirms: function (firms,params) {
        var firm;
        var firmObj = [];
        var i;
        var self = this;
        if (firms.length) {
            this._firmList.show();
            $.each(firms,function (idx,firmObj) {
                firm = self._createListObject();
                firm.text(firmObj.name);
                firm.attr('rel',firmObj.id);
                firm.click(function () {
                    $.firmSearch.removeList();
                    if (typeof(params.onSelect) == 'function') {
                        params.onSelect(params._holder,firmObj);
                    }
                });
            });
        } else {
            this._firmList.hide();
        }
    },
    _showFirms2: function (firms,params) {
        var firm;
        var firmObj = [];
        var i;
        var self = this;
        if (firms.length) {
            // this._firmList.show();
            $.each(firms,function (idx,firmObj) {
                firm = self._createListObject();
                firm.text(firmObj.name);
                firm.attr('rel',firmObj.id);
                firm.click(function () {
                    $.firmSearch.removeList2();
                    if (typeof(params.onSelect) == 'function') {
                        params.onSelect(params._holder,firmObj);
                    }
                });
            });
        } else {
            // this._firmList.hide();
        }
    },
    resetTimer: function () {
        this._stopTimer = null;
    },
    isTimerRunnig: function () {
        return this._stopTimer;
    },
    startTimer: function () {
        var self = this;
        this._stopTimer = window.setTimeout(function () {
            self.resetTimer();
        },250);
    },
    moveSelect: function (step) {
        clsnm = 'firmListEntry';
		this._active += step;
        
		if (this._active < 0) {
			this._active = 0;
		} else if (this._active >= this._firmArray.length) {
			this._active = this._firmArray.length - 1;
		}
        
		$('.firmListEntryHover').removeClass(clsnm + 'Hover');
        
		$(this._firmArray[this._active]).addClass(clsnm + 'Hover');
    },
    selectCurrent: function (params) {
        $.firmSearch.removeList();
        var self = this;
        
        if (typeof(params.onSelect) == 'function') {
            setTimeout(function() { 
                params.onSelect(params._holder,self._jsonFirms[self._active]);
            }, 1);
        }
    }
};
$.fn.firmSearch = function (params) {
    params = $.extend({
        _holder: this,
        // onselect = fumkcia ktora sa zavola, ked sa klikne na firmu function (holder,firma)
        onSelect: null,
        limit: 5,
        registered: 0
    },params);
    //this - jquery objekt na ktore sa to vztahuje
    var self = this;
    
    self.attr("autocomplete", "off");
    
    //pridame udalosti
    this.keyup(function(e) {
		switch(e.keyCode) {
			case 38: // up
				e.preventDefault();
				$.firmSearch.moveSelect(-1);
				break;
			case 40: // down
				e.preventDefault();
				$.firmSearch.moveSelect(1);
				break;
			case 13: // return
                e.preventDefault();
                $.firmSearch.selectCurrent(params);
				break;
			default:
				q = self.val();
                if (q.length >= 3 && $.firmSearch.getLastQuery() != q) {
                    $.firmSearch._jsonFirms = null;
                    $.firmSearch._firmArray.length = null;
                    $.firmSearch._firmArray = Array();
                    $.firmSearch._active = -1;
                    $.firmSearch.createList(self);
                    $.firmSearch.getFirms(q,params);
                    $.firmSearch.setLastQuery(q);
                }
				break;
		}
	});
    // this.keyup(function () {
    //     q = self.val();
    //     if (q.length >= 3 && $.firmSearch.getLastQuery() != q) {
    //         $.firmSearch.createList(self);
    //         $.firmSearch.getFirms(q,params);
    //         $.firmSearch.setLastQuery(q);
    //     }
    // });
    return this;
}
$.fn.similarFirmSearch = function (params) {
    params = $.extend({
        _holder: null,
        // onselect = fumkcia ktora sa zavola, ked sa klikne na questionu function (holder,questiona)
        onSelect: null,
        limit: 5
    },params);
    //this - jquery objekt na ktore sa to vztahuje
    var self = this;
    
    self.attr("autocomplete", "off");
    
    //pridame udalosti
    this.keyup(function () {
        q = self.val();
        if (q.length >= 3 && $.firmSearch.getLastQuery() != q) {
            $('#oneOfThis').css('color', '#F20000');
            $.firmSearch.createList2();
            $.firmSearch.getFirms2(q,params);
            $.firmSearch.setLastQuery(q);
        }
    });
    return this;
}
