/*  
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
See http://creativecommons.org/licenses/by-sa/2.5/
You are free:

    * to copy, distribute, display, and perform the work
    * to make derivative works
    * to make commercial use of the work

 You must attribute the work by leaving the attribution in place.
 If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one.

    *  For any reuse or distribution, you must make clear to others the license terms of this work.
    *  Any of these conditions can be waived if you get permission from the copyright holder.

Copyright 2005-2006 by Nate Grover.
http://www.clientsidetech.com
*/
function NA(){return new Array()}
function ND(){return new Date()}
function nd(x){return new Date(x)}
function NO(){return new Object()};
function ST(a,b){setTimeout(a,b)};
function IO(x,y){return x.indexOf(y)}
function SC(a,b){a.className = b}
function SV(a,b){a.value=b}
function SI(a,b){a.innerHTML=b}
function SD(a,b){a.style.display=b}
function TBD(a){TD(a,"block")}
function TID(a){TD(a,"inline")}
function TD(a,b){a.style.display = TV(a.style.display,b,"none");}
function TV(a,b,c){return toggleValue(a,b,c)}
function PI(a){return parseInt(a)}
function PF(a){return parseFloat(a)}
function UC(a){return a.toUpperCase()}
function getBool(a){return exists(a)?a:false};
function getDefaultValue(a,b){return exists(a)?a:b;}
function exists(x){return (x!=null&&typeof x!="undefined")}
function isString(x){return typeof x=="string"}
function isNumber(x){return typeof x=="number"}
function isArray(x){return isObject(x)&&x.constructor==Array.prototype.constructor}
function isObject(x) {return typeof x=="object"}
function isType(x,y){return x.constructor==y.prototype.constructor}
function isFunction(x){return typeof x=="function"}
function isBoolean(x){return typeof x=="boolean"}
function isDate(x){return isObject(x)&&x.constructor==DP.constructor}
function toggleValue(x,y,z){return x==z?y:z}
function getBooleanFromString(v){return UC(v)=="TRUE"}
BFS=getBooleanFromString;
IS=isString;
IN=isNumber;
IA=isArray;
ISO=isObject;
IT=isType;
IF=isFunction;
ID=isDate;
TV=toggleValue;
IB=isBoolean;
GB=getBool;
GDV=getDefaultValue;
E=exists;
function getRandomNumber(x,y){var m=exists(y)?y:0;return Math.round(Math.random()*(x-m))+m}
function getRandomElement(array){return array[getRandomNumber(array.length-1,0)]}
function makeIndexedArray(m){var i=PI(m/8);var r=m%8;var c=0;var a=NA();if(i>0){do{a.push(c++);a.push(c++);a.push(c++);a.push(c++);a.push(c++);a.push(c++);a.push(c++);a.push(c++)}while(--i)}if(r>0){do{a.push(c++)}while(--r)}return a}
function convertIndexedArray(a,i){var I=PI(i.length/8);var R=i.length%8;var c=0;var r=NA();if(I>0){do{r.push(a[i[c++]]);r.push(a[i[c++]]);r.push(a[i[c++]]);r.push(a[i[c++]]);r.push(a[i[c++]]);r.push(a[i[c++]]);r.push(a[i[c++]]);r.push(a[i[c++]])}while(--I)}if(R>0){do{r.push(a[i[c++]])}while(--R)}return r}
CIA=convertIndexedArray;
MIA=makeIndexedArray;
DP=Date.prototype;
DP.days = "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(",");
DP.getDayName = function(){return this.days[this.getDay()]}
DP.months = "January,February,March,April,May,June,July,August,September,October,November,December".split(",");
DP.getMonthName = function(){return this.months[this.getMonth()]}
DP.monthAbbs = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(",");		  
DP.getAbbreviatedMonthName=function(){return this.monthAbbs[this.getMonth()]}
DP.ONE_DAY=86400000;
DP.ONE_MONTH=2628000000;
DP.ONE_YEAR=31536000000;
DP.getDaysDifference=function(x){return (x-this)/this.ONE_DAY}
DP.getMonthsDifference = function(x){return (x-this)/this.ONE_MONTH}
DP.getYearsDifference=function(x){return (x-this)/this.ONE_YEAR}
DP.toCSTFormat = function(){return (this.getMonth()+1)+"/"+this.getDate()+"/"+this.getFullYear()}		 
DP.getOrdinalDate=function(){var d=this.getDate();var s="";if(d==1||d==21||d==31){s="st"}else if (d==2||d==22){s="nd"}else if(d==3||d==23){s="rd"}else{s="th"}return d+s}
DP.getTimeStamp=function(){return this.getHours()+":"+this.getMinutes()+":"+this.getSeconds()+":"+this.getMilliseconds()}
DP.toString=DP.toCSTFormat;
Date.toString=DP.toCSTFormat;
DP.getShortYear=function(){var y=this.getFullYear();var x=2000;while(x>100){if(y>x){return y-x}x--}return y}
DP.isNorthAmerica = function(){return (this.getTimezoneOffset()<660&&this.getTimezoneOffset()>180)}
DP.addDays=function(days){this.setTime(this.getTime()+(this.ONE_DAY*days))}
DP.subtractDays=function(days){this.setTime(this.getTime()-(this.ONE_DAY*days))}

DOMCloner={A:"A",i:"INPUT",
get:function(x){dc.at(x);return dc.e[x].cloneNode(false)},
getNode:function(t,x,y,z){dc.at(t);var e=dc.e[t].cloneNode(false);e.id=x;e.className=y;e.innerHTML=exists(z)?z:'';return e},
getLink:function(h,i,c,id){dc.at(dc.A);var e=dc.e[dc.A].cloneNode(false);e.href=h;e.innerHTML=i;e.className=c;e.id=id;return e},
getInput:function(t,v,c,id,name){if(dc.e[t]==null){dc.e[t]=dh.a(dc.i);dc.e[t].type=t}var e=this.e[t].cloneNode(false);e.id=id;e.name=name;e.className=c;e.value=v;return e},
addType:function(x){if(dc.e[x]==null){dc.e[x]=dh.a(x)}},
e:[],
x:function(a){var t = dc.g("TD");t.colSpan=a;return t}
}
dc=DOMCloner;dc.g=dc.get;dc.gn=dc.getNode;dc.gi=dc.getInput;dc.ga=dc.getLink;dc.at=dc.addType;

DOMHelper={D:document,create:function(x){return dh.D.createElement(x)},
get:function(x){return dh.D.getElementById(x)},
getByName:function(x){return dh.D.getElementsByName(x)},
appendChild:function(a,b,c){a.appendChild(b);if(c!=null&&c==true){return a}},
addChildNested:function(){var a=arguments;var m=0,l=1;var b=false;var L = a.length;if(typeof a[a.length-1]=="boolean"){b=a[a.length-1];L=a.length-1}while(l!=L){a[m].appendChild(a[l]);l++;m++}if(b){return a[0]}},
addChildListed:function(){var a=arguments;var m=0,l=1;var b=false;var L = a.length;if(typeof a[a.length-1]=="boolean"){b=a[a.length-1];L=a.length-1}while(l!=L){a[m].appendChild(a[l]);l++}if(b){return a[0]}},
replace:function(a,b,c){a.replaceChild(b,c)},
swap:function(X,Y){X.parentNode.replaceChild(Y,X)},
getObject:function(a){return isString(a)?dh.b(a):a;},
stripChildren:function(x){while(x.childNodes.length>0){var x1=x.childNodes[0];x.removeChild(x1);x1 = null}}
}
dh=DOMHelper;dh.a=dh.create;dh.b=dh.get;dh.c=dh.getByName;dh.d=dh.appendChild;dh.f=dh.addChildListed;dh.e=dh.addChildNested;dh.g=dh.replace;dh.h=dh.swap;dh.i=dh.GOBS=dh.getObject;dh.sc=dh.stripChildren;

SmartLogger={i:"SmartLoggerSpan",a:false,b:NA(),init:function(){this.a=true;},stop:function(){this.a=false},
log:function(m){var X=SmartLogger;var x=m;if(m==null||!isType(m,X.L))x=new X.L(m);if(X.a&&(X.s||X.c())){if(X.b.length>0&&!X.g)X.f();X.d(x)}else{X.e(x)}},s:false,c:function(){var n=null;var X=this;if(document==n||document.body==n){return false}if(dh.b(X.i)==n){dh.d(document.body,dc.gn("SPAN",X.i,"SmartLogger",n));dh.d(dh.b(X.i),dc.g("OL"))}if(dh.b(X.i).childNodes.length==0){dh.d(dh.b(X.i),dc.gn("OL",null,"SmartLoggerList",n))}this.s=true;return true},d:function(x){dh.d(dh.b(this.i).childNodes[0],this.h(x))},e:function(x){x.a="SAFELOG: "+x.a;this.b.push(x)},f:function(){var X=this;X.g=true;for(var i=0;i<X.b.length;i++){X.log(this.b[i])}X.b=NA();X.g=false},h:function(e){var s=dc.gn("SPAN",null,"SmartLoggerItemLabel","&nbsp;-- "+e.a);var s1=dc.gn("SPAN",null,"SmartLoggerItem",e.b.getTimeStamp());return dh.f(dc.g("LI"),s1,s,true)},L:function(m){this.a=""+m;this.b=ND()}}
sl = SmartLogger;
sl.log("SmartLogger loaded");

FormHelper={
isRadioSelected:function(n){var r = dh.c(n);for(var i=0;i<r.length;i++){if(r[i].checked)return true;}return false},
getRadioValue:function(n){var r=dh.c(n);for(var i=0;i<r.length;i++){if(r[i].checked){return r[i].value}}return null},
isChecked:function(id){return dh.b(id).checked},
getValue:function(id){var e=dh.b(id);if(e==null)return fh.b(id);if(e!=null){var t=e.type=="radio"?"radio":e.tagName;switch(t){case "radio":return fh.getRadioValue(id);break;case "SELECT":return sh.a(dh.b(id));break;case "INPUT":return e.value;break;case "TEXTAREA":return e.innerHTML;break}}}
}
fh=FormHelper;fh.a=fh.getValue;fh.b=fh.getRadioValue;fh.c=fh.isChecked;fh.d=fh.isRadioSelected;

function NameValuePair(a,b){this.name=a;this.value=b;this.toString=function(){return this.name+" = "+this.value}}
function ParameterCollection(V,p){
var a=this;var E=/^[a-z_]+[\s]*$/i;var v=NA();var n=NA();var N=NA();var c=0;var r=NA();var p=getBool(p)
function C(v){if(!exists(v)||(isArray(v)&&v.length==0))return;else if(IB(v)){p=v}else{a.addValues(v)}}
a.addValues=function(v,D){if(exists(D)){var sp=v.split(D);for(var i=0;i<sp.length;i++){F2(NVP(sp[i],sp[i]))}}else if(isString(v)){var sp=v.split("&");for(var i=0;i<sp.length;i++){var p=sp[i].split("=");F2(NVP(p[0],p[1]))}}else if(isArray(v)){for(each in v){var tnvp;if(isType(v[each],NameValuePair)){tnvp=v[each]}else if(isString(v[each])){tnvp=NVP(v[each],v[each])}F2(tnvp)}}else if(isType(v,ParameterCollection)){a.addValues(v.getNameValuePairs())}}
a.set=function(v1,v2){if(isType(v1,NameValuePair)){F3(v1)}else if(isString(v1)){F3(NVP(v1,exists(v2)?v2:v1))}}
a.add=function(v1,v2){if(isType(v1,NameValuePair)){F2(v1)}else if(isString(v1)){F2(NVP(v1,exists(v2)?v2:v1))}}
function F1(n){if(E.test(n)) {eval("a."+n+"=v[n]")}}
function F2(x){if(exists(v[x.name])){if(isArray(v[x.name])){v[x.name].push(x.value)}else{v[x.name]=[v[x.name],x.value];if(p)F1(x.name)}}else{v[x.name]=x.value;if(p)F1(x.name)}F4(x);r[x.value]=x.name}
function F3(x){v[x.name]=x.value;if(p)F1(x.name);F4(x);r[x.value]=x.name}
function F4(x){if(!exists(n[x.name])){N.push(x.name);n[x.name] = x.name}}
a.clear=function(){v=NA();n=NA();N=NA()}
a.remove=function(x){var y=NA();var z=NA();var Z=NA();var X=NA();for(e in n){if(e!=x){y[e]=v[e];Z[e]=e;X.push(e);z[v[e]]=e}}v=y;n=Z;r=z;N=X}
a.get=function(x){return v[x]}
a.getValues=function(){var t=NA();for(e in n){if(isArray(v[e])){for(var i=0;i<v[e].length;i++){t.push(v[e][i])}}else{t.push(v[e])}}return t}
a.size=function(){return a.getValues().length}
a.getNames=function(){return N}
a.beforeFirst = function(){c=0}
a.hasNext=function(){return c<N.length}
a.hasPrevious=function(){return c>-1}
a.next=function(){if(c<0)c=0;return v[N[c++]]}
a.previous=function(){if(c>=N.length)c=N.length-1;return v[N[c--]]}
a.nextIndex=function(){return c+1}
a.previousIndex=function(){return c-1}
a.hasValue=function(x){return exists(v[x])}
a.getNameValuePairs=function(){var p=[];for(var i=0;i<N.length;i++){var n=N[i];if(isArray(v[n])){for(var x=0;x<v[n].length;x++){p.push(NVP(n,v[n][x]))}}else{p.push(NVP(n,v[n]))}}return p}
a.name=function(x){return r[x]}
a.toString=function(){var s="ParameterCollection:<BR>";var x=this.getNameValuePairs();for(var i=0;i<x.length;i++){s+="<BR>"+x[i]}return s}
a.F=a.getNameValuePairs;
C(V)}
function PC(x,y){return new ParameterCollection(x,y)}
function NVP(a,b){return new NameValuePair(a,b)}
window.PARAMS = PC(unescape(document.location.href.split("?")[1]),true);

SelectMenuHelper = {
getSelectedValue:function(x){var o=x.options;return o.selectedIndex==-1?null:o[o.selectedIndex].value},
getSelectedValues:function(x){var v=NA();var o=x.options;for(var i=0;i<o.length;i++){if(o[i].selected)v.push(o[i].value)}return v},
getSelectedIndex:function(a){return a.options.selectedIndex},
getSelectedIndexes:function(x){var v=NA();var o=x.options;for(var i=0;i<o.length;i++){if(o[i].selected)v.push(i)}return v},
getSelectedText:function(V){return V.options[V.selectedIndex].text},
getSelectedTexts:function(x){var v=NA();var o=x.options;for(var i=0;i<o.length;i++){if(o[i].selected)v.push(o[i].text)}return v},
move:function(s1,s2,c){var o=s1.options;for(var i=0;i<s1.options.length;i++){if(s1.options[i].selected){var o=s1.options[i];sh.k(s2,o.text,o.value);if(c==null||!c){sh.l(s1,sh.c(s1));i--}}}},
copy:function(a,b){sh.move(a,b,true)},
size:function(x){return x.options.length},
add:function(a,b,c,d){a.options[a.options.length]=sh.m(b,c,d)},
addOptionObject:function(a,b){a.options[a.options.length]=b},
remove:function(a,b){a.options[b]=null},
make:function(a,b,c){return new Option(a,b,c)},
getSelectedDOMObject:function(a){return a.options[sh.c(a)]},
set:function(a,b){if(IS(b)||IA(b)){b=PC(b)}sh.s(a);if(isType(b,ParameterCollection)){var p=b.getNameValuePairs();for(var i=0;i<p.length;i++){sh.k(a,p[i].name,p[i].value)}}},
moveUp:function(a){var i=sh.c(a);if(i>-1&&i>0){var o=sh.g(a);var AO=a.options;var o2=AO[i-1];var t=sh.m(o.text,o.value);var t2=sh.m(o2.text,o2.value);AO[i-1]=t;AO[i-1].selected=true;AO[i]=t2}},
moveDown:function(a){var i=sh.c(a);var AO=a.options;if(i>-1&&i<AO.length-1){var o=sh.g(a);var o2=AO[i+1];var t=sh.m(o.text,o.value);var t2=sh.m(o2.text,o2.value);AO[i+1]=t;AO[i+1].selected=true;AO[i] = t2}},
selectByIndex:function(a,b){a.options[b].selected=true},
selectByValue:function(a,b){var AO=a.options;for(var i=0;i<AO.length;i++){if(AO[i].value== b)AO[i].selected=true}},
removeAll:function(a){while(a.options.length>0){sh.l(a,0)}},
sort:function(a){var o=a.options;var t=NA();for(var i=0;i<o.length;i++){t.push(sh.m(o[i].text,o[i].value))}var AS=new ArraySorter();AS.setValueRef(".text");var R=AS.sort(t);for(var i=0;i<o.length;i++){o[i]=R[i]}},
sortByValue:function(a){var o=a.options;var t=NA();for(var i=0;i<o.length;i++){t.push(sh.m(o[i].text,o[i].value))}var AS=new ArraySorter();AS.setValueRef(".value");var R=AS.sort(t);for(var i=0;i<o.length;i++){o[i]=R[i]}}
}
sh=SelectMenuHelper;
sh.a=sh.getSelectedValue;
sh.b=sh.getSelectedValues;
sh.c=sh.getSelectedIndex;
sh.d=sh.getSelectedIndexes;
sh.e=sh.getSelectedText;
sh.f=sh.getSelectedTexts;
sh.g=sh.getSelectedDOMObject;
sh.h=sh.move; 
sh.i=sh.copy;
sh.j=sh.size
sh.k=sh.add;
sh.l=sh.remove;
sh.m=sh.make;
sh.n=sh.set;
sh.o=sh.moveUp;
sh.p=sh.moveDown;
sh.q=sh.selectByIndex;
sh.r=sh.selectByValue;
sh.s=sh.removeAll;
sh.t=sh.sort;
sh.u=sh.sortByValue;
sh.v=sh.addOptionObject;

XMLHelper ={
xmlObject:function(s){return this.w3c?this.b(s):this.a(s)},
a:function(s){var x=new ActiveXObject("Msxml.DOMDocument");x.async=false;xh.f(x,s);if(s.indexOf("<")==0){x.loadXML(s)}else{x.load(s)}return x},
b:function(s){var x=document.implementation.createDocument("","doc",null);x.onload=function(){xh.c(this);this.L=true};xh.f(x,s);x.load(s);return x},
c:function(x){var n=/\S/;var C=x.childNodes;if(C&&C.length>0){for(var i=0;i<C.length;i++){if(C[i].nodeType==3&&!n.test(xh.v(C[i]))){x.removeChild(C[i]);i--}else{this.c(C[i])}}}},
getSingleNode:function(a,b){return xh.gtn(a,b)[0]},
getSingleValue:function(a,b){
    return xh.v(xh.e(a,b))
},
gtn:function(x,y){return x.getElementsByTagName(y)},
d:NA(),
f:function(x,y){xh.d[y]=new this.g(x,y);ST("xh.d['"+y+"'].f()",200)},
isLoaded:function(x){if(IS(x))return this.d[x].L},
g:function(D,S){this.L=false;this.o=function(){if(xh.w3c)xh.c(D);this.L=true}
this.f=function(){this.L=xh.w3c?D.L:D.readyState==4;if(this.L){this.o()}else{ST("xh.d['"+S+"'].f()",500)}}},
getValue:function(x){if(this.w3c){if(x.hasChildNodes())return x.firstChild.nodeValue;return x.nodeValue}else{return x.text}},
getHTML:function(x){return xh.j(x,"","<BR>","&nbsp;&nbsp;&nbsp;&nbsp;","&lt;","&gt;")},
getText:function(x){return xh.j(x,"","\n","    ","<",">")},
j:function(x,y,z,s,l,r){var o=l+x.nodeName+r;var c=l+"/"+x.nodeName+r;var t="";if(x.hasChildNodes()&&x.childNodes.length==1&&x.childNodes[0].nodeType==3){t+=y+o+xh.v(x.firstChild)+c+z}if(x.hasChildNodes()&&x.childNodes.length>1){t+=y+o+z;for(var i=0;i<x.childNodes.length;i++){t+=xh.j(x.childNodes[i],y+s,z,s,l,r)}t+=y+c+z}else if(!x.hasChildNodes()){t+=y+o+c+z}return t}         
}
xh = XMLHelper;
xh.xo=xh.xmlObject;
xh.s = xh.getSingleValue;
xh.e = xh.getSingleNode;
xh.v = xh.getValue;
xh.G=xh.gtn;
xh.w3c = document.implementation != null && document.implementation.createDocument != null;
sl.log("XMLHelper.js:   LOADED");


function ArraySorter(){
var a=this;var I=null;var V="";
a.sort=function(r){if(r==null||r.length<2)return r;
var s={};s.I=I;var x=m(V,I);s.s=x;s.s(r,0,r.length-1);return r}
a.setIndexedArray=function(r){I=r} 
a.setValueRef=function(v){V=v}
function m(V,I){var l="x[l]";var h="x[h]";var p="x[m]";if(I){l="this.I["+l+"]";h="this.I["+h+"]";p="this.I["+p+"]"}if(exists(V)){l+=V;h+=V;p+=V} var c = "var p,l,h,t;var P;var m=parseInt((L+H)/2);p=x[m];P="+p+";x[m]=x[L];x[L]=p;l=L+1;h=H;do{while(l<=h&&"+l+"<=P){l++}while("+h+">P){h--}if(l<h){t=x[l];x[l]=x[h];x[h]=t}}while(l<h);x[L]=x[h];x[h]=p;if(L<h-1){this.s(x,L,h- 1)}if(h+1<H){this.s(x,h+1, H)}"; var x=Function("x","L","H",c);if(I)x.I=I;return x}
}   


function ArraySerializer(l,s,d){
var a=this;var l=l;var S=exists(s)?s:NA();var d=exists(d)?d:","; 
a.setDelimiter=function(x){d=x}
a.setStringIndexes=function(v,e){if(IA(v)){S=v}else{S=exists(e)?v.split(e):v.split(",")}}
a.setLength=function(x){l=x}
a.deserialize=function(v){var g=v.split(d);if(g.length%(l+S.length)!=0){return []}var t=g.length/(l+S.length);var e=t%8;var I=(t-e)/8;var y=0;var w=l+S.length;var R=NA();if(I>0){do{R.push(r(g,y));y+=w;R.push(r(g,y));y+=w;R.push(r(g,y));y+=w;R.push(r(g,y));y+=w;R.push(r(g,y));y+=w;R.push(r(g,y));y+=w;R.push(r(g,y));y+=w;R.push(r(g,y));y+=w}while(--I)}if(e>0){do{R.push(r(g,y));y+=w}while(--e)}return R}   
function r(a,I){var r=NA();var c=0;var z=l;var i=0;var L=S.length;do{r[c++]=a[I++]}while(--z)if(S.length>0){do{r[S[i++]]=a[I++]}while(--L)}return r}
a.serialize=function(A,d){var t = A;var C = "";var B = "";for(e in t){if(IA(t[e])){t[e]=a.serialize(t[e],d)}else if(isNaN(e)){C+=d+t[e]}}return t.join(d)+C}}
ASR=function(l,s,d){return new ArraySerializer(l,s,d)}
function ArraySearcher(b,c){
var a=this;var S=new ArraySorter();var b=GDV(b,false);var c=GDV(c,true);var i=NA();var o=NA();
a.setIndexed=function(b){c=b};
a.isIndexed=function(){return c}
a.setMatchAll=function(b){b=b}
a.isMatchAll=function(){return b}
a.getMatchers=function(){return i.concat(o)}
a.getIndexMatchers=function(){return i}
a.getObjMatchers=function(){return o}
a.search=function(x){var s=new A(x,MIA(x.length),b);if(i.length>0)s.s=m(m1("[index]"));for(e in i){s.s(i[e],i[e].index)}if(o.length>0)s.s=m(m1(""));for(e in o){s.s(o[e])}var r=b?s.c:s.d;if(b&&r.length>0)r=S.sort(r);return c?r:CIA(x,r)}
function A(x,y,z){this.a=x;this.c=y;this.b=z;this.d=NA()}
function m1(x){return "matcher.match(a.a[a.c[c]]"+x+")"}
function m(m){var p="if("+m+"){a.d.push(a.c[c])}";if(!b)p+="else{T.push(a.c[c])}";p+="c++;";var c="var a=this;var I=PI(a.c.length/8);var R=a.c.length%8;var c=0;var T = NA();if(I>0){do{";for(var i=0;i<8;i++){c+=p}c+="}while(--I)}if(R> 0){do{"+p+"}while(--R)}if(a.b){a.c=a.d;a.d=NA()}else{a.c=T}";return new Function("matcher","index",c)}
a.setSearch=function(i,v,I,c,x){var m=MF.a(v,I,c,x);if(i!=null)m.index=i;f(m)}
a.setRangeSearch=function(i,a,b){var m=MF.b(a,b);m.index=i;f(m)}
a.setMatcher=function(m,i){if(exists(i))m.index=i;f(m)}
function f(m,x){if(g(m)){if(exists(x))m.index=x;if(!a.hasMatcher(m)){if(exists(m.index)){i.push(m)}else{o.push(m)}}}}
function g(e){try{return exists(e.match)&&(e.match!=String.prototype.match)}catch(x){return false}}
a.hasMatcher=function(m){var M=a.getMatchers();for(e in M){if(M[e].equals(m))return true}return false}
a.equals=function(C){if(b!=C.isMatchAll()||c!=C.isIndexed()||a.getMatcherCount()!=C.getMatcherCount())return false;var M=C.getMatchers();for(e in M){if(!a.hasMatcher(M[e]))return false}return true}
a.getMatcherCount=function(){return i.length+o.length}
a.toString=function(){return h("\n"," ")}
a.toHTML=function(){return h("<BR>","&nbsp;")}
function k(M,i,b){var s="";for(x in M){if(x!="toString"&&x!="equals"){var v=eval("M."+ x);if(!exists(v.toString)){v+=""}s+=i+i+x+" : "+v.toString()+b}}s+=b;return s}
function h(B,s){var i=s+s+s+s;var d=B+"-----------------------------"+B+"ArraySearcher:"+B+i+"match all : "+b+B+i+"return indexes : "+c+B+i+"Matchers: "+B;var m=a.getMatchers();for(e in m){d+=k(m[e],i,B)}d+=B+"-----------------------------";return d}
a.reset=function(){i=NA();o=NA();b=false;c=true}
j=function(m,M){for(var i=0;i<M.length;i++){if(M[i].equals(m)){M.splice(i,1)}}}
a.removeMatcher=function(m){j(m,exists(m.index)?i:o)}
a.removeSearch=function(i,v,I,c,x){var m=MF.a(v,I,c,x);m.index=i;a.removeMatcher(m)}
a.removeRangeSearch=function(x,b,c){var m=MF.b(b,c);m.index=c;a.removeMatcher(m)}
a.sm=a.setMatcher;
a.ss=a.setSearch;
a.sr=a.setRangeSearch;
}
AS=function(a,b){return new ArraySearcher(a,b)}
MatcherFactory={
t:this,x:[/^(has||contains||like||%)$/i,/^(equals||=||==||is||eq)$/i,/^(begins||begins_with||bw)$/i,/^(ends||ends_with||ew)$/i,/^(max||>=||gte||from)$/i,/^(min||<=||lte||to)$/i,/^(lt||<||less_than)$/i,/^(gt||>||greater_than)$/i],  
makeValueMatcher:function(v,i,I,e){var z=GDV(I,false)?".toUpperCase()":"";var t="this.val";var x=t+z;var y="v"+z;var n=".indexOf(";var io="IO("+y+","+x+")";var X=MF.x;var c="return "+(GDV(e,false)?"!(":"(");if(i==null||X[0].test(i)){c+=io+">-1"}else if(X[1].test(i)){c+=y+"=="+x}else if(X[2].test(i)){c+=io+"==0"}else if(X[3].test(i)){c+=io+">-1&&("+io+"==(v.length-"+t+".length))"}else if(X[6].test(i)){c+="v>="+t}else if(X[7].test(i)){c+="v<="+t}else if(X[4].test(i)){c+="v>"+t}else if(X[5].test(i)){c+="v>"+t}c+=")";var m=new VM(v);m.match=new Function("v",c);return m},
makeRangeMatcher:function(a,b){if(a>b){var c=a;a=b;b=c}return new VRM(a,b)}}
function ValueRangeMatcher(a,b){var x=this;x.a=a;x.b=b;x.match=function(v){return v>=x.a&&v<=x.b};x.equals=function(m){return x.a==m.a&&x.b==m.b&&x.match.toString()==m.match.toString()}}
function ValueMatcher(v){var x=this;x.val=v;x.equals=function(m){return x.val==m.val&&x.match.toString()==m.match.toString()}}
MF=MatcherFactory;    
MF.a=MF.makeValueMatcher;
MF.b=MF.makeRangeMatcher;
VM=ValueMatcher;
VRM=ValueRangeMatcher;
function repeater(v,w,z){var a=this;var x="var a=arguments;"+GDV(w,"");x+="var i=PI(a[0]/8);var r=a[0]%8;if(i>0){do{";for(var i=0;i<8;i++){x+=v}x+="}while(--i);}if(r>0){do{"+v+"}while(--r)}" + GDV(z,"");a.run = new Function(x)}
function RPR(a,b,c){return new repeater(a,b,c)}
function frepeater(c,d,e){var c=c;var d=d;var e=e;this.run=function(){var G=arguments;if(E(d))d();var i=PI(G[0]/8);var r=G[0]%8;if(i>0){do{c();c();c();c();c();c();c();c()}while(--i)}if(r>0){do{c()}while(--r)}if(E(e))e()}}
var MIAX = new repeater("v.push(w++);","var v=[];var w=a[1];","return v;");
function MIAX2(num,start){var m = MIAX.run(num,GDV(start,0));return m;}

