
/* Merged Plone Javascript file
 * This file is dynamically assembled from separate parts.
 * Some of these parts have 3rd party licenses or copyright information attached
 * Such information is valid for that section,
 * not for the entire composite file
 * originating files are separated by - filename.js -
 */

/* - spry.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/spry.js?original=1
var Spry;if(!Spry) Spry={};if(!Spry.Widget) Spry.Widget={};Spry.Widget.Accordion=function(element,opts){this.element=this.getElement(element);this.defaultPanel=0;this.hoverClass="AccordionPanelTabHover";this.openClass="AccordionPanelOpen";this.closedClass="AccordionPanelClosed";this.focusedClass="AccordionFocused";this.enableAnimation=true;this.enableKeyboardNavigation=true;this.currentPanel=null;this.animator=null;this.hasFocus=null;this.duration=500;this.previousPanelKeyCode=Spry.Widget.Accordion.KEY_UP;this.nextPanelKeyCode=Spry.Widget.Accordion.KEY_DOWN;this.useFixedPanelHeights=true;this.fixedPanelHeight=0;Spry.Widget.Accordion.setOptions(this,opts,true);if(Spry.Widget.Accordion.onloadDidFire)
this.attachBehaviors();else
Spry.Widget.Accordion.loadQueue.push(this)};Spry.Widget.Accordion.onloadDidFire=false;Spry.Widget.Accordion.loadQueue=[];Spry.Widget.Accordion.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.Accordion.processLoadQueue=function(handler){Spry.Widget.Accordion.onloadDidFire=true;var q=Spry.Widget.Accordion.loadQueue;var qlen=q.length;for(var i=0;i<qlen;i++)
q[i].attachBehaviors()};Spry.Widget.Accordion.addLoadListener(Spry.Widget.Accordion.processLoadQueue);Spry.Widget.Accordion.prototype.getElement=function(ele){if(ele&&typeof ele=="string")
return document.getElementById(ele);return ele};Spry.Widget.Accordion.prototype.addClassName=function(ele,className){if(!ele||!className||(ele.className&&ele.className.search(new RegExp("\\b"+className+"\\b"))!=-1))
return;ele.className+=(ele.className?" ":"")+className};Spry.Widget.Accordion.prototype.removeClassName=function(ele,className){if(!ele||!className||(ele.className&&ele.className.search(new RegExp("\\b"+className+"\\b"))==-1))
return;ele.className=ele.className.replace(new RegExp("\\s*\\b"+className+"\\b","g"),"")};Spry.Widget.Accordion.setOptions=function(obj,optionsObj,ignoreUndefinedProps){if(!optionsObj)
return;for(var optionName in optionsObj){if(ignoreUndefinedProps&&optionsObj[optionName]==undefined)
continue;obj[optionName]=optionsObj[optionName]}};Spry.Widget.Accordion.prototype.onPanelTabMouseOver=function(panel){if(panel)
this.addClassName(this.getPanelTab(panel),this.hoverClass)};Spry.Widget.Accordion.prototype.onPanelTabMouseOut=function(panel){if(panel)
this.removeClassName(this.getPanelTab(panel),this.hoverClass)};Spry.Widget.Accordion.prototype.openPanel=function(panel){var panelA=this.currentPanel;var panelB=panel;if(!panelB||panelA==panelB)
return;var contentA;if(panelA)
contentA=this.getPanelContent(panelA);var contentB=this.getPanelContent(panelB);if(!contentB)
return;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});this.animator.start()}
else{if(contentA)
contentA.style.height="0px";contentB.style.height=(this.useFixedPanelHeights?this.fixedPanelHeight:contentB.scrollHeight)+"px"}
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};Spry.Widget.Accordion.prototype.openNextPanel=function(){var panels=this.getPanels();var curPanelIndex=this.getCurrentPanelIndex();if(panels&&curPanelIndex>=0&&(curPanelIndex+1)<panels.length)
this.openPanel(panels[curPanelIndex+1])};Spry.Widget.Accordion.prototype.openPreviousPanel=function(){var panels=this.getPanels();var curPanelIndex=this.getCurrentPanelIndex();if(panels&&curPanelIndex>0&&curPanelIndex<panels.length)
this.openPanel(panels[curPanelIndex-1])};Spry.Widget.Accordion.prototype.openFirstPanel=function(){var panels=this.getPanels();if(panels)
this.openPanel(panels[0])};Spry.Widget.Accordion.prototype.openLastPanel=function(){var panels=this.getPanels();if(panels)
this.openPanel(panels[panels.length-1])};Spry.Widget.Accordion.prototype.onPanelClick=function(panel){if(panel!=this.currentPanel)
this.openPanel(panel);this.focus()};Spry.Widget.Accordion.prototype.onFocus=function(e){this.hasFocus=true;this.addClassName(this.element,this.focusedClass)};Spry.Widget.Accordion.prototype.onBlur=function(e){this.hasFocus=false;this.removeClassName(this.element,this.focusedClass)};Spry.Widget.Accordion.KEY_UP=38;Spry.Widget.Accordion.KEY_DOWN=40;Spry.Widget.Accordion.prototype.onKeyDown=function(e){var key=e.keyCode;if(!this.hasFocus||(key!=this.previousPanelKeyCode&&key!=this.nextPanelKeyCode))
return true;var panels=this.getPanels();if(!panels||panels.length<1)
return false;var currentPanel=this.currentPanel?this.currentPanel:panels[0];var nextPanel=(key==this.nextPanelKeyCode)?currentPanel.nextSibling:currentPanel.previousSibling;while(nextPanel){if(nextPanel.nodeType==1)
break;nextPanel=(key==this.nextPanelKeyCode)?nextPanel.nextSibling:nextPanel.previousSibling}
if(nextPanel&&currentPanel!=nextPanel)
this.openPanel(nextPanel);if(e.stopPropagation)
e.stopPropagation();if(e.preventDefault)
e.preventDefault();return false};Spry.Widget.Accordion.prototype.attachPanelHandlers=function(panel){if(!panel)
return;var tab=this.getPanelTab(panel);if(tab){var self=this;Spry.Widget.Accordion.addEventListener(tab,"click", function(e){return self.onPanelClick(panel)},false);Spry.Widget.Accordion.addEventListener(tab,"mouseover", function(e){return self.onPanelTabMouseOver(panel)},false);Spry.Widget.Accordion.addEventListener(tab,"mouseout", function(e){return self.onPanelTabMouseOut(panel)},false)}};Spry.Widget.Accordion.addEventListener=function(element,eventType,handler,capture){try{if(element.addEventListener)
element.addEventListener(eventType,handler,capture);else if(element.attachEvent)
element.attachEvent("on"+eventType,handler)}
catch(e){}};Spry.Widget.Accordion.prototype.initPanel=function(panel,isDefault){var content=this.getPanelContent(panel);if(isDefault){this.currentPanel=panel;this.removeClassName(panel,this.closedClass);this.addClassName(panel,this.openClass)}
else{this.removeClassName(panel,this.openClass);this.addClassName(panel,this.closedClass);content.style.height="0px"}
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)}
if(this.enableKeyboardNavigation){var tabIndexAttr=this.element.attributes.getNamedItem("tabindex");if(tabIndexAttr){var self=this;Spry.Widget.Accordion.addEventListener(this.element,"focus", function(e){return self.onFocus(e)},false);Spry.Widget.Accordion.addEventListener(this.element,"blur", function(e){return self.onBlur(e)},false);Spry.Widget.Accordion.addEventListener(this.element,"keydown", function(e){return self.onKeyDown(e)},false)}}};Spry.Widget.Accordion.prototype.getPanels=function(){return this.getElementChildren(this.element)};Spry.Widget.Accordion.prototype.getCurrentPanel=function(){return this.currentPanel};Spry.Widget.Accordion.prototype.getCurrentPanelIndex=function(){var panels=this.getPanels();for(var i=0 ;i<panels.length;i++){if(this.currentPanel==panels[i])
return i}
return 0};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)
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.PanelAnimator=function(accordion,panel,opts){this.timer=null;this.interval=0;this.stepCount=0;this.fps=0;this.steps=10;this.duration=500;this.onComplete=null;this.panel=panel;this.panelToOpen=accordion.getElement(panel);this.panelData=[];Spry.Widget.Accordion.setOptions(this,opts,true);if(this.fps>0){this.interval=Math.floor(1000/this.fps);this.steps=parseInt((this.duration+(this.interval-1))/this.interval)}
else if(this.steps>0)
this.interval=this.duration/this.steps;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){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.increment=(obj.toHeight-obj.fromHeight)/this.steps;obj.overflow=c.style.overflow;this.panelData.push(obj);c.style.overflow="hidden";c.style.height=h+"px"}}}};Spry.Widget.Accordion.PanelAnimator.prototype.start=function(){var self=this;this.timer=setTimeout(function(){self.stepAnimation()},this.interval)};Spry.Widget.Accordion.PanelAnimator.prototype.stop=function(){if(this.timer){clearTimeout(this.timer);if(this.stepCount<this.steps){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(){++this.stepCount;this.animate();if(this.stepCount<this.steps)
this.start();else if(this.onComplete)
this.onComplete()};Spry.Widget.Accordion.PanelAnimator.prototype.animate=function(){var i,obj;if(this.stepCount>=this.steps){for(i=0;i<this.panelData.length;i++){obj=this.panelData[i];if(obj.panel!=this.panel)
obj.content.style.height="0px";obj.content.style.overflow=obj.overflow;obj.content.style.height=obj.toHeight+"px"}}
else{for(i=0;i<this.panelData.length;i++){obj=this.panelData[i];obj.fromHeight+=obj.increment;obj.content.style.height=obj.fromHeight+"px"}}};

/* - xpath.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/xpath.js?original=1
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}


/* - SpryData.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SpryData.js?original=1
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.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(/^\//, ""); // Strip any leading slash.
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){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=0x01;Spry.Data.Region.RS_LoadingData=0x02;Spry.Data.Region.RS_PreUpdate=0x04;Spry.Data.Region.RS_PostUpdate=0x08;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 /* results[0].charAt(0) == '{' */){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 /* results[0].charAt(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)});

/* - SpryDataExtensions.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SpryDataExtensions.js?original=1
Spry.Data.DataSet.multiFilterFuncs={};Spry.Data.DataSet.multiFilterFuncs.and=function(ds,row,rowNumber,filters){if(filters){var numFilters=filters.length;for(var i=0;i<numFilters;i++){row=filters[i](ds,row,rowNumber);if(!row)
break}}
return row};Spry.Data.DataSet.multiFilterFuncs.or=function(ds,row,rowNumber,filters){if(filters&&filters.length>0){var numFilters=filters.length;for(var i=0;i<numFilters;i++){var savedRow=row;row=filters[i](ds,row,rowNumber);if(row)
return row;row=savedRow}
return null}
return row};Spry.Data.DataSet.prototype.getMultiFilterFunc=function(){var func=Spry.Data.DataSet.multiFilterFuncs[this.getFilterMode()];if(!func)
func=Spry.Data.DataSet.multiFilterFuncs["and"];var filters=this.activeFilters;return function(ds,row,rowNumber){return func(ds,row,rowNumber,filters)}};Spry.Data.DataSet.prototype.addFilter=function(filterFunc,doApplyFilters){if(!this.hasFilter(filterFunc)){if(!this.activeFilters)
this.activeFilters=[];this.activeFilters.push(filterFunc)}
if(doApplyFilters)
this.applyFilters()};Spry.Data.DataSet.prototype.removeFilter=function(filterFunc,doApplyFilters){var filters=this.activeFilters;if(filters){var numFilters=filters.length;for(var i=0;i<numFilters;i++){if(filters[i]==filterFunc){this.activeFilters.splice(i,1);if(doApplyFilters)
this.applyFilters();return}}}};Spry.Data.DataSet.prototype.removeAllFilters=function(doApplyFilters){var filters=this.activeFilters;if(filters&&filters.length>0){this.activeFilters=[];if(doApplyFilters)
this.applyFilters()}};Spry.Data.DataSet.prototype.getFilters=function(filterFunc){if(!this.activeFilters)
this.activeFilters=[];return this.activeFilters};Spry.Data.DataSet.prototype.applyFilters=function(){if(this.activeFilters&&this.activeFilters.length>0)
this.filter(this.getMultiFilterFunc());else
this.filter(null)};Spry.Data.DataSet.prototype.hasFilter=function(filterFunc){if(!this.activeFilters&&this.activeFilters>0){var filters=this.activeFilters;var numFilters=filters.length;for(var i=0;i<numFilters;i++){if(filters[i]==filterFunc)
return true}}
return false};Spry.Data.DataSet.prototype.getFilterMode=function(){return this.filterMode?this.filterMode:"and"};Spry.Data.DataSet.prototype.setFilterMode=function(mode,doApplyFilters){var oldMode=this.getFilterMode();this.filterMode=mode;if(doApplyFilters)
this.applyFilters();return oldMode};

/* - SpryDOMUtils.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SpryDOMUtils.js?original=1
var Spry;if(!Spry) Spry={};if(!Spry.Utils) Spry.Utils={};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.setAttribute=function(ele,name,value){ele=Spry.$(ele);if(!ele||!name)
return;if(name=="class")
ele.className=value;else
ele.setAttribute(name,value)};Spry.Utils.removeAttribute=function(ele,name){ele=Spry.$(ele);if(!ele||!name)
return;try{ele.removeAttribute(name);if(name=="class")
ele.removeAttribute("className")} catch(e){}};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(Spry.Utils.hasClassName(ele,className))
ele.className=ele.className.replace(new RegExp("\\s*\\b"+className+"\\b","g"),"")};Spry.Utils.toggleClassName=function(ele,className){if(Spry.Utils.hasClassName(ele,className))
Spry.Utils.removeClassName(ele,className);else
Spry.Utils.addClassName(ele,className)};Spry.Utils.hasClassName=function(ele,className){ele=Spry.$(ele);if(!ele||!className||!ele.className||ele.className.search(new RegExp("\\b"+className+"\\b"))==-1)
return false;return true};Spry.Utils.camelizeString=function(str){var cStr="";var a=str.split("-");for(var i=0;i<a.length;i++){var s=a[i];if(s)
cStr=cStr?(cStr+s.charAt(0).toUpperCase()+s.substring(1)):s}
return cStr};Spry.Utils.styleStringToObject=function(styleStr){var o={};if(styleStr){pvA=styleStr.split(";");for(var i=0;i<pvA.length;i++){var pv=pvA[i];if(pv&&pv.indexOf(":")!=-1){var nvA=pv.split(":");var n=nvA[0].replace(/^\s*|\s*$/g,"");var v=nvA[1].replace(/^\s*|\s*$/g,"");if(n&&v)
o[Spry.Utils.camelizeString(n)]=v}}}
return o};Spry.Utils.addEventListener=function(element,eventType,handler,capture){try{if(!Spry.Utils.eventListenerIsBoundToElement(element,eventType,handler,capture)){element=Spry.$(element);handler=Spry.Utils.bindEventListenerToElement(element,eventType,handler,capture);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);handler=Spry.Utils.unbindEventListenerFromElement(element,eventType,handler,capture);if(element.removeEventListener)
element.removeEventListener(eventType,handler,capture);else if(element.detachEvent)
element.detachEvent("on"+eventType,handler)}
catch(e){}};Spry.Utils.eventListenerHash={};Spry.Utils.nextEventListenerID=1;Spry.Utils.getHashForElementAndHandler=function(element,eventType,handler,capture){var hash=null;element=Spry.$(element);if(element){if(typeof element.spryEventListenerID=="undefined")
element.spryEventListenerID="e"+(Spry.Utils.nextEventListenerID++);if(typeof handler.spryEventHandlerID=="undefined")
handler.spryEventHandlerID="h"+(Spry.Utils.nextEventListenerID++);hash=element.spryEventListenerID+"-"+handler.spryEventHandlerID+"-"+eventType+(capture?"-capture":"")}
return hash};Spry.Utils.eventListenerIsBoundToElement=function(element,eventType,handler,capture){element=Spry.$(element);var hash=Spry.Utils.getHashForElementAndHandler(element,eventType,handler,capture);return Spry.Utils.eventListenerHash[hash]!=undefined};Spry.Utils.bindEventListenerToElement=function(element,eventType,handler,capture){element=Spry.$(element);var hash=Spry.Utils.getHashForElementAndHandler(element,eventType,handler,capture);if(Spry.Utils.eventListenerHash[hash])
return Spry.Utils.eventListenerHash[hash];return Spry.Utils.eventListenerHash[hash]=function(e){e=e||window.event;if(!e.preventDefault) e.preventDefault=function(){this.returnValue=false};if(!e.stopPropagation) e.stopPropagation=function(){this.cancelBubble=true};var result=handler.call(element,e);if(result==false){e.preventDefault();e.stopPropagation()}
return result}};Spry.Utils.unbindEventListenerFromElement=function(element,eventType,handler,capture){element=Spry.$(element);var hash=Spry.Utils.getHashForElementAndHandler(element,eventType,handler,capture);if(Spry.Utils.eventListenerHash[hash]){handler=Spry.Utils.eventListenerHash[hash];Spry.Utils.eventListenerHash[hash]=undefined}
return handler};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.getAncestor=function(ele,selector){ele=Spry.$(ele);if(ele){var s=Spry.$$.tokenizeSequence(selector?selector:"*")[0];var t=s?s[0]:null;if(t){var p=ele.parentNode;while(p){if(t.match(p))
return p;p=p.parentNode}}}
return null};Spry.$$=function(selectorSequence,rootNode){if(!rootNode)
rootNode=document;else
rootNode=Spry.$(rootNode);var sequences=Spry.$$.tokenizeSequence(selectorSequence);var matches=[];Spry.$$.addExtensions(matches);++Spry.$$.queryID;var nid=0;var ns=sequences.length;for(var i=0;i<ns;i++){var m=Spry.$$.processTokens(sequences[i],rootNode);var nm=m.length;for(var j=0;j<nm;j++){var n=m[j];if(!n.spry$$ID){n.spry$$ID=++nid;matches.push(n)}}}
var nm=matches.length;for(i=0;i<nm;i++)
matches[i].spry$$ID=undefined;return matches};Spry.$$.cache={};Spry.$$.queryID=0;Spry.$$.Token=function(){this.type=Spry.$$.Token.SELECTOR;this.name="*";this.id="";this.classes=[];this.attrs=[];this.pseudos=[]};Spry.$$.Token.Attr=function(n,v){this.name=n;this.value=v?new RegExp(v):undefined};Spry.$$.Token.PseudoClass=function(pstr){this.name=pstr.replace(/\(.*/,"");this.arg=pstr.replace(/^[^\(\)]*\(?\s*|\)\s*$/g,"");this.func=Spry.$$.pseudoFuncs[this.name]};Spry.$$.Token.SELECTOR=0;Spry.$$.Token.COMBINATOR=1;Spry.$$.Token.prototype.match=function(ele,nameAlreadyMatches){if(this.type==Spry.$$.Token.COMBINATOR)
return false;if(!nameAlreadyMatches&&this.name!='*'&&this.name!=ele.nodeName.toLowerCase())
return false;if(this.id&&this.id!=ele.id)
return false;var classes=this.classes;var len=classes.length;for(var i=0;i<len;i++){if(!ele.className||!classes[i].value.test(ele.className))
return false}
var attrs=this.attrs;len=attrs.length;for(var i=0;i<len;i++){var a=attrs[i];var an=ele.attributes.getNamedItem(a.name);if(!an||(!a.value&&an.nodeValue==undefined)||(a.value&&!a.value.test(an.nodeValue)))
return false}
var ps=this.pseudos;var len=ps.length;for(var i=0;i<len;i++){var p=ps[i];if(p&&p.func&&!p.func(p.arg,ele,this))
return false}
return true};Spry.$$.Token.prototype.getNodeNameIfTypeMatches=function(ele){var nodeName=ele.nodeName.toLowerCase();if(this.name!='*'){if(this.name!=nodeName)
return null;return this.name}
return nodeName};Spry.$$.escapeRegExpCharsRE=/\/|\.|\*|\+|\(|\)|\[|\]|\{|\}|\\|\|/g;Spry.$$.tokenizeSequence=function(s){var cc=Spry.$$.cache[s];if(cc) return cc;var tokenExpr=/(\[[^\"'~\^\$\*\|\]=]+([~\^\$\*\|]?=\s*('[^']*'|"[^"]*"|[^"'\]]+))?\s*\])|((:[^\.#:\s,>~\+\[\]]+\(([^\(\)]+|\([^\(\)]*\))*\))|[\.#:]?[^\.#:\s,>~\+\[\]]+)|(\s*[\s,>~\+]\s*)/g;var tkn=new Spry.$$.Token;var sequence=[];sequence.push(tkn);var tokenSequences=[];tokenSequences.push(sequence);s=s.replace(/^\s*|\s*$/,"");var expMatch=tokenExpr.exec(s);while(expMatch){var tstr=expMatch[0];var c=tstr.charAt(0);switch(c){case '.':tkn.classes.push(new Spry.$$.Token.Attr("class","\\b"+tstr.substr(1)+"\\b"));break;case '#':tkn.id=tstr.substr(1);break;case ':':tkn.pseudos.push(new Spry.$$.Token.PseudoClass(tstr));break;case '[':var attrComps=tstr.match(/\[([^\"'~\^\$\*\|\]=]+)(([~\^\$\*\|]?=)\s*('[^']*'|"[^"]*"|[^"'\]]+))?\s*\]/);var name=attrComps[1];var matchType=attrComps[3];var val=attrComps[4];if(val){val=val.replace(/^['"]|['"]$/g, "");val=val.replace(Spry.$$.escapeRegExpCharsRE,'\\$&')}
var matchStr=undefined;switch(matchType){case "=":matchStr="^"+val+"$";break;case "^=":matchStr="^"+val;break;case "$=":matchStr=val+"$";break;case "~=":case "|=":matchStr="\\b"+val+"\\b";break;case "*=":matchStr=val;break}
tkn.attrs.push(new Spry.$$.Token.Attr(name,matchStr));break;default:var combiMatch=tstr.match(/^\s*([\s,~>\+])\s*$/);if(combiMatch){if(combiMatch[1]==','){sequence=new Array;tokenSequences.push(sequence);tkn=new Spry.$$.Token;sequence.push(tkn)}
else{tkn=new Spry.$$.Token;tkn.type=Spry.$$.Token.COMBINATOR;tkn.name=combiMatch[1];sequence.push(tkn);tkn=new Spry.$$.Token();sequence.push(tkn)}}
else
tkn.name=tstr.toLowerCase();break}
expMatch=tokenExpr.exec(s)}
Spry.$$.cache[s]=tokenSequences;return tokenSequences};Spry.$$.combinatorFuncs={" ": function(nodes,token){var uid=++Spry.$$.uniqueID;var results=[];var nn=nodes.length;for(var i=0;i<nn;i++){var n=nodes[i];if(uid!=n.spry$$uid){var ea=nodes[i].getElementsByTagName(token.name);var ne=ea.length;for(var j=0;j<ne;j++){var e=ea[j];if(token.match(e,true))
results.push(e);e.spry$$uid=uid}}}
return results},">": function(nodes,token){var results=[];var nn=nodes.length;for(var i=0;i<nn;i++){var n=nodes[i].firstChild;while(n){if(n.nodeType==1&&token.match(n))
results.push(n);n=n.nextSibling}}
return results},"+": function(nodes,token){var results=[];var nn=nodes.length;for(var i=0;i<nn;i++){var n=nodes[i].nextSibling;while(n&&n.nodeType!=1)
n=n.nextSibling;if(n&&token.match(n))
results.push(n)}
return results},"~": function(nodes,token){var uid=++Spry.$$.uniqueID;var results=[];var nn=nodes.length;for(var i=0;i<nn;i++){var n=nodes[i].nextSibling;while(n){if(n.nodeType==1){if(uid==n.spry$$uid)
break;if(token.match(n)){results.push(n);n.spry$$uid=uid}}
n=n.nextSibling}}
return results}};Spry.$$.uniqueID=0;Spry.$$.pseudoFuncs={":first-child": function(arg,node,token){var n=node.previousSibling;while(n){if(n.nodeType==1) return false;n=n.previousSibling}
return true},":last-child": function(arg,node,token){var n=node.nextSibling;while(n){if(n.nodeType==1)
return false;n=n.nextSibling}
return true},":empty": function(arg,node,token){var n=node.firstChild;while(n){switch(n.nodeType){case 1:case 3:case 4:case 5:return false}
n=n.nextSibling}
return true},":nth-child": function(arg,node,token){return Spry.$$.nthChild(arg,node,token)},":nth-last-child": function(arg,node,token){return Spry.$$.nthChild(arg,node,token,true)},":nth-of-type": function(arg,node,token){return Spry.$$.nthChild(arg,node,token,false,true)},":nth-last-of-type": function(arg,node,token){return Spry.$$.nthChild(arg,node,token,true,true)},":first-of-type": function(arg,node,token){var nodeName=token.getNodeNameIfTypeMatches(node);if(!nodeName) return false;var n=node.previousSibling;while(n){if(n.nodeType==1&&nodeName==n.nodeName.toLowerCase()) return false;n=n.previousSibling}
return true},":last-of-type": function(arg,node,token){var nodeName=token.getNodeNameIfTypeMatches(node);if(!nodeName) return false;var n=node.nextSibling;while(n){if(n.nodeType==1&&nodeName==n.nodeName.toLowerCase())
return false;n=n.nextSibling}
return true},":only-child": function(arg,node,token){var f=Spry.$$.pseudoFuncs;return f[":first-child"](arg,node,token)&&f[":last-child"](arg,node,token)},":only-of-type": function(arg,node,token){var f=Spry.$$.pseudoFuncs;return f[":first-of-type"](arg,node,token)&&f[":last-of-type"](arg,node,token)},":not": function(arg,node,token){var s=Spry.$$.tokenizeSequence(arg)[0];var t=s?s[0]:null;return!t||!t.match(node)},":enabled": function(arg,node,token){return!node.disabled},":disabled": function(arg,node,token){return node.disabled},":checked": function(arg,node,token){return node.checked},":root": function(arg,node,token){return node.parentNode&&node.ownerDocument&&node.parentNode==node.ownerDocument}};Spry.$$.nthRegExp=/((-|[0-9]+)?n)?([+-]?[0-9]*)/;Spry.$$.nthCache={"even":{a:2,b:0,mode:1,invalid:false},"odd":{a:2,b:1,mode:1,invalid:false},"2n":{a:2,b:0,mode:1,invalid:false},"2n+1":{a:2,b:1,mode:1,invalid:false}};Spry.$$.parseNthChildString=function(str){var o=Spry.$$.nthCache[str];if(!o){var m=str.match(Spry.$$.nthRegExp);var n=m[1];var a=m[2];var b=m[3];if(!a){a=n?1:0}
else if(a=="-"){a=-1}
else{a=parseInt(a,10)}
b=b?parseInt(b,10):0;var mode=(a==0)?0:((a>0)?1:-1);var invalid=false;if(a>0&&b<0){b=b%a;b=((b=(b%a))<0)?a+b:b}
else if(a<0){if(b<0)
invalid=true;else
a=Math.abs(a)}
o=new Object;o.a=a;o.b=b;o.mode=mode;o.invalid=invalid;Spry.$$.nthCache[str]=o}
return o};Spry.$$.nthChild=function(arg,node,token,fromLastSib,matchNodeName){if(matchNodeName){var nodeName=token.getNodeNameIfTypeMatches(node);if(!nodeName) return false}
var o=Spry.$$.parseNthChildString(arg);if(o.invalid)
return false;var qidProp="spry$$ncQueryID";var posProp="spry$$ncPos";var countProp="spry$$ncCount";if(matchNodeName){qidProp+=nodeName;posProp+=nodeName;countProp+=nodeName}
var parent=node.parentNode;if(parent[qidProp]!=Spry.$$.queryID){var pos=0;parent[qidProp]=Spry.$$.queryID;var c=parent.firstChild;while(c){if(c.nodeType==1&&(!matchNodeName||nodeName==c.nodeName.toLowerCase()))
c[posProp]=++pos;c=c.nextSibling}
parent[countProp]=pos}
pos=node[posProp];if(fromLastSib)
pos=parent[countProp]-pos+1;if(o.mode==0)
return pos==o.b;if(o.mode>0)
return(pos<o.b)?false:(!((pos-o.b)%o.a));return(pos>o.b)?false:(!((o.b-pos)%o.a))};Spry.$$.processTokens=function(tokens,root){var numTokens=tokens.length;var nodeSet=[root];var combiFunc=null;for(var i=0;i<numTokens&&nodeSet.length>0;i++){var t=tokens[i];if(t.type==Spry.$$.Token.SELECTOR){if(combiFunc){nodeSet=combiFunc(nodeSet,t);combiFunc=null}
else
nodeSet=Spry.$$.getMatchingElements(nodeSet,t)}
else
combiFunc=Spry.$$.combinatorFuncs[t.name]}
return nodeSet};Spry.$$.getMatchingElements=function(nodes,token){var results=[];if(token.id){n=nodes[0];if(n&&n.ownerDocument){var e=n.ownerDocument.getElementById(token.id);if(e){if(token.match(e))
results.push(e)}
return results}}
var nn=nodes.length;for(var i=0;i<nn;i++){var n=nodes[i];var ea=n.getElementsByTagName(token.name);var ne=ea.length;for(var j=0;j<ne;j++){var e=ea[j];if(token.match(e,true))
results.push(e)}}
return results};Spry.$$.addExtensions=function(a){for(var f in Spry.$$.Results)
a[f]=Spry.$$.Results[f]};Spry.$$.Results={};Spry.$$.Results.forEach=function(func){var n=this.length;for(var i=0;i<n;i++)
func(this[i]);return this};Spry.$$.Results.setAttribute=function(name,value){return this.forEach(function(n){Spry.Utils.setAttribute(n,name,value)})};Spry.$$.Results.removeAttribute=function(name){return this.forEach(function(n){Spry.Utils.removeAttribute(n,name)})};Spry.$$.Results.addClassName=function(className){return this.forEach(function(n){Spry.Utils.addClassName(n,className)})};Spry.$$.Results.removeClassName=function(className){return this.forEach(function(n){Spry.Utils.removeClassName(n,className)})};Spry.$$.Results.toggleClassName=function(className){return this.forEach(function(n){Spry.Utils.toggleClassName(n,className)})};Spry.$$.Results.addEventListener=function(eventType,handler,capture,bindHandler){return this.forEach(function(n){Spry.Utils.addEventListener(n,eventType,handler,capture,bindHandler)})};Spry.$$.Results.removeEventListener=function(eventType,handler,capture){return this.forEach(function(n){Spry.Utils.removeEventListener(n,eventType,handler,capture)})};Spry.$$.Results.setStyle=function(style){if(style){style=Spry.Utils.styleStringToObject(style);this.forEach(function(n){for(var p in style)
try{n.style[p]=style[p]} catch(e){}})}
return this};Spry.$$.Results.setProperty=function(prop,value){if(prop){if(typeof prop=="string"){var p={};p[prop]=value;prop=p}
this.forEach(function(n){for(var p in prop)
try{n[p]=prop[p]} catch(e){}})}
return this};

/* - SpryEffects.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SpryEffects.js?original=1
var Spry;if(!Spry) Spry={};Spry.forwards=1;Spry.backwards=2;if(!Spry.Effect) Spry.Effect={};Spry.Effect.Transitions={linearTransition: function(time,begin,change,duration){if(time>duration) return change+begin;return begin+(time/duration) * change},sinusoidalTransition: function(time,begin,change,duration){if(time>duration) return change+begin;return begin+((-Math.cos((time/duration)*Math.PI)/2)+0.5) * change},squareTransition: function(time,begin,change,duration){if(time>duration) return change+begin;return begin+Math.pow(time/duration,2) * change},squarerootTransition: function(time,begin,change,duration){if(time>duration) return change+begin;return begin+Math.sqrt(time/duration) * change},fifthTransition: function(time,begin,change,duration){if(time>duration) return change+begin;return begin+Math.sqrt((-Math.cos((time/duration)*Math.PI)/2)+0.5) * change},circleTransition: function(time,begin,change,duration){if(time>duration) return change+begin;var pos=time/duration;return begin+Math.sqrt(1-Math.pow((pos-1),2))* change},pulsateTransition: function(time,begin,change,duration){if(time>duration) return change+begin;return begin+(0.5+Math.sin(17*time/duration)/2) * change},growSpecificTransition: function(time,begin,change,duration){if(time>duration) return change+begin;var pos=time/duration;return begin+(5 * Math.pow(pos,3)-6.4 * Math.pow(pos,2)+2 * pos) * change}};for(var trans in Spry.Effect.Transitions){Spry[trans]=Spry.Effect.Transitions[trans]}
Spry.Effect.Registry=function(){this.effects=[]};Spry.Effect.Registry.prototype.getRegisteredEffect=function(element,options){var a={};a.element=Spry.Effect.getElement(element);a.options=options;for(var i=0;i<this.effects.length;i++)
if(this.effectsAreTheSame(this.effects[i],a))
return this.effects[i].effect;return false};Spry.Effect.Registry.prototype.addEffect=function(effect,element,options){if(!this.getRegisteredEffect(element,options)){var len=this.effects.length;this.effects[len]={};var eff=this.effects[len];eff.effect=effect;eff.element=Spry.Effect.getElement(element);eff.options=options}};Spry.Effect.Registry.prototype.effectsAreTheSame=function(effectA,effectB){if(effectA.element!=effectB.element)
return false;var compare=Spry.Effect.Utils.optionsAreIdentical(effectA.options,effectB.options);if(compare){if(typeof effectB.options.setup=='function')
effectA.options.setup=effectB.options.setup;if(typeof effectB.options.finish=='function')
effectA.options.finish=effectB.options.finish}
return compare};var SpryRegistry=new Spry.Effect.Registry;if(!Spry.Effect.Utils) Spry.Effect.Utils={};Spry.Effect.Utils.showError=function(msg){alert('Spry.Effect ERR: '+msg)};Spry.Effect.Utils.showInitError=function(effect){Spry.Effect.Utils.showError('The '+effect+' class can\'t be accessed as a static function anymore. '+"\n"+'Please read Spry Effects migration documentation.');return false};Spry.Effect.Utils.Position=function(){this.x=0;this.y=0;this.units="px"};Spry.Effect.Utils.Rectangle=function(){this.width=0;this.height=0;this.units="px"};Spry.Effect.Utils.intToHex=function(integerNum){var result=integerNum.toString(16);if(result.length==1)
result="0"+result;return result};Spry.Effect.Utils.hexToInt=function(hexStr){return parseInt(hexStr,16)};Spry.Effect.Utils.rgb=function(redInt,greenInt,blueInt){var intToHex=Spry.Effect.Utils.intToHex;var redHex=intToHex(redInt);var greenHex=intToHex(greenInt);var blueHex=intToHex(blueInt);compositeColorHex=redHex.concat(greenHex,blueHex).toUpperCase();compositeColorHex='#'+compositeColorHex;return compositeColorHex};Spry.Effect.Utils.longColorVersion=function(color){if(color.match(/^#[0-9a-f]{3}$/i)){var tmp=color.split('');var color='#';for(var i=1;i<tmp.length;i++){color+=tmp[i]+''+tmp[i]}}
return color};Spry.Effect.Utils.camelize=function(stringToCamelize){if(stringToCamelize.indexOf('-')==-1){return 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.Effect.Utils.isPercentValue=function(value){var result=false;if(typeof value=='string'&&value.length>0&&value.lastIndexOf("%")>0)
result=true;return result};Spry.Effect.Utils.getPercentValue=function(value){var result=0;try{result=Number(value.substring(0,value.lastIndexOf("%")))}
catch(e){Spry.Effect.Utils.showError('Spry.Effect.Utils.getPercentValue: '+e)}
return result};Spry.Effect.Utils.getPixelValue=function(value){var result=0;if(typeof value=='number') return value;var unitIndex=value.lastIndexOf("px");if(unitIndex==-1)
unitIndex=value.length;try{result=parseInt(value.substring(0,unitIndex),10)}
catch(e){}
return result};Spry.Effect.Utils.getFirstChildElement=function(node){if(node){var childCurr=node.firstChild;while(childCurr){if(childCurr.nodeType==1)
return childCurr;childCurr=childCurr.nextSibling}}
return null};Spry.Effect.Utils.fetchChildImages=function(startEltIn,targetImagesOut){if(!startEltIn||startEltIn.nodeType!=1||!targetImagesOut)
return;if(startEltIn.hasChildNodes()){var childImages=startEltIn.getElementsByTagName('img');var imageCnt=childImages.length;for(var i=0;i<imageCnt;i++){var imgCurr=childImages[i];var dimensionsCurr=Spry.Effect.getDimensions(imgCurr);targetImagesOut.push([imgCurr,dimensionsCurr.width,dimensionsCurr.height])}}};Spry.Effect.Utils.optionsAreIdentical=function(optionsA,optionsB){if(optionsA==null&&optionsB==null)
return true;if(optionsA!=null&&optionsB!=null){var objectCountA=0;var objectCountB=0;for(var propA in optionsA) objectCountA++;for(var propB in optionsB) objectCountB++;if(objectCountA!=objectCountB)
return false;for(var prop in optionsA){var typeA=typeof optionsA[prop];var typeB=typeof optionsB[prop];if(typeA!=typeB||(typeA!='undefined'&&optionsA[prop]!=optionsB[prop]))
return false}
return true}
return false};Spry.Effect.Utils.DoEffect=function(effectName,element,options){if(!options)
var options={};options.name=effectName;var ef=SpryRegistry.getRegisteredEffect(element,options);if(!ef){ef=new Spry.Effect[effectName](element,options);SpryRegistry.addEffect(ef,element,options)}
ef.start();return true};if(!Spry.Utils) Spry.Utils={};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.Effect.Utils.showError("Unbalanced enableNotifications() call!\n")}};Spry.Utils.Notifier.prototype.disableNotifications=function(){++this.suppressNotifications};Spry.Effect.getElement=function(ele){var element=ele;if(typeof ele=="string")
element=document.getElementById(ele);if(element==null)
Spry.Effect.Utils.showError('Element "'+ele+'" not found.');return element};Spry.Effect.getStyleProp=function(element,prop){var value;var camelized=Spry.Effect.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){Spry.Effect.Utils.showError('Spry.Effect.getStyleProp: '+e)}
return value=='auto'?null:value};Spry.Effect.setStyleProp=function(element,prop,value){try{element.style[Spry.Effect.Utils.camelize(prop)]=value}
catch(e){Spry.Effect.Utils.showError('Spry.Effect.setStyleProp: '+e)}};Spry.Effect.getStylePropRegardlessOfDisplayState=function(element,prop,displayElement){var refElement=displayElement?displayElement:element;var displayOrig=Spry.Effect.getStyleProp(refElement,'display');var visibilityOrig=Spry.Effect.getStyleProp(refElement,'visibility');if(displayOrig=='none'){Spry.Effect.setStyleProp(refElement,'visibility','hidden');Spry.Effect.setStyleProp(refElement,'display','block');if(window.opera)
refElement.focus()}
var styleProp=Spry.Effect.getStyleProp(element,prop);if(displayOrig=='none'){Spry.Effect.setStyleProp(refElement,'display','none');Spry.Effect.setStyleProp(refElement,'visibility',visibilityOrig)}
return styleProp};Spry.Effect.makePositioned=function(element){var pos=Spry.Effect.getStyleProp(element,'position');if(!pos||pos=='static'){element.style.position='relative';if(window.opera){element.style.top=0;element.style.left=0}}};Spry.Effect.isInvisible=function(element){var propDisplay=Spry.Effect.getStyleProp(element,'display');if(propDisplay&&propDisplay.toLowerCase()=='none')
return true;var propVisible=Spry.Effect.getStyleProp(element,'visibility');if(propVisible&&propVisible.toLowerCase()=='hidden')
return true;return false};Spry.Effect.enforceVisible=function(element){var propDisplay=Spry.Effect.getStyleProp(element,'display');if(propDisplay&&propDisplay.toLowerCase()=='none')
Spry.Effect.setStyleProp(element,'display','block');var propVisible=Spry.Effect.getStyleProp(element,'visibility');if(propVisible&&propVisible.toLowerCase()=='hidden')
Spry.Effect.setStyleProp(element,'visibility','visible')};Spry.Effect.makeClipping=function(element){var overflow=Spry.Effect.getStyleProp(element,'overflow');if(!overflow||(overflow.toLowerCase()!='hidden'&&overflow.toLowerCase()!='scroll')){var heightCache=0;var needsCache=/MSIE 7.0/.test(navigator.userAgent) && /Windows NT/.test(navigator.userAgent);if(needsCache)
heightCache=Spry.Effect.getDimensionsRegardlessOfDisplayState(element).height;Spry.Effect.setStyleProp(element,'overflow','hidden');if(needsCache)
Spry.Effect.setStyleProp(element,'height',heightCache+'px')}};Spry.Effect.cleanWhitespace=function(element){var childCountInit=element.childNodes.length;for(var i=childCountInit-1;i>=0;i--){var node=element.childNodes[i];if(node.nodeType==3&&!/\S/.test(node.nodeValue))
try{element.removeChild(node)}
catch(e){Spry.Effect.Utils.showError('Spry.Effect.cleanWhitespace: '+e)}}};Spry.Effect.getComputedStyle=function(element){return/MSIE/.test(navigator.userAgent)?element.currentStyle:document.defaultView.getComputedStyle(element,null)};Spry.Effect.getDimensions=function(element){var dimensions=new Spry.Effect.Utils.Rectangle;var computedStyle=null;if(element.style.width&&/px/i.test(element.style.width))
dimensions.width=parseInt(element.style.width,10);else{computedStyle=Spry.Effect.getComputedStyle(element);var tryComputedStyle=computedStyle&&computedStyle.width&&/px/i.test(computedStyle.width);if(tryComputedStyle)
dimensions.width=parseInt(computedStyle.width,10);if(!tryComputedStyle||dimensions.width==0)
dimensions.width=element.offsetWidth}
if(element.style.height&&/px/i.test(element.style.height))
dimensions.height=parseInt(element.style.height,10);else{if(!computedStyle)
computedStyle=Spry.Effect.getComputedStyle(element);var tryComputedStyle=computedStyle&&computedStyle.height&&/px/i.test(computedStyle.height);if(tryComputedStyle)
dimensions.height=parseInt(computedStyle.height,10);if(!tryComputedStyle||dimensions.height==0)
dimensions.height=element.offsetHeight}
return dimensions};Spry.Effect.getDimensionsRegardlessOfDisplayState=function(element,displayElement){var refElement=displayElement?displayElement:element;var displayOrig=Spry.Effect.getStyleProp(refElement,'display');var visibilityOrig=Spry.Effect.getStyleProp(refElement,'visibility');if(displayOrig=='none'){Spry.Effect.setStyleProp(refElement,'visibility','hidden');Spry.Effect.setStyleProp(refElement,'display','block');if(window.opera)
refElement.focus()}
var dimensions=Spry.Effect.getDimensions(element);if(displayOrig=='none'){Spry.Effect.setStyleProp(refElement,'display','none');Spry.Effect.setStyleProp(refElement,'visibility',visibilityOrig)}
return dimensions};Spry.Effect.getOpacity=function(element){var o=Spry.Effect.getStyleProp(element,"opacity");if(typeof o=='undefined'||o==null)
o=1.0;return o};Spry.Effect.getBgColor=function(ele){return Spry.Effect.getStyleProp(ele,"background-color")};Spry.Effect.intPropStyle=function(e,prop){var i=parseInt(Spry.Effect.getStyleProp(e,prop),10);if(isNaN(i))
return 0;return i};Spry.Effect.getPosition=function(element){var position=new Spry.Effect.Utils.Position;var computedStyle=null;if(element.style.left&&/px/i.test(element.style.left))
position.x=parseInt(element.style.left,10);else{computedStyle=Spry.Effect.getComputedStyle(element);var tryComputedStyle=computedStyle&&computedStyle.left&&/px/i.test(computedStyle.left);if(tryComputedStyle)
position.x=parseInt(computedStyle.left,10);if(!tryComputedStyle||position.x==0)
position.x=element.offsetLeft}
if(element.style.top&&/px/i.test(element.style.top))
position.y=parseInt(element.style.top,10);else{if(!computedStyle)
computedStyle=Spry.Effect.getComputedStyle(element);var tryComputedStyle=computedStyle&&computedStyle.top&&/px/i.test(computedStyle.top);if(tryComputedStyle)
position.y=parseInt(computedStyle.top,10);if(!tryComputedStyle||position.y==0)
position.y=element.offsetTop}
return position};Spry.Effect.getOffsetPosition=Spry.Effect.getPosition;Spry.Effect.Animator=function(options){Spry.Utils.Notifier.call(this);this.name='Animator';this.element=null;this.startMilliseconds=0;this.repeat='none';this.isRunning=false;this.timer=null;this.cancelRemaining=0;if(!options)
var options={};if(options.toggle)
this.direction=false;else
this.direction=Spry.forwards;var self=this;if(options.setup!=null)
this.addObserver({onPreEffect: function(){try{self.options.setup(self.element,self)}catch(e){Spry.Effect.Utils.showError('Spry.Effect.Animator.prototype.start: setup callback: '+e)}}});if(options.finish!=null)
this.addObserver({onPostEffect: function(){try{self.options.finish(self.element,self)}catch(e){Spry.Effect.Utils.showError('Spry.Effect.Animator.prototype.stop: finish callback: '+e)}}});this.options={duration:1000,toggle:false,transition:Spry.linearTransition,interval:16};this.setOptions(options);if(options.transition)
this.setTransition(options.transition);if(options.fps)
this.setFps(options.fps)};Spry.Effect.Animator.prototype=new Spry.Utils.Notifier();Spry.Effect.Animator.prototype.constructor=Spry.Utils.Animator;Spry.Effect.Animator.prototype.notStaticAnimator=true;Spry.Effect.Animator.prototype.setOptions=function(options){if(!options)
return;for(var prop in options)
this.options[prop]=options[prop]};Spry.Effect.Animator.prototype.setTransition=function(transition){if(typeof transition=='number'||transition=="1"||transition=="2")
switch(parseInt(transition,10)){case 1:transition=Spry.linearTransition;break;case 2:transition=Spry.sinusoidalTransition;break;default:Spry.Effect.Utils.showError('unknown transition')}
else if(typeof transition=='string'){if(typeof window[transition]=='function')
transition=window[transition];else if(typeof Spry[transition]=='function')
transition=Spry[transition];else
Spry.Effect.Utils.showError('unknown transition')}
this.options.transition=transition;if(typeof this.effectsArray!='undefined'){var l=this.effectsArray.length;for(var i=0;i<l;i++)
this.effectsArray[i].effect.setTransition(transition)}};Spry.Effect.Animator.prototype.setDuration=function(duration){this.options.duration=duration;if(typeof this.effectsArray!='undefined'){var l=this.effectsArray.length;for(var i=0;i<l;i++){this.effectsArray[i].effect.setDuration(duration)}}};Spry.Effect.Animator.prototype.setFps=function(fps){this.options.interval=parseInt(1000/fps,10);this.options.fps=fps;if(typeof this.effectsArray!='undefined'){var l=this.effectsArray.length;for(var i=0;i<l;i++){this.effectsArray[i].effect.setFps(fps)}}};Spry.Effect.Animator.prototype.start=function(withoutTimer){if(!this.element)
return;if(arguments.length==0)
withoutTimer=false;if(this.isRunning)
this.cancel();this.prepareStart();var currDate=new Date();this.startMilliseconds=currDate.getTime();if(this.element.id)
this.element=document.getElementById(this.element.id);if(this.cancelRemaining!=0&&this.options.toggle){if(this.cancelRemaining<1&&typeof this.options.transition=='function'){var startTime=0;var stopTime=this.options.duration;var start=0;var stop=1;var emergency=0;this.cancelRemaining=Math.round(this.cancelRemaining * 1000)/1000;var found=false;var middle=0;while(!found){if(emergency++>this.options.duration) break;var half=startTime+((stopTime-startTime)/2);middle=Math.round(this.options.transition(half,1,-1,this.options.duration) * 1000)/1000;if(middle==this.cancelRemaining){this.startMilliseconds-=half;found=true}
if(middle<this.cancelRemaining){stopTime=half;stop=middle}
else{startTime=half;start=middle}}}
this.cancelRemaining=0}
this.notifyObservers('onPreEffect',this);if(withoutTimer==false){var self=this;this.timer=setInterval(function(){self.drawEffect()},this.options.interval)}
this.isRunning=true};Spry.Effect.Animator.prototype.stopFlagReset=function(){if(this.timer){clearInterval(this.timer);this.timer=null}
this.startMilliseconds=0};Spry.Effect.Animator.prototype.stop=function(){this.stopFlagReset();this.notifyObservers('onPostEffect',this);this.isRunning=false};Spry.Effect.Animator.prototype.cancel=function(){var elapsed=this.getElapsedMilliseconds();if(this.startMilliseconds>0&&elapsed<this.options.duration)
this.cancelRemaining=this.options.transition(elapsed,0,1,this.options.duration);this.stopFlagReset();this.notifyObservers('onCancel',this);this.isRunning=false};Spry.Effect.Animator.prototype.drawEffect=function(){var isRunning=true;this.notifyObservers('onStep',this);var timeElapsed=this.getElapsedMilliseconds();if(typeof this.options.transition!='function'){Spry.Effect.Utils.showError('unknown transition');return}
this.animate();if(timeElapsed>this.options.duration){isRunning=false;this.stop()}
return isRunning};Spry.Effect.Animator.prototype.getElapsedMilliseconds=function(){if(this.startMilliseconds>0){var currDate=new Date();return(currDate.getTime()-this.startMilliseconds)}
return 0};Spry.Effect.Animator.prototype.doToggle=function(){if(!this.direction){this.direction=Spry.forwards;return}
if(this.options.toggle==true){if(this.direction==Spry.forwards){this.direction=Spry.backwards;this.notifyObservers('onToggle',this)}
else if(this.direction==Spry.backwards){this.direction=Spry.forwards}}};Spry.Effect.Animator.prototype.prepareStart=function(){if(this.options&&this.options.toggle)
this.doToggle()};Spry.Effect.Animator.prototype.animate=function(){};Spry.Effect.Animator.prototype.onStep=function(el){if(el!=this)
this.notifyObservers('onStep',this)};Spry.Effect.Move=function(element,fromPos,toPos,options){this.dynamicFromPos=false;if(arguments.length==3){options=toPos;toPos=fromPos;fromPos=Spry.Effect.getPosition(element);this.dynamicFromPos=true}
Spry.Effect.Animator.call(this,options);this.name='Move';this.element=Spry.Effect.getElement(element);if(!this.element)
return;if(fromPos.units!=toPos.units)
Spry.Effect.Utils.showError('Spry.Effect.Move: Conflicting units ('+fromPos.units+', '+toPos.units+')');this.units=fromPos.units;this.startX=Number(fromPos.x);this.stopX=Number(toPos.x);this.startY=Number(fromPos.y);this.stopY=Number(toPos.y)};Spry.Effect.Move.prototype=new Spry.Effect.Animator();Spry.Effect.Move.prototype.constructor=Spry.Effect.Move;Spry.Effect.Move.prototype.animate=function(){var left=0;var top=0;var floor=Math.floor;var elapsed=this.getElapsedMilliseconds();if(this.direction==Spry.forwards){left=floor(this.options.transition(elapsed,this.startX,this.stopX-this.startX,this.options.duration));top=floor(this.options.transition(elapsed,this.startY,this.stopY-this.startY,this.options.duration))}
else if(this.direction==Spry.backwards){left=floor(this.options.transition(elapsed,this.stopX,this.startX-this.stopX,this.options.duration));top=floor(this.options.transition(elapsed,this.stopY,this.startY-this.stopY,this.options.duration))}
this.element.style.left=left+this.units;this.element.style.top=top+this.units};Spry.Effect.Move.prototype.prepareStart=function(){if(this.options&&this.options.toggle)
this.doToggle();if(this.dynamicFromPos==true){var fromPos=Spry.Effect.getPosition(this.element);this.startX=fromPos.x;this.startY=fromPos.y;this.rangeMoveX=this.startX-this.stopX;this.rangeMoveY=this.startY-this.stopY}};Spry.Effect.Size=function(element,fromRect,toRect,options){this.dynamicFromRect=false;if(arguments.length==3){options=toRect;toRect=fromRect;fromRect=Spry.Effect.getDimensionsRegardlessOfDisplayState(element);this.dynamicFromRect=true}
Spry.Effect.Animator.call(this,options);this.name='Size';this.element=Spry.Effect.getElement(element);if(!this.element)
return;element=this.element;if(fromRect.units!=toRect.units){Spry.Effect.Utils.showError('Spry.Effect.Size: Conflicting units ('+fromRect.units+', '+toRect.units+')');return false}
this.units=fromRect.units;var originalRect=Spry.Effect.getDimensionsRegardlessOfDisplayState(element);this.originalWidth=originalRect.width;this.originalHeight=originalRect.height;this.startWidth=fromRect.width;this.startHeight=fromRect.height;this.stopWidth=toRect.width;this.stopHeight=toRect.height;this.childImages=new Array();if(this.options.useCSSBox){Spry.Effect.makePositioned(this.element);var intProp=Spry.Effect.intPropStyle;this.startFromBorder_top=intProp(element,'border-top-width');this.startFromBorder_bottom=intProp(element,'border-bottom-width');this.startFromBorder_left=intProp(element,'border-left-width');this.startFromBorder_right=intProp(element,'border-right-width');this.startFromPadding_top=intProp(element,'padding-top');this.startFromPadding_bottom=intProp(element,'padding-bottom');this.startFromPadding_left=intProp(element,'padding-left');this.startFromPadding_right=intProp(element,'padding-right');this.startFromMargin_top=intProp(element,'margin-top');this.startFromMargin_bottom=intProp(element,'margin-bottom');this.startFromMargin_right=intProp(element,'margin-right');this.startFromMargin_left=intProp(element,'margin-left');this.startLeft=intProp(element,'left');this.startTop=intProp(element,'top')}
if(this.options.scaleContent)
Spry.Effect.Utils.fetchChildImages(element,this.childImages);this.fontFactor=1.0;var fontSize=Spry.Effect.getStyleProp(this.element,'font-size');if(fontSize&&/em\s*$/.test(fontSize))
this.fontFactor=parseFloat(fontSize);var isPercent=Spry.Effect.Utils.isPercentValue;if(isPercent(this.startWidth)){var startWidthPercent=Spry.Effect.Utils.getPercentValue(this.startWidth);this.startWidth=originalRect.width *(startWidthPercent/100)}
if(isPercent(this.startHeight)){var startHeightPercent=Spry.Effect.Utils.getPercentValue(this.startHeight);this.startHeight=originalRect.height *(startHeightPercent/100)}
if(isPercent(this.stopWidth)){var stopWidthPercent=Spry.Effect.Utils.getPercentValue(this.stopWidth);this.stopWidth=originalRect.width *(stopWidthPercent/100)}
if(isPercent(this.stopHeight)){var stopHeightPercent=Spry.Effect.Utils.getPercentValue(this.stopHeight);this.stopHeight=originalRect.height *(stopHeightPercent/100)}
this.enforceVisible=Spry.Effect.isInvisible(this.element)};Spry.Effect.Size.prototype=new Spry.Effect.Animator();Spry.Effect.Size.prototype.constructor=Spry.Effect.Size;Spry.Effect.Size.prototype.animate=function(){var width=0;var height=0;var fontSize=0;var direction=0;var floor=Math.floor;var elapsed=this.getElapsedMilliseconds();if(this.direction==Spry.forwards){width=floor(this.options.transition(elapsed,this.startWidth,this.stopWidth-this.startWidth,this.options.duration));height=floor(this.options.transition(elapsed,this.startHeight,this.stopHeight-this.startHeight,this.options.duration));direction=1} else if(this.direction==Spry.backwards){width=floor(this.options.transition(elapsed,this.stopWidth,this.startWidth-this.stopWidth,this.options.duration));height=floor(this.options.transition(elapsed,this.stopHeight,this.startHeight-this.stopHeight,this.options.duration));direction=-1}
var propFactor=width/this.originalWidth;fontSize=this.fontFactor * propFactor;var elStyle=this.element.style;if(width<0)
width=0;if(height<0)
height=0;elStyle.width=width+this.units;elStyle.height=height+this.units;if(typeof this.options.useCSSBox!='undefined'&&this.options.useCSSBox==true){var intProp=Spry.Effect.intPropStyle;var origTop=intProp(this.element,'top');var origLeft=intProp(this.element,'left');var origMarginTop=intProp(this.element,'margin-top');var origMarginLeft=intProp(this.element,'margin-left');var widthFactor=propFactor;var heightFactor=height/this.originalHeight;var border_top=floor(this.startFromBorder_top * heightFactor);var border_bottom=floor(this.startFromBorder_bottom * heightFactor);var border_left=floor(this.startFromBorder_left * widthFactor);var border_right=floor(this.startFromBorder_right * widthFactor);var padding_top=floor(this.startFromPadding_top * heightFactor);var padding_bottom=floor(this.startFromPadding_bottom * heightFactor);var padding_left=floor(this.startFromPadding_left * widthFactor);var padding_right=floor(this.startFromPadding_right * widthFactor);var margin_top=floor(this.startFromMargin_top * heightFactor);var margin_bottom=floor(this.startFromMargin_bottom * heightFactor);var margin_right=floor(this.startFromMargin_right * widthFactor);var margin_left=floor(this.startFromMargin_left * widthFactor);elStyle.borderTopWidth=border_top+this.units;elStyle.borderBottomWidth=border_bottom+this.units;elStyle.borderLeftWidth=border_left+this.units;elStyle.borderRightWidth=border_right+this.units;elStyle.paddingTop=padding_top+this.units;elStyle.paddingBottom=padding_bottom+this.units;elStyle.paddingLeft=padding_left+this.units;elStyle.paddingRight=padding_right+this.units;elStyle.marginTop=margin_top+this.units;elStyle.marginBottom=margin_bottom+this.units;elStyle.marginLeft=margin_left+this.units;elStyle.marginRight=margin_right+this.units;elStyle.left=floor(origLeft+origMarginLeft-margin_left)+this.units;elStyle.top=floor(origTop+origMarginTop-margin_top)+this.units}
if(this.options.scaleContent){for(var i=0;i<this.childImages.length;i++){this.childImages[i][0].style.width=propFactor * this.childImages[i][1]+this.units;this.childImages[i][0].style.height=propFactor * this.childImages[i][2]+this.units}
this.element.style.fontSize=fontSize+'em'}
if(this.enforceVisible){Spry.Effect.enforceVisible(this.element);this.enforceVisible=false}};Spry.Effect.Size.prototype.prepareStart=function(){if(this.options&&this.options.toggle)
this.doToggle();if(this.dynamicFromRect==true){var fromRect=Spry.Effect.getDimensions(this.element);this.startWidth=fromRect.width;this.startHeight=fromRect.height;this.widthRange=this.startWidth-this.stopWidth;this.heightRange=this.startHeight-this.stopHeight}};Spry.Effect.Opacity=function(element,startOpacity,stopOpacity,options){this.dynamicStartOpacity=false;if(arguments.length==3){options=stopOpacity;stopOpacity=startOpacity;startOpacity=Spry.Effect.getOpacity(element);this.dynamicStartOpacity=true}
Spry.Effect.Animator.call(this,options);this.name='Opacity';this.element=Spry.Effect.getElement(element);if(!this.element)
return;if(/MSIE/.test(navigator.userAgent)&&(!this.element.hasLayout))
Spry.Effect.setStyleProp(this.element,'zoom','1');this.startOpacity=startOpacity;this.stopOpacity=stopOpacity;this.enforceVisible=Spry.Effect.isInvisible(this.element)};Spry.Effect.Opacity.prototype=new Spry.Effect.Animator();Spry.Effect.Opacity.prototype.constructor=Spry.Effect.Opacity;Spry.Effect.Opacity.prototype.animate=function(){var opacity=0;var elapsed=this.getElapsedMilliseconds();if(this.direction==Spry.forwards)
opacity=this.options.transition(elapsed,this.startOpacity,this.stopOpacity-this.startOpacity,this.options.duration);else if(this.direction==Spry.backwards)
opacity=this.options.transition(elapsed,this.stopOpacity,this.startOpacity-this.stopOpacity,this.options.duration);if(opacity<0)
opacity=0;if(/MSIE/.test(navigator.userAgent)){var tmpval=Spry.Effect.getStyleProp(this.element,'filter');if(tmpval){tmpval=tmpval.replace(/alpha\(opacity=[0-9]{1,3}\)/g,'')}
this.element.style.filter=tmpval+"alpha(opacity="+Math.floor(opacity * 100)+")"}
else
this.element.style.opacity=opacity;if(this.enforceVisible){Spry.Effect.enforceVisible(this.element);this.enforceVisible=false}};Spry.Effect.Opacity.prototype.prepareStart=function(){if(this.options&&this.options.toggle)
this.doToggle();if(this.dynamicStartOpacity==true){this.startOpacity=Spry.Effect.getOpacity(this.element);this.opacityRange=this.startOpacity-this.stopOpacity}};Spry.Effect.Color=function(element,startColor,stopColor,options){this.dynamicStartColor=false;if(arguments.length==3){options=stopColor;stopColor=startColor;startColor=Spry.Effect.getBgColor(element);this.dynamicStartColor=true}
Spry.Effect.Animator.call(this,options);this.name='Color';this.element=Spry.Effect.getElement(element);if(!this.element)
return;this.startColor=startColor;this.stopColor=stopColor;this.startRedColor=Spry.Effect.Utils.hexToInt(startColor.substr(1,2));this.startGreenColor=Spry.Effect.Utils.hexToInt(startColor.substr(3,2));this.startBlueColor=Spry.Effect.Utils.hexToInt(startColor.substr(5,2));this.stopRedColor=Spry.Effect.Utils.hexToInt(stopColor.substr(1,2));this.stopGreenColor=Spry.Effect.Utils.hexToInt(stopColor.substr(3,2));this.stopBlueColor=Spry.Effect.Utils.hexToInt(stopColor.substr(5,2))};Spry.Effect.Color.prototype=new Spry.Effect.Animator();Spry.Effect.Color.prototype.constructor=Spry.Effect.Color;Spry.Effect.Color.prototype.animate=function(){var redColor=0;var greenColor=0;var blueColor=0;var floor=Math.floor;var elapsed=this.getElapsedMilliseconds();if(this.direction==Spry.forwards){redColor=floor(this.options.transition(elapsed,this.startRedColor,this.stopRedColor-this.startRedColor,this.options.duration));greenColor=floor(this.options.transition(elapsed,this.startGreenColor,this.stopGreenColor-this.startGreenColor,this.options.duration));blueColor=floor(this.options.transition(elapsed,this.startBlueColor,this.stopBlueColor-this.startBlueColor,this.options.duration))}
else if(this.direction==Spry.backwards){redColor=floor(this.options.transition(elapsed,this.stopRedColor,this.startRedColor-this.stopRedColor,this.options.duration));greenColor=floor(this.options.transition(elapsed,this.stopGreenColor,this.startGreenColor-this.stopGreenColor,this.options.duration));blueColor=floor(this.options.transition(elapsed,this.stopBlueColor,this.startBlueColor-this.stopBlueColor,this.options.duration))}
this.element.style.backgroundColor=Spry.Effect.Utils.rgb(redColor,greenColor,blueColor)};Spry.Effect.Color.prototype.prepareStart=function(){if(this.options&&this.options.toggle)
this.doToggle();if(this.dynamicStartColor==true){this.startColor=Spry.Effect.getBgColor(element);this.startRedColor=Spry.Effect.Utils.hexToInt(startColor.substr(1,2));this.startGreenColor=Spry.Effect.Utils.hexToInt(startColor.substr(3,2));this.startBlueColor=Spry.Effect.Utils.hexToInt(startColor.substr(5,2));this.redColorRange=this.startRedColor-this.stopRedColor;this.greenColorRange=this.startGreenColor-this.stopGreenColor;this.blueColorRange=this.startBlueColor-this.stopBlueColor}};Spry.Effect.Cluster=function(options){Spry.Effect.Animator.call(this,options);this.name='Cluster';this.effectsArray=new Array();this.currIdx=-1;var _ClusteredEffect=function(effect,kind){this.effect=effect;this.kind=kind;this.isRunning=false};this.ClusteredEffect=_ClusteredEffect};Spry.Effect.Cluster.prototype=new Spry.Effect.Animator();Spry.Effect.Cluster.prototype.constructor=Spry.Effect.Cluster;Spry.Effect.Cluster.prototype.setInterval=function(interval){var l=this.effectsArray.length;this.options.interval=interval;for(var i=0;i<l;i++){this.effectsArray[i].effect.setInterval(interval)}};Spry.Effect.Cluster.prototype.drawEffect=function(){var isRunning=true;var allEffectsDidRun=false;var baseEffectIsStillRunning=false;var evalNextEffectsRunning=false;if((this.currIdx==-1&&this.direction==Spry.forwards)||(this.currIdx==this.effectsArray.length&&this.direction==Spry.backwards))
this.initNextEffectsRunning();var start=this.direction==Spry.forwards?0:this.effectsArray.length-1;var stop=this.direction==Spry.forwards?this.effectsArray.length:-1;var step=this.direction==Spry.forwards?1:-1;for(var i=start;i!=stop;i+=step){if(this.effectsArray[i].isRunning==true){baseEffectIsStillRunning=this.effectsArray[i].effect.drawEffect();if(baseEffectIsStillRunning==false&&i==this.currIdx){this.effectsArray[i].isRunning=false;evalNextEffectsRunning=true}}}
if(evalNextEffectsRunning==true)
allEffectsDidRun=this.initNextEffectsRunning();if(allEffectsDidRun==true){this.stop();isRunning=false;for(var i=0;i<this.effectsArray.length;i++)
this.effectsArray[i].isRunning=false;this.currIdx=this.direction==Spry.forwards?this.effectsArray.length:-1}
return isRunning};Spry.Effect.Cluster.prototype.initNextEffectsRunning=function(){var allEffectsDidRun=false;var step=this.direction==Spry.forwards?1:-1;var stop=this.direction==Spry.forwards?this.effectsArray.length:-1;this.currIdx+=step;if((this.currIdx>(this.effectsArray.length-1)&&this.direction==Spry.forwards)||(this.currIdx<0&&this.direction==Spry.backwards))
allEffectsDidRun=true;else
for(var i=this.currIdx;i!=stop;i+=step){if((i>this.currIdx&&this.direction==Spry.forwards||i<this.currIdx&&this.direction==Spry.backwards)&&this.effectsArray[i].kind=="queue")
break;this.effectsArray[i].effect.start(true);this.effectsArray[i].isRunning=true;this.currIdx=i}
return allEffectsDidRun};Spry.Effect.Cluster.prototype.toggleCluster=function(){if(!this.direction){this.direction=Spry.forwards;return}
if(this.options.toggle==true){if(this.direction==Spry.forwards){this.direction=Spry.backwards;this.notifyObservers('onToggle',this);this.currIdx=this.effectsArray.length}
else if(this.direction==Spry.backwards){this.direction=Spry.forwards;this.currIdx=-1}}
else{if(this.direction==Spry.forwards)
this.currIdx=-1;else if(this.direction==Spry.backwards)
this.currIdx=this.effectsArray.length}};Spry.Effect.Cluster.prototype.doToggle=function(){this.toggleCluster();for(var i=0;i<this.effectsArray.length;i++){if(this.effectsArray[i].effect.options&&(this.effectsArray[i].effect.options.toggle!=null))
if(this.effectsArray[i].effect.options.toggle==true)
this.effectsArray[i].effect.doToggle()}};Spry.Effect.Cluster.prototype.cancel=function(){for(var i=0;i<this.effectsArray.length;i++)
if(this.effectsArray[i].effect.isRunning)
this.effectsArray[i].effect.cancel();var elapsed=this.getElapsedMilliseconds();if(this.startMilliseconds>0&&elapsed<this.options.duration)
this.cancelRemaining=this.options.transition(elapsed,0,1,this.options.duration);this.stopFlagReset();this.notifyObservers('onCancel',this);this.isRunning=false};Spry.Effect.Cluster.prototype.addNextEffect=function(effect){effect.addObserver(this);this.effectsArray[this.effectsArray.length]=new this.ClusteredEffect(effect,"queue");if(this.effectsArray.length==1){this.element=effect.element}};Spry.Effect.Cluster.prototype.addParallelEffect=function(effect){if(this.effectsArray.length==0||this.effectsArray[this.effectsArray.length-1].kind!='parallel')
effect.addObserver(this);this.effectsArray[this.effectsArray.length]=new this.ClusteredEffect(effect,"parallel");if(this.effectsArray.length==1){this.element=effect.element}};Spry.Effect.Cluster.prototype.prepareStart=function(){this.toggleCluster()};Spry.Effect.Fade=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Fade');Spry.Effect.Cluster.call(this,options);this.name='Fade';var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;var durationInMilliseconds=1000;var fromOpacity=0.0;var toOpacity=100.0;var doToggle=false;var transition=Spry.fifthTransition;var fps=60;var originalOpacity=0;if(/MSIE/.test(navigator.userAgent))
originalOpacity=parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element,'filter').replace(/alpha\(opacity=([0-9]{1,3})\)/g,'$1'),10);else
originalOpacity=parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element,'opacity') * 100,10);if(isNaN(originalOpacity))
originalOpacity=100;if(options){if(options.duration!=null) durationInMilliseconds=options.duration;if(options.from!=null){if(Spry.Effect.Utils.isPercentValue(options.from))
fromOpacity=Spry.Effect.Utils.getPercentValue(options.from) * originalOpacity/100;else
fromOpacity=options.from}
if(options.to!=null){if(Spry.Effect.Utils.isPercentValue(options.to))
toOpacity=Spry.Effect.Utils.getPercentValue(options.to) * originalOpacity/100;else
toOpacity=options.to}
if(options.toggle!=null) doToggle=options.toggle;if(options.transition!=null) transition=options.transition;if(options.fps!=null) fps=options.fps;else this.options.transition=transition}
fromOpacity=fromOpacity/100.0;toOpacity=toOpacity/100.0;options={duration:durationInMilliseconds,toggle:doToggle,transition:transition,from:fromOpacity,to:toOpacity,fps:fps};var fadeEffect=new Spry.Effect.Opacity(element,fromOpacity,toOpacity,options);this.addNextEffect(fadeEffect)};Spry.Effect.Fade.prototype=new Spry.Effect.Cluster();Spry.Effect.Fade.prototype.constructor=Spry.Effect.Fade;Spry.Effect.Blind=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Blind');Spry.Effect.Cluster.call(this,options);this.name='Blind';var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;var durationInMilliseconds=1000;var doToggle=false;var kindOfTransition=Spry.circleTransition;var fps=60;var doScaleContent=false;Spry.Effect.makeClipping(element);var originalRect=Spry.Effect.getDimensionsRegardlessOfDisplayState(element);var fromHeightPx=originalRect.height;var toHeightPx=0;var optionFrom=options?options.from:originalRect.height;var optionTo=options?options.to:0;var fullCSSBox=false;if(options){if(options.duration!=null) durationInMilliseconds=options.duration;if(options.from!=null){if(Spry.Effect.Utils.isPercentValue(options.from))
fromHeightPx=Spry.Effect.Utils.getPercentValue(options.from) * originalRect.height/100;else
fromHeightPx=Spry.Effect.Utils.getPixelValue(options.from)}
if(options.to!=null){if(Spry.Effect.Utils.isPercentValue(options.to))
toHeightPx=Spry.Effect.Utils.getPercentValue(options.to) * originalRect.height/100;else
toHeightPx=Spry.Effect.Utils.getPixelValue(options.to)}
if(options.toggle!=null) doToggle=options.toggle;if(options.transition!=null) kindOfTransition=options.transition;if(options.fps!=null) fps=options.fps;if(options.useCSSBox!=null) fullCSSBox=options.useCSSBox}
var fromRect=new Spry.Effect.Utils.Rectangle;fromRect.width=originalRect.width;fromRect.height=fromHeightPx;var toRect=new Spry.Effect.Utils.Rectangle;toRect.width=originalRect.width;toRect.height=toHeightPx;options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,scaleContent:doScaleContent,useCSSBox:fullCSSBox,from:optionFrom,to:optionTo,fps:fps};var blindEffect=new Spry.Effect.Size(element,fromRect,toRect,options);this.addNextEffect(blindEffect)};Spry.Effect.Blind.prototype=new Spry.Effect.Cluster();Spry.Effect.Blind.prototype.constructor=Spry.Effect.Blind;Spry.Effect.Highlight=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Highlight');Spry.Effect.Cluster.call(this,options);this.name='Highlight';var durationInMilliseconds=1000;var toColor="#ffffff";var doToggle=false;var kindOfTransition=Spry.sinusoidalTransition;var fps=60;var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;var fromColor=Spry.Effect.getBgColor(element);if(fromColor=="transparent") fromColor="#ffff99";if(options){if(options.duration!=null) durationInMilliseconds=options.duration;if(options.from!=null) fromColor=options.from;if(options.to!=null) toColor=options.to;if(options.toggle!=null) doToggle=options.toggle;if(options.transition!=null) kindOfTransition=options.transition;if(options.fps!=null) fps=options.fps}
if(fromColor.indexOf('rgb')!=-1)
var fromColor=Spry.Effect.Utils.rgb(parseInt(fromColor.substring(fromColor.indexOf('(')+1,fromColor.indexOf(',')),10),parseInt(fromColor.substring(fromColor.indexOf(',')+1,fromColor.lastIndexOf(',')),10),parseInt(fromColor.substring(fromColor.lastIndexOf(',')+1,fromColor.indexOf(')')),10));if(toColor.indexOf('rgb')!=-1)
var toColor=Spry.Effect.Utils.rgb(parseInt(toColor.substring(toColor.indexOf('(')+1,toColor.indexOf(',')),10),parseInt(toColor.substring(toColor.indexOf(',')+1,toColor.lastIndexOf(',')),10),parseInt(toColor.substring(toColor.lastIndexOf(',')+1,toColor.indexOf(')')),10));var fromColor=Spry.Effect.Utils.longColorVersion(fromColor);var toColor=Spry.Effect.Utils.longColorVersion(toColor);this.restoreBackgroundImage=Spry.Effect.getStyleProp(element,'background-image');options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,fps:fps};var highlightEffect=new Spry.Effect.Color(element,fromColor,toColor,options);this.addNextEffect(highlightEffect);this.addObserver({onPreEffect:
function(effect){Spry.Effect.setStyleProp(effect.element,'background-image','none')},onPostEffect:
function(effect){Spry.Effect.setStyleProp(effect.element,'background-image',effect.restoreBackgroundImage);if(effect.direction==Spry.forwards&&effect.options.restoreColor)
Spry.Effect.setStyleProp(element,'background-color',effect.options.restoreColor)}})};Spry.Effect.Highlight.prototype=new Spry.Effect.Cluster();Spry.Effect.Highlight.prototype.constructor=Spry.Effect.Highlight;Spry.Effect.Slide=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Slide');Spry.Effect.Cluster.call(this,options);this.name='Slide';var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;var durationInMilliseconds=1000;var doToggle=false;var kindOfTransition=Spry.sinusoidalTransition;var fps=60;var slideHorizontally=false;var firstChildElt=Spry.Effect.Utils.getFirstChildElement(element);var direction=-1;if(/MSIE 7.0/.test(navigator.userAgent)&&/Windows NT/.test(navigator.userAgent))
Spry.Effect.makePositioned(element);Spry.Effect.makeClipping(element);if(/MSIE 6.0/.test(navigator.userAgent)&&/Windows NT/.test(navigator.userAgent)){var pos=Spry.Effect.getStyleProp(element,'position');if(pos&&(pos=='static'||pos=='fixed')){Spry.Effect.setStyleProp(element,'position','relative');Spry.Effect.setStyleProp(element,'top','');Spry.Effect.setStyleProp(element,'left','')}}
if(firstChildElt){Spry.Effect.makePositioned(firstChildElt);Spry.Effect.makeClipping(firstChildElt);var childRect=Spry.Effect.getDimensionsRegardlessOfDisplayState(firstChildElt,element);Spry.Effect.setStyleProp(firstChildElt,'width',childRect.width+'px')}
var fromDim=Spry.Effect.getDimensionsRegardlessOfDisplayState(element);var initDim=new Spry.Effect.Utils.Rectangle();var toDim=new Spry.Effect.Utils.Rectangle();initDim.width=toDim.width=fromDim.width;initDim.height=toDim.height=fromDim.height;if(!this.options.to){if(!options)
options={};options.to='0%'}
if(options&&options.horizontal!==null&&options.horizontal===true)
slideHorizontally=true;if(options.duration!=null) durationInMilliseconds=options.duration;if(options.from!=null){if(slideHorizontally){if(Spry.Effect.Utils.isPercentValue(options.from))
fromDim.width=initDim.width * Spry.Effect.Utils.getPercentValue(options.from)/100;else
fromDim.width=Spry.Effect.Utils.getPixelValue(options.from)}
else{if(Spry.Effect.Utils.isPercentValue(options.from))
fromDim.height=initDim.height * Spry.Effect.Utils.getPercentValue(options.from)/100;else
fromDim.height=Spry.Effect.Utils.getPixelValue(options.from)}}
if(options.to!=null){if(slideHorizontally){if(Spry.Effect.Utils.isPercentValue(options.to))
toDim.width=initDim.width * Spry.Effect.Utils.getPercentValue(options.to)/100;else
toDim.width=Spry.Effect.Utils.getPixelValue(options.to)}
else{if(Spry.Effect.Utils.isPercentValue(options.to))
toDim.height=initDim.height * Spry.Effect.Utils.getPercentValue(options.to)/100;else
toDim.height=Spry.Effect.Utils.getPixelValue(options.to)}}
if(options.toggle!=null) doToggle=options.toggle;if(options.transition!=null) kindOfTransition=options.transition;if(options.fps!=null) fps=options.fps;options={duration:durationInMilliseconds,transition:kindOfTransition,scaleContent:false,toggle:doToggle,fps:fps};var size=new Spry.Effect.Size(element,fromDim,toDim,options);this.addParallelEffect(size);if((fromDim.width<toDim.width&&slideHorizontally)||(fromDim.height<toDim.height&&!slideHorizontally))
direction=1;var fromPos=new Spry.Effect.Utils.Position();var toPos=new Spry.Effect.Utils.Position();toPos.x=fromPos.x=Spry.Effect.intPropStyle(firstChildElt,'left');toPos.y=fromPos.y=Spry.Effect.intPropStyle(firstChildElt,'top');toPos.units=fromPos.units;if(slideHorizontally)
toPos.x=parseInt(fromPos.x+direction *(fromDim.width-toDim.width),10);else
toPos.y=parseInt(fromPos.y+direction *(fromDim.height-toDim.height),10);if(direction==1){var tmp=fromPos;var fromPos=toPos;var toPos=tmp}
options={duration:durationInMilliseconds,transition:kindOfTransition,toggle:doToggle,from:fromPos,to:toPos,fps:fps};var move=new Spry.Effect.Move(firstChildElt,fromPos,toPos,options);this.addParallelEffect(move)};Spry.Effect.Slide.prototype=new Spry.Effect.Cluster();Spry.Effect.Slide.prototype.constructor=Spry.Effect.Slide;Spry.Effect.Grow=function(element,options){if(!element)
return;if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Grow');Spry.Effect.Cluster.call(this,options);this.name='Grow';var durationInMilliseconds=1000;var doToggle=false;var doScaleContent=true;var calcHeight=false;var growFromCenter=true;var fullCSSBox=false;var kindOfTransition=Spry.squareTransition;var fps=60;var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;Spry.Effect.makeClipping(element);var dimRect=Spry.Effect.getDimensionsRegardlessOfDisplayState(element);var originalWidth=dimRect.width;var originalHeight=dimRect.height;var propFactor=(originalWidth==0)?1:originalHeight/originalWidth;var fromRect=new Spry.Effect.Utils.Rectangle;fromRect.width=0;fromRect.height=0;var toRect=new Spry.Effect.Utils.Rectangle;toRect.width=originalWidth;toRect.height=originalHeight;var optionFrom=options?options.from:dimRect.width;var optionTo=options?options.to:0;var pixelValue=Spry.Effect.Utils.getPixelValue;if(options){if(options.growCenter!=null) growFromCenter=options.growCenter;if(options.duration!=null) durationInMilliseconds=options.duration;if(options.useCSSBox!=null) fullCSSBox=options.useCSSBox;if(options.scaleContent!=null) doScaleContent=options.scaleContent;if(options.from!=null){if(Spry.Effect.Utils.isPercentValue(options.from)){fromRect.width=originalWidth *(Spry.Effect.Utils.getPercentValue(options.from)/100);fromRect.height=originalHeight *(Spry.Effect.Utils.getPercentValue(options.from)/100)}
else{if(calcHeight){fromRect.height=pixelValue(options.from);fromRect.width=pixelValue(options.from)/propFactor}
else{fromRect.width=pixelValue(options.from);fromRect.height=propFactor * pixelValue(options.from)}}}
if(options.to!=null){if(Spry.Effect.Utils.isPercentValue(options.to)){toRect.width=originalWidth *(Spry.Effect.Utils.getPercentValue(options.to)/100);toRect.height=originalHeight *(Spry.Effect.Utils.getPercentValue(options.to)/100)}
else{if(calcHeight){toRect.height=pixelValue(options.to);toRect.width=pixelValue(options.to)/propFactor}
else{toRect.width=pixelValue(options.to);toRect.height=propFactor * pixelValue(options.to)}}}
if(options.toggle!=null) doToggle=options.toggle;if(options.transition!=null) kindOfTransition=options.transition;if(options.fps!=null) fps=options.fps}
options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,scaleContent:doScaleContent,useCSSBox:fullCSSBox,fps:fps};var sizeEffect=new Spry.Effect.Size(element,fromRect,toRect,options);this.addParallelEffect(sizeEffect);if(growFromCenter){Spry.Effect.makePositioned(element);var startOffsetPosition=new Spry.Effect.Utils.Position();startOffsetPosition.x=parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(element,"left"),10);startOffsetPosition.y=parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(element,"top"),10);if(!startOffsetPosition.x) startOffsetPosition.x=0;if(!startOffsetPosition.y) startOffsetPosition.y=0;options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,from:optionFrom,to:optionTo,fps:fps};var fromPos=new Spry.Effect.Utils.Position;fromPos.x=startOffsetPosition.x+(originalWidth-fromRect.width)/2.0;fromPos.y=startOffsetPosition.y+(originalHeight-fromRect.height)/2.0;var toPos=new Spry.Effect.Utils.Position;toPos.x=startOffsetPosition.x+(originalWidth-toRect.width)/2.0;toPos.y=startOffsetPosition.y+(originalHeight-toRect.height)/2.0;var moveEffect=new Spry.Effect.Move(element,fromPos,toPos,options);this.addParallelEffect(moveEffect)}};Spry.Effect.Grow.prototype=new Spry.Effect.Cluster();Spry.Effect.Grow.prototype.constructor=Spry.Effect.Grow;Spry.Effect.Shake=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Shake');Spry.Effect.Cluster.call(this,options);this.options.direction=false;if(this.options.toggle)
this.options.toggle=false;this.name='Shake';var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;var durationInMilliseconds=100;var kindOfTransition=Spry.linearTransition;var fps=60;var steps=4;if(options){if(options.duration!=null) steps=Math.ceil(this.options.duration/durationInMilliseconds)-1;if(options.fps!=null) fps=options.fps;if(options.transition!=null) kindOfTransition=options.transition}
Spry.Effect.makePositioned(element);var startOffsetPosition=new Spry.Effect.Utils.Position();startOffsetPosition.x=parseInt(Spry.Effect.getStyleProp(element,"left"),10);startOffsetPosition.y=parseInt(Spry.Effect.getStyleProp(element,"top"),10);if(!startOffsetPosition.x) startOffsetPosition.x=0;if(!startOffsetPosition.y) startOffsetPosition.y=0;var centerPos=new Spry.Effect.Utils.Position;centerPos.x=startOffsetPosition.x;centerPos.y=startOffsetPosition.y;var rightPos=new Spry.Effect.Utils.Position;rightPos.x=startOffsetPosition.x+20;rightPos.y=startOffsetPosition.y+0;var leftPos=new Spry.Effect.Utils.Position;leftPos.x=startOffsetPosition.x+-20;leftPos.y=startOffsetPosition.y+0;options={duration:Math.ceil(durationInMilliseconds/2),toggle:false,fps:fps,transition:kindOfTransition};var effect=new Spry.Effect.Move(element,centerPos,rightPos,options);this.addNextEffect(effect);options={duration:durationInMilliseconds,toggle:false,fps:fps,transition:kindOfTransition};var effectToRight=new Spry.Effect.Move(element,rightPos,leftPos,options);var effectToLeft=new Spry.Effect.Move(element,leftPos,rightPos,options);for(var i=0;i<steps;i++){if(i%2==0)
this.addNextEffect(effectToRight);else
this.addNextEffect(effectToLeft)}
var pos=(steps%2==0)?rightPos:leftPos;options={duration:Math.ceil(durationInMilliseconds/2),toggle:false,fps:fps,transition:kindOfTransition};var effect=new Spry.Effect.Move(element,pos,centerPos,options);this.addNextEffect(effect)};Spry.Effect.Shake.prototype=new Spry.Effect.Cluster();Spry.Effect.Shake.prototype.constructor=Spry.Effect.Shake;Spry.Effect.Shake.prototype.doToggle=function(){};Spry.Effect.Squish=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Squish');if(!options)
options={};if(!options.to)
options.to='0%';if(!options.from)
options.from='100%';options.growCenter=false;Spry.Effect.Grow.call(this,element,options);this.name='Squish'};Spry.Effect.Squish.prototype=new Spry.Effect.Grow();Spry.Effect.Squish.prototype.constructor=Spry.Effect.Squish;Spry.Effect.Pulsate=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Pulsate');Spry.Effect.Cluster.call(this,options);this.options.direction=false;if(this.options.toggle)
this.options.toggle=false;var element=Spry.Effect.getElement(element);var originalOpacity=0;this.element=element;if(!this.element)
return;this.name='Pulsate';var durationInMilliseconds=100;var fromOpacity=100.0;var toOpacity=0.0;var doToggle=false;var kindOfTransition=Spry.linearTransition;var fps=60;if(/MSIE/.test(navigator.userAgent))
originalOpacity=parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element,'filter').replace(/alpha\(opacity=([0-9]{1,3})\)/g,'$1'),10);else
originalOpacity=parseInt(Spry.Effect.getStylePropRegardlessOfDisplayState(this.element,'opacity') * 100,10);if(isNaN(originalOpacity)){originalOpacity=100}
if(options){if(options.from!=null){if(Spry.Effect.Utils.isPercentValue(options.from))
fromOpacity=Spry.Effect.Utils.getPercentValue(options.from) * originalOpacity/100;else
fromOpacity=options.from}
if(options.to!=null){if(Spry.Effect.Utils.isPercentValue(options.to))
toOpacity=Spry.Effect.Utils.getPercentValue(options.to) * originalOpacity/100;else
toOpacity=options.to}
if(options.transition!=null) kindOfTransition=options.transition;if(options.fps!=null) fps=options.fps}
options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,fps:fps};fromOpacity=fromOpacity/100.0;toOpacity=toOpacity/100.0;var fadeEffect=new Spry.Effect.Opacity(element,fromOpacity,toOpacity,options);var appearEffect=new Spry.Effect.Opacity(element,toOpacity,fromOpacity,options);var steps=parseInt(this.options.duration/200,10);for(var i=0;i<steps;i++){this.addNextEffect(fadeEffect);this.addNextEffect(appearEffect)}};Spry.Effect.Pulsate.prototype=new Spry.Effect.Cluster();Spry.Effect.Pulsate.prototype.constructor=Spry.Effect.Pulsate;Spry.Effect.Pulsate.prototype.doToggle=function(){};Spry.Effect.Puff=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Puff');Spry.Effect.Cluster.call(this,options);var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;this.name='Puff';var doToggle=false;var doScaleContent=false;var durationInMilliseconds=1000;var kindOfTransition=Spry.fifthTransition;var fps=60;Spry.Effect.makePositioned(element);if(options){if(options.toggle!=null) doToggle=options.toggle;if(options.duration!=null) durationInMilliseconds=options.duration;if(options.transition!=null) kindOfTransition=options.transition;if(options.fps!=null) fps=options.fps}
var originalRect=Spry.Effect.getDimensions(element);var startWidth=originalRect.width;var startHeight=originalRect.height;options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,fps:fps};var fromOpacity=1.0;var toOpacity=0.0;var opacityEffect=new Spry.Effect.Opacity(element,fromOpacity,toOpacity,options);this.addParallelEffect(opacityEffect);var fromPos=Spry.Effect.getPosition(element);var toPos=new Spry.Effect.Utils.Position;toPos.x=startWidth/2.0 *-1.0;toPos.y=startHeight/2.0 *-1.0;options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,from:fromPos,to:toPos,fps:fps};var moveEffect=new Spry.Effect.Move(element,fromPos,toPos,options);this.addParallelEffect(moveEffect);var self=this;this.addObserver({onPreEffect:function(){if(self.direction==Spry.backwards){self.element.style.display='block'}},onPostEffect: function(){if(self.direction==Spry.forwards){self.element.style.display='none'}}})};Spry.Effect.Puff.prototype=new Spry.Effect.Cluster;Spry.Effect.Puff.prototype.constructor=Spry.Effect.Puff;Spry.Effect.DropOut=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('DropOut');Spry.Effect.Cluster.call(this,options);var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;var durationInMilliseconds=1000;var fps=60;var kindOfTransition=Spry.fifthTransition;var direction=Spry.forwards;var doToggle=false;this.name='DropOut';Spry.Effect.makePositioned(element);if(options){if(options.duration!=null) durationInMilliseconds=options.duration;if(options.toggle!=null) doToggle=options.toggle;if(options.fps!=null) fps=options.fps;if(options.transition!=null) kindOfTransition=options.transition;if(options.dropIn!=null) direction=-1}
var startOffsetPosition=new Spry.Effect.Utils.Position();startOffsetPosition.x=parseInt(Spry.Effect.getStyleProp(element,"left"),10);startOffsetPosition.y=parseInt(Spry.Effect.getStyleProp(element,"top"),10);if(!startOffsetPosition.x) startOffsetPosition.x=0;if(!startOffsetPosition.y) startOffsetPosition.y=0;var fromPos=new Spry.Effect.Utils.Position;fromPos.x=startOffsetPosition.x+0;fromPos.y=startOffsetPosition.y+0;var toPos=new Spry.Effect.Utils.Position;toPos.x=startOffsetPosition.x+0;toPos.y=startOffsetPosition.y+(direction * 160);options={from:fromPos,to:toPos,duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,fps:fps};var moveEffect=new Spry.Effect.Move(element,options.from,options.to,options);this.addParallelEffect(moveEffect);var fromOpacity=1.0;var toOpacity=0.0;options={duration:durationInMilliseconds,toggle:doToggle,transition:kindOfTransition,fps:fps};var opacityEffect=new Spry.Effect.Opacity(element,fromOpacity,toOpacity,options);this.addParallelEffect(opacityEffect);var self=this;this.addObserver({onPreEffect:function(){self.element.style.display='block'},onPostEffect: function(){if(self.direction==Spry.forwards){self.element.style.display='none'}}})};Spry.Effect.DropOut.prototype=new Spry.Effect.Cluster();Spry.Effect.DropOut.prototype.constructor=Spry.Effect.DropOut;Spry.Effect.Fold=function(element,options){if(!this.notStaticAnimator)
return Spry.Effect.Utils.showInitError('Fold');Spry.Effect.Cluster.call(this,options);var element=Spry.Effect.getElement(element);this.element=element;if(!this.element)
return;this.name='Fold';var durationInMilliseconds=1000;var doToggle=false;var doScaleContent=true;var fullCSSBox=false;var kindOfTransition=Spry.fifthTransition;var fps=fps;Spry.Effect.makeClipping(element);var originalRect=Spry.Effect.getDimensionsRegardlessOfDisplayState(element);var startWidth=originalRect.width;var startHeight=originalRect.height;var stopWidth=startWidth;var stopHeight=startHeight/5;var fromRect=new Spry.Effect.Utils.Rectangle;fromRect.width=startWidth;fromRect.height=startHeight;var toRect=new Spry.Effect.Utils.Rectangle;toRect.width=stopWidth;toRect.height=stopHeight;if(options){if(options.duration!=null) durationInMilliseconds=Math.ceil(options.duration/2);if(options.toggle!=null) doToggle=options.toggle;if(options.useCSSBox!=null) fullCSSBox=options.useCSSBox;if(options.fps!=null) fps=options.fps;if(options.transition!=null) kindOfTransition=options.transition}
options={duration:durationInMilliseconds,toggle:doToggle,scaleContent:doScaleContent,useCSSBox:fullCSSBox,transition:kindOfTransition,fps:fps};var sizeEffect=new Spry.Effect.Size(element,fromRect,toRect,options);this.addNextEffect(sizeEffect);fromRect.width=toRect.width;fromRect.height=toRect.height;toRect.width='0%';var sizeEffect=new Spry.Effect.Size(element,fromRect,toRect,options);this.addNextEffect(sizeEffect)};Spry.Effect.Fold.prototype=new Spry.Effect.Cluster();Spry.Effect.Fold.prototype.constructor=Spry.Effect.Fold;Spry.Effect.DoFade=function(element,options){return Spry.Effect.Utils.DoEffect('Fade',element,options)};Spry.Effect.DoBlind=function(element,options){return Spry.Effect.Utils.DoEffect('Blind',element,options)};Spry.Effect.DoHighlight=function(element,options){return Spry.Effect.Utils.DoEffect('Highlight',element,options)};Spry.Effect.DoSlide=function(element,options){return Spry.Effect.Utils.DoEffect('Slide',element,options)};Spry.Effect.DoGrow=function(element,options){return Spry.Effect.Utils.DoEffect('Grow',element,options)};Spry.Effect.DoShake=function(element,options){return Spry.Effect.Utils.DoEffect('Shake',element,options)};Spry.Effect.DoSquish=function(element,options){return Spry.Effect.Utils.DoEffect('Squish',element,options)};Spry.Effect.DoPulsate=function(element,options){return Spry.Effect.Utils.DoEffect('Pulsate',element,options)};Spry.Effect.DoPuff=function(element,options){return Spry.Effect.Utils.DoEffect('Puff',element,options)};Spry.Effect.DoDropOut=function(element,options){return Spry.Effect.Utils.DoEffect('DropOut',element,options)};Spry.Effect.DoFold=function(element,options){return Spry.Effect.Utils.DoEffect('Fold',element,options)};

/* - SprySlidingPanels.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SprySlidingPanels.js?original=1
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(){return this.showPanel(this.getContentPanelIndex(this.currentPanel)-1)};Spry.Widget.SlidingPanels.prototype.showNextPanel=function(){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()};

/* - SpryHTMLPanel.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SpryHTMLPanel.js?original=1
var Spry;if(!Spry) Spry={};if(!Spry.Widget) Spry.Widget={};Spry.Widget.HTMLPanel=function(ele,opts){Spry.Widget.HTMLPanel.Notifier.call(this);this.element=Spry.Widget.HTMLPanel.$(ele);this.evalScripts=Spry.Widget.HTMLPanel.evalScripts;this.loadingContentClass="HTMLPanelLoadingContent";this.errorContentClass="HTMLPanelErrorContent";this.loadingStateContent="";this.errorStateContent="";this.loadingStateClass="HTMLPanelLoading";this.errorStateClass="HTMLPanelError";this.pendingRequest=null;Spry.Widget.HTMLPanel.setOptions(this,opts);var elements=this.element.getElementsByTagName("*");var numElements=elements.length;var errorEle=null;var loadingEle=null;var d=document.createElement("div");for(var i=0;i<numElements&&(!loadingEle||!errorEle);i++){var e=elements[i];if(Spry.Widget.HTMLPanel.hasClassName(e,this.loadingContentClass))
loadingEle=e;if(Spry.Widget.HTMLPanel.hasClassName(e,this.errorContentClass))
errorEle=e}
if(loadingEle)
this.loadingStateContent=Spry.Widget.HTMLPanel.removeAndExtractContent(loadingEle,this.loadingContentClass);if(errorEle)
this.errorStateContent=Spry.Widget.HTMLPanel.removeAndExtractContent(errorEle,this.errorContentClass)};Spry.Widget.HTMLPanel.evalScripts=false;Spry.Widget.HTMLPanel.Notifier=function(){this.observers=[];this.suppressNotifications=0};Spry.Widget.HTMLPanel.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.Widget.HTMLPanel.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.Widget.HTMLPanel.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.Widget.HTMLPanel.Notifier.prototype.enableNotifications=function(){if(--this.suppressNotifications<0){this.suppressNotifications=0;Spry.Debug.reportError("Unbalanced enableNotifications() call!\n")}};Spry.Widget.HTMLPanel.Notifier.prototype.disableNotifications=function(){++this.suppressNotifications};Spry.Widget.HTMLPanel.prototype=new Spry.Widget.HTMLPanel.Notifier();Spry.Widget.HTMLPanel.prototype.constructor=Spry.Widget.HTMLPanel;Spry.Widget.HTMLPanel.$=function(ele){if(ele&&typeof ele=="string")
return document.getElementById(ele);return ele};Spry.Widget.HTMLPanel.setOptions=function(dstObj,srcObj,ignoreUndefinedProps){if(srcObj){for(var optionName in srcObj){if(ignoreUndefinedProps&&srcObj[optionName]==undefined)
continue;dstObj[optionName]=srcObj[optionName]}}};Spry.Widget.HTMLPanel.addClassName=function(ele,className){ele=Spry.Widget.HTMLPanel.$(ele);if(!ele||!className||(ele.className&&ele.className.search(new RegExp("\\b"+className+"\\b"))!=-1))
return;ele.className+=(ele.className?" ":"")+className};Spry.Widget.HTMLPanel.removeClassName=function(ele,className){ele=Spry.Widget.HTMLPanel.$(ele);if(Spry.Widget.HTMLPanel.hasClassName(ele,className))
ele.className=ele.className.replace(new RegExp("\\s*\\b"+className+"\\b","g"),"")};Spry.Widget.HTMLPanel.hasClassName=function(ele,className){ele=Spry.Widget.HTMLPanel.$(ele);if(!ele||!className||!ele.className||ele.className.search(new RegExp("\\b"+className+"\\b"))==-1)
return false;return true};Spry.Widget.HTMLPanel.removeAndExtractContent=function(ele,className){var d=document.createElement("div");if(ele){d.appendChild(ele);if(className)
Spry.Widget.HTMLPanel.removeClassName(ele,className)}
return d.innerHTML};Spry.Widget.HTMLPanel.findNodeById=function(id,node){if(node&&node.nodeType==1){if(node.id==id)
return node;var child=node.firstChild;while(child){var result=Spry.Widget.HTMLPanel.findNodeById(id,child);if(result)
return result;child=child.nextSibling}}
return null};Spry.Widget.HTMLPanel.disableSrcReferences=function(source){if(source)
source=source.replace(/<(img|script|link|frame|iframe|input)([^>]+)>/gi, function(a,b,c){return '<'+b+c.replace(/\b(src|href)\s*=/gi, function(a,b){return 'spry_'+b+'='})+'>'});return source};Spry.Widget.HTMLPanel.enableSrcReferences=function(source){source=source.replace(/<(img|script|link|frame|iframe|input)([^>]+)>/gi, function(a,b,c){return '<'+b+c.replace(/\bspry_(src|href)\s*=/gi, function(a,b){return b+'='})+'>'});return source};Spry.Widget.HTMLPanel.getFragByID=function(id,contentStr){var frag=Spry.Widget.HTMLPanel.disableSrcReferences(contentStr);var div=document.createElement("div");div.innerHTML=frag;frag="";var node=Spry.Widget.HTMLPanel.findNodeById(id,div);if(node)
frag=node.innerHTML;return Spry.Widget.HTMLPanel.enableSrcReferences(frag)};Spry.Widget.HTMLPanel.prototype.setContent=function(contentStr,id){var data={content:contentStr,id:id};this.notifyObservers("onPreUpdate",data);contentStr=data.content;id=data.id;if(typeof id!="undefined")
contentStr=Spry.Widget.HTMLPanel.getFragByID(id,contentStr);Spry.Widget.HTMLPanel.setInnerHTML(this.element,contentStr,!this.evalScripts);this.removeStateClasses();this.notifyObservers("onPostUpdate",data)};Spry.Widget.HTMLPanel.prototype.loadContent=function(url,opts){if(!this.element)
return;this.cancelLoad();if(!opts)
opts=new Object;opts.url=opts.url?opts.url:url;opts.method=opts.method?opts.method:"GET";opts.async=opts.async?opts.async:true;opts.id=opts.id?opts.id:undefined;var self=this;opts.errorCallback=function(req){self.onLoadError(req)};this.notifyObservers("onPreLoad",opts);if(this.loadingStateContent)
this.setContent(this.loadingStateContent);Spry.Widget.HTMLPanel.addClassName(this.element,this.loadingStateClass);this.pendingRequest=Spry.Widget.HTMLPanel.loadURL(opts.method,opts.url,opts.async, function(req){self.onLoadSuccessful(req)},opts)};Spry.Widget.HTMLPanel.prototype.cancelLoad=function(){try{if(this.pendingRequest&&this.pendingRequest.xhRequest){var xhr=this.pendingRequest.xhRequest;if(xhr.abort)
xhr.abort();xhr.onreadystatechange=null;this.notifyObservers("onLoadCancelled",this.pendingRequest)}}
catch(e){}
this.pendingRequest=null};Spry.Widget.HTMLPanel.prototype.removeStateClasses=function(){Spry.Widget.HTMLPanel.removeClassName(this.element,this.loadingStateClass);Spry.Widget.HTMLPanel.removeClassName(this.element,this.errorStateClass)};Spry.Widget.HTMLPanel.prototype.onLoadSuccessful=function(req){this.notifyObservers("onPostLoad",req);this.setContent(req.xhRequest.responseText,req.id);this.pendingRequest=null};Spry.Widget.HTMLPanel.prototype.onLoadError=function(req){this.notifyObservers("onLoadError",req);if(this.errorStateContent)
this.setContent(this.errorStateContent);Spry.Widget.HTMLPanel.addClassName(this.element,this.errorStateClass);this.pendingRequest=null};Spry.Widget.HTMLPanel.msProgIDs=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0"];Spry.Widget.HTMLPanel.createXMLHttpRequest=function(){var req=null;if(window.ActiveXObject){while(!req&&Spry.Widget.HTMLPanel.msProgIDs.length){try{req=new ActiveXObject(Spry.Widget.HTMLPanel.msProgIDs[0])} catch(e){req=null}
if(!req)
Spry.Widget.HTMLPanel.msProgIDs.splice(0,1)}}
if(!req&&window.XMLHttpRequest){try{req=new XMLHttpRequest()} catch(e){req=null}}
return req};Spry.Widget.HTMLPanel.loadURL=function(method,url,async,callback,opts){var req=new Object;req.method=method;req.url=url;req.async=async;req.successCallback=callback;Spry.Widget.HTMLPanel.setOptions(req,opts);try{req.xhRequest=Spry.Widget.HTMLPanel.createXMLHttpRequest();if(!req.xhRequest)
return null;if(req.async)
req.xhRequest.onreadystatechange=function(){Spry.Widget.HTMLPanel.loadURL.callback(req)};req.xhRequest.open(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.Widget.HTMLPanel.loadURL.callback(req)}
catch(e){if(req.errorCallback) req.errorCallback(req);req=null}
return req};Spry.Widget.HTMLPanel.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.Widget.HTMLPanel.eval=function(str){return eval(str)};Spry.Widget.HTMLPanel.setInnerHTML=function(ele,str,preventScripts){if(!ele)
return;if(!str) str="";ele=Spry.Widget.HTMLPanel.$(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.Widget.HTMLPanel.eval(s)}}};

/* - SpryTabbedPanels.js - */
// http://en.optimizer.binarygate.biz/portal_javascripts/SpryTabbedPanels.js?original=1
var Spry;if(!Spry) Spry={};if(!Spry.Widget) Spry.Widget={};Spry.Widget.TabbedPanels=function(element,opts){this.element=this.getElement(element);this.defaultTab=0;this.tabSelectedClass="TabbedPanelsTabSelected";this.tabHoverClass="TabbedPanelsTabHover";this.tabFocusedClass="TabbedPanelsTabFocused";this.panelVisibleClass="TabbedPanelsContentVisible";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;Spry.Widget.TabbedPanels.setOptions(this,opts);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);this.attachBehaviors()};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){return Math.min(this.getTabs().length,this.getContentPanels().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.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())
return;var tabs=this.getTabs();var panels=this.getContentPanels();var 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.removeClassName(panels[i],this.panelVisibleClass);panels[i].style.display="none"}}}
this.addClassName(tabs[tpIndex],this.tabSelectedClass);this.addClassName(panels[tpIndex],this.panelVisibleClass);panels[tpIndex].style.display="block";this.currentTabIndex=tpIndex};Spry.Widget.TabbedPanels.prototype.attachBehaviors=function(element){var tabs=this.getTabs();var panels=this.getContentPanels();var panelCount=this.getTabbedPanelCount();for(var i=0;i<panelCount;i++)
this.addPanelEventListeners(tabs[i],panels[i]);this.showPanel(this.defaultTab)};
