// JavaScript Document
//name space gogo,return most are object
var Gogo = function() {
    return {
        ___b: {},
        /*-----------函数相关------------*/
        //给函数指派call环境
        _bind_function: function(obj, func) {
            return function() {
                func.apply(obj);
            }
        },

        /*--------------事件相关---------------*/
        //event listener,但是在IE里面如果fn使用了this，this会指向window而不是指向event.srcElement;
        // 因为IE对fn是引用而不是复制
        _event_listener: function(obj, evt, fn) {
            if (obj.addEventListener) {
                obj.addEventListener(evt, fn, false);
            } else if (obj.attachEvent) {
                obj.attachEvent('on' + evt, fn);
            } else return false;
        },
        //修正版本，this不会偏离,其实也相当于给fn.apply(obj)
        __event_listener: function(obj, evt, fn) {
            if (obj.addEventListener) {
                obj.addEventListener(evt, fn, false);
            } else if (obj.attachEvent) {
                obj['e' + evt + fn] = fn;
                obj[evt + fn] = function() { obj['e' + evt + fn](window.event); };
                obj.attachEvent('on' + evt, obj[evt + fn]);
            } else return false;
        },
        _remove_listener: function(obj, evt, fn) {
            if (obj.removeEventListener) {
                obj.removeEventListener(evt, fn, false);
            } else if (obj.detachEvent) {
                obj.detachEvent('on' + evt, fn);
            } else {
                return;
            }
        },
        //获取事件发生起点
        _get_event_ele: function(evt) {
            var evt = evt || window.event;
            var target = evt.target || evt.srcElement;
            //据说在safari上会出现一点bug——如果存在textnode时，所以有下面
            return (target.nodeName != '#text') ? target : target.parentNode;
        },
        //获取事件对象
        _get_event_obj: function(evnentObj) {
            evnentObj = evnentObj || window.event;
            return evnentObj;
        },
        //阻止冒泡
        _stop_bubble: function(eventObj) {
            eventObj = eventObj || window.event;
            if (eventObj.stopPropagation) {
                eventObj.stopPropagation();
            } else if (eventObj.cancelBubble) {
                eventObj.cancelBubble = true;
            }
        },
        //取消默认动作
        _prevennt_default: function(eventObj) {
            eventObj = eventObj || window.event;
            if (eventObj.preventDefault) {
                eventObj.preventDefault(); eventObj.stopPropagation();
            } else {
                eventObj.returnValue = false; eventObj.cancelBubble = true;
            }
        },
        // 获取鼠标的位置
        _get_mouse: function(e) {
            var e = e || window.event;
            return { x: e.clientX || e.pageX + document.body.scrollLeft || document.documentElement.scrollLeft, y: e.clientY || e.pageY + document.body.scrollTop || document.documentElement.scrollTop };
        },
        //获取元素到窗口水平竖直的距离
        _get_dis: function(obj) {
            var y = obj.offsetTop;
            var x = obj.offsetLeft;
            while (obj = obj.offsetParent) {
                y += obj.offsetTop;
                x += obj.offsetLeft;
            }
            return { x: x, y: y };
        },
        //获取鼠标按键
        _mouse_button: function(eventObj) {
            eventObj = eventObj || window.event;
            var buttons = { left: false, middle: false, right: false };
            if (eventObj.toString && eventObj.toString().indexOf('MouseEvent') != -1) {
                switch (eventObj.button) {
                    case 0: buttons.left = true; break;
                    case 1: buttons.middle = true; break;
                    case 2: buttons.right = true; break;
                }
            } else if (eventObj.button) {
                switch (eventObj.button) {
                    case 1: buttons.left = true; break;
                    case 2: buttons.right = true; break;
                    case 3: buttons.left = true;
                        buttons.right = true; break;
                    case 4: buttons.middle = true; break;
                    case 5: buttons.left = true;
                        buttons.middle = true; break;
                    case 6: buttons.right = true;
                        buttons.middle = true; break;
                    case 7: buttons.left = true;
                        buttons.middle = true;
                        buttons.right = true; break;
                }
            } else {
                alert(eventObj.button);
                return false;
            }

            for (var list in buttons) {
                //alert(buttons[list]); 
            };
            return buttons;
        },
        // 键值表
        _showKeyName: function(e) {
            switch (e.keyCode) {
                case 8: keyName = e.keyCode + "[退格]"; break;
                case 9: keyName = e.keyCode; break;
                case 13: keyName = e.keyCode; break;
                case 16: keyName = e.keyCode + "[Shift]"; break;
                case 17: keyName = e.keyCode + "[Ctrl]"; break;
                case 18: keyName = e.keyCode + "[Alt]"; break;
                case 19: keyName = e.keyCode + "[PauseBreak]"; break;
                case 20: keyName = e.keyCode + "[Caps Lock]"; break;
                case 27: keyName = e.keyCode + "[Esc]"; break;
                case 32: keyName = e.keyCode + "[空格]"; break;
                case 33: keyName = e.keyCode + "[PageUp]"; break;
                case 34: keyName = e.keyCode + "[PageDown]"; break;
                case 35: keyName = e.keyCode + "[End]"; break;
                case 36: keyName = e.keyCode + "[Home]"; break;
                case 37: keyName = e.keyCode + "[方向键左]"; break;
                case 38: keyName = e.keyCode; break;
                case 39: keyName = e.keyCode + "[方向键右]"; break;
                case 40: keyName = e.keyCode; break;
                case 45: keyName = e.keyCode + "[Insert]"; break;
                case 46: keyName = e.keyCode + "[Delete]"; break;
                case 91: keyName = e.keyCode + "[左Win]"; break;
                case 92: keyName = e.keyCode + "[右Win]"; break;
                case 93: keyName = e.keyCode + "[快捷菜单键]"; break;
                case 95: keyName = e.keyCode + "[Sleep]"; break;
                case 96: keyName = e.keyCode + "[小键盘区0]"; break;
                case 97: keyName = e.keyCode + "[小键盘区1]"; break;
                case 98: keyName = e.keyCode + "[小键盘区2]"; break;
                case 99: keyName = e.keyCode + "[小键盘区3]"; break;
                case 100: keyName = e.keyCode + "[小键盘区4]"; break;
                case 101: keyName = e.keyCode + "[小键盘区5]"; break;
                case 102: keyName = e.keyCode + "[小键盘区6]"; break;
                case 103: keyName = e.keyCode + "[小键盘区7]"; break;
                case 104: keyName = e.keyCode + "[小键盘区8]"; break;
                case 105: keyName = e.keyCode + "[小键盘区9]"; break;
                case 106: keyName = e.keyCode + "[*]"; break;
                case 107: keyName = e.keyCode + "[+]"; break;
                case 109: keyName = e.keyCode + "[-]"; break;
                case 110: keyName = e.keyCode + "[.]"; break;
                case 111: keyName = e.keyCode + "[/]"; break;
                case 112: keyName = e.keyCode + "[F1]"; break;
                case 113: keyName = e.keyCode + "[F2]"; break;
                case 114: keyName = e.keyCode + "[F3]"; break;
                case 115: keyName = e.keyCode + "[F4]"; break;
                case 116: keyName = e.keyCode + "[F5]"; break;
                case 117: keyName = e.keyCode + "[F6]"; break;
                case 118: keyName = e.keyCode + "[F7]"; break;
                case 119: keyName = e.keyCode + "[F8]"; break;
                case 120: keyName = e.keyCode + "[F9]"; break;
                case 121: keyName = e.keyCode + "[F10]"; break;
                case 122: keyName = e.keyCode + "[F11]"; break;
                case 123: keyName = e.keyCode + "[F12]"; break;
                case 144: keyName = e.keyCode + "[NumLock]"; break;
                case 145: keyName = e.keyCode + "[ScrollLock]"; break;
                case 186: keyName = e.keyCode + "[;]"; break;
                case 187: keyName = e.keyCode + "[=]"; break;
                case 188: keyName = e.keyCode + "[,]"; break;
                case 189: keyName = e.keyCode + "[-]"; break;
                case 190: keyName = e.keyCode + "[.]"; break;
                case 191: keyName = e.keyCode + "[/]"; break;
                case 192: keyName = e.keyCode + "[`]"; break;
                case 219: keyName = e.keyCode + "[[]"; break;
                case 220: keyName = e.keyCode + "[\\]"; break;
                case 221: keyName = e.keyCode + "[]]"; break;
                case 222: keyName = e.keyCode + "[']"; break;
                //case 255:keyName = e.keyCode+"[Power]";break;  
                case 255: keyName = e.keyCode + "[Wake]"; break;
                default: keyName = e.keyCode + "[" + String.fromCharCode(e.keyCode) + "]"; break;
            }
            if ((e.shiftKey) && (e.keyCode != 16)) {
                keyName = e.keyCode + "[Shift] + " + keyName;
            }
            if ((e.altKey) && (e.keyCode != 18)) {
                keyName = e.keyCode + "[Alt] + " + keyName;
            }
            if ((e.ctrlKey) && (e.keyCode != 17)) {
                keyName = e.keyCode + "[Ctrl] + " + keyName;
            }
            return keyName;
        },
        /*------------字符串相关-------------*/
        //截取字符串结尾
        _end_by: function(str) {
            if (str.length != 0) {
                return str.charAt(str.length - 1);
            }
        },

        /*------------dom相关------------*/
        //由id获取元素 
        _get_obj: function(id) {
            if (document.getElementById(id)) {
                return document.getElementById(id);
            } else {
                return null;
            }
        },
        //移除节点
        _remove_child: function(childnode) {
            childnode.parentNode.removeChild(childnode);
        },
        //替换节点
        _replace_child: function(newchild, oldnode) {
            oldnode.parentNode.replaceChild(newchild, oldnode);
        },
        //交换节点
        _xchange_node: function(node1, node2) {
            var _temp = div1;
            var _box = div2.parentNode;
            var _next = div2.nextSibling;
            Gogo._replace_child(div2, div1);
            _box.insertBefore(_temp, _next);
            _temp = null;
            _box = null;
            _next = null;
        }
    }
} ();
//去空格
if(!String.trim){
    String.prototype.trim = function(){
        var reg = new RegExp(/^\s*|\s$/g);
        return this.replace(reg,'');
    }
}
//重复字符串
if(!String.repeat){
    String.prototype.repeat = function(l){
        return new Array(l+1).join(this);
    }
}
// 自定义右键菜单
function _right_btn(obj){
    var _this = this;
    Gogo.__event_listener(obj?obj:document,'contextmenu',function(eventObj){
        Gogo._prevennt_default(eventObj);
        _this.x = Gogo._get_mouse(eventObj).x;
        _this.y = Gogo._get_mouse(eventObj).y;
        if(_this._myself){_this._myself();}
    });
}
//mousemove效果
function _left_over(obj){
    var _this = this;
    Gogo.__event_listener(obj?obj:document,'mouseover',function(eventObj){
        _this.x = Gogo._get_mouse(eventObj).x;
        _this.y = Gogo._get_mouse(eventObj).y;
        if(_this._myself_over){_this._myself_over();}
    });
    Gogo.__event_listener(obj?obj:document,'mouseout',function(eventObj){
        if(_this._myself_out){_this._myself_out();}
    });
}
function setCookie(sName,sValue,oExpires)
{
    var expire = "";
     if(oExpires != null)
    {
         expire = "; expires=" + (new Date((new Date()).getTime() + oExpires * 3600000)).toGMTString();
    }
    document.cookie = sName + "=" + sValue + expire ;
}

 function getCookie(sName)
 {
    var reg = new RegExp("(^| )"+sName+"=([^;]*)(;|$)","gi");
    var ck = reg.exec(document.cookie);
    if(ck==null||typeof(ck) == "undefined"||ck.length==0)
         return false;
    if(ck[2] == null || typeof(ck[2]) == "undefined"||ck[2].length==0)
        return false;
    return ck[2];
 } 
  Gogo.getNext=function(obj,limit)
 {
     var a=[];
     obj=obj.nextSibling;
     while(obj!=limit)
     {
     if(obj&&obj.nodeName.toLowerCase()=='li')
     {
     a.push(obj);
     }
     obj=obj.nextSibling;
     }
     return a;
 } 
 Gogo.load=function(src,callBack)
 {
    var script=document.createElement('script');
    script.setAttribute('src',src);
    script.type="text/javascript";  
    document.getElementsByTagName('head')[0].appendChild(script);
    script.onreadystatechange=function()
    {
        if(callBack&&script.readyState == 'loaded')
        {
            callBack();
        }
    }
    script.onload=function()
    {
        if(callBack)
        {
            callBack();
        }
    }
 }
 Object.prototype.init=function()
 {
    if(this.tag)
    {
        var tag=document.createElement(this.tag);
        if(this.innerHTML&&this.innerHTML!='')
        {
            tag.innerHTML=this.innerHTML;
        }else if(this.childNode)
        {
            if(this.childNode.tag)
            {
                tag.appendChild(this.childNode.init());
            }
            else{
                try{
                    for(var i in this.childNode)
                    {
                        try
                        {
                             delete Gogo.___b[['$',this.childNode[i].time].join('')];
                        }catch(e){};
                        if(this.childNode[i].tag)
                        {
                            tag.appendChild(this.childNode[i].init());
                        }
                    }
                }catch(e){
                    tag.appendChild(this.childNode);
                }
            }
        };
        if(this.id){tag.id=this.id;}
        if(this.type){tag.type=this.type;}
        if(this.src){tag.src=this.src;}
        if(this.alt){tag.alt=this.alt;}
        if(this.title){tag.title=this.title;}
        if(this.href){tag.href=this.href;}
        if(this.className){tag.className=this.className;}
        if(this.action&&this.evt){Gogo.__event_listener(this.evt,this.action);}
        return tag;
    }
 }
 String.prototype.format=function()
 {
    return eval(this.toString());
 }
 String.prototype.addData=function(arg)
 {
    for(var i=0,len=arguments.length;i<len;i++)
    {
        if((typeof arguments[i])=='object')
        {
            Gogo.___b[['$',arguments[i]['time']].join('')]=arguments[i];
            this.str=this.replace('\'#c\'', 'Gogo.___b["'+['$',arguments[i]['time']].join('')+'"]');
        }
    }
    return this.str;
 }
 //不提倡用prototype，但是下面这几条确实很有用
 Array.prototype.each=function(fn,arg)
 {
     for (var i = 0, len = this.length; i < len; i++) {
        fn(this,i,arg);
    }
 }
function templates()
{
    //tag template can be made into any tag
    return "({tag:'<>',id:'#',className:'.',childNode:'#c',innerHTML:'',src:'',alt:'',title:'',href:'',type:'',value:'',action:'',evt:'',time:'"+[new Date().getHours(),new Date().getMinutes(),new Date().getSeconds(),new Date().getMilliseconds()].join('')+"'})";
}
 
