// JavaScript Document

(function($) {
    $.fn.extend({
        SmartJump: function(opt, callback) {
            if (!opt) var opt = {}; var _callback = callback, _type = "GET", _width = "200px", _height = "300px", _controls = [], _enableId = [], _enableValue = "", _datatype = "text";
            var _pageno = 1, _pagecount = 10;
            if (opt.pagecount != undefined) { _pagecount = opt.pagecount; }; if (opt.data == undefined) { opt.data = ""; }; if (opt.type != undefined) { _type = opt.type; }; if (opt.width != undefined) { _width = opt.width; }; if (opt.height != undefined) { _height = opt.height; }; if (opt.controls != undefined) { _controls = opt.controls }; if (opt.enableId != undefined) { _enableId = opt.enableId }; if (opt.datatype != undefined) { _datatype = opt.datatype };
            for (var i in _enableId) {
                _enableValue = $("#" + _enableId[i].id).val();
            }
            var _id = $(this).attr("id"), _mainframe_id = "smartjump_", _url = "pageno=", _data = "", _selectNo = -1, _this = this, _close_id = "", _maindata_id = "";
            _mainframe_id += _id; _close_id = _mainframe_id + "close"; _maindata_id = _mainframe_id + "data";
            var _mainframe = document.createElement("div"), _thisOffset = $(this).offset(), _close = document.createElement("div"), _data = document.createElement("div"), _top = "0", _left = "0";
            _top = _thisOffset.top + $(this).height() + 10; _left = _thisOffset.left;
            _mainframe.setAttribute("id", _mainframe_id); _mainframe.style.left = _left;
            _mainframe.style.position = "absolute"; _mainframe.style.zIndex = 999999;
            _mainframe.style.top = _top; _mainframe.style.width = _width; _mainframe.style.height = _height; _mainframe.className = "smartjump"; _mainframe.style.display = "none";
            _close.setAttribute("id", _close_id); _data.setAttribute("id", _maindata_id); _close.setAttribute("class", "close"); _data.setAttribute("class", "data");
            _close.innerHTML = "<span>Close</span>";
            _mainframe.appendChild(_data); _mainframe.appendChild(_close);
            document.body.appendChild(_mainframe);
            $("#" + _mainframe_id).css({ "top": _top, "left": _left }); 
            $("#" + _mainframe_id + " >div#" + _maindata_id).css("height", $("#" + _mainframe_id).height() -20 - 5); 
            $("#" + _mainframe_id + " >div#" + _close_id + " >span").click(function() { mainclose(); });
            if (_enableValue.length == 0) {
                $(this).keyup(function(event) {
                    var e, _keycode = -1;
                    if (window.event) { e = window.event } else { e = event; }
                    _keycode = parseInt(e.keyCode);
                    if (_keycode != 18 && _keycode != 27 && _keycode != 13 && _keycode != 9 && _keycode != 37 && _keycode != 39 && _keycode != 38 && _keycode != 40 && (_keycode < 112 || _keycode > 123)) {
                        _pageno = 1; _selectNo = -1;
                        if ($(this).val().length == 0) { mainclose(); } else { getData($(this).val(), showData); }
                    }
                    if (_keycode == 38) {//up
                        _selectNo--; setDefaultStyle(); selectRow(); setScrollTop();
                    }
                    if (_keycode == 40) {//down
                        _selectNo++; setDefaultStyle(); selectRow(); setScrollDown();
                    }
                    if (_keycode == 27) {//Esc
                        mainclose();
                    }
                });
            }
            $(this).keydown(function(event) {
                var e, _keycode = -1;
                if (window.event) { e = window.event } else { e = event; }
                _keycode = parseInt(e.keyCode);
                if (_keycode == 13) {
                    if ($("#" + _mainframe_id + "> div#" + _maindata_id + " > ul >li:first").length > 0 && _selectNo < 0) {
                        _callback($("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li:first"));
                    }
                    else if (_selectNo >= 0) { _callback($("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").eq(_selectNo)); }
                    $("#" + _mainframe_id).css("display", "none");
                    return false;
                }
            });
            $("#" + _mainframe_id + "> div#" + _maindata_id).scroll(function() {
                var top = parseInt(this.scrollTop), sheight = parseInt(this.scrollHeight), cheight = parseInt(this.clientHeight);
                if ((top + cheight) == sheight) {
                    if ($("#" + _mainframe_id + "> div#" + _maindata_id)) {
                        if ($("#" + _mainframe_id + "> div#" + _maindata_id + " > ul >li#loading").length == 0) {
                            $($("#" + _mainframe_id + "> div#" + _maindata_id + " > ul")).append("<li id='loading'>Loading...</li>");
                            _pageno++; getData($(this).val(), appenData);
                        }
                    }
                }
            });
            var mainclose = function() {
                $("#" + _mainframe_id).css("display", "none");
            }
            var showData = function(data) {
                if ($("#" + _mainframe_id + " >div#" + _maindata_id) && data.length > 0) {
                    $("#" + _mainframe_id + "> div#" + _maindata_id).html("<ul>" + data + "</ul>"); rowEvent(); $("#" + _mainframe_id).css("display", ""); $("#" + _mainframe_id + " >div#" + _maindata_id).attr("scrollTop", 0);
                } else {
                    mainclose();
                }
            };
            var appenData = function(data) {
                if ($("#" + _mainframe_id + "> div#" + _maindata_id)) {
                    if ($("#" + _mainframe_id + "> div#" + _maindata_id + " > ul >li#loading").length > 0) {
                        $("#" + _mainframe_id + "> div#" + _maindata_id + " > ul >li#loading").remove();
                    }
                    $($("#" + _mainframe_id + "> div#" + _maindata_id + " > ul")).append(data); rowEvent();
                }
            };
            var getData = function(v, cb) {
                _data = _url + _pageno.toString() + "&keyword=" + escape($(_this).val()) + "&" + opt.data;
                for (var i in _controls) {
                    _data += "&" + _controls[i].name + "=" + $("#" + _controls[i].id).val();
                }
                if (opt.url != undefined) {
                    $.ajax({ type: _type,
                        url: opt.url,
                        data: _data,
                        dataType: _datatype,
                        success: function(data) { cb(data) },
                        error: function(err) { alert("Err: " + err); }
                    });
                } else {
                    alert("Invalid url.");
                }
            };
            var rowEvent = function() {
                $("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").each(function() {
                    $(this).mouseover(function() { setDefaultStyle(); $(this).attr("class", "mouseover"); getSelectNo(); });
                    $(this).mouseout(function() { setDefaultStyle(); $(this).attr("class", "mouseout"); getSelectNo(); });
                    $(this).click(function() { _callback(this); mainclose(); });
                });
            };
            var selectRow = function() {
                var i = 0;
                $("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").each(function() {
                    if (i == _selectNo) {//Select
                        $(this).attr("class", "mouseover");
                    }
                    i++;
                });
            };
            var setDefaultStyle = function() {
                $("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").each(function() {
                    $(this).attr("class", "mouseout");
                });
            };
            var setScrollDown = function() {
                var i = 0;
                $("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").each(function() {
                    if ($(this).attr("class") == "mouseover") {
                        var ph = parseInt($($(this).parent().parent()).height()), lh = parseInt($(this).height()), rows = 0, no = 0;
                        rows = parseInt(ph / lh);
                        if ((i + 1) > rows) {
                            no = i - rows + 1;
                            $("#" + _mainframe_id + " >div#" + _maindata_id).attr("scrollTop", no * lh);
                        }
                    }
                    i++;
                });
            };
            var setScrollTop = function() {
                var i = 0;
                $("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").each(function() {
                    if ($(this).attr("class") == "mouseover") {
                        var ph = parseInt($($(this).parent().parent()).height()), lh = parseInt($(this).height()), rows = 0, no = 0, sh = parseInt($("#" + _mainframe_id).scrollTop());
                        rows = parseInt(sh / lh);
                        if ((i + 1) <= rows) {
                            $("#" + _mainframe_id).attr("scrollTop", sh - lh);
                        }
                    }
                    i++;
                });
            };
            var getSelectNo = function() {
                var i = 0;
                $("#" + _mainframe_id + " >div#" + _maindata_id + " > ul >li").each(function() {
                    if ($(this).attr("class") == "mouseover") {
                        _selectNo = i;
                    }
                    i++;
                });
            }
        }
    })
})(jQuery);
