/**
 * 通用函数。
 * @create   2004-09-29 source0
 * @author   source0 source0@hotmail.com
 * @copyright 版权所有（C） 2004  source0
 *                这一程序是自由软件，你可以遵照自由软件基金会出版的GNU通用
 *            公共许可证条款来修改和重新发布这一程序。或者用许可证的第二版，
 *            或者（根据你的选择）用任何更新的版本。
 *                发布这一程序的目的是希望它有用，但没有任何担保。甚至没有
 *            适合特定目的的隐含的担保。更详细的情况请参阅GNU通用公共许可证。
 *                你应该已经和程序一起收到一份GNU通用公共许可证的副本。如果
 *            还没有，写信给：
 *                The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
 *                MA02139, USA
 */

/** 默认的语言。 */
var DEFAULT_LANGUAGE = "zh_CN";

var IS_MOZILLA = /Netscape/.test(navigator.appName);
var IS_MSIE = /Microsoft Internet Explorer/.test((navigator.appName));
var IS_SUPPORT_CUSTOM_CURSOR = IS_MSIE;
if ( IS_MSIE ){
    var ieVersion = navigator.appVersion.substring(4 + parseInt(navigator.appVersion.indexOf("MSIE")), navigator.appVersion.length);
    ieVersion = ieVersion.substring(0, ieVersion.indexOf(';'));
    IS_SUPPORT_CUSTOM_CURSOR = IS_SUPPORT_CUSTOM_CURSOR && (parseFloat(ieVersion) > 5.5);
}

var TOOL_TIP_AREA_WIDTH = 240;

/* 存放图片缓冲的池对象。key=url, value=Image对象的实例。 */
var IMAGE_POOL = new Array();

var IMAGE_PATH = "common/image";
//var CUR_PATH = "common/cursor";
var NOT_EXIST_IMAGE = "unknown.jpg";

var MESSAGE_TYPE_ERROR = "ERROR";
var MESSAGE_TYPE_WARN = "WARN";
var MESSAGE_TYPE_INFO = "INFO";

/** 当前显示的角色。 */
var CURRENT_ROLE = null;

/** 保存所有天赋系视图实例的数组。 */
var TALENT_CLASS_VIEWS = new Array();

/**
 * 对字符串进行编码，将括号等HTML标记替换为转义字符。
 * @param str 字符串。
 * @return 编码后的字符串。
 * @create 2004-10-16 source0
 */
function encodeTag(str){
    str = "" + str;
    if (IS_MOZILLA){
        str = str.replace(/&/g, "&amp;")
        str = str.replace(/\"/g, "&quot;");
        str = str.replace(/</g, "&lt;");
        str = str.replace(/>/g, "&gt;");
    } else if (IS_MSIE){
        str = str.replace(/\"/g, "&quot;");
        str = str.replace(/</g, "&lt;");
        str = str.replace(/>/g, "&gt;");
        str = str.replace(/&/g, "&amp;")
    }
    return str;
}

/**
 * 替换指定对象的内部HTML文本。
 * @param object HTML对象。
 * @param html 新的HTML文本。
 */
function setInnerHTML(object, html)
{
    if(IS_MOZILLA){
        var r = object.ownerDocument.createRange();
        r.selectNodeContents(object);
        r.deleteContents();
        var df = r.createContextualFragment(html);
        object.appendChild(df);
    } else if(IS_MSIE){
        object.innerHTML = html;
    }
}
/**
 * 替换指定对象外部的HTML文本。
 * @param object HTML对象。
 * @param html 新的HTML文本。
 */
function setOuterHTML(object, html){
    if(IS_MOZILLA){
        var r = object.ownerDocument.createRange();
        r.setStartBefore(object);
        var df = r.createContextualFragment(html);
        object.parentNode.replaceChild(df, object);
    } else if(IS_MSIE){
        object.outerHTML = html;
    }

}
var _leafElems = ["IMG", "HR", "BR", "INPUT"];
var leafElems = {};
for (var i=0; i<_leafElems.length; i++){
    leafElems[_leafElems[i]] = true;
}
function getInnerHTML(node) {
    if(IS_MSIE){
        return node.innerHTML;
    }
    var str = "";
    for (var i = 0; i < node.childNodes.length; i++)
        str += getOuterHTML(node.childNodes.item(i));
    return str;
}

function getOuterHTML(node) {
    if(IS_MSIE){
        return node.outerHTML;
    }
    var str = "";

    switch (node.nodeType) {
        case 1: // ELEMENT_NODE
            str += "<" + node.nodeName;
            for (var i=0; i<node.attributes.length; i++) {
                if ((node.attributes.item(i).nodeValue != null)
                    && (node.attributes.item(i).nodeValue.length > 0)){
                    str += " "
                    str += node.attributes.item(i).nodeName;
                    str += "=\"";
                    str += node.attributes.item(i).nodeValue;
                    str += "\"";
                }
            }

            if (node.childNodes.length == 0 && leafElems[node.nodeName]){
                str += "/>";
            } else {
                str += ">";
                str += getInnerHTML(node);
                str += "</" + node.nodeName + ">"
            }
            break;

        case 3: //TEXT_NODE
            str += node.nodeValue;
            break;

        case 4: // CDATA_SECTION_NODE
            str += "<![CDATA[" + node.nodeValue + "]]>";
            break;

        case 5: // ENTITY_REFERENCE_NODE
            str += "&" + node.nodeName + ";"
            break;

        case 8: // COMMENT_NODE
            str += "<!--" + node.nodeValue + "-->"
            break;
    }

    return str;
}

