﻿/* TypeAhead
---------------------------------------------------------------- */

var TypeAhead = function () {
    this.inputField = null;
    this.borderDiv = null;
    this.container = null;
    this.collection = null;
    this.items = null;
    this.searchPageUrl = null;
    this.doSearch = null;
    this.language = null;
    this.isActive = false;
    this.currentRequest = null;
    this.defaultContent = null;
}

TypeAhead.prototype.initialize = function () {
    var obj = $j(this.inputField)[0];
    this.borderDiv = this.inputField.parent().find(".vpo")[0];
    this.container = this.inputField.parent().find(".btx")[0];
    if (obj && this.container) {
        var pos = this.elementposition(obj);
        var _pos = pos.split('/');
        var elmX = parseInt(_pos[0]);
        var elmY = parseInt(_pos[1]);
        var elmW = obj.offsetWidth - 2;
        var elmH = obj.offsetHeight;
        var elmT = elmY + elmH;
        var _pops = '<div class="suggest-items" id="' + obj.id + '_items" style="width:' + elmW + 'px;left:' + elmX + 'px;top:' + elmT + 'px;"><ul id="' + obj.id + '_collection"></ul></div>';
        // var pref = obj.value;
        obj.style.outline = '0';
        obj.setAttribute('autocomplete', 'off');

        $j(obj).focus($j.proxy(function () { TypeAhead.prototype.focus(this, this.defaultContent); }, this));
        $j(obj).blur($j.proxy(function () { TypeAhead.prototype.blur(this, this.defaultContent); }, this));
        $j(obj).keyup($j.proxy(function (event) {
            TypeAhead.prototype.up(this, event);
            TypeAhead.prototype.determine(this, event);
        }, this));

        $j(obj).keypress(function (event) {
            if (event.which == 13 || event.keyCode == 13) {
                return false;
            }
        });

        if (_pops) { this.container.innerHTML = _pops; }
        this.collection = $j(this.container).find("#" + obj.id + '_collection')[0];
        this.items = $j(this.container).find("#" + obj.id + '_items')[0];
    }
}

TypeAhead.prototype.getjson = function (self) {
    // Stop current request if it is executing.
    if (self.currentRequest != null) {
        try {
            self.currentRequest.abort();
        }
        catch (exception) {
        }
    }
    self.currentRequest = $j.getJSON("/layouts/typeaheadproxy.aspx?q=" + encodeURIComponent(self.inputField.val()) + "&c=" + self.language, function (result) {
        $j(self.collection).html('');

        var items = [];
        $j.each(result.PrefixSuggestions, function (idx, suggestion) {

            var li = $j('<li><a></a></li>');
            li.find('a')
				.attr('href', '#')
				.attr('title', suggestion)
				.mouseover(function () {
				    self.over(this, self);
				})
				.click(function () {
				    self.click(this, self);
				    return false;
				})
				.html(suggestion);

            $j(self.collection).append(li);

        });
        if (result.InfixSuggestions && result.InfixSuggestions.length > 0) {
            $j(self.collection).append('<li class="suggest-border"></li>');
            //items.push('<li class="suggest-border"></li>');
            $j.each(result.InfixSuggestions, function (idx, suggestion) {

                var li = $j('<li><a></a></li>');
                li.find('a')
					.attr('href', '#')
					.attr('title', suggestion)
					.mouseover(function () {
					    self.over(this, self);
					})
					.click(function () {
					    self.click(this, self);
					    return false;
					})
					.html(suggestion);

                $j(self.collection).append(li);
            });
        }


        if ($j(self.collection).children().length > 0) {
            self.show(self);
        } else {
            self.hide(self);
        }
    });
}

TypeAhead.prototype.focus = function (self, txt) {
    self.isActive = true;
    if (self.inputField.val() == txt) { self.inputField.val(''); } else { self.inputField[0].select(); }
}

TypeAhead.prototype.blur = function (self, txt) {
    self.isActive = false;
    if (self.inputField.val() == '') { self.inputField.val(txt) }
    setTimeout(function () { self.hide(self) }, 200);
}

TypeAhead.prototype.up = function (self, event) {
    self.isActive = true;
    if (self.empty(self.inputField.val())) {
        var key = self.keycode(event); ;
        if (key != 38 && key != 104 && key != 40 && key != 98 && key != 9 && key != 13) {
            if (self.inputField.val().length > 0) {
                self.getjson(self);
            }
            else {
                self.hide(self);
                $j(self.collection).innerHTML = '';
            }
            original = self.inputField.val();
        }
    } else {
        self.inputField.val('');
        self.hide(self);
        $j(self.collection).innerHTML = '';
    }
}

TypeAhead.prototype.show = function (self) {
    if (self && self.items) $j(self.items).show();
    if (self && self.borderDiv) $j(self.borderDiv).show();
}

TypeAhead.prototype.hide = function (self) {
    if (self && self.items) $j(self.items).hide();
    if (self && self.borderDiv) $j(self.borderDiv).hide();
}

TypeAhead.prototype.current = function (self) {
    var elm = self.collection;
    var items = elm.getElementsByTagName('a');
    var count = items.length;
    var cur = -1;
    for (var t = 0; t < count; t += 1) {
        if (items[t].className == 'selected') {
            cur = t;
        }
    }
    return cur + '/' + (count - 1);
}

TypeAhead.prototype.over = function (f, self) {
    var elm = self.collection;
    var items = elm.getElementsByTagName('a');
    var count = items.length;
    for (var t = 0; t < count; t += 1) {
        items[t].className = '';
    }
    f.className = 'selected';
    // self.inputField.val(f.innerHTML);
}

TypeAhead.prototype.click = function (f, self) {
    self.inputField.val(f.innerHTML);
    self.doSearch(f.innerHTML);
    self.hide(self);
}

TypeAhead.prototype.move = function (self, f) {
    var obj = self.inputField[0];
    var cur = self.current(self);
    var _cur = cur.split('/');
    var all, mark, found = 0;
    cur = parseInt(_cur[0]);
    all = parseInt(_cur[1]);
    if (f == 'down') {
        mark = cur + 1;
    } else if (f == 'up') {
        if (cur == -1) { mark = all; } else { mark = cur - 1; }
    }
    var elm = self.collection;
    var items = elm.getElementsByTagName('a');
    var count = items.length;
    for (var t = 0; t < count; t += 1) {
        if (t == mark) {
            items[t].className = 'selected';
            obj.value = items[t].innerHTML;
            found++;
        } else {
            items[t].className = '';
        }
    }
    if (found == 0) { obj.value = original; }
}

TypeAhead.prototype.trigger = function (self) {
    self.hide(self);
    self.doSearch(self.inputField.val());
}

TypeAhead.prototype.determine = function (self, event) {
    var charCode = self.keycode(event);
    if (charCode == 38) {
        if (self.isActive) { self.move(self, 'up'); }
    } 		// Arrow -> Up
    if (charCode == 104) {
        if (self.isActive) { self.move(self, 'up'); }
    } 		// Numpad -> Up
    if (charCode == 40) {
        if (self.isActive) { self.move(self, 'down'); }
    } 		// Arrow -> Down
    if (charCode == 98) {
        if (self.isActive) { self.move(self, 'down'); }
    } 		// Numpad -> Down
    if (charCode == 9) {
        if (self.isActive) { self.trigger(self); }
    } 	// Tab
    if (charCode == 13 || charCode == 3) {
        if (self.isActive) { self.trigger(self); event.stopPropagation(); }
    } 	// Enter
}

TypeAhead.prototype.empty = function (str) {
    var filter = /^\s+$/;
    var expression;
    if (filter.test(str) || str == '') { expression = false; } else { expression = true; }
    return expression;
}

TypeAhead.prototype.elementposition = function (obj) {
    var curleft = curtop = 0;
    if (obj.offsetParent) {
        curleft = obj.offsetLeft;
        curtop = obj.offsetTop;
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
    }
    return curleft + '/' + curtop;
}


TypeAhead.prototype.keycode = function (evt) {
    evt = (evt) ? evt : ((event) ? event : null);
    var evver = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
    var keynumber = evt.keyCode;
    if (keynumber) { return keynumber; }
}

