/**
 * 通用对象以及函数。
 * @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
 */


/**
 * 给天赋定位。
 * @param 指定天赋类的视图实例。
 */
function locateTalent(talentClassView, xOffset, yOffset){
    if ( null == xOffset ){
        xOffset = 0;
    }
    if ( null == yOffset ){
        yOffset = 0;
    }
    var tvs = talentClassView.model.getTalentViews();
    for ( var tier = 0; tier < MAX_TIER; tier++ ){
        for ( var pos = 0; pos < MAX_COLUMN; pos++ ){
            var obj = document.getElementById(talentClassView.getAreaId(pos, tier));
            if ( null == obj ){
                continue;
            }
            var posObj = new PosObject(talentClassView.getGridId(pos, tier));
            obj.style.left = posObj.left + xOffset;
            obj.style.top = posObj.top + yOffset;

        }
    }
    for ( var key in tvs ){
        var obj = document.getElementById(talentClassView.getAreaId(tvs[key].column, tvs[key].model.tier));
        setTalentStyle(talentClassView, tvs[key]);

        var iconObj = document.getElementById(talentClassView.getIconId(tvs[key].model.id));
        if ( null != iconObj )
        {
            if ( null == IMAGE_POOL[talentClassView.model.path + "/" + tvs[key].icon])
            {
                iconObj.src = IMAGE_PATH + "/" + NOT_EXIST_IMAGE;
            }
            else
            {
                iconObj.src = IMAGE_POOL[talentClassView.model.path + "/" + tvs[key].icon].src;
            }
        }
    }
}

/**
 * 给天赋级别定位。目前定位于图标的右下方。
 * @param 指定天赋类的视图实例。
 */
function locateTalentRank(talentClassView, xOffset, yOffset){
    if ( null == xOffset ){
        xOffset = 0;
    }
    if ( null == yOffset ){
        yOffset = 0;
    }
    var tvs = talentClassView.model.getTalentViews();
    for ( var key in tvs ){
        var pos = new PosObject(talentClassView.getGridId(tvs[key].column, tvs[key].model.tier));

        /* 给天赋级别显示区定位。 */
        var rankAreaObj = document.getElementById(talentClassView.getRankAreaId(tvs[key].model.id));
        if ( null != rankAreaObj ){
            rankAreaObj.style.left = pos.left + talentClassView.getImageWidth() - 4 + xOffset;
            rankAreaObj.style.top = pos.top - 4 + talentClassView.getImageHeight() + yOffset;
            /* 在网站上时，此类代码会导致大量的图片被下载，故此注释掉。 *\
            rankAreaObj.className = getRankAreaStyle(tvs[key]);
            \************************************************/
        }

        /* 设置天赋级别以及显示风格。 */
        var rankObj = document.getElementById(tvs[key].model.id + "_RANK");
        if ( null != rankObj )
        {
            rankObj.firstChild.nodeValue = tvs[key].getRank();
            if ( rankObj.className != getRankStyle(tvs[key]) ){
                rankObj.className = getRankStyle(tvs[key]);
            }
        }
    }
}

function relocateTalentRank(){
    for(var i = 0; i<TALENT_CLASS_VIEWS.length; i++) {
        try{
            locateTalentRank(TALENT_CLASS_VIEWS[i]);
        } catch(e){
        }
    }

}

/**
 * 格式化天赋说明的字符串。
 * @param data 天赋效果数据。
 * @create 2004-10-10 source0
 */
function formatTalentEffects(tv){
    var rt = tv.model.data.description;
    if ( TALENT_TYPE_IMPROVE != tv.model.type ){
        return rt;
    }
    if ( tv.model.data.effects.length <= 0 ){
        return rt;
    }
    var effect = tv.model.data.effects[0];

    var rankStyle = getRankStyle(tv);
    var spanStart = "<span class=commonText><span class=" + rankStyle + ">&nbsp;";
    var spanEnd = "&nbsp;</span></span>";

    if ( rt.indexOf("%EFFECT_") >= 0 ){
        for ( var ek in tv.model.data.effects ){
            effect = tv.model.data.effects[ek];
            var value = effect.getValue(tv.getRank());
            if ( tv.getRank() <= 0 ){
                value = 0;
            }
            rt = rt.replace("%EFFECT_" + ek + "%", spanStart + value + effect.unit + spanEnd);
        }
    } else {
        rt += " : " + spanStart + effect.getValue(tv.getRank()) + effect.unit + spanEnd;
    }
    return rt;
}


function formatTime(sec){
    var time = new String();
    if ( sec >= 86400 ){
        time += sec / 86400 + " 天 ";
        sec %= 86400;
    }
    if ( sec >= 3600 ){
        time += sec / 3600 + " 小时 ";
        sec %= 3600;
    }
    if ( sec >= 60 ){
        time += sec / 60 + " 分钟 ";
        sec %= 60;
    }
    if ( sec > 0 ){
        time += sec + " 秒";
    }
    return time;
}

/**
 * 得到指定人物级别下人物级别和所需点数的显示风格。
 * @param rank 人物级别。
 * @return 如果小于 60，显示正常，等于60，显示最大值，大于60，显示警告。
 * @create 2004-10-19 source0
 */
function getRoleRankStyle(rank){
    if ( rank < 60 ){
        return "roleRankValid";
    } else if ( rank == 60 ){
        return "roleRankMax";
    } else {
        return "roleRankInvalid";
    }
}

/**
 * 得到指定天赋的CSS样式。
 * @param tv 天赋视图实例。
 * @return CSS样式名。
 */
function getTalentStyle(tv, isMouseDown){
    if ( CURRENT_ROLE.getUsedPoints() >=51 )
    {
        if ( tv.getRank() <= 0 ) {
            return "talentInvalid";
        } else {
            return "talentMax";
        }
    }
    else
    {
        if ( !tv.isValid() ){
            return "talentInvalid";
        } else if ( tv.isValid() && ( tv.getRank() < tv.model.data.maxRank )){
            if ( isMouseDown ){
                return "talentValidMouseDown";
            } else {
                return "talentValid";
            }
        } else {
            return "talentMax";
        }
    }

}
/**
 * 设置指定天赋的CSS样式。
 * @param tcv 天赋系视图。
 * @param tv 天赋视图实例。
 * @param isMouseDown 鼠标是否按下。
 * @create 2004-10-21 source0
 */
function setTalentStyle(tcv, tv, isMouseDown){
    var styleName = getTalentStyle(tv, isMouseDown);
    var obj = document.getElementById(tcv.getAreaId(tv.column, tv.model.tier));
    if ( null == obj )
    {
        return;
    }
    if ( obj.className != styleName ){
        obj.className = styleName;
        setCursorOnTalentView(tv, obj);
    }

}
/**
 * 得到指定天赋级别的背景区的CSS样式。
 * @param tv 天赋视图实例。
 * @return CSS样式名。
 * @create 2004-10-19 source0
 */
function getRankAreaStyle(tv){
    if ( CURRENT_ROLE.getUsedPoints() >=51 )
    {
        if ( tv.getRank() <= 0 ) {
            return "talentRankAreaInvalid";
        } else {
            return "talentRankAreaMax";
        }
    }
    else
    {
        if ( !tv.isValid() ){
            return "talentRankAreaInvalid";
        } else if ( tv.isValid() && ( tv.getRank() < tv.model.data.maxRank )){
            return "talentRankAreaValid";
        } else {
            return "talentRankAreaMax";
        }
    }
}
/**
 * 得到指定天赋级别的CSS样式。
 * @param tv 天赋视图实例。
 * @return CSS样式名。
 */
function getRankStyle(tv){
    if ( !tv.isValid() ){
        return "talentRankValueInvalid";
    } else if ( tv.isValid() && ( tv.getRank() < tv.model.data.maxRank )){
        return "talentRankValueValid";
    } else {
        return "talentRankValueMax";
    }
}

/**
 * 刷新指定天赋类的天赋视图。
 * @param tcv 天赋类视图实例。
 * @param id 发生变化的天赋。如果为 null，则刷新所有天赋的值。
 */
function refreshTalentClassView(tcv, id){
    var talentClass = tcv.model;

    /* 修改本类天赋的总点数的显示值。 */
    if ( document.getElementById(talentClass.id + "_AMOUNT") )
    {
        if ( talentClass.getAmount() > 0 ){
            document.getElementById(talentClass.id + "_AMOUNT").className = "talentClassAmount";
            document.getElementById(talentClass.id + "_AMOUNT").firstChild.nodeValue = talentClass.getAmount() + "点";
        } else {
            document.getElementById(talentClass.id + "_AMOUNT").className = "talentClassAmountNoData";
            document.getElementById(talentClass.id + "_AMOUNT").firstChild.nodeValue = "　　";
        }
    }

    /* 以下修改天赋状态。 */
    var talents = talentClass.getTalentViews();

    /* 修改天赋图标和天赋级别的值。 */
    if ( null != id ){
        var tv = talentClass.getTalentView(id);

        /* 修改天赋图标的外框和鼠标光标。*/
        var obj = document.getElementById(tcv.getAreaId(tv.column, tv.model.tier));
        setTalentStyle(tcv, tv);

        obj = document.getElementById(id + "_RANK");
        obj.firstChild.nodeValue = tv.getRank();
    } else {
        for ( var key in talents ){
            id = key;
            var tv = talents[key];
            var obj = document.getElementById(id + "_RANK");
            obj.firstChild.nodeValue = tv.getRank();
        }
    }

    /* 修改活动提示区的内容。 */
    var toolTipArea = document.getElementById("TOOL_TIP_AREA");
    if ( toolTipArea.style.display != "none" ){
        setInnerHTML(toolTipArea, getTalentInfo(talentClass, id));
    }

    /* 刷新所有天赋图标及天赋级别的显示。 */
    for ( var key in talents ){
        var tv = talents[key];
        obj = document.getElementById(tcv.getAreaId(tv.column, tv.model.tier));
        setTalentStyle(tcv, tv);

        /* 在网站上时，此类代码会导致大量的图片被下载，故此注释掉。 *\
        obj = document.getElementById(tcv.getRankAreaId(tv.model.id));
        obj.className = getRankAreaStyle(tv);
        \************************************************/

        obj = document.getElementById(tv.model.id + "_RANK");
        if ( obj.className != getRankStyle(tv) ){
            obj.className = getRankStyle(tv);
        }
    }

}



/**
 * 设置指定天赋视图上的鼠标光标。
 * @param tv 天赋视图实例。
 * @param obj 视图所在的HTML元素。
 */
function setCursorOnTalentView(tv, obj){
    /* 在网站上时，此类代码会导致大量的图片被下载，故此注释掉。 *\
    if ( IS_SUPPORT_CUSTOM_CURSOR ){
        if ( !tv.isValid() ){
            obj.style.cursor = "url(" + CUR_PATH + "/curdisable.cur), hand";
        } else if ( tv.getRank() >= tv.model.data.maxRank){
            obj.style.cursor = "url(" + CUR_PATH + "/curgld.cur), hand";
        } else {
            obj.style.cursor = "url(" + CUR_PATH + "/curenable.cur), hand";
        }
    } else {
        obj.style.cursor = "hand";
    }
    \************************************************/
}

/**
 * 隐藏天赋系列表提示区。
 * @param index 天赋系序号。
 */
function hideTalentsListArea(index){
    var areaObj = document.getElementById("TALENTS_LIST_AREA_" + index);
    areaObj.style.display = 'none';
}

/**
 * 显示天赋系天赋内加点情况的列表并进行定位。
 * @param index 天赋系序号。
 * @param e 鼠标事件（仅对mozilla）。
 */
function showTalentsListArea(index, e){
    var areaObj = document.getElementById("TALENTS_LIST_AREA_" + index);
    areaObj.style.display = '';
    setFloatAreaPos("TALENTS_LIST_AREA_" + index, e);
}