// Code copyright 2010 changeMode design 


if(!this.SkillTreeApp){SkillTreeApp={views:{},controllers:{},models:{},cookieOptions:{"path":'/',"expires":365},init:function()
{jQuery('#tmpView').remove();this.views.mainView=jQuery('#wrapper_site');jQuery.stylesheetSwitch(false);if(jQuery.browser.msie&&jQuery.browser.version.substr(0,1)=="6")
{var msg="This site, while coded to web standards, requires a modern browser. Sorry. Try Firefox, Chrome, Safari, or if you really ";msg+="have you heart set on staynig with Internet Explorer for some reason, upgrade to 7 or 8. But you should stop using IE altogether, it's just terrible.";var errDialog=new SkillTreeApp.ErrorDialog("Sorry, no page for you.",msg);errDialog.displayError(this.views.mainView);return false;}
this.models.user=new SkillTreeApp.UserModel();if(!jQuery.cookie('faction_name'))
{this.controllers.factionViewController=new SkillTreeApp.FactionViewController();this.controllers.factionViewController.showFactionPicker(this.views.mainView);}else
{this.initWithFaction(jQuery.cookie('faction_name'));}},initWithFaction:function(factionName)
{jQuery.cookie('faction_name',factionName,this.cookieOptions);jQuery.stylesheetSwitch(factionName);this.controllers.header=new SkillTreeApp.SkillTreeHeaderViewController();this.controllers.header.addViewTo(this.views.mainView);this.models.user.setFaction(factionName);this.models.skillTree=new SkillTreeApp.SkillTreeModel(factionName);this.models.totalPoints=new SkillTreeApp.TotalPointsModel();if(this.models.skillTree)
{this.controllers.treeController=new SkillTreeApp.SkillTreeViewController(this.models.skillTree.getTreeData());this.controllers.treeController.addViewTo(this.views.mainView);jQuery(window).resize(function()
{SkillTreeApp.windowResizeHandler();});jQuery(document).bind('keyup','return',function()
{SkillTreeApp.controllers.treeController.skillToggleHandler();}).bind('keyup','left',function()
{SkillTreeApp.controllers.treeController.leftArrowHandler();}).bind('keyup','right',function()
{SkillTreeApp.controllers.treeController.rightArrowHandler();}).bind('keyup','up',function()
{SkillTreeApp.controllers.treeController.upArrowHandler();}).bind('keyup','down',function()
{SkillTreeApp.controllers.treeController.downArrowHandler();});this.controllers.detailView=new SkillTreeApp.SkillDetailsViewController(factionName);this.controllers.detailView.addViewTo(this.views.mainView);this.controllers.treeController.hilightSkill();var skillData=this.models.skillTree.getSkillAt(this.controllers.treeController.getHilightedSkill());this.controllers.detailView.displayDetailsForSkill(skillData);jQuery('#button_reset').click(function()
{SkillTreeApp.resetSkills();});jQuery('#button_changeFaction').click(function()
{SkillTreeApp.changeFaction();});}else
{}},windowResizeHandler:function()
{SkillTreeApp.controllers.treeController.updateViewCoords();},resetSkills:function(){this.controllers.treeController.resetAllViews(this.models.skillTree.getPathCount());this.models.skillTree.resetAll();},changeFaction:function()
{jQuery(document).unbind('keyup','return').unbind('keyup','left').unbind('keyup','right').unbind('keyup','up').unbind('keyup','down');this.controllers.treeController.removeView();this.controllers.detailView.removeView();this.controllers.header.removeView();jQuery.cookie('faction_name',null,this.cookieOptions);this.init();}};}
(function(){SkillTreeApp.UserModel=function()
{var _faction=false;return{getFaction:function(){return _faction;},setFaction:function(newFaction){_faction=newFaction;}}}
SkillTreeApp.TotalPointsModel=function()
{var _points=0;return{getTotalPoints:function()
{return _points;},setTotalPoints:function(newValue)
{_points=newValue;this.updateView();},adjustTotalPointsBy:function(amount)
{_points+=amount;this.updateView();},updateView:function()
{jQuery('#skillTree_totalPoints').text(_points);}}}
SkillTreeApp.SkillTreeModel=function(factionName)
{var _dataFile="/data/"+factionName+"_skillTree.json";var _tree=eval(jQuery.ajax({type:"GET",url:_dataFile,dataType:"json",async:false}).responseText);if(_tree.length==0)
{return false;}else
{return{getTreeData:function()
{return _tree;},getSkillAt:function(pathObject)
{var p=pathObject.path;var t=pathObject.tier;var s=pathObject.skill;if(p<_tree.length&&t<_tree[p].tiers.length&&s<_tree[p].tiers[t].skills.length)
{return _tree[pathObject.path].tiers[pathObject.tier].skills[pathObject.skill];}else
{return false;}},getSkillCount:function(pathObject)
{var tier=this.getTierAt(pathObject);return(tier)?tier.skills.length:false;},toggleSkillAt:function(pathObject)
{var skill=this.getSkillAt(pathObject);skill.active=!skill.active;SkillTreeApp.models.totalPoints.adjustTotalPointsBy((skill.active)?skill.cost:-1*skill.cost);return skill.active;},getTierAt:function(pathObject)
{var p=pathObject.path;var t=pathObject.tier;if(p<_tree.length&&t<_tree[p].tiers.length)
{return _tree[pathObject.path].tiers[pathObject.tier];}else
{return false;}},tierLocked:function(pathObject)
{var theTier=this.getTierAt(pathObject);return(theTier)?theTier.locked:true;},pointsInTier:function(pathObject){var theTier=this.getTierAt(pathObject);if(theTier)
{var tierPoints=0;for(var i=0;i<theTier.skills.length;i++)
{if(theTier.skills[i].active)tierPoints+=theTier.skills[i].cost;}
return tierPoints;}
return false;},getTierCount:function(pathObject)
{var path=this.getPathAt(pathObject);return(path)?path.tiers.length:false;},unlockTierAt:function(pathObject)
{var tier=this.getTierAt(pathObject);if(tier)
{tier.locked=false;}},resetAll:function()
{for(var i=0;i<_tree.length;i++)
{var clearPath=new SkillTreeApp.PathObject(i,0);this.lockTierAt(clearPath);}},lockTierAt:function(pathObject)
{var tier=this.getTierAt(pathObject);if(tier&&tier.locked===false)
{if(pathObject.tier!==0)
{tier.locked=true;}
for(var i=0;i<tier.skills.length;i++)
{if(tier.skills[i].active)
{tier.skills[i].active=false;SkillTreeApp.models.totalPoints.adjustTotalPointsBy(-1*tier.skills[i].cost);}}
pathObject.tier+=1;this.lockTierAt(pathObject);}},getPathAt:function(pathObject)
{return(pathObject.path<_tree.length)?_tree[pathObject.path]:false;},getPathCount:function(){return _tree.length;}}}}
SkillTreeApp.FactionViewController=function()
{var _view=false;return{showFactionPicker:function(view)
{if(!_view){_view=new SkillTreeApp.FactionView(this);}
view.append(_view);},handleFactionButtonClick:function(factionName)
{this.hideFactionPicker();SkillTreeApp.initWithFaction(factionName);},hideFactionPicker:function()
{_view.remove();}}}
SkillTreeApp.FactionView=function(controller)
{var _controller=controller;var _html='<div id="factionPickerView"><h3>Choose your Faction</h3></div>';var _sverButton=new SkillTreeApp.Button('SVER','sverFactionButton',function(){_controller.handleFactionButtonClick('SVER')},'button_faction');var _ravenButton=new SkillTreeApp.Button('Raven','ravenFactionButton',function(){_controller.handleFactionButtonClick('RAVEN')},'button_faction');var _valorButton=new SkillTreeApp.Button('VALOR','valorFactionButton',function(){_controller.handleFactionButtonClick('VALOR')},'button_faction');return jQuery(_html).append(_sverButton,_ravenButton,_valorButton);}
SkillTreeApp.SkillTreeViewController=function(treeData)
{var _view=new SkillTreeApp.SkillTreeView(this,treeData);var _hilightedSkill=new SkillTreeApp.PathObject(0,0,0);var _viewData={width:_view.width(),height:_view.height(),position:_view.offset};return{skillToggleHandler:function()
{if(SkillTreeApp.models.skillTree.tierLocked(_hilightedSkill))
{return false;}else
{var originalTierPoints=SkillTreeApp.models.skillTree.pointsInTier(_hilightedSkill);var isActive=SkillTreeApp.models.skillTree.toggleSkillAt(_hilightedSkill);var abovePath=new SkillTreeApp.PathObject(_hilightedSkill.path,_hilightedSkill.tier+1);var tierAbove=SkillTreeApp.models.skillTree.getTierAt(abovePath);var skillView=this.getSkillViewAt(_hilightedSkill);if(isActive){skillView.removeClass('inactiveSkill').addClass('activeSkill');if(originalTierPoints<2&&SkillTreeApp.models.skillTree.pointsInTier(_hilightedSkill)>=2)
{SkillTreeApp.models.skillTree.unlockTierAt(abovePath);var upTierView=this.getTierViewAt(abovePath);if(upTierView)
{upTierView.removeClass('inactiveTier').addClass('activeTier');}}}else
{skillView.removeClass('activeSkill').addClass('inactiveSkill');if(originalTierPoints>=2&&SkillTreeApp.models.skillTree.pointsInTier(_hilightedSkill)<2)
{this.deactivateTierAndUp(abovePath);abovePath.tier=_hilightedSkill.tier+1;SkillTreeApp.models.skillTree.lockTierAt(abovePath);}}}},leftArrowHandler:function(){var testPath=new SkillTreeApp.PathObject(_hilightedSkill.path,_hilightedSkill.tier,(_hilightedSkill.skill-1));var prevGuy=SkillTreeApp.models.skillTree.getSkillAt(testPath);if(prevGuy)
{this.setHilightedSkill(testPath);}else
{testPath.tier=testPath.tier-1;var prevTier=SkillTreeApp.models.skillTree.getTierAt(testPath);if(prevTier)
{testPath.skill=prevTier.skills.length-1;this.setHilightedSkill(testPath);}}},rightArrowHandler:function(){var testPath=new SkillTreeApp.PathObject(_hilightedSkill.path,_hilightedSkill.tier,_hilightedSkill.skill+1);var nextGuy=SkillTreeApp.models.skillTree.getSkillAt(testPath);if(nextGuy)
{this.setHilightedSkill(testPath);}else
{testPath.tier=testPath.tier+1;var nextTier=SkillTreeApp.models.skillTree.getTierAt(testPath);if(nextTier)
{testPath.skill=0;this.setHilightedSkill(testPath);}}},upArrowHandler:function(){if(_hilightedSkill.path==0)return false;var pathEl=jQuery('.path_wrapper:eq('+_hilightedSkill.path+')');var myIndex=jQuery('.skill_wrapper',pathEl).index(this.getSkillViewAt(_hilightedSkill));var nextPath=jQuery('.path_wrapper:eq('+(_hilightedSkill.path-1)+')');var upSkill=jQuery('.skill_wrapper:eq('+myIndex+')',nextPath);if(upSkill.length===1)
{this.setHilightedSkill(upSkill.data('pathData'));}else
{var lastSkill=jQuery('.skill_wrapper:last',nextPath);this.setHilightedSkill(lastSkill.data('pathData'));}},downArrowHandler:function(){if(_hilightedSkill.path+1>=SkillTreeApp.models.skillTree.getPathCount())
{return false;}
var pathEl=jQuery('.path_wrapper:eq('+_hilightedSkill.path+')');var myIndex=jQuery('.skill_wrapper',pathEl).index(this.getSkillViewAt(_hilightedSkill));var nextPath=jQuery('.path_wrapper:eq('+(_hilightedSkill.path+1)+')');var downSkill=jQuery('.skill_wrapper:eq('+myIndex+')',nextPath);if(downSkill.length===1)
{this.setHilightedSkill(downSkill.data('pathData'));}else
{var lastSkill=jQuery('.skill_wrapper:last',nextPath);this.setHilightedSkill(lastSkill.data('pathData'));}},addViewTo:function(parentEl)
{parentEl.append(_view);this.getTierViewAt(_hilightedSkill).addClass('hilight_tier_wrapper');this.updateViewCoords();},updateViewCoords:function(){_viewData={width:_view.width(),height:_view.height(),position:_view.offset()};},removeView:function()
{_view.remove();},getHilightedSkill:function()
{return _hilightedSkill;},setHilightedSkill:function(newPath)
{this.unhilightSkill();if(newPath.tier!=_hilightedSkill.tier||newPath.path!=_hilightedSkill.path)
{this.getTierViewAt(_hilightedSkill).removeClass('hilight_tier_wrapper');this.getTierViewAt(newPath).addClass('hilight_tier_wrapper');}
_hilightedSkill=newPath;this.hilightSkill();var skillData=SkillTreeApp.models.skillTree.getSkillAt(_hilightedSkill);SkillTreeApp.controllers.detailView.displayDetailsForSkill(skillData);},hilightSkill:function()
{var skillView=this.getSkillViewAt(_hilightedSkill);var svW=skillView.width();var svH=skillView.height();var svP=skillView.offset();var offScreenLeft=false;var offScreenRight=false;var offScreenTop=false;var offScreenBottom=false;if(svP.left<_viewData.position.left)
{offScreenLeft=true;}else if(svP.left+svW>_viewData.position.left+_viewData.width)
{offScreenRight=true;}
if(svP.top<_viewData.position.top)
{offScreenTop=true;}else if(svP.top+svH>_viewData.position.top+_viewData.height)
{offScreenBottom=true;}
if(offScreenTop||offScreenBottom||offScreenLeft||offScreenRight)
{var useAxis='';useAxis+=(offScreenTop||offScreenBottom)?'y':'';useAxis+=(offScreenLeft||offScreenRight)?'x':'';var yOffset=(offScreenBottom)?-1*(svH+55):-20;var xOffset=(offScreenRight)?-1*(_viewData.width-svW-90):-35;jQuery('#skillTreeView').scrollTo(skillView,500,{offset:{top:yOffset,left:xOffset},axis:useAxis});}
skillView.addClass('skill_hilight');},unhilightSkill:function(){var skillView=this.getSkillViewAt(_hilightedSkill);skillView.removeClass('skill_hilight');},resetAllViews:function(numPaths)
{for(var i=0;i<numPaths;i++)
{var clearPath=new SkillTreeApp.PathObject(i,0);this.deactivateTierAndUp(clearPath);}},deactivateTierAndUp:function(pathObject){var tier=SkillTreeApp.models.skillTree.getTierAt(pathObject);if(tier&&tier.locked==false)
{var tierView=this.getTierViewAt(pathObject);if(pathObject.tier!==0)
{tierView.removeClass('activeTier').addClass('inactiveTier');}
var skillPath=new SkillTreeApp.PathObject(pathObject.path,pathObject.tier);var tmpView;for(var i=0;i<tier.skills.length;i++)
{skillPath.skill=i;this.makeSkillViewInactive(this.getSkillViewAt(skillPath));}
pathObject.tier+=1;this.deactivateTierAndUp(pathObject);}},makeSkillViewActive:function(theView){theView.removeClass('inactiveSkill').addClass('activeSkill');},makeSkillViewInactive:function(theView){theView.removeClass('activeSkill').addClass('inactiveSkill');},getSkillViewAt:function(pathObject){var tmpEl=jQuery('.path_wrapper:eq('+pathObject.path+') .tier_wrapper:eq('+pathObject.tier+') .skill_wrapper:eq('+pathObject.skill+')',_view);return(tmpEl.length===1)?tmpEl:false;},getTierViewAt:function(pathObject){var tmpEl=jQuery('.path_wrapper:eq('+pathObject.path+') .tier_wrapper:eq('+pathObject.tier+')',_view);return(tmpEl.length===1)?tmpEl:false;}}}
SkillTreeApp.SkillTreeView=function(controller,tree)
{var _controller=controller;var _mainHTML=jQuery('<div id="skillTreeView" class="mainBlock"></div>');var tmpPathWrap={};for(var i=0;i<tree.length;i++)
{tmpPathWrap=jQuery('<div class="path"></div>');tmpPathWrap.append('<div class="pathTitleBlock">'+tree[i].name+'</div>');tmpPathWrap.append(new SkillTreeApp.PathView(tree[i],i));_mainHTML.append(tmpPathWrap);}
tmpPathWrap=false;return _mainHTML;}
SkillTreeApp.PathView=function(pathData,index)
{var _pathHTML=jQuery('<ul class="path_wrapper"></ul>');_pathHTML.data("pathIndex",index);for(var i=0;i<pathData.tiers.length;i++)
{_pathHTML.append(new SkillTreeApp.TierView(pathData.tiers[i],index,i));}
return _pathHTML;}
SkillTreeApp.TierView=function(tierData,pathIndex,tierIndex)
{var _tierHTML=jQuery('<li class="tier_wrapper"></li>').addClass((tierIndex==0)?'activeTier':'inactiveTier');var _skillsWrapper=jQuery('<ul></ul>').append('<li class="tierLabel_wrapper"><p class="tierWord">tier</p><p class="tierNumber">'+(tierIndex+1)+'</p></li>');for(var i=0;i<tierData.skills.length;i++)
{_skillsWrapper.append(new SkillTreeApp.SkillView(tierData.skills[i],pathIndex,tierIndex,i));}
_tierHTML.append(_skillsWrapper);jQuery('.skill_wrapper:eq(0)',_tierHTML).addClass('firstSkill');return _tierHTML;}
SkillTreeApp.SkillView=function(skillData,pathIndex,tierIndex,skillIndex)
{var _pathObject=new SkillTreeApp.PathObject(pathIndex,tierIndex,skillIndex);var _skillHTML=jQuery('<li class="skill_wrapper inactiveSkill"></li>').data("pathData",_pathObject);if(skillData.css_class)
{_skillHTML.addClass(skillData.css_class);}
_skillHTML.append('<p class="skill_name">'+skillData.name+'</p>');_skillHTML.append('<p class="skill_cost">'+skillData.cost+'</p>');_skillHTML.append('<p class="skill_image"><img src="/img/skillTree/treeIcons/'+skillData.icon+'" /></p>');return _skillHTML;}
SkillTreeApp.SkillTreeHeaderViewController=function()
{var _view=new SkillTreeApp.SkillTreeHeaderView();return{addViewTo:function(parentEl)
{parentEl.append(_view);},removeView:function()
{_view.remove();},updatePointTotal:function(newVal)
{jQuery('#skillTree_totalPoints').text(newVal);}}}
SkillTreeApp.SkillTreeHeaderView=function()
{var _myHTML='<div id="skillTreeHeaderView" class="mainBlock">';_myHTML+='<div id="instructionsBox"><p>Use ARROW keys to navigate. Press ENTER to select / de-select skill.</p></div>';_myHTML+='<p id="totalPointsWrapper">Total Points: <span id="skillTree_totalPoints">0</span></p>';_myHTML+='</div>';return jQuery(_myHTML);}
SkillTreeApp.SkillDetailsViewController=function(faction)
{var _view=new SkillTreeApp.SkillDetailsView();var _faction=faction||'';return{addViewTo:function(parentView)
{parentView.append(_view);},setFaction:function(newFaction){_faction=newFaction;},displayDetailsForSkill:function(skill)
{jQuery('#nameLabel').text(skill.name);jQuery('#specialtyLabel').html("<span  class=\"labelLabel\">specialty: </span> "+skill.specialty);jQuery('#costLabel').html("<span class=\"labelLabel\">cost: </span> "+skill.cost);jQuery('#descriptionLabel').text(skill.description);var imgURL=(skill.item_image!=false)?"/img/skillTree/"+_faction+"/"+skill.item_image:"/img/skillTree/blank.gif";jQuery('#selectedSkillItemImage').attr("src",imgURL);},removeView:function()
{_view.remove();}}}
SkillTreeApp.SkillDetailsView=function()
{var _html=jQuery('<div id="skillDetailsView" class="mainBlock"></div>');var tmp='<div id="wrapper_infoBar"><p id="nameLabel">NAME</p><p id="specialtyLabel">SPECIALTY</p><p id="costLabel">Cost: </p>';tmp+='<p id="button_reset"><img src="/img/skillTree/backgrounds/button_reset.png" alt="reset" /></p><p id="button_changeFaction"><img src="/img/skillTree/backgrounds/button_changeFaction.png" alt="change faction" /></p></div>';tmp+='<div id="wrapper_bottom"><p id="descriptionLabel" class="cb">Description: </p><p id="selSkillImg_wrapper"><img id="selectedSkillItemImage" src="/img/skillTree/blank.gif" /></p></div>';_html.append(tmp);return _html;}
SkillTreeApp.Button=function(label,id,handler,classes)
{var _html='<div class="button"></div>';var _button=jQuery(_html);_button.text(label);if(handler){_button.click(handler);}
if(id){_button.attr('id',id);}
if(classes){_button.addClass(classes);}
return _button;}
SkillTreeApp.PathObject=function(pathIndex,tierIndex,skillIndex)
{return{path:pathIndex||0,tier:tierIndex||0,skill:skillIndex||0}}
SkillTreeApp.ErrorDialog=function(title,message,buttons)
{var _html=jQuery('<div id="dialog_error"></div>');var _title=title||"Error";var _message=message||"Something bad happend. Sorry.";var _buttons=buttons||false;return{displayError:function(parentEl)
{_html.append('<p class="errorDialogTitle">'+_title+'</p>');_html.append('<p>'+_message+'</p>');if(_buttons)
{}
parentEl.append(_html);},dismissError:function()
{_html.remove();}}}})();jQuery(function()
{SkillTreeApp.init();});

