/*
 * Tabs 3 - New Wave Tabs
 *
 * Copyright (c) 2007 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 * Includes Tabs, History/Remote, and Tabs Ext
 */
(function($){$.ui=$.ui||{};$.fn.tabs=function(initial,options){if(initial&&initial.constructor==Object){options=initial;initial=null}options=options||{};initial=initial&&initial.constructor==Number&&--initial||0;return this.each(function(){new $.ui.tabs(this,$.extend(options,{initial:initial}))})};$.each(['Add','Remove','Enable','Disable','Click','Load','Href'],function(i,method){$.fn['tabs'+method]=function(){var args=arguments;return this.each(function(){var instance=$.ui.tabs.getInstance(this);instance[method.toLowerCase()].apply(instance,args)})}});$.fn.tabsSelected=function(){var selected=-1;if(this[0]){var instance=$.ui.tabs.getInstance(this[0]),$lis=$('li',this);selected=$lis.index($lis.filter('.'+instance.options.selectedClass)[0])}return selected>=0?++selected:-1};$.ui.tabs=function(el,options){this.source=el;this.options=$.extend({initial:0,event:'click',disabled:[],cookie:null,unselected:false,unselect:options.unselected?true:false,bookmarkable:$.ajaxHistory?true:false,spinner:'Loading&#8230;',cache:false,idPrefix:'tab-',fxSpeed:'normal',add:function(){},remove:function(){},enable:function(){},disable:function(){},click:function(){},hide:function(){},show:function(){},load:function(){},tabTemplate:'<li><a href="#{href}"><span>#{text}</span></a></li>',panelTemplate:'<div></div>',navClass:'ui-tabs-nav',selectedClass:'ui-tabs-selected',unselectClass:'ui-tabs-unselect',disabledClass:'ui-tabs-disabled',panelClass:'ui-tabs-panel',hideClass:'ui-tabs-hide',loadingClass:'ui-tabs-loading'},options);this.options.event+='.ui-tabs';this.options.cookie=$.cookie&&$.cookie.constructor==Function&&this.options.cookie;this.uuid='ui_tabs_'+$.ui.tabs.prototype.count++;$.ui.tabs.instances[this.uuid]=this;$.data(el,'uiTabsUUID',this.uuid);this.tabify(true)};$.ui.tabs.instances={};$.ui.tabs.getInstance=function(el){return $.ui.tabs.instances[$.data(el,'uiTabsUUID')]};$.extend($.ui.tabs.prototype,{count:0,tabId:function(a,i){return a.title?a.title.replace(/\s/g,'_'):this.options.idPrefix+this.count+'-'+(i+1)},tabify:function(init){this.$tabs=$('a:first-child',this.source);this.$panels=$([]);var self=this,o=this.options;this.$tabs.each(function(i,a){if(a.hash&&a.hash.replace('#','')){self.$panels=self.$panels.add(a.hash)}else{$.data(a,'href',a.href);var id=self.tabId(a,i);a.href='#'+id;self.$panels=self.$panels.add($('#'+id)[0]||$(o.panelTemplate).attr('id',id).addClass(o.panelClass).insertAfter(self.$panels[i-1]||self.source))}});if(init){this.$tabs.each(function(i,a){if(location.hash){if(a.hash==location.hash){o.initial=i;if($.browser.msie||$.browser.opera){var $toShow=$(location.hash),toShowId=$toShow.attr('id');$toShow.attr('id','');setTimeout(function(){$toShow.attr('id',toShowId)},500)}scrollTo(0,0);return false}}else if(o.cookie){o.initial=parseInt($.cookie(self.uuid))||0;return false}else if($(a).parent('li').is('.'+o.selectedClass)){o.initial=i;return false}});$(this.source).is('.'+o.navClass)||$(this.source).addClass(o.navClass);this.$panels.each(function(){var $this=$(this);$this.is('.'+o.panelClass)||$this.addClass(o.panelClass)});var $lis=$('li',this.source);this.$panels.addClass(o.hideClass);$lis.removeClass(o.selectedClass);if(!o.unselected){this.$panels.slice(o.initial,o.initial+1).show();$lis.slice(o.initial,o.initial+1).addClass(o.selectedClass)}var href=this.$tabs[o.initial]&&$.data(this.$tabs[o.initial],'href');if(href){this.load(o.initial+1,href)}for(var i=0,position;position=o.disabled[i];i++){this.disable(position)}}if(o.bookmarkable){if(!$.ajaxHistory)o.bookmarkable=false;else $.ajaxHistory.initialize(function(){self.$tabs.eq(o.initial).trigger('click').end()})}var showAnim={},showSpeed=o.fxShowSpeed||o.fxSpeed,hideAnim={},hideSpeed=o.fxHideSpeed||o.fxSpeed;if(o.fxSlide||o.fxFade||o.fxCarousel){if(o.fxSlide){showAnim['height']='show';hideAnim['height']='hide'}if(o.fxFade){showAnim['opacity']='show';hideAnim['opacity']='hide'}}else{if(o.fxShow){showAnim=o.fxShow}else{showAnim['min-width']=0;showSpeed=1}if(o.fxHide){hideAnim=o.fxHide}else{hideAnim['min-width']=0;hideSpeed=1}}var resetCSS={display:'',overflow:'',height:''};if(!$.browser.msie){resetCSS['opacity']=''}var showEasing=o.fxEasing||'easeInOut';if(!$.easing){showEasing='linear'}var paneloffset=self.$panels.css('margin-left');paneloffset=parseInt(paneloffset.substring(0,paneloffset.length-2));var panelwidth=self.$panels.css('margin-right');panelwidth=parseInt(panelwidth.substring(0,panelwidth.length-2))+self.$panels.width()+paneloffset;if(o.fxCarousel)self.$panels.parent().css('width',panelwidth*self.$panels.length);var leftOffset=o.fxOffset||0;if(leftOffset>0){self.$panels.css('left',leftOffset)}function hideTabCarousel(clicked,$hide,$show){o.hide(clicked,$hide[0],$show&&$show[0]||null);if($show){showTab(clicked,$show,$hide)}}function showTabCarousel(clicked,$show,$hide){var newindex=self.$tabs.index(clicked);var newl=newindex*panelwidth+paneloffset;$show.removeClass(o.hideClass).css(resetCSS);$show.parent().stop().animate({left:leftOffset-newl},showSpeed,showEasing,function(){o.show(clicked,$show[0],$hide&&$hide[0]||null)})}function hideTab(clicked,$hide,$show){if(o.fxCarousel)return hideTabCarousel(clicked,$hide,$show);if($hide&&$hide.length>0){$hide.animate(hideAnim,hideSpeed,function(){$hide.addClass(o.hideClass).css(resetCSS);if($.browser.msie&&hideAnim['opacity']){$hide[0].style.filter=''}o.hide(clicked,$hide[0],$show&&$show[0]||null);if($show){showTab(clicked,$show,$hide)}})}else if($show){showTab(clicked,$show,$hide)}}function showTab(clicked,$show,$hide){if(o.fxCarousel)return showTabCarousel(clicked,$show,$hide);if(!(o.fxSlide||o.fxFade||o.fxShow)){$show.css('display','block')}$show.animate(showAnim,showSpeed,function(){$show.removeClass(o.hideClass).css(resetCSS);if($.browser.msie&&showAnim['opacity']){$show[0].style.filter=''}o.show(clicked,$show[0],$hide&&$hide[0]||null)})}function switchTab(clicked,$hide,$show){$(clicked).parents('li:eq(0)').addClass(o.selectedClass).siblings().removeClass(o.selectedClass);hideTab(clicked,$hide,$show)}this.$tabs.unbind(o.event).bind(o.event,function(e,trueClick){var trueClick=trueClick||e.clientX;var $li=$(this).parent('li'),$hide=self.$panels.filter(':visible'),$show=$(this.hash);if(($li.is('.'+o.selectedClass)&&!o.unselect)||$li.is('.'+o.disabledClass)||o.click(this,$show[0],$hide[0])===false){this.blur();return false}if(o.cookie){$.cookie(self.uuid,self.$tabs.index(this),o.cookie)}if(o.unselect){if($li.is('.'+o.selectedClass)){$li.removeClass(o.selectedClass);self.$panels.stop();hideTab(this,$hide);this.blur();return false}else if(!$hide.length){$li.addClass(o.selectedClass).addClass(o.unselectClass);self.$panels.stop();showTab(this,$show);this.blur();return false}}self.$panels.stop();if($show.length){if($.data(this,'href')){var a=this;self.load(self.$tabs.index(this)+1,$.data(this,'href'),function(){switchTab(a,$hide,$show)})}else{switchTab(this,$hide,$show)}}else{throw'jQuery UI Tabs: Mismatching fragment identifier.'}this.blur();if(o.bookmarkable&&trueClick){$.ajaxHistory.update(this.hash);if($.browser.msie){return false}var showId=this.hash.replace('#','');$show.attr('id','');if($.browser.safari){var tempForm=$('<form action="'+this.hash+'"><div><input type="submit" value="h" /></div></form>').get(0);tempForm.submit()}else{location.hash=this.hash.replace('#','')}setTimeout(function(){$show.attr('id',showId)},0)}return o.bookmarkable&&!!trueClick});if(!o.unselected){$(function(){var blank=$('');var clicked=self.$tabs[o.initial];var panel=$(self.$panels.get(o.initial));o.click(clicked,panel,blank.get(0));panel.removeClass(o.hideClass).css(resetCSS);if(o.fxCarousel){var newl=o.initial*panelwidth+paneloffset;$(panel).parent().animate({left:-newl},showSpeed,showEasing,function(){o.show(clicked,panel[0],null)})}})}},add:function(url,text,position){if(url&&text){var o=this.options;position=position||this.$tabs.length;var $li=$(o.tabTemplate.replace(/#\{href\}/,url).replace(/#\{text\}/,text));if(url.indexOf('#')==0){var id=url.replace('#','')}else{var id=this.tabId($('a:first-child',$li)[0],position)}var $panel=$('#'+id);$panel=$panel.length&&$panel||$(o.panelTemplate).attr('id',id).addClass(o.panelClass).addClass(o.hideClass);if(position>=this.$tabs.length){$li.appendTo(this.source);$panel.appendTo(this.source.parentNode)}else{$li.insertBefore(this.$tabs.slice(position-1,position).parent('li'));$panel.insertBefore(this.$panels[position-1])}this.tabify();if(this.$tabs.length==1){$li.addClass(o.selectedClass);$panel.removeClass(o.hideClass);var href=$.data(this.$tabs[0],'href');if(href){this.load(position+1,href)}}o.add(this.$tabs[position],this.$panels[position])}else{throw'jQuery UI Tabs: Not enough arguments to add tab.'}},remove:function(position){if(position&&position.constructor==Number){var $li=this.$tabs.slice(position-1,position).parent('li').remove(),$panel=this.$panels.slice(position-1,position).remove(),o=this.options;if($li.is('.'+o.selectedClass)&&this.$tabs.length>1){this.click(position+(position<this.$tabs.length?1:-1))}this.tabify();o.remove($li.end()[0],$panel[0])}},enable:function(position){var $li=this.$tabs.slice(position-1,position).parent('li'),o=this.options;$li.removeClass(o.disabledClass);if($.browser.safari){$li.css('display','inline-block');setTimeout(function(){$li.css('display','block')},0)}o.enable(this.$tabs[position-1],this.$panels[position-1])},disable:function(position){var o=this.options;this.$tabs.slice(position-1,position).parent('li').addClass(o.disabledClass);o.disable(this.$tabs[position-1],this.$panels[position-1])},click:function(position){this.$tabs.slice(position-1,position).trigger(this.options.event)},load:function(position,url,callback){var self=this,o=this.options,$a=this.$tabs.slice(position-1,position).addClass(o.loadingClass),a=$a[0];$span=$('span',a),text=$span.html();if(url&&url.constructor==Function){callback=url;url=null}if(url){$.data(a,'href',url)}else{url=$.data(a,'href')}if(o.spinner){$span.html('<em>'+o.spinner+'</em>')}setTimeout(function(){$(a.hash).load(url,function(){if(o.spinner){$span.html(text)}$a.removeClass(o.loadingClass);if(callback&&callback.constructor==Function){callback()}if(o.cache){$.removeData(a,'href')}o.load(self.$tabs[position-1],self.$panels[position-1])})},0)},href:function(position,href){$.data(this.$tabs.slice(position-1,position)[0],'href',href)}})})(jQuery);(function($){$.ajaxHistory=new function(){var RESET_EVENT='historyReset';var _currentHash=location.hash;var _intervalId=null;var _observeHistory;this.update=function(){};var _defaultReset=function(){$('.remote-output').empty()};$(document).bind(RESET_EVENT,_defaultReset);if($.browser.msie){var _historyIframe,initialized=false;$(function(){_historyIframe=$('<iframe style="display: none;"></iframe>').appendTo(document.body).get(0);var iframe=_historyIframe.contentWindow.document;iframe.open();iframe.close();if(_currentHash&&_currentHash!='#'){iframe.location.hash=_currentHash.replace('#','')}});this.update=function(hash){_currentHash=hash;var iframe=_historyIframe.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=hash.replace('#','')};_observeHistory=function(){var iframe=_historyIframe.contentWindow.document;var iframeHash=iframe.location.hash;if(iframeHash!=_currentHash){_currentHash=iframeHash;if(iframeHash&&iframeHash!='#'){$('a[@href$="'+iframeHash+'"]').click()}else if(initialized){$(document).trigger(RESET_EVENT)}}initialized=true}}else if($.browser.mozilla||$.browser.opera){this.update=function(hash){_currentHash=hash};_observeHistory=function(){if(location.hash){if(_currentHash!=location.hash){_currentHash=location.hash;$('a[@href$="'+_currentHash+'"]').click()}}else if(_currentHash){_currentHash='';$(document).trigger(RESET_EVENT)}}}else if($.browser.safari){var _backStack,_forwardStack,_addHistory;$(function(){_backStack=[];_backStack.length=history.length;_forwardStack=[]});var isFirst=false,initialized=false;_addHistory=function(hash){_backStack.push(hash);_forwardStack.length=0;isFirst=false};this.update=function(hash){_currentHash=hash;_addHistory(_currentHash)};_observeHistory=function(){var historyDelta=history.length-_backStack.length;if(historyDelta){isFirst=false;if(historyDelta<0){for(var i=0;i<Math.abs(historyDelta);i++)_forwardStack.unshift(_backStack.pop())}else{for(var i=0;i<historyDelta;i++)_backStack.push(_forwardStack.shift())}var cachedHash=_backStack[_backStack.length-1];$('a[@href$="'+cachedHash+'"]').click();_currentHash=location.hash}else if(_backStack[_backStack.length-1]==undefined&&!isFirst){if(document.URL.indexOf('#')>=0){$('a[@href$="'+'#'+document.URL.split('#')[1]+'"]').click()}else if(initialized){$(document).trigger(RESET_EVENT)}isFirst=true}initialized=true}}this.initialize=function(callback){if(typeof callback=='function'){$(document).unbind(RESET_EVENT,_defaultReset).bind(RESET_EVENT,callback)}if(location.hash&&typeof _addHistory=='undefined'){$('a[@href$="'+location.hash+'"]').trigger('click')}if(_observeHistory&&_intervalId==null){_intervalId=setInterval(_observeHistory,800)}}};$.fn.remote=function(output,settings,callback){callback=callback||function(){};if(typeof settings=='function'){callback=settings}settings=$.extend({hashPrefix:'remote-'},settings||{});var target=$(output).size()&&$(output)||$('<div></div>').appendTo('body');target.addClass('remote-output');return this.each(function(i){var href=this.href,hash='#'+(this.title&&this.title.replace(/\s/g,'_')||settings.hashPrefix+(i+1)),a=this;this.href=hash;$(this).click(function(e){if(!target['locked']){if(e.clientX){$.ajaxHistory.update(hash)}target.load(href,function(){target['locked']=null;callback.apply(a)})}})})};$.fn.history=function(callback){return this.click(function(e){if(e.clientX){$.ajaxHistory.update(this.hash)}typeof callback=='function'&&callback()})}})(jQuery);(function($){$.extend($.ui.tabs.prototype,{rotation:null,rotate:function(ms){var self=this;function stop(e){if(e.clientX){clearInterval(self.rotation)}}if(ms){var t=0;this.rotation=setInterval(function(){t=++t<=self.$tabs.length?t:1;self.click(t)},ms);this.$tabs.bind(this.options.event,stop)}else{clearInterval(this.rotation);this.$tabs.unbind(this.options.event,stop)}}});$.fn.tabsRotate=function(ms){return this.each(function(){$.ui.tabs.getInstance(this).rotate(ms)})}})(jQuery);