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 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' || this.engine.value === 'taobao') {
            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', 'google_web');
        if (frm.getAttribute('title') != null) {
            eng = frm.getAttribute('title');
        }
        this.change_to(eng);
    },
    
    submitform : function() {
    	this.actions = {};
    	this.actions['baidu_web'] = 'http://www.baidu.com/baidu?tn=ylgod_pg&ie=utf-8&wd=__KEY__';
    	this.actions['google_music'] = 'http://www.google.cn/music/search?aq=f&q=__KEY__';
    	this.actions['baidu_video'] = 'http://video.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=0&fbl=800&ie=utf-8&word=__KEY__';
    	this.actions['baidu_image'] = 'http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&z=0&ie=utf-8&word=__KEY__';
    	this.actions['google_ditu'] = 'http://ditu.google.cn/maps?ie=utf-8&hl=zh-CN&q=__KEY__';
    	this.actions['verycd_movie'] = 'http://www.verycd.com/search/folders/__KEY__';
    	
    	var action = this.actions[this.engine.value];
    	var tmp = /([^\?]+)\?(.+)/i.exec(action);
    	
    	var inputs = document.form1.getElementsByTagName('INPUT');
    	for (var i = 0; i < inputs.length; i++) {
    		if (!!inputs[i].name) {
    		    document.form1.removeChild(inputs[i]);
    		    i--;
    		}
    	}
    	
    	if(null != tmp && tmp.length > 1) {
    	   document.form1.action = tmp[1];
           var params = tmp[2];
           var pair = params.split('&');
           for (var i = 0; i < pair.length; i++) {
               var key_value = pair[i].split('=');
               var input = document.createElement('INPUT');
               input.type = 'hidden';
               input.name = key_value[0];
               input.value = key_value[1] == '__KEY__' ? el('q').value : key_value[1];
               document.form1.appendChild(input);
           }
    	} else {
    		document.form1.action = action.replace('__KEY__', el('q').value);
    	}
        
        document.form1.submit();
    	return false;
    }
};


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 el(id) { return document.getElementById(id); }
