
SAPO.namespace('Component');(function(){var Event=SAPO.Dom.Event,Css=SAPO.Dom.Css,Element=SAPO.Dom.Element,Url=SAPO.Utility.Url,Dimensions=SAPO.Utility.Dimensions;function getATag(li){var item;for(var i=0,l=li.childNodes.length;i<l;i++){item=li.childNodes[i];if(item.nodeType===1){if(item.tagName.toLowerCase()==="a"){return item;}}}}
SAPO.Component.Tabs=function(options){this.init(options);};SAPO.Component.Tabs.prototype={_options:false,_tabContainer:false,_listItems:false,_generatedHTML:false,_isContentPreloaded:false,_defaultContainerId:"SAPOTabContainer",_indexes:false,_activeTab:false,_parent:false,_internal:false,_links:false,_urlIsSet:false,_finalPath:false,init:function(options){if(typeof options==="string"){options={"container":options};}
this._options=SAPO.extendObj({tabNavClass:'sapo-tabs-nav',tabContainerClass:'sapo-tabs-container',activeNavClass:'sapo-active-nav',activeContainerClass:'sapo-active-container',nojsContainerClass:'sapo-tabs-nojs',innerLinkClass:'sapo-tabs-innerlink',container:false,tabs:false,loadCallback:false,nested:false,cache:false,followLinkOnSelected:false,debug:false},options||{});this._links={};Css.appendStyleTag("."+this._options.tabContainerClass,"display: none;",{force:true});Css.appendStyleTag("."+this._options.activeContainerClass,"display: block;",{force:true});var nested=options.nested;if(nested!==false){for(var i in nested){var childLinks=nested[i].setParent(i,this);this._urlIsSet=childLinks.urlIsSet;this._links=SAPO.extendObj(childLinks.links,this._links);}}
if(this._options.container!==false){this._setupTabs();}else{if(this._makeTabs()===false){return false;}}
if(this._isContentPreloaded){this.resetLinks();}
this._setAllTabEvents();},hasNested:function(){if(this._options.nested!==false){return true;}
return false;},_makeTabs:function(){var randomNumber=Math.round(1000000*Math.random());var tabsMenu=document.createElement("UL");var div=document.createElement("DIV");var currTab,currLink,tabId;var tabTitleError=function(){throw"tab title needs to be set when "+"creating tabs programatically";};Css.addClassName(div,'sapo-tabs');div.setAttribute("role","tabpanel");tabsMenu.setAttribute("role","tablist");tabsMenu.className=this._options.tabNavClass;this._listItems=[];for(var i=0,length=this._options.tabs.length;i<length;i++){currTab=document.createElement("li");currLink=document.createElement("a");tabId=i+"-"+randomNumber;currLink.href="#tab"+tabId;currLink.id="SAPOTab_"+tabId;if(typeof this._options.tabs[i].title!="undefined"){currLink.innerHTML=this._options.tabs[i].title;}else{setTimeout(tabTitleError,0);return false;}
this._listItems.push(currLink);currTab.appendChild(currLink);tabsMenu.appendChild(currTab);}
div.appendChild(tabsMenu);if(this._options.cache===false){this._tabContainer=document.createElement("DIV");this._tabContainer.id=this._defaultContainerId;this._tabContainer.className=this._options.tabContainerClass;this._tabContainer.setAttribute("aria-hidden","false");this._tabContainer.setAttribute("aria-labelledby","SAPOTab_"+tabId);div.appendChild(this._tabContainer);}
div.innerHTML=div.innerHTML.replace(/\r\n/g,"");this._generatedHTML=div;},getTabs:function(){return this._generatedHTML;},_setupTabs:function(){var containerEl,el,tag=false,firstTab=false,children,re,newlist,i,l,item,atag,href;if(typeof this._options.container!="string"){containerEl=this._options.container;}else{containerEl=s$(this._options.container);}
containerEl.setAttribute("role","tabpanel");Css.addClassName(containerEl,'sapo-tabs');if(Css.hasClassName(containerEl,this._options.nojsContainerClass)){Css.removeClassName(containerEl,this._options.nojsContainerClass);}
children=containerEl.childNodes;re=new RegExp(this._options.tabNavClass);for(i=0,l=children.length;i<l;i++){el=children[i];if(typeof el.tagName!=="undefined"){tag=el.tagName.toLowerCase();}
if(re.test(el.className)&&(tag||"")==="ul"){this._listItems=el.childNodes;el.setAttribute("role","tablist");}
if((tag||"")==="div"&&Css.hasClassName(el,this._options.tabContainerClass)){this._isContentPreloaded=true;if(firstTab){el.style.display="none";el.setAttribute("aria-hidden","true");}else{firstTab=true;el.setAttribute("aria-hidden","false");}
el.setAttribute("role","tabpanel");el.setAttribute("aria-labelledby","SAPOTab_"+el.id);}
tag=false;}
if(this._listItems!==false){newlist=[];this._indexes={};for(i=0,l=this._listItems.length;i<l;i++){item=this._listItems[i];if(typeof item.tagName!=="undefined"){tag=item.tagName.toLowerCase();}
if((tag||"")==="li"){newlist.push(item);}
tag=false;}
this._listItems=newlist;}
for(i=0,l=newlist.length;i<l;i++){atag=getATag(newlist[i]);href=atag.href.split("#")[1];if(this._isContentPreloaded){this._indexes[href]=i;}
atag.setAttribute("role","tab");atag.id="SAPOTab_"+href;}},_getTabEvent:function(index){if(this._options.tabs!==false){if(typeof this._options.tabs[index].events!="undefined"){return this._options.tabs[index].events;}}
return false;},_getContainer:function(tabEl,parentContainer,index){var levels,href,id,container;href=tabEl.childNodes[0].href.split("#");if(href.length>1){levels=href[1].split("/");if(levels!==null){id=levels[levels.length-1];}else{id=href[href.length-1];}
container=s$(id);}
if(!container){container=document.createElement("DIV");container.id=id;container.className=this._options.tabContainerClass;parentContainer.appendChild(container);}
return container;},_loadTab:function(index,tabId){var content,container,contentURL,tabEl,atag;if(this._generatedHTML===false){tabEl=this._listItems[index];if(this._options.cache===false&&this._isContentPreloaded===false){if(this._tabContainer!==false){container=s$(this._tabContainer.id);}else{container=document.createElement("DIV");container.id=this._defaultContainerId;this._tabContainer=container;this._listItems[index].parentNode.parentNode.appendChild(container);}}else{container=this._getContainer(tabEl,tabEl.parentNode.parentNode,index);}}else{tabEl=this._generatedHTML.childNodes[0].childNodes[index];if(this._options.cache===false){container=this._generatedHTML.childNodes[1];}else{container=this._getContainer(tabEl,this._generatedHTML);}}
if(!Element.hasAttribute(container,"role")){container.setAttribute("role","tabpanel");}
if(!Element.hasAttribute(container,"aria-labelledby")){if(typeof tabId==="undefined"){tabId=this._listItems[index].id;}
container.setAttribute("aria-labelledby",tabId);}
if(this._isContentPreloaded===false){if(typeof this._options.tabs[index].content!="undefined"){content=this._options.tabs[index].content;}
if(typeof this._options.tabs[index].remote!="undefined"){if(typeof this._options.tabs[index].remote==="string"){contentURL=this._options.tabs[index].remote;}else if(this._options.tabs[index].remote===true){contentURL=this._getTabLink(index).href;}}
container.loadContent=function(content){this.innerHTML=content;};if(typeof content=="function"){content=content(container);}
if(typeof content=="string"){container.innerHTML=content;}else if(typeof contentURL!="undefined"){if(container.innerHTML.length<=0||this._options.cache===false){this._getRemoteContent(contentURL,container,index,tabEl);return false;}}}
this._postLoadingActions(container,index,tabEl);},_postLoadingActions:function(container,index,tabElement,response){var ev,element,containerClass=this._options.activeContainerClass;if(typeof response!="undefined"){container.innerHTML=response.responseText;}
if(this._options.loadCallback!==false){this._options.loadCallback(container,this._options.tabs[index]);}
ev=this._getTabEvent(index);if(ev!==false){setTimeout(function(){ev(container);},0);}
for(var i=0,l=tabElement.childNodes.length;i<l;i++){element=tabElement.childNodes[i];if(element.nodeType===1){if(Css.hasClassName(element,containerClass)){Css.removeClassName(element,containerClass);}
element.setAttribute("aria-hidden","true");}}
Css.addClassName(tabElement,this._options.activeNavClass);container.style.display="";Css.addClassName(container,containerClass);container.setAttribute("aria-hidden","false");if(container.offsetParent!==null&&this._internal){this._internal=false;var scroll=Element.offsetTop(container),current=Dimensions.scrollHeight(),scrollOffset=150;setTimeout(function(){window.scrollTo(0,(scroll-scrollOffset>0)?scroll-scrollOffset:0);},200);}},_getRemoteContent:function(url,container,index,tabElement){var that=this;new SAPO.Communication.Ajax(url,{onSuccess:that._postLoadingActions.bindObj(that,container,index,tabElement),method:'get'});},_getTabLink:function(index){var nodes=this._listItems[index].childNodes;for(var i=0,l=nodes.length;i<l;i++){if(nodes[i].nodeType===1){return nodes[i];}}
return false;},_tabEvent:function(ev,tabEl,index){var nodes,tag,i,l,href;if(ev!==null){Event.stop(ev);}
tabEl.blur();if(ev!==null){if(Css.hasClassName(Event.element(ev).parentNode,this._options.activeNavClass)){if(!this._options.followLinkOnSelected){Event.stop(ev);}else{window.location=tabEl.href.split("#")[0];}
return false;}}
nodes=tabEl.parentNode.parentNode.childNodes;for(i=0,l=nodes.length;i<l;i++){if(typeof nodes[i].tagName!=="undefined"){tag=nodes[i].tagName.toLowerCase();}
if((tag||"")==="li"){nodes[i].className=nodes[i].className.replace(this._options.activeNavClass,"");}
tag=false;}
nodes=tabEl.parentNode.parentNode.parentNode.childNodes;for(i=0,l=nodes.length;i<l;i++){if(typeof nodes[i].tagName!=="undefined"){tag=nodes[i].tagName.toLowerCase();}
if((tag||"")==="div"){nodes[i].className=nodes[i].className.replace(this._options.activeContainerClass,"");}
tag=false;}
if(this._parent){if(this._parent.node._finalPath){this._finalPath=this._parent.node._finalPath;}}
if(this._isContentPreloaded&&!this._urlIsSet&&tabEl.href.indexOf(this._finalPath)>0){this._urlIsSet=true;window.location=tabEl.href;}
this._loadTab(index,tabEl.id);},_getTabElement:function(index){return(this._generatedHTML===false)?this._getTabLink(index):this._generatedHTML.childNodes[0].childNodes[index].childNodes[0];},_getPartialUrl:function(partial){if(partial===false){return"";}
return this._getPartialUrl(partial.node._parent)+"/"+partial.name;},_setTabEvent:function(index){var tabEl=this._getTabElement(index);Event.observe(tabEl,'click',this._tabEvent.bindObjEvent(this,tabEl,index));},_setAllTabEvents:function(){var i,l,url,path,nested;this._loadTab(0);for(i=0,l=this._listItems.length;i<l;i++){this._setTabEvent(i);}
if(this._isContentPreloaded){url=Url.getAnchor();if(url!==false){path=url.split("/");if(path.length>1&&this.hasNested()){this._loadInitialTab(path);}else if(this.hasNested()){if(url in this._links){path=this._links[url].split("/");this._loadInitialTab(path);}}}}},_loadInitialTab:function(path){this._finalPath=path[path.length-1];this._internal=true;var i,l,tab=this.activateTab(path[1]);for(i=2,l=path.length;i<l;i++){if(!tab){return false;}
if(tab.hasNested()){tab=tab.activateTab(path[i],true);}}},setParent:function(name,obj){var i,nested=this._options.nested;this._parent={name:name,node:obj};this.resetLinks();if(nested!==false){for(i in nested){nested[i].resetLinks();}}
return{links:this._links,urlIsSet:this._urlIsSet};},activateTab:function(index,isNested){if(typeof isNested!=="undefined"&&isNested===true){if(this._activeTab!==false){var nestedTabs=this._options.nested[this._activeTab];if(typeof nestedTabs!=="undefined"){return nestedTabs.activateTab(index);}}}
if(typeof index==="string"){if(typeof this._indexes[index]!=="undefined"){this._activeTab=index;index=this._indexes[index];}else{return false;}}
var tabEl=this._getTabElement(index);this._tabEvent(null,tabEl,index);return this;},setInternalLinks:function(){var handler=function(ev){var target=Event.findElement(ev,"a");var t=this;if(typeof target!=="undefined"){if(typeof target.tagName!=="undefined"){if(target.tagName.toLowerCase()=="img"){target=target.parentNode;}
if(Css.hasClassName(target,t._options.innerLinkClass)){var url=target.href.split("#");var path=url[1].split("/");if(path.length>1){for(var i=1,l=path.length;i<l;i++){this._internal=true;t.activateTab(path[i]);t=t._options.nested[path[i]];}}else if(path.length===1){t._loadInitialTab(url);}}}}};Event.observe(document.getElementsByTagName("body")[0],"click",handler.bindObj(this));},resetLinks:function(){var tabEl,href,levels;for(var i=0,l=this._listItems.length;i<l;i++){tabEl=this._getTabElement(i);href=tabEl.href.split("#");if(href.length>=2){levels=href[1].split("/");if(levels.length>0){href=levels[levels.length-1];}else{href=href[1];}}
this._links[href]="#"+this._getPartialUrl(this._parent)+"/"+href;}},debug:function(){}};}());