﻿document.write('<link href="/style/autocomplete.css" rel="stylesheet" type="text/css" />');
String.prototype.Trim = function() { return this.replace(/^\s+|\s+$/g, ''); };
String.prototype.Format = function() { var t = this; for (var i = 0, j = arguments.length; i < j; i += 1) t = t.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]); return t; };
if (typeof $ == "undefined") { $ = function(element) { return document.getElementById(element); }; };

function SetTxtWordsNoValue() {
    var searchtxt = $("txtwords");
    if (searchtxt.value == "书号/书名/作者/标签") {
        searchtxt.value = "";
        searchtxt.style.color = "";
    };
};
function SetTxtWordsValue() {
    var searchtxt = $("txtwords");
    if (searchtxt.value == "") {
        searchtxt.value = "书号/书名/作者/标签";
        searchtxt.style.color = "Gray";
    };
};
if (!window.Snda) var Snda = window.Snda = {};
(function() {
    Snda.extend = function(dest, source, replace) {//扩展
        for (prop in source) {
            if (replace == false && dest[prop] != null) continue;
            dest[prop] = source[prop];
        };
        return dest;
    };
    if (!window.Snda.Utility) Snda.Utility = {};
    Snda.extend(Snda.Utility, {
        HightLightElement: function(node, key, className) {//高亮单个元素
            if (key.length === 0) return false;
            var pattern = new RegExp(key, "gi");
            var html = node.innerHTML;
            html = html.replace(pattern, "<font class='" + className + "'>" + key + "</font>");
            node.innerHTML = html;
        },
        Event: {//事件
            addEventHandler: function(oTarget, sEventType, fnHandler, bool) {//事件绑定
                if (oTarget.addEventListener) oTarget.addEventListener(sEventType, fnHandler, bool);  //FF方法
                else if (oTarget.attachEvent) oTarget.attachEvent("on" + sEventType, fnHandler);       //IE方法
                else oTarget["on" + sEventType] = fnHandler;                  //其他未知浏览器
            },
            removeEventHandler: function(obj, EventType, Handler, bool) {
                if (obj.removeEventListener) obj.removeEventListener(EventType, Handler, bool);
                else if (obj.detachEvent) obj.detachEvent('on' + EventType, Handler);
                else obj['on' + EventType] = null;
            },
            getCurrentElem: function(evt) {//获取事件元素
                evt = evt || window.event;
                return evt.srcElement || evt.target;
            },
            elementClick: function(e) {//元素点击
                if (document.all) e.click();
                else if (document.createEvent) {
                    var ev = document.createEvent('MouseEvents');
                    ev.initEvent('click', false, true);
                    e.dispatchEvent(ev);
                };
            }
        },
        cancelBubble: function(evt) {//取消冒泡
            evt = evt || window.event;
            if (window.event) evt.cancelBubble = true;
            else evt.stopPropagation();
        }
    }, false);
    Snda.extend(Snda, {
        Ajax: function() {
            this.xml = false;
            this.GetXmlHttp = function() {
                try { this.xml = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {
                    try { this.xml = new ActiveXObject("Microsoft.XMLHTTP"); }
                    catch (e2) { this.xml = false; };
                };
                if (!this.xml && typeof XMLHttpRequest != 'undefined') this.xml = new XMLHttpRequest();
            };
            this.httpSuccess = function(r) {
                try {
                    return !r.status && location.protocol == "file:" ||
                           (r.status >= 200 && r.status < 300) ||
                           r.status == 304 ||
                           navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined";
                } catch (e) { };
                return false;
            };
            this.httpData = function(r, type) {
                var ct = r.getResponseHeader("content-type");
                var data = !type && ct && ct.indexOf("xml") >= 0;
                data = type == "xml" || data ? r.responseXML : r.responseText;
                if (type == "script") eval.call(window, data);
                return data;
            };
            this.GetXmlHttp();
            var xmlHttp = this.xml, ajax = this, requestDone = false, _json = {};
            this.updatePage = function() {
                if (xmlHttp && xmlHttp.readyState == 4 && !requestDone) {
                    if (ajax.httpSuccess(xmlHttp)) _json.onSuccess(ajax.httpData(xmlHttp, _json.type));
                    else _json.onError();
                    _json.onComplete();
                    xmlHttp = null;
                };
                if (requestDone) throw new Error("请求超时");
            };
            this.invoke = function(options) {
                _json = {
                    type: options.type || "POST",
                    op: options.op || '-1',
                    url: options.url || "",
                    timeout: options.timeout || 5000,
                    onComplete: options.onComplete || function() { },
                    onError: options.onError || function() { },
                    onSuccess: options.onSuccess || function() { },
                    data: options.data || {}
                };
                if (xmlHttp) {
                    setTimeout(function() { requestDone = true; }, _json.timeout);
                    if (_json.type.toUpperCase() == "GET") {
                        _json.url += "?opName=" + _json.op + "&" + Snda.Ajax.toQueryString(_json.data);
                        xmlHttp.onreadystatechange = ajax.updatePage;
                        xmlHttp.open("GET", _json.url, true);
                        xmlHttp.setRequestHeader("CMFUAJAX-Ver", "ver1.0");
                        xmlHttp.send(null);
                    } else {
                        _json.url += "?opName=" + _json.op;
                        var _p = Snda.Ajax.toQueryString(_json.data);
                        xmlHttp.onreadystatechange = ajax.updatePage;
                        xmlHttp.open("POST", _json.url, true);
                        xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                        xmlHttp.setRequestHeader("CMFUAJAX-Ver", "ver1.0");
                        xmlHttp.setRequestHeader("Content-length", _p.length);
                        xmlHttp.send(_p);
                    };
                };
            };
        }
    }, false);
    Snda.Ajax.toQueryString = function(a) {
        var s = [];
        if (a.constructor == Array) for (var i = 0; i < a.length; i++) s.push(a[i].name + "=" + escape(a[i].value));
        else for (var j in a) s.push(j + "=" + escape(a[j]));
        return s.join("&");
    };
    Snda.Suggest = {//下拉提示
        _config: {//
            id: 'txtwords',
            bid: '书号',
            bname: '书名',
            tbv: '书号/书名/作者/标签',
            T1: '<iframe height="100%" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" ></iframe><div class="cont_box"><ul><li class="tit" id="liTitle" style="display:none;"><span class="bk">{1}</span><span class="bn">{0}</span></li></ul></div>'
        },
        Init: function() {//初始化
            var _ao = {}; //下拉提示目标框
            var _div = document.createElement('div');
            return {
                Event: function(id, config) {
                    Snda.extend(Snda.Suggest._config, config);
                    Snda.Suggest._config.T1 = Snda.Suggest._config.T1.Format(Snda.Suggest._config.bid, Snda.Suggest._config.bname);
                    _ao = $(id);
                    _div.className = 'autocompletelist';
                    _div.id = "div_drl_" + Math.floor(Math.random() * 10000000000);
                    _div.$cache = {}; //查询缓存
                    _div.$index = 1; //方向选择序列
                    _div.$search = ''; //搜索值
                },
                onSucess: function(data) {//请求成功回调
                    try {
                        if (typeof data == 'string') {
                            data = eval(data);
                            data = eval(data.replace('var dataSource=', ''))
                        }
                    } catch (e) { return false; };
                    if (data.error || data.length < 1) {
                        Snda.Suggest.Init.OnBlur(); return false;
                    }
                    _div.$cache[_div.$search] = data; //插入缓存
                    Snda.Suggest.Init.Create(data);
                },
                Create: function(data) {//填充容器
                    if (data.error) return false;
                    _div.innerHTML = Snda.Suggest._config.T1; //填充外框
                    var _li = _div.getElementsByTagName('li')[0]; //获取填充的首元素
                    _div.$first = _li;
                    for (var i = 0; i < data.length; i += 1) {
                        var _tl = Snda.Suggest.Init.CreateLi(i);
                        _tl.appendChild(Snda.Suggest.Init.CreateSpan(data[i].content, 'bk', _tl));
                        if (new RegExp("^[0-9]*$").test(_div.$search) == true) _tl.appendChild(Snda.Suggest.Init.CreateSpan(data[i].hints, 'bn', _tl));
                        _li.parentNode.appendChild(_tl);
                    };
                    document.body.appendChild(_div); //填充显示位置
                    var _xy = Snda.Suggest.Init.GetXY($("txtwords"), _div.id);
                    _div.style.left = _xy.x;
                    _div.style.top = _xy.y;
                    if (new RegExp("^[0-9]*$").test(_div.$search) == true) $("liTitle").style.display = "";
                },
                CreateLi: function(i) {//Li元素创建
                    var _tl = document.createElement('li');
                    _tl.$index = i + 1;
                    var MoveLi = function() {//鼠标数据移动
                        for (var i = 1, j = _tl.parentNode.childNodes.length; i < j; i += 1)
                            if (_tl.parentNode.childNodes[i] === _tl) {
                            _tl.className = 'gb';
                            _div.$index = _tl.$index;
                            _ao.value = _tl['bk'].innerText || _tl['bk'].textContent;
                        } else _tl.parentNode.childNodes[i].className = '';
                    };
                    Snda.Utility.Event.addEventHandler(_tl, 'mouseover', MoveLi, false);
                    Snda.Utility.Event.addEventHandler(_tl, 'mouseout', MoveLi, false);
                    return _tl
                },
                CreateSpan: function(value, className, li) {//bn bk 
                    var _span = document.createElement('span');
                    _span.className = className;
                    _span.innerHTML = value;
                    Snda.Utility.HightLightElement(_span, _div.$search, 'hightlight'); //高亮关键字
                    li[className] = _span; //缓存span到li内
                    return _span;
                },
                DefaultfindPosX: function(obj) {
                    var curleft = 0;
                    if (obj && obj.offsetParent) {
                        while (obj.offsetParent) {
                            curleft += obj.offsetLeft;
                            obj = obj.offsetParent;
                        };
                    } else if (obj && obj.x) curleft += obj.x;
                    return curleft;
                },
                DefaultfindPosY: function(obj) {
                    var curtop = 0;
                    if (obj && obj.offsetParent) {
                        while (obj.offsetParent) {
                            curtop += obj.offsetTop;
                            obj = obj.offsetParent;
                        };
                    } else if (obj && obj.y) curtop += obj.y;
                    return curtop;
                },
                GetXY: function(obj, Layers) {
                    var left = Snda.Suggest.Init.DefaultfindPosX(obj);
                    $(Layers).style.left = left + "px";
                    var top = Snda.Suggest.Init.DefaultfindPosY(obj) + 20;
                    $(Layers).style.top = top + "px";
                    return { x: left, y: top }
                },
                GetAbsolutePos: function(el) {
                    var r = { x: el.offsetLeft, y: el.offsetTop };
                    if (el.offsetParent) {
                        var tmp = Snda.Suggest.Init.getAbsolutePos(el.offsetParent);
                        r.x += tmp.x;
                        r.y += tmp.y;
                    }
                    return r;
                },
                OnKeyUp: function(evt) {//查询
                    evt = evt || window.event;
                    _ao = Snda.Utility.Event.getCurrentElem(evt);
                    var keycode = evt.keyCode;
                    var _invalidKeyCode = [13, 38, 40, 27, 9, 17, 16];
                    for (var key in _invalidKeyCode) {
                        if (keycode == _invalidKeyCode[key])
                            return false;
                    };
                    if (_ao.value.Trim().length != 0) {//查询不为空
                        _div.$search = _ao.value.Trim(); //插入查询数据到闭包值
                        if (_div.$cache[_div.$search]) Snda.Suggest.Init.onSucess(_div.$cache[_div.$search]); //缓存存在
                        else new Snda.Ajax().invoke({ op: 'GetSosuBookInfo', type: 'get', url: "http://" + window.location.host + '/ajaxcom.aspx', data: { keyword: _div.$search, type: $('searchtype').value }, onSuccess: Snda.Suggest.Init.onSucess });
                    }
                    else {
                        Snda.Suggest.Init.OnBlur();
                    };
                    Snda.Utility.cancelBubble(evt); //取消冒泡
                },
                OnBlur: function() {//失去焦点
                    try {
                        _div.parentNode.removeChild(_div); //移除提示
                        _div.$index = 0; //重置序列
                    } catch (e) { };
                },
                OnKeyDown: function(evt) {//方向键
                    evt = window.event || evt;
                    var _o = evt.srcElement || evt.target;
                    if (_ao != _o) return true;
                    var SetStyle = function() {//样式设置
                        for (var i = 1; i < _ul.childNodes.length; i++) {
                            if (i === _div.$index) {
                                _ul.childNodes[i].className = 'gb';
                                _ao.value = _ul.childNodes[i].childNodes[0].innerText || _ul.childNodes[i].childNodes[0].textContent;
                            } else _ul.childNodes[i].className = ''
                        };
                    };
                    var UP = function() {//上翻
                        _div.$index--;
                        if (_div.$index < 1) _div.$index = _ul.childNodes.length - 1;
                        SetStyle();
                    };
                    var DOWN = function() {//下翻
                        if (_div.$index >= _ul.childNodes.length) _div.$index = 1;
                        SetStyle();
                        _div.$index++;
                    };
                    if ($(_div.id)) {//查询框存在
                        var _ul = _div.$first.parentNode;
                        switch (evt.keyCode) {
                            case 38: UP(); break; //上
                            case 40: DOWN(); break; //下
                            default: break;
                        };
                    };
                    Snda.Utility.cancelBubble(evt); //取消冒泡
                },
                SetTxtWordsNoValue: function() {
                    if (_ao.value == Snda.Suggest._config.tbv) {
                        _ao.value = "";
                        _ao.style.color = "";
                    };
                },
                SetTxtWordsValue: function() {
                    if (_ao.value == "") {
                        _ao.value = Snda.Suggest._config.tbv;
                        _ao.style.color = "Gray";
                    };
                }
            };
        } (),
        Bind: function(data) {//绑定事件显示
            if (!data.id)
                data.id = 'txtwords';
            var $o = $(data.id);
            $o.setAttribute("AutoComplete", "off");
            Snda.Suggest.Init.Event(data.id, data);
            Snda.Utility.Event.addEventHandler($o, 'keyup', Snda.Suggest.Init.OnKeyUp, false);
            Snda.Utility.Event.addEventHandler($o, 'blur', Snda.Suggest.Init.OnBlur, false);
            Snda.Utility.Event.addEventHandler(document.body, 'keydown', Snda.Suggest.Init.OnKeyDown, false);
            Snda.Utility.Event.addEventHandler($o, 'click', Snda.Suggest.Init.SetTxtWordsNoValue, false);
            Snda.Utility.Event.addEventHandler($o, 'blur', Snda.Suggest.Init.SetTxtWordsValue, false);
        }
    };
})();