var spell_list=new Array;function CalculateSustainedDamage(base_dmg,calculate_sustatined_dmg,skill,base_calc){if(!calculate_sustatined_dmg||base_calc){return Math.round(base_dmg*100)/100;}else{var adjusted_dmg=(base_dmg*CalculateCritBonus(skill,base_calc)*skill.crit_chance)+(base_dmg*(1-skill.crit_chance));return Math.round(adjusted_dmg*100)/100;}}function CalculateTotalDamage(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;if(skill.aoe)aoe_message="*";else aoe_message="";skill_damage_lower=skill.damage_lower;skill_damage_upper=skill.damage_upper;skill_dot=skill.dot;skill_casting_time=skill.casting_time;if(base_calc==true){skill_damage_lower=skill.damage_lower_original;skill_damage_upper=skill.damage_upper_original;skill_dot=skill.dot_original;skill_casting_time=skill.casting_time_original;}if(skill_damage_lower&&!skill_dot){total_damage=(skill_damage_lower+skill_damage_upper)/2;if(critical_hit)total_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)total_damage*=skill.aoe_modifier;if(!base_calc&&skill.ignite_effect&&(critical_hit||(sustained_damage&&skill.can_crit&&skill.crit_chance>0))){total_dd_damage=CalculateSustainedDamage(total_damage,sustained_damage,skill,base_calc);total_ignite_damage=total_dd_damage*skill.ignite_effect;if(sustained_damage)total_ignite_damage*=skill.crit_chance;total_ignite_damage=Math.round(total_ignite_damage*100)/100;total_damage=Math.round((total_dd_damage+total_ignite_damage)*100)/100;return(total_damage)+"<br><span class='verdana9' style='color: #333'>("+total_dd_damage+" + <i>"+total_ignite_damage+"</i>)</span>"+aoe_message;}return CalculateSustainedDamage(total_damage,sustained_damage,skill,base_calc)+aoe_message;}else if(skill_damage_lower&&skill_dot){total_dd_damage=(skill_damage_lower+skill_damage_upper)/2;if(critical_hit)total_dd_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)total_dd_damage*=skill.aoe_modifier;total_dd_damage=CalculateSustainedDamage(total_dd_damage,sustained_damage,skill,base_calc);total_dot_damage=skill_dot;if(skill.aoe_modifier!=null)total_dot_damage*=skill.aoe_modifier;total_dot_damage=Math.round(total_dot_damage*100)/100;if(!base_calc&&skill.ignite_effect&&(critical_hit||(sustained_damage&&skill.can_crit&&skill.crit_chance>0))){total_ignite_damage=total_dd_damage*skill.ignite_effect;if(sustained_damage)total_ignite_damage*=skill.crit_chance;total_ignite_damage=Math.round(total_ignite_damage*100)/100;total_damage=Math.round((total_dd_damage+total_dot_damage+total_ignite_damage)*100)/100;return(total_damage)+"<br><span class='verdana9' style='color: #333'>("+total_dd_damage+" + "+total_dot_damage+" + <i>"+total_ignite_damage+"</i>)</span>"+aoe_message;}total_damage=Math.round((total_dd_damage+total_dot_damage)*100)/100;return(total_damage)+"<br><span class='verdana9' style='color: #333'>("+total_dd_damage+" + "+total_dot_damage+")</span>"+aoe_message;}else if(skill_dot){total_damage=skill_dot;if(skill.casting_time==-2&&critical_hit)total_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)total_damage*=skill.aoe_modifier;total_damage=CalculateSustainedDamage(total_damage,sustained_damage,skill,base_calc);return Math.round(total_damage*100)/100+aoe_message;}}function CalculateTotalHeal(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;if(skill.aoe)aoe_message="*";else aoe_message="";skill_heal_lower=skill.heal_lower;skill_heal_upper=skill.heal_upper;skill_hot=skill.hot;skill_casting_time=skill.casting_time;if(base_calc==true){skill_heal_lower=skill.heal_lower_original;skill_heal_upper=skill.heal_upper_original;skill_hot=skill.hot_original;skill_casting_time=skill.casting_time_original;}if(skill_heal_lower&&!skill_hot){total_heal=(skill_heal_lower+skill_heal_upper)/2;if(critical_hit)total_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)total_heal*=skill.aoe_modifier;return CalculateSustainedDamage(total_heal,sustained_damage,skill,base_calc)+aoe_message;}else if(skill_heal_lower&&skill_hot){total_dh_heal=(skill_heal_lower+skill_heal_upper)/2;if(critical_hit)total_dh_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)total_dh_heal*=skill.aoe_modifier;total_dh_heal=CalculateSustainedDamage(total_dh_heal,sustained_damage,skill,base_calc);total_hot_heal=skill_hot;if(skill.aoe_modifier!=null)total_hot_heal*=skill.aoe_modifier;total_hot_heal=Math.round(total_hot_heal*100)/100;total_heal=Math.round((total_dh_heal+total_hot_heal)*100)/100;return(total_heal)+"<br><span class='verdana9'>("+total_dh_heal+" + "+total_hot_heal+")</span>"+aoe_message;}else if(skill_hot){total_heal=skill_hot;if(skill.casting_time==-2&&critical_hit)total_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)total_heal*=skill.aoe_modifier;return Math.round(total_heal*100)/100+aoe_message;}}function CalculateAverageHit(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;if(skill.aoe)aoe_message="*";else aoe_message="";skill_damage_lower=skill.damage_lower;skill_damage_upper=skill.damage_upper;skill_dot=skill.dot;if(base_calc==true){skill_damage_lower=skill.damage_lower_original;skill_damage_upper=skill.damage_upper_original;skill_dot=skill.dot_original;}if(skill_damage_lower!=""&&skill_dot==""){average_damage=(skill_damage_lower+skill_damage_upper)/2;if(critical_hit)average_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_damage*=skill.aoe_modifier;if(!base_calc&&skill.ignite_effect&&(critical_hit||(sustained_damage&&skill.can_crit&&skill.crit_chance>0))){average_dd_damage=CalculateSustainedDamage(average_damage,sustained_damage,skill,base_calc);average_ignite_damage=average_dd_damage*skill.ignite_effect/2;if(sustained_damage)average_ignite_damage*=skill.crit_chance;average_ignite_damage=Math.round(average_ignite_damage*100)/100;return average_dd_damage+"<br><span class='verdana9'><i>["+Math.round(average_ignite_damage*100)/100+"]</i></span>"+aoe_message;}return CalculateSustainedDamage(average_damage,sustained_damage,skill,base_calc)+aoe_message;}else if(skill_damage_lower!=""&&skill_dot!=""){dd_average_damage=(skill_damage_lower+skill_damage_upper)/2;if(critical_hit)dd_average_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)dd_average_damage*=skill.aoe_modifier;dd_average_damage=CalculateSustainedDamage(dd_average_damage,sustained_damage,skill,base_calc);dot_average_damage=Math.round(skill_dot/skill.dot_ticks*100)/100;if(skill.aoe_modifier!=null)dot_average_damage*=skill.aoe_modifier;if(!base_calc&&skill.ignite_effect&&(critical_hit||(sustained_damage&&skill.can_crit&&skill.crit_chance>0))){dot_total_damage=skill_dot;if(skill.aoe_modifier!=null)dot_total_damage*=skill.aoe_modifier;average_ignite_damage=dd_average_damage*skill.ignite_effect/2;if(sustained_damage)average_ignite_damage*=skill.crit_chance;average_ignite_damage=Math.round(average_ignite_damage*100)/100;return(dd_average_damage)+"<br>["+dot_average_damage+"] <span class='verdana9'><i>["+average_ignite_damage+"]</i></span>"+aoe_message;}return dd_average_damage+"<br>["+dot_average_damage+"]"+aoe_message;}else if(skill_dot!=""){average_damage=skill_dot/skill.dot_ticks;if(skill.casting_time==-2&&critical_hit)average_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_damage*=skill.aoe_modifier;average_damage=CalculateSustainedDamage(average_damage,sustained_damage,skill,base_calc);return Math.round(average_damage*100)/100+aoe_message;}}function CalculateAverageHeal(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;if(skill.aoe)aoe_message="*";else aoe_message="";skill_heal_lower=skill.heal_lower;skill_heal_upper=skill.heal_upper;skill_hot=skill.hot;if(base_calc==true){skill_damage_lower=skill.damage_lower_original;skill_damage_upper=skill.damage_upper_original;skill_dot=skill.dot_original;}if(skill_heal_lower!=""&&skill_hot==""){average_heal=(skill_heal_lower+skill_heal_upper)/2;if(critical_hit)average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_heal*=skill.aoe_modifier;return CalculateSustainedDamage(average_heal,sustained_damage,skill,base_calc)+aoe_message;}else if(skill_heal_lower!=""&&skill_hot!=""){dh_average_heal=(skill_heal_lower+skill_heal_upper)/2;if(critical_hit)dh_average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)dh_average_heal*=skill.aoe_modifier;dh_average_heal=CalculateSustainedDamage(dh_average_heal,sustained_damage,skill,base_calc);hot_average_heal=skill_hot/skill.hot_ticks;if(skill.aoe_modifier!=null)hot_average_heal*=skill.aoe_modifier;return dh_average_heal+"<br><span class='verdana9'>("+Math.round(hot_average_heal*100)/100+")"+aoe_message;}else if(skill_hot!=""){average_heal=skill_hot/skill.hot_ticks;if(skill.casting_time==-2&&critical_hit)average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_heal*=skill.aoe_modifier;return Math.round(average_heal*100)/100+aoe_message;}}function CalculateCritBonus(skill,base_calc){var base_crit_bonus=.5;if(base_calc){return 1+base_crit_bonus;}else{return 1+(base_crit_bonus*=(1+skill.crit_bonus));}}function CalculateCritChance(skill,base_calc){var base_crit_chance=document.getElementById("crit_chance_base").value;if(skill.can_crit=="0")return 0;if(base_calc){return base_crit_chance;}else{var crit_rating=document.getElementById("crit_rating").value;var crit_chance=((base_crit_chance/100)+(crit_rating/2210)+skill.crit_chance);if(crit_chance>1)crit_chance=1;return Math.round(crit_chance*10000)/10000;}}function CalculateBonusDamage(skill,initial){plus_to_damage=parseInt(document.getElementById('plus_to_dmg_and_healing').value);if(document.forms[0].mind_mastery_dmg_bonus)plus_to_damage+=parseInt(document.forms[0].mind_mastery_dmg_bonus.value);if(initial==true)plus_to_damage=100;benefit_percentage_dd=0;benefit_percentage_dot=0;casting_time_actual=0;if(skill.casting_time_original==""){casting_time_actual=1.5;}else if(skill.casting_time_original>=0){casting_time_actual=skill.casting_time_original/10;}if((skill.damage_lower!=""&&skill.dot==""&&casting_time_actual>=0)||skill.parent_name=="Fireball"){benefit_percentage_dd=(casting_time_actual/3.5);skill.dd_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dd)*plus_to_damage;skill.dd_bonus=Math.round(skill.dd_bonus*100)/100;}else if(skill.casting_time_original==-2){benefit_percentage_dot=(skill.dot_duration_original/3.5);skill.dot_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dot)*plus_to_damage;skill.dot_bonus=Math.round(skill.dot_bonus*100)/100;}else if(skill.damage_lower==""&&skill.dot!=""){benefit_percentage_dot=(skill.dot_ticks/5);skill.dot_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dot)*plus_to_damage;skill.dot_bonus=Math.round(skill.dot_bonus*100)/100;}else if(skill.damage_lower!=""&&skill.dot!=""){benefit_percentage_dot=(skill.dot_ticks/5)/((skill.dot_ticks/5)+(casting_time_actual/3.5));if(skill.parent_name=="Pyroblast"){benefit_percentage_dot=.714;}skill.dot_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dot)*plus_to_damage;skill.dot_bonus=Math.round(skill.dot_bonus*100)/100;benefit_percentage_dd=1-benefit_percentage_dot;if(skill.parent_name=="Pyroblast"){benefit_percentage_dd=1;}skill.dd_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dd)*plus_to_damage;skill.dd_bonus=Math.round(skill.dd_bonus*100)/100;}}function CalculateBonusHeal(skill,initial){plus_to_heal=Math.round(document.getElementById('plus_to_dmg_and_healing').value);plus_to_heal+=Math.round(document.getElementById('plus_to_healing').value);if(initial==true)plus_to_heal=100;benefit_percentage_dh=0;benefit_percentage_hot=0;casting_time_actual=0;if(skill.casting_time_original==""){casting_time_actual=1.5;}else if(skill.casting_time_original>=0){casting_time_actual=skill.casting_time_original/10;}if(skill.heal_lower!=""&&skill.hot==""&&casting_time_actual>=0){benefit_percentage_dh=(casting_time_actual/3.5);skill.dh_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dh)*plus_to_heal;skill.dh_bonus=Math.round(skill.dh_bonus*100)/100;}else if(skill.casting_time_original==-2){benefit_percentage_hot=(skill.hot_duration/3.5);skill.hot_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_hot)*plus_to_heal;skill.hot_bonus=Math.round(skill.hot_bonus*100)/100;}else if(skill.heal_lower==""&&skill.hot!=""){benefit_percentage_hot=(skill.hot_ticks/5);skill.hot_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_hot)*plus_to_heal;skill.hot_bonus=Math.round(skill.hot_bonus*100)/100;}else if(skill.heal_lower!=""&&skill.hot!=""){benefit_percentage_hot=(skill.hot_ticks/5)/((skill.hot_ticks/5)+(casting_time_actual/3.5));skill.hot_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_hot)*plus_to_heal;skill.hot_bonus=Math.round(skill.hot_bonus*100)/100;benefit_percentage_dh=1-benefit_percentage_hot;skill.dh_bonus=CalculateBonusDamagePenalties(skill,benefit_percentage_dh)*plus_to_heal;skill.dh_bonus=Math.round(skill.dh_bonus*100)/100;}}function CalculateBonusDamagePenalties(skill,benefit_percentage){if(skill.binary_spell==1){benefit_percentage*=.95;}if(skill.level<20){benefit_percentage*=(1-(20-skill.level)*.0375);}if(skill.aoe==1){benefit_percentage/=3;}if(skill.dmg_and_heal_penalty==1&&!skill.id_name.match("holy_shock")){benefit_percentage/=2;}if(skill.parent_name=="Ice Lance"){benefit_percentage/=3;}if(benefit_percentage<0){benefit_percentage=0;}var current_level=document.getElementById("txt_level_posted").value;var downranking_percentage=((skill.next_rank_level+6)/current_level);if(downranking_percentage>1)downranking_percentage=1;benefit_percentage*=downranking_percentage;benefit_percentage+=skill.coefficient_bonus;benefit_percentage*=CalculateCoefficientBonus(skill);return benefit_percentage;}function CalculateCoefficientBonus(skill){return(1+skill.coefficient_bonus2);}function DisplayBonusDamage(skill){CalculateBonusDamage(skill,true);if(skill.dd_bonus!=""&&skill.dot_bonus!=""){msg=(Math.round((skill.dd_bonus+skill.dot_bonus)*100)/100)+"%<br><span class='verdana9'>("+skill.dd_bonus+" + "+skill.dot_bonus+")</span>";}else if(skill.dd_bonus!=""){msg=skill.dd_bonus+"%";}else if(skill.dot_bonus!=""){msg=skill.dot_bonus+"%";}else{msg="0%";}CalculateBonusDamage(skill,false);return msg;}function DisplayBonusHeal(skill){CalculateBonusHeal(skill,true);if(skill.dh_bonus!=""&&skill.hot_bonus!=""){msg=(Math.round((skill.dh_bonus+skill.hot_bonus)*100)/100)+"%<br><span class='verdana9'>("+skill.dh_bonus+" + "+skill.hot_bonus+")</span>";}else if(skill.dh_bonus!=""){msg=skill.dh_bonus+"%";}else if(skill.hot_bonus!=""){msg=skill.hot_bonus+"%";}else{msg="0%";}CalculateBonusHeal(skill,false);return msg;}function CalculateBonusDamageForAllSpells(){for(i=0;i<spell_list.length;i++){if(spell_list[i][1].damage_lower||spell_list[i][1].dot){skill=spell_list[i];for(j=skill[1].max_rank;j>0;j--){if(skill[j].visible==1){CalculateBonusDamage(skill[j]);if(skill[j].damage_lower_base!=""){if(skill[j].damage_lower_base==skill[j].damage_lower){skill[j].damage_lower=skill[j].damage_lower_original+skill[j].dd_bonus;}if(skill[j].damage_upper_base==skill[j].damage_upper){skill[j].damage_upper=skill[j].damage_upper_original+skill[j].dd_bonus;}skill[j].damage_lower_base=skill[j].damage_lower_original+skill[j].dd_bonus;skill[j].damage_upper_base=skill[j].damage_upper_original+skill[j].dd_bonus;}if(skill[j].dot_base!=""){if(skill[j].dot_base==skill[j].dot){skill[j].dot=skill[j].dot_original+skill[j].dot_bonus;}skill[j].dot_base=skill[j].dot_original+skill[j].dot_bonus;}}else{break;}}}}TalentDamageOverlap();}function CalculateBonusDamageForSpell(skill){if(skill.damage_lower_base!=""){if(skill.damage_lower_base==skill.damage_lower){skill.damage_lower=(skill.damage_lower_original+skill.dd_bonus);}if(skill.damage_upper_base==skill.damage_upper){skill.damage_upper=(skill.damage_upper_original+skill.dd_bonus);}skill.damage_lower_base=(skill.damage_lower_original+skill.dd_bonus);skill.damage_upper_base=(skill.damage_upper_original+skill.dd_bonus);}if(skill.dot_base!=""){if(skill.dot_base==skill.dot){skill.dot=(skill.dot_original+skill.dot_bonus);}skill.dot_base=(skill.dot_original+skill.dot_bonus);}}function CalculateBonusHealForAllSpells(){if(window.TalentHealingOverlap==null)return false;for(i=0;i<spell_list.length;i++){if(spell_list[i][1].heal_lower||spell_list[i][1].hot){skill=spell_list[i];for(j=skill[1].max_rank;j>0;j--){if(skill[j].visible==1){CalculateBonusHeal(skill[j]);}else{break;}}}}TalentHealingOverlap();}function CalculateDPS(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;ddps=0;dotdps=0;totaldps=0;AoEMessage="";skill_damage_lower=skill.damage_lower;skill_damage_upper=skill.damage_upper;skill_dot=skill.dot;skill_casting_time=skill.casting_time;if(base_calc==true){skill_damage_lower=skill.damage_lower_original;skill_damage_upper=skill.damage_upper_original;skill_dot=skill.dot_original;skill_casting_time=skill.casting_time_original;}if(skill_casting_time<0)skill_casting_time=0;else skill_casting_time=skill_casting_time/10;if(skill_damage_lower!=""){average_damage=(skill_damage_lower+skill_damage_upper)/2;if(critical_hit)average_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_damage*=skill.aoe_modifier;average_damage=CalculateSustainedDamage(average_damage,sustained_damage,skill,base_calc);if(average_damage==0)return "0*";if(skill_casting_time==0)skill_casting_time=1.5;ddps=Math.round((average_damage/skill_casting_time)*100)/100;}if(skill_dot!=""){average_dot_damage=skill_dot;if(skill.casting_time_original==-2&&critical_hit)average_dot_damage*=CalculateCritBonus(skill,base_calc);if(skill.casting_time_original==-2&&sustained_damage)average_dot_damage=CalculateSustainedDamage(average_dot_damage,sustained_damage,skill,base_calc);if(skill.aoe_modifier!=null)average_dot_damage*=skill.aoe_modifier;if(average_dot_damage==0)return "0*";time=skill.dot_duration+skill_casting_time;if(skill.casting_time_original==0)time-=skill_casting_time;dotdps=Math.round((average_dot_damage/time)*100)/100;}if(ddps&&dotdps)totaldps=Math.round((ddps+dotdps)*100)/100;if(skill.aoe)AoEMessage="*";if(!base_calc&&skill.ignite_effect&&(critical_hit||(sustained_damage&&skill.can_crit&&skill.crit_chance>0))){if(skill_dot=="")skill_dot=0;time=4+skill_casting_time;if(skill.casting_time_original==0)time-=skill_casting_time;ignite_dps=average_damage*skill.crit_chance*skill.ignite_effect/time;ignite_dps=Math.round(ignite_dps*100)/100;if(totaldps)return Math.round((totaldps+ignite_dps)*100)/100+"<br><span class='verdana9' style='color: #333'>("+ddps+" + "+dotdps+" + <i>"+ignite_dps+"</i>)"+AoEMessage+"</span>";else return Math.round((ddps+ignite_dps)*100)/100+"<br><span class='verdana9' style='color: #333'>("+ddps+" + <i>"+ignite_dps+"</i>)"+AoEMessage+"</span>";}if(totaldps)return totaldps+"<br><span class='verdana9' style='color: #333'>("+ddps+" + "+dotdps+")"+AoEMessage+"</span>";else if(ddps)return ddps+AoEMessage;else if(dotdps)return dotdps+AoEMessage;}function CalculateHPS(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;dhps=0;hothps=0;totalhps=0;AoEMessage="";skill_heal_lower=skill.heal_lower;skill_heal_upper=skill.heal_upper;skill_hot=skill.hot;skill_hot_duration=skill.hot_duration;skill_casting_time=skill.casting_time;if(base_calc==true){skill_heal_lower=skill.heal_lower_original;skill_heal_upper=skill.heal_upper_original;skill_hot=skill.hot_original;skill_hot_duration=skill.hot_duration_original;skill_casting_time=skill.casting_time_original;}if(skill_casting_time<0)skill_casting_time=0;else skill_casting_time=skill_casting_time/10;if(skill_heal_lower!=""){average_heal=(skill_heal_lower+skill_heal_upper)/2;if(critical_hit)average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_heal*=skill.aoe_modifier;average_heal=CalculateSustainedDamage(average_heal,sustained_damage,skill,base_calc);if(average_heal==0)return "0*";if(skill_casting_time==0)skill_casting_time=1.5;dhps=Math.round((average_heal/skill_casting_time)*100)/100;}if(skill_hot!=""){average_heal=skill_hot;if(skill.casting_time_original==-2&&critical_hit)average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_heal*=skill.aoe_modifier;if(average_heal==0)return "0*";time=skill_hot_duration+skill_casting_time;hothps=Math.round((average_heal/time)*100)/100;}if(dhps&&hothps)totalhps=Math.round((dhps+hothps)*100)/100;if(skill.aoe)AoEMessage="*";if(totalhps)return totalhps+"<br><span class='verdana9'>("+dhps+" + "+hothps+")"+AoEMessage+"</span>";else if(dhps)return dhps+AoEMessage;else if(hothps)return hothps+AoEMessage;}function CalculateDPMRE(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;output_dp="";ddpm=0;dotdpm=0;totaldpm=0;AoEMessage="";skill_damage_lower=skill.damage_lower;skill_damage_upper=skill.damage_upper;skill_dot=skill.dot;skill_cost=skill.cost;if(base_calc==true){skill_damage_lower=skill.damage_lower_original;skill_damage_upper=skill.damage_upper_original;skill_dot=skill.dot_original;skill_cost=skill.cost_base;}if(skill_damage_lower!=""){average_damage=(skill_damage_lower+skill_damage_upper)/2;if(critical_hit)average_damage*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_damage*=skill.aoe_modifier;average_damage=CalculateSustainedDamage(average_damage,sustained_damage,skill,base_calc);if(average_damage==0)return "0*";ddpm=Math.round((average_damage/skill_cost)*100)/100;}if(skill_dot!=""){average_dot_damage=skill_dot;if(skill.casting_time==-2&&critical_hit)average_dot_damage*=CalculateCritBonus(skill,base_calc);if(skill.casting_time==-2&&sustained_damage)average_dot_damage=CalculateSustainedDamage(average_dot_damage,sustained_damage,skill,base_calc);if(skill.aoe_modifier!=null)average_dot_damage*=skill.aoe_modifier;if(average_dot_damage==0)return "0*";dotdpm=Math.round((average_dot_damage/skill_cost)*100)/100;}if(ddpm&&dotdpm)totaldpm=Math.round((ddpm+dotdpm)*100)/100;if(skill.aoe)AoEMessage="*";if(!base_calc&&skill.ignite_effect&&(critical_hit||(sustained_damage&&skill.can_crit&&skill.crit_chance>0))){if(skill_dot=="")skill_dot=0;ignite_dpm=average_damage*skill.ignite_effect/skill_cost;if(sustained_damage)ignite_dpm*=skill.crit_chance;ignite_dpm=Math.round(ignite_dpm*100)/100;if(totaldpm)return Math.round((totaldpm+ignite_dpm)*100)/100+"<br><span class='verdana9' style='color: #333'>("+ddpm+" + "+dotdpm+" + <i>"+ignite_dpm+"</i>)"+AoEMessage+"</span>";else return Math.round((ddpm+ignite_dpm)*100)/100+"<br><span class='verdana9' style='color: #333'>("+ddpm+" + <i>"+ignite_dpm+"</i>)"+AoEMessage+"</span>";}if(totaldpm)return totaldpm+"<br><span class='verdana9' style='color: #333'>("+ddpm+" + "+dotdpm+")"+AoEMessage+"</span>";else if(ddpm)return ddpm+AoEMessage;else if(dotdpm)return dotdpm+AoEMessage;}function CalculateHPMRE(skill,base_calc){if(document.form_level.show_damage_type[1].checked==true&&skill.can_crit)critical_hit=true;else critical_hit=false;if(document.form_level.show_damage_type[2].checked==true)sustained_damage=true;else sustained_damage=false;output_dp="";dhpm=0;hothpm=0;totalhpm=0;AoEMessage="";skill_heal_lower=skill.heal_lower;skill_heal_upper=skill.heal_upper;skill_hot=skill.hot;skill_cost=skill.cost;if(base_calc==true){skill_heal_lower=skill.heal_lower_original;skill_heal_upper=skill.heal_upper_original;skill_hot=skill.hot_original;skill_cost=skill.cost_original;}if(skill_cost<=0)return "-";if(skill_heal_lower!=""){average_heal=(skill_heal_lower+skill_heal_upper)/2;if(critical_hit)average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_heal*=skill.aoe_modifier;average_heal=CalculateSustainedDamage(average_heal,sustained_damage,skill,base_calc);if(average_heal==0)return "0*";dhpm=Math.round((average_heal/skill_cost)*100)/100;}if(skill_hot!=""){average_heal=skill_hot;if(skill.casting_time==-2&&critical_hit)average_heal*=CalculateCritBonus(skill,base_calc);if(skill.aoe_modifier!=null)average_heal*=skill.aoe_modifier;if(average_heal==0)return "0*";hothpm=Math.round((average_heal/skill_cost)*100)/100;}if(dhpm&&hothpm)totalhpm=Math.round((dhpm+hothpm)*100)/100;if(skill.aoe)AoEMessage="*";if(totalhpm)return totalhpm+"<br><span class='verdana9'>("+dhpm+" + "+hothpm+")"+AoEMessage+"</span>";else if(dhpm)return dhpm+AoEMessage;else if(hothpm)return hothpm+AoEMessage;}function CalculateCastingTime(skill){if(skill.casting_time==0||skill.casting_time==-3)return "<span class='verdana9'>Instant</span>";else if(skill.casting_time==-1)return "<span class='verdana9'>Next Melee</span>";else if(skill.casting_time==-2)return "<span class='verdana9'>Channeled</span>";else if(skill.casting_time!=null)return Math.round((skill.casting_time/10)*1000)/1000+" sec";}function CalculateCost(skill){if(skill.cost){if(skill.cost==-1)return "%";else return Math.round(skill.cost);}else{return "-";}}function CalculateRange(skill){if(skill.range){if(skill.range==-1||skill.range==5)return "melee";else return skill.range+" yds";}else{return "-";}}function CalculateCooldown(skill){if(skill.cooldown&&skill.cooldown>15){if(skill.cooldown<600)return skill.cooldown/10+" sec";else return skill.cooldown/600+" min";}else{return "-";}}function ChangeAoESpells(){num=document.getElementById("num_of_aoe_targets").value;if(isNaN(num)||num<0||num>99)num=0;for(i=0;i<spell_list.length;i++){if(spell_list[i][1].aoe==1){skill=spell_list[i];for(j=skill[1].max_rank;j>0;j--){if(skill[j].visible==1){skill[j].aoe_modifier=num;if(skill[j].damage_lower||skill[j].dot){document.getElementById(skill[j].id_name+"_total_damage").innerHTML=CalculateTotalDamage(skill[j]);document.getElementById(skill[j].id_name+"_avg_hit").innerHTML=CalculateAverageHit(skill[j]);document.getElementById(skill[j].id_name+"_dps").innerHTML=CalculateDPS(skill[j]);document.getElementById(skill[j].id_name+"_dpm").innerHTML=CalculateDPMRE(skill[j]);document.getElementById(skill[j].id_name+"_total_damage_base").innerHTML=CalculateTotalDamage(skill[j],true);document.getElementById(skill[j].id_name+"_avg_hit_base").innerHTML=CalculateAverageHit(skill[j],true);document.getElementById(skill[j].id_name+"_dps_base").innerHTML=CalculateDPS(skill[j],true);document.getElementById(skill[j].id_name+"_dpm_base").innerHTML=CalculateDPMRE(skill[j],true);}else{document.getElementById(skill[j].id_name+"_total_heal").innerHTML=CalculateTotalHeal(skill[j]);document.getElementById(skill[j].id_name+"_avg_heal").innerHTML=CalculateAverageHeal(skill[j]);document.getElementById(skill[j].id_name+"_hps").innerHTML=CalculateHPS(skill[j]);document.getElementById(skill[j].id_name+"_hpm").innerHTML=CalculateHPMRE(skill[j]);document.getElementById(skill[j].id_name+"_total_heal_base").innerHTML=CalculateTotalHeal(skill[j],true);document.getElementById(skill[j].id_name+"_avg_heal_base").innerHTML=CalculateAverageHeal(skill[j],true);document.getElementById(skill[j].id_name+"_hps_base").innerHTML=CalculateHPS(skill[j],true);document.getElementById(skill[j].id_name+"_hpm_base").innerHTML=CalculateHPMRE(skill[j],true);}}else{break;}}}}}function UpdateBaseCalculations(){for(i=0;i<spell_list.length;i++){skill=spell_list[i];for(j=skill[1].max_rank;j>0;j--){if(skill[j].visible==1){UpdateBaseCalculationsForSkill(skill[j]);}else{break;}}}}function UpdateBaseCalculationsForSkill(skill){if(skill.damage_lower||skill.dot){document.getElementById(skill.id_name+"_total_damage_base").innerHTML=CalculateTotalDamage(skill,true);document.getElementById(skill.id_name+"_avg_hit_base").innerHTML=CalculateAverageHit(skill,true);document.getElementById(skill.id_name+"_dps_base").innerHTML=CalculateDPS(skill,true);document.getElementById(skill.id_name+"_dpm_base").innerHTML=CalculateDPMRE(skill,true);}else{document.getElementById(skill.id_name+"_total_heal_base").innerHTML=CalculateTotalHeal(skill,true);document.getElementById(skill.id_name+"_avg_heal_base").innerHTML=CalculateAverageHeal(skill,true);document.getElementById(skill.id_name+"_hps_base").innerHTML=CalculateHPS(skill,true);document.getElementById(skill.id_name+"_hpm_base").innerHTML=CalculateHPMRE(skill,true);}}function SetDefaultTalentModifierNum(num,maxnum,textinput){var old_value=parseInt(textinput.value);if(isNaN(num)||num<0)num=0;if(num>maxnum)num=maxnum;num=num-0;textinput.value=num;if(num==old_value)return true;else return false;}function SetDefaultDecimalModifierNum(num,maxnum,textinput){if(isNaN(num)||num<0)num=0;if(num>maxnum)num=maxnum;if(num!=0&&num!=maxnum)if(num.match(/\.$/))return true;num=num-0;textinput.value=num;}function incrementTalent(talent_name,max_value,talent_line){var talent_input=document.getElementById(talent_name);talent_input.value=parseInt(talent_input.value)+1;var valid=SetDefaultTalentModifierNum(talent_input.value,max_value,talent_input);if(valid){document.forms[0].talent_points_used.value=parseInt(document.forms[0].talent_points_used.value)+1;switch(talent_line){case 1:document.forms[0].line1_points_used.value=parseInt(document.forms[0].line1_points_used.value)+1;break;case 2:document.forms[0].line2_points_used.value=parseInt(document.forms[0].line2_points_used.value)+1;break;case 3:document.forms[0].line3_points_used.value=parseInt(document.forms[0].line3_points_used.value)+1;break;}setText("talent_points_used",document.forms[0].talent_points_used.value);}document.getElementById(talent_name+"_detail_rank").innerHTML=parseInt(talent_input.value);document.getElementById(talent_name+"_icon_rank").innerHTML=parseInt(talent_input.value);return talent_input.value;}function decrementTalent(talent_name,max_value,talent_line){var talent_input=document.getElementById(talent_name);talent_input.value=parseInt(talent_input.value)-1;var valid=SetDefaultTalentModifierNum(talent_input.value,max_value,talent_input);if(valid){document.forms[0].talent_points_used.value=parseInt(document.forms[0].talent_points_used.value)-1;switch(talent_line){case 1:document.forms[0].line1_points_used.value=parseInt(document.forms[0].line1_points_used.value)-1;break;case 2:document.forms[0].line2_points_used.value=parseInt(document.forms[0].line2_points_used.value)-1;break;case 3:document.forms[0].line3_points_used.value=parseInt(document.forms[0].line3_points_used.value)-1;break;}setText("talent_points_used",document.forms[0].talent_points_used.value);}document.getElementById(talent_name+"_detail_rank").innerHTML=parseInt(talent_input.value);document.getElementById(talent_name+"_icon_rank").innerHTML=parseInt(talent_input.value);return talent_input.value;}function SubmitLevel(){var level=document.form_level.txt_level;if(isNaN(level.value)||level.value<0||level.value>70){level.value=70;}document.form_level.submit();}function ToggleDisplay(name){var item=document.getElementById(name);if(item.style.display=="none"){item.style.display="";}else{item.style.display="none";}}function ToggleAssumptions(){var item1=document.getElementById("assumptions_content");var item2=document.getElementById("assumptions_content_sustained");if(document.forms[0].show_damage_type[2].checked==false){if(item1.style.display=="none"){item1.style.display="";}else{item1.style.display="none";}}else{if(item2.style.display=="none"){item2.style.display="";}else{item2.style.display="none";}}}function ShowDisplay(name){document.getElementById(name).style.display="";}function HideDisplay(name){document.getElementById(name).style.display="none";}function ToggleHideShowAdText(hide_show_id){span_item=document.getElementById(hide_show_id);if(span_item.innerHTML=="Hide"){span_item.innerHTML="Show";}else{span_item.innerHTML="Hide";}}function PageLoadWarningCheck(input){if(document.getElementById("page_loaded").value=="0"){if(document.getElementById('page_load_warning').style.display=="none"){ShowDisplay('page_load_warning');setTimeout("HideDisplay('page_load_warning')",2000);}return false;}else{return true;}}function ToggleBaseCalculations(skill_min,skill_max){for(i=skill_min;i<=skill_max;i++){skill=spell_list[i];for(j=skill[1].max_rank;j>0;j--){if(skill[j].visible==1){UpdateBaseCalculationsForSkill(spell_list[i][j]);}ToggleDisplay("base_calculation_hide_"+i+"_"+j);}}}function ToggleShowRanks(spell_line){var updated=0;for(j=1;j<spell_line.length-1;j++){if(spell_line[j].visible==0){spell_line[j].visible=1;updated=1;}else{spell_line[j].visible=0;}}if(updated==1){TalentCastingTimeOverlap();TalentCritOverlap();TalentCritChanceOverlap();CalculateBonusDamageForAllSpells();ChangeAoESpells();}}function CalculateDmgIfSustained(){if(document.form_level.show_damage_type[2].checked==true){TalentDamageOverlap();}}function UpdateCalculations(){UpdateBaseCalculations();TalentCastingTimeOverlap();TalentCritChanceOverlap();TalentCostOverlap();TalentDamageOverlap();if(window.TalentHealingOverlap)TalentHealingOverlap();}function ChangeRankImage(me){if(me.src=="http://www.arcannis.com/Assets/hide_ranks.gif"||me.src==" http://www.arcannis.com/Assets/hide_ranks_over.gif"){me.src="Assets/show_ranks.gif";}else{me.src="Assets/hide_ranks.gif";}}function ChangeRankOverImage(me){if(me.src=="http://www.arcannis.com/Assets/hide_ranks.gif")me.src="Assets/hide_ranks_over.gif";if(me.src==" http://www.arcannis.com/Assets/show_ranks.gif")me.src="Assets/show_ranks_over.gif";}function ChangeRankDownImage(me){if(me.src==" http://www.arcannis.com/Assets/hide_ranks_over.gif")me.src="Assets/hide_ranks_down.gif";if(me.src=="http://www.arcannis.com/Assets/show_ranks_over.gif ")me.src="Assets/show_ranks_down.gif";}function ChangeRankOverImageBack(me){if(me.src=="http://www.arcannis.com/Assets/hide_ranks_over.gif ")me.src="Assets/hide_ranks.gif";if(me.src=="http://www.arcannis.com/Assets/show_ranks_over.gif")me.src="Assets/show_ranks.gif";}function ChangeBaseCalculationsImage(me){if(me.src=="http://www.arcannis.com/Assets/hide_base_calculations.gif"||me.src=="http://www.arcannis.com/Assets/hide_base_calculations_over.gif"){me.src="Assets/show_base_calculations.gif";}else{me.src="Assets/hide_base_calculations.gif";}}function ChangeBaseCalculationsOverImage(me){if(me.src==" http://www.arcannis.com/Assets/hide_base_calculations.gif")me.src="Assets/hide_base_calculations_over.gif";if(me.src==" http://www.arcannis.com/Assets/show_base_calculations.gif")me.src="Assets/show_base_calculations_over.gif";}function ChangeBaseCalculationsOverImageBack(me){if(me.src==" http://www.arcannis.com/Assets/hide_base_calculations_over.gif")me.src="Assets/hide_base_calculations.gif";if(me.src==" http://www.arcannis.com/Assets/show_base_calculations_over.gif")me.src="Assets/show_base_calculations.gif";}function ChangeCriticalHitsImage(me){if(me.src=="http://www.arcannis.com/Assets/hide_critical_hits.gif"||me.src=="http://www.arcannis.com/Assets/hide_critical_hits_over.gif"){me.src="Assets/show_critical_hits.gif";}else{me.src="Assets/hide_critical_hits.gif";}}function ChangeCriticalHitsOverImage(me){if(me.src==" http://www.arcannis.com/Assets/hide_critical_hits.gif")me.src="Assets/hide_critical_hits_over.gif";if(me.src==" http://www.arcannis.com/Assets/show_critical_hits.gif")me.src="Assets/show_critical_hits_over.gif";}function ChangeCriticalHitsOverImageBack(me){if(me.src==" http://www.arcannis.com/Assets/hide_critical_hits_over.gif")me.src="Assets/hide_critical_hits.gif";if(me.src==" http://www.arcannis.com/Assets/show_critical_hits_over.gif")me.src="Assets/show_critical_hits.gif";}function TalentMaxAll(skill_category){for(i=0;i<talent_list[skill_category].length;i++){var talent_name=talent_list[skill_category][i];var max_rank=talent_list_ranks[skill_category][i];document.getElementById(talent_name).value=max_rank;document.getElementById(talent_name+"_detail_rank").innerHTML=max_rank;document.getElementById(talent_name+"_icon_rank").innerHTML=max_rank;}var value=parseInt(document.forms[0].talent_points_used.value);switch(skill_category){case 1:value-=parseInt(document.forms[0].line1_points_used.value);document.forms[0].line1_points_used.value=65;value+=65;break;case 2:value-=parseInt(document.forms[0].line2_points_used.value);document.forms[0].line2_points_used.value=62;value+=62;break;case 3:value-=parseInt(document.forms[0].line3_points_used.value);document.forms[0].line3_points_used.value=65;value+=65;break;}document.forms[0].talent_points_used.value=value;setText("talent_points_used",value);CalculateBonusDamageForAllSpells();TalentBonusOverlap();TalentCostOverlap();TalentCastingTimeOverlap();TalentCritOverlap();TalentCritChanceOverlap();UpdateBaseCalculations();TalentDamageOverlap();}function TalentMinAll(skill_category){for(i=0;i<talent_list[skill_category].length;i++){var talent_name=talent_list[skill_category][i];document.getElementById(talent_name).value=0;document.getElementById(talent_name+"_detail_rank").innerHTML=0;document.getElementById(talent_name+"_icon_rank").innerHTML=0;}var value=parseInt(document.forms[0].talent_points_used.value);switch(skill_category){case 1:value-=parseInt(document.forms[0].line1_points_used.value);document.forms[0].line1_points_used.value=0;break;case 2:value-=parseInt(document.forms[0].line2_points_used.value);document.forms[0].line2_points_used.value=0;break;case 3:value-=parseInt(document.forms[0].line3_points_used.value);document.forms[0].line3_points_used.value=0;break;}document.forms[0].talent_points_used.value=value;setText("talent_points_used",value);CalculateBonusDamageForAllSpells();TalentBonusOverlap();TalentCostOverlap();TalentCastingTimeOverlap();TalentCritOverlap();TalentCritChanceOverlap();UpdateBaseCalculations();TalentDamageOverlap();}function ToggleImage(image,imagesrc){image.src=imagesrc;}function ToggleTopImage(){var item=document.getElementById("top_image");item.src="Assets/category_slice_top_over.jpg";}function showItem(name){document.getElementById(name).style.display="block";}function hideItem(name){document.getElementById(name).style.display="none";}function setText(name,text){document.getElementById(name).innerHTML=text;}image=new Image();image.src="Assets/hide_ranks.gif";image.src="Assets/hide_ranks_over.gif";image.src="Assets/show_ranks_over.gif";image.src="Assets/view_over.gif";image.src="Assets/hide_base_calculations_over.gif";image.src="Assets/show_base_calculations.gif";image.src="Assets/show_base_calculations_over.gif";
