var __ie__ = el('__ie__');
if (!__ie__) {
    window['__event__'] = function(evt) { return evt; };
}

function observe_event(element, eventName, handler) {
    if (element.addEventListener) {
      element.addEventListener(eventName, handler, false);
    } else {
      element.attachEvent("on" + eventName, handler);
    }
}     

function stop_event(evt) {
    evt = window.event ? window.event : evt;
       if (evt) {
           if(__ie__) {
            evt.cancelBubble = true;
            evt.returnValue = false;
           } else {
            evt.stopPropagation();
            evt.preventDefault();
            evt.target.blur();
           }
    }
}

var UTIL = {
    map: function(f, xs) {
        var ret = [];
        var len = xs.length;
        for (var i = 0; i < len; i++) {
            ret.push(f(xs[i]));
        }
        return ret;
    },
    get_height: function() {
        return document.body.scrollHeight;
    }
};

var CSS = {
    is: function(node, cls) {
        var re = new RegExp('(^|\\s)' + cls + '(\\s|$)');
        if (re.test(node.className)) {
            return true;
        } else {
            return false;
        }
    },
    add: function(node, cls) {
        if (this.is(node, cls))
            return;
        var clss = node.className.split(' ');
        clss.push(cls);
        node.className = clss.join(' ');
    },
    del: function(node, cls) {
        var clss = node.className.split(' ');
        for (var i in clss) {
            if (clss[i] == cls) {
                clss.splice(i, 1);
                node.className = clss.join(' ');
                return;
            }
        }
    },
    find: function(cls, node) {
        if (!node) {
            node = document;
        }
        if (node.getElementsByClassName) {
            return node.getElementsByClassName(cls);
        } else if (node.querySelectorAll) {
            return node.querySelectorAll('.' + cls);
        } else if (document.getElementsByClassName) {
            return document.getElementsByClassName.call(node, cls);
        }
    }
};

var PREF = {
    backend: null,
    init: function() {
        if (window.localStorage) {
            this.backend = localStorage;
            this.backend['__type__'] = 'ls';
        } else if (window.globalStorage) {
            this.backend = globalStorage[document.domain];
            this.backend['__type__'] = 'gs';
        } else if (document.cookie) {
            this.backend = {
                getItem: function(k) {
                    var seq = document.cookie.split(';');
                    var re = new RegExp('^ ?' + k + '=');
                    for (var i in seq) {
                        if (re.test(seq[i])) {
                            var str = seq[i];
                            return unescape(str.substr(str.indexOf('=') + 1));
                        }
                    }
                },
                setItem: function(k, v) {
                    document.cookie = k + '=' + escape(v) + '; domain=' + document.domain + '; expires=' + ((new Date('December 31, 2100')).toGMTString());
                },
                __type__: 'cookie'
            };
        } else {
            this.backend = {
                getItem: function() { return null; },
                setItem: function() {},
                __type__: 'dummy'
            };
        }
    },
    get: function(k, d) {
        var v = null;
        try {
            v = this.backend.getItem(k);
            if (v != null) {
                v = JSON.parse(v + '') || d;
            } else {
                v = d;
            }
        } catch (ex) {
            v = d;
        }
        return v;
    },
    set: function(k, v) {
        try {
            this.backend.setItem(k, JSON.stringify(v));
        } catch (ex) {
        }
    }
};
PREF.init();

var TAB = {
    hook: function(tab) {
        var me = this;
        tab.onmouseover = function(evt) {
            tab['__cehp_tab_moving'] = true;
            if (!__ie__){
           		window.setTimeout(function() {me.change(evt);}, 100);
          	}else{
          		window.setTimeout(function() {me.change(tab);}, 100);
          	}
        };
        tab.onmouseout = function() {
            tab['__cehp_tab_moving'] = false;
        };
    },
    change: function(evt) {
    	try{
    		if (!__ie__){
    			evt = __event__(evt);
        	var tab = evt.target;
    		}else{
    			var tab = evt;
    		}
        if (!tab['__cehp_tab_moving']) {
            return;
        }
        var ul = tab;
        while (ul.nodeName.toLowerCase() != 'ul') {
            ul = ul.parentNode;
        }
        var currents = CSS.find('tab-title-current', ul);
        for (var i in currents) {
            if (currents[i].nodeType != 1)
                continue;
            document.getElementById(currents[i].getAttribute('rel')).style['display'] = 'none';
            currents[i].className = 'tab-title';
        }
        tab.className = 'tab-title tab-title-current';
        var id = tab.getAttribute('rel');
        var node = document.getElementById(id);
        node.style['display'] = 'block';
        }catch(e){}
    }
};

var SEARCH = {
    current_search: null,
    link: null,
    image: null,
    text: null,
    engine: null,
    submit: null,
    adsense: null,
    bdzd: null,
    iframetabs: {},
    change: function(evt) {
        evt = __event__(evt);
        var target = evt.target;
        if (target.nodeName.toLowerCase() != 'a') {
            return;
        }
        evt.stopPropagation();
        evt.preventDefault();
        this.change_to(evt.target);
    },
    rel2node: function(rel) {
        var as = el('search').getElementsByTagName('a');
        for (var i in as) {
            if (as[i].nodeType == 1) {
                if (as[i].getAttribute('rel') == rel) {
                    return as[i];
                }
            }
        }
        return null;
    },
    change_to: function(target) {
        if (target.nodeType !== 1) {
            target = this.rel2node(target);
        }
        if (target === null) {
            return;
        }
        if (CSS.is(target, 'current')) {
            return;
        }
        CSS.add(this.current_search, 'grad-box');
        CSS.del(this.current_search, 'current');
        this.current_search = target;
        CSS.add(this.current_search, 'current');
        CSS.del(this.current_search, 'grad-box');
        this.link.setAttribute('href', target.getAttribute('href'));
        this.link.setAttribute('title', target.getAttribute('title'));
        this.image.setAttribute('src', 'images/logo/' + target.getAttribute('rel') + '.png');
        this.engine.value = target.getAttribute('rel');
        // FIXME taobao's url is not W3C. so the href is urlcomponent encoded
        if (this.engine.value == 'taobao') {
            this.link.setAttribute('href', decodeURIComponent(target.getAttribute('href')));
        }

        this.submit.innerHTML = target.getAttribute('title');
        // FIXME Great hack on Google Adsense, change to adsense iframe
        var iframetab = this.iframetabs[this.engine.value];
        if (iframetab) {
            iframetab.style['display'] = 'inline';
            this.submit.style['display'] = 'none';
            this.text.style['display'] = 'none';
            iframetab.focus();
            // hide other iframe tabs
            for (var i in this.iframetabs) {
                if(this.iframetabs[i] == iframetab)
                    continue;
                this.iframetabs[i].style['display'] = 'none';
            }
            // change input value in iframe tab
            try {
                iframetab.contentDocument.getElementById('q').value = this.text.value;
            } catch (e) {}
        } else {
            this.submit.style['display'] = 'inline';
            this.text.style['display'] = 'inline';
            for (var i in this.iframetabs) {
                this.iframetabs[i].style['display'] = 'none';
            }
        }
        if (this.engine.value === 'google_web' || this.engine.value === 'baidu_web') {
            PREF.set('search_engine', this.engine.value);
        }
        if (this.text.style['display'] != 'none') {
            this.text.focus();
        }
    },
    init: function() {
        this.current_search = CSS.find('current', el('search'))[0];
        var frm = el('search').getElementsByTagName('form')[0];
        this.image = frm.getElementsByTagName('img')[0];
        this.link = this.image.parentNode;
        var inps = frm.getElementsByTagName('input');
        for (var i in inps) {
            if (inps[i].nodeType == 1) {
                if (inps[i].type == 'text') {
                    this.text = inps[i];
                }
                if (inps[i].type == 'hidden') {
                    this.engine = inps[i];
                }
            }
        }
        this.submit = frm.getElementsByTagName('button')[0];
        this.text.focus();
        // FIXME Great hack on Google Adsense, find adsense iframe
        ifs = frm.getElementsByTagName('iframe');
        for (var i in ifs) {
            if (ifs[i].name == 'google_sdo_frame') {
                this.iframetabs['google_web'] = ifs[i];
                break;
            }
        }
        this.iframetabs['taobao'] = el('taobao_zhidao_frame');
        this.iframetabs['baidu_zhidao'] = el('baidu_zhidao_frame');

        var eng = PREF.get('search_engine', 'baidu_web');
        if (frm.getAttribute('title') != null) {
            eng = frm.getAttribute('title');
        }
        this.change_to(eng);
    }
};

function cehomepage_menu() {}
cehomepage_menu.prototype = {
    initialize : function(btn, menu, items) {
        this.btn = btn;
        this.menu = menu;
        this.items = items;
        this.initEventListeners();
    },
    
    initEventListeners : function() {
        var self = this;
        this.btn.onclick = function(evt) {
            self.btn_onclick(evt);
        }
        this.btn.onmousedown = function(evt) {
            self.btn_onmousedown(evt);
        }
        this.menu.onmousedown = function(evt) {
            self.menu_onmousedown(evt);
        }
        if(this.items) {
            for(var i = 0; i < this.items.length; i++) {
                this.items[i].onclick = function(evt) {
                    self.items_onclick(evt);
                }
            }
        }
        observe_event(document.body, 'mousedown', function(evt) {
            self.body_onmousedown(evt);
        }, false);
    },
    
    body_onmousedown : function(evt) {
        this.menu.style['display'] = 'none';
    },
    
    btn_onmousedown : function(evt) {
        isShowing = this.menu.style['display'] == 'none';
        if (evt && !isShowing) {
            stop_event(evt);
        }
    },
    
    btn_onclick : function(evt) {
        show = this.menu.style['display'] == 'none';
        this.menu.style['display'] = show ? 'block' : 'none';
        stop_event(evt);
    },
    
    items_onclick : function(evt) {
        this.menu.style['display'] = 'none';
    },
    
    menu_onmousedown : function(evt) {
        stop_event(evt);
    }
}

var panels_visibility = {};
function panel_toggle(evt) {
    evt = __event__(evt);
    var a = evt.target;
    a.blur();
    if (a.nodeName.toLowerCase() != 'a') return;
    evt.stopPropagation();
    evt.preventDefault();
    var is_show = CSS.is(a, 'check');
    var panel = el(a.getAttribute('rel'));
    if (is_show) {
        CSS.del(a, 'check');
        panel.style['display'] = 'none';
        a.setAttribute('title', '显示 ' + a.firstChild.nodeValue);
        panels_visibility[panel.id] = 'collapse';
    } else {
        CSS.add(a, 'check');
        panel.style['display'] = 'block';
        a.setAttribute('title', '显示 ' + a.firstChild.nodeValue);
        panels_visibility[panel.id] = 'toggle';
    }
    PREF.set('panels_visibility', panels_visibility);
}

var XHR = {
    get: function(url, cb) {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                cb(xhr.responseText);
            }
        };
        xhr.open('GET', url, true);
        xhr.send('');
    }
};

var NOTIFY = {
    panel: null,
    confirm: function(msg, cb) {
        if (this.panel == null) {
            this.panel = el('notify_confirm');
        }
        this.panel.getElementsByTagName('p')[0].innerHTML = msg;
        this.panel.style['display'] = 'block';
        this.onconfirm['callback'] = cb;
    },
    onconfirm: function(ret) {
        this.panel.style['display'] = 'none';
        CSS.find('cancel', this.panel)[0].style['display'] = 'inline';
        if (this.onconfirm['callback']) {
            this.onconfirm['callback'](ret);
        }
    },
    alert: function(msg, cb) {
        this.confirm(msg, cb);
        CSS.find('cancel', this.panel)[0].style['display'] = 'none';
    }
};

var AD = {
    init: function(ads) {
    	this.ads = ads;
        var as = el('banner_show').getElementsByTagName('a');
        for (var i in as) {
            var link = as[i];
            if (link.nodeType != 1) {
                continue;
            }
            var rnd = Math.floor(Math.random() * (this.ads.length));
            if (rnd >= this.ads.length) {
                rnd = this.ads.length - 1;
            }
            this.set_ad(link, rnd);
        }
    },
    set_ad: function set_ad(link, rnd) {
        var ele = this.ads[rnd];
        this.ads.splice(rnd, 1);
        link.setAttribute('href', ele.url);
        link.setAttribute('title', ele.title);
        var img = link.firstChild;
        while (img) {
            if (img.nodeType == 1) {
                img.setAttribute('src', ele.img);
                img.setAttribute('alt', ele.title);
                break;
            }
            img = img.nextSibling;
        }
    }
};

var TBHot = {
	init: function(words) {
		this.words = words;
    	var max = this.words.length - 15;
        var rnd = Math.floor(Math.random() * max);
        if (rnd >= max) {
            rnd = max - 1;
        }
        for(var i = 0; i < 15; i++) {
        	var li = document.createElement('LI');
        	li.innerHTML = '<a href="' + this.words[rnd + i].url +  '" target="_blank">' + this.words[rnd + i].title + '</a>';
        	el('taobao_sales_hot').appendChild(li);
        }
    }
};

var PANEL = {
    order: null,
    init: function() {
        if (this.order == null) {
            this.order = PREF.get('panels_ord', []);
        }
        var pns = CSS.find('panel');
        var panel = pns[pns.length - 1];
        if (document.querySelector) {
            var a = document.querySelector('#tips a[rel=' + panel.id + ']');
            panel['rev'] = a;
        } else {
            var as = el('tips').getElementsByTagName('a');
            for (var i in as) {
                if (as[i].nodeType != 1)
                    continue;
                if (as[i].getAttribute('rel') == panel.id) {
                    panel['rev'] = as[i];
                    break;
                }
            }
        }
        if (pns.length == 1) {
            panels_visibility = PREF.get('panels_visibility', {});
        }
        var pos = 0;
        if (this.order.indexOf) {
            pos = this.order.indexOf(panel.id);
        } else {
            for (var i = 0; i < this.order.length; i++) {
                if (this.order[i] == panel.id) {
                    pos = i;
                    break;
                }
            }
        }
        if (pos != -1) {
            pos++;
            while (pos < this.order.length) {
                var np = el(this.order[pos]);
                if (np) {
                    np.parentNode.insertBefore(panel, np);
                    np.rev.parentNode.insertBefore(panel.rev, np.rev);
                    break;
                }
                pos++;
            }
        }
        var visi = panels_visibility[panel.id];
        if (visi == 'toggle' || visi == undefined) {
            panel.style['display'] = 'block';
            var as = el('tips').getElementsByTagName('a');
            for (var i in as) {
                if (as[i].nodeType != 1)
                    continue;
                if (as[i].getAttribute('rel') == panel.id) {
                    CSS.add(as[i], 'check');
                    as[i].setAttribute('title', ['显示', as[i].firstChild.nodeValue].join(' '));
                    break;
                }
            }
        }
        var movers = CSS.find('panel-mover', panel);
        for (var i in movers) {
            if (movers[i].nodeType == 1) {
                movers[i].onmousedown = this.hook(panel, movers[i]);
            }
        }
        var tabs = CSS.find('tab-title', panel);
        for (var i in tabs) {
            if (tabs[i].nodeType == 1) {
                TAB.hook(tabs[i]);
            }
        }
    },
    collapse: function(id) {
        var panel = el(id);
        do_click(panel.rev);
    },
    moving_panel: null,
    hook: function(panel, mover) {
        var me = this;
        return function(evt) {
            evt = __event__(evt);
            if (evt.button != 0 || me.moving_panel != null || evt.target != mover) {
                me.moving_panel = null;
                return;
            }
            evt.stopPropagation();
            evt.preventDefault();
            me.moving_panel = panel;
        };
    },
    moving: function() {
        var me = this;
        return function(evt) {
            evt = __event__(evt);
            var p = me.moving_panel;
            if (evt.button != 0 || p == null) {
                return;
            }
            evt.stopPropagation();
            evt.preventDefault();
            var ctx = p.move_context;
            if (ctx == null) {
                p.move_context = ctx = {};
                ctx.moved = false;
                var host = ctx.host = el('moving_host');
                var box = ctx.box = me.get_box(p);
                ctx.dx = evt.screenX - ctx.box.left;
                ctx.dy = evt.screenY - ctx.box.top;
                var alter = ctx.alter = document.createElement('div');
                alter.className = 'panel-alter';
                /* hack here, substract 2px from box.height as the border */
                alter.setAttribute('style', 'height:' + (box.height - 2) + 'px;');
                p.parentNode.insertBefore(alter, p);
                with (host) {
                    style['display'] = 'block';
                    appendChild(p);
                    style['left'] = box.left + 'px';
                    style['top'] = box.top + 'px';
                    style['width'] = box.width + 'px';
                    style['height'] = box.height + 'px';
                }
                me.cover(true);
            } else {
                var host = ctx.host;
                var y = parseInt(host.style['top']);
                host.style['left'] = (evt.screenX - ctx.dx) + 'px';
                host.style['top'] = (evt.screenY - ctx.dy) + 'px';
                if (evt.screenY - ctx.dy > y) {
                    me.arrange(ctx, 'nextSibling', me.compare_bottom, me.swap_next);
                } else {
                    me.arrange(ctx, 'previousSibling', me.compare_top, me.swap_previous);
                }
            }
        };
    },
    compare_bottom: function(b, mid) { return b.top + b.height > mid; },
    compare_top: function(b, mid) { return b.top < mid; },
    swap_next: function(current, next) { current.parentNode.insertBefore(next, current); },
    swap_previous: function(current, next) { current.parentNode.insertBefore(current, next); },
    arrange: function(ctx, field, compare, swap) {
        var alter = ctx.alter;
        var b = this.get_box(ctx.host);
        var next = alter[field];
        while (next) {
            if (next.nodeType == 1 && CSS.is(next, 'panel') && next.style['display'] == 'block') {
                var nb = this.get_box(next);
                var mid = nb.top + nb.height / 2;
                if (compare(b, mid)) {
                    log(['arrange', field, b.top, b.top + b.height, mid]);
                    ctx.moved = true;
                    swap(alter, next);
                    swap(this.moving_panel.rev, next.rev);
                    next = alter[field];
                    continue;
                } else {
                    log(['stop', field, b.top, b.top + b.height, mid]);
                    break;
                }
            }
            next = next[field];
        }
    },
    release: function() {
        var me = this;
        return function(evt) {
            evt = __event__(evt);
            var p = me.moving_panel;
            if (evt.button != 0 ||
                p == null) {
                return;
            }
            evt.stopPropagation();
            evt.preventDefault();
            me.cover(false);
            me.moving_panel = null;
            if (p.move_context) {
                var alter = p.move_context.alter;
                if (alter) {
                    alter.parentNode.insertBefore(p, alter);
                    p.parentNode.removeChild(alter);
                }
                if (p.move_context.moved) {
                    var ord = UTIL.map(function(p) { return p.id; }, CSS.find('panel'));
                    PREF.set('panels_ord', ord);
                }
                p.move_context = null;
            }
            el('moving_host').style['display'] = 'none';
        };
    },
    cover: function(show) {
        if (this.moving_panel == null) {
            return;
        }
        var ifs = document.getElementsByTagName('iframe');
        for (var i in ifs) {
            var iframe = ifs[i];
            if (iframe.nodeType != 1)
                continue;
            if (show) {
                var c = document.createElement('div');
                c.className = 'iframe-cover';
                var b = this.get_box(iframe);
                c.style['width'] = b.width + 'px';
                c.style['height'] = b.height + 'px';
                iframe.parentNode.insertBefore(c, iframe);
                iframe['__cover__'] = c;
            } else {
                if (iframe['__cover__'] != null) {
                    iframe.parentNode.removeChild(iframe.__cover__);
                    iframe.__cover__ = null;
                }
            }
        }
    },
    get_box: function(ele) {
        var b = {
            left: ele.offsetLeft,
            top: ele.offsetTop,
            width: ele.offsetWidth,
            height: ele.offsetHeight
        };
        var pp = ele.offsetParent;
        if (pp != ele) {
            while (pp) {
                b.left += pp.offsetLeft;
                b.top += pp.offsetTop;
                pp = pp.offsetParent;
            }
        }
        return b;
    }
};

var LINKTRACE = {
hooks: {},
    trace: function(evt, link) {
        var href = link.getAttribute('href');
        if (/^#$/.test(href) || /^javascript:/.test(href)) {
            return;
        }
        
        if (this.nolinktrace(link))
        	return;
        	
        var tracer = link['__linktrace_tracer__'];
        if (tracer == null) {
            tracer = this.setup(link);
        }
        tracer(evt, link);
    },
    identify: function(link) {
        while (link) {
            if (CSS.is(link, 'link-trace')) {
                return link.getAttribute('rel');
            }
            link = link.parentNode;
        }
        return null;
    },
    nolinktrace : function(link) {
    	while (link) {
            if (CSS.is(link, 'no-link-trace')) {
                return true;
            }
            link = link.parentNode;
        }
        return false;
    },
    setup: function(link) {
        var tracer = null;
        var rel = this.identify(link);
        if (rel == null) {
            tracer = function() {};
        }
        var hook = this.hooks;
        if (this.hooks[rel]) {
            tracer = this.hooks[rel];
        } else {
            tracer = this.build(rel);
        }
        link['__linktrace_tracer__'] = tracer;
        return tracer;
    },
    build: function(rel) {
        var me = this;
        return function(evt, link) {
            link['__linktrace_tracer__'] = function() {};
            link.setAttribute('href', me.translate('hp', rel, link));
        };
    },
    translate: function(action, rel, link) {
        var tit = link.getAttribute('title');
        if (tit == null || tit.length == 0) {
            if (link.childNodes.length == 1 && link.firstChild.nodeType == 3) {
                tit = link.firstChild.nodeValue;
            } else if (link.nodeText) {
                tit = link.nodeText;
            } else {
                tit = '';
            }
        }
        return ['/', action, '?u=', encodeURIComponent(link.href), '&c=', rel, '&t=', encodeURIComponent(tit)].join('');
    }
};

document.addEventListener('mousemove', PANEL.moving(), true);
document.addEventListener('mouseup', PANEL.release(), true);
function do_click(node) {
    var evt = document.createEvent('MouseEvents');
    evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    node.dispatchEvent(evt);
}

function body_onclick(evt) {
    trace_link(evt);
}

function trace_link(evt) {
    var target = evt.target || evt.srcElement;
    if (evt.button == 0) {
        if (target.nodeName.toLowerCase() == 'a') {
            LINKTRACE.trace(evt, target);
        } else if (target.parentNode && target.parentNode.nodeName.toLowerCase() == 'a') {
            LINKTRACE.trace(evt, target.parentNode);
        }
    }    
}

function el(id) { return document.getElementById(id); }
function log(msg) {
    return;
    var ll = el('log');
    var p = document.createElement('p');
    p.appendChild(document.createTextNode(msg));
    var x = ll.firstChild;
    while (x) {
        ll.removeChild(x);
        x = ll.firstChild;
    }
    ll.appendChild(p);
}

/* Reload half an hour, set a cookie to identify it is a refresh */
window.setTimeout(function() {
    var search = window.location.search;
    if (search.length > 1) {
        search = search.substring(1).split('&');
        search.push('rv=1');
        search = '?' + search.join('&');
    } else {
        search = '?rv=1';
    }
    window.location.href = [window.location.protocal, '//', window.location.host, window.location.pathname, search].join('');
}, 1000 * 1800);

