// fix firefox
if ($.browser.mozilla)
{
    window.constructor.prototype.__defineGetter__("event", function() {
        var func = arguments.callee.caller;
        while(func != null)
        {
            var arg0 = func.arguments[0];
            if(arg0 && (arg0.constructor == Event || arg0.constructor == MouseEvent || arg0.constructor == KeyboardEvent))
                return arg0;
            func = func.caller;
        }
        return null;
    });

    Event.prototype.__defineGetter__("srcElement", function() {
        return this.target;
    });

    if (!Event.keyCode)
    {
        Event.prototype.__defineGetter__("keyCode", function() {
            return this.which ? this.which : this.charCode;
        });
    }

    Document.prototype.readyState = 0;
    Document.prototype.onreadystatechange = null;
    Document.prototype.__changeReadyState__ = function (iReadyState) {
        this.readyState = iReadyState;

        if (typeof this.onreadystatechange == "function") {
            this.onreadystatechange();
        }
    };
    // initialize parseError
    Document.prototype.__initError__ = function () {
        this.parseError.errorCode = 0;
        this.parseError.filepos = -1;
        this.parseError.line = -1;
        this.parseError.linepos = -1;
        this.parseError.reason = null;
        this.parseError.srcText = null;
        this.parseError.url = null;
    };

    Document.prototype.__checkForErrors__ = function () {
        if (this.documentElement.tagName == "parsererror") {
            var reError = />([\s\S]*?)<sourcetext>([\s\S]*?)(?:\-*\^)/;
            reError.test(this.xml);
            this.parseError.errorCode = -999999;
            this.parseError.reason = RegExp.$1.replace("&lt;", "<").replace("&gt;", ">");
            this.parseError.srcText = RegExp.$2;
        }
    };

    Document.prototype.loadXML = function (sXml) {
        this.__initError__();
        this.__changeReadyState__(1);
        var oParser = new DOMParser();
        var oXmlDom = oParser.parseFromString(sXml, "text/xml");

        while (this.firstChild) {
            this.removeChild(this.firstChild);
        }

        for (var i=0; i < oXmlDom.childNodes.length; i++) {
            var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
            this.appendChild(oNewNode);
        }

        this.__checkForErrors__();
        this.__changeReadyState__(4);

    };

    Document.prototype.__load__ = Document.prototype.load;

    Document.prototype.load = function (sURL) {
        this.__initError__();
        this.__changeReadyState__(1);
        this.__load__(sURL);
    };

    Node.prototype.__defineGetter__("xml", function () {
        var oSerializer = new XMLSerializer();
        return oSerializer.serializeToString(this, "text/xml");
    });

    Node.prototype.__defineGetter__("text", function () {
        return this.textContent;
    });

    Node.prototype.selectSingleNode = function (xPath) {
        var xresult = this.evaluate(xPath, this, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        if(xresult && xresult.snapshotLength > 0)
            return xresult.snapshotItem(0);
        else
            return null;
    };

    Node.prototype.selectNodes = function (xPath) {
       var xresult = this.evaluate(xPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
        var node = null, nodes = [], k = 0;
        while ((node = xresult.iterateNext())!= null)
            nodes[k++] = node;
        return nodes;
    };
}

// get first element by name
function $N(name)
{
    return document.getElementsByName(name)[0];
}

// XML DOM object class
function XmlDom() {
    if (window.ActiveXObject) {
        var arrSignatures = ["MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.5.0",
                             "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument",
                             "Microsoft.XmlDom"];

        for (var i = 0; i < arrSignatures.length; i++) {
            try {
                var oXmlDom = new ActiveXObject(arrSignatures[i]);
                return oXmlDom;

            } catch (oError) {}
        }
        throw new Error("MSXML is not installed on your system.");

    } else if (document.implementation && document.implementation.createDocument) {
        var oXmlDom = document.implementation.createDocument("", "", null);

        // create Mozilla's parseError object
        oXmlDom.parseError = {
            valueOf: function () {return this.errorCode;},
            toString: function () {return this.errorCode.toString()}
        };

        // initialize parseError
        oXmlDom.__initError__();

        oXmlDom.addEventListener("load", function () {
            this.__checkForErrors__();
            this.__changeReadyState__(4);
        }, false);

        return oXmlDom;

    } else {
        throw new Error("Your browser doesn't support an XML DOM object.");
    }
}



// 去除字符串两边的空白字符
String.prototype.Trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}


// 生成重复指定次数的字符串
String.prototype.Repeat = function(num)
{
    if (arguments.length == 0)
    {
        alert("必须给 Repeat 函数指定一个参数");
        return;
    }
    if (typeof(num) != "number" || num < 0)
    {
        alert("必须给 Repeat 函数指定一个正整数参数");
        return;
    }

    num = parseInt(num);
    var result = "";
    for (var i = 0; i < num; i++)
        result += this;
    return result;
}

/*
 获取元素的绝对坐标
 IE 也可以使用 getBoundingClientRect 函数
 返回结果: {top, left, width, height}
*/
function GetLocation(element)
{
    if (typeof(element) == "undefined") return null;

    var elmt = element;
    var offsetTop = elmt.offsetTop;
    var offsetLeft = elmt.offsetLeft;
    var offsetWidth = elmt.offsetWidth;
    var offsetHeight = elmt.offsetHeight;
    while(elmt = elmt.offsetParent)
    {
        if (elmt.style.position == "absolute"
            //|| elmt.style.position == 'relative'
            || (elmt.style.overflow != "visible" && elmt.style.overflow != "" ))
            break;
        offsetTop += elmt.offsetTop;
        offsetLeft += elmt.offsetLeft;
    }
    return {"top": offsetTop, "left": offsetLeft, "right": offsetLeft + offsetWidth, "bottom": offsetTop + offsetHeight};
}


/*
 获取指定网址的内容并调用函数处理此内容
 url -> 网址
 callback ->回调函数，函数调用的时候会有两个参数：data, responseCode，data 就是 responseText(responseXML)，responseCode 就是 status;
 data -> 要 post 的数据，get 方式时此参数可省略。
 responseType -> 获取的内容类型
                responseText 返回数据为字符性文本数据 数据源为任何文本性数据
                responseXML 返回数据为DOM对象，可以用JS通过DOM进行加工控制的，单源数据必须是XML
                responsebody 返回的是二进制数据，可以通过Adodb.Stream进行加工控制，数据源可以为任何数据
 */
function DownloadUrl(url, callback, data, responseType)
{
    url += url.indexOf("?") >= 0 ? "&" : "?";
    url += "random_download_url=" + Math.random();
    if (typeof(data) == "undefined") var data = null;
    if (typeof(responseType) == "undefined") var responseType = "responseText";
    var method = data ? "POST" : "GET";

    // create XMLHttpRequest object
    if (window.XMLHttpRequest)
        var objXMLHttpRequest = new XMLHttpRequest();
    else
    {
        var MSXML = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
        for(var n = 0; n < MSXML.length; n ++)
        {
            try
            {
                var objXMLHttpRequest = new ActiveXObject(MSXML[n]);
                break;
            }
            catch(e) {}
        }
    }

    // send request
    with(objXMLHttpRequest)
    {
        //setTimeouts(30*1000,30*1000,30*1000,30*60*1000);
        try
        {
            open(method, url, true);

            if (method == "POST")
                setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            send(data);
        }
        catch(e) {alert(e);}

        // on ready
        onreadystatechange = function()
        {
            if (objXMLHttpRequest.readyState == 4)
            {
                callback(objXMLHttpRequest[responseType], objXMLHttpRequest.status);
                delete(objXMLHttpRequest);
            }
        }
    }
}


/*
 根据传递的正则表达式验证值
 name -> 被验证的页面元素的名称(应该保证这个名称和所有的id不一样)
 re -> 验证元素值的正则表达式
 description -> 验证失败显示提示信息时对这个元素的称呼
 required -> 是否是必填项

 常用正则表达式
 汉字 [\u4E00-\u9FA5]
 全角字母和数字 [\u0030-\u0039]|[\u0041-\u007A]|[\uFF10-\u0019]|[\uFF21-\uFF5A]
*/
function CheckFormat(name, re, description, required)
{
    if (typeof(name) == "string") var e = document.getElementsByName(name)[0];
    if (!e) return true;

    if (typeof(description) == "undefined") description = "此处";
    if (typeof(required) == "undefined") required = true;

    var type = re;
    if (typeof(re) == "string")
    {
        switch (re)
        {
            case "" : re = /^.+$/m; break;
            case "email" : re = /^[\.\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/; break;
            case "zipcode" : re = /^\d{6}$/; break;
            case "telephone" : re = /^[\d\(\)\-,;: ]{7,}$/; break;
            case "date" : re = /^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/; break;
            case "username" : re = /^[a-zA-z][a-zA-z0-9_]{3,}$/; break;
            case "password" : re = /^.{6,}$/; break;
        }
    }

    if (required)
    {
        if (e.value == "")
        {
            //alert("必须填写 " + description);
            alert(description + " may not be blank");
            try {e.focus();} catch(e) {}
            return false;
        }
    }
    else
        if (e.value == "") return true;

    if (!re.test(e.value))
    {
        if (type == "username")
            alert(description + " 必须以字母开始并以字母、数字和下划线组成, 且长度不能小于 4");
        else if (type == "password")
            alert(description + " 长度不能小于 6 个字符");
        else if (type == "date")
            alert(description + " 的格式不正确 (1949-10-01)")
        else
            //alert(description + " 不正确");
            alert(description + " invalid");
        try {e.focus();} catch(e) {}
        return false;
    }
    else
        return true;
}




/*
 按比例调整图象的大小
 eImg -> IMG 元素
 width -> 调整后的宽度
 height -> 调整后的高度
 imgBorder -> 图片边框
*/
function AdjustImage(eImg, imgWidth, imgHeight, imgBorder)
{
    var args = arguments.length;
    if (args < 3)
    {
        alert("AdjustImage 的参数不正确, 至少三个参数");
        return;
    }
    if (args >= 4) eImg.style.borderWidth = imgBorder;
    var image = new Image();
    image.onload = function()
    {
        eImg.removeAttribute("width");
        eImg.removeAttribute("height");
        eImg.style.width = "";
        eImg.style.height = "";
        if (this.height / this.width > imgHeight / imgWidth)
            eImg.style.height = Math.min(this.height, imgHeight);
        else
            eImg.style.width = Math.min(this.width, imgWidth);
    }
    image.src = eImg.src;
}


/* 转到指定页 */
function GoToPage(page)
{
    if (/^\d+$/.test(page))
    {
        var h = location.href;
        if (h.indexOf("?") == -1)
            h += "?page=1";
        else
        {
            if(h.indexOf("page=") == -1)
                h += "&page=1";
        }
        location.href = h.replace(/page=[0-9]*/ig, "page=" + page);
    }
    else
        alert("页号不正确");
}


/* 设置下拉列表框的值 */
function SetSelect(e, value)
{
    if (typeof(e) == "string")
        e = $(e);
    if (e && value)
        e.value = value;
    if (e.fireEvent)
        e.fireEvent("onchange");
    else
    {
        var evt = document.createEvent("Events");
        evt.initEvent("change", true, false);
        e.dispatchEvent(evt)
    }
}


/** 根据列表变量填充对应名称的 select 元素
 * selectName       被填充 select 的 id 或者 name
 * list             填充的数据列表变量
 * firstOptionText  如果需要在 select 前先额外添加一个项, 这个参数可以设置这个项的 text 属性
 * firstOptionText  如果需要在 select 前先额外添加一个项, 这个参数可以设置这个项的 value 属性
 */
function FillSelect(selectName, list, firstOptionText, firstOptionValue)
{
    if (typeof(firstOptionValue) == "undefined") firstOptionValue = "0";

    var eSelect = $(selectName);
    if (eSelect)
    {
        eSelect.innerHTML = "";

        /* ie bug, select 中不能直接用 innerHTML
        var arr = new Array();
        for (var i = 0; i < list.length; i++)
            arr[i] = "<OPTION value=\"" + list[i] + "\">" + list[i] + "</OPTION>";
        $(selectName).innerHTML = (firstOptionText ? "<OPTION value=\"" + firstOptionValue + "\">" + firstOptionText + "</OPTION>" : "") + arr.join();
        */


        if (typeof(firstOptionText) != "undefined")
        {
            var eOption = document.createElement("OPTION");
            eSelect.options.add(eOption);
            eOption.text = firstOptionText;
            eOption.value = firstOptionValue;
        }
        for (var i = 0, len = list.length; i < len; i++)
        {
            var eOption = document.createElement("OPTION");
            eSelect.options.add(eOption);
            eOption.text = list[i].name;
            eOption.value = list[i].value;
        }
    }
}


function DeleteSelectItems(selectName, list)
{
    if (list.length == 0) return;
    var eSelect = $(selectName);
    if (!eSelect) return;

    var llen = list.length;
    var opts = eSelect.options;
    for (var i = opts.length - 1; i >= 0 ; i--)
    {
        for (var j = 0; j < llen; j++)
        {
            if (list[j].value == opts[i].value)
            {
                opts.remove(i);
                break;
            }
        }
    }
}


top.adminKey = false;
function SetAdminKey()
{
    try {if (event.keyCode == "192") top.adminKey = true;}
    catch(e) {}
}
function UnsetAdminKey()
{
    try {if (event.keyCode == "192") top.adminKey = false;}
    catch(e) {}
}
function OpenAdminPage()
{
    if (top.adminKey === true)
        window.open("admin/");
}
if (document.attachEvent)
{
    document.attachEvent("onkeydown", SetAdminKey);
    document.attachEvent("onkeyup", UnsetAdminKey);
    document.attachEvent("ondblclick", OpenAdminPage);
}
else
{
    document.addEventListener("keydown", SetAdminKey, false);
    document.addEventListener("keyup", UnsetAdminKey, false);
    document.addEventListener("dblclick", OpenAdminPage, false);
}