(function($){
$.ui=$.ui ||{}
$.fn.tabs=function(){
var method=typeof arguments[0]=='string'&&arguments[0]
var args=method&&Array.prototype.slice.call(arguments,1)|| arguments
return method=='length' ?
$.data(this[0],'tabs').$tabs.length :
this.each(function(){
if(method){
var tabs=$.data(this,'tabs')
if(tabs)tabs[method].apply(tabs,args)
}else
new $.ui.tabs(this,args[0] ||{})
})}
$.ui.tabs=function(el,options){
var self=this
this.options=$.extend({},$.ui.tabs.defaults,options)
this.element=el
if(options.selected===null)
this.options.selected=null
this.options.event+='.tabs'
$(el).bind('setData.tabs',function(event,key,value){
if((/^selected/).test(key))
self.select(value)
else{
self.options[key]=value
self.tabify()}
}).bind('getData.tabs',function(event,key){
return self.options[key]
})
$.data(el,'tabs',this)
this.tabify(true)}
$.ui.tabs.defaults={
selected: 0,
unselect: false,
event: 'click',
disabled: [],
cookie: null,
spinner: 'Loading&#8230;',
cache: false,
idPrefix: 'ui-tabs-',
ajaxOptions:{},
fx: null,
tabTemplate: '<li><a href="#{href}"><span>#{label}</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'}
$.extend($.ui.tabs.prototype,{
tabId: function(a){
return a.title&&a.title.replace(/\s/g,'_').replace(/[^A-Za-z0-9\-_:\.]/g,'')
|| this.options.idPrefix+$.data(a)
},
ui: function(tab,panel){
return{
instance: this,
options: this.options,
tab: tab,
panel: panel}
},
tabify: function(init){
this.$lis=$('li:has(a[href])',this.element)
this.$tabs=this.$lis.map(function(){return $('a',this)[0];})
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 if($(a).attr('href')!='#'){
$.data(a,'href.tabs',a.href)
$.data(a,'load.tabs',a.href)
var id=self.tabId(a)
a.href='#'+id
var $panel=$('#'+id)
if(!$panel.length){
$panel=$(o.panelTemplate).attr('id',id).addClass(o.panelClass)
.insertAfter(self.$panels[i-1] || self.element)
$panel.data('destroy.tabs',true)}
self.$panels=self.$panels.add($panel)}
else
o.disabled.push(i+1)
})
if(init){
$(this.element).hasClass(o.navClass)|| $(this.element).addClass(o.navClass)
this.$panels.each(function(){
var $this=$(this)
$this.hasClass(o.panelClass)|| $this.addClass(o.panelClass)
})
this.$tabs.each(function(i,a){
if(location.hash){
if(a.hash==location.hash){
o.selected=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){
var index=parseInt($.cookie('ui-tabs'+$.data(self.element)),10)
if(index&&self.$tabs[index]){
o.selected=index
return false}
}else if(self.$lis.eq(i).hasClass(o.selectedClass)){
o.selected=i
return false}
})
this.$panels.addClass(o.hideClass)
this.$lis.removeClass(o.selectedClass)
if(o.selected !==null){
this.$panels.eq(o.selected).show().removeClass(o.hideClass)
this.$lis.eq(o.selected).addClass(o.selectedClass)}
var href=o.selected !==null&&$.data(this.$tabs[o.selected],'load.tabs')
if(href)
this.load(o.selected)
o.disabled=$.unique(o.disabled.concat(
$.map(this.$lis.filter('.'+o.disabledClass),
function(n,i){return self.$lis.index(n);})
)).sort()
$(window).bind('unload',function(){
self.$tabs.unbind('.tabs')
self.$lis=self.$tabs=self.$panels=null
})}
for(var i=0,li;li=this.$lis[i];i++)
$(li)[$.inArray(i,o.disabled)!=-1&&!$(li).hasClass(o.selectedClass)? 'addClass' : 'removeClass'](o.disabledClass)
if(o.cache===false)
this.$tabs.removeData('cache.tabs')
var hideFx,showFx,baseFx={'min-width': 0,duration: 1},baseDuration='normal'
if(o.fx&&o.fx.constructor==Array)
hideFx=o.fx[0] || baseFx,showFx=o.fx[1] || baseFx
else
hideFx=showFx=o.fx || baseFx
var resetCSS={display: '',overflow: '',height: ''}
if(!$.browser.msie)
resetCSS.opacity=''
function hideTab(clicked,$hide,$show){
$hide.animate(hideFx,hideFx.duration || baseDuration,function(){
$hide.addClass(o.hideClass).css(resetCSS)
if($.browser.msie&&hideFx.opacity)
$hide[0].style.filter=''
if($show)
showTab(clicked,$show,$hide)
})}
function showTab(clicked,$show,$hide){
if(showFx===baseFx)
$show.css('display','block')
$show.animate(showFx,showFx.duration || baseDuration,function(){
$show.removeClass(o.hideClass).css(resetCSS)
if($.browser.msie&&showFx.opacity)
$show[0].style.filter=''
$(self.element).triggerHandler('tabsshow',[self.ui(clicked,$show[0])],o.show)
})}
function switchTab(clicked,$li,$hide,$show){
$li.addClass(o.selectedClass)
.siblings().removeClass(o.selectedClass)
hideTab(clicked,$hide,$show)}
this.$tabs.unbind('.tabs').bind(o.event,function(){
var $li=$(this).parents('li:eq(0)'),
$hide=self.$panels.filter(':visible'),
$show=$(this.hash)
if(($li.hasClass(o.selectedClass)&&!o.unselect)
|| $li.hasClass(o.disabledClass)
|| $(this).hasClass(o.loadingClass)
|| $(self.element).triggerHandler('tabsselect',[self.ui(this,$show[0])],o.select)===false
){
this.blur()
return false}
self.options.selected=self.$tabs.index(this)
if(o.unselect){
if($li.hasClass(o.selectedClass)){
self.options.selected=null
$li.removeClass(o.selectedClass)
self.$panels.stop()
hideTab(this,$hide)
this.blur()
return false
}else if(!$hide.length){
self.$panels.stop()
var a=this
self.load(self.$tabs.index(this),function(){
$li.addClass(o.selectedClass).addClass(o.unselectClass)
showTab(a,$show)
})
this.blur()
return false}}
if(o.cookie)
$.cookie('ui-tabs'+$.data(self.element),self.options.selected,o.cookie)
self.$panels.stop()
if($show.length){
var a=this
self.load(self.$tabs.index(this),$hide.length ?
function(){
switchTab(a,$li,$hide,$show)
}:
function(){
$li.addClass(o.selectedClass)
showTab(a,$show)}
)
}else
throw 'jQuery UI Tabs: Mismatching fragment identifier.'
if($.browser.msie)
this.blur()
return false
})
if(!(/^click/).test(o.event))
this.$tabs.bind('click.tabs',function(){return false;})
},
add: function(url,label,index){
if(index==undefined)
index=this.$tabs.length
var o=this.options
var $li=$(o.tabTemplate.replace(/#\{href\}/,url).replace(/#\{label\}/,label))
$li.data('destroy.tabs',true)
var id=url.indexOf('#')==0 ? url.replace('#',''): this.tabId($('a:first-child',$li)[0])
var $panel=$('#'+id)
if(!$panel.length){
$panel=$(o.panelTemplate).attr('id',id)
.addClass(o.panelClass).addClass(o.hideClass)
$panel.data('destroy.tabs',true)}
if(index>=this.$lis.length){
$li.appendTo(this.element)
$panel.appendTo(this.element.parentNode)
}else{
$li.insertBefore(this.$lis[index])
$panel.insertBefore(this.$panels[index])}
o.disabled=$.map(o.disabled,
function(n,i){return n>=index ?++n : n})
this.tabify()
if(this.$tabs.length==1){
$li.addClass(o.selectedClass)
$panel.removeClass(o.hideClass)
var href=$.data(this.$tabs[0],'load.tabs')
if(href)
this.load(index,href)}
$(this.element).triggerHandler('tabsadd',
[this.ui(this.$tabs[index],this.$panels[index])],o.add
)
},
remove: function(index){
var o=this.options,$li=this.$lis.eq(index).remove(),
$panel=this.$panels.eq(index).remove()
if($li.hasClass(o.selectedClass)&&this.$tabs.length>1)
this.select(index+(index+1<this.$tabs.length ? 1 :-1))
o.disabled=$.map($.grep(o.disabled,function(n,i){return n !=index;}),
function(n,i){return n>=index ?--n : n})
this.tabify()
$(this.element).triggerHandler('tabsremove',
[this.ui($li.find('a')[0],$panel[0])],o.remove
)
},
enable: function(index){
var o=this.options
if($.inArray(index,o.disabled)==-1)
return
var $li=this.$lis.eq(index).removeClass(o.disabledClass)
if($.browser.safari){
$li.css('display','inline-block')
setTimeout(function(){
$li.css('display','block')
},0)}
o.disabled=$.grep(o.disabled,function(n,i){return n !=index;})
$(this.element).triggerHandler('tabsenable',
[this.ui(this.$tabs[index],this.$panels[index])],o.enable
)
},
disable: function(index){
var self=this,o=this.options
if(index !=o.selected){
this.$lis.eq(index).addClass(o.disabledClass)
o.disabled.push(index)
o.disabled.sort()
$(this.element).triggerHandler('tabsdisable',
[this.ui(this.$tabs[index],this.$panels[index])],o.disable
)}
},
select: function(index){
if(typeof index=='string')
index=this.$tabs.index(this.$tabs.filter('[href$='+index+']')[0])
this.$tabs.eq(index).trigger(this.options.event)
},
load: function(index,callback){
var self=this,o=this.options,$a=this.$tabs.eq(index),a=$a[0],
bypassCache=callback==undefined || callback===false,url=$a.data('load.tabs')
callback=callback || function(){}
if(!url ||($.data(a,'cache.tabs')&&!bypassCache)){
callback()
return}
if(o.spinner){
var $span=$('span',a)
$span.data('label.tabs',$span.html()).html('<em>'+o.spinner+'</em>')}
var finish=function(){
self.$tabs.filter('.'+o.loadingClass).each(function(){
$(this).removeClass(o.loadingClass)
if(o.spinner){
var $span=$('span',this)
$span.html($span.data('label.tabs')).removeData('label.tabs')}
})
self.xhr=null}
var ajaxOptions=$.extend({},o.ajaxOptions,{
url: url,
success: function(r,s){
$(a.hash).html(r)
finish()
callback()
if(o.cache)
$.data(a,'cache.tabs',true)
$(self.element).triggerHandler('tabsload',
[self.ui(self.$tabs[index],self.$panels[index])],o.load
)
o.ajaxOptions.success&&o.ajaxOptions.success(r,s)}
})
if(this.xhr){
this.xhr.abort()
finish()}
$a.addClass(o.loadingClass)
setTimeout(function(){
self.xhr=$.ajax(ajaxOptions)
},0)
},
url: function(index,url){
this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs',url)
},
destroy: function(){
var o=this.options
$(this.element).unbind('.tabs')
.removeClass(o.navClass).removeData('tabs')
this.$tabs.each(function(){
var href=$.data(this,'href.tabs')
if(href)
this.href=href
var $this=$(this).unbind('.tabs')
$.each(['href','load','cache'],function(i,prefix){
$this.removeData(prefix+'.tabs')
})
})
this.$lis.add(this.$panels).each(function(){
if($.data(this,'destroy.tabs'))
$(this).remove()
else
$(this).removeClass([o.selectedClass,o.unselectClass,
o.disabledClass,o.panelClass,o.hideClass].join(' '))
})}
})
})(jQuery)

