/*
 *   商城全局脚本文件 , 仅依赖 seed-min.js
 *   1. 载入公共功能脚本         tlab，webww，poc，test，minicart，mpp
 *   2. 初始化吊顶                   login-info    quick-menu
 *   3. 提供全局实用api          loginStateReady，memberInfoReady
 *    modified by  墨冥          moming.lq@taobao.com  2011年12月20日16:02:26
 */

var TB = KISSY.app('TB');   //  定义全局名称空间

TB.add('mod~global', function() {
    var S = KISSY;
    /*
     全局变量
     */
    TB.loginHttp = "https";                       // 登录协议控制变量
    TB._isLoginStatusReady = false;         // 登录状态是否就绪
    TB._loginStatusReadyFnList = [];        //  登录状态就绪回调函数队列
    TB._isMemberInfoReady = false;        //  会员信息是否准备就绪
    TB._memberInfoReadyFnList = [];      //   会员信息准备就绪回调函数队列
    TB.userInfo = {                                    //   用户信息
        memberInfo:{}                                //   会员信息
    };
    TB.environment = {                          //   环境信息
        islxshow: window.location.hostname.indexOf("lxshow.com") > -1 || window.location.hostname.indexOf("lxshow.net") > -1,
        isDaily: window.location.hostname.indexOf("daily.taobao.net") > -1 || window.location.hostname.indexOf("daily.lxshow.net") > -1,
        isHttps: window.location.href.indexOf("https://") === 0
    };
    /*
     局部变量
     */
    var isIE76 = !'0'[0], isIE6 = isIE76 && !window.XMLHttpRequest, isIE = !!window.ActiveXObject;    //    浏览器版本
    var win = window, doc = document, domain = doc.domain,  siteNavElem;                                     //     浏览器内置对象
    var IS_lxshow = domain.indexOf('lxshow.com') > -1,IS_DAILY = !(domain.indexOf('taobao.com') > -1 || IS_lxshow), HOSTNAME = IS_DAILY ? '.daily.taobao.net' : '.taobao.com';
    var assetsHost = IS_DAILY ? 'assets.daily.taobao.net' : 'a.tbcdn.cn', urlConfig = S.unparam(location.search.substring(1)), APPID = 'g_config' in win ? ('appId' in win['g_config'] ? parseInt(win['g_config']['appId']) : undefined) : undefined;        //  配置变量
    var isHTTPS = (doc.location.href.indexOf("https://") === 0);                                     //     环境变量
    var SPACE = ' ', HOVER = 'hover', EMPTY = '',MINICART_CLS = 'mini-cart', MINICART_NO_LAYER_CLS = 'mini-cart-no-layer';         //     字符常量
    var COOKIES = {};           //  cookie
    var runItems = {             //  初始化执行队列
        /**
         * 顶通
         */
        siteNav: function() {
            if (!siteNavElem)
                return;
            siteNavElem.setAttribute("role", "navigation");
            S.each(getElementsByClassName('sn-menu', '*', siteNavElem), function(el) {
                TB.Global._addMenu(el);
            });
            // 监听顶部搜索提交
            var form = doc.forms['topSearch'];
            addEvent(form, 'submit', function() {
                if (form['q'].value == EMPTY) { // 空搜索，跳转到我要买
                    form.action = 'http://list.taobao.com/browse/cat-0.htm';
                }
            });

            // 购物车登陆前置
            var cartElem = getElementsByClassName('cart', 'li', siteNavElem)[0];
            addEvent(cartElem, 'click', function(e) {
                var tg = e.target || e.srcElement;
                if (tg.nodeName != 'A' && tg.parentNode.nodeName === 'A') {
                    tg = tg.parentNode;
                }
                if (tg.nodeName === 'A' && tg.href.indexOf('my_cart.htm') > -1) {
                    preventDefault(e);
                    removeClass(cartElem, 'hover');
                    TB.Cart && TB.Cart.redirect(tg, tg.href);
                    if (win.MiniCart) {
                        win.MiniCart._clicked = false;
                    }
                }
            });
        },

        /**
         * WebWW (tdog)
         */
        tDog: function() {
            // 加载 webww js 的开关：
            // （url 中有 tstart/tdog 参数） 或 （有 g_config 全局变量，且 appId 值不为 -1）
            if ((APPID && APPID != -1) || 'tstart' in urlConfig || 'tdog' in urlConfig) {
                var url = 'http://' + assetsHost + '/p/header/webww-min.js?t=20111206.js', times = 0;
                S.ready(function() {
                    if (S.DOM) {
                        S.getScript(url);
                    }
                    else {
                        if (times < 10) {
                            setTimeout(arguments.callee, 1000);
                            times++;
                        }
                        // 如果实在没有 ks-core
                        else {
                            S.use('core', function() {
                                S.getScript(url);
                            });
                        }
                    }
                });
            }
        },

        /**
         * 淘宝实验室
         * cc @macji xiaomacji@gmail.com
         */
        tLabs: function() {
            // 没有登录, return 流程见 http://img03.taobaocdn.com/tps/i3/T1EAigXlXhXXXXXXXX-660-673.png
            //if (!TB.Global.isLogin()) return;
            if (location.href.indexOf("tms.taobao.com") !== -1)
                return;

            S.ready(function() {
                var url = 'http://' + assetsHost + '/p/tlabs/1.0.0/tlabs-min.js?t=1.0.0.js', nick = getCookie('_nk_') || getCookie('tracknick');
                nick = encodeURIComponent(escapeHTML(unescape(nick.replace(/\\u/g, '%u'))));
                S.getScript(url, function() {
                    if (typeof TLabs !== 'undefined') {
                        TLabs.init({
                            nick: nick
                        });
                    }
                });
            });
        },

        /**
         * POC Monitor
         *
         * @author Macji xiaohu@taobao.com
         */
        POCMonitor: function() {
            var _poc = win['_poc'] || [], option, i = 0, config = [
                ['_setStartTime', (win['g_config'] || 0).startTime || win['HUBBLE_st'] || win['g_ks_monitor_st']],
                ['_setAccount', (win['g_config'] || 0).appId]
            ], rate = 10000; // 设置命中率
            while ((option = _poc[i++])) {
                if (option[0] === '_setRate') {
                    rate = option[1];
                }
                else
                if (option[0] === '_setAccount') {
                    config[0] = option;
                }
                else
                if (option[0] === '_setStartTime') {
                    config[1] = option;
                }
                else {
                    config.push(option);
                }
            }

            // 有帐号 && 命中
            if (config[0][1] && parseInt(Math.random() * rate) === 0) {
                win['_poc'] = config;
                S.getScript('http://a.tbcdn.cn/p/poc/m.js?0.0.1.js');
            }
        },

        /**
         *   daily环境中替换页头链接taobao.com/lxshow.com为daily.taobao.net/daily.lxshow.net
         */
        initHeaderLinks: function() {
            if (domain.indexOf('daily') === -1)
                return;
            var els = siteNavElem ? siteNavElem.getElementsByTagName('a') : [];
            for (var i = 0; i < els.length; i++) {
                if (els[i].href.indexOf("register") === -1 && els[i].href.indexOf(".php")) {
                    els[i].href = els[i].href.replace('taobao.com', 'daily.taobao.net').replace('lxshow.com', 'daily.lxshow.net');
                }
            }
        },


        /**
         * 初始化登出链接
         */
        initLogout: function() {
            /* 如果用户已登录，给[退出]链接注册事件，先发送注销请求到alipay，避免窜号bug */
            var logoutEl = doc.getElementById('#J_Logout');
            if (!logoutEl)
                return;
            addEvent(logoutEl, 'click', function(ev) {
                ev.halt();

                var logoutUrl = logoutEl.href;

                new Image().src = '//taobao.alipay.com/user/logout.htm';
                setTimeout(function() {
                    location.href = logoutUrl;
                }, 20);
            });
        },

        /**
         * 前端单元测试框架载入
         */
        test: function() {
            var loaded = false;
            var load = function() {
                if (loaded)
                    return;
                loaded = true;
                if (location.href.indexOf('__cloudyrun__') > -1) {
                    S.getScript('http://assets.daily.taobao.net/p/cloudyrun/1.0/cloudyrun-taobao-pkg.js?t=' + (+new Date()));
                }
            };
            S.ready(load);
            setTimeout(load, 4000);
        },

        assist: function() {
            if (getCookie('test_accouts') && document.domain.indexOf('taobao.net') > -1) {
                S.ready(function() {
                    S.getScript('http://assets.daily.taobao.net/p/assist/login/login.js');
                });
            }
        },

        /**
         * 初始化 mini 购物车
         * @author 乔花<qiaohua@taobao.com>
         */
        miniCart: function() {
            var TG = TB.Global;
            if (TG._OFF)
                return;
            if (TB.environment.isApp && TB.environment.passCookie) {
                S.getScript('http://www' + HOSTNAME + '/go/app/lxshow/login-api.php' + '?t=' + S.now());
            }
        },

        /**
         * 全局载入 tb-mpp.js 脚本
         * 20110831 qiaohua: 暂时注释掉
         */

        mpp: function() {
            S.getScript('http://' + assetsHost + '/p/tstart/1.0/build/tb-mpp-min.js?t=201107210.js', {
                success: function() {
                    // 安全中心推送消息, 使用mpp接口
                    S.ready(function() {
                        // 未登录的不需要提示安全信息
                        if (!TB.Global.isLogin())
                            return;

                        //type 填 1010, subType 1, java 和 js 都用此参数, 由消息通道分配的参数.
                        Mpp.Notify.register({
                            appId: 1010,
                            type: 1,
                            callback: function() {
                                /*这儿是消息回调所要求，用JSONP取回消息实体*/
                                S.getScript('http://' + (IS_DAILY ? 'webww.daily.taobao.net:8080' : 'webwangwang.taobao.com') + '/getOtherSystem.do?callback=TB.Global.setUserMsg&t=' + S.now())
                            }
                        });
                    });
                }
            });
        }

    };

    /**
     *      延时加载某些公用功能 ，加快首屏加载速度             by yubo 20110817
     */
    var lazyItems = ['tDog', 'tLabs', 'test', 'mpp'];
    for (var i = 0; i < lazyItems.length; i++) {
        (function(item) {
            var old = runItems[item];
            runItems[item] = function() {
                setTimeout(old, 1000);
            }
        })(lazyItems[i]);
    }

    /*
     *   全局API入口：       init / writeLoginInfo /   loginStatusReady /  memberInfoReady
     */

    TB.Global = {

        /**
         * 初始化 Global 模块
         */

        init: function(cfg) {
            siteNavElem = doc.getElementById('site-nav');
            // minicart 开关标志
            this._OFF = !!!siteNavElem;
            this.config = cfg;
            if (cfg && cfg.mc && cfg.mc === -1)
                this._OFF = true;

            // 页面被嵌入时, 不需要进行初始化
            if (window.top !== window.self) {
                this._OFF = true;
            }

            // aria 中记录所有菜单
            this._subMenus = [];

            for (var k in runItems) {
                runItems[k]();
            }
        },

        /*
         *  写入吊顶左侧登录信息     墨冥      2011年11月3日15:36:02
         */
        writeLoginInfo: function(config) {
            siteNavElem = doc.getElementById('site-nav');
            if (!siteNavElem)
                return;
            var defaultConfig = {
                isApp: false,
                passCookie: true,
                loginServer: "http://login.lxshow.com",
                logoutServer: "https://login.taobao.com/member/logout.jhtml",
                registerServer: "http://register.lxshow.com/",
                spaceServer: "http://jianghu.taobao.com/admin/home.htm",
                memberServer:"http://vip.lxshow.com/member/index.htm"
            };
            config = S.merge(defaultConfig, config);
            TB.environment.isApp = config.isApp;
            TB.environment.passCookie = config.passCookie;
            var TG = TB.Global;
            TG._initLoginStatus();
            TG.loginStatusReady(function(userInfo) {
                var loginUrl = config.loginServer;
                var defaultRedirectUrl = location.href;
                if (/^http.*(\/member\/login\.jhtml)$/i.test(defaultRedirectUrl)) {
                    defaultRedirectUrl = "";
                }
                var redirectUrl = config.redirectUrl || defaultRedirectUrl;
                if (redirectUrl) {
                    if (TB.environment.isDaily) {
                        loginUrl = "http://login.daily.taobao.net/member/login.jhtml";
                    }
                    loginUrl += "?redirect_url=" + encodeURIComponent(redirectUrl);
                }
                var spaceUrl = config.spaceServer;
                var memberUrl = config.memberServer;
                var registerUrl = config.registerServer;
                var logoutUrl = config.logoutServer + "?f=top&redirectURL=http://login.lxshow.com/?redirect_url=" + encodeURIComponent("" + encodeURIComponent(redirectUrl));
                if (TB.environment.isDaily) {
                    spaceUrl = "http://jianghu.daily.taobao.net/admin/home.htm";
                    memberUrl = "http://vip.daily.lxshow.net/member/index.htm";
                    registerUrl += "?isDaily=1";
                    logoutUrl = "https://login.daily.taobao.net/member/logout.jhtml?f=top&redirectURL=https://login.daily.taobao.net/member/login.jhtml?redirect_url%3D" + encodeURIComponent("" + encodeURIComponent(redirectUrl));
                }
                spaceUrl += "?t=" + S.now();
                memberUrl += "?spm=2001.1.2.1";
                var container = document.getElementById("login-info");
                if (!container)
                    return;
                var loginInfoHTML = "";
                if (userInfo.isLogin) {
                    loginInfoHTML = '您好，<a target="_top" href="' + spaceUrl + '" class="j_UserNick sn-user-nick">' + userInfo.nick + '</a>！<a class="j_Identity sn-identity activated hidden" title="lxshow人" target="_top" href="' + memberUrl + '"></a><a class="j_Point sn-point hidden" target="_top" href="http://jifen.lxshow.com/?spm=2001.1.1.1">积分<span class="j_PointValue sn-point-value">0</span></a><span class="j_Message sn-message hidden"><a target="_top" href="http://vip.lxshow.com/member/index.htm?layer=messagebox&amp;spm=2001.1.6.1" class="j_MessageText sn-msg-text">消息</a><a target="_top" href="http://vip.lxshow.com/member/index.htm?layer=messagebox&amp;spm=2001.1.6.1" class="j_MessageNum sn-msg-num">0</a><span class="sn-msg-box  j_MesssageBox hidden"><span class="sn-msg-hd"></span><span class="sn-msg-bd"><a href="#" class="j_MessageTitle sn-msg-title">加入lxshow俱乐部</a><b class="j_CloseMessage sn-msg-close">&times;</b></span></span></span><a class="sn-logout" target="_top" href="' + logoutUrl + '" id="J_Logout">退出</a>';
                    container.innerHTML = loginInfoHTML;
                    if (isIE6) {
                        var userNickNode = getElementByClassName("j_UserNick", siteNavElem);
                        if (userNickNode.offsetWidth > 90) {
                            userNickNode.style.width = 90;
                        }
                    }
                    TG._initMemberInfo();
                    TG.memberInfoReady(function(userInfo) {
                        var memberInfo = userInfo.memberInfo;
                        if (!memberInfo || !memberInfo.login)
                            return;
                        if (memberInfo.activeStatus != -99) {
                            var identityNode = getElementByClassName("j_Identity", siteNavElem);
                            if (memberInfo.activeStatus == 1) {
                                addClass(identityNode, "activated");
                            }
                            else {
                                addClass(identityNode, "unactivated");
                            }
                            removeClass(identityNode, "hidden");
                        }
                        if (memberInfo.availablePoints != -99) {
                            var userPointNode = getElementByClassName("j_PointValue", siteNavElem);
                            userPointNode.innerHTML = formatPoint(memberInfo.availablePoints);
                            var pointNode = getElementByClassName("j_Point", siteNavElem);
                            removeClass(pointNode, "hidden");
                        }
                        if (memberInfo.newMessage > 0 && memberInfo.lastMessage && memberInfo.lastMessageUrl) {
                            getElementByClassName("j_MessageText", siteNavElem).href = memberInfo.lastMessageUrl + "&spm=2001.1.6.1";
                            getElementByClassName("j_MessageNum", siteNavElem).href = memberInfo.lastMessageUrl + "&spm=2001.1.6.1";
                        }
                        if ((memberInfo.newMessage || memberInfo.newMessage == 0) && memberInfo.newMessage != -99) {
                            var messageNumNode = getElementByClassName("j_MessageNum", siteNavElem);
                            if (memberInfo.newMessage <= 99) {
                                messageNumNode.innerHTML = memberInfo.newMessage;
                            }
                            else {
                                messageNumNode.innerHTML = "99+";
                            }
                            var messageNode = getElementByClassName("j_Message", siteNavElem);
                            removeClass(messageNode, "hidden");
                        }

                        if (memberInfo.newMessage > 0 && memberInfo.messagePopup && memberInfo.lastMessage) {
                            var messageBoxNode = getElementByClassName("j_MesssageBox", siteNavElem);
                            var messageTitleNode = getElementByClassName("j_MessageTitle", siteNavElem);
                            var closeNode = getElementByClassName("j_CloseMessage", siteNavElem);
                            messageTitleNode.innerHTML = memberInfo.lastMessage;
                            messageTitleNode.href = memberInfo.lastMessageUrl;
                            addEvent(closeNode, "click", function(e) {
                                var closeMessageUrl = "http://tmm.taobao.com/member/close_message_popup.do";
                                if (TB.environment.isDaily) {
                                    closeMessageUrl = "http://tmm.daily.taobao.net/member/close_message_popup.do";
                                }
                                closeMessageUrl += "?callback=_closeMessageCallback&t=" + S.now();
                                window._closeMessageCallback = function() {
                                    addClass(messageBoxNode, "hidden");
                                };
                                S.getScript(closeMessageUrl);
                            });
                            removeClass(messageBoxNode, "hidden");
                        }

                        function formatPoint(point) {
                            var pointStr = "";
                            if (point >= 0 && point < 10000) {
                                pointStr = point;
                            }
                            else if (point == 10000) {
                                pointStr = "1万";
                            }
                            else if (point < 100000) {
                                pointStr = parseInt(point / 1000) / 10 + "万";
                                if (point % 1000 > 0) {
                                    pointStr += "+";
                                }
                            } else if (point < 1000000) {
                                pointStr = parseInt(point / 10000) + "万";
                                if (point % 10000 > 0) {
                                    pointStr += "+";
                                }
                            } else if (point < 10000000) {
                                pointStr = parseInt(point / 1000000) + "百万";
                                if (point % 1000000 > 0) {
                                    pointStr += "+";
                                }
                            } else if (point < 100000000) {
                                pointStr = parseInt(point / 10000000) + "千万";
                                if (point % 10000000 > 0) {
                                    pointStr += "+";
                                }
                            }
                            else {
                                pointStr = parseInt(point / 100000000) + "亿";
                                if (point % 100000000 > 0) {
                                    pointStr += "+";
                                }
                            }
                            return pointStr;
                        }
                    });
                }
                else {
                    loginInfoHTML = '亲，欢迎来天猫！<a class="sn-login" href="' + loginUrl + '" target="_top">请登录</a><a class="sn-register" href="' + registerUrl + '" target="_top">免费注册</a>';
                    container.innerHTML = loginInfoHTML;
                }
            });
        },
        /*
         *      初始化登录状态
         */
        _initLoginStatus:function() {
            var TG = TB.Global;
            if (TB.environment.isApp && TB.environment.passCookie) {
                TB.userInfo.isLogin = (getCookie("login") == "true" || !!getCookie("_l_g_"));
                TB.userInfo.nick = escapeHTML(unescape(getCookie("_nk_").replace(/\\u/g, "%u")));
                TG._fireLoginStatusReadyFnList();
            }
            else {
                var apiUrl = "http://www.taobao.com/go/app/lxshow/login-api.php";
                if (TB.environment.isDaily) {
                    apiUrl = "http://www.daily.taobao.net/go/app/lxshow/login-api.php"
                }
                apiUrl += '?' + Math.random();
                S.getScript(apiUrl, function() {
                    var tricknick = userCookie['tracknick'];
                    var uc1 = userCookie['uc1']; // user cookie 用户的配置信息
                    TB.userInfo.nick = escapeHTML(unescape((userCookie['_nk_'] || tricknick).replace(/\\u/g, "%u")));
                    TB.userInfo.isLogin = !!(userCookie['_l_g_'] && TB.userInfo.nick || userCookie['ck1'] && tricknick);
                    TG._fireLoginStatusReadyFnList();
                });
            }
        },

        /*
         *   登录状态就绪回调方法注册       墨冥        2011年12月19日11:38:10
         */

        loginStatusReady: function(fn) {
            if (TB._isLoginStatusReady) {
                fn.call(window, TB.userInfo)
            }
            else {
                if (TB._loginStatusReadyFnList) {
                    TB._loginStatusReadyFnList.push(fn);
                }
            }
        },
        /*
         触发登录状态就绪执行回调函数队列
         */
        _fireLoginStatusReadyFnList:function() {
            if (TB._isLoginStatusReady) {
                return;
            }
            TB._isLoginStatusReady = true;
            if (TB._loginStatusReadyFnList) {
                for (var i = 0; i < TB._loginStatusReadyFnList.length; i++) {
                    TB._loginStatusReadyFnList[i].call(window, TB.userInfo);
                }
            }
        },

        /*
         *     初始化会员信息              墨冥     2011年12月19日16:08:14
         */

        _initMemberInfo:function() {
            var TG = TB.Global;
            var memberInfoUrl = "http://tmm.taobao.com/member/query_member_top.do";
            if (TB.environment.isDaily) {
                memberInfoUrl = "http://tmm.daily.taobao.net/member/query_member_top.do";
            }
            memberInfoUrl += "?callback=_initMemberInfoCallback&t=" + S.now();
            window._initMemberInfoCallback = function(data) {
                TB.userInfo.memberInfo = data;
                TG._fireMemberInfoReadyFnList();
            };
            S.getScript(memberInfoUrl);
        },
        /*
         *   会员信息就绪回调方法注册       墨冥        2011年12月19日11:38:10
         */
        memberInfoReady: function(fn) {
            if (TB._isMemberInfoReady) {
                fn.call(window, TB.userInfo)
            }
            else {
                if (TB._memberInfoReadyFnList) {
                    TB._memberInfoReadyFnList.push(fn);
                }
            }
        },
        /*
         触发会员信息准备就绪执行回调函数队列
         */

        _fireMemberInfoReadyFnList:function() {
            if (TB._isMemberInfoReady) {
                return;
            }
            TB._isMemberInfoReady = true;
            if (TB._memberInfoReadyFnList) {
                for (var i = 0; i < TB._memberInfoReadyFnList.length; i++) {
                    TB._memberInfoReadyFnList[i].call(window, TB.userInfo);
                }
            }
        },

        /*
         快捷菜单hover效果
         */

        // aria support by 承玉
        _addMenu: function(el) {
            if (!el)
                return;
            var self = this, el_hd = getElementsByClassName('menu-hd', '*', el)[0], el_bd = getElementsByClassName('menu-bd', '*', el)[0];

            if (!el_bd || !el_hd)
                return;

            el_hd.tabIndex = 0;
            self._subMenus.push(el_bd);

            el_bd.setAttribute("role", "menu");
            el_bd.setAttribute("aria-hidden", "true");

            if (!el_bd.getAttribute("id")) {
                el_bd.setAttribute("id", S.guid("menu-"));
            }

            el_hd.setAttribute("aria-haspopup", el_bd.getAttribute("id"));
            el_hd.setAttribute("aria-label", "右键弹出菜单，tab键导航，esc关闭当前菜单");

            // 添加 iframe shim 层
            // 在 https 页面，当 iframe 的 src 设为 about:blank 会使得 IE 弹出"安全确认框"，而
            // 登陆注册页的下拉覆盖区域并没有 SELECT 元素需要覆盖，所以在这些页面中不创建对应的 iframe
            var iframe = false;
            if (!isHTTPS && isIE6) {
                iframe = doc.createElement('iframe');
                iframe.src = 'about: blank';
                iframe.className = 'menu-bd';
                el.insertBefore(iframe, el_bd);
            }

            //var prt = el.parentNode;
            addEvent(el, 'mouseover', function(event) {
                // Check if mouse(over|out) are still within the same parent element
                var parent = event.relatedTarget;

                // Traverse up the tree
                while (parent && parent !== el) {
                    parent = parent.parentNode;
                }

                if (parent !== el) {
                    S.each(self._subMenus, function(submenu) {
                        if (submenu !== el_bd) {
                            removeClass(submenu.parentNode, HOVER);
                            submenu.setAttribute("aria-hidden", "true");
                        }
                    });

                    //addClass(prt, HOVER);
                    addClass(el, HOVER);
                    el_bd.setAttribute("aria-hidden", "false");

                    if (!iframe)
                        return;
                    // 只有 menulist 显示出来后，才能获取 offset 值
                    // 高度减 5 是因为 ie6 下，iframe 处理 padding - bottom 的一个 bug
                    iframe.style.height = parseInt(el_bd.offsetHeight) + 25 + 'px';
                    iframe.style.width = parseInt(el_bd.offsetWidth) + 1 + 'px';
                }
            });

            addEvent(el, 'mouseout', function(event) {
                // Check if mouse(over|out) are still within the same parent element
                var parent = event.relatedTarget;

                // Traverse up the tree
                while (parent && parent !== el) {
                    parent = parent.parentNode;
                }

                if (parent !== el) {
                    removeClass(el, HOVER);

                    el_bd.setAttribute("aria-hidden", "true");

                    // 浮层隐藏后, 将 el 包含的 input 去除焦点
                    S.each(el_bd.getElementsByTagName('input'), function(el) {
                        if (el.getAttribute('type') !== 'hidden') {
                            el.blur();
                        }
                    });
                }
            });

            addEvent(el, 'keydown', function(event) {
                var key = event.keyCode;
                // esc
                if (key == 27 || key == 37 || key == 38) {
                    removeClass(el, HOVER);
                    el_bd.setAttribute("aria-hidden", "true");
                    el_hd.focus();
                    preventDefault(event);
                }
                else
                if (key == 39 || key == 40) {
                    addClass(el, HOVER);
                    el_bd.setAttribute("aria-hidden", "false");
                    preventDefault(event);
                }
            });

            var hiddenTimer;
            addEvent(el, isIE ? "focusin" : "focus", function() {
                if (hiddenTimer) {
                    clearTimeout(hiddenTimer);
                    hiddenTimer = null;
                }
            }, !isIE);

            addEvent(el, isIE ? "focusout" : "blur", function() {
                hiddenTimer = setTimeout(function() {
                    removeClass(el, HOVER);
                    el_bd.setAttribute("aria-hidden", "true");
                }, 100);
            }, !isIE);
        },

        /**
         * 给 lxshow 下运行那些依赖于 cookie 的功能, 包含 mini 购物车, Tlabs
         */
        run: function() {
            var self = this;
            setTimeout(self.initMiniCart,1000);
            //      runItems.tLabs();
        },
        /**
         * 判断是否是登录用户
         * 用户是否已经登录。注意：必须同时判断 nick 值，因为 _nk_ 和 _l_g_ 有时不同步
         */
        isLogin: function() {
            var trackNick = getCookie('tracknick'), nick = getCookie('_nk_') || trackNick;
            return !!(getCookie('_l_g_') && nick || getCookie('ck1') && trackNick);
        },

        /**
         * 吊顶是否具有购物车元素
         */

        getCartElem: function() {
            return siteNavElem && getElementsByClassName('cart', 'li', siteNavElem)[0];
        },

        /**
         * 初始化 mini 购物车
         */
        initMiniCart: function() {
            // 到此 要保证有 cookie or userCookie 值
            var self = this, CARTNUM_API = 'http://cart' + HOSTNAME +
                '/top_cart_quantity.htm?', request = function() {
                // 请求购物车数量
                S.getScript(CARTNUM_API + 'callback=TB.Global.setCartNum' + '&t=' + S.now() + (APPID ? '&appid=' + APPID : EMPTY));
            };
            if (self._OFF = (self._OFF || !!!TB.Global.getCartElem()))
                return;

            var mt = unparam(getCookie('mt')), ci, cp;

            // 读取 cookie 成功
            if (mt && (ci = mt.ci)) {
                ci = ci.split('_');
                cp = parseInt(ci[1]);
                ci = parseInt(ci[0]);
                //  是否关掉, true 为 关掉, false/undefined 为 开启
                self._OFF = ci < 0;

                if (ci < 0) {
                    return;
                }
                if (TB.Global.isLogin()) {
                    if (cp === 0) {
                        request();
                    }
                    else
                    if (cp === 1) {
                        TB.Global.setCartNum(ci);
                    }
                }
                else {
                    if (cp === 0) {
                        TB.Global.setCartNum(ci);
                    }
                    else
                    if (cp === 1) {
                        request();
                    }
                }
            }
            else {
                request();
            }

            //this.cartRedirect('http://www.taobao.com/');
        },

        /**
         * 设置 mini 购物车的数量
         */
        setCartNum: function(num) {
            //  不用this, 而用 TB.Global 是因为 detail 上, 调用 setCartNum 时 this 为 window 了
            if (!S.isNumber(num) || TB.Global._OFF)
                return;

            var trigger = TB.Global.getCartElem();

            if (!trigger)
                return;

            var elem = trigger.getElementsByTagName('a')[0], title = '<span class="mini-cart-line"></span><s></s>' + '购物车', // 在购物车页面, 不显示浮层
                showLayer = APPID !== 19;

            // 数量小于 0 时
            if (num < 0) {
                // 只要有 -1 就表示关闭
                TB.Global._OFF = num === -1;

                elem.innerHTML = title;
                removeClass(trigger, MINICART_CLS);

                win.MiniCart && win.MiniCart.hide();
                return;
            }

            elem.innerHTML = title + '<span class="mc-count' + (num < 10 ? ' mc-pt3' : EMPTY) + '">' + num + '</span>' + '件' + (showLayer ? '<b></b>' : EMPTY);
            elem.href = 'http://ju.atpanel.com/?url=http://cart' + HOSTNAME +
                '/my_cart.htm?from=bmini&ad_id=&am_id=&cm_id=&pm_id=150042785330be233161';
            addClass(trigger, MINICART_CLS);
            if (!showLayer) {
                addClass(trigger, MINICART_NO_LAYER_CLS);
            }
            addClass(trigger, 'menu');
            addClass(elem, 'menu-hd');
            elem.id = 'mc-menu-hd';

            if (win.MiniCart) {
                win.MiniCart.cartNum = num;
                win.MiniCart.isExpired = true;
            }
            else {
                S.ready(function() {
                    var times = 0;
                    S.getScript('http://' + assetsHost + '/p/global/1.0/minicart' + (IS_DAILY ? EMPTY : '-min') + '.js?t=20111215.js', function() {
                        // minicart.js 依赖于 ks-core, 延迟+检测S.DOM是否ok
                        if (S.DOM) {
                            win.MiniCart.init(num, showLayer);
                        }
                        else {
                            if (times < 10) {
                                setTimeout(arguments.callee, 1000);
                                times++;
                            }
                            // 如果实在没有 ks-core
                            else {
                                S.use('core', function() {
                                    win.MiniCart.init(num, showLayer);
                                });
                            }
                        }
                    });
                });
            }
        },

        /**
         * 安全中心的用户提示信息接口回调
         * @param data
         */
        setUserMsg: function(data) {
            if (data.success && data.success === 'true') {
                var DOM = S.DOM;
                if (!DOM)
                    return;

                var loginElem = DOM.get('.login-info', siteNavElem), offset = DOM.offset(loginElem), elem = DOM.get('#gb-msg-notice'), contentElem;
                // 页面上 #gb-msg-notice 元素表示用户消息容器;
                if (!elem) {
                    elem = DOM.create('<div id="gb-msg-notice"><div class="gb-msg-inner gb-msg-info"><p class="gb-msg-content">' +
                        data['result']['messages'][0] +
                        '</p><div class="gb-msg-icon gb-msg-close" title="关闭"></div></div><div class="gb-msg-icon gb-msg-tri"><div class="gb-msg-icon gb-msg-tri-inner"></div></div></div>');
                    DOM.append(elem, siteNavElem.parentNode);
                    DOM.offset(elem, {
                        left: offset.left + 30,
                        top: offset.top + DOM.height(loginElem) + 1
                    });
                    S.Event.on(elem, 'click', function(e) {
                        var t = e.target;
                        if (DOM.hasClass(t, 'gb-msg-close')) {
                            DOM.hide(elem);
                        }
                    });
                }
                else {
                    contentElem = DOM.get('.gb-msg-content', elem);
                    DOM.html(contentElem, data['result']['messages'][0]);
                    DOM.show(elem);
                }
            }
        }
    };

    /*
     *   购物车登陆前置
     */

    TB.Cart = S.merge({}, {

        domain: (document.domain.indexOf('taobao.com') > -1 || document.domain.indexOf('lxshow.com') > -1) ? 'taobao.com' : 'daily.taobao.net',
        API: 'http://cart.%domain%/check_cart_login.htm',
        cache: {},
        popup: null,

        redirect: function(trigger, url) {
            var args = S.makeArray(arguments);
            var func = arguments.callee;
            var self = this;

            if (!S.DOM || !S.Event) {
                S.getScript('http://a.tbcdn.cn/s/kissy/1.1.6/packages/core-min.js', function() {
                    func.apply(self, args);
                });
                return;
            }

            this._addStyleSheetOnce();
            var guid = S.guid();
            this.cache[guid] = S.makeArray(arguments);
            S.getScript(this.API.replace('%domain%', this.domain) + '?callback=TB.Cart.redirectCallback&guid=' + guid, {
                timeout: 4,
                error: function() {
                    location.href = url;
                }
            });
        },

        redirectCallback: function(data) {
            var guid = data.guid;
            var url = S.trim(this.cache[guid][1]);
            if (!data['needLogin']) {
                location.href = url;
                return;
            }
            if (!guid) {
                throw Error('[error] guid not found in callback data');
            }
            if (!this.popup) {
                this.popup = this._initPopup();
            }
            this._initLoginIframe(url);
        },

        hidePopup: function(e) {
            e && e.preventDefault && e.preventDefault();
            S.DOM.css(this.popup, 'visibility', 'hidden');
        },

        showPopup: function() {
            this._centerPopup();
            S.DOM.css(this.popup, 'visibility', 'visible');
        },

        _centerPopup: function() {
            var top = (S.DOM.viewportHeight() - parseInt(S.DOM.css(this.popup, 'height'), 10)) / 2;
            top = top < 0 ? 0 : top;
            S.DOM.css(this.popup, 'top', top);
        },

        _addStyleSheetOnce: function() {
            if (!this._stylesheetAdded) {
                S.DOM.addStyleSheet('' +
                    '#g-cartlogin{position:fixed;_position:absolute;border:1px solid #aaa;left:50%;top:120px;margin-left:-206px;width:412px;height:272px;z-index:10001;background:#fafafa;-moz-box-shadow:rgba(0,0,0,0.2) 3px 3px 3px;-webkit-box-shadow:3px 3px 3px rgba(0,0,0,0.2);filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=3,OffY=3,Color=#16000000,Positive=true);} #g_minicart_login_close{position:absolute;right:5px;top:5px;width:17px;height:17px;background:url(http://img01.taobaocdn.com/tps/i1/T1krl0Xk8zXXXXXXXX-194-382.png) no-repeat -100px -69px;text-indent:-999em;overflow:hidden;}' +
                    '#g-cartlogin-close{cursor:pointer;position:absolute;right:5px;top:5px;width:17px;height:17px;line-height:0;overflow:hidden;background:url(http://img03.taobaocdn.com/tps/i1/T1k.tYXadGXXXXXXXX-146-77.png) no-repeat -132px 0;text-indent:-999em;}' +
                    '');
                this._stylesheetAdded = true;
            }
        },

        _initPopup: function() {
            var popup = S.DOM.create('<div id="g-cartlogin"></div>');
            S.DOM.append(popup, S.DOM.get('body'));
            return popup;
        },

        _initLoginIframe: function(url) {
            var iframeSrc = 'https://login.' + this.domain + '/member/login.jhtml?from=globalcart&style=mini' +
                '&redirectURL=' +
                encodeURIComponent(url) +
                '&full_redirect=true';
            this.popup.innerHTML = '' +
                '<iframe src="' +
                iframeSrc +
                '" width="410" height="270" frameborder="0" scrolling="0"></iframe>' +
                '<span title="关闭" id="g-cartlogin-close">关闭</span>';
            S.Event.on('#g-cartlogin-close', 'click', this.hidePopup, this);
            this.showPopup();
        }

    });

    /**
     *      工具函数
     */

    /**
     * 获取 Cookie
     */
    function getCookie(name) {
        if (win.userCookie && !S.isUndefined(win.userCookie[name])) {
            return win.userCookie[name];
        }

        if (S.isUndefined(COOKIES[name])) {
            var m = doc.cookie.match('(?:^|;)\\s*' + name + '=([^;]*)');
            COOKIES[name] = (m && m[1]) ? decodeURIComponent(m[1]) : EMPTY;
        }
        return COOKIES[name];
    }

    /**
     * 编码 HTML (from prototype framework 1.4)
     */
    function escapeHTML(str) {
        var div = doc.createElement('div'), text = doc.createTextNode(str);
        div.appendChild(text);
        return div.innerHTML;
    }

    /**
     * 通过 ClassName 获取所有元素
     */
    function getElementsByClassName(cls, tag, context) {
        var els = context.getElementsByTagName(tag || '*'), ret = [], i = 0, j = 0, len = els.length, el, t;

        cls = SPACE + cls + SPACE;
        for (; i < len; ++i) {
            el = els[i];
            t = el.className;
            if (t && (SPACE + t + SPACE).indexOf(cls) > -1) {
                ret[j++] = el;
            }
        }
        return ret;
    }

    /**
     * 通过 ClassName 获取第一个元素
     */
    function getElementByClassName(cls, context) {
        if (!context) {
            context = document;
        }
        return getElementsByClassName(cls, "*", context)[0];
    }

    /**
     * 添加事件
     */
    function addEvent(el, type, fn, capture) {
        if (!el)
            return;
        if (el.addEventListener) {
            el.addEventListener(type, fn, !!capture);
        }
        else
        if (el.attachEvent) {
            el.attachEvent('on' + type, fn);
        }
    }

    /**
     * 删除事件
     */
    function removeEvent(el, type, fn, capture) {
        if (!el)
            return;
        if (el.removeEventListener) {
            el.removeEventListener(type, fn, !!capture);
        }
        else
        if (el.detachEvent) {
            el.detachEvent('on' + type, fn);
        }
    }

    /**
     * 简易版增加/删除元素的 class
     * @param elem
     * @param cls
     */
    function addClass(elem, cls) {
        var className = SPACE + elem.className + SPACE;

        if (className.indexOf(SPACE + cls + SPACE) === -1) {
            className += cls;
            elem.className = S.trim(className);
        }
    }

    function removeClass(elem, cls) {
        var className = SPACE + elem.className + SPACE;

        if (className.indexOf(SPACE + cls + SPACE) !== -1) {
            className = className.replace(SPACE + cls + SPACE, SPACE);
            elem.className = S.trim(className);
        }
    }

    /**
     * unparam
     */
    function unparam(str) {
        if (win.userCookie && win.userCookie.version == "2") {
            return S.unparam(str, "&amp;");
        }
        return S.unparam(str);
    }

    function preventDefault(e) {
        // if preventDefault exists run it on the original event
        if (e.preventDefault) {
            e.preventDefault();
        }
        // otherwise set the returnValue property of the original event to false (IE)
        else {
            e.returnValue = false;
        }
    }
});
