/***********************************************************************
 * Spry-all.js - contains the contents of the following files from the Adobe Spry 1.6.1 js package:
 *  SpryAutoSuggest.js, SpryData.js, SpryMenuBar.js, SprySlidingPanels.js, SpryTabbedPanels.js, SpryTooltip.js, and xpath.js.
 * $Revision: 26 $
 * $Date: 6/11/09 5:00p $
 * $Author: Ijones $
 * Change Log:
 * 10/1/2009 - Added removal of "hidden" class from ToolTip constructor prior to init - ijones
 ***********************************************************************/
var Spry;
if(!Spry){Spry={}
}if(!Spry.Widget){Spry.Widget={}
}if(!Spry.Widget.Utils){Spry.Widget.Utils={};
}
Spry.Widget.Utils.KEY_UP=38;
Spry.Widget.Utils.KEY_DOWN=40;
Spry.Widget.Utils.KEY_ESC=27;
Spry.Widget.Utils.KEY_LEFT=37;
Spry.Widget.Utils.KEY_RIGHT=39;

Spry.Widget.BrowserSniff=function(){var b=navigator.appName.toString();
var up=navigator.platform.toString();
var ua=navigator.userAgent.toString();
this.mozilla=this.ie=this.opera=this.safari=false;
var re_opera=/Opera.([0-9\.]*)/i;
var re_msie=/MSIE.([0-9\.]*)/i;
var re_gecko=/gecko/i;
var re_safari=/(applewebkit|safari)\/([\d\.]*)/i;
var r=false;
if((r=ua.match(re_opera))){this.opera=true;
this.version=parseFloat(r[1])
}else{if((r=ua.match(re_msie))){this.ie=true;
this.version=parseFloat(r[1])
}else{if((r=ua.match(re_safari))){this.safari=true;
this.version=parseFloat(r[2])
}else{if(ua.match(re_gecko)){var re_gecko_version=/rv:\s*([0-9\.]+)/i;
r=ua.match(re_gecko_version);
this.mozilla=true;
this.version=parseFloat(r[1])
}}}}this.windows=this.mac=this.linux=false;
this.Platform=ua.match(/windows/i)?"windows":(ua.match(/linux/i)?"linux":(ua.match(/mac/i)?"mac":ua.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.Widget.BrowserSniff();

/********************************************************************/
// SpryAccordion.js - version 0.15 - Spry Pre-Release 1.6.1
//
// Copyright (c) 2006. Adobe Systems Incorporated.
// All rights reserved.
/*******************************************************************/
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;
	// added by imj @ AAA
	this.onClickListener = true;
	this.isComplete = false;
	this.panelIsDisabled = false;
	this.onLoadRefresh = false;
	// These styles used to swap between select box in accordion tab, and blank/name in accordion tab
	this.activeClass = 'AccordionTabActive';
	this.selectedContentClass = 'AccordionTabSelect';
	this.blankContentClass = 'AccordionTabBlank';
	this.hiddenClass = 'hidden';

	// This is expected to be filled in by the caller that uses it.
	this.currentProfileNameValue = new Array();

	this.previousPanelKeyCode = Spry.Widget.Accordion.KEY_UP;
	this.nextPanelKeyCode = Spry.Widget.Accordion.KEY_DOWN;

	this.useFixedPanelHeights = true;
	this.fixedPanelHeight = 0;

	Spry.Widget.Utils.setOptions(this, opts, true);

	this.attachBehaviors();
};
// state = true or false
Spry.Widget.Accordion.prototype.setOnClickListener = function(state)
{
	if( typeof(state) =='boolean' ) {
		this.onClickListener = state;
	}
};
Spry.Widget.Accordion.prototype.getElement = function(ele) { 
	return Spry.Widget.Utils.getElement(ele);
}
Spry.Widget.Accordion.prototype.hasClassName = function(ele, className) {
	return Spry.Widget.Utils.hasClassName(ele, className); 
}
Spry.Widget.Accordion.prototype.addClassName = function(ele, className) {
	return Spry.Widget.Utils.addClassName(ele, className); 
}
Spry.Widget.Accordion.prototype.removeClassName = function(ele, className) {
	return Spry.Widget.Utils.removeClassName(ele, className); 
}
Spry.Widget.Accordion.prototype.onPanelTabMouseOver = function(e, panel)
{
	if(this.panelIsDisabled == true) return;

	if (panel)
		this.addClassName(this.getPanelTab(panel), this.hoverClass);
	return false;
};

Spry.Widget.Accordion.prototype.onPanelTabMouseOut = function(e, panel)
{
	if(this.panelIsDisabled == true) return;

	if (panel)
		this.removeClassName(this.getPanelTab(panel), this.hoverClass);
	return false;
};
Spry.Widget.Accordion.prototype.disablePanel = function(elementOrIndex)
{
	if (typeof elementOrIndex == "number")
		panel = this.getPanels()[elementOrIndex];
	else
		panel = this.getElement(elementOrIndex);

	if (!this.hasClassName( panel, 'disabled' )) {
		this.addClassName( panel, 'disabled');
	}
	this.panelIsDisabled = true;
}
Spry.Widget.Accordion.prototype.enablePanel = function(elementOrIndex)
{
	if (typeof elementOrIndex == "number")
		panel = this.getPanels()[elementOrIndex];
	else
		panel = this.getElement(elementOrIndex);

	if ( this.hasClassName( panel, 'disabled' )) {
		this.removeClassName( panel, 'disabled');
	}
	this.panelIsDisabled = false;
}
Spry.Widget.Accordion.prototype.openPanel = function(elementOrIndex)
{
	if(this.panelIsDisabled == true) return;

	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()
{
	if(this.panelIsDisabled == true) return;

	// 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()
{
	if(this.panelIsDisabled == true) return;
	return this.openPanel(this.getCurrentPanelIndex() + 1);
};

Spry.Widget.Accordion.prototype.openPreviousPanel = function()
{
	if(this.panelIsDisabled == true) return;
	return this.openPanel(this.getCurrentPanelIndex() - 1);
};

Spry.Widget.Accordion.prototype.openFirstPanel = function()
{
	if(this.panelIsDisabled == true) return;
	return this.openPanel(0);
};

Spry.Widget.Accordion.prototype.openLastPanel = function()
{
	if(this.panelIsDisabled == true) return;
	var panels = this.getPanels();
	return this.openPanel(panels[panels.length - 1]);
};
Spry.Widget.Accordion.prototype.getLastPanelIndex = function()
{
	var panels = this.getPanels();
	return panels.length - 1;
}
Spry.Widget.Accordion.prototype.onPanelTabClick = function(e, panel)
{
	if(this.panelIsDisabled == true) return;

	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)
{
	if(this.panelIsDisabled == true) return;

	this.hasFocus = true;
	this.addClassName(this.element, this.focusedClass);
	return false;
};

Spry.Widget.Accordion.prototype.onBlur = function(e)
{
	if(this.panelIsDisabled == true) return;

	this.hasFocus = false;
	this.removeClassName(this.element, this.focusedClass);
	return false;
};

Spry.Widget.Accordion.KEY_UP = Spry.Widget.Utils.KEY_UP;
Spry.Widget.Accordion.KEY_DOWN = Spry.Widget.Utils.KEY_DOWN;

Spry.Widget.Accordion.prototype.onKeyDown = function(e)
{
	if(this.panelIsDisabled == true) return;

	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;
		// Added by Ilene Jones to remove the listening of the onClick by default for the tab & check out pages.
		if(this.onClickListener) 
		{
			Spry.Widget.Utils.addEventListener(tab, "click", function(e) { return self.onPanelTabClick(e, panel); }, false);
		}		
		Spry.Widget.Utils.addEventListener(tab, "mouseover", function(e) { return self.onPanelTabMouseOver(e, panel); }, false);
		Spry.Widget.Utils.addEventListener(tab, "mouseout", function(e) { return self.onPanelTabMouseOut(e, panel); }, false);
	}
};

// Added by IMJ - May 2009 - Profiles Accordion Init
Spry.Widget.Accordion.prototype.initPanelTab = function(panel, isDefault)
{
	var tab = this.getPanelTab(panel);
	this.switchCurrentTabContent(tab, isDefault);
}

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);
		this.initPanelTab(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.Utils.addEventListener(this.element, "focus", function(e) { return self.onFocus(e); }, false);
		Spry.Widget.Utils.addEventListener(this.element, "blur", function(e) { return self.onBlur(e); }, false);
		Spry.Widget.Utils.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.Utils.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);
};
/***************************************************************
 * AAA CUSTOM FUNCTIONS
 * Copyright 2008 AAA National
 *
 * TRAVELER PROFILE STEP COMPLETE STARTS HERE
 *
 * Step complete checks the [panelId]+'Complete' form field to
 * see if the panel is in a complete state.  
 * STEP COMPLETE: Removes the hidden class from the span on the
 *				panel tab if it exists (shows the hidden checkmark).
 *				Sets the check box to true
 *				Sets isComplete to true
 ***************************************************************/
Spry.Widget.Accordion.prototype.stepComplete = function() { 
	if ("console" in window) console.log('stepComplete()');
	// Class used to hide/unhide progress marker.

	var panel = this.getCurrentPanel();
	var tab = this.getPanelTab(panel);
	if (!tab)
		return;

	var hiddenClass = this.hiddenClass;

	if ("console" in window) console.log('found the tab');
	var tabSpanEle = null;

	this.preorderTraversal(tab, function(node) {
		if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
		{
			if (!tabSpanEle && node.nodeName.toLowerCase() == "span")
				tabSpanEle = node;
			if (this.hasClassName(tabSpanEle, hiddenClass))
			{
				if ("console" in window) console.log('removed: '+hiddenClass);
				this.removeClassName(tabSpanEle, hiddenClass);
			}
		}
	});
	
	this.openNextPanel();
	this.switchCurrentTabContent(tab);
}

/***************************************************************
 * TRAVELER PROFILE STEP INCOMPLETE STARTS HERE
 *
 * Step complete checks the [panelId]+'Complete' form field to
 * see if the panel is in a complete state.  
 * STEP INCOMPLETE: Adds the hidden class to the span on the
 *				panel tab if it exists - hides the completed checkmark.
 *				Sets the check box to false
 *				Sets isComplete to false
 ***************************************************************/
Spry.Widget.Accordion.prototype.stepIncomplete = function(nextPanel) { 
	if ("console" in window) console.log('stepIncomplete( '+nextPanel+' ) ');
	// Class used to hide/unhide progress marker.
	classToAdd = this.hiddenClass;

	this.openPanel(nextPanel);

	var panel = this.getCurrentPanel();
	var tab = this.getPanelTab(panel);
	if (!tab)
		return;

	var tabSpanEle = null;

	this.preorderTraversal(tab, function(node) {
		if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
		{
			if (!tabSpanEle && node.nodeName.toLowerCase() == "span")
				tabSpanEle = node;
			if (!this.hasClassName(tabSpanEle, classToAdd))
			{
				this.addClassName(tabSpanEle, classToAdd);
			}
		}
	});
	this.switchCurrentTabContent(tab);
}

Spry.Widget.Accordion.prototype.setCurrentPanelTab = function(tab)
{
	if ("console" in window) console.log('setCurrentPanelTab( obj:'+tab+' ) ');
	var activeTabSpanEle = null;
	var inactiveTabSpanEle = null;
	var outputPanel = null;

//	if ("console" in window) console.log('activePanelInt: '+activePanelInt);
	
	var selectedContentClass = this.selectedContentClass;
	var hiddenClass = this.hiddenClass;
	var blankContentClass = this.blankContentClass;

	// Current Panel:
	this.preorderTraversal(tab, function(node) {
		if (node.nodeType == 1 /* NODE.ELEMENT_NODE */) {
			// make sure the active is actually active.
			if ((!activeTabSpanEle || !inactiveTabSpanEle) && node.nodeName.toLowerCase() == "span" ) {
				if (Spry.Utils.hasClassName(node, selectedContentClass)) { 
					activeTabSpanEle = node;
					Spry.Utils.removeClassName(node, hiddenClass);
				}
				if(Spry.Utils.hasClassName(node, blankContentClass)) { 
					inactiveTabSpanEle = node;
					Spry.Utils.addClassName(node, hiddenClass);
				}
			}
		}
	});
}

Spry.Widget.Accordion.prototype.setInactivePanelTab = function(tab,complete)
{
	if ("console" in window) console.log('setCurrentPanelTab( obj:'+tab+', complete: '+complete+' ) ');
	// Reset these vars with each new panel.
	var activeTabSpanEle = null;
	var inactiveTabSpanEle = null;
	var outputPanel = null;

	var selectedContentClass = this.selectedContentClass;
	var hiddenClass = this.hiddenClass;
	var blankContentClass = this.blankContentClass;

	this.preorderTraversal(tab, function(node) {
		if (node.nodeType == 1 /* NODE.ELEMENT_NODE */) {
			// make sure the active is actually active.
			if ((!activeTabSpanEle || !inactiveTabSpanEle) && node.nodeName.toLowerCase() == "span" ) {
				if (Spry.Utils.hasClassName(node, selectedContentClass)) { 
					if ("console" in window) console.log('!active !inactive && hasClassName: '+
														   selectedContentClass);
					activeTabSpanEle = node;
					if(!Spry.Utils.hasClassName(node, hiddenClass)) {
						if ("console" in window) console.log('!hasClassName && addClassName: '+
															   hiddenClass);
						Spry.Utils.addClassName(node, hiddenClass);
					}
				}
				if(Spry.Utils.hasClassName(node, blankContentClass)) { 
					inactiveTabSpanEle = node;
					if(complete) { 
						if ("console" in window) console.log('complete && removeClassName: '+hiddenClass);
						Spry.Utils.removeClassName(node, hiddenClass);
					} else if(!Spry.Utils.hasClassName(node,hiddenClass)) {
						if ("console" in window) console.log('complete && removeClassName: '+hiddenClass);
						Spry.Utils.addClassName(node, hiddenClass);
					}
				}
			}
		}
	});
}

Spry.Widget.Accordion.prototype.switchCurrentTabContent = function(tab) 
{
	if ("console" in window) console.log('switchCurrentTabContent()');

	var activePanelInt = this.getCurrentPanelIndex();
	var panels = this.getPanels();
	var lastPanel = this.getLastPanelIndex();

	for (panelInt = 0; panelInt <= lastPanel; panelInt++) {
		tab = this.getPanelTab(panels[panelInt]);

		// set current special
		if(panelInt == activePanelInt) { 
			this.setCurrentPanelTab(this.getPanelTab(panels[panelInt]));
			continue;
		}
		// Panels that are done.
		else if(panelInt < activePanelInt) { 
			this.setInactivePanelTab(this.getPanelTab(panels[panelInt]), true);
			continue;
		}
		// Reset these vars with each new panel.
		else {  
			this.setInactivePanelTab(this.getPanelTab(panels[panelInt]),false);
			continue;
		}
	}
}
Spry.Widget.Accordion.prototype.preorderTraversal=function(root,func){
	return Spry.Widget.Utils.preorderTraversal(root,func);
}
Spry.Widget.Utils.preorderTraversal = function(root,func) {
var stopTraversal=false;
if(root){stopTraversal=func(root);
if(root.hasChildNodes()){var child=root.firstChild;
while(!stopTraversal&&child){stopTraversal=this.preorderTraversal(child,func);
try{child=child.nextSibling
}catch(e){child=null
}}}}return stopTraversal
}
Spry.Widget.AutoSuggest=function(region,sRegion,dataset,field,options){if(!this.isBrowserSupported()){return 
}options=options||{};
this.init(region,sRegion,dataset,field);
Spry.Widget.Utils.setOptions(this,options);
if(Spry.Widget.AutoSuggest.onloadDidFire){this.attachBehaviors()
}else{Spry.Widget.AutoSuggest.loadQueue.push(this)
}this.dataset.addObserver(this);
var regionID=Spry.Widget.Utils.getElementID(sRegion);
if(!this.maskElement) {this.maskElement=document.getElementById(this.mainContent);
}else if(typeof(this.maskElement) == 'string') {this.maskElement=document.getElementById(this.mainContent);
}
var self=this;
this._notifyDataset={onPostUpdate:function(){self.attachClickBehaviors()
},onPreUpdate:function(){self.removeClickBehaviours()
}};
Spry.Data.Region.addObserver(regionID,this._notifyDataset);
Spry.Widget.Utils.addEventListener(window,"unload",function(){self.destroy()
},false);
this.attachClickBehaviors();
this.handleKeyUp(null);
this.showSuggestions(false)
};
Spry.Widget.AutoSuggest.prototype.init=function(region,sRegion,dataset,field){this.region=Spry.Widget.Utils.getElement(region);
if(!this.region){return 
}
this.mainContent="mainContent";
this.maskedClass="masked";
this.minCharsType=false;
this.containsString=false;
this.loadFromServer=false;
this.urlParam="";
this.suggestionIsVisible=false;
this.stopFocus=false;
this.hasFocus=false;
this.submitForm=false;
this.showSuggestClass="showSuggestClass";
this.hideSuggestClass="hideSuggestClass";
this.hoverSuggestClass="hoverSuggestClass";
this.movePrevKeyCode=Spry.Widget.AutoSuggest.KEY_UP;
this.moveNextKeyCode=Spry.Widget.AutoSuggest.KEY_DOWN;
this.textElement=Spry.Widget.Utils.getFirstChildWithNodeNameAtAnyLevel(this.region,"INPUT");
this.textElement.setAttribute("AutoComplete","off");
this.suggestRegion=Spry.Widget.Utils.getElement(sRegion);
Spry.Widget.Utils.makePositioned(this.suggestRegion);
Spry.Widget.Utils.addClassName(this.suggestRegion,this.hideSuggestClass);
this.timerID=null;
if(typeof dataset=="string"){this.dataset=window[dataset]
}else{this.dataset=dataset
}this.field=field;
if(typeof field=="string"&&field.indexOf(",")!=-1){field=field.replace(/\s*,\s*/ig,",");
this.field=field.split(",")
}};
Spry.Widget.AutoSuggest.prototype.isBrowserSupported=function(){return Spry.is.ie&&Spry.is.v>=5&&Spry.is.windows||Spry.is.mozilla&&Spry.is.v>=1.4||Spry.is.safari||Spry.is.opera&&Spry.is.v>=9
};
Spry.Widget.AutoSuggest.prototype.getValue=function(){if(!this.textElement){return""
}return this.textElement.value
};
Spry.Widget.AutoSuggest.prototype.setValue=function(str){if(!this.textElement){return 
}this.textElement.value=str;
this.showSuggestions(false)
};
Spry.Widget.AutoSuggest.prototype.focus=function(){if(!this.textElement){return 
}this.textElement.focus()
};
Spry.Widget.AutoSuggest.prototype.showSuggestions=function(doShow){if(this.region&&this.isVisibleSuggestion()!=doShow){if(doShow&&this.hasFocus){Spry.Widget.Utils.addClassName(this.region,this.showSuggestClass);
if(Spry.is.ie&&Spry.is.version<7){this.createIframeLayer(this.suggestRegion)
}}else{if(Spry.is.ie&&Spry.is.version<7){this.removeIframeLayer()
}Spry.Widget.Utils.removeClassName(this.region,this.showSuggestClass)
}}this.suggestionIsVisible=Spry.Widget.Utils.hasClassName(this.region,this.showSuggestClass)
};
Spry.Widget.AutoSuggest.prototype.isVisibleSuggestion=function(){return this.suggestionIsVisible
};
Spry.Widget.AutoSuggest.prototype.onDataChanged=function(el){var data=el.getData(true);
var val=this.getValue();
this.showSuggestions(data&&(!this.minCharsType||val.length>=this.minCharsType)&&(data.length>1||(data.length==1&&this.childs[0]&&this.childs[0].attributes.getNamedItem("spry:suggest").value!=this.getValue())))
};
Spry.Widget.AutoSuggest.prototype.nodeMouseOver=function(e,node){var l=this.childs.length;
for(var i=0;
i<l;
i++){if(this.childs[i]!=node&&Spry.Widget.Utils.hasClassName(this.childs[i],this.hoverSuggestClass)){Spry.Widget.Utils.removeClassName(this.childs[i],this.hoverSuggestClass);
break
}}};
Spry.Widget.AutoSuggest.prototype.nodeClick=function(e,value){if(value){this.setValue(value)
}};
Spry.Widget.AutoSuggest.prototype.handleKeyUp=function(e) {
   
   if(e&&this.isSpecialKey(e)){
      this.handleSpecialKeys(e);
      return;
   }
   this.keyNeedsProcessing=true ;

   var self=this;
   var func=function() {
      self.refreshSuggestions();
   }
   setTimeout( func, 1 );
};
Spry.Widget.AutoSuggest.prototype.refreshSuggestions=function() {
   if ( this.timerID != null || !this.keyNeedsProcessing ) {
       return ;
   }
   this.keyNeedsProcessing=false ;
   
   if ( this.loadFromServer ) {
       this.loadDataSet()
   }
   else{
       this.filterDataSet()
   }
   
   var self=this;
   var func=function(){
         self.timerID=null;
         self.refreshSuggestions();
     };
   this.timerID=setTimeout(func,200)
}


Spry.Widget.AutoSuggest.prototype.scrollVisible=function(el){if(typeof this.scrolParent=="undefined"){var currEl=el;
this.scrolParent=false;
while(!this.scrolParent){var overflow=Spry.Widget.Utils.getStyleProp(currEl,"overflow");
if(!overflow||overflow.toLowerCase()=="scroll"){this.scrolParent=currEl;
break
}if(currEl==this.region){break
}currEl=currEl.parentNode
}}if(this.scrolParent!=false){var h=parseInt(Spry.Widget.Utils.getStyleProp(this.scrolParent,"height"),10);
if(el.offsetTop<this.scrolParent.scrollTop){this.scrolParent.scrollTop=el.offsetTop
}else{if(el.offsetTop+el.offsetHeight>this.scrolParent.scrollTop+h){this.scrolParent.scrollTop=el.offsetTop+el.offsetHeight-h+5;
if(this.scrolParent.scrollTop<0){this.scrolParent.scrollTop=0
}}}}};
Spry.Widget.AutoSuggest.KEY_UP=38;
Spry.Widget.AutoSuggest.KEY_DOWN=40;
Spry.Widget.AutoSuggest.prototype.handleSpecialKeys=function(e){switch(e.keyCode){case this.moveNextKeyCode:case this.movePrevKeyCode:if(!(this.childs.length>0)||!this.getValue()){return 
}var prev=this.childs.length-1;
var next=false;
var found=false;
var data=this.dataset.getData();
if(this.childs.length>1||(data&&data.length==1&&this.childs[0]&&this.childs[0].attributes.getNamedItem("spry:suggest").value!=this.getValue())){this.showSuggestions(true)
}else{return 
}var utils=Spry.Widget.Utils;
for(var k=0;
k<this.childs.length;
k++){if(next){utils.addClassName(this.childs[k],this.hoverSuggestClass);
this.scrollVisible(this.childs[k]);
break
}if(utils.hasClassName(this.childs[k],this.hoverSuggestClass)){utils.removeClassName(this.childs[k],this.hoverSuggestClass);
found=true;
if(e.keyCode==this.moveNextKeyCode){next=true;
continue
}else{utils.addClassName(this.childs[prev],this.hoverSuggestClass);
this.scrollVisible(this.childs[prev]);
break
}}prev=k
}if(!found||(next&&k==this.childs.length)){utils.addClassName(this.childs[0],this.hoverSuggestClass);
this.scrollVisible(this.childs[0])
}utils.stopEvent(e);
break;
case 27:this.showSuggestions(false);
break;
case 13:if(!this.isVisibleSuggestion()){return 
}for(var k=0;
k<this.childs.length;
k++){if(Spry.Widget.Utils.hasClassName(this.childs[k],this.hoverSuggestClass)){var attr=this.childs[k].attributes.getNamedItem("spry:suggest");
if(attr){this.setValue(attr.value)
}if(!this.submitForm){Spry.Widget.Utils.stopEvent(e);
return false
}}}break;
case 9:this.showSuggestions(false)
}return 
};
Spry.Widget.AutoSuggest.prototype.filterDataSet=function(){var contains=this.containsString;
var columnName=this.field;
var val=this.getValue();
if(this.previousString&&this.previousString==val){return
}this.previousString=val;
if(!val||(this.minCharsType&&this.minCharsType>val.length)){this.dataset.filter(function(ds,row,rowNumber){return null
});
this.showSuggestions(false);
return 
}var regExpStr=Spry.Widget.Utils.escapeRegExp(val);
if(!contains){regExpStr="^"+regExpStr
}var regExp=new RegExp(regExpStr,"ig");
if(this.maxListItems>0){this.dataset.maxItems=this.maxListItems
}var filterFunc=function(ds,row,rowNumber){if(ds.maxItems>0&&ds.maxItems<=ds.data.length){return null
}if(typeof columnName=="object"){var l=columnName.length;
for(var i=0;
i<l;
i++){var str=row[columnName[i]];
if(str&&str.search(regExp)!=-1){return row
}}}else{var str=row[columnName];
if(str&&str.search(regExp)!=-1){return row
}}return null
};
this.dataset.filter(filterFunc);
var data=this.dataset.getData();
this.showSuggestions(data&&(!this.minCharsType||val.length>=this.minCharsType)&&(data.length>1||(data.length==1&&this.childs[0]&&this.childs[0].attributes.getNamedItem("spry:suggest").value!=val)))
};
Spry.Widget.AutoSuggest.prototype.loadDataSet=function(){var val=this.getValue();
var ds=this.dataset;
ds.cancelLoadData();
ds.useCache=false;
if(!val||(this.minCharsType&&this.minCharsType>val.length)){this.showSuggestions(false);
this.previousString=null ;
return 
}if(this.previousString&&this.previousString==val){var data=ds.getData();
this.showSuggestions(data&&(data.length>1||(data.length==1&&this.childs[0].attributes.getNamedItem("spry:suggest").value!=val)));
return 
}this.previousString=val;
var url=Spry.Widget.Utils.addReplaceParam(ds.url,this.urlParam,val);
ds.setURL(url);
ds.loadData()
};
Spry.Widget.AutoSuggest.prototype.addMouseListener=function(node,value){var self=this;
var addListener=Spry.Widget.Utils.addEventListener;
addListener(node,"click",function(e){return self.nodeClick(e,value);
self.handleKeyUp(null)
},false);
addListener(node,"mouseover",function(e){Spry.Widget.Utils.addClassName(node,self.hoverSuggestClass);
self.nodeMouseOver(e,node)
},false);
addListener(node,"mouseout",function(e){Spry.Widget.Utils.removeClassName(node,self.hoverSuggestClass);
self.nodeMouseOver(e,node)
},false)
};
Spry.Widget.AutoSuggest.prototype.removeMouseListener=function(node,value){var self=this;
var removeListener=Spry.Widget.Utils.removeEventListener;
removeListener(node,"click",function(e){self.nodeClick(e,value);
self.handleKeyUp(null)
},false);
removeListener(node,"mouseover",function(e){Spry.Widget.Utils.addClassName(node,self.hoverSuggestClass);
self.nodeMouseOver(e,node)
},false);
removeListener(node,"mouseout",function(e){Spry.Widget.Utils.removeClassName(node,self.hoverSuggestClass);
self.nodeMouseOver(e,node)
},false)
};
Spry.Widget.AutoSuggest.prototype.attachClickBehaviors=function(){var self=this;
var valNodes=Spry.Utils.getNodesByFunc(this.region,function(node){if(node.nodeType==1){var attr=node.attributes.getNamedItem("spry:suggest");
if(attr){self.addMouseListener(node,attr.value);
return true
}}return false
});
this.childs=valNodes
};
Spry.Widget.AutoSuggest.prototype.removeClickBehaviours=function(){var self=this;
var valNodes=Spry.Utils.getNodesByFunc(this.region,function(node){if(node.nodeType==1){var attr=node.attributes.getNamedItem("spry:suggest");
if(attr){self.removeMouseListener(node,attr.value);
return true
}}return false
})
};
Spry.Widget.AutoSuggest.prototype.destroy=function(){this.removeClickBehaviours();
Spry.Data.Region.removeObserver(Spry.Widget.Utils.getElementID(this.suggestRegion),this._notifyDataset);
if(this.event_handlers){for(var i=0;
i<this.event_handlers.length;
i++){Spry.Widget.Utils.removeEventListener(this.event_handlers[i][0],this.event_handlers[i][1],this.event_handlers[i][2],false)
}}for(var k in this){if(typeof this[k]!="function"){try{delete this[k]
}catch(err){}}}};
Spry.Widget.AutoSuggest.onloadDidFire=false;
Spry.Widget.AutoSuggest.loadQueue=[];
Spry.Widget.AutoSuggest.processLoadQueue=function(handler){Spry.Widget.AutoSuggest.onloadDidFire=true;
var q=Spry.Widget.AutoSuggest.loadQueue;
var qlen=q.length;
for(var i=0;
i<qlen;
i++){q[i].attachBehaviors()
}};
Spry.Widget.AutoSuggest.addLoadListener=function(handler){if(typeof window.addEventListener!="undefined"){window.addEventListener("load",handler,false)
}else{if(typeof document.addEventListener!="undefined"){document.addEventListener("load",handler,false)
}else{if(typeof window.attachEvent!="undefined"){window.attachEvent("onload",handler)
}}}};
Spry.Widget.AutoSuggest.addLoadListener(Spry.Widget.AutoSuggest.processLoadQueue);
Spry.Widget.AutoSuggest.prototype.attachBehaviors=function(){this.event_handlers=[];
var self=this;
var _notifyKeyUp=function(e){self.hasFocus=true;
self.handleKeyUp(e)
};
this.event_handlers.push([this.textElement,"keydown",_notifyKeyUp]);
this.event_handlers.push([this.textElement,"focus",function(e){if(self.stopFocus){}self.hasFocus=true;
self.stopFocus=false
}]);
this.event_handlers.push([this.textElement,"drop",_notifyKeyUp]);
this.event_handlers.push([this.textElement,"dragdrop",_notifyKeyUp]);
var _notifyBlur=false;
if(Spry.is.opera){_notifyBlur=function(e){setTimeout(function(){if(!self.clickInList){self.showSuggestions(false)
}else{self.stopFocus=true;
self.textElement.focus()
}self.clickInList=false;
self.hasFocus=false
},100)
}
}else{_notifyBlur=function(e){if(!self.clickInList){self.showSuggestions(false)
}else{self.stopFocus=true;
self.textElement.focus()
}self.clickInList=false;
self.hasFocus=false
}
}this.event_handlers.push([this.textElement,"blur",_notifyBlur]);
this.event_handlers.push([this.suggestRegion,"mousedown",function(e){self.clickInList=true
}]);
for(var i=0;
i<this.event_handlers.length;
i++){Spry.Widget.Utils.addEventListener(this.event_handlers[i][0],this.event_handlers[i][1],this.event_handlers[i][2],false)
}};
Spry.Widget.AutoSuggest.prototype.createIframeLayer=function(element){if(typeof this.iframeLayer=="undefined"){var layer=document.createElement("iframe");
layer.tabIndex="-1";
layer.src='javascript:"";';
layer.scrolling="no";
layer.frameBorder="0";
layer.className="iframeSuggest";
element.parentNode.appendChild(layer);
this.iframeLayer=layer
}this.iframeLayer.style.left=element.offsetLeft+"px";
this.iframeLayer.style.top=element.offsetTop+"px";
this.iframeLayer.style.width=element.offsetWidth+"px";
this.iframeLayer.style.height=element.offsetHeight+"px";
this.iframeLayer.style.display="block"
if(!Spry.Widget.Utils.hasClassName(this.maskElement,this.maskedClass)){
	Spry.Widget.Utils.addClassName(this.maskElement,this.maskedClass);

}
};
Spry.Widget.AutoSuggest.prototype.removeIframeLayer=function(){if(this.iframeLayer){this.iframeLayer.style.display="none"
}if(Spry.Widget.Utils.hasClassName(this.maskElement,this.maskedClass)){Spry.Widget.Utils.removeClassName(this.maskElement,this.maskedClass);}
};
if(!Spry.Widget.Utils){Spry.Widget.Utils={}
}Spry.Widget.Utils.specialSafariNavKeys=",63232,63233,63234,63235,63272,63273,63275,63276,63277,63289,";
Spry.Widget.Utils.specialCharacters=",9,13,27,38,40,";
Spry.Widget.Utils.specialCharacters+=",33,34,35,36,37,39,45,46,";
Spry.Widget.Utils.specialCharacters+=",16,17,18,19,20,144,145,";
Spry.Widget.Utils.specialCharacters+=",112,113,114,115,116,117,118,119,120,121,122,123,";
Spry.Widget.Utils.specialCharacters+=Spry.Widget.Utils.specialSafariNavKeys;
Spry.Widget.AutoSuggest.prototype.isSpecialKey=function(ev){return Spry.Widget.Utils.specialCharacters.indexOf(","+ev.keyCode+",")!=-1||this.moveNextKeyCode==ev.keyCode||this.movePrevKeyCode==ev.keyCode
};
Spry.Widget.Utils.getElementID=function(el){if(typeof el=="string"&&el){return el
}return el.getAttribute("id")
};
Spry.Widget.Utils.getElement=function(ele){if(ele&&typeof ele=="string"){return document.getElementById(ele)
}return ele
};
Spry.Widget.Utils.addReplaceParam=function(url,param,paramValue){var uri="";
var qstring="";
var i=url.indexOf("?");
if(i!=-1){uri=url.slice(0,i);
qstring=url.slice(i+1)
}else{uri=url
}qstring=qstring.replace("?","");
var arg=qstring.split("&");
if(param.lastIndexOf("/")!=-1){param=param.slice(param.lastIndexOf("/")+1)
}for(i=0;
i<arg.length;
i++){var k=arg[i].split("=");
if((k[0]&&k[0]==decodeURI(param))||arg[i]==decodeURI(param)){arg[i]=null
}}arg[arg.length]=encodeURIComponent(param)+"="+encodeURIComponent(paramValue);
qstring="";
for(i=0;
i<arg.length;
i++){if(arg[i]){qstring+="&"+arg[i]
}}qstring=qstring.slice(1);
url=uri+"?"+qstring;
return url
};
Spry.Widget.Utils.hasClassName=function(ele, className){if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1){return false;}return true;
};
Spry.Widget.Utils.addClassName=function(ele, className){if (!ele || !className || this.hasClassName(ele, className)){return;}ele.className += (ele.className ? " " : "") + className;
};
Spry.Widget.Utils.removeClassName=function(ele, className){if (!ele || !className || !this.hasClassName(ele, className)){return;}ele.className=ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
};
Spry.Widget.Utils.addEventListener=function(el,eventType,handler,capture){try{if(el.addEventListener){el.addEventListener(eventType,handler,capture)
}else{if(el.attachEvent){el.attachEvent("on"+eventType,handler,capture)
}}}catch(e){}};
Spry.Widget.Utils.removeEventListener=function(el,eventType,handler,capture){try{if(el.removeEventListener){el.removeEventListener(eventType,handler,capture)
}else{if(el.detachEvent){el.detachEvent("on"+eventType,handler,capture)
}}}catch(e){}};
Spry.Widget.Utils.stopEvent=function(ev){ev.cancelBubble=true;
ev.returnValue=false;
try{this.stopPropagation(ev)
}catch(e){}try{this.preventDefault(ev)
}catch(e){}};
Spry.Widget.Utils.stopPropagation=function(ev){if(ev.stopPropagation){ev.stopPropagation()
}else{ev.cancelBubble=true
}};
Spry.Widget.Utils.preventDefault=function(ev){if(ev.preventDefault){ev.preventDefault()
}else{ev.returnValue=false
}};
Spry.Widget.Utils.setOptions=function(obj,optionsObj,ignoreUndefinedProps){if(!optionsObj){return 
}for(var optionName in optionsObj){if(typeof ignoreUndefinedProps!="undefined"&&ignoreUndefinedProps&&typeof optionsObj[optionName]=="undefined"){continue
}obj[optionName]=optionsObj[optionName]
}};
Spry.Widget.Utils.firstValid=function(){var ret=null;
for(var i=0;
i<Spry.Widget.Utils.firstValid.arguments.length;
i++){if(typeof Spry.Widget.Utils.firstValid.arguments[i]!="undefined"){ret=Spry.Widget.Utils.firstValid.arguments[i];
break
}}return ret
};
Spry.Widget.Utils.camelize=function(stringToCamelize){var oStringList=stringToCamelize.split("-");
var isFirstEntry=true;
var camelizedString="";
for(var i=0;
i<oStringList.length;
i++){if(oStringList[i].length>0){if(isFirstEntry){camelizedString=oStringList[i];
isFirstEntry=false
}else{var s=oStringList[i];
camelizedString+=s.charAt(0).toUpperCase()+s.substring(1)
}}}return camelizedString
};
Spry.Widget.Utils.getStyleProp=function(element,prop){var value;
var camel=Spry.Widget.Utils.camelize(prop);
try{value=element.style[camel];
if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);
value=css?css.getPropertyValue(prop):null
}else{if(element.currentStyle){value=element.currentStyle[camel]
}}}}catch(e){}return value=="auto"?null:value
};
Spry.Widget.Utils.makePositioned=function(element){var pos=Spry.Widget.Utils.getStyleProp(element,"position");
if(!pos||pos=="static"){element.style.position="relative";
if(window.opera){element.style.top=0;
element.style.left=0
}}};
Spry.Widget.Utils.escapeRegExp=function(rexp){return rexp.replace(/([\.\/\]\[\{\}\(\)\\\$\^\?\*\|\!\=\+\-])/g,"\\$1")
};
Spry.Widget.Utils.getFirstChildWithNodeNameAtAnyLevel=function(node,nodeName){var elements=node.getElementsByTagName(nodeName);
if(elements&&elements.length>0){return elements[0]
}nodeName=nodeName.toLowerCase();
elements=node.getElementsByTagName(nodeName);
if(elements&&elements.length>0){return elements[0]
}return null
};
var Spry;
if(!Spry){Spry={}
}if(!Spry.Utils){Spry.Utils={}
}Spry.Utils.msProgIDs=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0"];
Spry.Utils.createXMLHttpRequest=function(){var req=null;
try{if(window.ActiveXObject){while(!req&&Spry.Utils.msProgIDs.length){try{req=new ActiveXObject(Spry.Utils.msProgIDs[0])
}catch(e){req=null
}if(!req){Spry.Utils.msProgIDs.splice(0,1)
}}}if(!req&&window.XMLHttpRequest){req=new XMLHttpRequest()
}}catch(e){req=null
}if(!req){Spry.Debug.reportError("Failed to create an XMLHttpRequest object!")
}return req
};
Spry.Utils.loadURL=function(method,url,async,callback,opts){var req=new Spry.Utils.loadURL.Request();
req.method=method;
req.url=url;
req.async=async;
req.successCallback=callback;
Spry.Utils.setOptions(req,opts);
try{req.xhRequest=Spry.Utils.createXMLHttpRequest();
if(!req.xhRequest){return null
}if(req.async){req.xhRequest.onreadystatechange=function(){Spry.Utils.loadURL.callback(req)
}
}req.xhRequest.open(req.method,req.url,req.async,req.username,req.password);
if(req.headers){for(var name in req.headers){req.xhRequest.setRequestHeader(name,req.headers[name])
}}req.xhRequest.send(req.postData);
if(!req.async){Spry.Utils.loadURL.callback(req)
}}catch(e){if(req.errorCallback){req.errorCallback(req)
}else{Spry.Debug.reportError("Exception caught while loading "+url+": "+e)
}req=null
}return req
};
Spry.Utils.loadURL.callback=function(req){if(!req||req.xhRequest.readyState!=4){return 
}if(req.successCallback&&(req.xhRequest.status==200||req.xhRequest.status==0)){req.successCallback(req)
}else{if(req.errorCallback){req.errorCallback(req)
}}};
Spry.Utils.loadURL.Request=function(){var props=Spry.Utils.loadURL.Request.props;
var numProps=props.length;
for(var i=0;
i<numProps;
i++){this[props[i]]=null
}this.method="GET";
this.async=true;
this.headers={}
};
Spry.Utils.loadURL.Request.props=["method","url","async","username","password","postData","successCallback","errorCallback","headers","userData","xhRequest"];
Spry.Utils.loadURL.Request.prototype.extractRequestOptions=function(opts,undefineRequestProps){if(!opts){return 
}var props=Spry.Utils.loadURL.Request.props;
var numProps=props.length;
for(var i=0;
i<numProps;
i++){var prop=props[i];
if(opts[prop]!=undefined){this[prop]=opts[prop];
if(undefineRequestProps){opts[prop]=undefined
}}}};
Spry.Utils.loadURL.Request.prototype.clone=function(){var props=Spry.Utils.loadURL.Request.props;
var numProps=props.length;
var req=new Spry.Utils.loadURL.Request;
for(var i=0;
i<numProps;
i++){req[props[i]]=this[props[i]]
}if(this.headers){req.headers={};
Spry.Utils.setOptions(req.headers,this.headers)
}return req
};
Spry.Utils.setInnerHTML=function(ele,str,preventScripts){if(!ele){return 
}ele=Spry.$(ele);
var scriptExpr="<script[^>]*>(.|s|\n|\r)*?<\/script>";
ele.innerHTML=str.replace(new RegExp(scriptExpr,"img"),"");
if(preventScripts){return 
}var matches=str.match(new RegExp(scriptExpr,"img"));
if(matches){var numMatches=matches.length;
for(var i=0;
i<numMatches;
i++){var s=matches[i].replace(/<script[^>]*>[\s\r\n]*(<\!--)?|(-->)?[\s\r\n]*<\/script>/img,"");
Spry.Utils.eval(s)
}}};
Spry.Utils.updateContent=function(ele,url,finishFunc,opts){Spry.Utils.loadURL("GET",url,true,function(req){Spry.Utils.setInnerHTML(ele,req.xhRequest.responseText);
if(finishFunc){finishFunc(ele,url)
}},opts)
};
if(!Spry.$$){Spry.Utils.addEventListener=function(element,eventType,handler,capture){try{element=Spry.$(element);
if(element.addEventListener){element.addEventListener(eventType,handler,capture)
}else{if(element.attachEvent){element.attachEvent("on"+eventType,handler)
}}}catch(e){}};
Spry.Utils.removeEventListener=function(element,eventType,handler,capture){try{element=Spry.$(element);
if(element.removeEventListener){element.removeEventListener(eventType,handler,capture)
}else{if(element.detachEvent){element.detachEvent("on"+eventType,handler)
}}}catch(e){}};
Spry.Utils.addLoadListener=function(handler){if(typeof window.addEventListener!="undefined"){window.addEventListener("load",handler,false)
}else{if(typeof document.addEventListener!="undefined"){document.addEventListener("load",handler,false)
}else{if(typeof window.attachEvent!="undefined"){window.attachEvent("onload",handler)
}}}};
Spry.Utils.hasClassName=function(ele, className){if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1){return false;}return true;
};
Spry.Utils.addClassName=function(ele,className){ele=Spry.$(ele);
if(!ele||!className||(ele.className&&ele.className.search(new RegExp("\\b"+className+"\\b"))!=-1)){return 
}ele.className+=(ele.className?" ":"")+className
};
Spry.Utils.removeClassName=function(ele,className){ele=Spry.$(ele);
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.Utils.getObjectByName=function(name){var result=null;
if(name){var lu=window;
var objPath=name.split(".");
for(var i=0;
lu&&i<objPath.length;
i++){result=lu[objPath[i]];
lu=result
}}return result
};
Spry.$=function(element){if(arguments.length>1){for(var i=0,elements=[],length=arguments.length;
i<length;
i++){elements.push(Spry.$(arguments[i]))
}return elements
}if(typeof element=="string"){element=document.getElementById(element)
}return element
}
}Spry.Utils.eval=function(str){return eval(str)
};
Spry.Utils.escapeQuotesAndLineBreaks=function(str){if(str){str=str.replace(/\\/g,"\\\\");
str=str.replace(/["']/g,"\\$&");
str=str.replace(/\n/g,"\\n");
str=str.replace(/\r/g,"\\r")
}return str
};
Spry.Utils.encodeEntities=function(str){if(str&&str.search(/[&<>"]/)!=-1){str=str.replace(/&/g,"&amp;");
str=str.replace(/</g,"&lt;");
str=str.replace(/>/g,"&gt;");
str=str.replace(/"/g,"&quot;")
}return str
};
Spry.Utils.decodeEntities=function(str){var d=Spry.Utils.decodeEntities.div;
if(!d){d=document.createElement("div");
Spry.Utils.decodeEntities.div=d;
if(!d){return str
}}d.innerHTML=str;
if(d.childNodes.length==1&&d.firstChild.nodeType==3&&d.firstChild.nextSibling==null){str=d.firstChild.data
}else{str=str.replace(/&lt;/gi,"<");
str=str.replace(/&gt;/gi,">");
str=str.replace(/&quot;/gi,'"');
str=str.replace(/&amp;/gi,"&")
}return str
};
Spry.Utils.fixupIETagAttributes=function(inStr){var outStr="";
var tagStart=inStr.match(/^<[^\s>]+\s*/)[0];
var tagEnd=inStr.match(/\s*\/?>$/)[0];
var tagAttrs=inStr.replace(/^<[^\s>]+\s*|\s*\/?>/g,"");
outStr+=tagStart;
if(tagAttrs){var startIndex=0;
var endIndex=0;
while(startIndex<tagAttrs.length){while(tagAttrs.charAt(endIndex)!="="&&endIndex<tagAttrs.length){++endIndex
}if(endIndex>=tagAttrs.length){outStr+=tagAttrs.substring(startIndex,endIndex);
break
}++endIndex;
outStr+=tagAttrs.substring(startIndex,endIndex);
startIndex=endIndex;
if(tagAttrs.charAt(endIndex)=='"'||tagAttrs.charAt(endIndex)=="'"){var savedIndex=endIndex++;
while(endIndex<tagAttrs.length){if(tagAttrs.charAt(endIndex)==tagAttrs.charAt(savedIndex)){endIndex++;
break
}else{if(tagAttrs.charAt(endIndex)=="\\"){endIndex++
}}endIndex++
}outStr+=tagAttrs.substring(startIndex,endIndex);
startIndex=endIndex
}else{outStr+='"';
var sIndex=tagAttrs.slice(endIndex).search(/\s/);
endIndex=(sIndex!=-1)?(endIndex+sIndex):tagAttrs.length;
outStr+=tagAttrs.slice(startIndex,endIndex);
outStr+='"';
startIndex=endIndex
}}}outStr+=tagEnd;
return outStr
};
Spry.Utils.fixUpIEInnerHTML=function(inStr){var outStr="";
var regexp=new RegExp("<\\!--|<\\!\\[CDATA\\[|<\\w+[^<>]*>|-->|\\]\\](>|&gt;)","g");
var searchStartIndex=0;
var skipFixUp=0;
while(inStr.length){var results=regexp.exec(inStr);
if(!results||!results[0]){outStr+=inStr.substr(searchStartIndex,inStr.length-searchStartIndex);
break
}if(results.index!=searchStartIndex){outStr+=inStr.substr(searchStartIndex,results.index-searchStartIndex)
}if(results[0]=="<!--"||results[0]=="<![CDATA["){++skipFixUp;
outStr+=results[0]
}else{if(results[0]=="-->"||results[0]=="]]>"||(skipFixUp&&results[0]=="]]&gt;")){--skipFixUp;
outStr+=results[0]
}else{if(!skipFixUp&&results[0].charAt(0)=="<"){outStr+=Spry.Utils.fixupIETagAttributes(results[0])
}else{outStr+=results[0]
}}}searchStartIndex=regexp.lastIndex
}return outStr
};
Spry.Utils.stringToXMLDoc=function(str){var xmlDoc=null;
try{var xmlDOMObj=new ActiveXObject("Microsoft.XMLDOM");
xmlDOMObj.async=false;
xmlDOMObj.loadXML(str);
xmlDoc=xmlDOMObj
}catch(e){try{var domParser=new DOMParser;
xmlDoc=domParser.parseFromString(str,"text/xml")
}catch(e){Spry.Debug.reportError("Caught exception in Spry.Utils.stringToXMLDoc(): "+e+"\n");
xmlDoc=null
}}return xmlDoc
};
Spry.Utils.serializeObject=function(obj){var str="";
var firstItem=true;
if(obj==null||obj==undefined){return str+obj
}var objType=typeof obj;
if(objType=="number"||objType=="boolean"){str+=obj
}else{if(objType=="string"){str+='"'+Spry.Utils.escapeQuotesAndLineBreaks(obj)+'"'
}else{if(obj.constructor==Array){str+="[";
for(var i=0;
i<obj.length;
i++){if(!firstItem){str+=", "
}str+=Spry.Utils.serializeObject(obj[i]);
firstItem=false
}str+="]"
}else{if(objType=="object"){str+="{";
for(var p in obj){if(!firstItem){str+=", "
}str+='"'+p+'": '+Spry.Utils.serializeObject(obj[p]);
firstItem=false
}str+="}"
}}}}return str
};
Spry.Utils.getNodesByFunc=function(root,func){var nodeStack=new Array;
var resultArr=new Array;
var node=root;
while(node){if(func(node)){resultArr.push(node)
}if(node.hasChildNodes()){nodeStack.push(node);
node=node.firstChild
}else{if(node==root){node=null
}else{try{node=node.nextSibling
}catch(e){node=null
}}}while(!node&&nodeStack.length>0){node=nodeStack.pop();
if(node==root){node=null
}else{try{node=node.nextSibling
}catch(e){node=null
}}}}if(nodeStack&&nodeStack.length>0){Spry.Debug.trace("-- WARNING: Spry.Utils.getNodesByFunc() failed to traverse all nodes!\n")
}return resultArr
};
Spry.Utils.getFirstChildWithNodeName=function(node,nodeName){var child=node.firstChild;
while(child){if(child.nodeName==nodeName){return child
}child=child.nextSibling
}return null
};
Spry.Utils.setOptions=function(obj,optionsObj,ignoreUndefinedProps){if(!optionsObj){return 
}for(var optionName in optionsObj){if(ignoreUndefinedProps&&optionsObj[optionName]==undefined){continue
}obj[optionName]=optionsObj[optionName]
}};
Spry.Utils.SelectionManager={};
Spry.Utils.SelectionManager.selectionGroups=new Object;
Spry.Utils.SelectionManager.SelectionGroup=function(){this.selectedElements=new Array
};
Spry.Utils.SelectionManager.SelectionGroup.prototype.select=function(element,className,multiSelect){var selObj=null;
if(!multiSelect){this.clearSelection()
}else{for(var i=0;
i<this.selectedElements.length;
i++){selObj=this.selectedElements[i].element;
if(selObj.element==element){if(selObj.className!=className){Spry.Utils.removeClassName(element,selObj.className);
Spry.Utils.addClassName(element,className)
}return 
}}}selObj=new Object;
selObj.element=element;
selObj.className=className;
this.selectedElements.push(selObj);
Spry.Utils.addClassName(element,className)
};
Spry.Utils.SelectionManager.SelectionGroup.prototype.unSelect=function(element){for(var i=0;
i<this.selectedElements.length;
i++){var selObj=this.selectedElements[i].element;
if(selObj.element==element){Spry.Utils.removeClassName(selObj.element,selObj.className);
return 
}}};
Spry.Utils.SelectionManager.SelectionGroup.prototype.clearSelection=function(){var selObj=null;
do{selObj=this.selectedElements.shift();
if(selObj){Spry.Utils.removeClassName(selObj.element,selObj.className)
}}while(selObj)
};
Spry.Utils.SelectionManager.getSelectionGroup=function(selectionGroupName){if(!selectionGroupName){return null
}var groupObj=Spry.Utils.SelectionManager.selectionGroups[selectionGroupName];
if(!groupObj){groupObj=new Spry.Utils.SelectionManager.SelectionGroup();
Spry.Utils.SelectionManager.selectionGroups[selectionGroupName]=groupObj
}return groupObj
};
Spry.Utils.SelectionManager.select=function(selectionGroupName,element,className,multiSelect){var groupObj=Spry.Utils.SelectionManager.getSelectionGroup(selectionGroupName);
if(!groupObj){return 
}groupObj.select(element,className,multiSelect)
};
Spry.Utils.SelectionManager.unSelect=function(selectionGroupName,element){var groupObj=Spry.Utils.SelectionManager.getSelectionGroup(selectionGroupName);
if(!groupObj){return 
}groupObj.unSelect(element,className)
};
Spry.Utils.SelectionManager.clearSelection=function(selectionGroupName){var groupObj=Spry.Utils.SelectionManager.getSelectionGroup(selectionGroupName);
if(!groupObj){return 
}groupObj.clearSelection()
};
Spry.Utils.Notifier=function(){this.observers=[];
this.suppressNotifications=0
};
Spry.Utils.Notifier.prototype.addObserver=function(observer){if(!observer){return 
}var len=this.observers.length;
for(var i=0;
i<len;
i++){if(this.observers[i]==observer){return 
}}this.observers[len]=observer
};
Spry.Utils.Notifier.prototype.removeObserver=function(observer){if(!observer){return 
}for(var i=0;
i<this.observers.length;
i++){if(this.observers[i]==observer){this.observers.splice(i,1);
break
}}};
Spry.Utils.Notifier.prototype.notifyObservers=function(methodName,data){if(!methodName){return 
}if(!this.suppressNotifications){var len=this.observers.length;
for(var i=0;
i<len;
i++){var obs=this.observers[i];
if(obs){if(typeof obs=="function"){obs(methodName,this,data)
}else{if(obs[methodName]){obs[methodName](this,data)
}}}}}};
Spry.Utils.Notifier.prototype.enableNotifications=function(){if(--this.suppressNotifications<0){this.suppressNotifications=0;
Spry.Debug.reportError("Unbalanced enableNotifications() call!\n")
}};
Spry.Utils.Notifier.prototype.disableNotifications=function(){++this.suppressNotifications
};
Spry.Debug={};
Spry.Debug.enableTrace=true;
Spry.Debug.debugWindow=null;
Spry.Debug.onloadDidFire=false;
Spry.Utils.addLoadListener(function(){Spry.Debug.onloadDidFire=true;
Spry.Debug.flushQueuedMessages()
});
Spry.Debug.flushQueuedMessages=function(){if(Spry.Debug.flushQueuedMessages.msgs){var msgs=Spry.Debug.flushQueuedMessages.msgs;
for(var i=0;
i<msgs.length;
i++){Spry.Debug.debugOut(msgs[i].msg,msgs[i].color)
}Spry.Debug.flushQueuedMessages.msgs=null
}};
Spry.Debug.createDebugWindow=function(){if(!Spry.Debug.enableTrace||Spry.Debug.debugWindow||!Spry.Debug.onloadDidFire){return 
}try{Spry.Debug.debugWindow=document.createElement("div");
var div=Spry.Debug.debugWindow;
div.style.fontSize="12px";
div.style.fontFamily="console";
div.style.position="absolute";
div.style.width="400px";
div.style.height="300px";
div.style.overflow="auto";
div.style.border="solid 1px black";
div.style.backgroundColor="white";
div.style.color="black";
div.style.bottom="0px";
div.style.right="0px";
div.setAttribute("id","SpryDebugWindow");
document.body.appendChild(Spry.Debug.debugWindow)
}catch(e){}};
Spry.Debug.debugOut=function(str,bgColor){if(!Spry.Debug.debugWindow){Spry.Debug.createDebugWindow();
if(!Spry.Debug.debugWindow){if(!Spry.Debug.flushQueuedMessages.msgs){Spry.Debug.flushQueuedMessages.msgs=new Array
}Spry.Debug.flushQueuedMessages.msgs.push({msg:str,color:bgColor});
return 
}}var d=document.createElement("div");
if(bgColor){d.style.backgroundColor=bgColor
}d.innerHTML=str;
Spry.Debug.debugWindow.appendChild(d)
};
Spry.Debug.trace=function(str){Spry.Debug.debugOut(str)
};
Spry.Debug.reportError=function(str){Spry.Debug.debugOut(str,"red")
};
Spry.Data={};
Spry.Data.regionsArray={};
Spry.Data.initRegionsOnLoad=true;
Spry.Data.initRegions=function(rootNode){rootNode=rootNode?Spry.$(rootNode):document.body;
var lastRegionFound=null;
var regions=Spry.Utils.getNodesByFunc(rootNode,function(node){try{if(node.nodeType!=1){return false
}var attrName="spry:region";
var attr=node.attributes.getNamedItem(attrName);
if(!attr){attrName="spry:detailregion";
attr=node.attributes.getNamedItem(attrName)
}if(attr){if(lastRegionFound){var parent=node.parentNode;
while(parent){if(parent==lastRegionFound){Spry.Debug.reportError("Found a nested "+attrName+" in the following markup. Nested regions are currently not supported.<br/><pre>"+Spry.Utils.encodeEntities(parent.innerHTML)+"</pre>");
return false
}parent=parent.parentNode
}}if(attr.value){attr=node.attributes.getNamedItem("id");
if(!attr||!attr.value){node.setAttribute("id","spryregion"+(++Spry.Data.initRegions.nextUniqueRegionID))
}lastRegionFound=node;
return true
}else{Spry.Debug.reportError(attrName+" attributes require one or more data set names as values!")
}}}catch(e){}return false
});
var name,dataSets,i;
var newRegions=[];
for(i=0;
i<regions.length;
i++){var rgn=regions[i];
var isDetailRegion=false;
name=rgn.attributes.getNamedItem("id").value;
attr=rgn.attributes.getNamedItem("spry:region");
if(!attr){attr=rgn.attributes.getNamedItem("spry:detailregion");
isDetailRegion=true
}if(!attr.value){Spry.Debug.reportError("spry:region and spry:detailregion attributes require one or more data set names as values!");
continue
}rgn.attributes.removeNamedItem(attr.nodeName);
Spry.Utils.removeClassName(rgn,Spry.Data.Region.hiddenRegionClassName);
dataSets=Spry.Data.Region.strToDataSetsArray(attr.value);
if(!dataSets.length){Spry.Debug.reportError("spry:region or spry:detailregion attribute has no data set!");
continue
}var hasBehaviorAttributes=false;
var hasSpryContent=false;
var dataStr="";
var parent=null;
var regionStates={};
var regionStateMap={};
attr=rgn.attributes.getNamedItem("spry:readystate");
if(attr&&attr.value){regionStateMap.ready=attr.value
}attr=rgn.attributes.getNamedItem("spry:errorstate");
if(attr&&attr.value){regionStateMap.error=attr.value
}attr=rgn.attributes.getNamedItem("spry:loadingstate");
if(attr&&attr.value){regionStateMap.loading=attr.value
}attr=rgn.attributes.getNamedItem("spry:expiredstate");
if(attr&&attr.value){regionStateMap.expired=attr.value
}var piRegions=Spry.Utils.getNodesByFunc(rgn,function(node){try{if(node.nodeType==1){var attributes=node.attributes;
var numPI=Spry.Data.Region.PI.orderedInstructions.length;
var lastStartComment=null;
var lastEndComment=null;
for(var i=0;
i<numPI;
i++){var piName=Spry.Data.Region.PI.orderedInstructions[i];
var attr=attributes.getNamedItem(piName);
if(!attr){continue
}var piDesc=Spry.Data.Region.PI.instructions[piName];
var childrenOnly=(node==rgn)?true:piDesc.childrenOnly;
var openTag=piDesc.getOpenTag(node,piName);
var closeTag=piDesc.getCloseTag(node,piName);
if(childrenOnly){var oComment=document.createComment(openTag);
var cComment=document.createComment(closeTag);
if(!lastStartComment){node.insertBefore(oComment,node.firstChild)
}else{node.insertBefore(oComment,lastStartComment.nextSibling)
}lastStartComment=oComment;
if(!lastEndComment){node.appendChild(cComment)
}else{node.insertBefore(cComment,lastEndComment)
}lastEndComment=cComment
}else{var parent=node.parentNode;
parent.insertBefore(document.createComment(openTag),node);
parent.insertBefore(document.createComment(closeTag),node.nextSibling)
}if(piName=="spry:state"){regionStates[attr.value]=true
}node.removeAttribute(piName)
}if(Spry.Data.Region.enableBehaviorAttributes){var bAttrs=Spry.Data.Region.behaviorAttrs;
for(var behaviorAttrName in bAttrs){var bAttr=attributes.getNamedItem(behaviorAttrName);
if(bAttr){hasBehaviorAttributes=true;
if(bAttrs[behaviorAttrName].setup){bAttrs[behaviorAttrName].setup(node,bAttr.value)
}}}}}}catch(e){}return false
});
dataStr=rgn.innerHTML;
if(window.ActiveXObject&&!Spry.Data.Region.disableIEInnerHTMLFixUp&&dataStr.search(/=\{/)!=-1){if(Spry.Data.Region.debug){Spry.Debug.trace("<hr />Performing IE innerHTML fix up of Region: "+name+"<br /><br />"+Spry.Utils.encodeEntities(dataStr))
}dataStr=Spry.Utils.fixUpIEInnerHTML(dataStr)
}if(Spry.Data.Region.debug){Spry.Debug.trace("<hr />Region template markup for '"+name+"':<br /><br />"+Spry.Utils.encodeEntities(dataStr))
}if(!hasSpryContent){rgn.innerHTML=""
}var region=new Spry.Data.Region(rgn,name,isDetailRegion,dataStr,dataSets,regionStates,regionStateMap,hasBehaviorAttributes);
Spry.Data.regionsArray[region.name]=region;
newRegions.push(region)
}for(var i=0;
i<newRegions.length;
i++){newRegions[i].updateContent()
}};
Spry.Data.initRegions.nextUniqueRegionID=0;
Spry.Data.updateRegion=function(regionName){if(!regionName||!Spry.Data.regionsArray||!Spry.Data.regionsArray[regionName]){return 
}try{Spry.Data.regionsArray[regionName].updateContent()
}catch(e){Spry.Debug.reportError("Spry.Data.updateRegion("+regionName+") caught an exception: "+e+"\n")
}};
Spry.Data.getRegion=function(regionName){return Spry.Data.regionsArray[regionName]
};
Spry.Data.updateAllRegions=function(){if(!Spry.Data.regionsArray){return 
}for(var regionName in Spry.Data.regionsArray){Spry.Data.updateRegion(regionName)
}};
Spry.Data.getDataSetByName=function(dataSetName){var ds=window[dataSetName];
if(typeof ds!="object"||!ds.getData||!ds.filter){return null
}return ds
};
Spry.Data.DataSet=function(options){Spry.Utils.Notifier.call(this);
this.name="";
this.internalID=Spry.Data.DataSet.nextDataSetID++;
this.curRowID=0;
this.data=[];
this.unfilteredData=null;
this.dataHash={};
this.columnTypes={};
this.filterFunc=null;
this.filterDataFunc=null;
this.distinctOnLoad=false;
this.distinctFieldsOnLoad=null;
this.sortOnLoad=null;
this.sortOrderOnLoad="ascending";
this.keepSorted=false;
this.dataWasLoaded=false;
this.pendingRequest=null;
this.lastSortColumns=[];
this.lastSortOrder="";
this.loadIntervalID=0;
Spry.Utils.setOptions(this,options)
};
Spry.Data.DataSet.prototype=new Spry.Utils.Notifier();
Spry.Data.DataSet.prototype.constructor=Spry.Data.DataSet;
Spry.Data.DataSet.prototype.getData=function(unfiltered){return(unfiltered&&this.unfilteredData)?this.unfilteredData:this.data
};
Spry.Data.DataSet.prototype.getUnfilteredData=function(){return this.getData(true)
};
Spry.Data.DataSet.prototype.getLoadDataRequestIsPending=function(){return this.pendingRequest!=null
};
Spry.Data.DataSet.prototype.getDataWasLoaded=function(){return this.dataWasLoaded
};
Spry.Data.DataSet.prototype.getValue=function(valueName,rowContext){var result=undefined;
if(!rowContext){rowContext=this.getCurrentRow()
}switch(valueName){case"ds_RowNumber":result=this.getRowNumber(rowContext);
break;
case"ds_RowNumberPlus1":result=this.getRowNumber(rowContext)+1;
break;
case"ds_RowCount":result=this.getRowCount();
break;
case"ds_UnfilteredRowCount":result=this.getRowCount(true);
break;
case"ds_CurrentRowNumber":result=this.getCurrentRowNumber();
break;
case"ds_CurrentRowID":result=this.getCurrentRowID();
break;
case"ds_EvenOddRow":result=(this.getRowNumber(rowContext)%2)?Spry.Data.Region.evenRowClassName:Spry.Data.Region.oddRowClassName;
break;
case"ds_SortOrder":result=this.getSortOrder();
break;
case"ds_SortColumn":result=this.getSortColumn();
break;
default:if(rowContext){result=rowContext[valueName]
}break
}return result
};
Spry.Data.DataSet.prototype.setDataFromArray=function(arr,fireSyncLoad){this.notifyObservers("onPreLoad");
this.unfilteredData=null;
this.filteredData=null;
this.data=[];
this.dataHash={};
var arrLen=arr.length;
for(var i=0;
i<arrLen;
i++){var row=arr[i];
if(row.ds_RowID==undefined){row.ds_RowID=i
}this.dataHash[row.ds_RowID]=row;
this.data.push(row)
}this.loadData(fireSyncLoad)
};
Spry.Data.DataSet.prototype.loadData=function(syncLoad){var self=this;
this.pendingRequest=new Object;
this.dataWasLoaded=false;
var loadCallbackFunc=function(){self.pendingRequest=null;
self.dataWasLoaded=true;
self.applyColumnTypes();
self.disableNotifications();
self.filterAndSortData();
self.enableNotifications();
self.notifyObservers("onPostLoad");
self.notifyObservers("onDataChanged")
};
if(syncLoad){loadCallbackFunc()
}else{this.pendingRequest.timer=setTimeout(loadCallbackFunc,0)
}};
Spry.Data.DataSet.prototype.filterAndSortData=function(){if(this.filterDataFunc){this.filterData(this.filterDataFunc,true)
}if(this.distinctOnLoad){this.distinct(this.distinctFieldsOnLoad)
}if(this.keepSorted&&this.getSortColumn()){this.sort(this.lastSortColumns,this.lastSortOrder)
}else{if(this.sortOnLoad){this.sort(this.sortOnLoad,this.sortOrderOnLoad)
}}if(this.filterFunc){this.filter(this.filterFunc,true)
}if(this.data&&this.data.length>0){this.curRowID=this.data[0]["ds_RowID"]
}else{this.curRowID=0
}};
Spry.Data.DataSet.prototype.cancelLoadData=function(){if(this.pendingRequest&&this.pendingRequest.timer){clearTimeout(this.pendingRequest.timer)
}this.pendingRequest=null
};
Spry.Data.DataSet.prototype.getRowCount=function(unfiltered){var rows=this.getData(unfiltered);
return rows?rows.length:0
};
Spry.Data.DataSet.prototype.getRowByID=function(rowID){if(!this.data){return null
}return this.dataHash[rowID]
};
Spry.Data.DataSet.prototype.getRowByRowNumber=function(rowNumber,unfiltered){var rows=this.getData(unfiltered);
if(rows&&rowNumber>=0&&rowNumber<rows.length){return rows[rowNumber]
}return null
};
Spry.Data.DataSet.prototype.getCurrentRow=function(){return this.getRowByID(this.curRowID)
};
Spry.Data.DataSet.prototype.setCurrentRow=function(rowID){if(this.curRowID==rowID){return 
}var nData={oldRowID:this.curRowID,newRowID:rowID};
this.curRowID=rowID;
this.notifyObservers("onCurrentRowChanged",nData)
};
Spry.Data.DataSet.prototype.getRowNumber=function(row,unfiltered){if(row){var rows=this.getData(unfiltered);
if(rows&&rows.length){var numRows=rows.length;
for(var i=0;
i<numRows;
i++){if(rows[i]==row){return i
}}}}return -1
};
Spry.Data.DataSet.prototype.getCurrentRowNumber=function(){return this.getRowNumber(this.getCurrentRow())
};
Spry.Data.DataSet.prototype.getCurrentRowID=function(){return this.curRowID
};
Spry.Data.DataSet.prototype.setCurrentRowNumber=function(rowNumber){if(!this.data||rowNumber>=this.data.length){Spry.Debug.trace("Invalid row number: "+rowNumber+"\n");
return 
}var rowID=this.data[rowNumber]["ds_RowID"];
if(rowID==undefined||this.curRowID==rowID){return 
}this.setCurrentRow(rowID)
};
Spry.Data.DataSet.prototype.findRowsWithColumnValues=function(valueObj,firstMatchOnly,unfiltered){var results=[];
var rows=this.getData(unfiltered);
if(rows){var numRows=rows.length;
for(var i=0;
i<numRows;
i++){var row=rows[i];
var matched=true;
for(var colName in valueObj){if(valueObj[colName]!=row[colName]){matched=false;
break
}}if(matched){if(firstMatchOnly){return row
}results.push(row)
}}}return firstMatchOnly?null:results
};
Spry.Data.DataSet.prototype.setColumnType=function(columnNames,columnType){if(columnNames){if(typeof columnNames=="string"){columnNames=[columnNames]
}for(var i=0;
i<columnNames.length;
i++){this.columnTypes[columnNames[i]]=columnType
}}};
Spry.Data.DataSet.prototype.getColumnType=function(columnName){if(this.columnTypes[columnName]){return this.columnTypes[columnName]
}return"string"
};
Spry.Data.DataSet.prototype.applyColumnTypes=function(){var rows=this.getData(true);
var numRows=rows.length;
var colNames=[];
if(numRows<1){return 
}for(var cname in this.columnTypes){var ctype=this.columnTypes[cname];
if(ctype!="string"){for(var i=0;
i<numRows;
i++){var row=rows[i];
var val=row[cname];
if(val!=undefined){if(ctype=="number"){row[cname]=new Number(val)
}else{if(ctype=="html"){row[cname]=Spry.Utils.decodeEntities(val)
}}}}}}};
Spry.Data.DataSet.prototype.distinct=function(columnNames){if(this.data){var oldData=this.data;
this.data=[];
this.dataHash={};
var dataChanged=false;
var alreadySeenHash={};
var i=0;
var keys=[];
if(typeof columnNames=="string"){keys=[columnNames]
}else{if(columnNames){keys=columnNames
}else{for(var recField in oldData[0]){keys[i++]=recField
}}}for(var i=0;
i<oldData.length;
i++){var rec=oldData[i];
var hashStr="";
for(var j=0;
j<keys.length;
j++){recField=keys[j];
if(recField!="ds_RowID"){if(hashStr){hashStr+=","
}hashStr+=recField+':"'+rec[recField]+'"'
}}if(!alreadySeenHash[hashStr]){this.data.push(rec);
this.dataHash[rec.ds_RowID]=rec;
alreadySeenHash[hashStr]=true
}else{dataChanged=true
}}if(dataChanged){this.notifyObservers("onDataChanged")
}}};
Spry.Data.DataSet.prototype.getSortColumn=function(){return(this.lastSortColumns&&this.lastSortColumns.length>0)?this.lastSortColumns[0]:""
};
Spry.Data.DataSet.prototype.getSortOrder=function(){return this.lastSortOrder?this.lastSortOrder:""
};
Spry.Data.DataSet.prototype.sort=function(columnNames,sortOrder){if(!columnNames){return 
}if(typeof columnNames=="string"){columnNames=[columnNames,"ds_RowID"]
}else{if(columnNames.length<2&&columnNames[0]!="ds_RowID"){columnNames.push("ds_RowID")
}}if(!sortOrder){sortOrder="toggle"
}if(sortOrder=="toggle"){if(this.lastSortColumns.length>0&&this.lastSortColumns[0]==columnNames[0]&&this.lastSortOrder=="ascending"){sortOrder="descending"
}else{sortOrder="ascending"
}}if(sortOrder!="ascending"&&sortOrder!="descending"){Spry.Debug.reportError("Invalid sort order type specified: "+sortOrder+"\n");
return 
}var nData={oldSortColumns:this.lastSortColumns,oldSortOrder:this.lastSortOrder,newSortColumns:columnNames,newSortOrder:sortOrder};
this.notifyObservers("onPreSort",nData);
var cname=columnNames[columnNames.length-1];
var sortfunc=Spry.Data.DataSet.prototype.sort.getSortFunc(cname,this.getColumnType(cname),sortOrder);
for(var i=columnNames.length-2;
i>=0;
i--){cname=columnNames[i];
sortfunc=Spry.Data.DataSet.prototype.sort.buildSecondarySortFunc(Spry.Data.DataSet.prototype.sort.getSortFunc(cname,this.getColumnType(cname),sortOrder),sortfunc)
}if(this.unfilteredData){this.unfilteredData.sort(sortfunc);
if(this.filterFunc){this.filter(this.filterFunc,true)
}}else{this.data.sort(sortfunc)
}this.lastSortColumns=columnNames.slice(0);
this.lastSortOrder=sortOrder;
this.notifyObservers("onPostSort",nData)
};
Spry.Data.DataSet.prototype.sort.getSortFunc=function(prop,type,order){var sortfunc=null;
if(type=="number"){if(order=="ascending"){sortfunc=function(a,b){a=a[prop];
b=b[prop];
if(a==undefined||b==undefined){return(a==b)?0:(a?1:-1)
}return a-b
}
}else{sortfunc=function(a,b){a=a[prop];
b=b[prop];
if(a==undefined||b==undefined){return(a==b)?0:(a?-1:1)
}return b-a
}
}}else{if(type=="date"){if(order=="ascending"){sortfunc=function(a,b){var dA=a[prop];
var dB=b[prop];
dA=dA?(new Date(dA)):0;
dB=dB?(new Date(dB)):0;
return dA-dB
}
}else{sortfunc=function(a,b){var dA=a[prop];
var dB=b[prop];
dA=dA?(new Date(dA)):0;
dB=dB?(new Date(dB)):0;
return dB-dA
}
}}else{if(order=="ascending"){sortfunc=function(a,b){a=a[prop];
b=b[prop];
if(a==undefined||b==undefined){return(a==b)?0:(a?1:-1)
}var tA=a.toString();
var tB=b.toString();
var tA_l=tA.toLowerCase();
var tB_l=tB.toLowerCase();
var min_len=tA.length>tB.length?tB.length:tA.length;
for(var i=0;
i<min_len;
i++){var a_l_c=tA_l.charAt(i);
var b_l_c=tB_l.charAt(i);
var a_c=tA.charAt(i);
var b_c=tB.charAt(i);
if(a_l_c>b_l_c){return 1
}else{if(a_l_c<b_l_c){return -1
}else{if(a_c>b_c){return 1
}else{if(a_c<b_c){return -1
}}}}}if(tA.length==tB.length){return 0
}else{if(tA.length>tB.length){return 1
}}return -1
}
}else{sortfunc=function(a,b){a=a[prop];
b=b[prop];
if(a==undefined||b==undefined){return(a==b)?0:(a?-1:1)
}var tA=a.toString();
var tB=b.toString();
var tA_l=tA.toLowerCase();
var tB_l=tB.toLowerCase();
var min_len=tA.length>tB.length?tB.length:tA.length;
for(var i=0;
i<min_len;
i++){var a_l_c=tA_l.charAt(i);
var b_l_c=tB_l.charAt(i);
var a_c=tA.charAt(i);
var b_c=tB.charAt(i);
if(a_l_c>b_l_c){return -1
}else{if(a_l_c<b_l_c){return 1
}else{if(a_c>b_c){return -1
}else{if(a_c<b_c){return 1
}}}}}if(tA.length==tB.length){return 0
}else{if(tA.length>tB.length){return -1
}}return 1
}
}}}return sortfunc
};
Spry.Data.DataSet.prototype.sort.buildSecondarySortFunc=function(funcA,funcB){return function(a,b){var ret=funcA(a,b);
if(ret==0){ret=funcB(a,b)
}return ret
}
};
Spry.Data.DataSet.prototype.filterData=function(filterFunc,filterOnly){var dataChanged=false;
if(!filterFunc){this.filterDataFunc=null;
dataChanged=true
}else{this.filterDataFunc=filterFunc;
if(this.dataWasLoaded&&((this.unfilteredData&&this.unfilteredData.length)||(this.data&&this.data.length))){if(this.unfilteredData){this.data=this.unfilteredData;
this.unfilteredData=null
}var oldData=this.data;
this.data=[];
this.dataHash={};
for(var i=0;
i<oldData.length;
i++){var newRow=filterFunc(this,oldData[i],i);
if(newRow){this.data.push(newRow);
this.dataHash[newRow.ds_RowID]=newRow
}}dataChanged=true
}}if(dataChanged){if(!filterOnly){this.disableNotifications();
if(this.filterFunc){this.filter(this.filterFunc,true)
}this.enableNotifications()
}this.notifyObservers("onDataChanged")
}};
Spry.Data.DataSet.prototype.filter=function(filterFunc,filterOnly){var dataChanged=false;
if(!filterFunc){if(this.filterFunc&&this.unfilteredData){this.data=this.unfilteredData;
this.unfilteredData=null;
this.filterFunc=null;
dataChanged=true
}}else{this.filterFunc=filterFunc;
if(this.dataWasLoaded&&(this.unfilteredData||(this.data&&this.data.length))){if(!this.unfilteredData){this.unfilteredData=this.data
}var udata=this.unfilteredData;
this.data=[];
for(var i=0;
i<udata.length;
i++){var newRow=filterFunc(this,udata[i],i);
if(newRow){this.data.push(newRow)
}}dataChanged=true
}}if(dataChanged){this.notifyObservers("onDataChanged")
}};
Spry.Data.DataSet.prototype.startLoadInterval=function(interval){this.stopLoadInterval();
if(interval>0){var self=this;
this.loadInterval=interval;
this.loadIntervalID=setInterval(function(){self.loadData()
},interval)
}};
Spry.Data.DataSet.prototype.stopLoadInterval=function(){if(this.loadIntervalID){clearInterval(this.loadIntervalID)
}this.loadInterval=0;
this.loadIntervalID=null
};
Spry.Data.DataSet.nextDataSetID=0;
Spry.Data.HTTPSourceDataSet=function(dataSetURL,dataSetOptions){Spry.Data.DataSet.call(this);
this.url=dataSetURL;
this.dataSetsForDataRefStrings=new Array;
this.hasDataRefStrings=false;
this.useCache=true;
this.setRequestInfo(dataSetOptions,true);
Spry.Utils.setOptions(this,dataSetOptions,true);
this.recalculateDataSetDependencies();
if(this.loadInterval>0){this.startLoadInterval(this.loadInterval)
}};
Spry.Data.HTTPSourceDataSet.prototype=new Spry.Data.DataSet();
Spry.Data.HTTPSourceDataSet.prototype.constructor=Spry.Data.HTTPSourceDataSet;
Spry.Data.HTTPSourceDataSet.prototype.setRequestInfo=function(requestInfo,undefineRequestProps){this.requestInfo=new Spry.Utils.loadURL.Request();
this.requestInfo.extractRequestOptions(requestInfo,undefineRequestProps);
if(this.requestInfo.method=="POST"){if(!this.requestInfo.headers){this.requestInfo.headers={}
}if(!this.requestInfo.headers["Content-Type"]){this.requestInfo.headers["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8"
}}};
Spry.Data.HTTPSourceDataSet.prototype.recalculateDataSetDependencies=function(){this.hasDataRefStrings=false;
var i=0;
for(i=0;
i<this.dataSetsForDataRefStrings.length;
i++){var ds=this.dataSetsForDataRefStrings[i];
if(ds){ds.removeObserver(this)
}}this.dataSetsForDataRefStrings=new Array();
var regionStrs=this.getDataRefStrings();
var dsCount=0;
for(var n=0;
n<regionStrs.length;
n++){var tokens=Spry.Data.Region.getTokensFromStr(regionStrs[n]);
for(i=0;
tokens&&i<tokens.length;
i++){if(tokens[i].search(/{[^}:]+::[^}]+}/)!=-1){var dsName=tokens[i].replace(/^\{|::.*\}/g,"");
var ds=null;
if(!this.dataSetsForDataRefStrings[dsName]){ds=Spry.Data.getDataSetByName(dsName);
if(dsName&&ds){this.dataSetsForDataRefStrings[dsName]=ds;
this.dataSetsForDataRefStrings[dsCount++]=ds;
this.hasDataRefStrings=true
}}}}}for(i=0;
i<this.dataSetsForDataRefStrings.length;
i++){var ds=this.dataSetsForDataRefStrings[i];
ds.addObserver(this)
}};
Spry.Data.HTTPSourceDataSet.prototype.getDataRefStrings=function(){var strArr=[];
if(this.url){strArr.push(this.url)
}if(this.requestInfo&&this.requestInfo.postData){strArr.push(this.requestInfo.postData)
}return strArr
};
Spry.Data.HTTPSourceDataSet.prototype.attemptLoadData=function(){for(var i=0;
i<this.dataSetsForDataRefStrings.length;
i++){var ds=this.dataSetsForDataRefStrings[i];
if(ds.getLoadDataRequestIsPending()||!ds.getDataWasLoaded()){return 
}}this.loadData()
};
Spry.Data.HTTPSourceDataSet.prototype.onCurrentRowChanged=function(ds,data){this.attemptLoadData()
};
Spry.Data.HTTPSourceDataSet.prototype.onPostSort=function(ds,data){this.attemptLoadData()
};
Spry.Data.HTTPSourceDataSet.prototype.onDataChanged=function(ds,data){this.attemptLoadData()
};
Spry.Data.HTTPSourceDataSet.prototype.loadData=function(){if(!this.url){return 
}this.cancelLoadData();
var url=this.url;
var postData=this.requestInfo.postData;
if(this.hasDataRefStrings){var allDataSetsReady=true;
for(var i=0;
i<this.dataSetsForDataRefStrings.length;
i++){var ds=this.dataSetsForDataRefStrings[i];
if(ds.getLoadDataRequestIsPending()){allDataSetsReady=false
}else{if(!ds.getDataWasLoaded()){ds.loadData();
allDataSetsReady=false
}}}if(!allDataSetsReady){return 
}url=Spry.Data.Region.processDataRefString(null,this.url,this.dataSetsForDataRefStrings);
if(!url){return 
}if(postData&&(typeof postData)=="string"){postData=Spry.Data.Region.processDataRefString(null,postData,this.dataSetsForDataRefStrings)
}}this.notifyObservers("onPreLoad");
this.data=null;
this.dataWasLoaded=false;
this.unfilteredData=null;
this.dataHash=null;
this.curRowID=0;
var req=this.requestInfo.clone();
req.url=url;
req.postData=postData;
this.pendingRequest=new Object;
this.pendingRequest.data=Spry.Data.HTTPSourceDataSet.LoadManager.loadData(req,this,this.useCache)
};
Spry.Data.HTTPSourceDataSet.prototype.cancelLoadData=function(){if(this.pendingRequest){Spry.Data.HTTPSourceDataSet.LoadManager.cancelLoadData(this.pendingRequest.data,this);
this.pendingRequest=null
}};
Spry.Data.HTTPSourceDataSet.prototype.getURL=function(){return this.url
};
Spry.Data.HTTPSourceDataSet.prototype.setURL=function(url,requestOptions){if(this.url==url){if(!requestOptions||(this.requestInfo.method==requestOptions.method&&(requestOptions.method!="POST"||this.requestInfo.postData==requestOptions.postData))){return 
}}this.url=url;
this.setRequestInfo(requestOptions);
this.cancelLoadData();
this.recalculateDataSetDependencies();
this.dataWasLoaded=false
};
Spry.Data.HTTPSourceDataSet.prototype.setDataFromDoc=function(rawDataDoc){this.pendingRequest=null;
this.loadDataIntoDataSet(rawDataDoc);
this.applyColumnTypes();
this.disableNotifications();
this.filterAndSortData();
this.enableNotifications();
this.notifyObservers("onPostLoad");
this.notifyObservers("onDataChanged")
};
Spry.Data.HTTPSourceDataSet.prototype.loadDataIntoDataSet=function(rawDataDoc){this.dataHash=new Object;
this.data=new Array;
this.dataWasLoaded=true
};
Spry.Data.HTTPSourceDataSet.prototype.xhRequestProcessor=function(xhRequest){var resp=xhRequest.responseText;
if(xhRequest.status==200||xhRequest.status==0){return resp
}return null
};
Spry.Data.HTTPSourceDataSet.prototype.sessionExpiredChecker=function(req){if(req.xhRequest.responseText=="session expired"){return true
}return false
};
Spry.Data.HTTPSourceDataSet.prototype.setSessionExpiredChecker=function(checker){this.sessionExpiredChecker=checker
};
Spry.Data.HTTPSourceDataSet.prototype.onRequestResponse=function(cachedRequest,req){this.setDataFromDoc(cachedRequest.rawData)
};
Spry.Data.HTTPSourceDataSet.prototype.onRequestError=function(cachedRequest,req){this.notifyObservers("onLoadError",req)
};
Spry.Data.HTTPSourceDataSet.prototype.onRequestSessionExpired=function(cachedRequest,req){this.notifyObservers("onSessionExpired",req)
};
Spry.Data.HTTPSourceDataSet.LoadManager={};
Spry.Data.HTTPSourceDataSet.LoadManager.cache=[];
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest=function(reqInfo,xhRequestProcessor,sessionExpiredChecker){Spry.Utils.Notifier.call(this);
this.reqInfo=reqInfo;
this.rawData=null;
this.timer=null;
this.state=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.NOT_LOADED;
this.xhRequestProcessor=xhRequestProcessor;
this.sessionExpiredChecker=sessionExpiredChecker
};
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.prototype=new Spry.Utils.Notifier();
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.prototype.constructor=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest;
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.NOT_LOADED=1;
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_REQUESTED=2;
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_FAILED=3;
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_SUCCESSFUL=4;
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.prototype.loadDataCallback=function(req){if(req.xhRequest.readyState!=4){return 
}var rawData=null;
if(this.xhRequestProcessor){rawData=this.xhRequestProcessor(req.xhRequest)
}if(this.sessionExpiredChecker){Spry.Utils.setOptions(req,{rawData:rawData},false);
if(this.sessionExpiredChecker(req)){this.state=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_FAILED;
this.notifyObservers("onRequestSessionExpired",req);
this.observers.length=0;
return 
}}if(!rawData){this.state=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_FAILED;
this.notifyObservers("onRequestError",req);
this.observers.length=0;
return 
}this.rawData=rawData;
this.state=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_SUCCESSFUL;
this.notifyObservers("onRequestResponse",req);
this.observers.length=0
};
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.prototype.loadData=function(){var self=this;
this.cancelLoadData();
this.rawData=null;
this.state=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_REQUESTED;
var reqInfo=this.reqInfo.clone();
reqInfo.successCallback=function(req){self.loadDataCallback(req)
};
reqInfo.errorCallback=reqInfo.successCallback;
this.timer=setTimeout(function(){self.timer=null;
Spry.Utils.loadURL(reqInfo.method,reqInfo.url,reqInfo.async,reqInfo.successCallback,reqInfo)
},0)
};
Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.prototype.cancelLoadData=function(){if(this.state==Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_REQUESTED){if(this.timer){this.timer.clearTimeout();
this.timer=null
}this.rawData=null;
this.state=Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.NOT_LOADED
}};
Spry.Data.HTTPSourceDataSet.LoadManager.getCacheKey=function(reqInfo){return reqInfo.method+"::"+reqInfo.url+"::"+reqInfo.postData+"::"+reqInfo.username
};
Spry.Data.HTTPSourceDataSet.LoadManager.loadData=function(reqInfo,ds,useCache){if(!reqInfo){return null
}var cacheObj=null;
var cacheKey=null;
if(useCache){cacheKey=Spry.Data.HTTPSourceDataSet.LoadManager.getCacheKey(reqInfo);
cacheObj=Spry.Data.HTTPSourceDataSet.LoadManager.cache[cacheKey]
}if(cacheObj){if(cacheObj.state==Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_REQUESTED){if(ds){cacheObj.addObserver(ds)
}return cacheObj
}else{if(cacheObj.state==Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest.LOAD_SUCCESSFUL){if(ds){setTimeout(function(){ds.setDataFromDoc(cacheObj.rawData)
},0)
}return cacheObj
}}}if(!cacheObj){cacheObj=new Spry.Data.HTTPSourceDataSet.LoadManager.CachedRequest(reqInfo,(ds?ds.xhRequestProcessor:null),(ds?ds.sessionExpiredChecker:null));
if(useCache){Spry.Data.HTTPSourceDataSet.LoadManager.cache[cacheKey]=cacheObj;
cacheObj.addObserver({onRequestError:function(){Spry.Data.HTTPSourceDataSet.LoadManager.cache[cacheKey]=undefined
}})
}}if(ds){cacheObj.addObserver(ds)
}cacheObj.loadData();
return cacheObj
};
Spry.Data.HTTPSourceDataSet.LoadManager.cancelLoadData=function(cacheObj,ds){if(cacheObj){if(ds){cacheObj.removeObserver(ds)
}else{cacheObj.cancelLoadData()
}}};
Spry.Data.XMLDataSet=function(dataSetURL,dataSetPath,dataSetOptions){this.xpath=dataSetPath;
this.doc=null;
this.subPaths=[];
this.entityEncodeStrings=true;
Spry.Data.HTTPSourceDataSet.call(this,dataSetURL,dataSetOptions);
var jwType=typeof this.subPaths;
if(jwType=="string"||(jwType=="object"&&this.subPaths.constructor!=Array)){this.subPaths=[this.subPaths]
}};
Spry.Data.XMLDataSet.prototype=new Spry.Data.HTTPSourceDataSet();
Spry.Data.XMLDataSet.prototype.constructor=Spry.Data.XMLDataSet;
Spry.Data.XMLDataSet.prototype.getDataRefStrings=function(){var strArr=[];
if(this.url){strArr.push(this.url)
}if(this.xpath){strArr.push(this.xpath)
}if(this.requestInfo&&this.requestInfo.postData){strArr.push(this.requestInfo.postData)
}return strArr
};
Spry.Data.XMLDataSet.prototype.getDocument=function(){return this.doc
};
Spry.Data.XMLDataSet.prototype.getXPath=function(){return this.xpath
};
Spry.Data.XMLDataSet.prototype.setXPath=function(path){if(this.xpath!=path){this.xpath=path;
if(this.dataWasLoaded&&this.doc){this.notifyObservers("onPreLoad");
this.setDataFromDoc(this.doc)
}}};
Spry.Data.XMLDataSet.nodeContainsElementNode=function(node){if(node){node=node.firstChild;
while(node){if(node.nodeType==1){return true
}node=node.nextSibling
}}return false
};
Spry.Data.XMLDataSet.getNodeText=function(node,encodeText,encodeCData){var txt="";
if(!node){return 
}try{var child=node.firstChild;
while(child){try{if(child.nodeType==3){txt+=encodeText?Spry.Utils.encodeEntities(child.data):child.data
}else{if(child.nodeType==4){txt+=encodeCData?Spry.Utils.encodeEntities(child.data):child.data
}}}catch(e){Spry.Debug.reportError("Spry.Data.XMLDataSet.getNodeText() exception caught: "+e+"\n")
}child=child.nextSibling
}}catch(e){Spry.Debug.reportError("Spry.Data.XMLDataSet.getNodeText() exception caught: "+e+"\n")
}return txt
};
Spry.Data.XMLDataSet.createObjectForNode=function(node,encodeText,encodeCData){if(!node){return null
}var obj=new Object();
var i=0;
var attr=null;
try{for(i=0;
i<node.attributes.length;
i++){attr=node.attributes[i];
if(attr&&attr.nodeType==2){obj["@"+attr.name]=attr.value
}}}catch(e){Spry.Debug.reportError("Spry.Data.XMLDataSet.createObjectForNode() caught exception while accessing attributes: "+e+"\n")
}var child=node.firstChild;
if(child&&!child.nextSibling&&child.nodeType!=1){obj[node.nodeName]=Spry.Data.XMLDataSet.getNodeText(node,encodeText,encodeCData)
}while(child){if(child.nodeType==1){if(!Spry.Data.XMLDataSet.nodeContainsElementNode(child)){obj[child.nodeName]=Spry.Data.XMLDataSet.getNodeText(child,encodeText,encodeCData);
try{var namePrefix=child.nodeName+"/@";
for(i=0;
i<child.attributes.length;
i++){attr=child.attributes[i];
if(attr&&attr.nodeType==2){obj[namePrefix+attr.name]=attr.value
}}}catch(e){Spry.Debug.reportError("Spry.Data.XMLDataSet.createObjectForNode() caught exception while accessing attributes: "+e+"\n")
}}}child=child.nextSibling
}return obj
};
Spry.Data.XMLDataSet.getRecordSetFromXMLDoc=function(xmlDoc,path,suppressColumns,entityEncodeStrings){if(!xmlDoc||!path){return null
}var recordSet=new Object();
recordSet.xmlDoc=xmlDoc;
recordSet.xmlPath=path;
recordSet.dataHash=new Object;
recordSet.data=new Array;
recordSet.getData=function(){return this.data
};
var ctx=new ExprContext(xmlDoc);
var pathExpr=xpathParse(path);
var e=pathExpr.evaluate(ctx);
var nodeArray=e.nodeSetValue();
var isDOMNodeArray=true;
if(nodeArray&&nodeArray.length>0){isDOMNodeArray=nodeArray[0].nodeType!=2
}var nextID=0;
var encodeText=true;
var encodeCData=false;
if(typeof entityEncodeStrings=="boolean"){encodeText=encodeCData=entityEncodeStrings
}for(var i=0;
i<nodeArray.length;
i++){var rowObj=null;
if(suppressColumns){rowObj=new Object
}else{if(isDOMNodeArray){rowObj=Spry.Data.XMLDataSet.createObjectForNode(nodeArray[i],encodeText,encodeCData)
}else{rowObj=new Object;
rowObj["@"+nodeArray[i].name]=nodeArray[i].value
}}if(rowObj){rowObj.ds_RowID=nextID++;
rowObj.ds_XMLNode=nodeArray[i];
recordSet.dataHash[rowObj.ds_RowID]=rowObj;
recordSet.data.push(rowObj)
}}return recordSet
};
Spry.Data.XMLDataSet.PathNode=function(path){this.path=path;
this.subPaths=[];
this.xpath=""
};
Spry.Data.XMLDataSet.PathNode.prototype.addSubPath=function(path){var node=this.findSubPath(path);
if(!node){node=new Spry.Data.XMLDataSet.PathNode(path);
this.subPaths.push(node)
}return node
};
Spry.Data.XMLDataSet.PathNode.prototype.findSubPath=function(path){var numSubPaths=this.subPaths.length;
for(var i=0;
i<numSubPaths;
i++){var subPath=this.subPaths[i];
if(path==subPath.path){return subPath
}}return null
};
Spry.Data.XMLDataSet.PathNode.prototype.consolidate=function(){var numSubPaths=this.subPaths.length;
if(!this.xpath&&numSubPaths==1){var subPath=this.subPaths[0];
this.path+=((subPath[0]!="/")?"/":"")+subPath.path;
this.xpath=subPath.xpath;
this.subPaths=subPath.subPaths;
this.consolidate();
return 
}for(var i=0;
i<numSubPaths;
i++){this.subPaths[i].consolidate()
}};
Spry.Data.XMLDataSet.prototype.convertXPathsToPathTree=function(xpathArray){var xpaLen=xpathArray.length;
var root=new Spry.Data.XMLDataSet.PathNode("");
for(var i=0;
i<xpaLen;
i++){var xpath=xpathArray[i];
var cleanXPath=xpath.replace(/\/\//g,"/__SPRYDS__");
cleanXPath=cleanXPath.replace(/^\//,"");
var pathItems=cleanXPath.split(/\//);
var pathItemsLen=pathItems.length;
var node=root;
for(var j=0;
j<pathItemsLen;
j++){var path=pathItems[j].replace(/__SPRYDS__/,"//");
node=node.addSubPath(path)
}node.xpath=xpath
}root.consolidate();
return root
};
Spry.Data.XMLDataSet.prototype.flattenSubPaths=function(rs,subPaths){if(!rs||!subPaths){return 
}var numSubPaths=subPaths.length;
if(numSubPaths<1){return 
}var data=rs.data;
var dataHash={};
var xpathArray=[];
var cleanedXPathArray=[];
for(var i=0;
i<numSubPaths;
i++){var subPath=subPaths[i];
if(typeof subPath=="object"){subPath=subPath.path
}if(!subPath){subPath=""
}xpathArray[i]=Spry.Data.Region.processDataRefString(null,subPath,this.dataSetsForDataRefStrings);
cleanedXPathArray[i]=xpathArray[i].replace(/\[.*\]/g,"")
}var row;
var numRows=data.length;
var newData=[];
for(var i=0;
i<numRows;
i++){row=data[i];
var newRows=[row];
for(var j=0;
j<numSubPaths;
j++){var newRS=Spry.Data.XMLDataSet.getRecordSetFromXMLDoc(row.ds_XMLNode,xpathArray[j],(subPaths[j].xpath?false:true),this.entityEncodeStrings);
if(newRS&&newRS.data&&newRS.data.length){if(typeof subPaths[j]=="object"&&subPaths[j].subPaths){var sp=subPaths[j].subPaths;
spType=typeof sp;
if(spType=="string"){sp=[sp]
}else{if(spType=="object"&&spType.constructor==Object){sp=[sp]
}}this.flattenSubPaths(newRS,sp)
}var newRSData=newRS.data;
var numRSRows=newRSData.length;
var cleanedXPath=cleanedXPathArray[j]+"/";
var numNewRows=newRows.length;
var joinedRows=[];
for(var k=0;
k<numNewRows;
k++){var newRow=newRows[k];
for(var l=0;
l<numRSRows;
l++){var newRowObj=new Object;
var newRSRow=newRSData[l];
for(prop in newRow){newRowObj[prop]=newRow[prop]
}for(var prop in newRSRow){var newPropName=cleanedXPath+prop;
if(cleanedXPath==(prop+"/")||cleanedXPath.search(new RegExp("\\/"+prop+"\\/$"))!=-1){newPropName=cleanedXPathArray[j]
}newRowObj[newPropName]=newRSRow[prop]
}joinedRows.push(newRowObj)
}}newRows=joinedRows
}}newData=newData.concat(newRows)
}data=newData;
numRows=data.length;
for(i=0;
i<numRows;
i++){row=data[i];
row.ds_RowID=i;
dataHash[row.ds_RowID]=row
}rs.data=data;
rs.dataHash=dataHash
};
Spry.Data.XMLDataSet.prototype.loadDataIntoDataSet=function(rawDataDoc){var rs=null;
var mainXPath=Spry.Data.Region.processDataRefString(null,this.xpath,this.dataSetsForDataRefStrings);
var subPaths=this.subPaths;
var suppressColumns=false;
if(this.subPaths&&this.subPaths.length>0){var processedSubPaths=[];
var numSubPaths=subPaths.length;
for(var i=0;
i<numSubPaths;
i++){var subPathStr=Spry.Data.Region.processDataRefString(null,subPaths[i],this.dataSetsForDataRefStrings);
if(subPathStr.charAt(0)!="/"){subPathStr=mainXPath+"/"+subPathStr
}processedSubPaths.push(subPathStr)
}processedSubPaths.unshift(mainXPath);
var commonParent=this.convertXPathsToPathTree(processedSubPaths);
mainXPath=commonParent.path;
subPaths=commonParent.subPaths;
suppressColumns=commonParent.xpath?false:true
}rs=Spry.Data.XMLDataSet.getRecordSetFromXMLDoc(rawDataDoc,mainXPath,suppressColumns,this.entityEncodeStrings);
if(!rs){Spry.Debug.reportError("Spry.Data.XMLDataSet.loadDataIntoDataSet() failed to create dataSet '"+this.name+"'for '"+this.xpath+"' - "+this.url+"\n");
return 
}this.flattenSubPaths(rs,subPaths);
this.doc=rs.xmlDoc;
this.data=rs.data;
this.dataHash=rs.dataHash;
this.dataWasLoaded=(this.doc!=null)
};
Spry.Data.XMLDataSet.prototype.xhRequestProcessor=function(xhRequest){var resp=xhRequest.responseXML;
var manualParseRequired=false;
if(xhRequest.status!=200){if(xhRequest.status==0){if(xhRequest.responseText&&(!resp||!resp.firstChild)){manualParseRequired=true
}}}else{if((!resp)||(!resp.getElementById)){manualParseRequired=true
}}if(manualParseRequired){resp=Spry.Utils.stringToXMLDoc(xhRequest.responseText)
}if(!resp||!resp.firstChild||resp.firstChild.nodeName=="parsererror"){return null
}return resp
};
Spry.Data.XMLDataSet.prototype.sessionExpiredChecker=function(req){if(req.xhRequest.responseText=="session expired"){return true
}else{if(req.rawData){var firstChild=req.rawData.documentElement.firstChild;
if(firstChild&&firstChild.nodeValue=="session expired"){return true
}}}return false
};
Spry.Data.Region=function(regionNode,name,isDetailRegion,data,dataSets,regionStates,regionStateMap,hasBehaviorAttributes){this.regionNode=regionNode;
this.name=name;
this.isDetailRegion=isDetailRegion;
this.data=data;
this.dataSets=dataSets;
this.hasBehaviorAttributes=hasBehaviorAttributes;
this.tokens=null;
this.currentState=null;
this.states={ready:true};
this.stateMap={};
Spry.Utils.setOptions(this.states,regionStates);
Spry.Utils.setOptions(this.stateMap,regionStateMap);
for(var i=0;
i<this.dataSets.length;
i++){var ds=this.dataSets[i];
try{if(ds){ds.addObserver(this)
}}catch(e){Spry.Debug.reportError("Failed to add '"+this.name+"' as a dataSet observer!\n")
}}};
Spry.Data.Region.hiddenRegionClassName="SpryHiddenRegion";
Spry.Data.Region.evenRowClassName="even";
Spry.Data.Region.oddRowClassName="odd";
Spry.Data.Region.notifiers={};
Spry.Data.Region.evalScripts=true;
Spry.Data.Region.addObserver=function(regionID,observer){var n=Spry.Data.Region.notifiers[regionID];
if(!n){n=new Spry.Utils.Notifier();
Spry.Data.Region.notifiers[regionID]=n
}n.addObserver(observer)
};
Spry.Data.Region.removeObserver=function(regionID,observer){var n=Spry.Data.Region.notifiers[regionID];
if(n){n.removeObserver(observer)
}};
Spry.Data.Region.notifyObservers=function(methodName,region,data){var n=Spry.Data.Region.notifiers[region.name];
if(n){var dataObj={};
if(data&&typeof data=="object"){dataObj=data
}else{dataObj.data=data
}dataObj.region=region;
dataObj.regionID=region.name;
dataObj.regionNode=region.regionNode;
n.notifyObservers(methodName,dataObj)
}};
Spry.Data.Region.RS_Error=1;
Spry.Data.Region.RS_LoadingData=2;
Spry.Data.Region.RS_PreUpdate=4;
Spry.Data.Region.RS_PostUpdate=8;
Spry.Data.Region.prototype.getState=function(){return this.currentState
};
Spry.Data.Region.prototype.mapState=function(stateName,newStateName){this.stateMap[stateName]=newStateName
};
Spry.Data.Region.prototype.getMappedState=function(stateName){var mappedState=this.stateMap[stateName];
return mappedState?mappedState:stateName
};
Spry.Data.Region.prototype.setState=function(stateName,suppressNotfications){var stateObj={state:stateName,mappedState:this.getMappedState(stateName)};
if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPreStateChange",this,stateObj)
}this.currentState=stateObj.mappedState?stateObj.mappedState:stateName;
if(this.states[stateName]){var notificationData={state:this.currentState};
if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPreUpdate",this,notificationData)
}var str=this.transform();
if(Spry.Data.Region.debug){Spry.Debug.trace("<hr />Generated region markup for '"+this.name+"':<br /><br />"+Spry.Utils.encodeEntities(str))
}Spry.Utils.setInnerHTML(this.regionNode,str,!Spry.Data.Region.evalScripts);
if(this.hasBehaviorAttributes){this.attachBehaviors()
}if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPostUpdate",this,notificationData)
}}if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPostStateChange",this,stateObj)
}};
Spry.Data.Region.prototype.getDataSets=function(){return this.dataSets
};
Spry.Data.Region.prototype.addDataSet=function(aDataSet){if(!aDataSet){return 
}if(!this.dataSets){this.dataSets=new Array
}for(var i=0;
i<this.dataSets.length;
i++){if(this.dataSets[i]==aDataSet){return 
}}this.dataSets.push(aDataSet);
aDataSet.addObserver(this)
};
Spry.Data.Region.prototype.removeDataSet=function(aDataSet){if(!aDataSet||this.dataSets){return 
}for(var i=0;
i<this.dataSets.length;
i++){if(this.dataSets[i]==aDataSet){this.dataSets.splice(i,1);
aDataSet.removeObserver(this);
return 
}}};
Spry.Data.Region.prototype.onPreLoad=function(dataSet){if(this.currentState!="loading"){this.setState("loading")
}};
Spry.Data.Region.prototype.onLoadError=function(dataSet){if(this.currentState!="error"){this.setState("error")
}Spry.Data.Region.notifyObservers("onError",this)
};
Spry.Data.Region.prototype.onSessionExpired=function(dataSet){if(this.currentState!="expired"){this.setState("expired")
}Spry.Data.Region.notifyObservers("onExpired",this)
};
Spry.Data.Region.prototype.onCurrentRowChanged=function(dataSet,data){if(this.isDetailRegion){this.updateContent()
}};
Spry.Data.Region.prototype.onPostSort=function(dataSet,data){this.updateContent()
};
Spry.Data.Region.prototype.onDataChanged=function(dataSet,data){this.updateContent()
};
Spry.Data.Region.enableBehaviorAttributes=true;
Spry.Data.Region.behaviorAttrs={};
Spry.Data.Region.behaviorAttrs["spry:select"]={attach:function(rgn,node,value){var selectGroupName=null;
try{selectGroupName=node.attributes.getNamedItem("spry:selectgroup").value
}catch(e){}if(!selectGroupName){selectGroupName="default"
}Spry.Utils.addEventListener(node,"click",function(event){Spry.Utils.SelectionManager.select(selectGroupName,node,value)
},false);
if(node.attributes.getNamedItem("spry:selected")){Spry.Utils.SelectionManager.select(selectGroupName,node,value)
}}};
Spry.Data.Region.behaviorAttrs["spry:hover"]={attach:function(rgn,node,value){Spry.Utils.addEventListener(node,"mouseover",function(event){Spry.Utils.addClassName(node,value)
},false);
Spry.Utils.addEventListener(node,"mouseout",function(event){Spry.Utils.removeClassName(node,value)
},false)
}};
Spry.Data.Region.setUpRowNumberForEvenOddAttr=function(node,attr,value,rowNumAttrName){if(!value){Spry.Debug.showError("The "+attr+" attribute requires a CSS class name as its value!");
node.attributes.removeNamedItem(attr);
return 
}var dsName="";
var valArr=value.split(/\s/);
if(valArr.length>1){dsName=valArr[0];
node.setAttribute(attr,valArr[1])
}node.setAttribute(rowNumAttrName,"{"+(dsName?(dsName+"::"):"")+"ds_RowNumber}")
};
Spry.Data.Region.behaviorAttrs["spry:even"]={setup:function(node,value){Spry.Data.Region.setUpRowNumberForEvenOddAttr(node,"spry:even",value,"spryevenrownumber")
},attach:function(rgn,node,value){if(value){rowNumAttr=node.attributes.getNamedItem("spryevenrownumber");
if(rowNumAttr&&rowNumAttr.value){var rowNum=parseInt(rowNumAttr.value);
if(rowNum%2){Spry.Utils.addClassName(node,value)
}}}node.removeAttribute("spry:even");
node.removeAttribute("spryevenrownumber")
}};
Spry.Data.Region.behaviorAttrs["spry:odd"]={setup:function(node,value){Spry.Data.Region.setUpRowNumberForEvenOddAttr(node,"spry:odd",value,"spryoddrownumber")
},attach:function(rgn,node,value){if(value){rowNumAttr=node.attributes.getNamedItem("spryoddrownumber");
if(rowNumAttr&&rowNumAttr.value){var rowNum=parseInt(rowNumAttr.value);
if(rowNum%2==0){Spry.Utils.addClassName(node,value)
}}}node.removeAttribute("spry:odd");
node.removeAttribute("spryoddrownumber")
}};
Spry.Data.Region.setRowAttrClickHandler=function(node,dsName,rowAttr,funcName){if(dsName){var ds=Spry.Data.getDataSetByName(dsName);
if(ds){rowIDAttr=node.attributes.getNamedItem(rowAttr);
if(rowIDAttr){var rowAttrVal=rowIDAttr.value;
if(rowAttrVal){Spry.Utils.addEventListener(node,"click",function(event){ds[funcName](rowAttrVal)
},false)
}}}}};
Spry.Data.Region.behaviorAttrs["spry:setrow"]={setup:function(node,value){if(!value){Spry.Debug.reportError("The spry:setrow attribute requires a data set name as its value!");
node.removeAttribute("spry:setrow");
return 
}node.setAttribute("spryrowid","{"+value+"::ds_RowID}")
},attach:function(rgn,node,value){Spry.Data.Region.setRowAttrClickHandler(node,value,"spryrowid","setCurrentRow");
node.removeAttribute("spry:setrow");
node.removeAttribute("spryrowid")
}};
Spry.Data.Region.behaviorAttrs["spry:setrownumber"]={setup:function(node,value){if(!value){Spry.Debug.reportError("The spry:setrownumber attribute requires a data set name as its value!");
node.removeAttribute("spry:setrownumber");
return 
}node.setAttribute("spryrownumber","{"+value+"::ds_RowID}")
},attach:function(rgn,node,value){Spry.Data.Region.setRowAttrClickHandler(node,value,"spryrownumber","setCurrentRowNumber");
node.removeAttribute("spry:setrownumber");
node.removeAttribute("spryrownumber")
}};
Spry.Data.Region.behaviorAttrs["spry:sort"]={attach:function(rgn,node,value){if(!value){return 
}var ds=rgn.getDataSets()[0];
var sortOrder="toggle";
var colArray=value.split(/\s/);
if(colArray.length>1){var specifiedDS=Spry.Data.getDataSetByName(colArray[0]);
if(specifiedDS){ds=specifiedDS;
colArray.shift()
}if(colArray.length>1){var str=colArray[colArray.length-1];
if(str=="ascending"||str=="descending"||str=="toggle"){sortOrder=str;
colArray.pop()
}}}if(ds&&colArray.length>0){Spry.Utils.addEventListener(node,"click",function(event){ds.sort(colArray,sortOrder)
},false)
}node.removeAttribute("spry:sort")
}};
Spry.Data.Region.prototype.attachBehaviors=function(){var rgn=this;
Spry.Utils.getNodesByFunc(this.regionNode,function(node){if(!node||node.nodeType!=1){return false
}try{var bAttrs=Spry.Data.Region.behaviorAttrs;
for(var bAttrName in bAttrs){var attr=node.attributes.getNamedItem(bAttrName);
if(attr){var behavior=bAttrs[bAttrName];
if(behavior&&behavior.attach){behavior.attach(rgn,node,attr.value)
}}}}catch(e){}return false
})
};
Spry.Data.Region.prototype.updateContent=function(){var allDataSetsReady=true;
var dsArray=this.getDataSets();
if(!dsArray||dsArray.length<1){Spry.Debug.reportError("updateContent(): Region '"+this.name+"' has no data set!\n");
return 
}for(var i=0;
i<dsArray.length;
i++){var ds=dsArray[i];
if(ds){if(ds.getLoadDataRequestIsPending()){allDataSetsReady=false
}else{if(!ds.getDataWasLoaded()){ds.loadData();
allDataSetsReady=false
}}}}if(!allDataSetsReady){Spry.Data.Region.notifyObservers("onLoadingData",this);
return 
}this.setState("ready")
};
Spry.Data.Region.prototype.clearContent=function(){this.regionNode.innerHTML=""
};
Spry.Data.Region.processContentPI=function(inStr){var outStr="";
var regexp=/<!--\s*<\/?spry:content\s*[^>]*>\s*-->/mg;
var searchStartIndex=0;
var processingContentTag=0;
while(inStr.length){var results=regexp.exec(inStr);
if(!results||!results[0]){outStr+=inStr.substr(searchStartIndex,inStr.length-searchStartIndex);
break
}if(!processingContentTag&&results.index!=searchStartIndex){outStr+=inStr.substr(searchStartIndex,results.index-searchStartIndex)
}if(results[0].search(/<\//)!=-1){--processingContentTag;
if(processingContentTag){Spry.Debug.reportError("Nested spry:content regions are not allowed!\n")
}}else{++processingContentTag;
var dataRefStr=results[0].replace(/.*\bdataref="/,"");
outStr+=dataRefStr.replace(/".*$/,"")
}searchStartIndex=regexp.lastIndex
}return outStr
};
Spry.Data.Region.prototype.tokenizeData=function(dataStr){if(!dataStr){return null
}var rootToken=new Spry.Data.Region.Token(Spry.Data.Region.Token.LIST_TOKEN,null,null,null);
var tokenStack=new Array;
var parseStr=Spry.Data.Region.processContentPI(dataStr);
tokenStack.push(rootToken);
var regexp=/((<!--\s*){0,1}<\/{0,1}spry:[^>]+>(\s*-->){0,1})|((\{|%7[bB])[^\}\s%]+(\}|%7[dD]))/mg;
var searchStartIndex=0;
while(parseStr.length){var results=regexp.exec(parseStr);
var token=null;
if(!results||!results[0]){var str=parseStr.substr(searchStartIndex,parseStr.length-searchStartIndex);
token=new Spry.Data.Region.Token(Spry.Data.Region.Token.STRING_TOKEN,null,str,str);
tokenStack[tokenStack.length-1].addChild(token);
break
}if(results.index!=searchStartIndex){var str=parseStr.substr(searchStartIndex,results.index-searchStartIndex);
token=new Spry.Data.Region.Token(Spry.Data.Region.Token.STRING_TOKEN,null,str,str);
tokenStack[tokenStack.length-1].addChild(token)
}if(results[0].search(/^({|%7[bB])/)!=-1){var valueName=results[0];
var regionStr=results[0];
valueName=valueName.replace(/^({|%7[bB])/,"");
valueName=valueName.replace(/(}|%7[dD])$/,"");
var dataSetName=null;
var splitArray=valueName.split(/::/);
if(splitArray.length>1){dataSetName=splitArray[0];
valueName=splitArray[1]
}regionStr=regionStr.replace(/^%7[bB]/,"{");
regionStr=regionStr.replace(/%7[dD]$/,"}");
token=new Spry.Data.Region.Token(Spry.Data.Region.Token.VALUE_TOKEN,dataSetName,valueName,new String(regionStr));
tokenStack[tokenStack.length-1].addChild(token)
}else{if(results[0].charAt(0)=="<"){var piName=results[0].replace(/^(<!--\s*){0,1}<\/?/,"");
piName=piName.replace(/>(\s*-->){0,1}|\s.*$/,"");
if(results[0].search(/<\//)!=-1){if(tokenStack[tokenStack.length-1].tokenType!=Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN){Spry.Debug.reportError("Invalid processing instruction close tag: "+piName+" -- "+results[0]+"\n");
return null
}tokenStack.pop()
}else{var piDesc=Spry.Data.Region.PI.instructions[piName];
if(piDesc){var dataSet=null;
var selectedDataSetName="";
if(results[0].search(/^.*\bselect=\"/)!=-1){selectedDataSetName=results[0].replace(/^.*\bselect=\"/,"");
selectedDataSetName=selectedDataSetName.replace(/".*$/,"");
if(selectedDataSetName){dataSet=Spry.Data.getDataSetByName(selectedDataSetName);
if(!dataSet){Spry.Debug.reportError("Failed to retrieve data set ("+selectedDataSetName+") for "+piName+"\n");
selectedDataSetName=""
}}}var jsExpr=null;
if(results[0].search(/^.*\btest=\"/)!=-1){jsExpr=results[0].replace(/^.*\btest=\"/,"");
jsExpr=jsExpr.replace(/".*$/,"");
jsExpr=Spry.Utils.decodeEntities(jsExpr)
}var regionState=null;
if(results[0].search(/^.*\bname=\"/)!=-1){regionState=results[0].replace(/^.*\bname=\"/,"");
regionState=regionState.replace(/".*$/,"");
regionState=Spry.Utils.decodeEntities(regionState)
}var piData=new Spry.Data.Region.Token.PIData(piName,selectedDataSetName,jsExpr,regionState);
token=new Spry.Data.Region.Token(Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN,dataSet,piData,new String(results[0]));
tokenStack[tokenStack.length-1].addChild(token);
tokenStack.push(token)
}else{Spry.Debug.reportError("Unsupported region processing instruction: "+results[0]+"\n");
return null
}}}else{Spry.Debug.reportError("Invalid region token: "+results[0]+"\n");
return null
}}searchStartIndex=regexp.lastIndex
}return rootToken
};
Spry.Data.Region.prototype.callScriptFunction=function(funcName,processContext){var result=undefined;
funcName=funcName.replace(/^\s*\{?\s*function::\s*|\s*\}?\s*$/g,"");
var func=Spry.Utils.getObjectByName(funcName);
if(func){result=func(this.name,function(){return processContext.getValueFromDataSet.apply(processContext,arguments)
})
}return result
};
Spry.Data.Region.prototype.evaluateExpression=function(exprStr,processContext){var result=undefined;
try{if(exprStr.search(/^\s*function::/)!=-1){result=this.callScriptFunction(exprStr,processContext)
}else{result=Spry.Utils.eval(Spry.Data.Region.processDataRefString(processContext,exprStr,null,true))
}}catch(e){Spry.Debug.trace("Caught exception in Spry.Data.Region.prototype.evaluateExpression() while evaluating: "+Spry.Utils.encodeEntities(exprStr)+"\n    Exception:"+e+"\n")
}return result
};
Spry.Data.Region.prototype.processTokenChildren=function(outputArr,token,processContext){var children=token.children;
var len=children.length;
for(var i=0;
i<len;
i++){this.processTokens(outputArr,children[i],processContext)
}};
Spry.Data.Region.prototype.processTokens=function(outputArr,token,processContext){var i=0;
switch(token.tokenType){case Spry.Data.Region.Token.LIST_TOKEN:this.processTokenChildren(outputArr,token,processContext);
break;
case Spry.Data.Region.Token.STRING_TOKEN:outputArr.push(token.data);
break;
case Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN:if(token.data.name=="spry:repeat"){var dataSet=null;
if(token.dataSet){dataSet=token.dataSet
}else{dataSet=this.dataSets[0]
}if(dataSet){var dsContext=processContext.getDataSetContext(dataSet);
if(!dsContext){Spry.Debug.reportError("processTokens() failed to get a data set context!\n");
break
}dsContext.pushState();
var dataSetRows=dsContext.getData();
var numRows=dataSetRows.length;
for(i=0;
i<numRows;
i++){dsContext.setRowIndex(i);
var testVal=true;
if(token.data.jsExpr){testVal=this.evaluateExpression(token.data.jsExpr,processContext)
}if(testVal){this.processTokenChildren(outputArr,token,processContext)
}}dsContext.popState()
}}else{if(token.data.name=="spry:if"){var testVal=true;
if(token.data.jsExpr){testVal=this.evaluateExpression(token.data.jsExpr,processContext)
}if(testVal){this.processTokenChildren(outputArr,token,processContext)
}}else{if(token.data.name=="spry:choose"){var defaultChild=null;
var childToProcess=null;
var testVal=false;
var j=0;
for(j=0;
j<token.children.length;
j++){var child=token.children[j];
if(child.tokenType==Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN){if(child.data.name=="spry:when"){if(child.data.jsExpr){testVal=this.evaluateExpression(child.data.jsExpr,processContext);
if(testVal){childToProcess=child;
break
}}}else{if(child.data.name=="spry:default"){defaultChild=child
}}}}if(!childToProcess&&defaultChild){childToProcess=defaultChild
}if(childToProcess){this.processTokenChildren(outputArr,childToProcess,processContext)
}}else{if(token.data.name=="spry:state"){var testVal=true;
if(!token.data.regionState||token.data.regionState==this.currentState){this.processTokenChildren(outputArr,token,processContext)
}}else{Spry.Debug.reportError("processTokens(): Unknown processing instruction: "+token.data.name+"\n");
return""
}}}}break;
case Spry.Data.Region.Token.VALUE_TOKEN:var dataSet=token.dataSet;
var val=undefined;
if(dataSet&&dataSet=="function"){val=this.callScriptFunction(token.data,processContext)
}else{if(!dataSet&&this.dataSets&&this.dataSets.length>0&&this.dataSets[0]){dataSet=this.dataSets[0]
}if(!dataSet){Spry.Debug.reportError("processTokens(): Value reference has no data set specified: "+token.regionStr+"\n");
return""
}val=processContext.getValueFromDataSet(dataSet,token.data)
}if(typeof val!="undefined"){outputArr.push(val+"")
}break;
default:Spry.Debug.reportError("processTokens(): Invalid token type: "+token.regionStr+"\n");
break
}};
Spry.Data.Region.prototype.transform=function(){if(this.data&&!this.tokens){this.tokens=this.tokenizeData(this.data)
}if(!this.tokens){return""
}processContext=new Spry.Data.Region.ProcessingContext(this);
if(!processContext){return""
}var outputArr=[""];
this.processTokens(outputArr,this.tokens,processContext);
return outputArr.join("")
};
Spry.Data.Region.PI={};
Spry.Data.Region.PI.instructions={};
Spry.Data.Region.PI.buildOpenTagForValueAttr=function(ele,piName,attrName){if(!ele||!piName){return""
}var jsExpr="";
try{var testAttr=ele.attributes.getNamedItem(piName);
if(testAttr&&testAttr.value){jsExpr=Spry.Utils.encodeEntities(testAttr.value)
}}catch(e){jsExpr=""
}if(!jsExpr){Spry.Debug.reportError(piName+" attribute requires a JavaScript expression that returns true or false!\n");
return""
}return"<"+Spry.Data.Region.PI.instructions[piName].tagName+" "+attrName+'="'+jsExpr+'">'
};
Spry.Data.Region.PI.buildOpenTagForTest=function(ele,piName){return Spry.Data.Region.PI.buildOpenTagForValueAttr(ele,piName,"test")
};
Spry.Data.Region.PI.buildOpenTagForState=function(ele,piName){return Spry.Data.Region.PI.buildOpenTagForValueAttr(ele,piName,"name")
};
Spry.Data.Region.PI.buildOpenTagForRepeat=function(ele,piName){if(!ele||!piName){return""
}var selectAttrStr="";
try{var selectAttr=ele.attributes.getNamedItem(piName);
if(selectAttr&&selectAttr.value){selectAttrStr=selectAttr.value;
selectAttrStr=selectAttrStr.replace(/\s/g,"")
}}catch(e){selectAttrStr=""
}if(!selectAttrStr){Spry.Debug.reportError(piName+" attribute requires a data set name!\n");
return""
}var testAttrStr="";
try{var testAttr=ele.attributes.getNamedItem("spry:test");
if(testAttr){if(testAttr.value){testAttrStr=' test="'+Spry.Utils.encodeEntities(testAttr.value)+'"'
}ele.attributes.removeNamedItem(testAttr.nodeName)
}}catch(e){testAttrStr=""
}return"<"+Spry.Data.Region.PI.instructions[piName].tagName+' select="'+selectAttrStr+'"'+testAttrStr+">"
};
Spry.Data.Region.PI.buildOpenTagForContent=function(ele,piName){if(!ele||!piName){return""
}var dataRefStr="";
try{var contentAttr=ele.attributes.getNamedItem(piName);
if(contentAttr&&contentAttr.value){dataRefStr=Spry.Utils.encodeEntities(contentAttr.value)
}}catch(e){dataRefStr=""
}if(!dataRefStr){Spry.Debug.reportError(piName+" attribute requires a data reference!\n");
return""
}return"<"+Spry.Data.Region.PI.instructions[piName].tagName+' dataref="'+dataRefStr+'">'
};
Spry.Data.Region.PI.buildOpenTag=function(ele,piName){return"<"+Spry.Data.Region.PI.instructions[piName].tagName+">"
};
Spry.Data.Region.PI.buildCloseTag=function(ele,piName){return"</"+Spry.Data.Region.PI.instructions[piName].tagName+">"
};
Spry.Data.Region.PI.instructions["spry:state"]={tagName:"spry:state",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForState,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:if"]={tagName:"spry:if",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForTest,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:repeat"]={tagName:"spry:repeat",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForRepeat,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:repeatchildren"]={tagName:"spry:repeat",childrenOnly:true,getOpenTag:Spry.Data.Region.PI.buildOpenTagForRepeat,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:choose"]={tagName:"spry:choose",childrenOnly:true,getOpenTag:Spry.Data.Region.PI.buildOpenTag,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:when"]={tagName:"spry:when",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForTest,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:default"]={tagName:"spry:default",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTag,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.instructions["spry:content"]={tagName:"spry:content",childrenOnly:true,getOpenTag:Spry.Data.Region.PI.buildOpenTagForContent,getCloseTag:Spry.Data.Region.PI.buildCloseTag};
Spry.Data.Region.PI.orderedInstructions=["spry:state","spry:if","spry:repeat","spry:repeatchildren","spry:choose","spry:when","spry:default","spry:content"];
Spry.Data.Region.getTokensFromStr=function(str){if(!str){return null
}return str.match(/{[^}]+}/g)
};
Spry.Data.Region.processDataRefString=function(processingContext,regionStr,dataSetsToUse,isJSExpr){if(!regionStr){return""
}if(!processingContext&&!dataSetsToUse){return regionStr
}var resultStr="";
var re=new RegExp("\\{([^\\}:]+::)?[^\\}]+\\}","g");
var startSearchIndex=0;
while(startSearchIndex<regionStr.length){var reArray=re.exec(regionStr);
if(!reArray||!reArray[0]){resultStr+=regionStr.substr(startSearchIndex,regionStr.length-startSearchIndex);
return resultStr
}if(reArray.index!=startSearchIndex){resultStr+=regionStr.substr(startSearchIndex,reArray.index-startSearchIndex)
}var dsName="";
if(reArray[0].search(/^\{[^}:]+::/)!=-1){dsName=reArray[0].replace(/^\{|::.*/g,"")
}var fieldName=reArray[0].replace(/^\{|.*::|\}/g,"");
var row=null;
var val="";
if(processingContext){val=processingContext.getValueFromDataSet(dsName,fieldName)
}else{var ds=dsName?dataSetsToUse[dsName]:dataSetsToUse[0];
if(ds){val=ds.getValue(fieldName)
}}if(typeof val!="undefined"){val+="";
resultStr+=isJSExpr?Spry.Utils.escapeQuotesAndLineBreaks(val):val
}if(startSearchIndex==re.lastIndex){var leftOverIndex=reArray.index+reArray[0].length;
if(leftOverIndex<regionStr.length){resultStr+=regionStr.substr(leftOverIndex)
}break
}startSearchIndex=re.lastIndex
}return resultStr
};
Spry.Data.Region.strToDataSetsArray=function(str,returnRegionNames){var dataSetsArr=new Array;
var foundHash={};
if(!str){return dataSetsArr
}str=str.replace(/\s+/g," ");
str=str.replace(/^\s|\s$/g,"");
var arr=str.split(/ /);
for(var i=0;
i<arr.length;
i++){if(arr[i]&&!Spry.Data.Region.PI.instructions[arr[i]]){try{var dataSet=Spry.Data.getDataSetByName(arr[i]);
if(!foundHash[arr[i]]){if(returnRegionNames){dataSetsArr.push(arr[i])
}else{dataSetsArr.push(dataSet)
}foundHash[arr[i]]=true
}}catch(e){}}}return dataSetsArr
};
Spry.Data.Region.DSContext=function(dataSet,processingContext){var m_dataSet=dataSet;
var m_processingContext=processingContext;
var m_curRowIndexArray=[{rowIndex:-1}];
var m_parent=null;
var m_children=[];
var getInternalRowIndex=function(){return m_curRowIndexArray[m_curRowIndexArray.length-1].rowIndex
};
this.resetAll=function(){m_curRowIndexArray=[{rowIndex:m_dataSet.getCurrentRow()}]
};
this.getDataSet=function(){return m_dataSet
};
this.getNumRows=function(unfiltered){var data=this.getCurrentState().data;
return data?data.length:m_dataSet.getRowCount(unfiltered)
};
this.getData=function(){var data=this.getCurrentState().data;
return data?data:m_dataSet.getData()
};
this.setData=function(data){this.getCurrentState().data=data
};
this.getValue=function(valueName,rowContext){var result="";
var curState=this.getCurrentState();
var ds=curState.nestedDS?curState.nestedDS:this.getDataSet();
if(ds){result=ds.getValue(valueName,rowContext)
}return result
};
this.getCurrentRow=function(){if(m_curRowIndexArray.length<2||getInternalRowIndex()<0){return m_dataSet.getCurrentRow()
}var data=this.getData();
var curRowIndex=getInternalRowIndex();
if(curRowIndex<0||curRowIndex>data.length){Spry.Debug.reportError("Invalid index used in Spry.Data.Region.DSContext.getCurrentRow()!\n");
return null
}return data[curRowIndex]
};
this.getRowIndex=function(){var curRowIndex=getInternalRowIndex();
if(curRowIndex>=0){return curRowIndex
}return m_dataSet.getRowNumber(m_dataSet.getCurrentRow())
};
this.setRowIndex=function(rowIndex){this.getCurrentState().rowIndex=rowIndex;
var data=this.getData();
var numChildren=m_children.length;
for(var i=0;
i<numChildren;
i++){m_children[i].syncDataWithParentRow(this,rowIndex,data)
}};
this.syncDataWithParentRow=function(parentDSContext,rowIndex,parentData){var row=parentData[rowIndex];
if(row){nestedDS=m_dataSet.getNestedDataSetForParentRow(row);
if(nestedDS){var currentState=this.getCurrentState();
currentState.nestedDS=nestedDS;
currentState.data=nestedDS.getData();
currentState.rowIndex=nestedDS.getCurrentRowNumber();
currentState.rowIndex=currentState.rowIndex<0?0:currentState.rowIndex;
var numChildren=m_children.length;
for(var i=0;
i<numChildren;
i++){m_children[i].syncDataWithParentRow(this,currentState.rowIndex,currentState.data)
}}}};
this.pushState=function(){var curState=this.getCurrentState();
var newState=new Object;
newState.rowIndex=curState.rowIndex;
newState.data=curState.data;
newState.nestedDS=curState.nestedDS;
m_curRowIndexArray.push(newState);
var numChildren=m_children.length;
for(var i=0;
i<numChildren;
i++){m_children[i].pushState()
}};
this.popState=function(){if(m_curRowIndexArray.length<2){Spry.Debug.reportError("Stack underflow in Spry.Data.Region.DSContext.popState()!\n");
return 
}var numChildren=m_children.length;
for(var i=0;
i<numChildren;
i++){m_children[i].popState()
}m_curRowIndexArray.pop()
};
this.getCurrentState=function(){return m_curRowIndexArray[m_curRowIndexArray.length-1]
};
this.addChild=function(childDSContext){var numChildren=m_children.length;
for(var i=0;
i<numChildren;
i++){if(m_children[i]==childDSContext){return 
}}m_children.push(childDSContext)
}
};
Spry.Data.Region.ProcessingContext=function(region){this.region=region;
this.dataSetContexts=[];
if(region&&region.dataSets){var dsArray=region.dataSets.slice(0);
var dsArrayLen=dsArray.length;
for(var i=0;
i<dsArrayLen;
i++){var ds=region.dataSets[i];
while(ds&&ds.getParentDataSet){var doesExist=false;
ds=ds.getParentDataSet();
if(ds&&this.indexOf(dsArray,ds)==-1){dsArray.push(ds)
}}}for(i=0;
i<dsArray.length;
i++){this.dataSetContexts.push(new Spry.Data.Region.DSContext(dsArray[i],this))
}var dsContexts=this.dataSetContexts;
var numDSContexts=dsContexts.length;
for(i=0;
i<numDSContexts;
i++){var dsc=dsContexts[i];
var ds=dsc.getDataSet();
if(ds.getParentDataSet){var parentDS=ds.getParentDataSet();
if(parentDS){var pdsc=this.getDataSetContext(parentDS);
if(pdsc){pdsc.addChild(dsc)
}}}}}};
Spry.Data.Region.ProcessingContext.prototype.indexOf=function(arr,item){if(arr){var arrLen=arr.length;
for(var i=0;
i<arrLen;
i++){if(arr[i]==item){return i
}}}return -1
};
Spry.Data.Region.ProcessingContext.prototype.getDataSetContext=function(dataSet){if(!dataSet){if(this.dataSetContexts.length>0){return this.dataSetContexts[0]
}return null
}if(typeof dataSet=="string"){dataSet=Spry.Data.getDataSetByName(dataSet);
if(!dataSet){return null
}}for(var i=0;
i<this.dataSetContexts.length;
i++){var dsc=this.dataSetContexts[i];
if(dsc.getDataSet()==dataSet){return dsc
}}return null
};
Spry.Data.Region.ProcessingContext.prototype.getValueFromDataSet=function(){var dsName="";
var columnName="";
if(arguments.length>1){dsName=arguments[0];
columnName=arguments[1]
}else{var dataRef=arguments[0].replace(/\s*{\s*|\s*}\s*/g,"");
if(dataRef.search("::")!=-1){dsName=dataRef.replace(/::.*/,"");
columnName=dataRef.replace(/.*::/,"")
}else{columnName=dataRef
}}var result="";
var dsContext=this.getDataSetContext(dsName);
if(dsContext){result=dsContext.getValue(columnName,dsContext.getCurrentRow())
}else{Spry.Debug.reportError("getValueFromDataSet: Failed to get "+dsName+" context for the "+this.region.regionNode.id+" region.\n")
}return result
};
Spry.Data.Region.ProcessingContext.prototype.$v=Spry.Data.Region.ProcessingContext.prototype.getValueFromDataSet;
Spry.Data.Region.ProcessingContext.prototype.getCurrentRowForDataSet=function(dataSet){var dsc=this.getDataSetContext(dataSet);
if(dsc){return dsc.getCurrentRow()
}return null
};
Spry.Data.Region.Token=function(tokenType,dataSet,data,regionStr){var self=this;
this.tokenType=tokenType;
this.dataSet=dataSet;
this.data=data;
this.regionStr=regionStr;
this.parent=null;
this.children=null
};
Spry.Data.Region.Token.prototype.addChild=function(child){if(!child){return 
}if(!this.children){this.children=new Array
}this.children.push(child);
child.parent=this
};
Spry.Data.Region.Token.LIST_TOKEN=0;
Spry.Data.Region.Token.STRING_TOKEN=1;
Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN=2;
Spry.Data.Region.Token.VALUE_TOKEN=3;
Spry.Data.Region.Token.PIData=function(piName,data,jsExpr,regionState){var self=this;
this.name=piName;
this.data=data;
this.jsExpr=jsExpr;
this.regionState=regionState
};
Spry.Utils.addLoadListener(function(){setTimeout(function(){if(Spry.Data.initRegionsOnLoad){Spry.Data.initRegions()
}},0)
});
Spry.Widget.MenuBar=function(element,opts){this.init(element,opts)
};
Spry.Widget.MenuBar.prototype.init=function(element,opts){this.element=this.getElement(element);
this.currMenu=null;
this.showDelay=250;
this.hideDelay=600;
if(typeof document.getElementById=="undefined"||(navigator.vendor=="Apple Computer, Inc."&&typeof window.XMLHttpRequest=="undefined")||(Spry.is.ie&&typeof document.uniqueID=="undefined")){return 
}if(Spry.is.ie&&Spry.is.version<7){try{document.execCommand("BackgroundImageCache",false,true)
}catch(err){}}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(opts){for(var k in opts){if(typeof this[k]=="undefined"){var rollover=new Image;
rollover.src=opts[k]
}}Spry.Widget.MenuBar.setOptions(this,opts)
}if(Spry.is.safari){this.enableKeyboardNavigation=false
}if(this.element){this.currMenu=this.element;
var items=this.element.getElementsByTagName("li");
for(var i=0;
i<items.length;
i++){if(i>0&&this.enableKeyboardNavigation){items[i].getElementsByTagName("a")[0].tabIndex="-1"
}this.initialize(items[i],element);
if(Spry.is.ie){this.addClassName(items[i],this.isieClass);
items[i].style.position="static"
}}if(this.enableKeyboardNavigation){var self=this;
this.addEventListener(document,"keydown",function(e){self.keyDown(e)
},false)
}if(Spry.is.ie){if(this.hasClassName(this.element,this.verticalClass)){this.element.style.position="relative"
}var linkitems=this.element.getElementsByTagName("a");
for(var i=0;
i<linkitems.length;
i++){linkitems[i].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(ele){if(ele&&typeof ele=="string"){return document.getElementById(ele)
}return ele
};
Spry.Widget.MenuBar.prototype.hasClassName=function(ele,className){if(!ele||!className||!ele.className||ele.className.search(new RegExp("\\b"+className+"\\b"))==-1){return false
}return true
};
Spry.Widget.MenuBar.prototype.addClassName=function(ele,className){if(!ele||!className||this.hasClassName(ele,className)){return 
}ele.className+=(ele.className?" ":"")+className
};
Spry.Widget.MenuBar.prototype.removeClassName=function(ele,className){if(!ele||!className||!this.hasClassName(ele,className)){return 
}ele.className=ele.className.replace(new RegExp("\\s*\\b"+className+"\\b","g"),"")
};
Spry.Widget.MenuBar.prototype.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.MenuBar.prototype.createIframeLayer=function(menu){var layer=document.createElement("iframe");
layer.tabIndex="-1";
layer.src='javascript:""';
layer.frameBorder="0";
layer.scrolling="no";
menu.parentNode.appendChild(layer);
layer.style.left=menu.offsetLeft+"px";
layer.style.top=menu.offsetTop+"px";
layer.style.width=menu.offsetWidth+"px";
layer.style.height=menu.offsetHeight+"px"
};
Spry.Widget.MenuBar.prototype.removeIframeLayer=function(menu){var layers=((menu==this.element)?menu:menu.parentNode).getElementsByTagName("iframe");
while(layers.length>0){layers[0].parentNode.removeChild(layers[0])
}};
Spry.Widget.MenuBar.prototype.clearMenus=function(root){var menus=root.getElementsByTagName("ul");
for(var i=0;
i<menus.length;
i++){this.hideSubmenu(menus[i])
}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(menu){if(this.currMenu){this.clearMenus(this.currMenu);
this.currMenu=null
}if(menu){this.addClassName(menu,this.subVisibleClass);
if(typeof document.all!="undefined"&&!Spry.is.opera&&navigator.vendor!="KDE"){if(!this.hasClassName(this.element,this.horizontalClass)||menu.parentNode.parentNode!=this.element){menu.style.top=menu.parentNode.offsetTop+"px"
}}if(Spry.is.ie&&Spry.is.version<7){this.createIframeLayer(menu)
}}this.addClassName(this.element,this.activeClass)
};
Spry.Widget.MenuBar.prototype.hideSubmenu=function(menu){if(menu){this.removeClassName(menu,this.subVisibleClass);
if(typeof document.all!="undefined"&&!Spry.is.opera&&navigator.vendor!="KDE"){menu.style.top="";
menu.style.left=""
}if(Spry.is.ie&&Spry.is.version<7){this.removeIframeLayer(menu)
}}};
Spry.Widget.MenuBar.prototype.initialize=function(listitem,element){var opentime,closetime;
var link=listitem.getElementsByTagName("a")[0];
var submenus=listitem.getElementsByTagName("ul");
var menu=(submenus.length>0?submenus[0]:null);
if(menu){this.addClassName(link,this.hasSubClass)
}if(!Spry.is.ie){listitem.contains=function(testNode){if(testNode==null){return false
}if(testNode==this){return true
}else{return this.contains(testNode.parentNode)
}}
}var self=this;
this.addEventListener(listitem,"mouseover",function(e){self.mouseOver(listitem,e)
},false);
this.addEventListener(listitem,"mouseout",function(e){if(self.enableKeyboardNavigation){self.clearSelection()
}self.mouseOut(listitem,e)
},false);
if(this.enableKeyboardNavigation){this.addEventListener(link,"blur",function(e){self.onBlur(listitem)
},false);
this.addEventListener(link,"focus",function(e){self.keyFocus(listitem,e)
},false)
}};
Spry.Widget.MenuBar.prototype.keyFocus=function(listitem,e){this.lastOpen=listitem.getElementsByTagName("a")[0];
this.addClassName(this.lastOpen,listitem.getElementsByTagName("ul").length>0?this.subHoverClass:this.hoverClass);
this.hasFocus=true
};
Spry.Widget.MenuBar.prototype.onBlur=function(listitem){this.clearSelection(listitem)
};
Spry.Widget.MenuBar.prototype.clearSelection=function(el){if(!this.lastOpen){return 
}if(el){el=el.getElementsByTagName("a")[0];
var item=this.lastOpen;
while(item!=this.element){var tmp=el;
while(tmp!=this.element){if(tmp==item){return 
}try{tmp=tmp.parentNode
}catch(err){break
}}item=item.parentNode
}}var item=this.lastOpen;
while(item!=this.element){this.hideSubmenu(item.parentNode);
var link=item.getElementsByTagName("a")[0];
this.removeClassName(link,this.hoverClass);
this.removeClassName(link,this.subHoverClass);
item=item.parentNode
}this.lastOpen=false
};
Spry.Widget.MenuBar.prototype.keyDown=function(e){if(!this.hasFocus){return 
}if(!this.lastOpen){this.hasFocus=false;
return 
}var e=e||event;
var listitem=this.lastOpen.parentNode;
var link=this.lastOpen;
var submenus=listitem.getElementsByTagName("ul");
var menu=(submenus.length>0?submenus[0]:null);
var hasSubMenu=(menu)?true:false;
var opts=[listitem,menu,null,this.getSibling(listitem,"previousSibling"),this.getSibling(listitem,"nextSibling")];
if(!opts[3]){opts[2]=(listitem.parentNode.parentNode.nodeName.toLowerCase()=="li")?listitem.parentNode.parentNode:null
}var found=0;
switch(e.keyCode){case this.upKeyCode:found=this.getElementForKey(opts,"y",1);
break;
case this.downKeyCode:found=this.getElementForKey(opts,"y",-1);
break;
case this.leftKeyCode:found=this.getElementForKey(opts,"x",1);
break;
case this.rightKeyCode:found=this.getElementForKey(opts,"x",-1);
break;
case this.escKeyCode:case 9:this.clearSelection();
this.hasFocus=false;
default:return 
}switch(found){case 0:return ;
case 1:this.mouseOver(listitem,e);
break;
case 2:this.mouseOut(opts[2],e);
break;
case 3:case 4:this.removeClassName(link,hasSubMenu?this.subHoverClass:this.hoverClass);
break
}var link=opts[found].getElementsByTagName("a")[0];
if(opts[found].nodeName.toLowerCase()=="ul"){opts[found]=opts[found].getElementsByTagName("li")[0]
}this.addClassName(link,opts[found].getElementsByTagName("ul").length>0?this.subHoverClass:this.hoverClass);
this.lastOpen=link;
opts[found].getElementsByTagName("a")[0].focus();
return Spry.Widget.MenuBar.stopPropagation(e)
};
Spry.Widget.MenuBar.prototype.mouseOver=function(listitem,e){var link=listitem.getElementsByTagName("a")[0];
var submenus=listitem.getElementsByTagName("ul");
var menu=(submenus.length>0?submenus[0]:null);
var hasSubMenu=(menu)?true:false;
if(this.enableKeyboardNavigation){this.clearSelection(listitem)
}if(this.bubbledTextEvent()){return 
}if(listitem.closetime){clearTimeout(listitem.closetime)
}if(this.currMenu==listitem){this.currMenu=null
}if(this.hasFocus){link.focus()
}this.addClassName(link,hasSubMenu?this.subHoverClass:this.hoverClass);
this.lastOpen=link;
if(menu&&!this.hasClassName(menu,this.subHoverClass)){var self=this;
listitem.opentime=window.setTimeout(function(){self.showSubmenu(menu)
},this.showDelay)
}};
Spry.Widget.MenuBar.prototype.mouseOut=function(listitem,e){var link=listitem.getElementsByTagName("a")[0];
var submenus=listitem.getElementsByTagName("ul");
var menu=(submenus.length>0?submenus[0]:null);
var hasSubMenu=(menu)?true:false;
if(this.bubbledTextEvent()){return 
}var related=(typeof e.relatedTarget!="undefined"?e.relatedTarget:e.toElement);
if(!listitem.contains(related)){if(listitem.opentime){clearTimeout(listitem.opentime)
}this.currMenu=listitem;
this.removeClassName(link,hasSubMenu?this.subHoverClass:this.hoverClass);
if(menu){var self=this;
listitem.closetime=window.setTimeout(function(){self.hideSubmenu(menu)
},this.hideDelay)
}if(this.hasFocus){link.blur()
}}};
Spry.Widget.MenuBar.prototype.getSibling=function(element,sibling){var child=element[sibling];
while(child&&child.nodeName.toLowerCase()!="li"){child=child[sibling]
}return child
};
Spry.Widget.MenuBar.prototype.getElementForKey=function(els,prop,dir){var found=0;
var rect=Spry.Widget.MenuBar.getPosition;
var ref=rect(els[found]);
var hideSubmenu=false;
if(els[1]&&!this.hasClassName(els[1],this.MenuBarSubmenuVisible)){els[1].style.visibility="hidden";
this.showSubmenu(els[1]);
hideSubmenu=true
}var isVert=this.hasClassName(this.element,this.verticalClass);
var hasParent=els[0].parentNode.parentNode.nodeName.toLowerCase()=="li"?true:false;
for(var i=1;
i<els.length;
i++){if(prop=="y"&&isVert&&(i==1||i==2)){continue
}if(prop=="x"&&!isVert&&!hasParent&&(i==1||i==2)){continue
}if(els[i]){var tmp=rect(els[i]);
if((dir*tmp[prop])<(dir*ref[prop])){ref=tmp;
found=i
}}}if(els[1]&&hideSubmenu){this.hideSubmenu(els[1]);
els[1].style.visibility=""
}return found
};
Spry.Widget.MenuBar.camelize=function(str){if(str.indexOf("-")==-1){return str
}var oStringList=str.split("-");
var isFirstEntry=true;
var camelizedString="";
for(var i=0;
i<oStringList.length;
i++){if(oStringList[i].length>0){if(isFirstEntry){camelizedString=oStringList[i];
isFirstEntry=false
}else{var s=oStringList[i];
camelizedString+=s.charAt(0).toUpperCase()+s.substring(1)
}}}return camelizedString
};
Spry.Widget.MenuBar.getStyleProp=function(element,prop){var value;
try{if(element.style){value=element.style[Spry.Widget.MenuBar.camelize(prop)]
}if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);
value=css?css.getPropertyValue(prop):null
}else{if(element.currentStyle){value=element.currentStyle[Spry.Widget.MenuBar.camelize(prop)]
}}}}catch(e){}return value=="auto"?null:value
};
Spry.Widget.MenuBar.getIntProp=function(element,prop){var a=parseInt(Spry.Widget.MenuBar.getStyleProp(element,prop),10);
if(isNaN(a)){return 0
}return a
};
Spry.Widget.MenuBar.getPosition=function(el,doc){doc=doc||document;
if(typeof (el)=="string"){el=doc.getElementById(el)
}if(!el){return false
}if(el.parentNode===null||Spry.Widget.MenuBar.getStyleProp(el,"display")=="none"){return false
}var ret={x:0,y:0};
var parent=null;
var box;
if(el.getBoundingClientRect){box=el.getBoundingClientRect();
var scrollTop=doc.documentElement.scrollTop||doc.body.scrollTop;
var scrollLeft=doc.documentElement.scrollLeft||doc.body.scrollLeft;
ret.x=box.left+scrollLeft;
ret.y=box.top+scrollTop
}else{if(doc.getBoxObjectFor){box=doc.getBoxObjectFor(el);
ret.x=box.x;
ret.y=box.y
}else{ret.x=el.offsetLeft;
ret.y=el.offsetTop;
parent=el.offsetParent;
if(parent!=el){while(parent){ret.x+=parent.offsetLeft;
ret.y+=parent.offsetTop;
parent=parent.offsetParent
}}if(Spry.is.opera||Spry.is.safari&&Spry.Widget.MenuBar.getStyleProp(el,"position")=="absolute"){ret.y-=doc.body.offsetTop
}}}if(el.parentNode){parent=el.parentNode
}else{parent=null
}if(parent.nodeName){var cas=parent.nodeName.toUpperCase();
while(parent&&cas!="BODY"&&cas!="HTML"){cas=parent.nodeName.toUpperCase();
ret.x-=parent.scrollLeft;
ret.y-=parent.scrollTop;
if(parent.parentNode){parent=parent.parentNode
}else{parent=null
}}}return ret
};
Spry.Widget.MenuBar.stopPropagation=function(ev){if(ev.stopPropagation){ev.stopPropagation()
}else{ev.cancelBubble=true
}if(ev.preventDefault){ev.preventDefault()
}else{ev.returnValue=false
}};
Spry.Widget.MenuBar.setOptions=function(obj,optionsObj,ignoreUndefinedProps){if(!optionsObj){return 
}for(var optionName in optionsObj){if(ignoreUndefinedProps&&optionsObj[optionName]==undefined){continue
}obj[optionName]=optionsObj[optionName]
}};
var Spry;
if(!Spry){Spry={}
}if(!Spry.Widget){Spry.Widget={}
}Spry.Widget.SlidingPanels=function(element,opts){this.element=this.getElement(element);
this.enableAnimation=true;
this.currentPanel=null;
this.enableKeyboardNavigation=true;
this.hasFocus=false;
this.previousPanelKeyCode=Spry.Widget.SlidingPanels.KEY_LEFT;
this.nextPanelKeyCode=Spry.Widget.SlidingPanels.KEY_RIGHT;
this.currentPanelClass="SlidingPanelsCurrentPanel";
this.focusedClass="SlidingPanelsFocused";
this.animatingClass="SlidingPanelsAnimating";
Spry.Widget.SlidingPanels.setOptions(this,opts);
if(this.element){this.element.style.overflow="hidden"
}if(this.defaultPanel){if(typeof this.defaultPanel=="number"){this.currentPanel=this.getContentPanels()[this.defaultPanel]
}else{this.currentPanel=this.getElement(this.defaultPanel)
}}if(!this.currentPanel){this.currentPanel=this.getContentPanels()[0]
}if(Spry.Widget.SlidingPanels.onloadDidFire){this.attachBehaviors()
}else{Spry.Widget.SlidingPanels.loadQueue.push(this)
}};
Spry.Widget.SlidingPanels.prototype.onFocus=function(e){this.hasFocus=true;
this.addClassName(this.element,this.focusedClass);
return false
};
Spry.Widget.SlidingPanels.prototype.onBlur=function(e){this.hasFocus=false;
this.removeClassName(this.element,this.focusedClass);
return false
};
Spry.Widget.SlidingPanels.KEY_LEFT=37;
Spry.Widget.SlidingPanels.KEY_UP=38;
Spry.Widget.SlidingPanels.KEY_RIGHT=39;
Spry.Widget.SlidingPanels.KEY_DOWN=40;
Spry.Widget.SlidingPanels.prototype.onKeyDown=function(e){var key=e.keyCode;
if(!this.hasFocus||(key!=this.previousPanelKeyCode&&key!=this.nextPanelKeyCode)){return true
}if(key==this.nextPanelKeyCode){this.showNextPanel()
}else{this.showPreviousPanel()
}if(e.preventDefault){e.preventDefault()
}else{e.returnValue=false
}if(e.stopPropagation){e.stopPropagation()
}else{e.cancelBubble=true
}return false
};
Spry.Widget.SlidingPanels.prototype.attachBehaviors=function(){var ele=this.element;
if(!ele){return 
}if(this.enableKeyboardNavigation){var focusEle=null;
var tabIndexAttr=ele.attributes.getNamedItem("tabindex");
if(tabIndexAttr||ele.nodeName.toLowerCase()=="a"){focusEle=ele
}if(focusEle){var self=this;
Spry.Widget.SlidingPanels.addEventListener(focusEle,"focus",function(e){return self.onFocus(e||window.event)
},false);
Spry.Widget.SlidingPanels.addEventListener(focusEle,"blur",function(e){return self.onBlur(e||window.event)
},false);
Spry.Widget.SlidingPanels.addEventListener(focusEle,"keydown",function(e){return self.onKeyDown(e||window.event)
},false)
}}if(this.currentPanel){var ea=this.enableAnimation;
this.enableAnimation=false;
this.showPanel(this.currentPanel);
this.enableAnimation=ea
}};
Spry.Widget.SlidingPanels.prototype.getElement=function(ele){if(ele&&typeof ele=="string"){return document.getElementById(ele)
}return ele
};
Spry.Widget.SlidingPanels.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.SlidingPanels.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.SlidingPanels.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.SlidingPanels.prototype.getElementChildren=function(element){var children=[];
var child=element.firstChild;
while(child){if(child.nodeType==1){children.push(child)
}child=child.nextSibling
}return children
};
Spry.Widget.SlidingPanels.prototype.getCurrentPanel=function(){return this.currentPanel
};
Spry.Widget.SlidingPanels.prototype.getContentGroup=function(){return this.getElementChildren(this.element)[0]
};
Spry.Widget.SlidingPanels.prototype.getContentPanels=function(){return this.getElementChildren(this.getContentGroup())
};
Spry.Widget.SlidingPanels.prototype.getContentPanelsCount=function(){return this.getContentPanels().length
};
Spry.Widget.SlidingPanels.onloadDidFire=false;
Spry.Widget.SlidingPanels.loadQueue=[];
Spry.Widget.SlidingPanels.addLoadListener=function(handler){if(typeof window.addEventListener!="undefined"){window.addEventListener("load",handler,false)
}else{if(typeof document.addEventListener!="undefined"){document.addEventListener("load",handler,false)
}else{if(typeof window.attachEvent!="undefined"){window.attachEvent("onload",handler)
}}}};
Spry.Widget.SlidingPanels.processLoadQueue=function(handler){Spry.Widget.SlidingPanels.onloadDidFire=true;
var q=Spry.Widget.SlidingPanels.loadQueue;
var qlen=q.length;
for(var i=0;
i<qlen;
i++){q[i].attachBehaviors()
}};
Spry.Widget.SlidingPanels.addLoadListener(Spry.Widget.SlidingPanels.processLoadQueue);
Spry.Widget.SlidingPanels.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.SlidingPanels.prototype.getContentPanelIndex=function(ele){if(ele){ele=this.getElement(ele);
var panels=this.getContentPanels();
var numPanels=panels.length;
for(var i=0;
i<numPanels;
i++){if(panels[i]==ele){return i
}}}return -1
};
Spry.Widget.SlidingPanels.prototype.showPanel=function(elementOrIndex){var pIndex=-1;
if(typeof elementOrIndex=="number"){pIndex=elementOrIndex
}else{pIndex=this.getContentPanelIndex(elementOrIndex)
}var numPanels=this.getContentPanelsCount();
if(numPanels>0){pIndex=(pIndex>=numPanels)?numPanels-1:pIndex
}else{pIndex=0
}var panel=this.getContentPanels()[pIndex];
var contentGroup=this.getContentGroup();
if(panel&&contentGroup){if(this.currentPanel){this.removeClassName(this.currentPanel,this.currentPanelClass)
}this.currentPanel=panel;
var nx=-panel.offsetLeft;
var ny=-panel.offsetTop;
if(this.enableAnimation){if(this.animator){this.animator.stop()
}var cx=contentGroup.offsetLeft;
var cy=contentGroup.offsetTop;
if(cx!=nx||cy!=ny){var self=this;
this.addClassName(this.element,this.animatingClass);
this.animator=new Spry.Widget.SlidingPanels.PanelAnimator(contentGroup,cx,cy,nx,ny,{duration:this.duration,fps:this.fps,transition:this.transition,finish:function(){self.removeClassName(self.element,self.animatingClass);
self.addClassName(panel,self.currentPanelClass)
}});
this.animator.start()
}}else{contentGroup.style.left=nx+"px";
contentGroup.style.top=ny+"px";
this.addClassName(panel,this.currentPanelClass)
}}return panel
};
Spry.Widget.SlidingPanels.prototype.showFirstPanel=function(){return this.showPanel(0)
};
Spry.Widget.SlidingPanels.prototype.showLastPanel=function(){return this.showPanel(this.getContentPanels().length-1)
};
Spry.Widget.SlidingPanels.prototype.showPreviousPanel=function(){if(this.getContentPanelIndex(this.currentPanel)<=1){if(this.getElement("prevControl")){this.getElement("prevControl").style.visibility="hidden"
}}return this.showPanel(this.getContentPanelIndex(this.currentPanel)-1)
};
Spry.Widget.SlidingPanels.prototype.showNextPanel=function(){if(this.getContentPanelIndex(this.currentPanel)>=0){if(this.getElement("prevControl")){this.getElement("prevControl").style.visibility="visible"
}}return this.showPanel(this.getContentPanelIndex(this.currentPanel)+1)
};
Spry.Widget.SlidingPanels.PanelAnimator=function(ele,curX,curY,dstX,dstY,opts){this.element=ele;
this.curX=curX;
this.curY=curY;
this.dstX=dstX;
this.dstY=dstY;
this.fps=60;
this.duration=500;
this.transition=Spry.Widget.SlidingPanels.PanelAnimator.defaultTransition;
this.startTime=0;
this.timerID=0;
this.finish=null;
var self=this;
this.intervalFunc=function(){self.step()
};
Spry.Widget.SlidingPanels.setOptions(this,opts,true);
this.interval=1000/this.fps
};
Spry.Widget.SlidingPanels.PanelAnimator.defaultTransition=function(time,begin,finish,duration){time/=duration;
return begin+((2-time)*time*finish)
};
Spry.Widget.SlidingPanels.PanelAnimator.prototype.start=function(){this.stop();
this.startTime=(new Date()).getTime();
this.timerID=setTimeout(this.intervalFunc,this.interval)
};
Spry.Widget.SlidingPanels.PanelAnimator.prototype.stop=function(){if(this.timerID){clearTimeout(this.timerID)
}this.timerID=0
};
Spry.Widget.SlidingPanels.PanelAnimator.prototype.step=function(){var elapsedTime=(new Date()).getTime()-this.startTime;
var done=elapsedTime>=this.duration;
var x,y;
if(done){x=this.curX=this.dstX;
y=this.curY=this.dstY
}else{x=this.transition(elapsedTime,this.curX,this.dstX-this.curX,this.duration);
y=this.transition(elapsedTime,this.curY,this.dstY-this.curY,this.duration)
}this.element.style.left=x+"px";
this.element.style.top=y+"px";
if(!done){this.timerID=setTimeout(this.intervalFunc,this.interval)
}else{if(this.finish){this.finish()
}}};
var defTabVal=0;
Spry.Widget.TabbedPanels=function(element,opts){this.element=this.getElement(element);
this.defaultTab=Number(defTabVal);
this.bindings=[];
this.tabSelectedClass="TabbedPanelsTabSelected";
this.tabHoverClass="TabbedPanelsTabHover";
this.tabFocusedClass="TabbedPanelsTabFocused";
this.panelVisibleClass="TabbedPanelsContentVisible";
this.tabDisabledClass="disabled";
this.showDisabledTab="false";
this.focusElement=null;
this.hasFocus=false;
this.currentTabIndex=0;
this.enableKeyboardNavigation=true;
this.nextPanelKeyCode=Spry.Widget.TabbedPanels.KEY_RIGHT;
this.previousPanelKeyCode=Spry.Widget.TabbedPanels.KEY_LEFT;
this.tabStateHiddenField=element+"Control";
this.defaultPanel=-1;
this.tabsOnly=false;
Spry.Widget.TabbedPanels.setOptions(this,opts);
this.setDefaultTabState();
this.attachBehaviors()
};
Spry.Widget.TabbedPanels.prototype.setDefaultTabState=function(){if(this.getElement(this.tabStateHiddenField)){if(this.getElement(this.tabStateHiddenField).value!=""){defTabVal=this.getElement(this.tabStateHiddenField).value
}else{defTabVal=0
}this.defaultTab=Number(defTabVal)
}if(typeof (this.defaultTab)=="number"){if(this.defaultTab<0){this.defaultTab=0
}else{var count=this.getTabbedPanelCount();
if(this.defaultTab>=count){this.defaultTab=(count>1)?(count-1):0
}}this.defaultTab=this.getTabs()[this.defaultTab]
}if(this.defaultTab){this.defaultTab=this.getElement(this.defaultTab)
}};
Spry.Widget.TabbedPanels.prototype.getElement=function(ele){if(ele&&typeof ele=="string"){return document.getElementById(ele)
}return ele
};
Spry.Widget.TabbedPanels.prototype.getElementChildren=function(element){var children=[];
var child=element.firstChild;
while(child){if(child.nodeType==1){children.push(child)
}child=child.nextSibling
}return children
};
Spry.Widget.TabbedPanels.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.TabbedPanels.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.TabbedPanels.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.TabbedPanels.prototype.getTabGroup=function(){if(this.element){var children=this.getElementChildren(this.element);
if(children.length){return children[0]
}}return null
};
Spry.Widget.TabbedPanels.prototype.getTabs=function(){var tabs=[];
var tg=this.getTabGroup();
if(tg){tabs=this.getElementChildren(tg)
}return tabs
};
Spry.Widget.TabbedPanels.prototype.getContentPanelGroup=function(){if(this.element){var children=this.getElementChildren(this.element);
if(children.length>1){return children[1]
}}return null
};
Spry.Widget.TabbedPanels.prototype.getContentPanels=function(){var panels=[];
var pg=this.getContentPanelGroup();
if(pg){panels=this.getElementChildren(pg)
}return panels
};
Spry.Widget.TabbedPanels.prototype.getIndex=function(ele,arr){ele=this.getElement(ele);
if(ele&&arr&&arr.length){for(var i=0;
i<arr.length;
i++){if(ele==arr[i]){return i
}}}return -1
};
Spry.Widget.TabbedPanels.prototype.getTabIndex=function(ele){var i=this.getIndex(ele,this.getTabs());
if(i<0){i=this.getIndex(ele,this.getContentPanels())
}return i
};
Spry.Widget.TabbedPanels.prototype.getCurrentTabIndex=function(){return this.currentTabIndex
};
Spry.Widget.TabbedPanels.prototype.getTabbedPanelCount=function(ele){if(!this.tabsOnly){return Math.min(this.getTabs().length,this.getContentPanels().length)
}return this.getTabs().length
};
Spry.Widget.TabbedPanels.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.TabbedPanels.prototype.cancelEvent=function(e){if(e.preventDefault){e.preventDefault()
}else{e.returnValue=false
}if(e.stopPropagation){e.stopPropagation()
}else{e.cancelBubble=true
}return false
};
Spry.Widget.TabbedPanels.prototype.isDisabled=function(e,tab){if(this.hasClassName(tab,this.tabDisabledClass)){return true
}return false
};
Spry.Widget.TabbedPanels.prototype.onTabClick=function(e,tab){this.showPanel(tab);
return this.cancelEvent(e)
};
Spry.Widget.TabbedPanels.prototype.onTabMouseOver=function(e,tab){this.addClassName(tab,this.tabHoverClass);
return false
};
Spry.Widget.TabbedPanels.prototype.onTabMouseOut=function(e,tab){this.removeClassName(tab,this.tabHoverClass);
return false
};
Spry.Widget.TabbedPanels.prototype.onTabFocus=function(e,tab){this.hasFocus=true;
this.addClassName(tab,this.tabFocusedClass);
return false
};
Spry.Widget.TabbedPanels.prototype.onTabBlur=function(e,tab){this.hasFocus=false;
this.removeClassName(tab,this.tabFocusedClass);
return false
};
Spry.Widget.TabbedPanels.KEY_UP=38;
Spry.Widget.TabbedPanels.KEY_DOWN=40;
Spry.Widget.TabbedPanels.KEY_LEFT=37;
Spry.Widget.TabbedPanels.KEY_RIGHT=39;
Spry.Widget.TabbedPanels.prototype.onTabKeyDown=function(e,tab){var key=e.keyCode;
if(!this.hasFocus||(key!=this.previousPanelKeyCode&&key!=this.nextPanelKeyCode)){return true
}var tabs=this.getTabs();
for(var i=0;
i<tabs.length;
i++){if(tabs[i]==tab){var el=false;
if(key==this.previousPanelKeyCode&&i>0){el=tabs[i-1]
}else{if(key==this.nextPanelKeyCode&&i<tabs.length-1){el=tabs[i+1]
}}if(el){this.showPanel(el);
el.focus();
break
}}}return this.cancelEvent(e)
};
Spry.Widget.TabbedPanels.prototype.preorderTraversal=function(root,func){var stopTraversal=false;
if(root){stopTraversal=func(root);
if(root.hasChildNodes()){var child=root.firstChild;
while(!stopTraversal&&child){stopTraversal=this.preorderTraversal(child,func);
try{child=child.nextSibling
}catch(e){child=null
}}}}return stopTraversal
};
Spry.Widget.TabbedPanels.prototype.addPanelEventListeners=function(tab,panel){var self=this;
Spry.Widget.TabbedPanels.addEventListener(tab,"click",function(e){return self.onTabClick(e,tab)
},false);
Spry.Widget.TabbedPanels.addEventListener(tab,"mouseover",function(e){return self.onTabMouseOver(e,tab)
},false);
Spry.Widget.TabbedPanels.addEventListener(tab,"mouseout",function(e){return self.onTabMouseOut(e,tab)
},false);
if(this.enableKeyboardNavigation){var tabIndexEle=null;
var tabAnchorEle=null;
this.preorderTraversal(tab,function(node){if(node.nodeType==1){var tabIndexAttr=tab.attributes.getNamedItem("tabindex");
if(tabIndexAttr){tabIndexEle=node;
return true
}if(!tabAnchorEle&&node.nodeName.toLowerCase()=="a"){tabAnchorEle=node
}}return false
});
if(tabIndexEle){this.focusElement=tabIndexEle
}else{if(tabAnchorEle){this.focusElement=tabAnchorEle
}}if(this.focusElement){Spry.Widget.TabbedPanels.addEventListener(this.focusElement,"focus",function(e){return self.onTabFocus(e,tab)
},false);
Spry.Widget.TabbedPanels.addEventListener(this.focusElement,"blur",function(e){return self.onTabBlur(e,tab)
},false);
Spry.Widget.TabbedPanels.addEventListener(this.focusElement,"keydown",function(e){return self.onTabKeyDown(e,tab)
},false)
}}};
Spry.Widget.TabbedPanels.prototype.showPanel=function(elementOrIndex){var tpIndex=-1;
if(typeof elementOrIndex=="number"){tpIndex=elementOrIndex
}else{tpIndex=this.getTabIndex(elementOrIndex)
}if(!tpIndex<0||(tpIndex>=this.getTabbedPanelCount()&&!this.tabsOnly)){return 
}var tabs=this.getTabs();
if((tabs[tpIndex].className.indexOf(this.tabDisabledClass)>=0)&&!this.showDisabledTab){return 
}var panels="";
var numTabbedPanels=tabs.length;
if(!this.tabsOnly){panels=this.getContentPanels();
numTabbedPanels=Math.max(tabs.length,panels.length)
}for(var i=0;
i<numTabbedPanels;
i++){if(i!=tpIndex){if(tabs[i]){this.removeClassName(tabs[i],this.tabSelectedClass)
}if(panels[i]&&!this.tabsOnly){this.removeClassName(panels[i],this.panelVisibleClass);
panels[i].style.display="none"
}}}this.addClassName(tabs[tpIndex],this.tabSelectedClass);
if(!this.tabsOnly){this.addClassName(panels[tpIndex],this.panelVisibleClass);
panels[tpIndex].style.display="block"
}this.currentTabIndex=tpIndex;
if(this.getElement(this.tabStateHiddenField)){var controlObj=this.getElement(this.tabStateHiddenField);
controlObj.value=tpIndex
}if(this.defaultPanel>=0){this.showDefaultPanel()
}};
Spry.Widget.TabbedPanels.prototype.attachBehaviors=function(element){var tabs=this.getTabs();
var panels=this.getContentPanels();
var panelCount=tabs.length;
if(!this.tabsOnly){panelCount=this.getTabbedPanelCount()
}for(var i=0;
i<panelCount;
i++){this.addPanelEventListeners(tabs[i],panels[i])
}this.showPanel(this.defaultTab)
};
Spry.Widget.TabbedPanels.prototype.disable=function(elementOrIndex){var tpIndex=-1;
if(typeof elementOrIndex=="number"){tpIndex=elementOrIndex
}else{tpIndex=this.getTabIndex(elementOrIndex)
}if(!tpIndex<0||tpIndex>=this.getTabbedPanelCount()){return 
}var tabs=this.getTabs();
if(tabs[tpIndex].className.indexOf(this.tabDisabledClass)>=0){return 
}this.addClassName(tabs[tpIndex],this.tabDisabledClass)
};
Spry.Widget.TabbedPanels.prototype.enable=function(elementOrIndex){var tpIndex=-1;
if(typeof elementOrIndex=="number"){tpIndex=elementOrIndex
}else{tpIndex=this.getTabIndex(elementOrIndex)
}if(!tpIndex<0||tpIndex>=this.getTabbedPanelCount()){return 
}var tabs=this.getTabs();
if(tabs[tpIndex].className.indexOf(this.tabDisabledClass)>=0){this.removeClassName(tabs[tpIndex],this.tabDisabledClass)
}};
Spry.Widget.TabbedPanels.prototype.showDefaultPanel=function(elementOrIndex){var tabs=this.getTabs();
var panels=this.getContentPanels();
var defaultElementOrIndex=this.defaultTab;
if(typeof defaultElementOrIndex=="number"){tpIndex=defaultElementOrIndex
}else{tpIndex=this.getTabIndex(defaultElementOrIndex)
}if(typeof elementOrIndex=="number"){tabIndex=elementOrIndex
}else{tabIndex=this.getTabIndex(elementOrIndex)
}var numTabbedPanels=tabs.length;
for(var i=0;
i<numTabbedPanels;
i++){if(i!=tabIndex){if(tabs[i]){this.removeClassName(tabs[i],this.tabSelectedClass)
}if(panels[i]){this.removeClassName(panels[i],this.panelVisibleClass);
panels[i].style.display="none"
}}}if(tabIndex<0){tabIndex=0
}this.addClassName(tabs[tabIndex],this.tabSelectedClass);
this.addClassName(panels[tpIndex],this.panelVisibleClass);
panels[tpIndex].style.display="block"
};
Spry.Widget.TabbedPanels.prototype.hidePanels=function(){var tabs=this.getTabs();
var panels=this.getContentPanels();
var numTabbedPanels=Math.max(tabs.length,panels.length);
for(var i=0;
i<numTabbedPanels;
i++){if(tabs[i]){this.removeClassName(tabs[i],this.tabSelectedClass)
}if(panels[i]){this.removeClassName(panels[i],this.panelVisibleClass);
panels[i].style.display="none"
}}this.currentTabIndex=-1
};
Spry.Widget.TabbedPanels.prototype.tabClickSubmit=function(ele,value) {var panels=this.getContentPanels();
var tabIndex=this.currentTabIndex;
var panel=panels[tabIndex];
if (!panel)	return;
var panelFormEle=null;
this.preorderTraversal(panel, function(node) {if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
{if (!panelFormEle && node.nodeName.toLowerCase() == "form") {panelFormEle=node;
if(typeof(ele) != 'undefined' && typeof(value) != 'undefined') {
setDefaultTab=document.getElementById(ele+tabIndex);
setDefaultTab.value=value;}
panelFormEle.submit();
return(1);
}}return(0);
});
};
Spry.Widget.Tooltip=function(tooltip_element,trigger_selector,options){options=Spry.Widget.Utils.firstValid(options,{});
this.init(trigger_selector,tooltip_element,options);
if(Spry.Widget.Tooltip.onloadDidFire){this.attachBehaviors()
}Spry.Widget.Tooltip.loadQueue.push(this)
};
Spry.Widget.Tooltip.prototype.init=function(trigger_element,tooltip_element,options){var Utils=Spry.Widget.Utils;
var hiddenPanel=document.getElementById(tooltip_element);
if(Utils.hasClassName(hiddenPanel,'hidden')) {Utils.removeClassName(hiddenPanel,'hidden');}
options.showDelay=parseInt(Utils.firstValid(options.showDelay,0),10);
options.hideDelay=parseInt(Utils.firstValid(options.hideDelay,0),10);
this.listenersAttached=false;
this.hoverClass="";
this.followMouse=false;
this.offsetX=15;
this.offsetY=15;
this.closeOnTooltipLeave=false;
this.useEffect=false;
this.triggerTag="*";
Utils.setOptions(this,options);
this.triggerElements=Utils.getElementsByClassName(trigger_element,this.triggerTag);
this.tooltipElement=Utils.getElement(tooltip_element);
if(typeof this.triggerElements=="undefined"||!(this.triggerElements.length>0)){this.showError('The element(s) "'+trigger_element+'" do not exist in the page');
return false
}if(typeof this.tooltipElement=="undefined"||!this.tooltipElement){this.showError('The element "'+tooltip_element+'" do not exists in the page');
return false
}this.animator=null;
for(var i=0;
i<this.triggerElements.length;
i++){if(!this.triggerElements[i].className){this.triggerElements[i].className=""
}}if(this.useEffect){switch(this.useEffect.toString().toLowerCase()){case"blind":this.useEffect="Blind";
break;
case"fade":this.useEffect="Fade";
break;
default:this.useEffect=false
}}this.visibleTooltip=false;
this.tooltipElement.offsetHeight;
if(Spry.Widget.Utils.getStyleProperty(this.tooltipElement,"display")!="none"){this.tooltipElement.style.display="none"
}if(typeof this.offsetX!="numeric"){this.offsetX=parseInt(this.offsetX,10)
}if(isNaN(this.offsetX)){this.offsetX=0
}if(typeof this.offsetY!="numeric"){this.offsetY=parseInt(this.offsetY,10)
}if(isNaN(this.offsetY)){this.offsetY=0
}this.tooltipElement.style.position="absolute";
this.tooltipElement.style.top="0px";
this.tooltipElement.style.left="0px"
};
Spry.Widget.Tooltip.onloadDidFire=false;
Spry.Widget.Tooltip.loadQueue=[];
Spry.Widget.Tooltip.addLoadListener=function(handler){if(typeof window.addEventListener!="undefined"){window.addEventListener("load",handler,false)
}else{if(typeof document.addEventListener!="undefined"){document.addEventListener("load",handler,false)
}else{if(typeof window.attachEvent!="undefined"){window.attachEvent("onload",handler)
}}}};
Spry.Widget.Tooltip.processLoadQueue=function(handler){Spry.Widget.Tooltip.onloadDidFire=true;
var q=Spry.Widget.Tooltip.loadQueue;
var qlen=q.length;
for(var i=0;
i<qlen;
i++){if(!q[i].listenersAttached){q[i].attachBehaviors()
}}};
Spry.Widget.Tooltip.addLoadListener(Spry.Widget.Tooltip.processLoadQueue);
Spry.Widget.Tooltip.prototype.addClassName=function(ele,className){if(!ele||!className){return 
}if(ele.className.indexOf(className)==-1){ele.className+=(ele.className?" ":"")+className
}};
Spry.Widget.Tooltip.prototype.removeClassName=function(ele,className){if(!ele||!className){return 
}ele.className=ele.className.replace(new RegExp("\\s*\\b"+className+"\\b","g"),"")
};
Spry.Widget.Tooltip.prototype.showTooltip=function(){if(!this.visibleTooltip){this.tooltipElement.style.visibility="hidden";
this.tooltipElement.style.zIndex="9999";
this.tooltipElement.style.display="block"
}Spry.Widget.Utils.putElementAt(this.tooltipElement,this.pos,{x:this.offsetX,y:this.offsetY},true);
if(Spry.is.ie&&Spry.is.version=="6"){this.createIframeLayer(this.tooltipElement)
}if(!this.visibleTooltip){if(this.useEffect){if(typeof this.showEffect=="undefined"){this.showEffect=new Spry.Widget.Tooltip[this.useEffect](this.tooltipElement,{from:0,to:1})
}this.showEffect.start()
}else{this.tooltipElement.style.visibility="visible"
}}this.visibleTooltip=true
};
Spry.Widget.Tooltip.prototype.hideTooltip=function(quick){if(this.useEffect&&!quick){if(typeof this.hideEffect=="undefined"){this.hideEffect=new Spry.Widget.Tooltip[this.useEffect](this.tooltipElement,{from:1,to:0})
}this.hideEffect.start()
}else{if(typeof this.showEffect!="undefined"){this.showEffect.stop()
}this.tooltipElement.style.display="none"
}if(Spry.is.ie&&Spry.is.version=="6"){this.removeIframeLayer(this.tooltipElement)
}if(this.hoverClass&&!this.hideTimer){for(var i=0;
i<this.triggerElements.length;
i++){this.removeClassName(this.triggerElements[i],this.hoverClass)
}}this.visibleTooltip=false
};
Spry.Widget.Tooltip.prototype.displayTooltip=function(show){if(this.tooltipElement){if(this.hoverClass){for(var i=0;
i<this.triggerElements.length;
i++){this.removeClassName(this.triggerElements[i],this.hoverClass)
}}if(show){if(this.hideTimer){clearInterval(this.hideTimer);
delete (this.hideTimer)
}if(this.hoverClass){if(typeof this.triggerHighlight!="undefined"){this.addClassName(this.triggerHighlight,this.hoverClass)
}}var self=this;
this.showTimer=setTimeout(function(){self.showTooltip()
},this.showDelay)
}else{if(this.showTimer){clearInterval(this.showTimer);
delete (this.showTimer)
}var self=this;
this.hideTimer=setTimeout(function(){self.hideTooltip()
},this.hideDelay)
}}this.refreshTimeout()
};
Spry.Widget.Tooltip.prototype.onMouseOverTrigger=function(e){var target="";
if(Spry.is.ie){target=e.srcElement
}else{target=e.target
}var contains=Spry.Widget.Utils.contains;
for(var i=0;
i<this.triggerElements.length;
i++){if(contains(this.triggerElements[i],target)){target=this.triggerElements[i];
break
}}if(i==this.triggerElements.length){return 
}if(this.visibleTooltip&&this.triggerHighlight&&this.triggerHighlight==target){if(this.hideTimer){clearInterval(this.hideTimer);
delete (this.hideTimer)
}if(this.hoverClass){if(typeof this.triggerHighlight!="undefined"){this.addClassName(this.triggerHighlight,this.hoverClass)
}}return 
}var pos=Spry.Widget.Utils.getAbsoluteMousePosition(e);
this.pos={x:pos.x+this.offsetX,y:pos.y+this.offsetY};
this.triggerHighlight=target;
Spry.Widget.Tooltip.closeAll();
this.displayTooltip(true)
};
Spry.Widget.Tooltip.prototype.onMouseMoveTrigger=function(e){var pos=Spry.Widget.Utils.getAbsoluteMousePosition(e);
this.pos={x:pos.x+this.offsetX,y:pos.y+this.offsetY};
if(this.visibleTooltip){this.showTooltip()
}};
Spry.Widget.Tooltip.prototype.onMouseOutTrigger=function(e){var target="";
if(Spry.is.ie){target=e.toElement
}else{target=e.relatedTarget
}var contains=Spry.Widget.Utils.contains;
for(var i=0;
i<this.triggerElements.length;
i++){if(contains(this.triggerElements[i],target)){return 
}}this.displayTooltip(false)
};
Spry.Widget.Tooltip.prototype.onMouseOutTooltip=function(e){var target="";
if(Spry.is.ie){target=e.toElement
}else{target=e.relatedTarget
}var contains=Spry.Widget.Utils.contains;
if(contains(this.tooltipElement,target)){return 
}this.displayTooltip(false)
};
Spry.Widget.Tooltip.prototype.onMouseOverTooltip=function(e){if(this.hideTimer){clearInterval(this.hideTimer);
delete (this.hideTimer)
}if(this.hoverClass){if(typeof this.triggerHighlight!="undefined"){this.addClassName(this.triggerHighlight,this.hoverClass)
}}};
Spry.Widget.Tooltip.prototype.refreshTimeout=function(){if(Spry.Widget.Tooltip.refreshTimeout!=null){clearTimeout(Spry.Widget.Tooltip.refreshTimeout);
Spry.Widget.Tooltip.refreshTimeout=null
}Spry.Widget.Tooltip.refreshTimeout=setTimeout(Spry.Widget.Tooltip.refreshAll,100)
};
Spry.Widget.Tooltip.prototype.destroy=function(){for(var k in this){try{if(typeof this.k=="object"&&typeof this.k.destroy=="function"){this.k.destroy()
}delete this.k
}catch(err){}}};
Spry.Widget.Tooltip.prototype.checkDestroyed=function(){if(!this.tooltipElement||this.tooltipElement.parentNode==null){return true
}return false
};
Spry.Widget.Tooltip.prototype.attachBehaviors=function(){var self=this;
var ev=Spry.Widget.Utils.addEventListener;
for(var i=0;
i<this.triggerElements.length;
i++){ev(this.triggerElements[i],"mouseover",function(e){self.onMouseOverTrigger(e||event);
return true
},false);
ev(this.triggerElements[i],"mouseout",function(e){self.onMouseOutTrigger(e||event);
return true
},false);
if(this.followMouse){ev(this.triggerElements[i],"mousemove",function(e){self.onMouseMoveTrigger(e||event);
return true
},false)
}}if(this.closeOnTooltipLeave){ev(this.tooltipElement,"mouseover",function(e){self.onMouseOverTooltip(e||event);
return true
},false);
ev(this.tooltipElement,"mouseout",function(e){self.onMouseOutTooltip(e||event);
return true
},false)
}this.listenersAttached=true
};
Spry.Widget.Tooltip.prototype.createIframeLayer=function(tooltip){if(typeof this.iframeLayer=="undefined"){var layer=document.createElement("iframe");
layer.tabIndex="-1";
layer.src='javascript:"";';
layer.scrolling="no";
layer.frameBorder="0";
layer.className="iframeTooltip";
tooltip.parentNode.appendChild(layer);
this.iframeLayer=layer
}this.iframeLayer.style.left=tooltip.offsetLeft+"px";
this.iframeLayer.style.top=tooltip.offsetTop+"px";
this.iframeLayer.style.width=tooltip.offsetWidth+"px";
this.iframeLayer.style.height=tooltip.offsetHeight+"px";
this.iframeLayer.style.display="block"
};
Spry.Widget.Tooltip.prototype.removeIframeLayer=function(tooltip){if(this.iframeLayer){this.iframeLayer.style.display="none"
}};
Spry.Widget.Tooltip.prototype.showError=function(msg){alert("Spry.Widget.Tooltip ERR: "+msg)
};
Spry.Widget.Tooltip.refreshAll=function(){var q=Spry.Widget.Tooltip.loadQueue;
var qlen=q.length;
for(var i=0;
i<qlen;
i++){if(q[i].checkDestroyed()){q[i].destroy();
q.splice(i,1);
i--;
qlen=q.length
}}};
Spry.Widget.Tooltip.closeAll=function(){var q=Spry.Widget.Tooltip.loadQueue;
var qlen=q.length;
for(var i=0;
i<qlen;
i++){if(q[i].visibleTooltip){q[i].hideTooltip(true)
}if(q[i].showTimer){clearTimeout(q[i].showTimer)
}if(q[i].hideTimer){clearTimeout(q[i].hideTimer)
}}};
Spry.Widget.Tooltip.Animator=function(element,opts){this.timer=null;
this.fps=60;
this.duration=500;
this.startTime=0;
this.transition=Spry.Widget.Tooltip.Animator.defaultTransition;
this.onComplete=null;
if(typeof element=="undefined"){return 
}this.element=Spry.Widget.Utils.getElement(element);
Spry.Widget.Utils.setOptions(this,opts,true);
this.interval=this.duration/this.fps
};
Spry.Widget.Tooltip.Animator.defaultTransition=function(time,begin,finish,duration){time/=duration;
return begin+((2-time)*time*finish)
};
Spry.Widget.Tooltip.Animator.prototype.start=function(){var self=this;
this.startTime=(new Date).getTime();
this.beforeStart();
this.timer=setInterval(function(){self.stepAnimation()
},this.interval)
};
Spry.Widget.Tooltip.Animator.prototype.stop=function(){if(this.timer){clearTimeout(this.timer)
}this.timer=null
};
Spry.Widget.Tooltip.Animator.prototype.stepAnimation=function(){};
Spry.Widget.Tooltip.Animator.prototype.beforeStart=function(){};
Spry.Widget.Tooltip.Animator.prototype.destroy=function(){for(var k in this){try{delete this.k
}catch(err){}}};
Spry.Widget.Tooltip.Fade=function(element,opts){Spry.Widget.Tooltip.Animator.call(this,element,opts);
if(Spry.is.ie){this.origOpacity=this.element.style.filter
}else{this.origOpacity=this.element.style.opacity
}};
Spry.Widget.Tooltip.Fade.prototype=new Spry.Widget.Tooltip.Animator();
Spry.Widget.Tooltip.Fade.prototype.constructor=Spry.Widget.Tooltip.Fade;
Spry.Widget.Tooltip.Fade.prototype.stepAnimation=function(){var curTime=(new Date).getTime();
var elapsedTime=curTime-this.startTime;
var i,obj;
if(elapsedTime>=this.duration){this.beforeStop();
this.stop();
return 
}var ht=this.transition(elapsedTime,this.from,this.to-this.from,this.duration);
if(Spry.is.ie){var filter=this.element.style.filter.replace(/alpha\s*\(\s*opacity\s*=\s*[0-9\.]{1,3}\)/,"");
this.element.style.filter=filter+"alpha(opacity="+parseInt(ht*100,10)+")"
}else{this.element.style.opacity=ht
}this.element.style.visibility="visible";
this.element.style.display="block"
};
Spry.Widget.Tooltip.Fade.prototype.beforeStop=function(){if(this.from>this.to){this.element.style.display="none"
}if(Spry.is.mozilla){this.element.style.filter=this.origOpacity
}else{this.element.style.opacity=this.origOpacity
}};
Spry.Widget.Tooltip.Blind=function(element,opts){this.from=0;
this.to=100;
Spry.Widget.Tooltip.Animator.call(this,element,opts);
this.element.style.visibility="hidden";
this.element.style.display="block";
this.origHeight=parseInt(Spry.Widget.Utils.getStyleProperty(this.element,"height"),10);
if(isNaN(this.origHeight)){this.origHeight=this.element.offsetHeight
}if(this.to==0){this.from=this.origHeight
}else{this.to=this.origHeight
}};
Spry.Widget.Tooltip.Blind.prototype=new Spry.Widget.Tooltip.Animator();
Spry.Widget.Tooltip.Blind.prototype.constructor=Spry.Widget.Tooltip.Blind;
Spry.Widget.Tooltip.Blind.prototype.beforeStart=function(){this.origOverflow=Spry.Widget.Utils.getStyleProperty(this.element,"overflow");
this.element.style.overflow="hidden"
};
Spry.Widget.Tooltip.Blind.prototype.stepAnimation=function(){var curTime=(new Date).getTime();
var elapsedTime=curTime-this.startTime;
var i,obj;
if(elapsedTime>=this.duration){this.beforeStop();
this.stop();
return 
}var ht=this.transition(elapsedTime,this.from,this.to-this.from,this.duration);
this.element.style.height=Math.floor(ht)+"px";
this.element.style.visibility="visible";
this.element.style.display="block"
};
Spry.Widget.Tooltip.Blind.prototype.beforeStop=function(){this.element.style.overflow=this.origOverflow;
if(this.from>this.to){this.element.style.display="none"
}this.element.style.height=this.origHeight+"px"
};
if(!Spry.Widget.Utils){Spry.Widget.Utils={}
}Spry.Widget.Utils.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.Utils.getElement=function(ele){if(ele&&typeof ele=="string"){return document.getElementById(ele)
}return ele
};
Spry.Widget.Utils.getElementsByClassName=function(sel,tagName){if(!sel.length>0){return null
}var selectors=sel.split(",");
var el=[];
for(var i=0;
i<selectors.length;
i++){var cs=selectors[i];
var chunk=cs.split(" ");
var parents=[];
parents[0]=[];
parents[0][0]=document.body;
for(var j=0;
j<chunk.length;
j++){var tokens=Spry.Widget.Utils.getSelectorTokens(chunk[j]);
for(var k=0;
k<parents[j].length;
k++){var childs=parents[j][k].getElementsByTagName(tagName);
parents[j+1]=[];
for(var l=0;
l<childs.length;
l++){if(Spry.Widget.Utils.hasSelector(childs[l],tokens)){parents[j+1].push(childs[l])
}}}}if(parents[j]){for(var k=0;
k<parents[j].length;
k++){el.push(parents[j][k])
}}}return el
};
Spry.Widget.Utils.firstValid=function(){var ret=null;
var a=Spry.Widget.Utils.firstValid;
for(var i=0;
i<a.arguments.length;
i++){if(typeof (a.arguments[i])!="undefined"){ret=a.arguments[i];
break
}}return ret
};
Spry.Widget.Utils.getSelectorTokens=function(str){str=str.replace(/\./g," .");
str=str.replace(/\#/g," #");
str=str.replace(/^\s+|\s+$/g,"");
return str.split(" ")
};
Spry.Widget.Utils.hasSelector=function(el,tokens){for(var i=0;
i<tokens.length;
i++){switch(tokens[i].charAt(0)){case".":if(!el.className||el.className.indexOf(tokens[i].substr(1))==-1){return false
}break;
case"#":if(!el.id||el.id!=tokens[i].substr(1)){return false
}break;
default:if(el.nodeName.toLowerCase!=tokens[i]){return false
}break
}}return true
};
Spry.Widget.Utils.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.Utils.getStyleProperty=function(element,prop){var value;
var camelized=Spry.Widget.Utils.camelize(prop);
try{if(element.style){value=element.style[camelized]
}if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);
value=css?css.getPropertyValue(prop):null
}else{if(element.currentStyle){value=element.currentStyle[camelized]
}}}}catch(e){}return value=="auto"?null:value
};
Spry.Widget.Utils.camelize=function(str){if(str.indexOf("-")==-1){return str
}var oStringList=str.split("-");
var isFirstEntry=true;
var camelizedString="";
for(var i=0;
i<oStringList.length;
i++){if(oStringList[i].length>0){if(isFirstEntry){camelizedString=oStringList[i];
isFirstEntry=false
}else{var s=oStringList[i];
camelizedString+=s.charAt(0).toUpperCase()+s.substring(1)
}}}return camelizedString
};
Spry.Widget.Utils.getPixels=function(m,s){var v=Spry.Widget.Utils.getStyleProperty(m,s);
if(v=="medium"){v=2
}else{v=parseInt(v,10)
}v=isNaN(v)?0:v;
return v
};
Spry.Widget.Utils.getAbsoluteMousePosition=function(ev){var pos={x:0,y:0};
if(ev.pageX){pos.x=ev.pageX
}else{if(ev.clientX){pos.x=ev.clientX+(document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft)
}}if(isNaN(pos.x)){pos.x=0
}if(ev.pageY){pos.y=ev.pageY
}else{if(ev.clientY){pos.y=ev.clientY+(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)
}}if(isNaN(pos.y)){pos.y=0
}return pos
};
Spry.Widget.Utils.getBorderBox=function(el,doc){doc=doc||document;
if(typeof el=="string"){el=doc.getElementById(el)
}if(!el){return false
}if(el.parentNode===null||Spry.Widget.Utils.getStyleProperty(el,"display")=="none"){return false
}var ret={x:0,y:0,width:0,height:0};
var parent=null;
var box;
if(el.getBoundingClientRect){box=el.getBoundingClientRect();
var scrollTop=doc.documentElement.scrollTop||doc.body.scrollTop;
var scrollLeft=doc.documentElement.scrollLeft||doc.body.scrollLeft;
ret.x=box.left+scrollLeft;
ret.y=box.top+scrollTop;
ret.width=box.right-box.left;
ret.height=box.bottom-box.top
}else{if(doc.getBoxObjectFor){box=doc.getBoxObjectFor(el);
ret.x=box.x;
ret.y=box.y;
ret.width=box.width;
ret.height=box.height;
var btw=Spry.Widget.Utils.getPixels(el,"border-top-width");
var blw=Spry.Widget.Utils.getPixels(el,"border-left-width");
ret.x-=blw;
ret.y-=btw
}else{ret.x=el.offsetLeft;
ret.y=el.offsetTop;
ret.width=el.offsetWidth;
ret.height=el.offsetHeight;
parent=el.offsetParent;
if(parent!=el){while(parent){ret.x+=parent.offsetLeft;
ret.y+=parent.offsetTop;
parent=parent.offsetParent
}}var blw=Spry.Widget.Utils.getPixels(el,"border-left-width");
var btw=Spry.Widget.Utils.getPixels(el,"border-top-width");
ret.x-=blw;
ret.y-=btw;
//if(Spry.is.opera||Spry.is.safari&&Spry.Widget.Utils.getStyleProperty(el,"position")=="absolute"){ret.y-=doc.body.offsetTop }
}}if(el.parentNode){parent=el.parentNode
}else{parent=null
}while(parent&&parent.tagName!="BODY"&&parent.tagName!="HTML"){ret.x-=parent.scrollLeft;
ret.y-=parent.scrollTop;
if(parent.parentNode){parent=parent.parentNode
}else{parent=null
}}return ret
};
Spry.Widget.Utils.setBorderBox=function(el,box){var pos=Spry.Widget.Utils.getBorderBox(el,el.ownerDocument);
if(pos===false){return false
}var delta={x:Spry.Widget.Utils.getPixels(el,"left"),y:Spry.Widget.Utils.getPixels(el,"top")};
var new_pos={x:0,y:0,w:0,h:0};
if(typeof box.x=="number"){new_pos.x=box.x-pos.x+delta.x
}if(typeof box.y=="number"){new_pos.y=box.y-pos.y+delta.y
}if(typeof box.x=="number"){el.style.left=new_pos.x+"px"
}if(typeof box.y=="number"){el.style.top=new_pos.y+"px"
}return true
};
Spry.Widget.Utils.putElementAt=function(source,target,offset,biv){biv=Spry.Widget.Utils.firstValid(biv,true);
var source_box=Spry.Widget.Utils.getBorderBox(source,source.ownerDocument);
Spry.Widget.Utils.setBorderBox(source,target);
if(biv){Spry.Widget.Utils.bringIntoView(source)
}return true
};
Spry.Widget.Utils.bringIntoView=function(source){var box=Spry.Widget.Utils.getBorderBox(source,source.ownerDocument);
if(box===false){return false
}var current={x:Spry.Widget.Utils.getPixels(source,"left"),y:Spry.Widget.Utils.getPixels(source,"top")};
var delta={x:0,y:0};
var offset_fix={x:0,y:0};
var strictm=source.ownerDocument.compatMode=="CSS1Compat";
var doc=(Spry.is.ie&&strictm||Spry.is.mozilla)?source.ownerDocument.documentElement:source.ownerDocument.body;
offset_fix.x=Spry.Widget.Utils.getPixels(doc,"border-left-width");
offset_fix.y=Spry.Widget.Utils.getPixels(doc,"border-top-width");
var st=doc.scrollTop;
var ch=self.innerHeight?self.innerHeight:doc.clientHeight;
var t=box.y+(Spry.is.ie?-offset_fix.y:offset_fix.y);
var b=box.y+box.height+(Spry.is.ie?-offset_fix.y:offset_fix.y);
if(b-st>ch){delta.y=ch-(b-st);
if(t+delta.y<st){delta.y=st-t
}}else{if(t<st){delta.y=st-t
}}if(delta.y!=0){source.style.top=(current.y+delta.y)+"px"
}var sl=doc.scrollLeft;
var cw=doc.clientWidth;
var l=box.x+(Spry.is.ie?-offset_fix.x:offset_fix.x);
var r=box.x+box.width+(Spry.is.ie?-offset_fix.x:offset_fix.x);
if(r-sl>cw){delta.x=cw-(r-sl);
if(l+delta.x<sl){delta.x=sl-l
}}else{if(l<sl){delta.x=sl-l
}}if(delta.x!=0){source.style.left=(current.x+delta.x)+"px"
}};
Spry.Widget.Utils.contains=function(who,what){if(typeof who.contains=="object"){return what&&who&&(who==what||who.contains(what))
}else{var el=what;
while(el){try{if(el==who){return true
}el=el.parentNode
}catch(a){return false
}}return false
}};

var REGEXP_UNICODE=function(){var tests=[" ","\u0120",-1,"!","\u0120",-1,"\u0120","\u0120",0,"\u0121","\u0120",-1,"\u0121","\u0120|\u0121",0,"\u0122","\u0120|\u0121",-1,"\u0120","[\u0120]",0,"\u0121","[\u0120]",-1,"\u0121","[\u0120\u0121]",0,"\u0122","[\u0120\u0121]",-1,"\u0121","[\u0120-\u0121]",0,"\u0122","[\u0120-\u0121]",-1];
for(var i=0;
i<tests.length;
i+=3){if(tests[i].search(new RegExp(tests[i+1]))!=tests[i+2]){return false
}}return true
}();
var XML_S="[ \t\r\n]+";
var XML_EQ="("+XML_S+")?=("+XML_S+")?";
var XML_CHAR_REF="&#[0-9]+;|&#x[0-9a-fA-F]+;";
var XML10_VERSION_INFO=XML_S+"version"+XML_EQ+"(\"1\\.0\"|'1\\.0')";
var XML10_BASE_CHAR=(REGEXP_UNICODE)?"\u0041-\u005a\u0061-\u007a\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0100-\u0131\u0134-\u013e\u0141-\u0148\u014a-\u017e\u0180-\u01c3\u01cd-\u01f0\u01f4-\u01f5\u01fa-\u0217\u0250-\u02a8\u02bb-\u02c1\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03ce\u03d0-\u03d6\u03da\u03dc\u03de\u03e0\u03e2-\u03f3\u0401-\u040c\u040e-\u044f\u0451-\u045c\u045e-\u0481\u0490-\u04c4\u04c7-\u04c8\u04cb-\u04cc\u04d0-\u04eb\u04ee-\u04f5\u04f8-\u04f9\u0531-\u0556\u0559\u0561-\u0586\u05d0-\u05ea\u05f0-\u05f2\u0621-\u063a\u0641-\u064a\u0671-\u06b7\u06ba-\u06be\u06c0-\u06ce\u06d0-\u06d3\u06d5\u06e5-\u06e6\u0905-\u0939\u093d\u0958-\u0961\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8b\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ae0\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b36-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb5\u0bb7-\u0bb9\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c60-\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cde\u0ce0-\u0ce1\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d28\u0d2a-\u0d39\u0d60-\u0d61\u0e01-\u0e2e\u0e30\u0e32-\u0e33\u0e40-\u0e45\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eae\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0f40-\u0f47\u0f49-\u0f69\u10a0-\u10c5\u10d0-\u10f6\u1100\u1102-\u1103\u1105-\u1107\u1109\u110b-\u110c\u110e-\u1112\u113c\u113e\u1140\u114c\u114e\u1150\u1154-\u1155\u1159\u115f-\u1161\u1163\u1165\u1167\u1169\u116d-\u116e\u1172-\u1173\u1175\u119e\u11a8\u11ab\u11ae-\u11af\u11b7-\u11b8\u11ba\u11bc-\u11c2\u11eb\u11f0\u11f9\u1e00-\u1e9b\u1ea0-\u1ef9\u1f00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2126\u212a-\u212b\u212e\u2180-\u2182\u3041-\u3094\u30a1-\u30fa\u3105-\u312c\uac00-\ud7a3":"A-Za-z";
var XML10_IDEOGRAPHIC=(REGEXP_UNICODE)?"\u4e00-\u9fa5\u3007\u3021-\u3029":"";
var XML10_COMBINING_CHAR=(REGEXP_UNICODE)?"\u0300-\u0345\u0360-\u0361\u0483-\u0486\u0591-\u05a1\u05a3-\u05b9\u05bb-\u05bd\u05bf\u05c1-\u05c2\u05c4\u064b-\u0652\u0670\u06d6-\u06dc\u06dd-\u06df\u06e0-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0901-\u0903\u093c\u093e-\u094c\u094d\u0951-\u0954\u0962-\u0963\u0981-\u0983\u09bc\u09be\u09bf\u09c0-\u09c4\u09c7-\u09c8\u09cb-\u09cd\u09d7\u09e2-\u09e3\u0a02\u0a3c\u0a3e\u0a3f\u0a40-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a70-\u0a71\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0b01-\u0b03\u0b3c\u0b3e-\u0b43\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b82-\u0b83\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c82-\u0c83\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0d02-\u0d03\u0d3e-\u0d43\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86-\u0f8b\u0f90-\u0f95\u0f97\u0f99-\u0fad\u0fb1-\u0fb7\u0fb9\u20d0-\u20dc\u20e1\u302a-\u302f\u3099\u309a":"";
var XML10_DIGIT=(REGEXP_UNICODE)?"\u0030-\u0039\u0660-\u0669\u06f0-\u06f9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be7-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29":"0-9";
var XML10_EXTENDER=(REGEXP_UNICODE)?"\u00b7\u02d0\u02d1\u0387\u0640\u0e46\u0ec6\u3005\u3031-\u3035\u309d-\u309e\u30fc-\u30fe":"";
var XML10_LETTER=XML10_BASE_CHAR+XML10_IDEOGRAPHIC;
var XML10_NAME_CHAR=XML10_LETTER+XML10_DIGIT+"\\._:"+XML10_COMBINING_CHAR+XML10_EXTENDER+"-";
var XML10_NAME="["+XML10_LETTER+"_:]["+XML10_NAME_CHAR+"]*";
var XML10_ENTITY_REF="&"+XML10_NAME+";";
var XML10_REFERENCE=XML10_ENTITY_REF+"|"+XML_CHAR_REF;
var XML10_ATT_VALUE='"(([^<&"]|'+XML10_REFERENCE+")*)\"|'(([^<&']|"+XML10_REFERENCE+")*)'";
var XML10_ATTRIBUTE="("+XML10_NAME+")"+XML_EQ+"("+XML10_ATT_VALUE+")";
var XML11_VERSION_INFO=XML_S+"version"+XML_EQ+"(\"1\\.1\"|'1\\.1')";
var XML11_NAME_START_CHAR=(REGEXP_UNICODE)?":A-Z_a-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd":":A-Z_a-z";
var XML11_NAME_CHAR=XML11_NAME_START_CHAR+((REGEXP_UNICODE)?"\\.0-9\u00b7\u0300-\u036f\u203f-\u2040-":"\\.0-9-");
var XML11_NAME="["+XML11_NAME_START_CHAR+"]["+XML11_NAME_CHAR+"]*";
var XML11_ENTITY_REF="&"+XML11_NAME+";";
var XML11_REFERENCE=XML11_ENTITY_REF+"|"+XML_CHAR_REF;
var XML11_ATT_VALUE='"(([^<&"]|'+XML11_REFERENCE+")*)\"|'(([^<&']|"+XML11_REFERENCE+")*)'";
var XML11_ATTRIBUTE="("+XML11_NAME+")"+XML_EQ+"("+XML11_ATT_VALUE+")";
var XML_NC_NAME_CHAR=XML10_LETTER+XML10_DIGIT+"\\._"+XML10_COMBINING_CHAR+XML10_EXTENDER+"-";
var XML_NC_NAME="["+XML10_LETTER+"_]["+XML_NC_NAME_CHAR+"]*";
var DOM_ELEMENT_NODE=1;
var DOM_ATTRIBUTE_NODE=2;
var DOM_TEXT_NODE=3;
var DOM_CDATA_SECTION_NODE=4;
var DOM_ENTITY_REFERENCE_NODE=5;
var DOM_ENTITY_NODE=6;
var DOM_PROCESSING_INSTRUCTION_NODE=7;
var DOM_COMMENT_NODE=8;
var DOM_DOCUMENT_NODE=9;
var DOM_DOCUMENT_TYPE_NODE=10;
var DOM_DOCUMENT_FRAGMENT_NODE=11;
var DOM_NOTATION_NODE=12;
function xpathLog(msg){}function xsltLog(msg){}function xsltLogXml(msg){}function assert(b){if(!b){throw"Assertion failed"
}}function stringSplit(s,c){var a=s.indexOf(c);
if(a==-1){return[s]
}var parts=[];
parts.push(s.substr(0,a));
while(a!=-1){var a1=s.indexOf(c,a+1);
if(a1!=-1){parts.push(s.substr(a+1,a1-a-1))
}else{parts.push(s.substr(a+1))
}a=a1
}return parts
}function mapExec(array,func){for(var i=0;
i<array.length;
++i){func.call(this,array[i],i)
}}function mapExpr(array,func){var ret=[];
for(var i=0;
i<array.length;
++i){ret.push(func(array[i]))
}return ret
}function reverseInplace(array){for(var i=0;
i<array.length/2;
++i){var h=array[i];
var ii=array.length-i-1;
array[i]=array[ii];
array[ii]=h
}}function removeFromArray(array,value,opt_notype){var shift=0;
for(var i=0;
i<array.length;
++i){if(array[i]===value||(opt_notype&&array[i]==value)){array.splice(i--,1);
shift++
}}return shift
}function copyArray(dst,src){for(var i=0;
i<src.length;
++i){dst.push(src[i])
}}function xmlValue(node){if(!node){return""
}var ret="";
if(node.nodeType==DOM_TEXT_NODE||node.nodeType==DOM_CDATA_SECTION_NODE||node.nodeType==DOM_ATTRIBUTE_NODE){ret+=node.nodeValue
}else{if(node.nodeType==DOM_ELEMENT_NODE||node.nodeType==DOM_DOCUMENT_NODE||node.nodeType==DOM_DOCUMENT_FRAGMENT_NODE){for(var i=0;
i<node.childNodes.length;
++i){ret+=arguments.callee(node.childNodes[i])
}}}return ret
}function xpathParse(expr){xpathLog("parse "+expr);
xpathParseInit();
var cached=xpathCacheLookup(expr);
if(cached){xpathLog(" ... cached");
return cached
}if(expr.match(/^(\$|@)?\w+$/i)){var ret=makeSimpleExpr(expr);
xpathParseCache[expr]=ret;
xpathLog(" ... simple");
return ret
}if(expr.match(/^\w+(\/\w+)*$/i)){var ret=makeSimpleExpr2(expr);
xpathParseCache[expr]=ret;
xpathLog(" ... simple 2");
return ret
}var cachekey=expr;
var stack=[];
var ahead=null;
var previous=null;
var done=false;
var parse_count=0;
var lexer_count=0;
var reduce_count=0;
while(!done){parse_count++;
expr=expr.replace(/^\s*/,"");
previous=ahead;
ahead=null;
var rule=null;
var match="";
for(var i=0;
i<xpathTokenRules.length;
++i){var result=xpathTokenRules[i].re.exec(expr);
lexer_count++;
if(result&&result.length>0&&result[0].length>match.length){rule=xpathTokenRules[i];
match=result[0];
break
}}if(rule&&(rule==TOK_DIV||rule==TOK_MOD||rule==TOK_AND||rule==TOK_OR)&&(!previous||previous.tag==TOK_AT||previous.tag==TOK_DSLASH||previous.tag==TOK_SLASH||previous.tag==TOK_AXIS||previous.tag==TOK_DOLLAR)){rule=TOK_QNAME
}if(rule){expr=expr.substr(match.length);
xpathLog("token: "+match+" -- "+rule.label);
ahead={tag:rule,match:match,prec:rule.prec?rule.prec:0,expr:makeTokenExpr(match)}
}else{xpathLog("DONE");
done=true
}while(xpathReduce(stack,ahead)){reduce_count++;
xpathLog("stack: "+stackToString(stack))
}}xpathLog("stack: "+stackToString(stack));
if(stack.length!=1){throw"XPath parse error "+cachekey+":\n"+stackToString(stack)
}var result=stack[0].expr;
xpathParseCache[cachekey]=result;
xpathLog("XPath parse: "+parse_count+" / "+lexer_count+" / "+reduce_count);
return result
}var xpathParseCache={};
function xpathCacheLookup(expr){return xpathParseCache[expr]
}function xpathReduce(stack,ahead){var cand=null;
if(stack.length>0){var top=stack[stack.length-1];
var ruleset=xpathRules[top.tag.key];
if(ruleset){for(var i=0;
i<ruleset.length;
++i){var rule=ruleset[i];
var match=xpathMatchStack(stack,rule[1]);
if(match.length){cand={tag:rule[0],rule:rule,match:match};
cand.prec=xpathGrammarPrecedence(cand);
break
}}}}var ret;
if(cand&&(!ahead||cand.prec>ahead.prec||(ahead.tag.left&&cand.prec>=ahead.prec))){for(var i=0;
i<cand.match.matchlength;
++i){stack.pop()
}xpathLog("reduce "+cand.tag.label+" "+cand.prec+" ahead "+(ahead?ahead.tag.label+" "+ahead.prec+(ahead.tag.left?" left":""):" none "));
var matchexpr=mapExpr(cand.match,function(m){return m.expr
});
cand.expr=cand.rule[3].apply(null,matchexpr);
stack.push(cand);
ret=true
}else{if(ahead){xpathLog("shift "+ahead.tag.label+" "+ahead.prec+(ahead.tag.left?" left":"")+" over "+(cand?cand.tag.label+" "+cand.prec:" none"));
stack.push(ahead)
}ret=false
}return ret
}function xpathMatchStack(stack,pattern){var S=stack.length;
var P=pattern.length;
var p,s;
var match=[];
match.matchlength=0;
var ds=0;
for(p=P-1,s=S-1;
p>=0&&s>=0;
--p,s-=ds){ds=0;
var qmatch=[];
if(pattern[p]==Q_MM){p-=1;
match.push(qmatch);
while(s-ds>=0&&stack[s-ds].tag==pattern[p]){qmatch.push(stack[s-ds]);
ds+=1;
match.matchlength+=1
}}else{if(pattern[p]==Q_01){p-=1;
match.push(qmatch);
while(s-ds>=0&&ds<2&&stack[s-ds].tag==pattern[p]){qmatch.push(stack[s-ds]);
ds+=1;
match.matchlength+=1
}}else{if(pattern[p]==Q_1M){p-=1;
match.push(qmatch);
if(stack[s].tag==pattern[p]){while(s-ds>=0&&stack[s-ds].tag==pattern[p]){qmatch.push(stack[s-ds]);
ds+=1;
match.matchlength+=1
}}else{return[]
}}else{if(stack[s].tag==pattern[p]){match.push(stack[s]);
ds+=1;
match.matchlength+=1
}else{return[]
}}}}reverseInplace(qmatch);
qmatch.expr=mapExpr(qmatch,function(m){return m.expr
})
}reverseInplace(match);
if(p==-1){return match
}else{return[]
}}function xpathTokenPrecedence(tag){return tag.prec||2
}function xpathGrammarPrecedence(frame){var ret=0;
if(frame.rule){if(frame.rule.length>=3&&frame.rule[2]>=0){ret=frame.rule[2]
}else{for(var i=0;
i<frame.rule[1].length;
++i){var p=xpathTokenPrecedence(frame.rule[1][i]);
ret=Math.max(ret,p)
}}}else{if(frame.tag){ret=xpathTokenPrecedence(frame.tag)
}else{if(frame.length){for(var j=0;
j<frame.length;
++j){var p=xpathGrammarPrecedence(frame[j]);
ret=Math.max(ret,p)
}}}}return ret
}function stackToString(stack){var ret="";
for(var i=0;
i<stack.length;
++i){if(ret){ret+="\n"
}ret+=stack[i].tag.label
}return ret
}function ExprContext(node,opt_position,opt_nodelist,opt_parent){this.node=node;
this.position=opt_position||0;
this.nodelist=opt_nodelist||[node];
this.variables={};
this.parent=opt_parent||null;
if(opt_parent){this.root=opt_parent.root
}else{if(this.node.nodeType==DOM_DOCUMENT_NODE){this.root=node
}else{this.root=node.ownerDocument
}}}ExprContext.prototype.clone=function(opt_node,opt_position,opt_nodelist){return new ExprContext(opt_node||this.node,typeof opt_position!="undefined"?opt_position:this.position,opt_nodelist||this.nodelist,this)
};
ExprContext.prototype.setVariable=function(name,value){this.variables[name]=value
};
ExprContext.prototype.getVariable=function(name){if(typeof this.variables[name]!="undefined"){return this.variables[name]
}else{if(this.parent){return this.parent.getVariable(name)
}else{return null
}}};
ExprContext.prototype.setNode=function(position){this.node=this.nodelist[position];
this.position=position
};
ExprContext.prototype.contextSize=function(){return this.nodelist.length
};
function StringValue(value){this.value=value;
this.type="string"
}StringValue.prototype.stringValue=function(){return this.value
};
StringValue.prototype.booleanValue=function(){return this.value.length>0
};
StringValue.prototype.numberValue=function(){return this.value-0
};
StringValue.prototype.nodeSetValue=function(){throw this
};
function BooleanValue(value){this.value=value;
this.type="boolean"
}BooleanValue.prototype.stringValue=function(){return""+this.value
};
BooleanValue.prototype.booleanValue=function(){return this.value
};
BooleanValue.prototype.numberValue=function(){return this.value?1:0
};
BooleanValue.prototype.nodeSetValue=function(){throw this
};
function NumberValue(value){this.value=value;
this.type="number"
}NumberValue.prototype.stringValue=function(){return""+this.value
};
NumberValue.prototype.booleanValue=function(){return !!this.value
};
NumberValue.prototype.numberValue=function(){return this.value-0
};
NumberValue.prototype.nodeSetValue=function(){throw this
};
function NodeSetValue(value){this.value=value;
this.type="node-set"
}NodeSetValue.prototype.stringValue=function(){if(this.value.length==0){return""
}else{return xmlValue(this.value[0])
}};
NodeSetValue.prototype.booleanValue=function(){return this.value.length>0
};
NodeSetValue.prototype.numberValue=function(){return this.stringValue()-0
};
NodeSetValue.prototype.nodeSetValue=function(){return this.value
};
function TokenExpr(m){this.value=m
}TokenExpr.prototype.evaluate=function(){return new StringValue(this.value)
};
function LocationExpr(){this.absolute=false;
this.steps=[]
}LocationExpr.prototype.appendStep=function(s){this.steps.push(s)
};
LocationExpr.prototype.prependStep=function(s){var steps0=this.steps;
this.steps=[s];
for(var i=0;
i<steps0.length;
++i){this.steps.push(steps0[i])
}};
LocationExpr.prototype.evaluate=function(ctx){var start;
if(this.absolute){start=ctx.root
}else{start=ctx.node
}var nodes=[];
xPathStep(nodes,this.steps,0,start,ctx);
return new NodeSetValue(nodes)
};
function xPathStep(nodes,steps,step,input,ctx){var s=steps[step];
var ctx2=ctx.clone(input);
var nodelist=s.evaluate(ctx2).nodeSetValue();
for(var i=0;
i<nodelist.length;
++i){if(step==steps.length-1){nodes.push(nodelist[i])
}else{xPathStep(nodes,steps,step+1,nodelist[i],ctx)
}}}function StepExpr(axis,nodetest,opt_predicate){this.axis=axis;
this.nodetest=nodetest;
this.predicate=opt_predicate||[]
}StepExpr.prototype.appendPredicate=function(p){this.predicate.push(p)
};
StepExpr.prototype.evaluate=function(ctx){var input=ctx.node;
var nodelist=[];
if(this.axis==xpathAxis.ANCESTOR_OR_SELF){nodelist.push(input);
for(var n=input.parentNode;
n;
n=n.parentNode){nodelist.push(n)
}}else{if(this.axis==xpathAxis.ANCESTOR){for(var n=input.parentNode;
n;
n=n.parentNode){nodelist.push(n)
}}else{if(this.axis==xpathAxis.ATTRIBUTE){copyArray(nodelist,input.attributes)
}else{if(this.axis==xpathAxis.CHILD){copyArray(nodelist,input.childNodes)
}else{if(this.axis==xpathAxis.DESCENDANT_OR_SELF){nodelist.push(input);
xpathCollectDescendants(nodelist,input)
}else{if(this.axis==xpathAxis.DESCENDANT){xpathCollectDescendants(nodelist,input)
}else{if(this.axis==xpathAxis.FOLLOWING){for(var n=input;
n;
n=n.parentNode){for(var nn=n.nextSibling;
nn;
nn=nn.nextSibling){nodelist.push(nn);
xpathCollectDescendants(nodelist,nn)
}}}else{if(this.axis==xpathAxis.FOLLOWING_SIBLING){for(var n=input.nextSibling;
n;
n=n.nextSibling){nodelist.push(n)
}}else{if(this.axis==xpathAxis.NAMESPACE){alert("not implemented: axis namespace")
}else{if(this.axis==xpathAxis.PARENT){if(input.parentNode){nodelist.push(input.parentNode)
}}else{if(this.axis==xpathAxis.PRECEDING){for(var n=input;
n;
n=n.parentNode){for(var nn=n.previousSibling;
nn;
nn=nn.previousSibling){nodelist.push(nn);
xpathCollectDescendantsReverse(nodelist,nn)
}}}else{if(this.axis==xpathAxis.PRECEDING_SIBLING){for(var n=input.previousSibling;
n;
n=n.previousSibling){nodelist.push(n)
}}else{if(this.axis==xpathAxis.SELF){nodelist.push(input)
}else{throw"ERROR -- NO SUCH AXIS: "+this.axis
}}}}}}}}}}}}}var nodelist0=nodelist;
nodelist=[];
for(var i=0;
i<nodelist0.length;
++i){var n=nodelist0[i];
if(this.nodetest.evaluate(ctx.clone(n,i,nodelist0)).booleanValue()){nodelist.push(n)
}}for(var i=0;
i<this.predicate.length;
++i){var nodelist0=nodelist;
nodelist=[];
for(var ii=0;
ii<nodelist0.length;
++ii){var n=nodelist0[ii];
if(this.predicate[i].evaluate(ctx.clone(n,ii,nodelist0)).booleanValue()){nodelist.push(n)
}}}return new NodeSetValue(nodelist)
};
function NodeTestAny(){this.value=new BooleanValue(true)
}NodeTestAny.prototype.evaluate=function(ctx){return this.value
};
function NodeTestElementOrAttribute(){}NodeTestElementOrAttribute.prototype.evaluate=function(ctx){return new BooleanValue(ctx.node.nodeType==DOM_ELEMENT_NODE||ctx.node.nodeType==DOM_ATTRIBUTE_NODE)
};
function NodeTestText(){}NodeTestText.prototype.evaluate=function(ctx){return new BooleanValue(ctx.node.nodeType==DOM_TEXT_NODE)
};
function NodeTestComment(){}NodeTestComment.prototype.evaluate=function(ctx){return new BooleanValue(ctx.node.nodeType==DOM_COMMENT_NODE)
};
function NodeTestPI(target){this.target=target
}NodeTestPI.prototype.evaluate=function(ctx){return new BooleanValue(ctx.node.nodeType==DOM_PROCESSING_INSTRUCTION_NODE&&(!this.target||ctx.node.nodeName==this.target))
};
function NodeTestNC(nsprefix){this.regex=new RegExp("^"+nsprefix+":");
this.nsprefix=nsprefix
}NodeTestNC.prototype.evaluate=function(ctx){var n=ctx.node;
return new BooleanValue(this.regex.match(n.nodeName))
};
function NodeTestName(name){this.name=name
}NodeTestName.prototype.evaluate=function(ctx){var n=ctx.node;
return new BooleanValue(n.nodeName==this.name)
};
function PredicateExpr(expr){this.expr=expr
}PredicateExpr.prototype.evaluate=function(ctx){var v=this.expr.evaluate(ctx);
if(v.type=="number"){return new BooleanValue(ctx.position==v.numberValue()-1)
}else{return new BooleanValue(v.booleanValue())
}};
function FunctionCallExpr(name){this.name=name;
this.args=[]
}FunctionCallExpr.prototype.appendArg=function(arg){this.args.push(arg)
};
FunctionCallExpr.prototype.evaluate=function(ctx){var fn=""+this.name.value;
var f=this.xpathfunctions[fn];
if(f){return f.call(this,ctx)
}else{xpathLog("XPath NO SUCH FUNCTION "+fn);
return new BooleanValue(false)
}};
FunctionCallExpr.prototype.xpathfunctions={last:function(ctx){assert(this.args.length==0);
return new NumberValue(ctx.contextSize())
},position:function(ctx){assert(this.args.length==0);
return new NumberValue(ctx.position+1)
},count:function(ctx){assert(this.args.length==1);
var v=this.args[0].evaluate(ctx);
return new NumberValue(v.nodeSetValue().length)
},id:function(ctx){assert(this.args.length==1);
var e=this.args[0].evaluate(ctx);
var ret=[];
var ids;
if(e.type=="node-set"){ids=[];
var en=e.nodeSetValue();
for(var i=0;
i<en.length;
++i){var v=xmlValue(en[i]).split(/\s+/);
for(var ii=0;
ii<v.length;
++ii){ids.push(v[ii])
}}}else{ids=e.stringValue().split(/\s+/)
}var d=ctx.node.ownerDocument;
for(var i=0;
i<ids.length;
++i){var n=d.getElementById(ids[i]);
if(n){ret.push(n)
}}return new NodeSetValue(ret)
},"local-name":function(ctx){alert("not implmented yet: XPath function local-name()")
},"namespace-uri":function(ctx){alert("not implmented yet: XPath function namespace-uri()")
},name:function(ctx){assert(this.args.length==1||this.args.length==0);
var n;
if(this.args.length==0){n=[ctx.node]
}else{n=this.args[0].evaluate(ctx).nodeSetValue()
}if(n.length==0){return new StringValue("")
}else{return new StringValue(n[0].nodeName)
}},string:function(ctx){assert(this.args.length==1||this.args.length==0);
if(this.args.length==0){return new StringValue(new NodeSetValue([ctx.node]).stringValue())
}else{return new StringValue(this.args[0].evaluate(ctx).stringValue())
}},concat:function(ctx){var ret="";
for(var i=0;
i<this.args.length;
++i){ret+=this.args[i].evaluate(ctx).stringValue()
}return new StringValue(ret)
},"starts-with":function(ctx){assert(this.args.length==2);
var s0=this.args[0].evaluate(ctx).stringValue();
var s1=this.args[1].evaluate(ctx).stringValue();
return new BooleanValue(s0.indexOf(s1)==0)
},contains:function(ctx){assert(this.args.length==2);
var s0=this.args[0].evaluate(ctx).stringValue();
var s1=this.args[1].evaluate(ctx).stringValue();
return new BooleanValue(s0.indexOf(s1)!=-1)
},"substring-before":function(ctx){assert(this.args.length==2);
var s0=this.args[0].evaluate(ctx).stringValue();
var s1=this.args[1].evaluate(ctx).stringValue();
var i=s0.indexOf(s1);
var ret;
if(i==-1){ret=""
}else{ret=s0.substr(0,i)
}return new StringValue(ret)
},"substring-after":function(ctx){assert(this.args.length==2);
var s0=this.args[0].evaluate(ctx).stringValue();
var s1=this.args[1].evaluate(ctx).stringValue();
var i=s0.indexOf(s1);
var ret;
if(i==-1){ret=""
}else{ret=s0.substr(i+s1.length)
}return new StringValue(ret)
},substring:function(ctx){assert(this.args.length==2||this.args.length==3);
var s0=this.args[0].evaluate(ctx).stringValue();
var s1=this.args[1].evaluate(ctx).numberValue();
var ret;
if(this.args.length==2){var i1=Math.max(0,Math.round(s1)-1);
ret=s0.substr(i1)
}else{var s2=this.args[2].evaluate(ctx).numberValue();
var i0=Math.round(s1)-1;
var i1=Math.max(0,i0);
var i2=Math.round(s2)-Math.max(0,-i0);
ret=s0.substr(i1,i2)
}return new StringValue(ret)
},"string-length":function(ctx){var s;
if(this.args.length>0){s=this.args[0].evaluate(ctx).stringValue()
}else{s=new NodeSetValue([ctx.node]).stringValue()
}return new NumberValue(s.length)
},"normalize-space":function(ctx){var s;
if(this.args.length>0){s=this.args[0].evaluate(ctx).stringValue()
}else{s=new NodeSetValue([ctx.node]).stringValue()
}s=s.replace(/^\s*/,"").replace(/\s*$/,"").replace(/\s+/g," ");
return new StringValue(s)
},translate:function(ctx){assert(this.args.length==3);
var s0=this.args[0].evaluate(ctx).stringValue();
var s1=this.args[1].evaluate(ctx).stringValue();
var s2=this.args[2].evaluate(ctx).stringValue();
for(var i=0;
i<s1.length;
++i){s0=s0.replace(new RegExp(s1.charAt(i),"g"),s2.charAt(i))
}return new StringValue(s0)
},"boolean":function(ctx){assert(this.args.length==1);
return new BooleanValue(this.args[0].evaluate(ctx).booleanValue())
},not:function(ctx){assert(this.args.length==1);
var ret=!this.args[0].evaluate(ctx).booleanValue();
return new BooleanValue(ret)
},"true":function(ctx){assert(this.args.length==0);
return new BooleanValue(true)
},"false":function(ctx){assert(this.args.length==0);
return new BooleanValue(false)
},lang:function(ctx){assert(this.args.length==1);
var lang=this.args[0].evaluate(ctx).stringValue();
var xmllang;
var n=ctx.node;
while(n&&n!=n.parentNode){xmllang=n.getAttribute("xml:lang");
if(xmllang){break
}n=n.parentNode
}if(!xmllang){return new BooleanValue(false)
}else{var re=new RegExp("^"+lang+"$","i");
return new BooleanValue(xmllang.match(re)||xmllang.replace(/_.*$/,"").match(re))
}},number:function(ctx){assert(this.args.length==1||this.args.length==0);
if(this.args.length==1){return new NumberValue(this.args[0].evaluate(ctx).numberValue())
}else{return new NumberValue(new NodeSetValue([ctx.node]).numberValue())
}},sum:function(ctx){assert(this.args.length==1);
var n=this.args[0].evaluate(ctx).nodeSetValue();
var sum=0;
for(var i=0;
i<n.length;
++i){sum+=xmlValue(n[i])-0
}return new NumberValue(sum)
},floor:function(ctx){assert(this.args.length==1);
var num=this.args[0].evaluate(ctx).numberValue();
return new NumberValue(Math.floor(num))
},ceiling:function(ctx){assert(this.args.length==1);
var num=this.args[0].evaluate(ctx).numberValue();
return new NumberValue(Math.ceil(num))
},round:function(ctx){assert(this.args.length==1);
var num=this.args[0].evaluate(ctx).numberValue();
return new NumberValue(Math.round(num))
},"ext-join":function(ctx){assert(this.args.length==2);
var nodes=this.args[0].evaluate(ctx).nodeSetValue();
var delim=this.args[1].evaluate(ctx).stringValue();
var ret="";
for(var i=0;
i<nodes.length;
++i){if(ret){ret+=delim
}ret+=xmlValue(nodes[i])
}return new StringValue(ret)
},"ext-if":function(ctx){assert(this.args.length==3);
if(this.args[0].evaluate(ctx).booleanValue()){return this.args[1].evaluate(ctx)
}else{return this.args[2].evaluate(ctx)
}},"ext-cardinal":function(ctx){assert(this.args.length>=1);
var c=this.args[0].evaluate(ctx).numberValue();
var ret=[];
for(var i=0;
i<c;
++i){ret.push(ctx.node)
}return new NodeSetValue(ret)
}};
function UnionExpr(expr1,expr2){this.expr1=expr1;
this.expr2=expr2
}UnionExpr.prototype.evaluate=function(ctx){var nodes1=this.expr1.evaluate(ctx).nodeSetValue();
var nodes2=this.expr2.evaluate(ctx).nodeSetValue();
var I1=nodes1.length;
for(var i2=0;
i2<nodes2.length;
++i2){var n=nodes2[i2];
var inBoth=false;
for(var i1=0;
i1<I1;
++i1){if(nodes1[i1]==n){inBoth=true;
i1=I1
}}if(!inBoth){nodes1.push(n)
}}return new NodeSetValue(nodes1)
};
function PathExpr(filter,rel){this.filter=filter;
this.rel=rel
}PathExpr.prototype.evaluate=function(ctx){var nodes=this.filter.evaluate(ctx).nodeSetValue();
var nodes1=[];
for(var i=0;
i<nodes.length;
++i){var nodes0=this.rel.evaluate(ctx.clone(nodes[i],i,nodes)).nodeSetValue();
for(var ii=0;
ii<nodes0.length;
++ii){nodes1.push(nodes0[ii])
}}return new NodeSetValue(nodes1)
};
function FilterExpr(expr,predicate){this.expr=expr;
this.predicate=predicate
}FilterExpr.prototype.evaluate=function(ctx){var nodes=this.expr.evaluate(ctx).nodeSetValue();
for(var i=0;
i<this.predicate.length;
++i){var nodes0=nodes;
nodes=[];
for(var j=0;
j<nodes0.length;
++j){var n=nodes0[j];
if(this.predicate[i].evaluate(ctx.clone(n,j,nodes0)).booleanValue()){nodes.push(n)
}}}return new NodeSetValue(nodes)
};
function UnaryMinusExpr(expr){this.expr=expr
}UnaryMinusExpr.prototype.evaluate=function(ctx){return new NumberValue(-this.expr.evaluate(ctx).numberValue())
};
function BinaryExpr(expr1,op,expr2){this.expr1=expr1;
this.expr2=expr2;
this.op=op
}BinaryExpr.prototype.evaluate=function(ctx){var ret;
switch(this.op.value){case"or":ret=new BooleanValue(this.expr1.evaluate(ctx).booleanValue()||this.expr2.evaluate(ctx).booleanValue());
break;
case"and":ret=new BooleanValue(this.expr1.evaluate(ctx).booleanValue()&&this.expr2.evaluate(ctx).booleanValue());
break;
case"+":ret=new NumberValue(this.expr1.evaluate(ctx).numberValue()+this.expr2.evaluate(ctx).numberValue());
break;
case"-":ret=new NumberValue(this.expr1.evaluate(ctx).numberValue()-this.expr2.evaluate(ctx).numberValue());
break;
case"*":ret=new NumberValue(this.expr1.evaluate(ctx).numberValue()*this.expr2.evaluate(ctx).numberValue());
break;
case"mod":ret=new NumberValue(this.expr1.evaluate(ctx).numberValue()%this.expr2.evaluate(ctx).numberValue());
break;
case"div":ret=new NumberValue(this.expr1.evaluate(ctx).numberValue()/this.expr2.evaluate(ctx).numberValue());
break;
case"=":ret=this.compare(ctx,function(x1,x2){return x1==x2
});
break;
case"!=":ret=this.compare(ctx,function(x1,x2){return x1!=x2
});
break;
case"<":ret=this.compare(ctx,function(x1,x2){return x1<x2
});
break;
case"<=":ret=this.compare(ctx,function(x1,x2){return x1<=x2
});
break;
case">":ret=this.compare(ctx,function(x1,x2){return x1>x2
});
break;
case">=":ret=this.compare(ctx,function(x1,x2){return x1>=x2
});
break;
default:alert("BinaryExpr.evaluate: "+this.op.value)
}return ret
};
BinaryExpr.prototype.compare=function(ctx,cmp){var v1=this.expr1.evaluate(ctx);
var v2=this.expr2.evaluate(ctx);
var ret;
if(v1.type=="node-set"&&v2.type=="node-set"){var n1=v1.nodeSetValue();
var n2=v2.nodeSetValue();
ret=false;
for(var i1=0;
i1<n1.length;
++i1){for(var i2=0;
i2<n2.length;
++i2){if(cmp(xmlValue(n1[i1]),xmlValue(n2[i2]))){ret=true;
i2=n2.length;
i1=n1.length
}}}}else{if(v1.type=="node-set"||v2.type=="node-set"){if(v1.type=="number"){var s=v1.numberValue();
var n=v2.nodeSetValue();
ret=false;
for(var i=0;
i<n.length;
++i){var nn=xmlValue(n[i])-0;
if(cmp(s,nn)){ret=true;
break
}}}else{if(v2.type=="number"){var n=v1.nodeSetValue();
var s=v2.numberValue();
ret=false;
for(var i=0;
i<n.length;
++i){var nn=xmlValue(n[i])-0;
if(cmp(nn,s)){ret=true;
break
}}}else{if(v1.type=="string"){var s=v1.stringValue();
var n=v2.nodeSetValue();
ret=false;
for(var i=0;
i<n.length;
++i){var nn=xmlValue(n[i]);
if(cmp(s,nn)){ret=true;
break
}}}else{if(v2.type=="string"){var n=v1.nodeSetValue();
var s=v2.stringValue();
ret=false;
for(var i=0;
i<n.length;
++i){var nn=xmlValue(n[i]);
if(cmp(nn,s)){ret=true;
break
}}}else{ret=cmp(v1.booleanValue(),v2.booleanValue())
}}}}}else{if(v1.type=="boolean"||v2.type=="boolean"){ret=cmp(v1.booleanValue(),v2.booleanValue())
}else{if(v1.type=="number"||v2.type=="number"){ret=cmp(v1.numberValue(),v2.numberValue())
}else{ret=cmp(v1.stringValue(),v2.stringValue())
}}}}return new BooleanValue(ret)
};
function LiteralExpr(value){this.value=value
}LiteralExpr.prototype.evaluate=function(ctx){return new StringValue(this.value)
};
function NumberExpr(value){this.value=value
}NumberExpr.prototype.evaluate=function(ctx){return new NumberValue(this.value)
};
function VariableExpr(name){this.name=name
}VariableExpr.prototype.evaluate=function(ctx){return ctx.getVariable(this.name)
};
function makeTokenExpr(m){return new TokenExpr(m)
}function passExpr(e){return e
}function makeLocationExpr1(slash,rel){rel.absolute=true;
return rel
}function makeLocationExpr2(dslash,rel){rel.absolute=true;
rel.prependStep(makeAbbrevStep(dslash.value));
return rel
}function makeLocationExpr3(slash){var ret=new LocationExpr();
ret.appendStep(makeAbbrevStep("."));
ret.absolute=true;
return ret
}function makeLocationExpr4(dslash){var ret=new LocationExpr();
ret.absolute=true;
ret.appendStep(makeAbbrevStep(dslash.value));
return ret
}function makeLocationExpr5(step){var ret=new LocationExpr();
ret.appendStep(step);
return ret
}function makeLocationExpr6(rel,slash,step){rel.appendStep(step);
return rel
}function makeLocationExpr7(rel,dslash,step){rel.appendStep(makeAbbrevStep(dslash.value));
return rel
}function makeStepExpr1(dot){return makeAbbrevStep(dot.value)
}function makeStepExpr2(ddot){return makeAbbrevStep(ddot.value)
}function makeStepExpr3(axisname,axis,nodetest){return new StepExpr(axisname.value,nodetest)
}function makeStepExpr4(at,nodetest){return new StepExpr("attribute",nodetest)
}function makeStepExpr5(nodetest){return new StepExpr("child",nodetest)
}function makeStepExpr6(step,predicate){step.appendPredicate(predicate);
return step
}function makeAbbrevStep(abbrev){switch(abbrev){case"//":return new StepExpr("descendant-or-self",new NodeTestAny);
case".":return new StepExpr("self",new NodeTestAny);
case"..":return new StepExpr("parent",new NodeTestAny)
}}function makeNodeTestExpr1(asterisk){return new NodeTestElementOrAttribute
}function makeNodeTestExpr2(ncname,colon,asterisk){return new NodeTestNC(ncname.value)
}function makeNodeTestExpr3(qname){return new NodeTestName(qname.value)
}function makeNodeTestExpr4(typeo,parenc){var type=typeo.value.replace(/\s*\($/,"");
switch(type){case"node":return new NodeTestAny;
case"text":return new NodeTestText;
case"comment":return new NodeTestComment;
case"processing-instruction":return new NodeTestPI("")
}}function makeNodeTestExpr5(typeo,target,parenc){var type=typeo.replace(/\s*\($/,"");
if(type!="processing-instruction"){throw type
}return new NodeTestPI(target.value)
}function makePredicateExpr(pareno,expr,parenc){return new PredicateExpr(expr)
}function makePrimaryExpr(pareno,expr,parenc){return expr
}function makeFunctionCallExpr1(name,pareno,parenc){return new FunctionCallExpr(name)
}function makeFunctionCallExpr2(name,pareno,arg1,args,parenc){var ret=new FunctionCallExpr(name);
ret.appendArg(arg1);
for(var i=0;
i<args.length;
++i){ret.appendArg(args[i])
}return ret
}function makeArgumentExpr(comma,expr){return expr
}function makeUnionExpr(expr1,pipe,expr2){return new UnionExpr(expr1,expr2)
}function makePathExpr1(filter,slash,rel){return new PathExpr(filter,rel)
}function makePathExpr2(filter,dslash,rel){rel.prependStep(makeAbbrevStep(dslash.value));
return new PathExpr(filter,rel)
}function makeFilterExpr(expr,predicates){if(predicates.length>0){return new FilterExpr(expr,predicates)
}else{return expr
}}function makeUnaryMinusExpr(minus,expr){return new UnaryMinusExpr(expr)
}function makeBinaryExpr(expr1,op,expr2){return new BinaryExpr(expr1,op,expr2)
}function makeLiteralExpr(token){var value=token.value.substring(1,token.value.length-1);
return new LiteralExpr(value)
}function makeNumberExpr(token){return new NumberExpr(token.value)
}function makeVariableReference(dollar,name){return new VariableExpr(name.value)
}function makeSimpleExpr(expr){if(expr.charAt(0)=="$"){return new VariableExpr(expr.substr(1))
}else{if(expr.charAt(0)=="@"){var a=new NodeTestName(expr.substr(1));
var b=new StepExpr("attribute",a);
var c=new LocationExpr();
c.appendStep(b);
return c
}else{if(expr.match(/^[0-9]+$/)){return new NumberExpr(expr)
}else{var a=new NodeTestName(expr);
var b=new StepExpr("child",a);
var c=new LocationExpr();
c.appendStep(b);
return c
}}}}function makeSimpleExpr2(expr){var steps=stringSplit(expr,"/");
var c=new LocationExpr();
for(var i=0;
i<steps.length;
++i){var a=new NodeTestName(steps[i]);
var b=new StepExpr("child",a);
c.appendStep(b)
}return c
}var xpathAxis={ANCESTOR_OR_SELF:"ancestor-or-self",ANCESTOR:"ancestor",ATTRIBUTE:"attribute",CHILD:"child",DESCENDANT_OR_SELF:"descendant-or-self",DESCENDANT:"descendant",FOLLOWING_SIBLING:"following-sibling",FOLLOWING:"following",NAMESPACE:"namespace",PARENT:"parent",PRECEDING_SIBLING:"preceding-sibling",PRECEDING:"preceding",SELF:"self"};
var xpathAxesRe=[xpathAxis.ANCESTOR_OR_SELF,xpathAxis.ANCESTOR,xpathAxis.ATTRIBUTE,xpathAxis.CHILD,xpathAxis.DESCENDANT_OR_SELF,xpathAxis.DESCENDANT,xpathAxis.FOLLOWING_SIBLING,xpathAxis.FOLLOWING,xpathAxis.NAMESPACE,xpathAxis.PARENT,xpathAxis.PRECEDING_SIBLING,xpathAxis.PRECEDING,xpathAxis.SELF].join("|");
var TOK_PIPE={label:"|",prec:17,re:new RegExp("^\\|")};
var TOK_DSLASH={label:"//",prec:19,re:new RegExp("^//")};
var TOK_SLASH={label:"/",prec:30,re:new RegExp("^/")};
var TOK_AXIS={label:"::",prec:20,re:new RegExp("^::")};
var TOK_COLON={label:":",prec:1000,re:new RegExp("^:")};
var TOK_AXISNAME={label:"[axis]",re:new RegExp("^("+xpathAxesRe+")")};
var TOK_PARENO={label:"(",prec:34,re:new RegExp("^\\(")};
var TOK_PARENC={label:")",re:new RegExp("^\\)")};
var TOK_DDOT={label:"..",prec:34,re:new RegExp("^\\.\\.")};
var TOK_DOT={label:".",prec:34,re:new RegExp("^\\.")};
var TOK_AT={label:"@",prec:34,re:new RegExp("^@")};
var TOK_COMMA={label:",",re:new RegExp("^,")};
var TOK_OR={label:"or",prec:10,re:new RegExp("^or\\b")};
var TOK_AND={label:"and",prec:11,re:new RegExp("^and\\b")};
var TOK_EQ={label:"=",prec:12,re:new RegExp("^=")};
var TOK_NEQ={label:"!=",prec:12,re:new RegExp("^!=")};
var TOK_GE={label:">=",prec:13,re:new RegExp("^>=")};
var TOK_GT={label:">",prec:13,re:new RegExp("^>")};
var TOK_LE={label:"<=",prec:13,re:new RegExp("^<=")};
var TOK_LT={label:"<",prec:13,re:new RegExp("^<")};
var TOK_PLUS={label:"+",prec:14,re:new RegExp("^\\+"),left:true};
var TOK_MINUS={label:"-",prec:14,re:new RegExp("^\\-"),left:true};
var TOK_DIV={label:"div",prec:15,re:new RegExp("^div\\b"),left:true};
var TOK_MOD={label:"mod",prec:15,re:new RegExp("^mod\\b"),left:true};
var TOK_BRACKO={label:"[",prec:32,re:new RegExp("^\\[")};
var TOK_BRACKC={label:"]",re:new RegExp("^\\]")};
var TOK_DOLLAR={label:"$",re:new RegExp("^\\$")};
var TOK_NCNAME={label:"[ncname]",re:new RegExp("^"+XML_NC_NAME)};
var TOK_ASTERISK={label:"*",prec:15,re:new RegExp("^\\*"),left:true};
var TOK_LITERALQ={label:"[litq]",prec:20,re:new RegExp("^'[^\\']*'")};
var TOK_LITERALQQ={label:"[litqq]",prec:20,re:new RegExp('^"[^\\"]*"')};
var TOK_NUMBER={label:"[number]",prec:35,re:new RegExp("^\\d+(\\.\\d*)?")};
var TOK_QNAME={label:"[qname]",re:new RegExp("^("+XML_NC_NAME+":)?"+XML_NC_NAME)};
var TOK_NODEO={label:"[nodetest-start]",re:new RegExp("^(processing-instruction|comment|text|node)\\(")};
var xpathTokenRules=[TOK_DSLASH,TOK_SLASH,TOK_DDOT,TOK_DOT,TOK_AXIS,TOK_COLON,TOK_AXISNAME,TOK_NODEO,TOK_PARENO,TOK_PARENC,TOK_BRACKO,TOK_BRACKC,TOK_AT,TOK_COMMA,TOK_OR,TOK_AND,TOK_NEQ,TOK_EQ,TOK_GE,TOK_GT,TOK_LE,TOK_LT,TOK_PLUS,TOK_MINUS,TOK_ASTERISK,TOK_PIPE,TOK_MOD,TOK_DIV,TOK_LITERALQ,TOK_LITERALQQ,TOK_NUMBER,TOK_QNAME,TOK_NCNAME,TOK_DOLLAR];
var XPathLocationPath={label:"LocationPath"};
var XPathRelativeLocationPath={label:"RelativeLocationPath"};
var XPathAbsoluteLocationPath={label:"AbsoluteLocationPath"};
var XPathStep={label:"Step"};
var XPathNodeTest={label:"NodeTest"};
var XPathPredicate={label:"Predicate"};
var XPathLiteral={label:"Literal"};
var XPathExpr={label:"Expr"};
var XPathPrimaryExpr={label:"PrimaryExpr"};
var XPathVariableReference={label:"Variablereference"};
var XPathNumber={label:"Number"};
var XPathFunctionCall={label:"FunctionCall"};
var XPathArgumentRemainder={label:"ArgumentRemainder"};
var XPathPathExpr={label:"PathExpr"};
var XPathUnionExpr={label:"UnionExpr"};
var XPathFilterExpr={label:"FilterExpr"};
var XPathDigits={label:"Digits"};
var xpathNonTerminals=[XPathLocationPath,XPathRelativeLocationPath,XPathAbsoluteLocationPath,XPathStep,XPathNodeTest,XPathPredicate,XPathLiteral,XPathExpr,XPathPrimaryExpr,XPathVariableReference,XPathNumber,XPathFunctionCall,XPathArgumentRemainder,XPathPathExpr,XPathUnionExpr,XPathFilterExpr,XPathDigits];
var Q_01={label:"?"};
var Q_MM={label:"*"};
var Q_1M={label:"+"};
var ASSOC_LEFT=true;
var xpathGrammarRules=[[XPathLocationPath,[XPathRelativeLocationPath],18,passExpr],[XPathLocationPath,[XPathAbsoluteLocationPath],18,passExpr],[XPathAbsoluteLocationPath,[TOK_SLASH,XPathRelativeLocationPath],18,makeLocationExpr1],[XPathAbsoluteLocationPath,[TOK_DSLASH,XPathRelativeLocationPath],18,makeLocationExpr2],[XPathAbsoluteLocationPath,[TOK_SLASH],0,makeLocationExpr3],[XPathAbsoluteLocationPath,[TOK_DSLASH],0,makeLocationExpr4],[XPathRelativeLocationPath,[XPathStep],31,makeLocationExpr5],[XPathRelativeLocationPath,[XPathRelativeLocationPath,TOK_SLASH,XPathStep],31,makeLocationExpr6],[XPathRelativeLocationPath,[XPathRelativeLocationPath,TOK_DSLASH,XPathStep],31,makeLocationExpr7],[XPathStep,[TOK_DOT],33,makeStepExpr1],[XPathStep,[TOK_DDOT],33,makeStepExpr2],[XPathStep,[TOK_AXISNAME,TOK_AXIS,XPathNodeTest],33,makeStepExpr3],[XPathStep,[TOK_AT,XPathNodeTest],33,makeStepExpr4],[XPathStep,[XPathNodeTest],33,makeStepExpr5],[XPathStep,[XPathStep,XPathPredicate],33,makeStepExpr6],[XPathNodeTest,[TOK_ASTERISK],33,makeNodeTestExpr1],[XPathNodeTest,[TOK_NCNAME,TOK_COLON,TOK_ASTERISK],33,makeNodeTestExpr2],[XPathNodeTest,[TOK_QNAME],33,makeNodeTestExpr3],[XPathNodeTest,[TOK_NODEO,TOK_PARENC],33,makeNodeTestExpr4],[XPathNodeTest,[TOK_NODEO,XPathLiteral,TOK_PARENC],33,makeNodeTestExpr5],[XPathPredicate,[TOK_BRACKO,XPathExpr,TOK_BRACKC],33,makePredicateExpr],[XPathPrimaryExpr,[XPathVariableReference],33,passExpr],[XPathPrimaryExpr,[TOK_PARENO,XPathExpr,TOK_PARENC],33,makePrimaryExpr],[XPathPrimaryExpr,[XPathLiteral],30,passExpr],[XPathPrimaryExpr,[XPathNumber],30,passExpr],[XPathPrimaryExpr,[XPathFunctionCall],30,passExpr],[XPathFunctionCall,[TOK_QNAME,TOK_PARENO,TOK_PARENC],-1,makeFunctionCallExpr1],[XPathFunctionCall,[TOK_QNAME,TOK_PARENO,XPathExpr,XPathArgumentRemainder,Q_MM,TOK_PARENC],-1,makeFunctionCallExpr2],[XPathArgumentRemainder,[TOK_COMMA,XPathExpr],-1,makeArgumentExpr],[XPathUnionExpr,[XPathPathExpr],20,passExpr],[XPathUnionExpr,[XPathUnionExpr,TOK_PIPE,XPathPathExpr],20,makeUnionExpr],[XPathPathExpr,[XPathLocationPath],20,passExpr],[XPathPathExpr,[XPathFilterExpr],19,passExpr],[XPathPathExpr,[XPathFilterExpr,TOK_SLASH,XPathRelativeLocationPath],20,makePathExpr1],[XPathPathExpr,[XPathFilterExpr,TOK_DSLASH,XPathRelativeLocationPath],20,makePathExpr2],[XPathFilterExpr,[XPathPrimaryExpr,XPathPredicate,Q_MM],20,makeFilterExpr],[XPathExpr,[XPathPrimaryExpr],16,passExpr],[XPathExpr,[XPathUnionExpr],16,passExpr],[XPathExpr,[TOK_MINUS,XPathExpr],-1,makeUnaryMinusExpr],[XPathExpr,[XPathExpr,TOK_OR,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_AND,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_EQ,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_NEQ,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_LT,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_LE,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_GT,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_GE,XPathExpr],-1,makeBinaryExpr],[XPathExpr,[XPathExpr,TOK_PLUS,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_MINUS,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_ASTERISK,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_DIV,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathExpr,[XPathExpr,TOK_MOD,XPathExpr],-1,makeBinaryExpr,ASSOC_LEFT],[XPathLiteral,[TOK_LITERALQ],-1,makeLiteralExpr],[XPathLiteral,[TOK_LITERALQQ],-1,makeLiteralExpr],[XPathNumber,[TOK_NUMBER],-1,makeNumberExpr],[XPathVariableReference,[TOK_DOLLAR,TOK_QNAME],200,makeVariableReference]];
var xpathRules=[];
function xpathParseInit(){if(xpathRules.length){return 
}xpathGrammarRules.sort(function(a,b){var la=a[1].length;
var lb=b[1].length;
if(la<lb){return 1
}else{if(la>lb){return -1
}else{return 0
}}});
var k=1;
for(var i=0;
i<xpathNonTerminals.length;
++i){xpathNonTerminals[i].key=k++
}for(i=0;
i<xpathTokenRules.length;
++i){xpathTokenRules[i].key=k++
}xpathLog("XPath parse INIT: "+k+" rules");
function push_(array,position,element){if(!array[position]){array[position]=[]
}array[position].push(element)
}for(i=0;
i<xpathGrammarRules.length;
++i){var rule=xpathGrammarRules[i];
var pattern=rule[1];
for(var j=pattern.length-1;
j>=0;
--j){if(pattern[j]==Q_1M){push_(xpathRules,pattern[j-1].key,rule);
break
}else{if(pattern[j]==Q_MM||pattern[j]==Q_01){push_(xpathRules,pattern[j-1].key,rule);
--j
}else{push_(xpathRules,pattern[j].key,rule);
break
}}}}xpathLog("XPath parse INIT: "+xpathRules.length+" rule bins");
var sum=0;
mapExec(xpathRules,function(i){if(i){sum+=i.length
}});
xpathLog("XPath parse INIT: "+(sum/xpathRules.length)+" average bin size")
}function xpathCollectDescendants(nodelist,node){for(var n=node.firstChild;
n;
n=n.nextSibling){nodelist.push(n);
arguments.callee(nodelist,n)
}}function xpathCollectDescendantsReverse(nodelist,node){for(var n=node.lastChild;
n;
n=n.previousSibling){nodelist.push(n);
arguments.callee(nodelist,n)
}}function xpathDomEval(expr,node){var expr1=xpathParse(expr);
var ret=expr1.evaluate(new ExprContext(node));
return ret
}function xpathSort(input,sort){if(sort.length==0){return 
}var sortlist=[];
for(var i=0;
i<input.contextSize();
++i){var node=input.nodelist[i];
var sortitem={node:node,key:[]};
var context=input.clone(node,0,[node]);
for(var j=0;
j<sort.length;
++j){var s=sort[j];
var value=s.expr.evaluate(context);
var evalue;
if(s.type=="text"){evalue=value.stringValue()
}else{if(s.type=="number"){evalue=value.numberValue()
}}sortitem.key.push({value:evalue,order:s.order})
}sortitem.key.push({value:i,order:"ascending"});
sortlist.push(sortitem)
}sortlist.sort(xpathSortByKey);
var nodes=[];
for(var i=0;
i<sortlist.length;
++i){nodes.push(sortlist[i].node)
}input.nodelist=nodes;
input.setNode(0)
}function xpathSortByKey(v1,v2){for(var i=0;
i<v1.key.length;
++i){var o=v1.key[i].order=="descending"?-1:1;
if(v1.key[i].value>v2.key[i].value){return +1*o
}else{if(v1.key[i].value<v2.key[i].value){return -1*o
}}}return 0
}function xpathEval(select,context){var expr=xpathParse(select);
var ret=expr.evaluate(context);
return ret
};