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(/^\//,"");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=1;Spry.Data.Region.RS_LoadingData=2;Spry.Data.Region.RS_PreUpdate=4;Spry.Data.Region.RS_PostUpdate=8;Spry.Data.Region.prototype.getState=function(){return this.currentState;};Spry.Data.Region.prototype.mapState=function(stateName,newStateName){this.stateMap[stateName]=newStateName;};Spry.Data.Region.prototype.getMappedState=function(stateName){var mappedState=this.stateMap[stateName];return mappedState?mappedState:stateName;};Spry.Data.Region.prototype.setState=function(stateName,suppressNotfications){var stateObj={state:stateName,mappedState:this.getMappedState(stateName)};if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPreStateChange",this,stateObj);}this.currentState=stateObj.mappedState?stateObj.mappedState:stateName;if(this.states[stateName]){var notificationData={state:this.currentState};if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPreUpdate",this,notificationData);}var str=this.transform();if(Spry.Data.Region.debug){Spry.Debug.trace("<hr />Generated region markup for '"+this.name+"':<br /><br />"+Spry.Utils.encodeEntities(str));}Spry.Utils.setInnerHTML(this.regionNode,str,!Spry.Data.Region.evalScripts);if(this.hasBehaviorAttributes){this.attachBehaviors();}if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPostUpdate",this,notificationData);}}if(!suppressNotfications){Spry.Data.Region.notifyObservers("onPostStateChange",this,stateObj);}};Spry.Data.Region.prototype.getDataSets=function(){return this.dataSets;};Spry.Data.Region.prototype.addDataSet=function(aDataSet){if(!aDataSet){return;}if(!this.dataSets){this.dataSets=new Array;}for(var i=0;i<this.dataSets.length;i++){if(this.dataSets[i]==aDataSet){return;}}this.dataSets.push(aDataSet);aDataSet.addObserver(this);};Spry.Data.Region.prototype.removeDataSet=function(aDataSet){if(!aDataSet||this.dataSets){return;}for(var i=0;i<this.dataSets.length;i++){if(this.dataSets[i]==aDataSet){this.dataSets.splice(i,1);aDataSet.removeObserver(this);return;}}};Spry.Data.Region.prototype.onPreLoad=function(dataSet){if(this.currentState!="loading"){this.setState("loading");}};Spry.Data.Region.prototype.onLoadError=function(dataSet){if(this.currentState!="error"){this.setState("error");}Spry.Data.Region.notifyObservers("onError",this);};Spry.Data.Region.prototype.onSessionExpired=function(dataSet){if(this.currentState!="expired"){this.setState("expired");}Spry.Data.Region.notifyObservers("onExpired",this);};Spry.Data.Region.prototype.onCurrentRowChanged=function(dataSet,data){if(this.isDetailRegion){this.updateContent();}};Spry.Data.Region.prototype.onPostSort=function(dataSet,data){this.updateContent();};Spry.Data.Region.prototype.onDataChanged=function(dataSet,data){this.updateContent();};Spry.Data.Region.enableBehaviorAttributes=true;Spry.Data.Region.behaviorAttrs={};Spry.Data.Region.behaviorAttrs["spry:select"]={attach:function(rgn,node,value){var selectGroupName=null;try{selectGroupName=node.attributes.getNamedItem("spry:selectgroup").value;}catch(e){}if(!selectGroupName){selectGroupName="default";}Spry.Utils.addEventListener(node,"click",function(event){Spry.Utils.SelectionManager.select(selectGroupName,node,value);},false);if(node.attributes.getNamedItem("spry:selected")){Spry.Utils.SelectionManager.select(selectGroupName,node,value);}}};Spry.Data.Region.behaviorAttrs["spry:hover"]={attach:function(rgn,node,value){Spry.Utils.addEventListener(node,"mouseover",function(event){Spry.Utils.addClassName(node,value);},false);Spry.Utils.addEventListener(node,"mouseout",function(event){Spry.Utils.removeClassName(node,value);},false);}};Spry.Data.Region.setUpRowNumberForEvenOddAttr=function(node,attr,value,rowNumAttrName){if(!value){Spry.Debug.showError("The "+attr+" attribute requires a CSS class name as its value!");node.attributes.removeNamedItem(attr);return;}var dsName="";var valArr=value.split(/\s/);if(valArr.length>1){dsName=valArr[0];node.setAttribute(attr,valArr[1]);}node.setAttribute(rowNumAttrName,"{"+(dsName?(dsName+"::"):"")+"ds_RowNumber}");};Spry.Data.Region.behaviorAttrs["spry:even"]={setup:function(node,value){Spry.Data.Region.setUpRowNumberForEvenOddAttr(node,"spry:even",value,"spryevenrownumber");},attach:function(rgn,node,value){if(value){rowNumAttr=node.attributes.getNamedItem("spryevenrownumber");if(rowNumAttr&&rowNumAttr.value){var rowNum=parseInt(rowNumAttr.value);if(rowNum%2){Spry.Utils.addClassName(node,value);}}}node.removeAttribute("spry:even");node.removeAttribute("spryevenrownumber");}};Spry.Data.Region.behaviorAttrs["spry:odd"]={setup:function(node,value){Spry.Data.Region.setUpRowNumberForEvenOddAttr(node,"spry:odd",value,"spryoddrownumber");},attach:function(rgn,node,value){if(value){rowNumAttr=node.attributes.getNamedItem("spryoddrownumber");if(rowNumAttr&&rowNumAttr.value){var rowNum=parseInt(rowNumAttr.value);if(rowNum%2==0){Spry.Utils.addClassName(node,value);}}}node.removeAttribute("spry:odd");node.removeAttribute("spryoddrownumber");}};Spry.Data.Region.setRowAttrClickHandler=function(node,dsName,rowAttr,funcName){if(dsName){var ds=Spry.Data.getDataSetByName(dsName);if(ds){rowIDAttr=node.attributes.getNamedItem(rowAttr);if(rowIDAttr){var rowAttrVal=rowIDAttr.value;if(rowAttrVal){Spry.Utils.addEventListener(node,"click",function(event){ds[funcName](rowAttrVal);},false);}}}}};Spry.Data.Region.behaviorAttrs["spry:setrow"]={setup:function(node,value){if(!value){Spry.Debug.reportError("The spry:setrow attribute requires a data set name as its value!");node.removeAttribute("spry:setrow");return;}node.setAttribute("spryrowid","{"+value+"::ds_RowID}");},attach:function(rgn,node,value){Spry.Data.Region.setRowAttrClickHandler(node,value,"spryrowid","setCurrentRow");node.removeAttribute("spry:setrow");node.removeAttribute("spryrowid");}};Spry.Data.Region.behaviorAttrs["spry:setrownumber"]={setup:function(node,value){if(!value){Spry.Debug.reportError("The spry:setrownumber attribute requires a data set name as its value!");node.removeAttribute("spry:setrownumber");return;}node.setAttribute("spryrownumber","{"+value+"::ds_RowID}");},attach:function(rgn,node,value){Spry.Data.Region.setRowAttrClickHandler(node,value,"spryrownumber","setCurrentRowNumber");node.removeAttribute("spry:setrownumber");node.removeAttribute("spryrownumber");}};Spry.Data.Region.behaviorAttrs["spry:sort"]={attach:function(rgn,node,value){if(!value){return;}var ds=rgn.getDataSets()[0];var sortOrder="toggle";var colArray=value.split(/\s/);if(colArray.length>1){var specifiedDS=Spry.Data.getDataSetByName(colArray[0]);if(specifiedDS){ds=specifiedDS;colArray.shift();}if(colArray.length>1){var str=colArray[colArray.length-1];if(str=="ascending"||str=="descending"||str=="toggle"){sortOrder=str;colArray.pop();}}}if(ds&&colArray.length>0){Spry.Utils.addEventListener(node,"click",function(event){ds.sort(colArray,sortOrder);},false);}node.removeAttribute("spry:sort");}};Spry.Data.Region.prototype.attachBehaviors=function(){var rgn=this;Spry.Utils.getNodesByFunc(this.regionNode,function(node){if(!node||node.nodeType!=1){return false;}try{var bAttrs=Spry.Data.Region.behaviorAttrs;for(var bAttrName in bAttrs){var attr=node.attributes.getNamedItem(bAttrName);if(attr){var behavior=bAttrs[bAttrName];if(behavior&&behavior.attach){behavior.attach(rgn,node,attr.value);}}}}catch(e){}return false;});};Spry.Data.Region.prototype.updateContent=function(){var allDataSetsReady=true;var dsArray=this.getDataSets();if(!dsArray||dsArray.length<1){Spry.Debug.reportError("updateContent(): Region '"+this.name+"' has no data set!\n");return;}for(var i=0;i<dsArray.length;i++){var ds=dsArray[i];if(ds){if(ds.getLoadDataRequestIsPending()){allDataSetsReady=false;}else{if(!ds.getDataWasLoaded()){ds.loadData();allDataSetsReady=false;}}}}if(!allDataSetsReady){Spry.Data.Region.notifyObservers("onLoadingData",this);return;}this.setState("ready");};Spry.Data.Region.prototype.clearContent=function(){this.regionNode.innerHTML="";};Spry.Data.Region.processContentPI=function(inStr){var outStr="";var regexp=/<!--\s*<\/?spry:content\s*[^>]*>\s*-->/mg;var searchStartIndex=0;var processingContentTag=0;while(inStr.length){var results=regexp.exec(inStr);if(!results||!results[0]){outStr+=inStr.substr(searchStartIndex,inStr.length-searchStartIndex);break;}if(!processingContentTag&&results.index!=searchStartIndex){outStr+=inStr.substr(searchStartIndex,results.index-searchStartIndex);}if(results[0].search(/<\//)!=-1){--processingContentTag;if(processingContentTag){Spry.Debug.reportError("Nested spry:content regions are not allowed!\n");}}else{++processingContentTag;var dataRefStr=results[0].replace(/.*\bdataref="/,"");outStr+=dataRefStr.replace(/".*$/,"");}searchStartIndex=regexp.lastIndex;}return outStr;};Spry.Data.Region.prototype.tokenizeData=function(dataStr){if(!dataStr){return null;}var rootToken=new Spry.Data.Region.Token(Spry.Data.Region.Token.LIST_TOKEN,null,null,null);var tokenStack=new Array;var parseStr=Spry.Data.Region.processContentPI(dataStr);tokenStack.push(rootToken);var regexp=/((<!--\s*){0,1}<\/{0,1}spry:[^>]+>(\s*-->){0,1})|((\{|%7[bB])[^\}\s%]+(\}|%7[dD]))/mg;var searchStartIndex=0;while(parseStr.length){var results=regexp.exec(parseStr);var token=null;if(!results||!results[0]){var str=parseStr.substr(searchStartIndex,parseStr.length-searchStartIndex);token=new Spry.Data.Region.Token(Spry.Data.Region.Token.STRING_TOKEN,null,str,str);tokenStack[tokenStack.length-1].addChild(token);break;}if(results.index!=searchStartIndex){var str=parseStr.substr(searchStartIndex,results.index-searchStartIndex);token=new Spry.Data.Region.Token(Spry.Data.Region.Token.STRING_TOKEN,null,str,str);tokenStack[tokenStack.length-1].addChild(token);}if(results[0].search(/^({|%7[bB])/)!=-1){var valueName=results[0];var regionStr=results[0];valueName=valueName.replace(/^({|%7[bB])/,"");valueName=valueName.replace(/(}|%7[dD])$/,"");var dataSetName=null;var splitArray=valueName.split(/::/);if(splitArray.length>1){dataSetName=splitArray[0];valueName=splitArray[1];}regionStr=regionStr.replace(/^%7[bB]/,"{");regionStr=regionStr.replace(/%7[dD]$/,"}");token=new Spry.Data.Region.Token(Spry.Data.Region.Token.VALUE_TOKEN,dataSetName,valueName,new String(regionStr));tokenStack[tokenStack.length-1].addChild(token);}else{if(results[0].charAt(0)=="<"){var piName=results[0].replace(/^(<!--\s*){0,1}<\/?/,"");piName=piName.replace(/>(\s*-->){0,1}|\s.*$/,"");if(results[0].search(/<\//)!=-1){if(tokenStack[tokenStack.length-1].tokenType!=Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN){Spry.Debug.reportError("Invalid processing instruction close tag: "+piName+" -- "+results[0]+"\n");return null;}tokenStack.pop();}else{var piDesc=Spry.Data.Region.PI.instructions[piName];if(piDesc){var dataSet=null;var selectedDataSetName="";if(results[0].search(/^.*\bselect=\"/)!=-1){selectedDataSetName=results[0].replace(/^.*\bselect=\"/,"");selectedDataSetName=selectedDataSetName.replace(/".*$/,"");if(selectedDataSetName){dataSet=Spry.Data.getDataSetByName(selectedDataSetName);if(!dataSet){Spry.Debug.reportError("Failed to retrieve data set ("+selectedDataSetName+") for "+piName+"\n");selectedDataSetName="";}}}var jsExpr=null;if(results[0].search(/^.*\btest=\"/)!=-1){jsExpr=results[0].replace(/^.*\btest=\"/,"");jsExpr=jsExpr.replace(/".*$/,"");jsExpr=Spry.Utils.decodeEntities(jsExpr);}var regionState=null;if(results[0].search(/^.*\bname=\"/)!=-1){regionState=results[0].replace(/^.*\bname=\"/,"");regionState=regionState.replace(/".*$/,"");regionState=Spry.Utils.decodeEntities(regionState);}var piData=new Spry.Data.Region.Token.PIData(piName,selectedDataSetName,jsExpr,regionState);token=new Spry.Data.Region.Token(Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN,dataSet,piData,new String(results[0]));tokenStack[tokenStack.length-1].addChild(token);tokenStack.push(token);}else{Spry.Debug.reportError("Unsupported region processing instruction: "+results[0]+"\n");return null;}}}else{Spry.Debug.reportError("Invalid region token: "+results[0]+"\n");return null;}}searchStartIndex=regexp.lastIndex;}return rootToken;};Spry.Data.Region.prototype.callScriptFunction=function(funcName,processContext){var result=undefined;funcName=funcName.replace(/^\s*\{?\s*function::\s*|\s*\}?\s*$/g,"");var func=Spry.Utils.getObjectByName(funcName);if(func){result=func(this.name,function(){return processContext.getValueFromDataSet.apply(processContext,arguments);});}return result;};Spry.Data.Region.prototype.evaluateExpression=function(exprStr,processContext){var result=undefined;try{if(exprStr.search(/^\s*function::/)!=-1){result=this.callScriptFunction(exprStr,processContext);}else{result=Spry.Utils.eval(Spry.Data.Region.processDataRefString(processContext,exprStr,null,true));}}catch(e){Spry.Debug.trace("Caught exception in Spry.Data.Region.prototype.evaluateExpression() while evaluating: "+Spry.Utils.encodeEntities(exprStr)+"\n    Exception:"+e+"\n");}return result;};Spry.Data.Region.prototype.processTokenChildren=function(outputArr,token,processContext){var children=token.children;var len=children.length;for(var i=0;i<len;i++){this.processTokens(outputArr,children[i],processContext);}};Spry.Data.Region.prototype.processTokens=function(outputArr,token,processContext){var i=0;switch(token.tokenType){case Spry.Data.Region.Token.LIST_TOKEN:this.processTokenChildren(outputArr,token,processContext);break;case Spry.Data.Region.Token.STRING_TOKEN:outputArr.push(token.data);break;case Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN:if(token.data.name=="spry:repeat"){var dataSet=null;if(token.dataSet){dataSet=token.dataSet;}else{dataSet=this.dataSets[0];}if(dataSet){var dsContext=processContext.getDataSetContext(dataSet);if(!dsContext){Spry.Debug.reportError("processTokens() failed to get a data set context!\n");break;}dsContext.pushState();var dataSetRows=dsContext.getData();var numRows=dataSetRows.length;for(i=0;i<numRows;i++){dsContext.setRowIndex(i);var testVal=true;if(token.data.jsExpr){testVal=this.evaluateExpression(token.data.jsExpr,processContext);}if(testVal){this.processTokenChildren(outputArr,token,processContext);}}dsContext.popState();}}else{if(token.data.name=="spry:if"){var testVal=true;if(token.data.jsExpr){testVal=this.evaluateExpression(token.data.jsExpr,processContext);}if(testVal){this.processTokenChildren(outputArr,token,processContext);}}else{if(token.data.name=="spry:choose"){var defaultChild=null;var childToProcess=null;var testVal=false;var j=0;for(j=0;j<token.children.length;j++){var child=token.children[j];if(child.tokenType==Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN){if(child.data.name=="spry:when"){if(child.data.jsExpr){testVal=this.evaluateExpression(child.data.jsExpr,processContext);if(testVal){childToProcess=child;break;}}}else{if(child.data.name=="spry:default"){defaultChild=child;}}}}if(!childToProcess&&defaultChild){childToProcess=defaultChild;}if(childToProcess){this.processTokenChildren(outputArr,childToProcess,processContext);}}else{if(token.data.name=="spry:state"){var testVal=true;if(!token.data.regionState||token.data.regionState==this.currentState){this.processTokenChildren(outputArr,token,processContext);}}else{Spry.Debug.reportError("processTokens(): Unknown processing instruction: "+token.data.name+"\n");return"";}}}}break;case Spry.Data.Region.Token.VALUE_TOKEN:var dataSet=token.dataSet;var val=undefined;if(dataSet&&dataSet=="function"){val=this.callScriptFunction(token.data,processContext);}else{if(!dataSet&&this.dataSets&&this.dataSets.length>0&&this.dataSets[0]){dataSet=this.dataSets[0];}if(!dataSet){Spry.Debug.reportError("processTokens(): Value reference has no data set specified: "+token.regionStr+"\n");return"";}val=processContext.getValueFromDataSet(dataSet,token.data);}if(typeof val!="undefined"){outputArr.push(val+"");}break;default:Spry.Debug.reportError("processTokens(): Invalid token type: "+token.regionStr+"\n");break;}};Spry.Data.Region.prototype.transform=function(){if(this.data&&!this.tokens){this.tokens=this.tokenizeData(this.data);}if(!this.tokens){return"";}processContext=new Spry.Data.Region.ProcessingContext(this);if(!processContext){return"";}var outputArr=[""];this.processTokens(outputArr,this.tokens,processContext);return outputArr.join("");};Spry.Data.Region.PI={};Spry.Data.Region.PI.instructions={};Spry.Data.Region.PI.buildOpenTagForValueAttr=function(ele,piName,attrName){if(!ele||!piName){return"";}var jsExpr="";try{var testAttr=ele.attributes.getNamedItem(piName);if(testAttr&&testAttr.value){jsExpr=Spry.Utils.encodeEntities(testAttr.value);}}catch(e){jsExpr="";}if(!jsExpr){Spry.Debug.reportError(piName+" attribute requires a JavaScript expression that returns true or false!\n");return"";}return"<"+Spry.Data.Region.PI.instructions[piName].tagName+" "+attrName+'="'+jsExpr+'">';};Spry.Data.Region.PI.buildOpenTagForTest=function(ele,piName){return Spry.Data.Region.PI.buildOpenTagForValueAttr(ele,piName,"test");};Spry.Data.Region.PI.buildOpenTagForState=function(ele,piName){return Spry.Data.Region.PI.buildOpenTagForValueAttr(ele,piName,"name");};Spry.Data.Region.PI.buildOpenTagForRepeat=function(ele,piName){if(!ele||!piName){return"";}var selectAttrStr="";try{var selectAttr=ele.attributes.getNamedItem(piName);if(selectAttr&&selectAttr.value){selectAttrStr=selectAttr.value;selectAttrStr=selectAttrStr.replace(/\s/g,"");}}catch(e){selectAttrStr="";}if(!selectAttrStr){Spry.Debug.reportError(piName+" attribute requires a data set name!\n");return"";}var testAttrStr="";try{var testAttr=ele.attributes.getNamedItem("spry:test");if(testAttr){if(testAttr.value){testAttrStr=' test="'+Spry.Utils.encodeEntities(testAttr.value)+'"';}ele.attributes.removeNamedItem(testAttr.nodeName);}}catch(e){testAttrStr="";}return"<"+Spry.Data.Region.PI.instructions[piName].tagName+' select="'+selectAttrStr+'"'+testAttrStr+">";};Spry.Data.Region.PI.buildOpenTagForContent=function(ele,piName){if(!ele||!piName){return"";}var dataRefStr="";try{var contentAttr=ele.attributes.getNamedItem(piName);if(contentAttr&&contentAttr.value){dataRefStr=Spry.Utils.encodeEntities(contentAttr.value);}}catch(e){dataRefStr="";}if(!dataRefStr){Spry.Debug.reportError(piName+" attribute requires a data reference!\n");return"";}return"<"+Spry.Data.Region.PI.instructions[piName].tagName+' dataref="'+dataRefStr+'">';};Spry.Data.Region.PI.buildOpenTag=function(ele,piName){return"<"+Spry.Data.Region.PI.instructions[piName].tagName+">";};Spry.Data.Region.PI.buildCloseTag=function(ele,piName){return"</"+Spry.Data.Region.PI.instructions[piName].tagName+">";};Spry.Data.Region.PI.instructions["spry:state"]={tagName:"spry:state",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForState,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:if"]={tagName:"spry:if",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForTest,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:repeat"]={tagName:"spry:repeat",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForRepeat,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:repeatchildren"]={tagName:"spry:repeat",childrenOnly:true,getOpenTag:Spry.Data.Region.PI.buildOpenTagForRepeat,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:choose"]={tagName:"spry:choose",childrenOnly:true,getOpenTag:Spry.Data.Region.PI.buildOpenTag,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:when"]={tagName:"spry:when",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTagForTest,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:default"]={tagName:"spry:default",childrenOnly:false,getOpenTag:Spry.Data.Region.PI.buildOpenTag,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.instructions["spry:content"]={tagName:"spry:content",childrenOnly:true,getOpenTag:Spry.Data.Region.PI.buildOpenTagForContent,getCloseTag:Spry.Data.Region.PI.buildCloseTag};Spry.Data.Region.PI.orderedInstructions=["spry:state","spry:if","spry:repeat","spry:repeatchildren","spry:choose","spry:when","spry:default","spry:content"];Spry.Data.Region.getTokensFromStr=function(str){if(!str){return null;}return str.match(/{[^}]+}/g);};Spry.Data.Region.processDataRefString=function(processingContext,regionStr,dataSetsToUse,isJSExpr){if(!regionStr){return"";}if(!processingContext&&!dataSetsToUse){return regionStr;}var resultStr="";var re=new RegExp("\\{([^\\}:]+::)?[^\\}]+\\}","g");var startSearchIndex=0;while(startSearchIndex<regionStr.length){var reArray=re.exec(regionStr);if(!reArray||!reArray[0]){resultStr+=regionStr.substr(startSearchIndex,regionStr.length-startSearchIndex);return resultStr;}if(reArray.index!=startSearchIndex){resultStr+=regionStr.substr(startSearchIndex,reArray.index-startSearchIndex);}var dsName="";if(reArray[0].search(/^\{[^}:]+::/)!=-1){dsName=reArray[0].replace(/^\{|::.*/g,"");}var fieldName=reArray[0].replace(/^\{|.*::|\}/g,"");var row=null;var val="";if(processingContext){val=processingContext.getValueFromDataSet(dsName,fieldName);}else{var ds=dsName?dataSetsToUse[dsName]:dataSetsToUse[0];if(ds){val=ds.getValue(fieldName);}}if(typeof val!="undefined"){val+="";resultStr+=isJSExpr?Spry.Utils.escapeQuotesAndLineBreaks(val):val;}if(startSearchIndex==re.lastIndex){var leftOverIndex=reArray.index+reArray[0].length;if(leftOverIndex<regionStr.length){resultStr+=regionStr.substr(leftOverIndex);}break;}startSearchIndex=re.lastIndex;}return resultStr;};Spry.Data.Region.strToDataSetsArray=function(str,returnRegionNames){var dataSetsArr=new Array;var foundHash={};if(!str){return dataSetsArr;}str=str.replace(/\s+/g," ");str=str.replace(/^\s|\s$/g,"");var arr=str.split(/ /);for(var i=0;i<arr.length;i++){if(arr[i]&&!Spry.Data.Region.PI.instructions[arr[i]]){try{var dataSet=Spry.Data.getDataSetByName(arr[i]);if(!foundHash[arr[i]]){if(returnRegionNames){dataSetsArr.push(arr[i]);}else{dataSetsArr.push(dataSet);}foundHash[arr[i]]=true;}}catch(e){}}}return dataSetsArr;};Spry.Data.Region.DSContext=function(dataSet,processingContext){var m_dataSet=dataSet;var m_processingContext=processingContext;var m_curRowIndexArray=[{rowIndex:-1}];var m_parent=null;var m_children=[];var getInternalRowIndex=function(){return m_curRowIndexArray[m_curRowIndexArray.length-1].rowIndex;};this.resetAll=function(){m_curRowIndexArray=[{rowIndex:m_dataSet.getCurrentRow()}];};this.getDataSet=function(){return m_dataSet;};this.getNumRows=function(unfiltered){var data=this.getCurrentState().data;return data?data.length:m_dataSet.getRowCount(unfiltered);};this.getData=function(){var data=this.getCurrentState().data;return data?data:m_dataSet.getData();};this.setData=function(data){this.getCurrentState().data=data;};this.getValue=function(valueName,rowContext){var result="";var curState=this.getCurrentState();var ds=curState.nestedDS?curState.nestedDS:this.getDataSet();if(ds){result=ds.getValue(valueName,rowContext);}return result;};this.getCurrentRow=function(){if(m_curRowIndexArray.length<2||getInternalRowIndex()<0){return m_dataSet.getCurrentRow();}var data=this.getData();var curRowIndex=getInternalRowIndex();if(curRowIndex<0||curRowIndex>data.length){Spry.Debug.reportError("Invalid index used in Spry.Data.Region.DSContext.getCurrentRow()!\n");return null;}return data[curRowIndex];};this.getRowIndex=function(){var curRowIndex=getInternalRowIndex();if(curRowIndex>=0){return curRowIndex;}return m_dataSet.getRowNumber(m_dataSet.getCurrentRow());};this.setRowIndex=function(rowIndex){this.getCurrentState().rowIndex=rowIndex;var data=this.getData();var numChildren=m_children.length;for(var i=0;i<numChildren;i++){m_children[i].syncDataWithParentRow(this,rowIndex,data);}};this.syncDataWithParentRow=function(parentDSContext,rowIndex,parentData){var row=parentData[rowIndex];if(row){nestedDS=m_dataSet.getNestedDataSetForParentRow(row);if(nestedDS){var currentState=this.getCurrentState();currentState.nestedDS=nestedDS;currentState.data=nestedDS.getData();currentState.rowIndex=nestedDS.getCurrentRowNumber();currentState.rowIndex=currentState.rowIndex<0?0:currentState.rowIndex;var numChildren=m_children.length;for(var i=0;i<numChildren;i++){m_children[i].syncDataWithParentRow(this,currentState.rowIndex,currentState.data);}}}};this.pushState=function(){var curState=this.getCurrentState();var newState=new Object;newState.rowIndex=curState.rowIndex;newState.data=curState.data;newState.nestedDS=curState.nestedDS;m_curRowIndexArray.push(newState);var numChildren=m_children.length;for(var i=0;i<numChildren;i++){m_children[i].pushState();}};this.popState=function(){if(m_curRowIndexArray.length<2){Spry.Debug.reportError("Stack underflow in Spry.Data.Region.DSContext.popState()!\n");return;}var numChildren=m_children.length;for(var i=0;i<numChildren;i++){m_children[i].popState();}m_curRowIndexArray.pop();};this.getCurrentState=function(){return m_curRowIndexArray[m_curRowIndexArray.length-1];};this.addChild=function(childDSContext){var numChildren=m_children.length;for(var i=0;i<numChildren;i++){if(m_children[i]==childDSContext){return;}}m_children.push(childDSContext);};};Spry.Data.Region.ProcessingContext=function(region){this.region=region;this.dataSetContexts=[];if(region&&region.dataSets){var dsArray=region.dataSets.slice(0);var dsArrayLen=dsArray.length;for(var i=0;i<dsArrayLen;i++){var ds=region.dataSets[i];while(ds&&ds.getParentDataSet){var doesExist=false;ds=ds.getParentDataSet();if(ds&&this.indexOf(dsArray,ds)==-1){dsArray.push(ds);}}}for(i=0;i<dsArray.length;i++){this.dataSetContexts.push(new Spry.Data.Region.DSContext(dsArray[i],this));}var dsContexts=this.dataSetContexts;var numDSContexts=dsContexts.length;for(i=0;i<numDSContexts;i++){var dsc=dsContexts[i];var ds=dsc.getDataSet();if(ds.getParentDataSet){var parentDS=ds.getParentDataSet();if(parentDS){var pdsc=this.getDataSetContext(parentDS);if(pdsc){pdsc.addChild(dsc);}}}}}};Spry.Data.Region.ProcessingContext.prototype.indexOf=function(arr,item){if(arr){var arrLen=arr.length;for(var i=0;i<arrLen;i++){if(arr[i]==item){return i;}}}return -1;};Spry.Data.Region.ProcessingContext.prototype.getDataSetContext=function(dataSet){if(!dataSet){if(this.dataSetContexts.length>0){return this.dataSetContexts[0];}return null;}if(typeof dataSet=="string"){dataSet=Spry.Data.getDataSetByName(dataSet);if(!dataSet){return null;}}for(var i=0;i<this.dataSetContexts.length;i++){var dsc=this.dataSetContexts[i];if(dsc.getDataSet()==dataSet){return dsc;}}return null;};Spry.Data.Region.ProcessingContext.prototype.getValueFromDataSet=function(){var dsName="";var columnName="";if(arguments.length>1){dsName=arguments[0];columnName=arguments[1];}else{var dataRef=arguments[0].replace(/\s*{\s*|\s*}\s*/g,"");if(dataRef.search("::")!=-1){dsName=dataRef.replace(/::.*/,"");columnName=dataRef.replace(/.*::/,"");}else{columnName=dataRef;}}var result="";var dsContext=this.getDataSetContext(dsName);if(dsContext){result=dsContext.getValue(columnName,dsContext.getCurrentRow());}else{Spry.Debug.reportError("getValueFromDataSet: Failed to get "+dsName+" context for the "+this.region.regionNode.id+" region.\n");}return result;};Spry.Data.Region.ProcessingContext.prototype.$v=Spry.Data.Region.ProcessingContext.prototype.getValueFromDataSet;Spry.Data.Region.ProcessingContext.prototype.getCurrentRowForDataSet=function(dataSet){var dsc=this.getDataSetContext(dataSet);if(dsc){return dsc.getCurrentRow();}return null;};Spry.Data.Region.Token=function(tokenType,dataSet,data,regionStr){var self=this;this.tokenType=tokenType;this.dataSet=dataSet;this.data=data;this.regionStr=regionStr;this.parent=null;this.children=null;};Spry.Data.Region.Token.prototype.addChild=function(child){if(!child){return;}if(!this.children){this.children=new Array;}this.children.push(child);child.parent=this;};Spry.Data.Region.Token.LIST_TOKEN=0;Spry.Data.Region.Token.STRING_TOKEN=1;Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN=2;Spry.Data.Region.Token.VALUE_TOKEN=3;Spry.Data.Region.Token.PIData=function(piName,data,jsExpr,regionState){var self=this;this.name=piName;this.data=data;this.jsExpr=jsExpr;this.regionState=regionState;};Spry.Utils.addLoadListener(function(){setTimeout(function(){if(Spry.Data.initRegionsOnLoad){Spry.Data.initRegions();}},0);});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;}
