﻿/*
* jQuery MasterAutocomplete plugin 1.1
*
* Copyright (c) 2009 Joern Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.master.autocomplete.js 14 2009-08-22 10:29:29Z joern.zaefferer $
*
* 인맥 자동완성검색으로 변경 //2011-08-01 (우영철)
*/
; (function ($) {
    $.fn.extend({ Masterautocomplete: function (urlOrData, options) { var isUrl = typeof urlOrData == "string"; options = $.extend({}, $.MasterAutocompleter.defaults, { url: isUrl ? urlOrData : null, data: isUrl ? null : urlOrData, delay: isUrl ? $.MasterAutocompleter.defaults.delay : 10, max: options && !options.scroll ? 10 : 150 }, options); options.highlight = options.highlight || function (value) { return value; }; options.formatMatch = options.formatMatch || options.formatItem; return this.each(function () { new $.MasterAutocompleter(this, options); }); }, result: function (handler) { return this.bind("result", handler); }, search: function (handler) { return this.trigger("search", [handler]); }, flushCache: function () { return this.trigger("flushCache"); }, setOptions: function (options) { return this.trigger("setOptions", [options]); }, unautocomplete: function () { return this.trigger("unautocomplete"); } }); $.MasterAutocompleter = function (input, options) {
        var KEY = { UP: 38, DOWN: 40, DEL: 46, TAB: 9, RETURN: 13, ESC: 27, COMMA: 188, PAGEUP: 33, PAGEDOWN: 34, BACKSPACE: 8 }; var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); var timeout; var previousValue = ""; var cache = $.MasterAutocompleter.Cache(options); var hasFocus = 0; var lastKeyPressCode; var config = { mouseDownOnSelect: false }; var select = $.MasterAutocompleter.Select(options, input, selectCurrent, config); var blockSubmit; var resultshow = (options.resultshow == undefined) ? true : options.resultshow; var suffix = (options.suffix) ? options.suffix : ''; var strAutoTypeChk = ""; $.browser.opera && $(input.form).bind("submit.autocomplete", function () { if (blockSubmit) { blockSubmit = false; return false; } }); $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function (event) {
            hasFocus = 1; lastKeyPressCode = event.keyCode; switch (event.keyCode) {
                case KEY.UP: event.preventDefault(); if (select.visible()) { select.prev(); } else { onChange(0, true); }
                    break; case KEY.DOWN: event.preventDefault(); if (select.visible()) { select.next(); } else { onChange(0, true); }
                    break; case KEY.PAGEUP: event.preventDefault(); if (select.visible()) { select.pageUp(); } else { onChange(0, true); }
                    break; case KEY.PAGEDOWN: event.preventDefault(); if (select.visible()) { select.pageDown(); } else { onChange(0, true); }
                    break; case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: case KEY.RETURN: if (selectCurrent()) { event.preventDefault(); blockSubmit = true; return false; }
                    break; case KEY.ESC: select.hide(); break; default: clearTimeout(timeout); timeout = setTimeout(onChange, options.delay); break;
            } 
        }).focus(function () { hasFocus++; }).blur(function () { if (!config.mouseDownOnSelect && hasFocus <= 99) { hideResults(); hasFocus = 0; } }).click(function () {
            if ($input.val() == "키워드로 검색") { $input.val(""); }
            if (trimWords($input.val().replace(/[~!@\#$%<>^&*\()\-=+_\'\"|\\]/gi, "")) != "") { onChange(0, true); } else { hasFocus = 0; if (hasFocus++ > 1 && !select.visible()) { onChange(0, true); } };
        }).bind("search", function () {
            var fn = (arguments.length > 1) ? arguments[1] : null; function findValueCallback(q, data) {
                var result; if (data && data.length) { for (var i = 0; i < data.length; i++) { if (data[i].result.toLowerCase() == q.toLowerCase()) { result = data[i]; break; } } }
                if (typeof fn == "function") fn(result); else $input.trigger("result", result && [result.data, result.value]);
            }
            $.each(trimWords($input.val()), function (i, value) { request(value, findValueCallback, findValueCallback); });
        }).bind("flushCache", function () { cache.flush(); }).bind("setOptions", function () {
            $.extend(options, arguments[1]); if ("data" in arguments[1])
                cache.populate();
        }).bind("unautocomplete", function () { select.unbind(); $input.unbind(); $(input.form).unbind(".autocomplete"); }); function selectCurrent() {
            var selected = select.selected(); if (!selected)
                return false; var v = selected.result; previousValue = v; if (options.multiple) {
                var words = trimWords($input.val()); if (words.length > 1) {
                    var seperator = options.multipleSeparator.length; var cursorAt = $(input).selection().start; var wordAt, progress = 0; $.each(words, function (i, word) {
                        progress += word.length; if (cursorAt <= progress) { wordAt = i; return false; }
                        progress += seperator;
                    }); words[wordAt] = v; v = words.join(options.multipleSeparator);
                }
                v += options.multipleSeparator;
            }
            var etcty = '000'; etcty = selected.data[9]; if (etcty == '999') { location.href = G_HOSTNAME_WWW + "/network/allsearchresult?schwd=" + escape(selected.data[1]); hasFocus = 100; } else { hideResultsNow(); $input.trigger("result", [selected.data, selected.value]); }
            return true;
        }
        function onChange(crap, skipPrevCheck) {
            if (lastKeyPressCode == KEY.DEL) { select.hide(); return; }
            var currentValue = $input.val(); if (!skipPrevCheck && currentValue == previousValue)
                return; previousValue = currentValue; currentValue = lastWord(currentValue); if (currentValue.length >= options.minChars) {
                $input.addClass(options.loadingClass); if (!options.matchCase)
                    currentValue = currentValue.toLowerCase(); request(currentValue, receiveData, hideResultsNow);
            } else { stopLoading(); select.hide(); } 
        }; function trimWords(value) {
            if (!value)
                return [""]; if (!options.multiple)
                return [$.trim(value)]; return $.map(value.split(options.multipleSeparator), function (word) { return $.trim(value).length ? $.trim(word) : null; });
        }
        function lastWord(value) {
            if (!options.multiple)
                return value; var words = trimWords(value); if (words.length == 1)
                return words[0]; var cursorAt = $(input).selection().start; if (cursorAt == value.length) { words = trimWords(value) } else { words = trimWords(value.replace(value.substring(cursorAt), "")); }
            return words[words.length - 1];
        }
        function autoFill(q, sValue) { if (options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE) { $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); $(input).selection(previousValue.length, previousValue.length + sValue.length); } }; function hideResults() { clearTimeout(timeout); timeout = setTimeout(hideResultsNow, 200); }; function hideResultsNow() {
            var wasVisible = select.visible(); select.hide(); clearTimeout(timeout); stopLoading(); if (options.mustMatch) {
                $input.search(function (result) {
                    if (!result) {
                        if (options.multiple) { var words = trimWords($input.val()).slice(0, -1); $input.val(words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "")); }
                        else { $input.val(""); $input.trigger("result", null); } 
                    } 
                });
            } 
        }; function receiveData(q, data) { if (data && data.length && hasFocus) { stopLoading(); select.display(data, q); autoFill(q, data[0].value); select.show(); } else { hideResultsNow(); } }; function request(term, success, failure) {
            if ($.trim(term).length > 0) {
                if (!options.matchCase)
                    term = term.toLowerCase(); var data = cache.load(term); if (data && data.length) { success(term, data); } else if ((typeof options.url == "string") && (options.url.length > 0)) {
                    var extraParams = { timestamp: +new Date() }; $.each(options.extraParams, function (key, param) { extraParams[key] = typeof param == "function" ? param() : param; }); $.ajax({ mode: "abort", port: "autocomplete" + input.name, dataType: options.dataType, url: options.url, data: $.extend({ schwd: escape(lastWord(term.replace(/[~!@\#$%<>^&*\()\-=+_\'\"|\\]/gi, ""))), limit: options.max, exmemno: options.exmemnoParams }, extraParams), success: function (rtndata) {
                        if ($.trim(rtndata.rtn) == "") { data = ""; } else { data = jQuery.url.decode(rtndata.rtn); }
                        var strDefaultSet = "{ \"Fri_Photo_Path\": \"\", \"AutoType\": \"Default\", \"Local_Cd\": \"\", \"Fri_Email\": \"\", \"Fri_Photo_Nm\": \"\", \"Indus_Cd\": \"\", \"Comp_Ty_Cd\": \"\", \"Biz_Regist_No\": \"\", \"Mem_No\": \"\", \"Nation_Cd\": \"\", \"IDX\": \"\", \"School_Jp_Nm\": \"\", \"Company_Nm_Core\": \"\", \"School_En_Nm\": \"\", \"Fri_Mem_No\": \"\", \"Appr_Yn\": \"\", \"Fri_Mem_Nm\": \"\", \"School_Ty_Cd\": \"\", \"Comp_Scale_Cd\": \"\", \"Local_Cd_Nm\": \"\", \"StockCd\": \"\", \"Ceo_Nm\": \"\", \"School_Gubun\": \"\", \"School_Cd\": \"\", \"Company_No\": \"\", \"Local_Det_Cd\": \"\", \"Mod_Dt\": \"\", \"Company_Nm\": \"\", \"Fri_User_Id\": \"\", \"Homepage_Url\": \"\", \"Indus_B_Group\": \"\", \"School_Nm\": \"\" }"; data = data + strDefaultSet; strAutoTypeChk = ""; var parsed = options.parse && options.parse(term, data) || parse(term, data); cache.add(term, parsed); success(term, parsed);
                    } 
                    });
                } else { select.emptyList(); failure(term); } 
            } 
        }; function parse(term, data) {
            var parsed = []; var rows = data.split("@@"); for (var i = 0; i <= rows.length - 1; i++) { var ReParserow = $.trim(rows[i]); var row = fnReParse(term, ReParserow); if (row) { row = row.split("##"); parsed[parsed.length] = { data: row, value: row[0], result: options.formatResult && options.formatResult(row, row[0]) || row[0] }; } }
            return parsed;
        }; function fnReParse(term, row) {
            var RtnParse = []; var strAutoTypeBoolChk = false; var Row_parseJSON = $.parseJSON(row); if (strAutoTypeChk != Row_parseJSON.AutoType) { strAutoTypeChk = Row_parseJSON.AutoType; strAutoTypeBoolChk = true; }; if (Row_parseJSON.AutoType == "Mem")
            { RtnParse[2] = Row_parseJSON.Fri_Mem_Nm; RtnParse[3] = ""; RtnParse[4] = Row_parseJSON.Fri_Photo_Path; RtnParse[5] = Row_parseJSON.Fri_Photo_Nm; RtnParse[6] = G_HOSTNAME_NUGUWWW + "/" + Row_parseJSON.Fri_User_Id; }
            else if (Row_parseJSON.AutoType == "Comp")
            { RtnParse[2] = Row_parseJSON.Company_Nm; RtnParse[3] = ""; RtnParse[4] = Row_parseJSON.Fri_Photo_Path; RtnParse[5] = Row_parseJSON.Fri_Photo_Nm; RtnParse[6] = G_HOSTNAME_NUGU + "/" + Row_parseJSON.Company_No; }
            else if (Row_parseJSON.AutoType == "Sch")
            { RtnParse[2] = Row_parseJSON.School_Nm; RtnParse[3] = ""; RtnParse[4] = Row_parseJSON.Fri_Photo_Path; ; RtnParse[5] = Row_parseJSON.Fri_Photo_Nm; RtnParse[6] = G_HOSTNAME_SEARCH + "/?pco=0&src=gsw*www&col=nugu_all&kw=" + escape(Row_parseJSON.School_Nm); }
            else if (Row_parseJSON.AutoType == "Post")
            { RtnParse[2] = Row_parseJSON.Fri_Mem_Nm; RtnParse[3] = Row_parseJSON.Contents; RtnParse[4] = Row_parseJSON.Fri_Photo_Path; RtnParse[5] = Row_parseJSON.Fri_Photo_Nm; RtnParse[6] = G_HOSTNAME_NUGUWWW + "/" + Row_parseJSON.Link_Url; }
            else if (Row_parseJSON.AutoType == "Blog")
            { RtnParse[2] = Row_parseJSON.Title; RtnParse[3] = Row_parseJSON.Contents; RtnParse[4] = Row_parseJSON.Fri_Photo_Path; RtnParse[5] = Row_parseJSON.Fri_Photo_Nm; RtnParse[6] = G_HOSTNAME_NUGUWWW + "/" + Row_parseJSON.Link_Url; }
            else if (Row_parseJSON.AutoType == "Default")
            { RtnParse[2] = ""; RtnParse[3] = ""; RtnParse[4] = ""; RtnParse[5] = ""; RtnParse[6] = "#"; }
            RtnParse[0] = term + " 에 대한 검색 결과"; RtnParse[1] = term; RtnParse[7] = Row_parseJSON.AutoType; RtnParse[8] = strAutoTypeBoolChk; RtnParse[9] = (Row_parseJSON.AutoType == "Default") ? "999" : "000"; return RtnParse.join("##");
        }; function stopLoading() { $input.removeClass(options.loadingClass); };
    }; $.MasterAutocompleter.defaults = { inputClass: "ac_input", resultsClass: "inmacAutoComplete", loadingClass: "ac_loading", minChars: 1, delay: 10, matchCase: false, matchSubset: true, matchContains: false, cacheLength: 0, max: 11, mustMatch: false, exmemnoParams: '', extraParams: {}, selectFirst: true, formatItem: function (row) { return row[0]; }, formatMatch: null, autoFill: false, width: 0, top: 24, left: 0, multiple: false, multipleSeparator: ", ", highlight: function (value, term, ty) { if (ty == 1) return value; else return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<em>$1</em>"); }, scroll: false, scrollHeight: 180 }; $.MasterAutocompleter.Cache = function (options) {
        var data = {}; var length = 0; function matchSubset(s, sub) {
            if (!options.matchCase)
                s = s.toLowerCase(); var i = s.indexOf(sub); if (options.matchContains == "word") { i = s.toLowerCase().search("\\b" + sub.toLowerCase()); }
            if (i == -1) return false; return i == 0 || options.matchContains;
        }; function add(q, value) {
            if (length > options.cacheLength) { flush(); }
            if (!data[q]) { length++; }
            data[q] = value;
        }
        function populate() {
            if (!options.data) return false; var stMatchSets = {}, nullData = 0; if (!options.url) options.cacheLength = 1; stMatchSets[""] = []; for (var i = 0, ol = options.data.length; i < ol; i++) {
                var rawValue = options.data[i]; rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; var value = options.formatMatch(rawValue, i + 1, options.data.length); if (value === false)
                    continue; var firstChar = value.charAt(0).toLowerCase(); if (!stMatchSets[firstChar])
                    stMatchSets[firstChar] = []; var row = { value: value, data: rawValue, result: options.formatResult && options.formatResult(rawValue) || value }; stMatchSets[firstChar].push(row); if (nullData++ < options.max) { stMatchSets[""].push(row); } 
            }; $.each(stMatchSets, function (i, value) { options.cacheLength++; add(i, value); });
        }
        setTimeout(populate, 25); function flush() { data = {}; length = 0; }
        return { flush: flush, add: add, populate: populate, load: function (q) {
            if (!options.cacheLength || !length)
                return null; if (!options.url && options.matchContains) {
                var csub = []; for (var k in data) { if (k.length > 0) { var c = data[k]; $.each(c, function (i, x) { if (matchSubset(x.value, q)) { csub.push(x); } }); } }
                return csub;
            } else
                if (data[q]) { return data[q]; } else
                    if (options.matchSubset) { for (var i = q.length - 1; i >= options.minChars; i--) { var c = data[q.substr(0, i)]; if (c) { var csub = []; $.each(c, function (i, x) { if (matchSubset(x.value, q)) { csub[csub.length] = x; } }); return csub; } } }
            return null;
        } 
        };
    }; $.MasterAutocompleter.Select = function (options, input, select, config) {
        var CLASSES = { ACTIVE: "focusingWord" }; var listItems, active = -1, data, term = "", needsInit = true, element, list; function init() {
            if (!needsInit)
                return; element = $("<div/>").hide().html("<h2 class='hide'>인맥자동완성</h2>").addClass(options.resultsClass).css("position", "absolute").css("z-index", "999999").appendTo("#s_search"); list = element.mouseover(function (event) { if (target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); $(target(event)).addClass(CLASSES.ACTIVE); } }).click(function (event) { $(target(event)).addClass(CLASSES.ACTIVE); select(); return false; }).mousedown(function () { config.mouseDownOnSelect = true; }).mouseup(function () { config.mouseDownOnSelect = false; }); if (options.width > 0)
                element.css("width", options.width); needsInit = false;
        }
        function target(event) {
            var element = event.target; while (element && element.tagName != "LI")
                element = element.parentNode; if (!element)
                return []; return element;
        }
        function moveSelect(step) { listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); movePosition(step); var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); if (options.scroll) { var offset = 0; listItems.slice(0, active).each(function () { offset += this.offsetHeight; }); if ((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); } else if (offset < list.scrollTop()) { list.scrollTop(offset); } } }; function movePosition(step) { active += step; if (active < 0) { active = listItems.size() - 1; } else if (active >= listItems.size()) { active = 0; } }
        function limitNumberOfItems(available) { return options.max && options.max < available ? options.max : available; }
        function fillList() {
            list.empty(); var max = limitNumberOfItems(data.length); for (var i = 0; i < max; i++) {
                if (!data[i])
                    continue; var formatted = options.formatItem(data[i].data, i + 1, max, data[i].value, term); if (formatted === false)
                    continue; var strAutoCmpltHtml = ""; var intCurrentHtml = ""; if (data[i].data[8] == "true") { var strAutoTypeChk = data[i].data[7]; if (strAutoTypeChk == "Mem") { intCurrentHtml = "inmacAutoList_0"; strAutoCmpltHtml = "<h3>인맥</h3>"; strAutoCmpltHtml = strAutoCmpltHtml + "<ul id=\"inmacAutoList_0\" class=\"inmacAutoList\"></ul>"; } else if (strAutoTypeChk == "Comp") { intCurrentHtml = "inmacAutoList_1"; strAutoCmpltHtml = "<h3>회사</h3>"; strAutoCmpltHtml = strAutoCmpltHtml + "<ul id=\"inmacAutoList_1\" class=\"inmacAutoList schoolCompany\"></ul>"; } else if (strAutoTypeChk == "Sch") { intCurrentHtml = "inmacAutoList_2"; strAutoCmpltHtml = "<h3>학교</h3>"; strAutoCmpltHtml = strAutoCmpltHtml + "<ul id=\"inmacAutoList_2\" class=\"inmacAutoList schoolCompany\"></ul>"; } else if (strAutoTypeChk == "Post") { intCurrentHtml = "inmacAutoList_3"; strAutoCmpltHtml = "<h3>포스트</h3>"; strAutoCmpltHtml = strAutoCmpltHtml + "<ul id=\"inmacAutoList_3\" class=\"inmacAutoList\"></ul>"; } else if (strAutoTypeChk == "Blog") { intCurrentHtml = "inmacAutoList_4"; strAutoCmpltHtml = "<h3>블로그</h3>"; strAutoCmpltHtml = strAutoCmpltHtml + "<ul id=\"inmacAutoList_4\" class=\"inmacAutoList\"></ul>"; } } else { var strAutoTypeChk = data[i].data[7]; if (strAutoTypeChk == "Mem") { intCurrentHtml = "inmacAutoList_0"; } else if (strAutoTypeChk == "Comp") { intCurrentHtml = "inmacAutoList_1"; } else if (strAutoTypeChk == "Sch") { intCurrentHtml = "inmacAutoList_2"; } else if (strAutoTypeChk == "Post") { intCurrentHtml = "inmacAutoList_3"; } else if (strAutoTypeChk == "Blog") { intCurrentHtml = "inmacAutoList_4"; } }
                if (i == max - 1) { var li = $("<ul/>").addClass("inmacAutoCompleteMore").html("<li id=\"" + i + "\"><a href=\"" + G_HOSTNAME_WWW + "/network/allsearchresult?schwd=" + escape(term) + "\"><span class=\"resultTxt\">" + options.highlight(formatted, term, 1) + "</span><span class=\"more\">더보기</span></a></li>").appendTo(list)[0]; } else {
                    var strRtnValue = ""; var photo = ""; var strAutoTypeChk = data[i].data[7]; if (strAutoTypeChk == "Mem") { photo = (data[i].data[4] != "" && data[i].data[5] != "") ? "http://nuguphoto.incruit.com/profileimages/" + data[i].data[4] + "/" + data[i].data[5] : "http://img.incruit.com/nugu/common/no_image50.gif"; strRtnValue = "<span class=\"inmacImg\"><img src=\"" + photo + "\" width=\"50\" height=\"50\" alt=\"사진\"></span>"; strRtnValue = strRtnValue + "<span class=\"inmacName\">" + options.highlight(formatted, term, 0) + "</span>"; strRtnValue = strRtnValue + "<span class=\"inmacCompany\">" + data[i].data[3] + "</span>"; } else if (strAutoTypeChk == "Comp") { strRtnValue = strRtnValue + "<span class=\"inmacName\">" + options.highlight(formatted, term, 0) + "</span>"; } else if (strAutoTypeChk == "Sch") { strRtnValue = strRtnValue + "<span class=\"inmacName\">" + options.highlight(formatted, term, 0) + "</span>"; } else if (strAutoTypeChk == "Post") { photo = (data[i].data[4] != "" && data[i].data[5] != "") ? "http://nuguphoto.incruit.com/profileimages/" + data[i].data[4] + "/" + data[i].data[5] : "http://img.incruit.com/nugu/common/no_image50.gif"; strRtnValue = "<span class=\"inmacImg\"><img src=\"" + photo + "\" width=\"50\" height=\"50\" alt=\"사진\"></span>"; strRtnValue = strRtnValue + "<span class=\"inmacName\">" + options.highlight(formatted, term, 0) + "</span>"; strRtnValue = strRtnValue + "<span class=\"inmacCompany\">" + data[i].data[3] + "</span>"; } else if (strAutoTypeChk == "Blog") { photo = (data[i].data[4] != "" && data[i].data[5] != "") ? "http://nuguphoto.incruit.com/profileimages/" + data[i].data[4] + "/" + data[i].data[5] : "http://img.incruit.com/nugu/common/no_image50.gif"; strRtnValue = "<span class=\"inmacImg\"><img src=\"" + photo + "\" width=\"50\" height=\"50\" alt=\"사진\"></span>"; strRtnValue = strRtnValue + "<span class=\"inmacName\">" + options.highlight(formatted, term, 0) + "</span>"; strRtnValue = strRtnValue + "<span class=\"inmacCompany\">" + data[i].data[3] + "</span>"; }
                    if (strAutoCmpltHtml != "")
                    { $("<div/>").html(strAutoCmpltHtml).addClass("searchingGroup").appendTo(list)[0]; }
                    var li = $("<li id=\"" + i + "\"><a href=\"" + data[i].data[6] + "\" onclick=\"return false;\">" + strRtnValue + "</a></li>").appendTo($("#" + intCurrentHtml));
                } 
            }
            listItems = list.find("li"); if (options.selectFirst) { listItems.slice(0, 1).addClass(CLASSES.ACTIVE); active = 0; }
            if ($.fn.bgiframe)
                list.bgiframe();
        }
        function fillEtcList() { var suffix = (options.suffix) ? options.suffix : ""; }
        return { display: function (d, q) { init(); data = d; term = q; fillList(); if (options.suffix) fillEtcList(); }, next: function () { moveSelect(1); }, prev: function () { moveSelect(-1); }, pageUp: function () { if (active != 0 && active - 8 < 0) { moveSelect(-active); } else { moveSelect(-8); } }, pageDown: function () { if (active != listItems.size() - 1 && active + 8 > listItems.size()) { moveSelect(listItems.size() - 1 - active); } else { moveSelect(8); } }, hide: function () { element && element.hide(); listItems && listItems.removeClass(CLASSES.ACTIVE); active = -1; }, visible: function () { return element && element.is(":visible"); }, current: function () { return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); }, show: function () { var offset = $(input).offset(); element.css({ width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), top: typeof options.top == "string" ? options.top : 24, left: typeof options.left == "string" ? options.left : 0 }).show(); if (options.scroll) { list.scrollTop(0); list.css({ maxHeight: options.scrollHeight, overflow: 'auto' }); if ($.browser.msie && typeof document.body.style.maxHeight === "undefined") { var listHeight = 0; listItems.each(function () { listHeight += this.offsetHeight; }); var scrollbarsVisible = listHeight > options.scrollHeight; list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight); if (!scrollbarsVisible) { listItems.width(list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right"))); } } } }, selected: function () { var strlistItemsid = $("." + CLASSES.ACTIVE).attr("id"); listItems = $("#" + strlistItemsid); var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); return selected && selected.length && data[strlistItemsid]; }, emptyList: function () { list && list.empty(); }, unbind: function () { element && element.remove(); } };
    }; $.fn.selection = function (start, end) {
        if (start !== undefined) { return this.each(function () { if (this.createTextRange) { var selRange = this.createTextRange(); if (end === undefined || start == end) { selRange.move("character", start); selRange.select(); } else { selRange.collapse(true); selRange.moveStart("character", start); selRange.moveEnd("character", end); selRange.select(); } } else if (this.setSelectionRange) { this.setSelectionRange(start, end); } else if (this.selectionStart) { this.selectionStart = start; this.selectionEnd = end; } }); }
        var field = this[0]; if (field.createTextRange) { var range = document.selection.createRange(), orig = field.value, teststring = "<->", textLength = range.text.length; range.text = teststring; var caretAt = field.value.indexOf(teststring); field.value = orig; this.selection(caretAt, caretAt + textLength); return { start: caretAt, end: caretAt + textLength} } else if (field.selectionStart !== undefined) { return { start: field.selectionStart, end: field.selectionEnd} } 
    };
})(jQuery);
