function MM_swapImgRestore(){var a,b,d=document.MM_sr;for(a=0;d&&a<d.length&&(b=d[a])&&b.oSrc;a++)b.src=b.oSrc}function MM_preloadImages(){var a=document;if(a.images){if(!a.MM_p)a.MM_p=[];var b,d=a.MM_p.length,c=MM_preloadImages.arguments;for(b=0;b<c.length;b++)if(c[b].indexOf("#")!=0){a.MM_p[d]=new Image;a.MM_p[d++].src=c[b]}}} function MM_findObj(a,b){var d,c;b||(b=document);if((d=a.indexOf("?"))>0&&parent.frames.length){b=parent.frames[a.substring(d+1)].document;a=a.substring(0,d)}if(!(c=b[a])&&b.all)c=b.all[a];for(d=0;!c&&d<b.forms.length;d++)c=b.forms[d][a];for(d=0;!c&&b.layers&&d<b.layers.length;d++)c=MM_findObj(a,b.layers[d].document);if(!c&&b.getElementById)c=b.getElementById(a);return c} function MM_swapImage(){var a,b=0,d,c=MM_swapImage.arguments;document.MM_sr=[];for(a=0;a<c.length-2;a+=3)if((d=MM_findObj(c[a]))!=null){document.MM_sr[b++]=d;if(!d.oSrc)d.oSrc=d.src;d.src=c[a+2]}}var Spry;Spry||(Spry={});if(!Spry.Widget)Spry.Widget={}; Spry.BrowserSniff=function(){navigator.appName.toString();navigator.platform.toString();var a=navigator.userAgent.toString();this.mozilla=this.ie=this.opera=this.safari=false;var b=/MSIE.([0-9\.]*)/i,d=/gecko/i,c=/(applewebkit|safari)\/([\d\.]*)/i,e=false;if(e=a.match(/Opera.([0-9\.]*)/i)){this.opera=true;this.version=parseFloat(e[1])}else if(e=a.match(b)){this.ie=true;this.version=parseFloat(e[1])}else if(e=a.match(c)){this.safari=true;this.version=parseFloat(e[2])}else if(a.match(d)){e=a.match(/rv:\s*([0-9\.]+)/i); this.mozilla=true;this.version=parseFloat(e[1])}this.windows=this.mac=this.linux=false;this.Platform=a.match(/windows/i)?"windows":a.match(/linux/i)?"linux":a.match(/mac/i)?"mac":a.match(/unix/i)?"unix":"unknown";this[this.Platform]=true;this.v=this.version;if(this.safari&&this.mac&&this.mozilla)this.mozilla=false};Spry.is=new Spry.BrowserSniff;Spry.Widget.MenuBar=function(a,b){this.init(a,b)}; Spry.Widget.MenuBar.prototype.init=function(a,b){this.element=this.getElement(a);this.currMenu=null;this.hideDelay=this.showDelay=250;if(!(typeof document.getElementById=="undefined"||navigator.vendor=="Apple Computer, Inc."&&typeof window.XMLHttpRequest=="undefined"||Spry.is.ie&&typeof document.uniqueID=="undefined")){if(Spry.is.ie&&Spry.is.version<7)try{document.execCommand("BackgroundImageCache",false,true)}catch(d){}this.upKeyCode=Spry.Widget.MenuBar.KEY_UP;this.downKeyCode=Spry.Widget.MenuBar.KEY_DOWN; this.leftKeyCode=Spry.Widget.MenuBar.KEY_LEFT;this.rightKeyCode=Spry.Widget.MenuBar.KEY_RIGHT;this.escKeyCode=Spry.Widget.MenuBar.KEY_ESC;this.hoverClass="MenuBarItemHover";this.subHoverClass="MenuBarItemSubmenuHover";this.subVisibleClass="MenuBarSubmenuVisible";this.hasSubClass="MenuBarItemSubmenu";this.activeClass="MenuBarActive";this.isieClass="MenuBarItemIE";this.verticalClass="MenuBarVertical";this.horizontalClass="MenuBarHorizontal";this.enableKeyboardNavigation=true;this.hasFocus=false;if(b){for(var c in b)if(typeof this[c]== "undefined")(new Image).src=b[c];Spry.Widget.MenuBar.setOptions(this,b)}if(Spry.is.safari)this.enableKeyboardNavigation=false;if(this.element){this.currMenu=this.element;var e=this.element.getElementsByTagName("li");for(c=0;c<e.length;c++){if(c>0&&this.enableKeyboardNavigation)e[c].getElementsByTagName("a")[0].tabIndex="-1";this.initialize(e[c],a);if(Spry.is.ie){this.addClassName(e[c],this.isieClass);e[c].style.position="static"}}if(this.enableKeyboardNavigation){var f=this;this.addEventListener(document, "keydown",function(h){f.keyDown(h)},false)}if(Spry.is.ie){if(this.hasClassName(this.element,this.verticalClass))this.element.style.position="relative";e=this.element.getElementsByTagName("a");for(c=0;c<e.length;c++)e[c].style.position="relative"}}}};Spry.Widget.MenuBar.KEY_ESC=27;Spry.Widget.MenuBar.KEY_UP=38;Spry.Widget.MenuBar.KEY_DOWN=40;Spry.Widget.MenuBar.KEY_LEFT=37;Spry.Widget.MenuBar.KEY_RIGHT=39; Spry.Widget.MenuBar.prototype.getElement=function(a){if(a&&typeof a=="string")return document.getElementById(a);return a};Spry.Widget.MenuBar.prototype.hasClassName=function(a,b){if(!a||!b||!a.className||a.className.search(new RegExp("\\b"+b+"\\b"))==-1)return false;return true};Spry.Widget.MenuBar.prototype.addClassName=function(a,b){!a||!b||this.hasClassName(a,b)||(a.className+=(a.className?" ":"")+b)}; Spry.Widget.MenuBar.prototype.removeClassName=function(a,b){if(!(!a||!b||!this.hasClassName(a,b)))a.className=a.className.replace(new RegExp("\\s*\\b"+b+"\\b","g"),"")};Spry.Widget.MenuBar.prototype.addEventListener=function(a,b,d,c){try{if(a.addEventListener)a.addEventListener(b,d,c);else a.attachEvent&&a.attachEvent("on"+b,d)}catch(e){}}; Spry.Widget.MenuBar.prototype.createIframeLayer=function(a){var b=document.createElement("iframe");b.tabIndex="-1";b.src='javascript:""';b.frameBorder="0";b.scrolling="no";a.parentNode.appendChild(b);b.style.left=a.offsetLeft+"px";b.style.top=a.offsetTop+"px";b.style.width=a.offsetWidth+"px";b.style.height=a.offsetHeight+"px"};Spry.Widget.MenuBar.prototype.removeIframeLayer=function(a){for(a=(a==this.element?a:a.parentNode).getElementsByTagName("iframe");a.length>0;)a[0].parentNode.removeChild(a[0])}; Spry.Widget.MenuBar.prototype.clearMenus=function(a){a=a.getElementsByTagName("ul");for(var b=0;b<a.length;b++)this.hideSubmenu(a[b]);this.removeClassName(this.element,this.activeClass)};Spry.Widget.MenuBar.prototype.bubbledTextEvent=function(){return Spry.is.safari&&(event.target==event.relatedTarget.parentNode||event.eventPhase==3&&event.target.parentNode==event.relatedTarget)}; Spry.Widget.MenuBar.prototype.showSubmenu=function(a){if(this.currMenu){this.clearMenus(this.currMenu);this.currMenu=null}if(a){this.addClassName(a,this.subVisibleClass);if(typeof document.all!="undefined"&&!Spry.is.opera&&navigator.vendor!="KDE")if(!this.hasClassName(this.element,this.horizontalClass)||a.parentNode.parentNode!=this.element)a.style.top=a.parentNode.offsetTop+"px";Spry.is.ie&&Spry.is.version<7&&this.createIframeLayer(a)}this.addClassName(this.element,this.activeClass)}; Spry.Widget.MenuBar.prototype.hideSubmenu=function(a){if(a){this.removeClassName(a,this.subVisibleClass);if(typeof document.all!="undefined"&&!Spry.is.opera&&navigator.vendor!="KDE"){a.style.top="";a.style.left=""}Spry.is.ie&&Spry.is.version<7&&this.removeIframeLayer(a)}}; Spry.Widget.MenuBar.prototype.initialize=function(a){var b=a.getElementsByTagName("a")[0],d=a.getElementsByTagName("ul");(d.length>0?d[0]:null)&&this.addClassName(b,this.hasSubClass);if(!Spry.is.ie)a.contains=function(e){if(e==null)return false;return e==this?true:this.contains(e.parentNode)};var c=this;this.addEventListener(a,"mouseover",function(e){c.mouseOver(a,e)},false);this.addEventListener(a,"mouseout",function(e){c.enableKeyboardNavigation&&c.clearSelection();c.mouseOut(a,e)},false);if(this.enableKeyboardNavigation){this.addEventListener(b, "blur",function(){c.onBlur(a)},false);this.addEventListener(b,"focus",function(e){c.keyFocus(a,e)},false)}};Spry.Widget.MenuBar.prototype.keyFocus=function(a){this.lastOpen=a.getElementsByTagName("a")[0];this.addClassName(this.lastOpen,a.getElementsByTagName("ul").length>0?this.subHoverClass:this.hoverClass);this.hasFocus=true};Spry.Widget.MenuBar.prototype.onBlur=function(a){this.clearSelection(a)}; Spry.Widget.MenuBar.prototype.clearSelection=function(a){if(this.lastOpen){if(a){a=a.getElementsByTagName("a")[0];for(var b=this.lastOpen;b!=this.element;){for(var d=a;d!=this.element;){if(d==b)return;try{d=d.parentNode}catch(c){break}}b=b.parentNode}}for(b=this.lastOpen;b!=this.element;){this.hideSubmenu(b.parentNode);a=b.getElementsByTagName("a")[0];this.removeClassName(a,this.hoverClass);this.removeClassName(a,this.subHoverClass);b=b.parentNode}this.lastOpen=false}}; Spry.Widget.MenuBar.prototype.keyDown=function(a){if(this.hasFocus)if(this.lastOpen){a=a||event;var b=this.lastOpen.parentNode,d=this.lastOpen,c=b.getElementsByTagName("ul"),e=c.length>0?c[0]:null;c=e?true:false;e=[b,e,null,this.getSibling(b,"previousSibling"),this.getSibling(b,"nextSibling")];e[3]||(e[2]=b.parentNode.parentNode.nodeName.toLowerCase()=="li"?b.parentNode.parentNode:null);var f=0;switch(a.keyCode){case this.upKeyCode:f=this.getElementForKey(e,"y",1);break;case this.downKeyCode:f=this.getElementForKey(e, "y",-1);break;case this.leftKeyCode:f=this.getElementForKey(e,"x",1);break;case this.rightKeyCode:f=this.getElementForKey(e,"x",-1);break;case this.escKeyCode:case 9:this.clearSelection();this.hasFocus=false;default:return}switch(f){case 0:return;case 1:this.mouseOver(b,a);break;case 2:this.mouseOut(e[2],a);break;case 3:case 4:this.removeClassName(d,c?this.subHoverClass:this.hoverClass);break}d=e[f].getElementsByTagName("a")[0];if(e[f].nodeName.toLowerCase()=="ul")e[f]=e[f].getElementsByTagName("li")[0]; this.addClassName(d,e[f].getElementsByTagName("ul").length>0?this.subHoverClass:this.hoverClass);this.lastOpen=d;e[f].getElementsByTagName("a")[0].focus();return Spry.Widget.MenuBar.stopPropagation(a)}else this.hasFocus=false}; Spry.Widget.MenuBar.prototype.mouseOver=function(a){var b=a.getElementsByTagName("a")[0],d=a.getElementsByTagName("ul"),c=d.length>0?d[0]:null;d=c?true:false;this.enableKeyboardNavigation&&this.clearSelection(a);if(!this.bubbledTextEvent()){a.closetime&&clearTimeout(a.closetime);if(this.currMenu==a)this.currMenu=null;this.hasFocus&&b.focus();this.addClassName(b,d?this.subHoverClass:this.hoverClass);this.lastOpen=b;if(c&&!this.hasClassName(c,this.subHoverClass)){var e=this;a.opentime=window.setTimeout(function(){e.showSubmenu(c)}, this.showDelay)}}}; Spry.Widget.MenuBar.prototype.mouseOut=function(a,b){var d=a.getElementsByTagName("a")[0],c=a.getElementsByTagName("ul"),e=c.length>0?c[0]:null;c=e?true:false;if(!this.bubbledTextEvent())if(!a.contains(typeof b.relatedTarget!="undefined"?b.relatedTarget:b.toElement)){a.opentime&&clearTimeout(a.opentime);this.currMenu=a;this.removeClassName(d,c?this.subHoverClass:this.hoverClass);if(e){var f=this;a.closetime=window.setTimeout(function(){f.hideSubmenu(e)},this.hideDelay)}this.hasFocus&&d.blur()}}; Spry.Widget.MenuBar.prototype.getSibling=function(a,b){for(var d=a[b];d&&d.nodeName.toLowerCase()!="li";)d=d[b];return d}; Spry.Widget.MenuBar.prototype.getElementForKey=function(a,b,d){var c=0,e=Spry.Widget.MenuBar.getPosition,f=e(a[c]),h=false;if(a[1]&&!this.hasClassName(a[1],this.MenuBarSubmenuVisible)){a[1].style.visibility="hidden";this.showSubmenu(a[1]);h=true}for(var i=this.hasClassName(this.element,this.verticalClass),k=a[0].parentNode.parentNode.nodeName.toLowerCase()=="li"?true:false,g=1;g<a.length;g++)if(!(b=="y"&&i&&(g==1||g==2)))if(!(b=="x"&&!i&&!k&&(g==1||g==2)))if(a[g]){var j=e(a[g]);if(d*j[b]<d*f[b]){f= j;c=g}}if(a[1]&&h){this.hideSubmenu(a[1]);a[1].style.visibility=""}return c};Spry.Widget.MenuBar.camelize=function(a){if(a.indexOf("-")==-1)return a;a=a.split("-");for(var b=true,d="",c=0;c<a.length;c++)if(a[c].length>0)if(b){d=a[c];b=false}else{var e=a[c];d+=e.charAt(0).toUpperCase()+e.substring(1)}return d}; Spry.Widget.MenuBar.getStyleProp=function(a,b){var d;try{if(a.style)d=a.style[Spry.Widget.MenuBar.camelize(b)];if(!d)if(document.defaultView&&document.defaultView.getComputedStyle){var c=document.defaultView.getComputedStyle(a,null);d=c?c.getPropertyValue(b):null}else if(a.currentStyle)d=a.currentStyle[Spry.Widget.MenuBar.camelize(b)]}catch(e){}return d=="auto"?null:d};Spry.Widget.MenuBar.getIntProp=function(a,b){var d=parseInt(Spry.Widget.MenuBar.getStyleProp(a,b),10);if(isNaN(d))return 0;return d}; Spry.Widget.MenuBar.getPosition=function(a,b){b=b||document;if(typeof a=="string")a=b.getElementById(a);if(!a)return false;if(a.parentNode===null||Spry.Widget.MenuBar.getStyleProp(a,"display")=="none")return false;var d={x:0,y:0},c=null;if(a.getBoundingClientRect){c=a.getBoundingClientRect();var e=b.documentElement.scrollTop||b.body.scrollTop;d.x=c.left+(b.documentElement.scrollLeft||b.body.scrollLeft);d.y=c.top+e}else if(b.getBoxObjectFor){c=b.getBoxObjectFor(a);d.x=c.x;d.y=c.y}else{d.x=a.offsetLeft; d.y=a.offsetTop;c=a.offsetParent;if(c!=a)for(;c;){d.x+=c.offsetLeft;d.y+=c.offsetTop;c=c.offsetParent}if(Spry.is.opera||Spry.is.safari&&Spry.Widget.MenuBar.getStyleProp(a,"position")=="absolute")d.y-=b.body.offsetTop}c=a.parentNode?a.parentNode:null;if(c.nodeName)for(e=c.nodeName.toUpperCase();c&&e!="BODY"&&e!="HTML";){e=c.nodeName.toUpperCase();d.x-=c.scrollLeft;d.y-=c.scrollTop;c=c.parentNode?c.parentNode:null}return d}; Spry.Widget.MenuBar.stopPropagation=function(a){if(a.stopPropagation)a.stopPropagation();else a.cancelBubble=true;if(a.preventDefault)a.preventDefault();else a.returnValue=false};Spry.Widget.MenuBar.setOptions=function(a,b,d){if(b)for(var c in b)d&&b[c]==undefined||(a[c]=b[c])};

//--apry widget

var Spry;
if (!Spry) Spry = {};
if (!Spry.Widget) Spry.Widget = {};

Spry.Widget.Accordion = function(element, opts)
{
	this.element = this.getElement(element);
	this.defaultPanel = 0;
	this.hoverClass = "AccordionPanelTabHover";
	this.openClass = "AccordionPanelOpen";
	this.closedClass = "AccordionPanelClosed";
	this.focusedClass = "AccordionFocused";
	this.enableAnimation = true;
	this.enableKeyboardNavigation = true;
	this.currentPanel = null;
	this.animator = null;
	this.hasFocus = null;

	this.previousPanelKeyCode = Spry.Widget.Accordion.KEY_UP;
	this.nextPanelKeyCode = Spry.Widget.Accordion.KEY_DOWN;

	this.useFixedPanelHeights = true;
	this.fixedPanelHeight = 0;

	Spry.Widget.Accordion.setOptions(this, opts, true);

	this.attachBehaviors();
};

Spry.Widget.Accordion.prototype.getElement = function(ele)
{
	if (ele && typeof ele == "string")
		return document.getElementById(ele);
	return ele;
};

Spry.Widget.Accordion.prototype.addClassName = function(ele, className)
{
	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
		return;
	ele.className += (ele.className ? " " : "") + className;
};

Spry.Widget.Accordion.prototype.removeClassName = function(ele, className)
{
	if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
		return;
	ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
};

Spry.Widget.Accordion.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
{
	if (!optionsObj)
		return;
	for (var optionName in optionsObj)
	{
		if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
			continue;
		obj[optionName] = optionsObj[optionName];
	}
};

Spry.Widget.Accordion.prototype.onPanelTabMouseOver = function(e, panel)
{
	if (panel)
		this.addClassName(this.getPanelTab(panel), this.hoverClass);
	return false;
};

Spry.Widget.Accordion.prototype.onPanelTabMouseOut = function(e, panel)
{
	if (panel)
		this.removeClassName(this.getPanelTab(panel), this.hoverClass);
	return false;
};

Spry.Widget.Accordion.prototype.openPanel = function(elementOrIndex)
{
	var panelA = this.currentPanel;
	var panelB;

	if (typeof elementOrIndex == "number")
		panelB = this.getPanels()[elementOrIndex];
	else
		panelB = this.getElement(elementOrIndex);
	
	if (!panelB || panelA == panelB)	
		return null;

	var contentA = panelA ? this.getPanelContent(panelA) : null;
	var contentB = this.getPanelContent(panelB);

	if (!contentB)
		return null;

	if (this.useFixedPanelHeights && !this.fixedPanelHeight)
		this.fixedPanelHeight = (contentA.offsetHeight) ? contentA.offsetHeight : contentA.scrollHeight;

	if (this.enableAnimation)
	{
		if (this.animator)
			this.animator.stop();
		this.animator = new Spry.Widget.Accordion.PanelAnimator(this, panelB, { duration: this.duration, fps: this.fps, transition: this.transition });
		this.animator.start();
	}
	else
	{
		if(contentA)
		{
			contentA.style.display = "none";
			contentA.style.height = "0px";
		}
		contentB.style.display = "block";
		contentB.style.height = this.useFixedPanelHeights ? this.fixedPanelHeight + "px" : "auto";
	}

	if(panelA)
	{
		this.removeClassName(panelA, this.openClass);
		this.addClassName(panelA, this.closedClass);
	}

	this.removeClassName(panelB, this.closedClass);
	this.addClassName(panelB, this.openClass);

	this.currentPanel = panelB;

	return panelB;
};

Spry.Widget.Accordion.prototype.closePanel = function()
{
	// The accordion can only ever have one panel open at any

	// give time, so this method only closes the current panel.
	// If the accordion is in fixed panel heights mode, this
	// method does nothing.

	if (!this.useFixedPanelHeights && this.currentPanel)
	{
		var panel = this.currentPanel;
		var content = this.getPanelContent(panel);
		if (content)
		{
			if (this.enableAnimation)
			{
				if (this.animator)
					this.animator.stop();
				this.animator = new Spry.Widget.Accordion.PanelAnimator(this, null, { duration: this.duration, fps: this.fps, transition: this.transition });
				this.animator.start();
			}
			else
			{
				content.style.display = "none";
				content.style.height = "0px";
			}
		}		
		this.removeClassName(panel, this.openClass);
		this.addClassName(panel, this.closedClass);
		this.currentPanel = null;
	}
};

Spry.Widget.Accordion.prototype.openNextPanel = function()
{
	return this.openPanel(this.getCurrentPanelIndex() + 1);
};

Spry.Widget.Accordion.prototype.openPreviousPanel = function()
{
	return this.openPanel(this.getCurrentPanelIndex() - 1);
};

Spry.Widget.Accordion.prototype.openFirstPanel = function()
{
	return this.openPanel(0);
};

Spry.Widget.Accordion.prototype.openLastPanel = function()
{
	var panels = this.getPanels();
	return this.openPanel(panels[panels.length - 1]);
};

Spry.Widget.Accordion.prototype.onPanelTabClick = function(e, panel)
{
	if (panel != this.currentPanel)
		this.openPanel(panel);
	else
		this.closePanel();

	if (this.enableKeyboardNavigation)
		this.focus();

	if (e.preventDefault) e.preventDefault();
	else e.returnValue = false;
	if (e.stopPropagation) e.stopPropagation();
	else e.cancelBubble = true;

	return false;
};

Spry.Widget.Accordion.prototype.onFocus = function(e)
{
	this.hasFocus = true;
	this.addClassName(this.element, this.focusedClass);
	return false;
};

Spry.Widget.Accordion.prototype.onBlur = function(e)
{
	this.hasFocus = false;
	this.removeClassName(this.element, this.focusedClass);
	return false;
};

Spry.Widget.Accordion.KEY_UP = 38;
Spry.Widget.Accordion.KEY_DOWN = 40;

Spry.Widget.Accordion.prototype.onKeyDown = function(e)
{
	var key = e.keyCode;
	if (!this.hasFocus || (key != this.previousPanelKeyCode && key != this.nextPanelKeyCode))
		return true;
	
	var panels = this.getPanels();
	if (!panels || panels.length < 1)
		return false;
	var currentPanel = this.currentPanel ? this.currentPanel : panels[0];
	var nextPanel = (key == this.nextPanelKeyCode) ? currentPanel.nextSibling : currentPanel.previousSibling;

	while (nextPanel)
	{
		if (nextPanel.nodeType == 1 /* Node.ELEMENT_NODE */)
			break;
		nextPanel = (key == this.nextPanelKeyCode) ? nextPanel.nextSibling : nextPanel.previousSibling;
	}

	if (nextPanel && currentPanel != nextPanel)
		this.openPanel(nextPanel);

	if (e.preventDefault) e.preventDefault();
	else e.returnValue = false;
	if (e.stopPropagation) e.stopPropagation();
	else e.cancelBubble = true;

	return false;
};

Spry.Widget.Accordion.prototype.attachPanelHandlers = function(panel)
{
	if (!panel)
		return;

	var tab = this.getPanelTab(panel);

	if (tab)
	{
		var self = this;
		Spry.Widget.Accordion.addEventListener(tab, "click", function(e) { return self.onPanelTabClick(e, panel); }, false);
		Spry.Widget.Accordion.addEventListener(tab, "mouseover", function(e) { return self.onPanelTabMouseOver(e, panel); }, false);
		Spry.Widget.Accordion.addEventListener(tab, "mouseout", function(e) { return self.onPanelTabMouseOut(e, panel); }, false);
	}
};

Spry.Widget.Accordion.addEventListener = function(element, eventType, handler, capture)
{
	try
	{
		if (element.addEventListener)
			element.addEventListener(eventType, handler, capture);
		else if (element.attachEvent)
			element.attachEvent("on" + eventType, handler);
	}
	catch (e) {}
};

Spry.Widget.Accordion.prototype.initPanel = function(panel, isDefault)
{
	var content = this.getPanelContent(panel);
	if (isDefault)
	{
		this.currentPanel = panel;
		this.removeClassName(panel, this.closedClass);
		this.addClassName(panel, this.openClass);

		// Attempt to set up the height of the default panel. We don't want to
		// do any dynamic panel height calculations here because our accordion
		// or one of its parent containers may be display:none.

		if (content)
		{
			if (this.useFixedPanelHeights)
			{
				// We are in fixed panel height mode and the user passed in
				// a panel height for us to use.
	
				if (this.fixedPanelHeight)
					content.style.height = this.fixedPanelHeight + "px";
			}
			else
			{
				// We are in variable panel height mode, but since we can't
				// calculate the panel height here, we just set the height to
				// auto so that it expands to show all of its content.
	
				content.style.height = "auto";
			}
		}
	}
	else
	{
		this.removeClassName(panel, this.openClass);
		this.addClassName(panel, this.closedClass);

		if (content)
		{
			content.style.height = "0px";
			content.style.display = "none";
		}
	}
	
	this.attachPanelHandlers(panel);
};

Spry.Widget.Accordion.prototype.attachBehaviors = function()
{
	var panels = this.getPanels();
	for (var i = 0; i < panels.length; i++)
		this.initPanel(panels[i], i == this.defaultPanel);

	// Advanced keyboard navigation requires the tabindex attribute
	// on the top-level element.

	this.enableKeyboardNavigation = (this.enableKeyboardNavigation && this.element.attributes.getNamedItem("tabindex"));
	if (this.enableKeyboardNavigation)
	{
		var self = this;
		Spry.Widget.Accordion.addEventListener(this.element, "focus", function(e) { return self.onFocus(e); }, false);
		Spry.Widget.Accordion.addEventListener(this.element, "blur", function(e) { return self.onBlur(e); }, false);
		Spry.Widget.Accordion.addEventListener(this.element, "keydown", function(e) { return self.onKeyDown(e); }, false);
	}
};

Spry.Widget.Accordion.prototype.getPanels = function()
{
	return this.getElementChildren(this.element);
};

Spry.Widget.Accordion.prototype.getCurrentPanel = function()
{
	return this.currentPanel;
};

Spry.Widget.Accordion.prototype.getPanelIndex = function(panel)
{
	var panels = this.getPanels();
	for( var i = 0 ; i < panels.length; i++ )
	{
		if( panel == panels[i] )
			return i;
	}
	return -1;
};

Spry.Widget.Accordion.prototype.getCurrentPanelIndex = function()
{
	return this.getPanelIndex(this.currentPanel);
};

Spry.Widget.Accordion.prototype.getPanelTab = function(panel)
{
	if (!panel)
		return null;
	return this.getElementChildren(panel)[0];
};

Spry.Widget.Accordion.prototype.getPanelContent = function(panel)
{
	if (!panel)
		return null;
	return this.getElementChildren(panel)[1];
};

Spry.Widget.Accordion.prototype.getElementChildren = function(element)
{
	var children = [];
	var child = element.firstChild;
	while (child)
	{
		if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
			children.push(child);
		child = child.nextSibling;
	}
	return children;
};

Spry.Widget.Accordion.prototype.focus = function()
{
	if (this.element && this.element.focus)
		this.element.focus();
};

Spry.Widget.Accordion.prototype.blur = function()
{
	if (this.element && this.element.blur)
		this.element.blur();
};

/////////////////////////////////////////////////////

Spry.Widget.Accordion.PanelAnimator = function(accordion, panel, opts)
{
	this.timer = null;
	this.interval = 0;

	this.fps = 60;
	this.duration = 500;
	this.startTime = 0;

	this.transition = Spry.Widget.Accordion.PanelAnimator.defaultTransition;

	this.onComplete = null;

	this.panel = panel;
	this.panelToOpen = accordion.getElement(panel);
	this.panelData = [];
	this.useFixedPanelHeights = accordion.useFixedPanelHeights;

	Spry.Widget.Accordion.setOptions(this, opts, true);

	this.interval = Math.floor(1000 / this.fps);

	// Set up the array of panels we want to animate.

	var panels = accordion.getPanels();
	for (var i = 0; i < panels.length; i++)
	{
		var p = panels[i];
		var c = accordion.getPanelContent(p);
		if (c)
		{
			var h = c.offsetHeight;
			if (h == undefined)
				h = 0;

			if (p == panel && h == 0)
				c.style.display = "block";

			if (p == panel || h > 0)
			{
				var obj = new Object;
				obj.panel = p;
				obj.content = c;
				obj.fromHeight = h;
				obj.toHeight = (p == panel) ? (accordion.useFixedPanelHeights ? accordion.fixedPanelHeight : c.scrollHeight) : 0;
				obj.distance = obj.toHeight - obj.fromHeight;
				obj.overflow = c.style.overflow;
				this.panelData.push(obj);

				c.style.overflow = "hidden";
				c.style.height = h + "px";
			}
		}
	}
};

Spry.Widget.Accordion.PanelAnimator.defaultTransition = function(time, begin, finish, duration) { time /= duration; return begin + ((2 - time) * time * finish); };

Spry.Widget.Accordion.PanelAnimator.prototype.start = function()
{
	var self = this;
	this.startTime = (new Date).getTime();
	this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);
};

Spry.Widget.Accordion.PanelAnimator.prototype.stop = function()
{
	if (this.timer)
	{
		clearTimeout(this.timer);

		// If we're killing the timer, restore the overflow
		// properties on the panels we were animating!

		for (i = 0; i < this.panelData.length; i++)
		{
			obj = this.panelData[i];
			obj.content.style.overflow = obj.overflow;
		}
	}

	this.timer = null;
};

Spry.Widget.Accordion.PanelAnimator.prototype.stepAnimation = function()
{
	var curTime = (new Date).getTime();
	var elapsedTime = curTime - this.startTime;

	var i, obj;

	if (elapsedTime >= this.duration)
	{
		for (i = 0; i < this.panelData.length; i++)
		{
			obj = this.panelData[i];
			if (obj.panel != this.panel)
			{
				obj.content.style.display = "none";
				obj.content.style.height = "0px";
			}
			obj.content.style.overflow = obj.overflow;
			obj.content.style.height = (this.useFixedPanelHeights || obj.toHeight == 0) ? obj.toHeight + "px" : "auto";
		}
		if (this.onComplete)
			this.onComplete();
		return;
	}

	for (i = 0; i < this.panelData.length; i++)
	{
		obj = this.panelData[i];
		var ht = this.transition(elapsedTime, obj.fromHeight, obj.distance, this.duration);
		obj.content.style.height = ((ht < 0) ? 0 : ht) + "px";
	}
	
	var self = this;
	this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);
};
