/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


(function(){
if(!this["console"]){
this.console={};
}
var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];
var i=0,tn;
while((tn=cn[i++])){
if(!console[tn]){
(function(){
var _4=tn+"";
console[_4]=("log" in console)?function(){
var a=Array.apply({},arguments);
a.unshift(_4+":");
console["log"](a.join(" "));
}:function(){
};
})();
}
}
if(typeof dojo=="undefined"){
this.dojo={_scopeName:"dojo",_scopePrefix:"",_scopePrefixArgs:"",_scopeSuffix:"",_scopeMap:{},_scopeMapRev:{}};
}
var d=dojo;
if(typeof dijit=="undefined"){
this.dijit={_scopeName:"dijit"};
}
if(typeof dojox=="undefined"){
this.dojox={_scopeName:"dojox"};
}
if(!d._scopeArgs){
d._scopeArgs=[dojo,dijit,dojox];
}
d.global=this;
d.config={isDebug:false,debugAtAllCosts:false};
if(typeof djConfig!="undefined"){
for(var _7 in djConfig){
d.config[_7]=djConfig[_7];
}
}
var _8=["Browser","Rhino","Spidermonkey","Mobile"];
var t;
while((t=_8.shift())){
d["is"+t]=false;
}
dojo.locale=d.config.locale;
var _a="$Rev: 15997 $".match(/\d+/);
dojo.version={major:1,minor:2,patch:3,flag:"",revision:_a?+_a[0]:999999,toString:function(){
with(d.version){
return major+"."+minor+"."+patch+flag+" ("+revision+")";
}
}};
if(typeof OpenAjax!="undefined"){
OpenAjax.hub.registerLibrary(dojo._scopeName,"http://dojotoolkit.org",d.version.toString());
}
dojo._mixin=function(_b,_c){
var _d={};
for(var x in _c){
if(_d[x]===undefined||_d[x]!=_c[x]){
_b[x]=_c[x];
}
}
if(d["isIE"]&&_c){
var p=_c.toString;
if(typeof p=="function"&&p!=_b.toString&&p!=_d.toString&&p!="\nfunction toString() {\n    [native code]\n}\n"){
_b.toString=_c.toString;
}
}
return _b;
};
dojo.mixin=function(obj,_11){
for(var i=1,l=arguments.length;i<l;i++){
d._mixin(obj,arguments[i]);
}
return obj;
};
dojo._getProp=function(_14,_15,_16){
var obj=_16||d.global;
for(var i=0,p;obj&&(p=_14[i]);i++){
if(i==0&&this._scopeMap[p]){
p=this._scopeMap[p];
}
obj=(p in obj?obj[p]:(_15?obj[p]={}:undefined));
}
return obj;
};
dojo.setObject=function(_1a,_1b,_1c){
var _1d=_1a.split("."),p=_1d.pop(),obj=d._getProp(_1d,true,_1c);
return obj&&p?(obj[p]=_1b):undefined;
};
dojo.getObject=function(_20,_21,_22){
return d._getProp(_20.split("."),_21,_22);
};
dojo.exists=function(_23,obj){
return !!d.getObject(_23,false,obj);
};
dojo["eval"]=function(_25){
return d.global.eval?d.global.eval(_25):eval(_25);
};
d.deprecated=d.experimental=function(){
};
})();
dojo._hasResource = {};
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.foo"]){
dojo._hasResource["dojo.foo"]=true;
(function(){
var d=dojo;
d.mixin(d,{_loadedModules:{},_inFlightCount:0,_hasResource:{},_modulePrefixes:{dojo:{name:"dojo",value:"."},doh:{name:"doh",value:"../util/doh"},tests:{name:"tests",value:"tests"}},_moduleHasPrefix:function(_2){
var mp=this._modulePrefixes;
return !!(mp[_2]&&mp[_2].value);
},_getModulePrefix:function(_4){
var mp=this._modulePrefixes;
if(this._moduleHasPrefix(_4)){
return mp[_4].value;
}
return _4;
},_loadedUrls:[],_postLoad:false,_loaders:[],_unloaders:[],_loadNotifying:false});
dojo._loadPath=function(_6,_7,cb){
var _9=((_6.charAt(0)=="/"||_6.match(/^\w+:/))?"":this.baseUrl)+_6;
try{
return !_7?this._loadUri(_9,cb):this._loadUriAndCheck(_9,_7,cb);
}
catch(e){
console.error(e);
return false;
}
};
dojo._loadUri=function(_a,cb){
if(this._loadedUrls[_a]){
return true;
}
var _c=this._getText(_a,true);
if(!_c){
return false;
}
this._loadedUrls[_a]=true;
this._loadedUrls.push(_a);
if(cb){
_c="("+_c+")";
}else{
_c=this._scopePrefix+_c+this._scopeSuffix;
}
if(d.isMoz){
_c+="\r\n//@ sourceURL="+_a;
}
var _d=d["eval"](_c);
if(cb){
cb(_d);
}
return true;
};
dojo._loadUriAndCheck=function(_e,_f,cb){
var ok=false;
try{
ok=this._loadUri(_e,cb);
}
catch(e){
console.error("failed loading "+_e+" with error: "+e);
}
return !!(ok&&this._loadedModules[_f]);
};
dojo.loaded=function(){
this._loadNotifying=true;
this._postLoad=true;
var mll=d._loaders;
this._loaders=[];
for(var x=0;x<mll.length;x++){
mll[x]();
}
this._loadNotifying=false;
if(d._postLoad&&d._inFlightCount==0&&mll.length){
d._callLoaded();
}
};
dojo.unloaded=function(){
var mll=this._unloaders;
while(mll.length){
(mll.pop())();
}
};
d._onto=function(arr,obj,fn){
if(!fn){
arr.push(obj);
}else{
if(fn){
var _18=(typeof fn=="string")?obj[fn]:fn;
arr.push(function(){
_18.call(obj);
});
}
}
};
dojo.addOnLoad=function(obj,_1a){
d._onto(d._loaders,obj,_1a);
if(d._postLoad&&d._inFlightCount==0&&!d._loadNotifying){
d._callLoaded();
}
};
var dca=d.config.addOnLoad;
if(dca){
d.addOnLoad[(dca instanceof Array?"apply":"call")](d,dca);
}
dojo.addOnUnload=function(obj,_1d){
d._onto(d._unloaders,obj,_1d);
};
dojo._modulesLoaded=function(){
if(d._postLoad){
return;
}
if(d._inFlightCount>0){
console.warn("files still in flight!");
return;
}
d._callLoaded();
};
dojo._callLoaded=function(){
if(typeof setTimeout=="object"||(dojo.config.useXDomain&&d.isOpera)){
if(dojo.isAIR){
setTimeout(function(){
dojo.loaded();
},0);
}else{
setTimeout(dojo._scopeName+".loaded();",0);
}
}else{
d.loaded();
}
};
dojo._getModuleSymbols=function(_1e){
var _1f=_1e.split(".");
for(var i=_1f.length;i>0;i--){
var _21=_1f.slice(0,i).join(".");
if((i==1)&&!this._moduleHasPrefix(_21)){
_1f[0]="../"+_1f[0];
}else{
var _22=this._getModulePrefix(_21);
if(_22!=_21){
_1f.splice(0,i,_22);
break;
}
}
}
return _1f;
};
dojo._global_omit_module_check=false;
dojo.loadInit=function(_23){
_23();
};
dojo._loadModule=dojo.require=function(_24,_25){
_25=this._global_omit_module_check||_25;
var _26=this._loadedModules[_24];
if(_26){
return _26;
}
var _27=this._getModuleSymbols(_24).join("/")+".js";
var _28=(!_25)?_24:null;
var ok=this._loadPath(_27,_28);
if(!ok&&!_25){
throw new Error("Could not load '"+_24+"'; last tried '"+_27+"'");
}
if(!_25&&!this._isXDomain){
_26=this._loadedModules[_24];
if(!_26){
throw new Error("symbol '"+_24+"' is not defined after loading '"+_27+"'");
}
}
return _26;
};
dojo.provide=function(_2a){
_2a=_2a+"";
return (d._loadedModules[_2a]=d.getObject(_2a,true));
};
dojo.platformRequire=function(_2b){
var _2c=_2b.common||[];
var _2d=_2c.concat(_2b[d._name]||_2b["default"]||[]);
for(var x=0;x<_2d.length;x++){
var _2f=_2d[x];
if(_2f.constructor==Array){
d._loadModule.apply(d,_2f);
}else{
d._loadModule(_2f);
}
}
};
dojo.requireIf=function(_30,_31){
if(_30===true){
var _32=[];
for(var i=1;i<arguments.length;i++){
_32.push(arguments[i]);
}
d.require.apply(d,_32);
}
};
dojo.requireAfterIf=d.requireIf;
dojo.registerModulePath=function(_34,_35){
d._modulePrefixes[_34]={name:_34,value:_35};
};
dojo.requireLocalization=function(_36,_37,_38,_39){
d.require("dojo.i18n");
d.i18n._requireLocalization.apply(d.hostenv,arguments);
};
var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$");
var ire=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
dojo._Url=function(){
var n=null;
var _a=arguments;
var uri=[_a[0]];
for(var i=1;i<_a.length;i++){
if(!_a[i]){
continue;
}
var _40=new d._Url(_a[i]+"");
var _41=new d._Url(uri[0]+"");
if(_40.path==""&&!_40.scheme&&!_40.authority&&!_40.query){
if(_40.fragment!=n){
_41.fragment=_40.fragment;
}
_40=_41;
}else{
if(!_40.scheme){
_40.scheme=_41.scheme;
if(!_40.authority){
_40.authority=_41.authority;
if(_40.path.charAt(0)!="/"){
var _42=_41.path.substring(0,_41.path.lastIndexOf("/")+1)+_40.path;
var _43=_42.split("/");
for(var j=0;j<_43.length;j++){
if(_43[j]=="."){
if(j==_43.length-1){
_43[j]="";
}else{
_43.splice(j,1);
j--;
}
}else{
if(j>0&&!(j==1&&_43[0]=="")&&_43[j]==".."&&_43[j-1]!=".."){
if(j==(_43.length-1)){
_43.splice(j,1);
_43[j-1]="";
}else{
_43.splice(j-1,2);
j-=2;
}
}
}
}
_40.path=_43.join("/");
}
}
}
}
uri=[];
if(_40.scheme){
uri.push(_40.scheme,":");
}
if(_40.authority){
uri.push("//",_40.authority);
}
uri.push(_40.path);
if(_40.query){
uri.push("?",_40.query);
}
if(_40.fragment){
uri.push("#",_40.fragment);
}
}
this.uri=uri.join("");
var r=this.uri.match(ore);
this.scheme=r[2]||(r[1]?"":n);
this.authority=r[4]||(r[3]?"":n);
this.path=r[5];
this.query=r[7]||(r[6]?"":n);
this.fragment=r[9]||(r[8]?"":n);
if(this.authority!=n){
r=this.authority.match(ire);
this.user=r[3]||n;
this.password=r[4]||n;
this.host=r[6]||r[7];
this.port=r[9]||n;
}
};
dojo._Url.prototype.toString=function(){
return this.uri;
};
dojo.moduleUrl=function(_46,url){
var loc=d._getModuleSymbols(_46).join("/");
if(!loc){
return null;
}
if(loc.lastIndexOf("/")!=loc.length-1){
loc+="/";
}
var _49=loc.indexOf(":");
if(loc.charAt(0)!="/"&&(_49==-1||_49>loc.indexOf("/"))){
loc=d.baseUrl+loc;
}
return new d._Url(loc,url);
};
})();
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(typeof window!="undefined"){
dojo.isBrowser=true;
dojo._name="browser";
(function(){
var d=dojo;
if(document&&document.getElementsByTagName){
var _2=document.getElementsByTagName("script");
var _3=/dojo(\.xd)?\.js(\W|$)/i;
for(var i=0;i<_2.length;i++){
var _5=_2[i].getAttribute("src");
if(!_5){
continue;
}
var m=_5.match(_3);
if(m){
if(!d.config.baseUrl){
d.config.baseUrl=_5.substring(0,m.index);
}
var _7=_2[i].getAttribute("djConfig");
if(_7){
var _8=eval("({ "+_7+" })");
for(var x in _8){
dojo.config[x]=_8[x];
}
}
break;
}
}
}
d.baseUrl=d.config.baseUrl;
var n=navigator;
var _b=n.userAgent;
var _c=n.appVersion;
var tv=parseFloat(_c);
if(_b.indexOf("Opera")>=0){
d.isOpera=tv;
}
var _e=Math.max(_c.indexOf("WebKit"),_c.indexOf("Safari"),0);
if(_e){
d.isSafari=parseFloat(_c.split("Version/")[1])||(parseFloat(_c.substr(_e+7))>419.3)?3:2;
}
if(_b.indexOf("AdobeAIR")>=0){
d.isAIR=1;
}
if(_c.indexOf("Konqueror")>=0||d.isSafari){
d.isKhtml=tv;
}
if(_b.indexOf("Gecko")>=0&&!d.isKhtml){
d.isMozilla=d.isMoz=tv;
}
if(d.isMoz){
d.isFF=parseFloat(_b.split("Firefox/")[1])||undefined;
}
if(document.all&&!d.isOpera){
d.isIE=parseFloat(_c.split("MSIE ")[1])||undefined;
}
if(dojo.isIE&&window.location.protocol==="file:"){
dojo.config.ieForceActiveXXhr=true;
}
var cm=document.compatMode;
d.isQuirks=cm=="BackCompat"||cm=="QuirksMode"||d.isIE<6;
d.locale=dojo.config.locale||(d.isIE?n.userLanguage:n.language).toLowerCase();
d._XMLHTTP_PROGIDS=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];
d._xhrObj=function(){
var _10=null;
var _11=null;
if(!dojo.isIE||!dojo.config.ieForceActiveXXhr){
try{
_10=new XMLHttpRequest();
}
catch(e){
}
}
if(!_10){
for(var i=0;i<3;++i){
var _13=d._XMLHTTP_PROGIDS[i];
try{
_10=new ActiveXObject(_13);
}
catch(e){
_11=e;
}
if(_10){
d._XMLHTTP_PROGIDS=[_13];
break;
}
}
}
if(!_10){
throw new Error("XMLHTTP not available: "+_11);
}
return _10;
};
d._isDocumentOk=function(_14){
var _15=_14.status||0;
return (_15>=200&&_15<300)||_15==304||_15==1223||(!_15&&(location.protocol=="file:"||location.protocol=="chrome:"));
};
var _16=window.location+"";
var _17=document.getElementsByTagName("base");
var _18=(_17&&_17.length>0);
d._getText=function(uri,_1a){
var _1b=this._xhrObj();
if(!_18&&dojo._Url){
uri=(new dojo._Url(_16,uri)).toString();
}
if(d.config.cacheBust){
uri+="";
uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");
}
_1b.open("GET",uri,false);
try{
_1b.send(null);
if(!d._isDocumentOk(_1b)){
var err=Error("Unable to load "+uri+" status:"+_1b.status);
err.status=_1b.status;
err.responseText=_1b.responseText;
throw err;
}
}
catch(e){
if(_1a){
return null;
}
throw e;
}
return _1b.responseText;
};
d._windowUnloaders=[];
d.windowUnloaded=function(){
var mll=this._windowUnloaders;
while(mll.length){
(mll.pop())();
}
};
d.addOnWindowUnload=function(obj,_1f){
d._onto(d._windowUnloaders,obj,_1f);
};
})();
dojo._initFired=false;
dojo._loadInit=function(e){
dojo._initFired=true;
var _21=(e&&e.type)?e.type.toLowerCase():"load";
if(arguments.callee.initialized||(_21!="domcontentloaded"&&_21!="load")){
return;
}
arguments.callee.initialized=true;
if("_khtmlTimer" in dojo){
clearInterval(dojo._khtmlTimer);
delete dojo._khtmlTimer;
}
if(dojo._inFlightCount==0){
dojo._modulesLoaded();
}
};
dojo._fakeLoadInit=function(){
dojo._loadInit({type:"load"});
};
if(!dojo.config.afterOnLoad){
if(document.addEventListener){
if(dojo.isOpera||dojo.isFF>=3||(dojo.isMoz&&dojo.config.enableMozDomContentLoaded===true)){
document.addEventListener("DOMContentLoaded",dojo._loadInit,null);
}
window.addEventListener("load",dojo._loadInit,null);
}
if(dojo.isAIR){
window.addEventListener("load",dojo._loadInit,null);
}else{
if(/(WebKit|khtml)/i.test(navigator.userAgent)){
dojo._khtmlTimer=setInterval(function(){
if(/loaded|complete/.test(document.readyState)){
dojo._loadInit();
}
},10);
}
}
}
(function(){
var _w=window;
var _23=function(_24,fp){
var _26=_w[_24]||function(){
};
_w[_24]=function(){
fp.apply(_w,arguments);
_26.apply(_w,arguments);
};
};
if(dojo.isIE){
if(!dojo.config.afterOnLoad){
document.write("<scr"+"ipt defer src=\"//:\" "+"onreadystatechange=\"if(this.readyState=='complete'){"+dojo._scopeName+"._loadInit();}\">"+"</scr"+"ipt>");
}
try{
document.namespaces.add("v","urn:schemas-microsoft-com:vml");
document.createStyleSheet().addRule("v\\:*","behavior:url(#default#VML)");
}
catch(e){
}
}
_23("onbeforeunload",function(){
dojo.unloaded();
});
_23("onunload",function(){
dojo.windowUnloaded();
});
})();
}
(function(){
var mp=dojo.config["modulePaths"];
if(mp){
for(var _28 in mp){
dojo.registerModulePath(_28,mp[_28]);
}
}
})();
if(dojo.config.isDebug){
dojo.require("dojo._firebug.firebug");
}
if(dojo.config.debugAtAllCosts){
dojo.config.useXDomain=true;
dojo.require("dojo._base._loader.loader_xd");
dojo.require("dojo._base._loader.loader_debug");
dojo.require("dojo.i18n");
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo._base.lang"]){
dojo._hasResource["dojo._base.lang"]=true;
dojo.provide("dojo._base.lang");
dojo.isString=function(it){
return !!arguments.length&&it!=null&&(typeof it=="string"||it instanceof String);
};
dojo.isArray=function(it){
return it&&(it instanceof Array||typeof it=="array");
};
dojo.isFunction=(function(){
var _3=function(it){
return it&&(typeof it=="function"||it instanceof Function);
};
return dojo.isSafari?function(it){
if(typeof it=="function"&&it=="[object NodeList]"){
return false;
}
return _3(it);
}:_3;
})();
dojo.isObject=function(it){
return it!==undefined&&(it===null||typeof it=="object"||dojo.isArray(it)||dojo.isFunction(it));
};
dojo.isArrayLike=function(it){
var d=dojo;
return it&&it!==undefined&&!d.isString(it)&&!d.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(d.isArray(it)||isFinite(it.length));
};
dojo.isAlien=function(it){
return it&&!dojo.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));
};
dojo.extend=function(_a,_b){
for(var i=1,l=arguments.length;i<l;i++){
dojo._mixin(_a.prototype,arguments[i]);
}
return _a;
};
dojo._hitchArgs=function(_e,_f){
var pre=dojo._toArray(arguments,2);
var _11=dojo.isString(_f);
return function(){
var _12=dojo._toArray(arguments);
var f=_11?(_e||dojo.global)[_f]:_f;
return f&&f.apply(_e||this,pre.concat(_12));
};
};
dojo.hitch=function(_14,_15){
if(arguments.length>2){
return dojo._hitchArgs.apply(dojo,arguments);
}
if(!_15){
_15=_14;
_14=null;
}
if(dojo.isString(_15)){
_14=_14||dojo.global;
if(!_14[_15]){
throw (["dojo.hitch: scope[\"",_15,"\"] is null (scope=\"",_14,"\")"].join(""));
}
return function(){
return _14[_15].apply(_14,arguments||[]);
};
}
return !_14?_15:function(){
return _15.apply(_14,arguments||[]);
};
};
dojo.delegate=dojo._delegate=(function(){
function TMP(){
};
return function(obj,_17){
TMP.prototype=obj;
var tmp=new TMP();
if(_17){
dojo._mixin(tmp,_17);
}
return tmp;
};
})();
(function(){
var _19=function(obj,_1b,_1c){
return (_1c||[]).concat(Array.prototype.slice.call(obj,_1b||0));
};
var _1d=function(obj,_1f,_20){
var arr=_20||[];
for(var x=_1f||0;x<obj.length;x++){
arr.push(obj[x]);
}
return arr;
};
dojo._toArray=(!dojo.isIE)?_19:function(obj){
return ((obj.item)?_1d:_19).apply(this,arguments);
};
})();
dojo.partial=function(_24){
var arr=[null];
return dojo.hitch.apply(dojo,arr.concat(dojo._toArray(arguments)));
};
dojo.clone=function(o){
if(!o){
return o;
}
if(dojo.isArray(o)){
var r=[];
for(var i=0;i<o.length;++i){
r.push(dojo.clone(o[i]));
}
return r;
}
if(!dojo.isObject(o)){
return o;
}
if(o.nodeType&&o.cloneNode){
return o.cloneNode(true);
}
if(o instanceof Date){
return new Date(o.getTime());
}
var r=new o.constructor();
for(var i in o){
if(!(i in r)||r[i]!=o[i]){
r[i]=dojo.clone(o[i]);
}
}
return r;
};
dojo.trim=function(str){
return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo._base.array"]){
dojo._hasResource["dojo._base.array"]=true;
dojo.require("dojo._base.lang");
dojo.provide("dojo._base.array");
(function(){
var _1=function(_2,_3,cb){
return [dojo.isString(_2)?_2.split(""):_2,_3||dojo.global,dojo.isString(cb)?new Function("item","index","array",cb):cb];
};
dojo.mixin(dojo,{indexOf:function(_5,_6,_7,_8){
var _9=1,_a=_5.length||0,i=0;
if(_8){
i=_a-1;
_9=_a=-1;
}
if(_7!=undefined){
i=_7;
}
if((_8&&i>_a)||i<_a){
for(;i!=_a;i+=_9){
if(_5[i]==_6){
return i;
}
}
}
return -1;
},lastIndexOf:function(_c,_d,_e){
return dojo.indexOf(_c,_d,_e,true);
},forEach:function(_f,_10,_11){
if(!_f||!_f.length){
return;
}
var _p=_1(_f,_11,_10);
_f=_p[0];
for(var i=0,l=_f.length;i<l;++i){
_p[2].call(_p[1],_f[i],i,_f);
}
},_everyOrSome:function(_15,arr,_17,_18){
var _p=_1(arr,_18,_17);
arr=_p[0];
for(var i=0,l=arr.length;i<l;++i){
var _1c=!!_p[2].call(_p[1],arr[i],i,arr);
if(_15^_1c){
return _1c;
}
}
return _15;
},every:function(arr,_1e,_1f){
return this._everyOrSome(true,arr,_1e,_1f);
},some:function(arr,_21,_22){
return this._everyOrSome(false,arr,_21,_22);
},map:function(arr,_24,_25){
var _p=_1(arr,_25,_24);
arr=_p[0];
var _27=(arguments[3]?(new arguments[3]()):[]);
for(var i=0,l=arr.length;i<l;++i){
_27.push(_p[2].call(_p[1],arr[i],i,arr));
}
return _27;
},filter:function(arr,_2b,_2c){
var _p=_1(arr,_2c,_2b);
arr=_p[0];
var _2e=[];
for(var i=0,l=arr.length;i<l;++i){
if(_p[2].call(_p[1],arr[i],i,arr)){
_2e.push(arr[i]);
}
}
return _2e;
}});
})();
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.string"]){
dojo._hasResource["dojo.string"]=true;
dojo.provide("dojo.string");
dojo.string.rep=function(_1,_2){
if(_2<=0||!_1){
return "";
}
var _3=[];
for(;;){
if(_2&1){
_3.push(_1);
}
if(!(_2>>=1)){
break;
}
_1+=_1;
}
return _3.join("");
};
dojo.string.pad=function(_4,_5,ch,_7){
if(!ch){
ch="0";
}
var _8=String(_4),_9=dojo.string.rep(ch,Math.ceil((_5-_8.length)/ch.length));
return _7?_8+_9:_9+_8;
};
dojo.string.substitute=function(_a,_b,_c,_d){
_d=_d||dojo.global;
_c=(!_c)?function(v){
return v;
}:dojo.hitch(_d,_c);
return _a.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_f,key,_11){
var _12=dojo.getObject(key,false,_b);
if(_11){
_12=dojo.getObject(_11,false,_d).call(_d,_12,key);
}
return _c(_12,key).toString();
});
};
dojo.string.trim=function(str){
str=str.replace(/^\s+/,"");
for(var i=str.length-1;i>=0;i--){
if(/\S/.test(str.charAt(i))){
str=str.substring(0,i+1);
break;
}
}
return str;
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.regexp"]){
dojo._hasResource["dojo.regexp"]=true;
dojo.provide("dojo.regexp");
dojo.regexp.escapeString=function(_1,_2){
return _1.replace(/([\.$?*!=:|{}\(\)\[\]\\\/^])/g,function(ch){
if(_2&&_2.indexOf(ch)!=-1){
return ch;
}
return "\\"+ch;
});
};
dojo.regexp.buildGroupRE=function(_4,re,_6){
if(!(_4 instanceof Array)){
return re(_4);
}
var b=[];
for(var i=0;i<_4.length;i++){
b.push(re(_4[i]));
}
return dojo.regexp.group(b.join("|"),_6);
};
dojo.regexp.group=function(_9,_a){
return "("+(_a?"?:":"")+_9+")";
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.i18n"]){
dojo._hasResource["dojo.i18n"]=true;
dojo.provide("dojo.i18n");
dojo.i18n.getLocalization=function(_1,_2,_3){
_3=dojo.i18n.normalizeLocale(_3);
var _4=_3.split("-");
var _5=[_1,"nls",_2].join(".");
var _6=dojo._loadedModules[_5];
if(_6){
var _7;
for(var i=_4.length;i>0;i--){
var _9=_4.slice(0,i).join("_");
if(_6[_9]){
_7=_6[_9];
break;
}
}
if(!_7){
_7=_6.ROOT;
}
if(_7){
var _a=function(){
};
_a.prototype=_7;
return new _a();
}
}
throw new Error("Bundle not found: "+_2+" in "+_1+" , locale="+_3);
};
dojo.i18n.normalizeLocale=function(_b){
var _c=_b?_b.toLowerCase():dojo.locale;
if(_c=="root"){
_c="ROOT";
}
return _c;
};
dojo.i18n._requireLocalization=function(_d,_e,_f,_10){
var _11=dojo.i18n.normalizeLocale(_f);
var _12=[_d,"nls",_e].join(".");
var _13="";
if(_10){
var _14=_10.split(",");
for(var i=0;i<_14.length;i++){
if(_11["indexOf"](_14[i])==0){
if(_14[i].length>_13.length){
_13=_14[i];
}
}
}
if(!_13){
_13="ROOT";
}
}
var _16=_10?_13:_11;
var _17=dojo._loadedModules[_12];
var _18=null;
if(_17){
if(dojo.config.localizationComplete&&_17._built){
return;
}
var _19=_16.replace(/-/g,"_");
var _1a=_12+"."+_19;
_18=dojo._loadedModules[_1a];
}
if(!_18){
_17=dojo["provide"](_12);
var _1b=dojo._getModuleSymbols(_d);
var _1c=_1b.concat("nls").join("/");
var _1d;
dojo.i18n._searchLocalePath(_16,_10,function(loc){
var _1f=loc.replace(/-/g,"_");
var _20=_12+"."+_1f;
var _21=false;
if(!dojo._loadedModules[_20]){
dojo["provide"](_20);
var _22=[_1c];
if(loc!="ROOT"){
_22.push(loc);
}
_22.push(_e);
var _23=_22.join("/")+".js";
_21=dojo._loadPath(_23,null,function(_24){
var _25=function(){
};
_25.prototype=_1d;
_17[_1f]=new _25();
for(var j in _24){
_17[_1f][j]=_24[j];
}
});
}else{
_21=true;
}
if(_21&&_17[_1f]){
_1d=_17[_1f];
}else{
_17[_1f]=_1d;
}
if(_10){
return true;
}
});
}
if(_10&&_11!=_13){
_17[_11.replace(/-/g,"_")]=_17[_13.replace(/-/g,"_")];
}
};
(function(){
var _27=dojo.config.extraLocale;
if(_27){
if(!_27 instanceof Array){
_27=[_27];
}
var req=dojo.i18n._requireLocalization;
dojo.i18n._requireLocalization=function(m,b,_2b,_2c){
req(m,b,_2b,_2c);
if(_2b){
return;
}
for(var i=0;i<_27.length;i++){
req(m,b,_27[i],_2c);
}
};
}
})();
dojo.i18n._searchLocalePath=function(_2e,_2f,_30){
_2e=dojo.i18n.normalizeLocale(_2e);
var _31=_2e.split("-");
var _32=[];
for(var i=_31.length;i>0;i--){
_32.push(_31.slice(0,i).join("-"));
}
_32.push(false);
if(_2f){
_32.reverse();
}
for(var j=_32.length-1;j>=0;j--){
var loc=_32[j]||"ROOT";
var _36=_30(loc);
if(_36){
break;
}
}
};
dojo.i18n._preloadLocalizations=function(_37,_38){
function preload(_39){
_39=dojo.i18n.normalizeLocale(_39);
dojo.i18n._searchLocalePath(_39,true,function(loc){
for(var i=0;i<_38.length;i++){
if(_38[i]==loc){
dojo["require"](_37+"_"+loc);
return true;
}
}
return false;
});
};
preload();
var _3c=dojo.config.extraLocale||[];
for(var i=0;i<_3c.length;i++){
preload(_3c[i]);
}
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.cldr.supplemental"]){
dojo._hasResource["dojo.cldr.supplemental"]=true;
dojo.provide("dojo.cldr.supplemental");
dojo.require("dojo.i18n");
dojo.cldr.supplemental.getFirstDayOfWeek=function(_1){
var _2={mv:5,ae:6,af:6,bh:6,dj:6,dz:6,eg:6,er:6,et:6,iq:6,ir:6,jo:6,ke:6,kw:6,lb:6,ly:6,ma:6,om:6,qa:6,sa:6,sd:6,so:6,tn:6,ye:6,as:0,au:0,az:0,bw:0,ca:0,cn:0,fo:0,ge:0,gl:0,gu:0,hk:0,ie:0,il:0,is:0,jm:0,jp:0,kg:0,kr:0,la:0,mh:0,mo:0,mp:0,mt:0,nz:0,ph:0,pk:0,sg:0,th:0,tt:0,tw:0,um:0,us:0,uz:0,vi:0,za:0,zw:0,et:0,mw:0,ng:0,tj:0,sy:4};
var _3=dojo.cldr.supplemental._region(_1);
var _4=_2[_3];
return (_4===undefined)?1:_4;
};
dojo.cldr.supplemental._region=function(_5){
_5=dojo.i18n.normalizeLocale(_5);
var _6=_5.split("-");
var _7=_6[1];
if(!_7){
_7={de:"de",en:"us",es:"es",fi:"fi",fr:"fr",he:"il",hu:"hu",it:"it",ja:"jp",ko:"kr",nl:"nl",pt:"br",sv:"se",zh:"cn"}[_6[0]];
}else{
if(_7.length==4){
_7=_6[2];
}
}
return _7;
};
dojo.cldr.supplemental.getWeekend=function(_8){
var _9={eg:5,il:5,sy:5,"in":0,ae:4,bh:4,dz:4,iq:4,jo:4,kw:4,lb:4,ly:4,ma:4,om:4,qa:4,sa:4,sd:4,tn:4,ye:4};
var _a={ae:5,bh:5,dz:5,iq:5,jo:5,kw:5,lb:5,ly:5,ma:5,om:5,qa:5,sa:5,sd:5,tn:5,ye:5,af:5,ir:5,eg:6,il:6,sy:6};
var _b=dojo.cldr.supplemental._region(_8);
var _c=_9[_b];
var _d=_a[_b];
if(_c===undefined){
_c=6;
}
if(_d===undefined){
_d=0;
}
return {start:_c,end:_d};
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.date"]){
dojo._hasResource["dojo.date"]=true;
dojo.provide("dojo.date");
dojo.date.getDaysInMonth=function(_1){
var _2=_1.getMonth();
var _3=[31,28,31,30,31,30,31,31,30,31,30,31];
if(_2==1&&dojo.date.isLeapYear(_1)){
return 29;
}
return _3[_2];
};
dojo.date.isLeapYear=function(_4){
var _5=_4.getFullYear();
return !(_5%400)||(!(_5%4)&&!!(_5%100));
};
dojo.date.getTimezoneName=function(_6){
var _7=_6.toString();
var tz="";
var _9;
var _a=_7.indexOf("(");
if(_a>-1){
tz=_7.substring(++_a,_7.indexOf(")"));
}else{
var _b=/([A-Z\/]+) \d{4}$/;
if((_9=_7.match(_b))){
tz=_9[1];
}else{
_7=_6.toLocaleString();
_b=/ ([A-Z\/]+)$/;
if((_9=_7.match(_b))){
tz=_9[1];
}
}
}
return (tz=="AM"||tz=="PM")?"":tz;
};
dojo.date.compare=function(_c,_d,_e){
_c=new Date(Number(_c));
_d=new Date(Number(_d||new Date()));
if(_e!=="undefined"){
if(_e=="date"){
_c.setHours(0,0,0,0);
_d.setHours(0,0,0,0);
}else{
if(_e=="time"){
_c.setFullYear(0,0,0);
_d.setFullYear(0,0,0);
}
}
}
if(_c>_d){
return 1;
}
if(_c<_d){
return -1;
}
return 0;
};
dojo.date.add=function(_f,_10,_11){
var sum=new Date(Number(_f));
var _13=false;
var _14="Date";
switch(_10){
case "day":
break;
case "weekday":
var _15,_16;
var mod=_11%5;
if(!mod){
_15=(_11>0)?5:-5;
_16=(_11>0)?((_11-5)/5):((_11+5)/5);
}else{
_15=mod;
_16=parseInt(_11/5);
}
var _18=_f.getDay();
var adj=0;
if(_18==6&&_11>0){
adj=1;
}else{
if(_18==0&&_11<0){
adj=-1;
}
}
var _1a=_18+_15;
if(_1a==0||_1a==6){
adj=(_11>0)?2:-2;
}
_11=(7*_16)+_15+adj;
break;
case "year":
_14="FullYear";
_13=true;
break;
case "week":
_11*=7;
break;
case "quarter":
_11*=3;
case "month":
_13=true;
_14="Month";
break;
case "hour":
case "minute":
case "second":
case "millisecond":
_14="UTC"+_10.charAt(0).toUpperCase()+_10.substring(1)+"s";
}
if(_14){
sum["set"+_14](sum["get"+_14]()+_11);
}
if(_13&&(sum.getDate()<_f.getDate())){
sum.setDate(0);
}
return sum;
};
dojo.date.difference=function(_1b,_1c,_1d){
_1c=_1c||new Date();
_1d=_1d||"day";
var _1e=_1c.getFullYear()-_1b.getFullYear();
var _1f=1;
switch(_1d){
case "quarter":
var m1=_1b.getMonth();
var m2=_1c.getMonth();
var q1=Math.floor(m1/3)+1;
var q2=Math.floor(m2/3)+1;
q2+=(_1e*4);
_1f=q2-q1;
break;
case "weekday":
var _24=Math.round(dojo.date.difference(_1b,_1c,"day"));
var _25=parseInt(dojo.date.difference(_1b,_1c,"week"));
var mod=_24%7;
if(mod==0){
_24=_25*5;
}else{
var adj=0;
var _28=_1b.getDay();
var _29=_1c.getDay();
_25=parseInt(_24/7);
mod=_24%7;
var _2a=new Date(_1b);
_2a.setDate(_2a.getDate()+(_25*7));
var _2b=_2a.getDay();
if(_24>0){
switch(true){
case _28==6:
adj=-1;
break;
case _28==0:
adj=0;
break;
case _29==6:
adj=-1;
break;
case _29==0:
adj=-2;
break;
case (_2b+mod)>5:
adj=-2;
}
}else{
if(_24<0){
switch(true){
case _28==6:
adj=0;
break;
case _28==0:
adj=1;
break;
case _29==6:
adj=2;
break;
case _29==0:
adj=1;
break;
case (_2b+mod)<0:
adj=2;
}
}
}
_24+=adj;
_24-=(_25*2);
}
_1f=_24;
break;
case "year":
_1f=_1e;
break;
case "month":
_1f=(_1c.getMonth()-_1b.getMonth())+(_1e*12);
break;
case "week":
_1f=parseInt(dojo.date.difference(_1b,_1c,"day")/7);
break;
case "day":
_1f/=24;
case "hour":
_1f/=60;
case "minute":
_1f/=60;
case "second":
_1f/=1000;
case "millisecond":
_1f*=_1c.getTime()-_1b.getTime();
}
return Math.round(_1f);
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.date.locale"]){
dojo._hasResource["dojo.date.locale"]=true;
dojo.provide("dojo.date.locale");
dojo.require("dojo.date");
dojo.require("dojo.cldr.supplemental");
dojo.require("dojo.regexp");
dojo.require("dojo.string");
dojo.require("dojo.i18n");
dojo.requireLocalization("dojo.cldr","gregorian",null,"zh-cn,zh,en-ca,ko-kr,pt,pt-br,it-it,ROOT,en-gb,de,ja,en,en-au,fr,es,ko,zh-tw,it,es-es");
(function(){
function formatPattern(_1,_2,_3,_4){
return _4.replace(/([a-z])\1*/ig,function(_5){
var s,_7;
var c=_5.charAt(0);
var l=_5.length;
var _a=["abbr","wide","narrow"];
switch(c){
case "G":
s=_2[(l<4)?"eraAbbr":"eraNames"][_1.getFullYear()<0?0:1];
break;
case "y":
s=_1.getFullYear();
switch(l){
case 1:
break;
case 2:
if(!_3){
s=String(s);
s=s.substr(s.length-2);
break;
}
default:
_7=true;
}
break;
case "Q":
case "q":
s=Math.ceil((_1.getMonth()+1)/3);
_7=true;
break;
case "M":
var m=_1.getMonth();
if(l<3){
s=m+1;
_7=true;
}else{
var _c=["months","format",_a[l-3]].join("-");
s=_2[_c][m];
}
break;
case "w":
var _d=0;
s=dojo.date.locale._getWeekOfYear(_1,_d);
_7=true;
break;
case "d":
s=_1.getDate();
_7=true;
break;
case "D":
s=dojo.date.locale._getDayOfYear(_1);
_7=true;
break;
case "E":
var d=_1.getDay();
if(l<3){
s=d+1;
_7=true;
}else{
var _f=["days","format",_a[l-3]].join("-");
s=_2[_f][d];
}
break;
case "a":
var _10=(_1.getHours()<12)?"am":"pm";
s=_2[_10];
break;
case "h":
case "H":
case "K":
case "k":
var h=_1.getHours();
switch(c){
case "h":
s=(h%12)||12;
break;
case "H":
s=h;
break;
case "K":
s=(h%12);
break;
case "k":
s=h||24;
break;
}
_7=true;
break;
case "m":
s=_1.getMinutes();
_7=true;
break;
case "s":
s=_1.getSeconds();
_7=true;
break;
case "S":
s=Math.round(_1.getMilliseconds()*Math.pow(10,l-3));
_7=true;
break;
case "v":
case "z":
s=dojo.date.getTimezoneName(_1);
if(s){
break;
}
l=4;
case "Z":
var _12=_1.getTimezoneOffset();
var tz=[(_12<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_12)/60),2),dojo.string.pad(Math.abs(_12)%60,2)];
if(l==4){
tz.splice(0,0,"GMT");
tz.splice(3,0,":");
}
s=tz.join("");
break;
default:
throw new Error("dojo.date.locale.format: invalid pattern char: "+_4);
}
if(_7){
s=dojo.string.pad(s,l);
}
return s;
});
};
dojo.date.locale.format=function(_14,_15){
_15=_15||{};
var _16=dojo.i18n.normalizeLocale(_15.locale);
var _17=_15.formatLength||"short";
var _18=dojo.date.locale._getGregorianBundle(_16);
var str=[];
var _1a=dojo.hitch(this,formatPattern,_14,_18,_15.fullYear);
if(_15.selector=="year"){
var _1b=_14.getFullYear();
if(_16.match(/^zh|^ja/)){
_1b+="年";
}
return _1b;
}
if(_15.selector!="time"){
var _1c=_15.datePattern||_18["dateFormat-"+_17];
if(_1c){
str.push(_processPattern(_1c,_1a));
}
}
if(_15.selector!="date"){
var _1d=_15.timePattern||_18["timeFormat-"+_17];
if(_1d){
str.push(_processPattern(_1d,_1a));
}
}
var _1e=str.join(" ");
return _1e;
};
dojo.date.locale.regexp=function(_1f){
return dojo.date.locale._parseInfo(_1f).regexp;
};
dojo.date.locale._parseInfo=function(_20){
_20=_20||{};
var _21=dojo.i18n.normalizeLocale(_20.locale);
var _22=dojo.date.locale._getGregorianBundle(_21);
var _23=_20.formatLength||"short";
var _24=_20.datePattern||_22["dateFormat-"+_23];
var _25=_20.timePattern||_22["timeFormat-"+_23];
var _26;
if(_20.selector=="date"){
_26=_24;
}else{
if(_20.selector=="time"){
_26=_25;
}else{
_26=_24+" "+_25;
}
}
var _27=[];
var re=_processPattern(_26,dojo.hitch(this,_buildDateTimeRE,_27,_22,_20));
return {regexp:re,tokens:_27,bundle:_22};
};
dojo.date.locale.parse=function(_29,_2a){
var _2b=dojo.date.locale._parseInfo(_2a);
var _2c=_2b.tokens,_2d=_2b.bundle;
var re=new RegExp("^"+_2b.regexp+"$",_2b.strict?"":"i");
var _2f=re.exec(_29);
if(!_2f){
return null;
}
var _30=["abbr","wide","narrow"];
var _31=[1970,0,1,0,0,0,0];
var _32="";
var _33=dojo.every(_2f,function(v,i){
if(!i){
return true;
}
var _36=_2c[i-1];
var l=_36.length;
switch(_36.charAt(0)){
case "y":
if(l!=2&&_2a.strict){
_31[0]=v;
}else{
if(v<100){
v=Number(v);
var _38=""+new Date().getFullYear();
var _39=_38.substring(0,2)*100;
var _3a=Math.min(Number(_38.substring(2,4))+20,99);
var num=(v<_3a)?_39+v:_39-100+v;
_31[0]=num;
}else{
if(_2a.strict){
return false;
}
_31[0]=v;
}
}
break;
case "M":
if(l>2){
var _3c=_2d["months-format-"+_30[l-3]].concat();
if(!_2a.strict){
v=v.replace(".","").toLowerCase();
_3c=dojo.map(_3c,function(s){
return s.replace(".","").toLowerCase();
});
}
v=dojo.indexOf(_3c,v);
if(v==-1){
return false;
}
}else{
v--;
}
_31[1]=v;
break;
case "E":
case "e":
var _3e=_2d["days-format-"+_30[l-3]].concat();
if(!_2a.strict){
v=v.toLowerCase();
_3e=dojo.map(_3e,function(d){
return d.toLowerCase();
});
}
v=dojo.indexOf(_3e,v);
if(v==-1){
return false;
}
break;
case "D":
_31[1]=0;
case "d":
_31[2]=v;
break;
case "a":
var am=_2a.am||_2d.am;
var pm=_2a.pm||_2d.pm;
if(!_2a.strict){
var _42=/\./g;
v=v.replace(_42,"").toLowerCase();
am=am.replace(_42,"").toLowerCase();
pm=pm.replace(_42,"").toLowerCase();
}
if(_2a.strict&&v!=am&&v!=pm){
return false;
}
_32=(v==pm)?"p":(v==am)?"a":"";
break;
case "K":
if(v==24){
v=0;
}
case "h":
case "H":
case "k":
if(v>23){
return false;
}
_31[3]=v;
break;
case "m":
_31[4]=v;
break;
case "s":
_31[5]=v;
break;
case "S":
_31[6]=v;
}
return true;
});
var _43=+_31[3];
if(_32==="p"&&_43<12){
_31[3]=_43+12;
}else{
if(_32==="a"&&_43==12){
_31[3]=0;
}
}
var _44=new Date(_31[0],_31[1],_31[2],_31[3],_31[4],_31[5],_31[6]);
if(_2a.strict){
_44.setFullYear(_31[0]);
}
var _45=_2c.join("");
if(!_33||(_45.indexOf("M")!=-1&&_44.getMonth()!=_31[1])||(_45.indexOf("d")!=-1&&_44.getDate()!=_31[2])){
return null;
}
return _44;
};
function _processPattern(_46,_47,_48,_49){
var _4a=function(x){
return x;
};
_47=_47||_4a;
_48=_48||_4a;
_49=_49||_4a;
var _4c=_46.match(/(''|[^'])+/g);
var _4d=_46.charAt(0)=="'";
dojo.forEach(_4c,function(_4e,i){
if(!_4e){
_4c[i]="";
}else{
_4c[i]=(_4d?_48:_47)(_4e);
_4d=!_4d;
}
});
return _49(_4c.join(""));
};
function _buildDateTimeRE(_50,_51,_52,_53){
_53=dojo.regexp.escapeString(_53);
if(!_52.strict){
_53=_53.replace(" a"," ?a");
}
return _53.replace(/([a-z])\1*/ig,function(_54){
var s;
var c=_54.charAt(0);
var l=_54.length;
var p2="",p3="";
if(_52.strict){
if(l>1){
p2="0"+"{"+(l-1)+"}";
}
if(l>2){
p3="0"+"{"+(l-2)+"}";
}
}else{
p2="0?";
p3="0{0,2}";
}
switch(c){
case "y":
s="\\d{2,4}";
break;
case "M":
s=(l>2)?"\\S+?":p2+"[1-9]|1[0-2]";
break;
case "D":
s=p2+"[1-9]|"+p3+"[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]";
break;
case "d":
s="[12]\\d|"+p2+"[1-9]|3[01]";
break;
case "w":
s=p2+"[1-9]|[1-4][0-9]|5[0-3]";
break;
case "E":
s="\\S+";
break;
case "h":
s=p2+"[1-9]|1[0-2]";
break;
case "k":
s=p2+"\\d|1[01]";
break;
case "H":
s=p2+"\\d|1\\d|2[0-3]";
break;
case "K":
s=p2+"[1-9]|1\\d|2[0-4]";
break;
case "m":
case "s":
s="[0-5]\\d";
break;
case "S":
s="\\d{"+l+"}";
break;
case "a":
var am=_52.am||_51.am||"AM";
var pm=_52.pm||_51.pm||"PM";
if(_52.strict){
s=am+"|"+pm;
}else{
s=am+"|"+pm;
if(am!=am.toLowerCase()){
s+="|"+am.toLowerCase();
}
if(pm!=pm.toLowerCase()){
s+="|"+pm.toLowerCase();
}
if(s.indexOf(".")!=-1){
s+="|"+s.replace(/\./g,"");
}
}
s=s.replace(/\./g,"\\.");
break;
default:
s=".*";
}
if(_50){
_50.push(_54);
}
return "("+s+")";
}).replace(/[\xa0 ]/g,"[\\s\\xa0]");
};
})();
(function(){
var _5c=[];
dojo.date.locale.addCustomFormats=function(_5d,_5e){
_5c.push({pkg:_5d,name:_5e});
};
dojo.date.locale._getGregorianBundle=function(_5f){
var _60={};
dojo.forEach(_5c,function(_61){
var _62=dojo.i18n.getLocalization(_61.pkg,_61.name,_5f);
_60=dojo.mixin(_60,_62);
},this);
return _60;
};
})();
dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
dojo.date.locale.getNames=function(_63,_64,use,_66){
var _67;
var _68=dojo.date.locale._getGregorianBundle(_66);
var _69=[_63,use,_64];
if(use=="standAlone"){
var key=_69.join("-");
_67=_68[key];
if(_67[0]==1){
_67=undefined;
}
}
_69[1]="format";
return (_67||_68[_69.join("-")]).concat();
};
dojo.date.locale.isWeekend=function(_6b,_6c){
var _6d=dojo.cldr.supplemental.getWeekend(_6c);
var day=(_6b||new Date()).getDay();
if(_6d.end<_6d.start){
_6d.end+=7;
if(day<_6d.start){
day+=7;
}
}
return day>=_6d.start&&day<=_6d.end;
};
dojo.date.locale._getDayOfYear=function(_6f){
return dojo.date.difference(new Date(_6f.getFullYear(),0,1,_6f.getHours()),_6f)+1;
};
dojo.date.locale._getWeekOfYear=function(_70,_71){
if(arguments.length==1){
_71=0;
}
var _72=new Date(_70.getFullYear(),0,1).getDay();
var adj=(_72-_71+7)%7;
var _74=Math.floor((dojo.date.locale._getDayOfYear(_70)+adj-1)/7);
if(_72==_71){
_74++;
}
return _74;
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojo.number"]){
dojo._hasResource["dojo.number"]=true;
dojo.provide("dojo.number");
dojo.require("dojo.i18n");
dojo.requireLocalization("dojo.cldr","number",null,"zh-cn,zh,ko-kr,pt,en-us,en-gb,de,ja,ja-jp,en,ROOT,en-au,fr,es,ko,zh-tw,it,es-es,de-de");
dojo.require("dojo.string");
dojo.require("dojo.regexp");
dojo.number.format=function(_1,_2){
_2=dojo.mixin({},_2||{});
var _3=dojo.i18n.normalizeLocale(_2.locale);
var _4=dojo.i18n.getLocalization("dojo.cldr","number",_3);
_2.customs=_4;
var _5=_2.pattern||_4[(_2.type||"decimal")+"Format"];
if(isNaN(_1)){
return null;
}
return dojo.number._applyPattern(_1,_5,_2);
};
dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;
dojo.number._applyPattern=function(_6,_7,_8){
_8=_8||{};
var _9=_8.customs.group;
var _a=_8.customs.decimal;
var _b=_7.split(";");
var _c=_b[0];
_7=_b[(_6<0)?1:0]||("-"+_c);
if(_7.indexOf("%")!=-1){
_6*=100;
}else{
if(_7.indexOf("‰")!=-1){
_6*=1000;
}else{
if(_7.indexOf("¤")!=-1){
_9=_8.customs.currencyGroup||_9;
_a=_8.customs.currencyDecimal||_a;
_7=_7.replace(/\u00a4{1,3}/,function(_d){
var _e=["symbol","currency","displayName"][_d.length-1];
return _8[_e]||_8.currency||"";
});
}else{
if(_7.indexOf("E")!=-1){
throw new Error("exponential notation not supported");
}
}
}
}
var _f=dojo.number._numberPatternRE;
var _10=_c.match(_f);
if(!_10){
throw new Error("unable to find a number expression in pattern: "+_7);
}
if(_8.fractional===false){
_8.places=0;
}
return _7.replace(_f,dojo.number._formatAbsolute(_6,_10[0],{decimal:_a,group:_9,places:_8.places,round:_8.round}));
};
dojo.number.round=function(_11,_12,_13){
var _14=String(_11).split(".");
var _15=(_14[1]&&_14[1].length)||0;
if(_15>_12){
var _16=Math.pow(10,_12);
if(_13>0){
_16*=10/_13;
_12++;
}
_11=Math.round(_11*_16)/_16;
_14=String(_11).split(".");
_15=(_14[1]&&_14[1].length)||0;
if(_15>_12){
_14[1]=_14[1].substr(0,_12);
_11=Number(_14.join("."));
}
}
return _11;
};
dojo.number._formatAbsolute=function(_17,_18,_19){
_19=_19||{};
if(_19.places===true){
_19.places=0;
}
if(_19.places===Infinity){
_19.places=6;
}
var _1a=_18.split(".");
var _1b=(_19.places>=0)?_19.places:(_1a[1]&&_1a[1].length)||0;
if(!(_19.round<0)){
_17=dojo.number.round(_17,_1b,_19.round);
}
var _1c=String(Math.abs(_17)).split(".");
var _1d=_1c[1]||"";
if(_19.places){
var _1e=dojo.isString(_19.places)&&_19.places.indexOf(",");
if(_1e){
_19.places=_19.places.substring(_1e+1);
}
_1c[1]=dojo.string.pad(_1d.substr(0,_19.places),_19.places,"0",true);
}else{
if(_1a[1]&&_19.places!==0){
var pad=_1a[1].lastIndexOf("0")+1;
if(pad>_1d.length){
_1c[1]=dojo.string.pad(_1d,pad,"0",true);
}
var _20=_1a[1].length;
if(_20<_1d.length){
_1c[1]=_1d.substr(0,_20);
}
}else{
if(_1c[1]){
_1c.pop();
}
}
}
var _21=_1a[0].replace(",","");
pad=_21.indexOf("0");
if(pad!=-1){
pad=_21.length-pad;
if(pad>_1c[0].length){
_1c[0]=dojo.string.pad(_1c[0],pad);
}
if(_21.indexOf("#")==-1){
_1c[0]=_1c[0].substr(_1c[0].length-pad);
}
}
var _22=_1a[0].lastIndexOf(",");
var _23,_24;
if(_22!=-1){
_23=_1a[0].length-_22-1;
var _25=_1a[0].substr(0,_22);
_22=_25.lastIndexOf(",");
if(_22!=-1){
_24=_25.length-_22-1;
}
}
var _26=[];
for(var _27=_1c[0];_27;){
var off=_27.length-_23;
_26.push((off>0)?_27.substr(off):_27);
_27=(off>0)?_27.slice(0,off):"";
if(_24){
_23=_24;
delete _24;
}
}
_1c[0]=_26.reverse().join(_19.group||",");
return _1c.join(_19.decimal||".");
};
dojo.number.regexp=function(_29){
return dojo.number._parseInfo(_29).regexp;
};
dojo.number._parseInfo=function(_2a){
_2a=_2a||{};
var _2b=dojo.i18n.normalizeLocale(_2a.locale);
var _2c=dojo.i18n.getLocalization("dojo.cldr","number",_2b);
var _2d=_2a.pattern||_2c[(_2a.type||"decimal")+"Format"];
var _2e=_2c.group;
var _2f=_2c.decimal;
var _30=1;
if(_2d.indexOf("%")!=-1){
_30/=100;
}else{
if(_2d.indexOf("‰")!=-1){
_30/=1000;
}else{
var _31=_2d.indexOf("¤")!=-1;
if(_31){
_2e=_2c.currencyGroup||_2e;
_2f=_2c.currencyDecimal||_2f;
}
}
}
var _32=_2d.split(";");
if(_32.length==1){
_32.push("-"+_32[0]);
}
var re=dojo.regexp.buildGroupRE(_32,function(_34){
_34="(?:"+dojo.regexp.escapeString(_34,".")+")";
return _34.replace(dojo.number._numberPatternRE,function(_35){
var _36={signed:false,separator:_2a.strict?_2e:[_2e,""],fractional:_2a.fractional,decimal:_2f,exponent:false};
var _37=_35.split(".");
var _38=_2a.places;
if(_37.length==1||_38===0){
_36.fractional=false;
}else{
if(_38===undefined){
_38=_2a.pattern?_37[1].lastIndexOf("0")+1:Infinity;
}
if(_38&&_2a.fractional==undefined){
_36.fractional=true;
}
if(!_2a.places&&(_38<_37[1].length)){
_38+=","+_37[1].length;
}
_36.places=_38;
}
var _39=_37[0].split(",");
if(_39.length>1){
_36.groupSize=_39.pop().length;
if(_39.length>1){
_36.groupSize2=_39.pop().length;
}
}
return "("+dojo.number._realNumberRegexp(_36)+")";
});
},true);
if(_31){
re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_3a,_3b,_3c,_3d){
var _3e=["symbol","currency","displayName"][_3c.length-1];
var _3f=dojo.regexp.escapeString(_2a[_3e]||_2a.currency||"");
_3b=_3b?"[\\s\\xa0]":"";
_3d=_3d?"[\\s\\xa0]":"";
if(!_2a.strict){
if(_3b){
_3b+="*";
}
if(_3d){
_3d+="*";
}
return "(?:"+_3b+_3f+_3d+")?";
}
return _3b+_3f+_3d;
});
}
return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_2e,decimal:_2f,factor:_30};
};
dojo.number.parse=function(_40,_41){
var _42=dojo.number._parseInfo(_41);
var _43=(new RegExp("^"+_42.regexp+"$")).exec(_40);
if(!_43){
return NaN;
}
var _44=_43[1];
if(!_43[1]){
if(!_43[2]){
return NaN;
}
_44=_43[2];
_42.factor*=-1;
}
_44=_44.replace(new RegExp("["+_42.group+"\\s\\xa0"+"]","g"),"").replace(_42.decimal,".");
return Number(_44)*_42.factor;
};
dojo.number._realNumberRegexp=function(_45){
_45=_45||{};
if(!("places" in _45)){
_45.places=Infinity;
}
if(typeof _45.decimal!="string"){
_45.decimal=".";
}
if(!("fractional" in _45)||/^0/.test(_45.places)){
_45.fractional=[true,false];
}
if(!("exponent" in _45)){
_45.exponent=[true,false];
}
if(!("eSigned" in _45)){
_45.eSigned=[true,false];
}
var _46=dojo.number._integerRegexp(_45);
var _47=dojo.regexp.buildGroupRE(_45.fractional,function(q){
var re="";
if(q&&(_45.places!==0)){
re="\\"+_45.decimal;
if(_45.places==Infinity){
re="(?:"+re+"\\d+)?";
}else{
re+="\\d{"+_45.places+"}";
}
}
return re;
},true);
var _4a=dojo.regexp.buildGroupRE(_45.exponent,function(q){
if(q){
return "([eE]"+dojo.number._integerRegexp({signed:_45.eSigned})+")";
}
return "";
});
var _4c=_46+_47;
if(_47){
_4c="(?:(?:"+_4c+")|(?:"+_47+"))";
}
return _4c+_4a;
};
dojo.number._integerRegexp=function(_4d){
_4d=_4d||{};
if(!("signed" in _4d)){
_4d.signed=[true,false];
}
if(!("separator" in _4d)){
_4d.separator="";
}else{
if(!("groupSize" in _4d)){
_4d.groupSize=3;
}
}
var _4e=dojo.regexp.buildGroupRE(_4d.signed,function(q){
return q?"[-+]":"";
},true);
var _50=dojo.regexp.buildGroupRE(_4d.separator,function(sep){
if(!sep){
return "(?:0|[1-9]\\d*)";
}
sep=dojo.regexp.escapeString(sep);
if(sep==" "){
sep="\\s";
}else{
if(sep==" "){
sep="\\s\\xa0";
}
}
var grp=_4d.groupSize,_53=_4d.groupSize2;
if(_53){
var _54="(?:0|[1-9]\\d{0,"+(_53-1)+"}(?:["+sep+"]\\d{"+_53+"})*["+sep+"]\\d{"+grp+"})";
return ((grp-_53)>0)?"(?:"+_54+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_54;
}
return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";
},true);
return _4e+_50;
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate.regexp"]){
dojo._hasResource["dojox.validate.regexp"]=true;
dojo.provide("dojox.validate.regexp");
dojo.require("dojo.regexp");
dojox.regexp={ca:{},us:{}};
dojox.regexp.tld=function(_1){
_1=(typeof _1=="object")?_1:{};
if(typeof _1.allowCC!="boolean"){
_1.allowCC=true;
}
if(typeof _1.allowInfra!="boolean"){
_1.allowInfra=true;
}
if(typeof _1.allowGeneric!="boolean"){
_1.allowGeneric=true;
}
var _2="arpa";
var _3="aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|xxx|jobs|mobi|post";
var _4="ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|"+"bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|"+"ec|ee|eg|er|eu|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|"+"gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|"+"la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|"+"my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|"+"re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|"+"tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw";
var a=[];
if(_1.allowInfra){
a.push(_2);
}
if(_1.allowGeneric){
a.push(_3);
}
if(_1.allowCC){
a.push(_4);
}
var _6="";
if(a.length>0){
_6="("+a.join("|")+")";
}
return _6;
};
dojox.regexp.ipAddress=function(_7){
_7=(typeof _7=="object")?_7:{};
if(typeof _7.allowDottedDecimal!="boolean"){
_7.allowDottedDecimal=true;
}
if(typeof _7.allowDottedHex!="boolean"){
_7.allowDottedHex=true;
}
if(typeof _7.allowDottedOctal!="boolean"){
_7.allowDottedOctal=true;
}
if(typeof _7.allowDecimal!="boolean"){
_7.allowDecimal=true;
}
if(typeof _7.allowHex!="boolean"){
_7.allowHex=true;
}
if(typeof _7.allowIPv6!="boolean"){
_7.allowIPv6=true;
}
if(typeof _7.allowHybrid!="boolean"){
_7.allowHybrid=true;
}
var _8="((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
var _9="(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]";
var _a="(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]";
var _b="(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|"+"4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])";
var _c="0[xX]0*[\\da-fA-F]{1,8}";
var _d="([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}";
var _e="([\\da-fA-F]{1,4}\\:){6}"+"((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
var a=[];
if(_7.allowDottedDecimal){
a.push(_8);
}
if(_7.allowDottedHex){
a.push(_9);
}
if(_7.allowDottedOctal){
a.push(_a);
}
if(_7.allowDecimal){
a.push(_b);
}
if(_7.allowHex){
a.push(_c);
}
if(_7.allowIPv6){
a.push(_d);
}
if(_7.allowHybrid){
a.push(_e);
}
var _10="";
if(a.length>0){
_10="("+a.join("|")+")";
}
return _10;
};
dojox.regexp.host=function(_11){
_11=(typeof _11=="object")?_11:{};
if(typeof _11.allowIP!="boolean"){
_11.allowIP=true;
}
if(typeof _11.allowLocal!="boolean"){
_11.allowLocal=false;
}
if(typeof _11.allowPort!="boolean"){
_11.allowPort=true;
}
if(typeof _11.allowNamed!="boolean"){
_11.allowNamed=false;
}
var _12="([0-9a-zA-Z]([-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?\\.)+"+dojox.regexp.tld(_11);
var _13=_11.allowPort?"(\\:\\d+)?":"";
var _14=_12;
if(_11.allowIP){
_14+="|"+dojox.regexp.ipAddress(_11);
}
if(_11.allowLocal){
_14+="|localhost";
}
if(_11.allowNamed){
_14+="|^[^-][a-zA-Z0-9_-]*";
}
return "("+_14+")"+_13;
};
dojox.regexp.url=function(_15){
_15=(typeof _15=="object")?_15:{};
if(!("scheme" in _15)){
_15.scheme=[true,false];
}
var _16=dojo.regexp.buildGroupRE(_15.scheme,function(q){
if(q){
return "(https?|ftps?)\\://";
}
return "";
});
var _18="(/([^?#\\s/]+/)*)?([^?#\\s/]+(\\?[^?#\\s/]*)?(#[A-Za-z][\\w.:-]*)?)?";
return _16+dojox.regexp.host(_15)+_18;
};
dojox.regexp.emailAddress=function(_19){
_19=(typeof _19=="object")?_19:{};
if(typeof _19.allowCruft!="boolean"){
_19.allowCruft=false;
}
_19.allowPort=false;
var _1a="([\\da-zA-Z]+[-._+&'])*[\\da-zA-Z]+";
var _1b=_1a+"@"+dojox.regexp.host(_19);
if(_19.allowCruft){
_1b="<?(mailto\\:)?"+_1b+">?";
}
return _1b;
};
dojox.regexp.emailAddressList=function(_1c){
_1c=(typeof _1c=="object")?_1c:{};
if(typeof _1c.listSeparator!="string"){
_1c.listSeparator="\\s;,";
}
var _1d=dojox.regexp.emailAddress(_1c);
var _1e="("+_1d+"\\s*["+_1c.listSeparator+"]\\s*)*"+_1d+"\\s*["+_1c.listSeparator+"]?\\s*";
return _1e;
};
dojox.regexp.us.state=function(_1f){
_1f=(typeof _1f=="object")?_1f:{};
if(typeof _1f.allowTerritories!="boolean"){
_1f.allowTerritories=true;
}
if(typeof _1f.allowMilitary!="boolean"){
_1f.allowMilitary=true;
}
var _20="AL|AK|AZ|AR|CA|CO|CT|DE|DC|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|"+"NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY";
var _21="AS|FM|GU|MH|MP|PW|PR|VI";
var _22="AA|AE|AP";
if(_1f.allowTerritories){
_20+="|"+_21;
}
if(_1f.allowMilitary){
_20+="|"+_22;
}
return "("+_20+")";
};
dojox.regexp.ca.postalCode=function(){
var _23="[A-Z][0-9][A-Z] [0-9][A-Z][0-9]";
return "("+_23+")";
};
dojox.regexp.ca.province=function(){
var _24="AB|BC|MB|NB|NL|NS|NT|NU|ON|PE|QC|SK|YT";
return "("+_24+")";
};
dojox.regexp.numberFormat=function(_25){
_25=(typeof _25=="object")?_25:{};
if(typeof _25.format=="undefined"){
_25.format="###-###-####";
}
var _26=function(_27){
_27=dojo.regexp.escapeString(_27,"?");
_27=_27.replace(/\?/g,"\\d?");
_27=_27.replace(/#/g,"\\d");
return _27;
};
return dojo.regexp.buildGroupRE(_25.format,_26);
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate._base"]){
dojo._hasResource["dojox.validate._base"]=true;
dojo.provide("dojox.validate._base");
dojo.require("dojo.regexp");
dojo.require("dojo.number");
dojo.require("dojox.validate.regexp");
dojox.validate.isText=function(_1,_2){
_2=(typeof _2=="object")?_2:{};
if(/^\s*$/.test(_1)){
return false;
}
if(typeof _2.length=="number"&&_2.length!=_1.length){
return false;
}
if(typeof _2.minlength=="number"&&_2.minlength>_1.length){
return false;
}
if(typeof _2.maxlength=="number"&&_2.maxlength<_1.length){
return false;
}
return true;
};
dojox.validate._isInRangeCache={};
dojox.validate.isInRange=function(_3,_4){
_3=dojo.number.parse(_3,_4);
if(isNaN(_3)){
return false;
}
_4=(typeof _4=="object")?_4:{};
var _5=(typeof _4.max=="number")?_4.max:Infinity;
var _6=(typeof _4.min=="number")?_4.min:-Infinity;
var _7=(typeof _4.decimal=="string")?_4.decimal:".";
var _8=dojox.validate._isInRangeCache;
var _9=_3+"max"+_5+"min"+_6+"dec"+_7;
if(typeof _8[_9]!="undefined"){
return _8[_9];
}
if(_3<_6||_3>_5){
_8[_9]=false;
return false;
}
_8[_9]=true;
return true;
};
dojox.validate.isNumberFormat=function(_a,_b){
var re=new RegExp("^"+dojox.regexp.numberFormat(_b)+"$","i");
return re.test(_a);
};
dojox.validate.isValidLuhn=function(_d){
var _e,_f,_10;
if(typeof _d!="string"){
_d=String(_d);
}
_d=_d.replace(/[- ]/g,"");
_f=_d.length%2;
_e=0;
for(var i=0;i<_d.length;i++){
_10=parseInt(_d.charAt(i));
if(i%2==_f){
_10*=2;
}
if(_10>9){
_10-=9;
}
_e+=_10;
}
return !(_e%10);
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate.us"]){
dojo._hasResource["dojox.validate.us"]=true;
dojo.provide("dojox.validate.us");
dojo.require("dojox.validate._base");
dojox.validate.us.isState=function(_1,_2){
var re=new RegExp("^"+dojox.regexp.us.state(_2)+"$","i");
return re.test(_1);
};
dojox.validate.us.isPhoneNumber=function(_4){
var _5={format:["###-###-####","(###) ###-####","(###) ### ####","###.###.####","###/###-####","### ### ####","###-###-#### x#???","(###) ###-#### x#???","(###) ### #### x#???","###.###.#### x#???","###/###-#### x#???","### ### #### x#???","##########"]};
return dojox.validate.isNumberFormat(_4,_5);
};
dojox.validate.us.isSocialSecurityNumber=function(_6){
var _7={format:["###-##-####","### ## ####","#########"]};
return dojox.validate.isNumberFormat(_6,_7);
};
dojox.validate.us.isZipCode=function(_8){
var _9={format:["#####-####","##### ####","#########","#####"]};
return dojox.validate.isNumberFormat(_8,_9);
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate.ca"]){
dojo._hasResource["dojox.validate.ca"]=true;
dojo.provide("dojox.validate.ca");
dojo.require("dojox.validate._base");
dojox.validate.ca.isPhoneNumber=function(_1){
return dojox.validate.us.isPhoneNumber(_1);
};
dojox.validate.ca.isProvince=function(_2){
var re=new RegExp("^"+dojox.regexp.ca.province()+"$","i");
return re.test(_2);
};
dojox.validate.ca.isSocialInsuranceNumber=function(_4){
var _5={format:["###-###-###","### ### ###","#########"]};
return dojox.validate.isNumberFormat(_4,_5);
};
dojox.validate.ca.isPostalCode=function(_6){
var re=new RegExp("^"+dojox.regexp.ca.postalCode()+"$","i");
return re.test(_6);
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate.web"]){
dojo._hasResource["dojox.validate.web"]=true;
dojo.provide("dojox.validate.web");
dojo.require("dojox.validate._base");
dojox.validate.isIpAddress=function(_1,_2){
var re=new RegExp("^"+dojox.regexp.ipAddress(_2)+"$","i");
return re.test(_1);
};
dojox.validate.isUrl=function(_4,_5){
var re=new RegExp("^"+dojox.regexp.url(_5)+"$","i");
return re.test(_4);
};
dojox.validate.isEmailAddress=function(_7,_8){
var re=new RegExp("^"+dojox.regexp.emailAddress(_8)+"$","i");
return re.test(_7);
};
dojox.validate.isEmailAddressList=function(_a,_b){
var re=new RegExp("^"+dojox.regexp.emailAddressList(_b)+"$","i");
return re.test(_a);
};
dojox.validate.getEmailAddressList=function(_d,_e){
if(!_e){
_e={};
}
if(!_e.listSeparator){
_e.listSeparator="\\s;,";
}
if(dojox.validate.isEmailAddressList(_d,_e)){
return _d.split(new RegExp("\\s*["+_e.listSeparator+"]\\s*"));
}
return [];
};
}
/*
	Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate.creditCard"]){
dojo._hasResource["dojox.validate.creditCard"]=true;
dojo.provide("dojox.validate.creditCard");
dojo.require("dojox.validate._base");
dojox.validate.isValidCreditCard=function(_1,_2){
return ((_2.toLowerCase()=="er"||dojox.validate.isValidLuhn(_1))&&dojox.validate.isValidCreditCardNumber(_1,_2.toLowerCase()));
};
dojox.validate.isValidCreditCardNumber=function(_3,_4){
_3=String(_3).replace(/[- ]/g,"");
var _5={"mc":"5[1-5][0-9]{14}","ec":"5[1-5][0-9]{14}","vi":"4(?:[0-9]{12}|[0-9]{15})","ax":"3[47][0-9]{13}","dc":"3(?:0[0-5][0-9]{11}|[68][0-9]{12})","bl":"3(?:0[0-5][0-9]{11}|[68][0-9]{12})","di":"6011[0-9]{12}","jcb":"(?:3[0-9]{15}|(2131|1800)[0-9]{11})","er":"2(?:014|149)[0-9]{11}"};
if(_4){
var _6=_5[_4.toLowerCase()];
return _6?!!(_3.match(_5[_4.toLowerCase()])):false;
}
var _7=[];
for(var p in _5){
if(_3.match("^"+_5[p]+"$")){
_7.push(p);
}
}
return _7.length?_7.join("|"):false;
};
dojox.validate.isValidCvv=function(_9,_a){
if(typeof _9!="string"){
_9=String(_9);
}
var _b;
switch(_a.toLowerCase()){
case "mc":
case "ec":
case "vi":
case "di":
_b="###";
break;
case "ax":
_b="####";
break;
default:
return false;
}
var _c={format:_b};
return (_9.length==_b.length&&dojox.validate.isNumberFormat(_9,_c));
};
}

// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;

if (cart == null) var cart = {};
cart._path = context+'/dwr';
cart.add = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(cart._path, 'cart', 'add', p0, p1, p2, p3, false, false, false, callback);
}
cart.remove = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'remove', p0, false, false, callback);
}
cart.getSize = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getSize', callback);
}
cart.empty = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'empty', false, false, callback);
}
cart.increment = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'increment', p0, false, false, callback);
}
cart.update = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(cart._path, 'cart', 'update', p0, p1, p2, p3, false, false, callback);
}
cart.getTime = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getTime', callback);
}
cart.getGroups = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getGroups', callback);
}
cart.setAvailableGroups = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'setAvailableGroups', p0, callback);
}
cart.getItems = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getItems', callback);
}
cart.setItems = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'setItems', p0, callback);
}
cart.getHasTypes = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getHasTypes', callback);
}
cart.getHasRental = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getHasRental', callback);
}
cart.getHasShippable = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getHasShippable', callback);
}
cart.getSubtotal = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getSubtotal', callback);
}
cart.getTotalQuantity = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getTotalQuantity', callback);
}
cart.getCoupon = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getCoupon', callback);
}
cart.setCoupon = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'setCoupon', p0, callback);
}
cart.checkCoupon = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'checkCoupon', callback);
}
cart.resetPricing = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'resetPricing', callback);
}
cart.applyCustomPricing = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'applyCustomPricing', callback);
}
cart.resetOrder = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'resetOrder', p0, false, false, callback);
}
cart.setGroups = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'setGroups', p0, callback);
}
cart.groupMatch = function(p0, p1, callback) {
  dwr.engine._execute(cart._path, 'cart', 'groupMatch', p0, p1, callback);
}
cart.fillGroupsOld = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'fillGroupsOld', callback);
}
cart.applyGroupsOld = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'applyGroupsOld', callback);
}
cart.getAvailableGroups = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'getAvailableGroups', callback);
}
cart.addConv = function(p0, p1, p2, p3, p4, p5, p6, callback) {
  dwr.engine._execute(cart._path, 'cart', 'addConv', p0, p1, p2, p3, p4, p5, p6, false, false, false, callback);
}
cart.decrement = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'decrement', p0, false, false, callback);
}
cart.putDate = function(p0, p1, callback) {
  dwr.engine._execute(cart._path, 'cart', 'putDate', p0, p1, false, false, callback);
}
cart.addCoupon = function(p0, callback) {
  dwr.engine._execute(cart._path, 'cart', 'addCoupon', p0, false, false, callback);
}
cart.removeCoupon = function(callback) {
  dwr.engine._execute(cart._path, 'cart', 'removeCoupon', false, false, callback);
}

// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;

if (wishlist == null) var wishlist = {};
wishlist._path = context+'/dwr';
wishlist.add = function(p0, callback) {
  dwr.engine._execute(wishlist._path, 'wishlist', 'add', p0, false, false, callback);
}
wishlist.remove = function(p0, callback) {
  dwr.engine._execute(wishlist._path, 'wishlist', 'remove', p0, false, false, callback);
}
wishlist.update = function(p0, p1, callback) {
  dwr.engine._execute(wishlist._path, 'wishlist', 'update', p0, p1, false, false, callback);
}
wishlist.move = function(p0, p1, callback) {
  dwr.engine._execute(wishlist._path, 'wishlist', 'move', p0, p1, false, false, callback);
}
wishlist.saveComments = function(p0, p1, callback) {
  dwr.engine._execute(wishlist._path, 'wishlist', 'saveComments', p0, p1, false, false, callback);
}
// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;

if (ajax == null) var ajax = {};
ajax._path = '/dwr';
ajax.setAttribute = function(p0, p1, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'setAttribute', p0, p1, false, callback);
}
ajax.preRegister = function(p0, p1, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'preRegister', p0, p1, false, false, false, callback);
}
ajax.login = function(p0, p1, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'login', p0, p1, false, false, callback);
}
ajax.changeLogin = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'changeLogin', p0, p1, p2, p3, false, false, false, callback);
}
ajax.getPrice = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'getPrice', p0, p1, p2, p3, false, false, callback);
}
ajax.logout = function(callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'logout', false, callback);
}
ajax.emailPassword = function(p0, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'emailPassword', p0, false, false, false, false, callback);
}
ajax.dbSelect = function(p0, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'dbSelect', p0, callback);
}
ajax.dbRead = function(p0, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'dbRead', p0, callback);
}
ajax.checkLogin = function(callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'checkLogin', false, callback);
}
ajax.cancelRental = function(p0, p1, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'cancelRental', p0, p1, false, false, callback);
}
ajax.checkAvailability = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'checkAvailability', p0, p1, p2, p3, false, false, callback);
}
ajax.toggleTour = function(callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'toggleTour', false, callback);
}
ajax.logVideoAccess = function(p0, p1, p2, p3, p4, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'logVideoAccess', p0, p1, p2, p3, p4, false, false, callback);
}
ajax.webFeedback = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'webFeedback', p0, p1, p2, p3, false, false, callback);
}
ajax.addReview = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'addReview', p0, p1, p2, p3, false, false, callback);
}
ajax.addRating = function(p0, p1, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'addRating', p0, p1, false, false, callback);
}
ajax.getReport = function(p0, p1, p2, p3, p4, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'getReport', p0, p1, p2, p3, p4, false, false, callback);
}
ajax.addContact = function(p0, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'addContact', p0, false, false, false, false, callback);
}
ajax.updateEmailPreferences = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'updateEmailPreferences', p0, p1, p2, p3, false, false, callback);
}
ajax.contactUs = function(p0, p1, p2, p3, p4, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'contactUs', p0, p1, p2, p3, p4, false, false, callback);
}
ajax.rebuildProdweb = function(callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'rebuildProdweb', false, false, callback);
}
ajax.dbExecute = function(p0, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'dbExecute', p0, callback);
}
ajax.dbUpdate = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'dbUpdate', p0, p1, p2, p3, callback);
}
ajax.dbInsert = function(p0, p1, p2, p3, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'dbInsert', p0, p1, p2, p3, callback);
}
ajax.dbDelete = function(p0, p1, callback) {
  dwr.engine._execute(ajax._path, 'ajax', 'dbDelete', p0, p1, callback);
}



















if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;





dwr.engine.setErrorHandler = function(handler) {
dwr.engine._errorHandler = handler;
};





dwr.engine.setWarningHandler = function(handler) {
dwr.engine._warningHandler = handler;
};





dwr.engine.setTextHtmlHandler = function(handler) {
dwr.engine._textHtmlHandler = handler;
}





dwr.engine.setTimeout = function(timeout) {
dwr.engine._timeout = timeout;
};





dwr.engine.setPreHook = function(handler) {
dwr.engine._preHook = handler;
};





dwr.engine.setPostHook = function(handler) {
dwr.engine._postHook = handler;
};





dwr.engine.setHeaders = function(headers) {
dwr.engine._headers = headers;
};





dwr.engine.setParameters = function(parameters) {
dwr.engine._parameters = parameters;
};


dwr.engine.XMLHttpRequest = 1;


dwr.engine.IFrame = 2;


dwr.engine.ScriptTag = 3;






dwr.engine.setRpcType = function(newType) {
if (newType != dwr.engine.XMLHttpRequest && newType != dwr.engine.IFrame && newType != dwr.engine.ScriptTag) {
dwr.engine._handleError(null, { name:"dwr.engine.invalidRpcType", message:"RpcType must be one of dwr.engine.XMLHttpRequest or dwr.engine.IFrame or dwr.engine.ScriptTag" });
return;
}
dwr.engine._rpcType = newType;
};





dwr.engine.setHttpMethod = function(httpMethod) {
if (httpMethod != "GET" && httpMethod != "POST") {
dwr.engine._handleError(null, { name:"dwr.engine.invalidHttpMethod", message:"Remoting method must be one of GET or POST" });
return;
}
dwr.engine._httpMethod = httpMethod;
};





dwr.engine.setOrdered = function(ordered) {
dwr.engine._ordered = ordered;
};





dwr.engine.setAsync = function(async) {
dwr.engine._async = async;
};





dwr.engine.setActiveReverseAjax = function(activeReverseAjax) {
if (activeReverseAjax) {

if (dwr.engine._activeReverseAjax) return;
dwr.engine._activeReverseAjax = true;
dwr.engine._poll();
}
else {

if (dwr.engine._activeReverseAjax && dwr.engine._pollReq) dwr.engine._pollReq.abort();
dwr.engine._activeReverseAjax = false;
}



};






dwr.engine.setPollType = function(newPollType) {
if (newPollType != dwr.engine.XMLHttpRequest && newPollType != dwr.engine.IFrame) {
dwr.engine._handleError(null, { name:"dwr.engine.invalidPollType", message:"PollType must be one of dwr.engine.XMLHttpRequest or dwr.engine.IFrame"  });
return;
}
dwr.engine._pollType = newPollType;
};





dwr.engine.defaultErrorHandler = function(message, ex) {
dwr.engine._debug("Error: " + ex.name + ", " + ex.message, true);

if (message == null || message == "") alert("A server error has occured. More information may be available in the console.");

else if (message.indexOf("0x80040111") != -1) dwr.engine._debug(message);
else alert(message);
};





dwr.engine.defaultWarningHandler = function(message, ex) {
dwr.engine._debug(message);
};





dwr.engine.beginBatch = function() {
if (dwr.engine._batch) {
dwr.engine._handleError(null, { name:"dwr.engine.batchBegun", message:"Batch already begun" });
return;
}
dwr.engine._batch = dwr.engine._createBatch();
};





dwr.engine.endBatch = function(options) {
var batch = dwr.engine._batch;
if (batch == null) {
dwr.engine._handleError(null, { name:"dwr.engine.batchNotBegun", message:"No batch in progress" });
return;
}
dwr.engine._batch = null;
if (batch.map.callCount == 0) return;


if (options) dwr.engine._mergeBatch(batch, options);


if (dwr.engine._ordered && dwr.engine._batchesLength != 0) {
dwr.engine._batchQueue[dwr.engine._batchQueue.length] = batch;
}
else {
dwr.engine._sendData(batch);
}
};


dwr.engine.setPollMethod = function(type) { dwr.engine.setPollType(type); };
dwr.engine.setMethod = function(type) { dwr.engine.setRpcType(type); };
dwr.engine.setVerb = function(verb) { dwr.engine.setHttpMethod(verb); };






dwr.engine._origScriptSessionId = "F1E543E30F8D4F59676E567D42DD7179";


dwr.engine._sessionCookieName = "JSESSIONID";


dwr.engine._allowGetForSafariButMakeForgeryEasier = "false";


dwr.engine._scriptTagProtection = "throw 'allowScriptTagRemoting is false.';";


dwr.engine._defaultPath = context+"/dwr";


dwr.engine._scriptSessionId = null;


dwr.engine._getScriptSessionId = function() {
if (dwr.engine._scriptSessionId == null) {
dwr.engine._scriptSessionId = dwr.engine._origScriptSessionId + Math.floor(Math.random() * 1000);
}
return dwr.engine._scriptSessionId;
};


dwr.engine._errorHandler = dwr.engine.defaultErrorHandler;


dwr.engine._warningHandler = dwr.engine.defaultWarningHandler;


dwr.engine._preHook = null;


dwr.engine._postHook = null;


dwr.engine._batches = {};


dwr.engine._batchesLength = 0;


dwr.engine._batchQueue = [];


dwr.engine._rpcType = dwr.engine.XMLHttpRequest;


dwr.engine._httpMethod = "POST";


dwr.engine._ordered = false;


dwr.engine._async = true;


dwr.engine._batch = null;


dwr.engine._timeout = 0;


dwr.engine._DOMDocument = ["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];


dwr.engine._XMLHTTP = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];


dwr.engine._activeReverseAjax = false;


dwr.engine._pollType = dwr.engine.XMLHttpRequest;



dwr.engine._outstandingIFrames = [];


dwr.engine._pollReq = null;


dwr.engine._pollCometInterval = 200;


dwr.engine._pollRetries = 0;
dwr.engine._maxPollRetries = 0;


dwr.engine._textHtmlHandler = null;


dwr.engine._headers = null;


dwr.engine._parameters = null;


dwr.engine._postSeperator = "\n";
dwr.engine._defaultInterceptor = function(data) {return data;}
dwr.engine._urlRewriteHandler = dwr.engine._defaultInterceptor;
dwr.engine._contentRewriteHandler = dwr.engine._defaultInterceptor;
dwr.engine._replyRewriteHandler = dwr.engine._defaultInterceptor;


dwr.engine._nextBatchId = 0;


dwr.engine._propnames = [ "rpcType", "httpMethod", "async", "timeout", "errorHandler", "warningHandler", "textHtmlHandler" ];


dwr.engine._partialResponseNo = 0;
dwr.engine._partialResponseYes = 1;
dwr.engine._partialResponseFlush = 2;










dwr.engine._execute = function(path, scriptName, methodName, vararg_params) {
var singleShot = false;
if (dwr.engine._batch == null) {
dwr.engine.beginBatch();
singleShot = true;
}
var batch = dwr.engine._batch;

var args = [];
for (var i = 0; i < arguments.length - 3; i++) {
args[i] = arguments[i + 3];
}

if (batch.path == null) {
batch.path = path;
}
else {
if (batch.path != path) {
dwr.engine._handleError(batch, { name:"dwr.engine.multipleServlets", message:"Can't batch requests to multiple DWR Servlets." });
return;
}
}


var callData;
var lastArg = args[args.length - 1];
if (typeof lastArg == "function" || lastArg == null) callData = { callback:args.pop() };
else callData = args.pop();


dwr.engine._mergeBatch(batch, callData);
batch.handlers[batch.map.callCount] = {
exceptionHandler:callData.exceptionHandler,
callback:callData.callback
};


var prefix = "c" + batch.map.callCount + "-";
batch.map[prefix + "scriptName"] = scriptName;
batch.map[prefix + "methodName"] = methodName;
batch.map[prefix + "id"] = batch.map.callCount;
for (i = 0; i < args.length; i++) {
dwr.engine._serializeAll(batch, [], args[i], prefix + "param" + i);
}


batch.map.callCount++;
if (singleShot) dwr.engine.endBatch();
};


dwr.engine._poll = function(overridePath) {
if (!dwr.engine._activeReverseAjax) return;

var batch = dwr.engine._createBatch();
batch.map.id = 0;
batch.map.callCount = 1;
batch.isPoll = true;
if (navigator.userAgent.indexOf("Gecko/") != -1) {
batch.rpcType = dwr.engine._pollType;
batch.map.partialResponse = dwr.engine._partialResponseYes;
}
else if (document.all) {
batch.rpcType = dwr.engine.IFrame;
batch.map.partialResponse = dwr.engine._partialResponseFlush;
}
else {
batch.rpcType = dwr.engine._pollType;
batch.map.partialResponse = dwr.engine._partialResponseNo;
}
batch.httpMethod = "POST";
batch.async = true;
batch.timeout = 0;
batch.path = (overridePath) ? overridePath : dwr.engine._defaultPath;
batch.preHooks = [];
batch.postHooks = [];
batch.errorHandler = dwr.engine._pollErrorHandler;
batch.warningHandler = dwr.engine._pollErrorHandler;
batch.handlers[0] = {
callback:function(pause) {
dwr.engine._pollRetries = 0;
setTimeout("dwr.engine._poll()", pause);
}
};


dwr.engine._sendData(batch);
if (batch.rpcType == dwr.engine.XMLHttpRequest) {

dwr.engine._checkCometPoll();
}
};


dwr.engine._pollErrorHandler = function(msg, ex) {

dwr.engine._pollRetries++;
dwr.engine._debug("Reverse Ajax poll failed (pollRetries=" + dwr.engine._pollRetries + "): " + ex.name + " : " + ex.message);
if (dwr.engine._pollRetries < dwr.engine._maxPollRetries) {
setTimeout("dwr.engine._poll()", 10000);
}
else {
dwr.engine._debug("Giving up.");
}
};


dwr.engine._createBatch = function() {
var batch = {
map:{
callCount:0,
page:window.location.pathname + window.location.search,
httpSessionId:dwr.engine._getJSessionId(),
scriptSessionId:dwr.engine._getScriptSessionId()
},
charsProcessed:0, paramCount:0,
headers:[], parameters:[],
isPoll:false, headers:{}, handlers:{}, preHooks:[], postHooks:[],
rpcType:dwr.engine._rpcType,
httpMethod:dwr.engine._httpMethod,
async:dwr.engine._async,
timeout:dwr.engine._timeout,
errorHandler:dwr.engine._errorHandler,
warningHandler:dwr.engine._warningHandler,
textHtmlHandler:dwr.engine._textHtmlHandler
};
if (dwr.engine._preHook) batch.preHooks.push(dwr.engine._preHook);
if (dwr.engine._postHook) batch.postHooks.push(dwr.engine._postHook);
var propname, data;
if (dwr.engine._headers) {
for (propname in dwr.engine._headers) {
data = dwr.engine._headers[propname];
if (typeof data != "function") batch.headers[propname] = data;
}
}
if (dwr.engine._parameters) {
for (propname in dwr.engine._parameters) {
data = dwr.engine._parameters[propname];
if (typeof data != "function") batch.parameters[propname] = data;
}
}
return batch;
}


dwr.engine._mergeBatch = function(batch, overrides) {
var propname, data;
for (var i = 0; i < dwr.engine._propnames.length; i++) {
propname = dwr.engine._propnames[i];
if (overrides[propname] != null) batch[propname] = overrides[propname];
}
if (overrides.preHook != null) batch.preHooks.unshift(overrides.preHook);
if (overrides.postHook != null) batch.postHooks.push(overrides.postHook);
if (overrides.headers) {
for (propname in overrides.headers) {
data = overrides.headers[propname];
if (typeof data != "function") batch.headers[propname] = data;
}
}
if (overrides.parameters) {
for (propname in overrides.parameters) {
data = overrides.parameters[propname];
if (typeof data != "function") batch.map["p-" + propname] = "" + data;
}
}
};


dwr.engine._getJSessionId =  function() {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i];
while (cookie.charAt(0) == ' ') cookie = cookie.substring(1, cookie.length);
if (cookie.indexOf(dwr.engine._sessionCookieName + "=") == 0) {
return cookie.substring(11, cookie.length);
}
}
return "";
}


dwr.engine._checkCometPoll = function() {
for (var i = 0; i < dwr.engine._outstandingIFrames.length; i++) {
var text = "";
var iframe = dwr.engine._outstandingIFrames[i];
try {
text = dwr.engine._getTextFromCometIFrame(iframe);
}
catch (ex) {
dwr.engine._handleWarning(iframe.batch, ex);
}
if (text != "") dwr.engine._processCometResponse(text, iframe.batch);
}
if (dwr.engine._pollReq) {
var req = dwr.engine._pollReq;
var text = req.responseText;
dwr.engine._processCometResponse(text, req.batch);
}


if (dwr.engine._outstandingIFrames.length > 0 || dwr.engine._pollReq) {
setTimeout("dwr.engine._checkCometPoll()", dwr.engine._pollCometInterval);
}
};


dwr.engine._getTextFromCometIFrame = function(frameEle) {
var body = frameEle.contentWindow.document.body;
if (body == null) return "";
var text = body.innerHTML;

if (text.indexOf("<PRE>") == 0 || text.indexOf("<pre>") == 0) {
text = text.substring(5, text.length - 7);
}
return text;
};


dwr.engine._processCometResponse = function(response, batch) {
if (batch.charsProcessed == response.length) return;
if (response.length == 0) {
batch.charsProcessed = 0;
return;
}

var firstStartTag = response.indexOf("//#DWR-START#", batch.charsProcessed);
if (firstStartTag == -1) {

batch.charsProcessed = response.length;
return;
}




var lastEndTag = response.lastIndexOf("//#DWR-END#");
if (lastEndTag == -1) {

return;
}


if (response.charCodeAt(lastEndTag + 11) == 13 && response.charCodeAt(lastEndTag + 12) == 10) {
batch.charsProcessed = lastEndTag + 13;
}
else {
batch.charsProcessed = lastEndTag + 11;
}

var exec = response.substring(firstStartTag + 13, lastEndTag);

dwr.engine._receivedBatch = batch;
dwr.engine._eval(exec);
dwr.engine._receivedBatch = null;
};


dwr.engine._sendData = function(batch) {
batch.map.batchId = dwr.engine._nextBatchId++;
dwr.engine._batches[batch.map.batchId] = batch;
dwr.engine._batchesLength++;
batch.completed = false;

for (var i = 0; i < batch.preHooks.length; i++) {
batch.preHooks[i]();
}
batch.preHooks = null;

if (batch.timeout && batch.timeout != 0) {
batch.interval = setInterval(function() { dwr.engine._abortRequest(batch); }, batch.timeout);
}

if (batch.rpcType == dwr.engine.XMLHttpRequest) {
if (window.XMLHttpRequest) {
batch.req = new XMLHttpRequest();
}

else if (window.ActiveXObject && !(navigator.userAgent.indexOf("Mac") >= 0 && navigator.userAgent.indexOf("MSIE") >= 0)) {
batch.req = dwr.engine._newActiveXObject(dwr.engine._XMLHTTP);
}
}

var prop, request;
if (batch.req) {

if (batch.async) {
batch.req.onreadystatechange = function() { dwr.engine._stateChange(batch); };
}

if (batch.isPoll) {
dwr.engine._pollReq = batch.req;


batch.req.batch = batch;
}

var indexSafari = navigator.userAgent.indexOf("Safari/");
if (indexSafari >= 0) {
var version = navigator.userAgent.substring(indexSafari + 7);
if (parseInt(version, 10) < 400) {
if (dwr.engine._allowGetForSafariButMakeForgeryEasier == "true") batch.httpMethod = "GET";
else dwr.engine._handleWarning(batch, { name:"dwr.engine.oldSafari", message:"Safari GET support disabled. See getahead.org/dwr/server/servlet and allowGetForSafariButMakeForgeryEasier." });
}
}
batch.mode = batch.isPoll ? dwr.engine._ModePlainPoll : dwr.engine._ModePlainCall;
request = dwr.engine._constructRequest(batch);
try {
batch.req.open(batch.httpMethod, request.url, batch.async);
try {
for (prop in batch.headers) {
var value = batch.headers[prop];
if (typeof value == "string") batch.req.setRequestHeader(prop, value);
}
if (!batch.headers["Content-Type"]) batch.req.setRequestHeader("Content-Type", "text/plain");
}
catch (ex) {
dwr.engine._handleWarning(batch, ex);
}
batch.req.send(request.body);
if (!batch.async) dwr.engine._stateChange(batch);
}
catch (ex) {
dwr.engine._handleError(batch, ex);
}
}
else if (batch.rpcType != dwr.engine.ScriptTag) {

var idname = batch.isPoll ? "dwr-if-poll-" + batch.map.batchId : "dwr-if-" + batch.map["c0-id"];
batch.div = document.createElement("div");
batch.div.innerHTML = "<iframe src='javascript:void(0)' frameborder='0' style='width:0px;height:0px;border:0;' id='" + idname + "' name='" + idname + "'></iframe>";
document.body.appendChild(batch.div);
batch.iframe = document.getElementById(idname);
batch.iframe.batch = batch;
batch.mode = batch.isPoll ? dwr.engine._ModeHtmlPoll : dwr.engine._ModeHtmlCall;
if (batch.isPoll) dwr.engine._outstandingIFrames.push(batch.iframe);
request = dwr.engine._constructRequest(batch);
if (batch.httpMethod == "GET") {
batch.iframe.setAttribute("src", request.url);

}
else {
batch.form = document.createElement("form");
batch.form.setAttribute("id", "dwr-form");
batch.form.setAttribute("action", request.url);
batch.form.setAttribute("target", idname);
batch.form.target = idname;
batch.form.setAttribute("method", batch.httpMethod);
for (prop in batch.map) {
var value = batch.map[prop];
if (typeof value != "function") {
var formInput = document.createElement("input");
formInput.setAttribute("type", "hidden");
formInput.setAttribute("name", prop);
formInput.setAttribute("value", value);
batch.form.appendChild(formInput);
}
}
document.body.appendChild(batch.form);
batch.form.submit();
}
}
else {
batch.httpMethod = "GET";
batch.mode = batch.isPoll ? dwr.engine._ModePlainPoll : dwr.engine._ModePlainCall;
request = dwr.engine._constructRequest(batch);
batch.script = document.createElement("script");
batch.script.id = "dwr-st-" + batch.map["c0-id"];
batch.script.src = request.url;
document.body.appendChild(batch.script);
}
};

dwr.engine._ModePlainCall = "/call/plaincall/";
dwr.engine._ModeHtmlCall = "/call/htmlcall/";
dwr.engine._ModePlainPoll = "/call/plainpoll/";
dwr.engine._ModeHtmlPoll = "/call/htmlpoll/";


dwr.engine._constructRequest = function(batch) {

var request = { url:batch.path + batch.mode, body:null };
if (batch.isPoll == true) {
request.url += "ReverseAjax.dwr";
}
else if (batch.map.callCount == 1) {
request.url += batch.map["c0-scriptName"] + "." + batch.map["c0-methodName"] + ".dwr";
}
else {
request.url += "Multiple." + batch.map.callCount + ".dwr";
}

var sessionMatch = location.href.match(/jsessionid=([^?]+)/);
if (sessionMatch != null) {
request.url += ";jsessionid=" + sessionMatch[1];
}

var prop;
if (batch.httpMethod == "GET") {


batch.map.callCount = "" + batch.map.callCount;
request.url += "?";
for (prop in batch.map) {
if (typeof batch.map[prop] != "function") {
request.url += encodeURIComponent(prop) + "=" + encodeURIComponent(batch.map[prop]) + "&";
}
}
request.url = request.url.substring(0, request.url.length - 1);
}
else {

request.body = "";
for (prop in batch.map) {
if (typeof batch.map[prop] != "function") {
request.body += prop + "=" + batch.map[prop] + dwr.engine._postSeperator;
}
}
request.body = dwr.engine._contentRewriteHandler(request.body);
}
request.url = dwr.engine._urlRewriteHandler(request.url);
return request;
};


dwr.engine._stateChange = function(batch) {
var toEval;

if (batch.completed) {
dwr.engine._debug("Error: _stateChange() with batch.completed");
return;
}

var req = batch.req;
try {
if (req.readyState != 4) return;
}
catch (ex) {
dwr.engine._handleWarning(batch, ex);

dwr.engine._clearUp(batch);
return;
}

try {
var reply = req.responseText;
reply = dwr.engine._replyRewriteHandler(reply);
var status = req.status;

if (reply == null || reply == "") {
dwr.engine._handleWarning(batch, { name:"dwr.engine.missingData", message:"No data received from server" });
}
else if (status != 200) {
dwr.engine._handleError(batch, { name:"dwr.engine.http." + status, message:req.statusText });
}
else {
var contentType = req.getResponseHeader("Content-Type");
if (!contentType.match(/^text\/plain/) && !contentType.match(/^text\/javascript/)) {
if (contentType.match(/^text\/html/) && typeof batch.textHtmlHandler == "function") {
batch.textHtmlHandler();
}
else {
dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidMimeType", message:"Invalid content type: '" + contentType + "'" });
}
}
else {

if (batch.isPoll && batch.map.partialResponse == dwr.engine._partialResponseYes) {
dwr.engine._processCometResponse(reply, batch);
}
else {
if (reply.search("//#DWR") == -1) {
dwr.engine._handleWarning(batch, { name:"dwr.engine.invalidReply", message:"Invalid reply from server" });
}
else {
toEval = reply;
}
}
}
}
}
catch (ex) {
dwr.engine._handleWarning(batch, ex);
}

dwr.engine._callPostHooks(batch);


dwr.engine._receivedBatch = batch;
if (toEval != null) toEval = toEval.replace(dwr.engine._scriptTagProtection, "");
dwr.engine._eval(toEval);
dwr.engine._receivedBatch = null;

dwr.engine._clearUp(batch);
};


dwr.engine._remoteHandleCallback = function(batchId, callId, reply) {
var batch = dwr.engine._batches[batchId];
if (batch == null) {
dwr.engine._debug("Warning: batch == null in remoteHandleCallback for batchId=" + batchId, true);
return;
}


try {
var handlers = batch.handlers[callId];
if (!handlers) {
dwr.engine._debug("Warning: Missing handlers. callId=" + callId, true);
}
else if (typeof handlers.callback == "function") handlers.callback(reply);
}
catch (ex) {
dwr.engine._handleError(batch, ex);
}
};


dwr.engine._remoteHandleException = function(batchId, callId, ex) {
var batch = dwr.engine._batches[batchId];
if (batch == null) { dwr.engine._debug("Warning: null batch in remoteHandleException", true); return; }
var handlers = batch.handlers[callId];
if (handlers == null) { dwr.engine._debug("Warning: null handlers in remoteHandleException", true); return; }
if (ex.message == undefined) ex.message = "";
if (typeof handlers.exceptionHandler == "function") handlers.exceptionHandler(ex.message, ex);
else if (typeof batch.errorHandler == "function") batch.errorHandler(ex.message, ex);
};


dwr.engine._remoteHandleBatchException = function(ex, batchId) {
var searchBatch = (dwr.engine._receivedBatch == null && batchId != null);
if (searchBatch) {
dwr.engine._receivedBatch = dwr.engine._batches[batchId];
}
if (ex.message == undefined) ex.message = "";
dwr.engine._handleError(dwr.engine._receivedBatch, ex);
if (searchBatch) {
dwr.engine._receivedBatch = null;
dwr.engine._clearUp(dwr.engine._batches[batchId]);
}
};


dwr.engine._remotePollCometDisabled = function(ex, batchId) {
dwr.engine.setActiveReverseAjax(false);
var searchBatch = (dwr.engine._receivedBatch == null && batchId != null);
if (searchBatch) {
dwr.engine._receivedBatch = dwr.engine._batches[batchId];
}
if (ex.message == undefined) ex.message = "";
dwr.engine._handleError(dwr.engine._receivedBatch, ex);
if (searchBatch) {
dwr.engine._receivedBatch = null;
dwr.engine._clearUp(dwr.engine._batches[batchId]);
}
};


dwr.engine._remoteBeginIFrameResponse = function(iframe, batchId) {
if (iframe != null) dwr.engine._receivedBatch = iframe.batch;
dwr.engine._callPostHooks(dwr.engine._receivedBatch);
};


dwr.engine._remoteEndIFrameResponse = function(batchId) {
dwr.engine._clearUp(dwr.engine._receivedBatch);
dwr.engine._receivedBatch = null;
};


dwr.engine._eval = function(script) {
if (script == null) return null;
if (script == "") { dwr.engine._debug("Warning: blank script", true); return null; }

return eval(script);
};


dwr.engine._abortRequest = function(batch) {
if (batch && !batch.completed) {
clearInterval(batch.interval);
dwr.engine._clearUp(batch);
if (batch.req) batch.req.abort();
dwr.engine._handleError(batch, { name:"dwr.engine.timeout", message:"Timeout" });
}
};


dwr.engine._callPostHooks = function(batch) {
if (batch.postHooks) {
for (var i = 0; i < batch.postHooks.length; i++) {
batch.postHooks[i]();
}
batch.postHooks = null;
}
}


dwr.engine._clearUp = function(batch) {
if (!batch) { dwr.engine._debug("Warning: null batch in dwr.engine._clearUp()", true); return; }
if (batch.completed == "true") { dwr.engine._debug("Warning: Double complete", true); return; }


if (batch.div) batch.div.parentNode.removeChild(batch.div);
if (batch.iframe) {

for (var i = 0; i < dwr.engine._outstandingIFrames.length; i++) {
if (dwr.engine._outstandingIFrames[i] == batch.iframe) {
dwr.engine._outstandingIFrames.splice(i, 1);
}
}
batch.iframe.parentNode.removeChild(batch.iframe);
}
if (batch.form) batch.form.parentNode.removeChild(batch.form);


if (batch.req) {

if (batch.req == dwr.engine._pollReq) dwr.engine._pollReq = null;
delete batch.req;
}

if (batch.map && batch.map.batchId) {
delete dwr.engine._batches[batch.map.batchId];
dwr.engine._batchesLength--;
}

batch.completed = true;




if (dwr.engine._batchQueue.length != 0) {
var sendbatch = dwr.engine._batchQueue.shift();
dwr.engine._sendData(sendbatch);
}
};


dwr.engine._handleError = function(batch, ex) {
if (typeof ex == "string") ex = { name:"unknown", message:ex };
if (ex.message == null) ex.message = "";
if (ex.name == null) ex.name = "unknown";
if (batch && typeof batch.errorHandler == "function") batch.errorHandler(ex.message, ex);
else if (dwr.engine._errorHandler) dwr.engine._errorHandler(ex.message, ex);
dwr.engine._clearUp(batch);
};


dwr.engine._handleWarning = function(batch, ex) {
if (typeof ex == "string") ex = { name:"unknown", message:ex };
if (ex.message == null) ex.message = "";
if (ex.name == null) ex.name = "unknown";
if (batch && typeof batch.warningHandler == "function") batch.warningHandler(ex.message, ex);
else if (dwr.engine._warningHandler) dwr.engine._warningHandler(ex.message, ex);
dwr.engine._clearUp(batch);
};








dwr.engine._serializeAll = function(batch, referto, data, name) {
if (data == null) {
batch.map[name] = "null:null";
return;
}

switch (typeof data) {
case "boolean":
batch.map[name] = "boolean:" + data;
break;
case "number":
batch.map[name] = "number:" + data;
break;
case "string":
batch.map[name] = "string:" + encodeURIComponent(data);
break;
case "object":
if (data instanceof String) batch.map[name] = "String:" + encodeURIComponent(data);
else if (data instanceof Boolean) batch.map[name] = "Boolean:" + data;
else if (data instanceof Number) batch.map[name] = "Number:" + data;
else if (data instanceof Date) batch.map[name] = "Date:" + data.getTime();
else if (data && data.join) batch.map[name] = dwr.engine._serializeArray(batch, referto, data, name);
else batch.map[name] = dwr.engine._serializeObject(batch, referto, data, name);
break;
case "function":

break;
default:
dwr.engine._handleWarning(null, { name:"dwr.engine.unexpectedType", message:"Unexpected type: " + typeof data + ", attempting default converter." });
batch.map[name] = "default:" + data;
break;
}
};


dwr.engine._lookup = function(referto, data, name) {
var lookup;

for (var i = 0; i < referto.length; i++) {
if (referto[i].data == data) {
lookup = referto[i];
break;
}
}
if (lookup) return "reference:" + lookup.name;
referto.push({ data:data, name:name });
return null;
};


dwr.engine._serializeObject = function(batch, referto, data, name) {
var ref = dwr.engine._lookup(referto, data, name);
if (ref) return ref;



if (data.nodeName && data.nodeType) {
return dwr.engine._serializeXml(batch, referto, data, name);
}


var reply = "Object_" + dwr.engine._getObjectClassName(data) + ":{";
var element;
for (element in data) {
if (typeof data[element] != "function") {
batch.paramCount++;
var childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount;
dwr.engine._serializeAll(batch, referto, data[element], childName);

reply += encodeURIComponent(element) + ":reference:" + childName + ", ";
}
}

if (reply.substring(reply.length - 2) == ", ") {
reply = reply.substring(0, reply.length - 2);
}
reply += "}";

return reply;
};


dwr.engine._errorClasses = { "Error":Error, "EvalError":EvalError, "RangeError":RangeError, "ReferenceError":ReferenceError, "SyntaxError":SyntaxError, "TypeError":TypeError, "URIError":URIError };
dwr.engine._getObjectClassName = function(obj) {


if (obj && obj.constructor && obj.constructor.toString)
{
var str = obj.constructor.toString();
var regexpmatch = str.match(/function\s+(\w+)/);
if (regexpmatch && regexpmatch.length == 2) {
return regexpmatch[1];
}
}




if (obj && obj.constructor) {
for (var errorname in dwr.engine._errorClasses) {
if (obj.constructor == dwr.engine._errorClasses[errorname]) return errorname;
}
}



if (obj) {
var str = Object.prototype.toString.call(obj);
var regexpmatch = str.match(/\[object\s+(\w+)/);
if (regexpmatch && regexpmatch.length==2) {
return regexpmatch[1];
}
}


return "Object";
};


dwr.engine._serializeXml = function(batch, referto, data, name) {
var ref = dwr.engine._lookup(referto, data, name);
if (ref) return ref;

var output;
if (window.XMLSerializer) output = new XMLSerializer().serializeToString(data);
else if (data.toXml) output = data.toXml;
else output = data.innerHTML;

return "XML:" + encodeURIComponent(output);
};


dwr.engine._serializeArray = function(batch, referto, data, name) {
var ref = dwr.engine._lookup(referto, data, name);
if (ref) return ref;

var reply = "Array:[";
for (var i = 0; i < data.length; i++) {
if (i != 0) reply += ",";
batch.paramCount++;
var childName = "c" + dwr.engine._batch.map.callCount + "-e" + batch.paramCount;
dwr.engine._serializeAll(batch, referto, data[i], childName);
reply += "reference:";
reply += childName;
}
reply += "]";

return reply;
};


dwr.engine._unserializeDocument = function(xml) {
var dom;
if (window.DOMParser) {
var parser = new DOMParser();
dom = parser.parseFromString(xml, "text/xml");
if (!dom.documentElement || dom.documentElement.tagName == "parsererror") {
var message = dom.documentElement.firstChild.data;
message += "\n" + dom.documentElement.firstChild.nextSibling.firstChild.data;
throw message;
}
return dom;
}
else if (window.ActiveXObject) {
dom = dwr.engine._newActiveXObject(dwr.engine._DOMDocument);
dom.loadXML(xml);
return dom;
}
else {
var div = document.createElement("div");
div.innerHTML = xml;
return div;
}
};


dwr.engine._newActiveXObject = function(axarray) {
var returnValue;
for (var i = 0; i < axarray.length; i++) {
try {
returnValue = new ActiveXObject(axarray[i]);
break;
}
catch (ex) {   }
}
return returnValue;
};


dwr.engine._debug = function(message, stacktrace) {
var written = false;
try {
if (window.console) {
if (stacktrace && window.console.trace) window.console.trace();
window.console.log(message);
written = true;
}
else if (window.opera && window.opera.postError) {
window.opera.postError(message);
written = true;
}
}
catch (ex) {   }

if (!written) {
var debug = document.getElementById("dwr-debug");
if (debug) {
var contents = message + "<br/>" + debug.innerHTML;
if (contents.length > 2048) contents = contents.substring(0, 2048);
debug.innerHTML = contents;
}
}
};

String.implement({
	startsWith: function(str) {
		return this.indexOf(str)==0;
	},
	endsWith: function(str) {
		return this.lastIndexOf(str)==this.length-str.length;
	},
	substringBefore: function(str) {
		return this.substring(0,this.indexOf(str));
	},
	substringAfter: function(str) {
		return this.substring(this.indexOf(str)+str.length,this.length);
	},
	substringBetween: function(a,b) {
		return this.substring(this.indexOf(a)+a.length,this.indexOf(b));
	},
	removeXml: function() {
		return this.replace(/<(.|\n)*?>/g,'');
	},
	stripLinks: function() {
		return this.replace(/(<a[^>]*>|<\/a>)/gi,'');
	},
	isNumeric: function() {
		return this.match(/^[0-9]*(\.)?[0-9]+$/);
	},
	isBoolean: function() {
		return this.match(/^(true|false)$/);
	},
	urlFormat: function() {
		return this.replace(/[ \/]/, '-').replace(/[\\"'?#]/, '');
	}
});

Element.implement({
	uFormats: function() {
		return this.retrieve('uFormats') || (function(el){
			var uFormats = {};
			(el.title ? el.title.split(',') : el.className.split(' ')).each(function(uFormat){
				uFormat = uFormat.split(':');
				uKey = uFormat[0];
				uValue = uFormat[1];
				if (uValue) {
					if (uValue.startsWith('(s)')) uValue = uValue.replace('(s)','');
					else if (uValue.isNumeric())  uValue = +uValue;
					else if (uValue.isBoolean())  uValue = uValue == 'true';
					uFormats[uKey] = uValue;
				}
			});
			el.erase('title').store('uFormats', uFormats);
			return uFormats;
		})(this);
	},
	show: function(force) {
		try {
		if (force || this.getStyle('display') == 'none') WebShop.initialize(this.removeClass('hide').setStyle('display', this.retrieve('show:display') || ''));
		} catch(e) {}
		return this;
	},
	hide: function(force) {
		try {
		if (force || this.getStyle('display') != 'none') {
			if (this.parentNode) this.store('show:display', this.getStyle('display'));
			this.addClass('hide').setStyle('display', 'none');
		}
		} catch(e) {}
		return this;
	},
	toggleDisplay: function() {
		return this[this.getStyle('display') == 'none' ? 'show' : 'hide'](true);
	},
	toggleVisibility: function() {
		this.setStyle('visibility', this.getStyle('visibility') == 'hidden' ? 'visible' : 'hidden');
		return this;
	},
	getActualSize: function() {
		if (this.offsetWidth && this.offsetHeight) return this.getSize();
		var clone = this.clone(true).setStyles(this.getStyles('font-family','font-size','line-height','padding','border-width','border-style')).setStyles({
			'position': 'absolute',
			'top': '-1000px'
		}).inject(document.body);
		var size = clone.getSize();
		clone.dispose();
		return size;
	},
	getHeight: function() {
		return this.getActualSize().y;
	},
	getWidth: function() {
		return this.getActualSize().x;
	},
	getText: function() {
		var nodeValue = '';
		Array.each(this.childNodes, function(node) {
			nodeValue += (node.nodeType == 3 ? node.nodeValue : $(node).getText());
		});
		return nodeValue;
	},
	createNew: function(klass, args) {
		klass = new Class({
			Extends: klass,
			initialize: function(args){
				return this.parent.pass(args)();
			}
		});
		args = [this].extend($splat(args));
		return new klass(args);
	},
	copyValue: function(){
		if (window.clipboardData) window.clipboardData.setData('Text', this.value);
		else if (Browser.Plugins.Flash.version >= 10) {
			this.select();
			WebShop.error('A security update in Flash 10 is preventing the site from accessing your clipboard.  Right click the field to copy the URL.')
		} else {
			var flashcopier = $('flashcopier') || new Element('div', { id: 'flashcopier', style: 'position:absolute; top:-20px;' }).inject(document.body);
			new Swiff(context+'/scripts/_clipboard.swf', { container: flashcopier.empty(), vars: { clipboard: this.value }, params: { wMode: '' } });
		}
		return this;
	}
});

Element.Properties.disabled = {set: function(disabled){
	this.disabled = disabled;
	if (disabled) document.fireEvent('mouseout', { type: 'mouseout', target: this });
	return this;
}};

if (Browser.Engine.trident && Browser.Engine.version < 6) {
	Element.Properties.html = {set: function(){
		var el = this.hasClass('ie-button') ? this.getElement('.ie-border') : this;
		return el.innerHTML = Array.flatten(arguments).join('');
	}};
}

Element.Styles.extend({
	outlineWidth: '@px', outlineStyle: '@', outlineColor: 'rgb(@, @, @)', outlineColorAlpha: 'rgba(@, @, @, %)'	
});
Element.ShortStyles.outline = {};

Number.implement({
	between: function(min, max){
		return this >= min && this <= max;
	}
});

Options.setOptions = function(klass, options) {
	Hash.extend(klass.prototype.options, options);
};

RegExp.cache = function(pattern, modifiers){
	var key = ['/',pattern,'/',(modifiers||'')].join();
	return RegExp.cache[key] || (RegExp.cache[key] = new RegExp(pattern, modifiers));
};

/*

Date.implement({
	format: function(format, selector) {
		var length = format.match(/short|medium|long|full/);
		return dojo.date.locale.format(this, Hash.extend({ selector: selector }, length ? { formatLength: length } : { datePattern: format[0] || format, timeFormat: format[1] || null }));
	},
	add: function(unit, amount) {
		this.setTime(this.getTime() + amount*(Date[unit.toUpperCase()]));
		return this;
	},
	compare: function(date) {
		return dojo.date.compare(this, date);
	},
	toISO: function(selector) {
		return dojo.date.locale.format(this, { selector: selector, datePattern: 'yyyy-MM-dd', timePattern: 'HH:mm:ss' });
	}
});

Date.parse = function(string, format) {
	if (format && Object.type(format)) return dojo.date.locale.parse(string, format);
	var selector = format;
	var lengths = ['full','long','medium','short'], date;
	for (var i = 0; i < 4; i++) if ((date = dojo.date.locale.parse(string, { selector: selector, formatLength: lengths[i] }))) return date;
	var patterns = { date: 'yyyy-MM-dd', time: 'HH:mm:ss', datetime: 'yyyy-MM-dd HH:mm:ss'};
	if (patterns[selector]) patterns = Hash.filter(patterns, function(v,k){ return k == selector; });
	for (selector in patterns) if ((date = dojo.date.locale.parse(string, { selector: 'date', datePattern: patterns[selector] }))) return date;
	return false;
};

Date.getTime = function(string, force, format) {
	return (date = Date.parse(string, format)) ? date.getTime() - (format == 'time' ? 21600000 : 0) : (force ? -62135575200001 : NaN);
};

*/

Date.Lengths = [ 'full', 'long', 'medium', 'short' ];
Date.Patterns = { date: 'yyyy-MM-dd', time: 'HH:mm:ss', datetime: 'yyyy-MM-dd HH:mm:ss', month: 'yyyy-MM', week: 'yyyy-ww' };

Date.implement({
	format: function(format, selector) {
		selector = selector || 'date';
		if (Object.type(format))
			return dojo.date.locale.format(this, format);
		if (Date.Lengths.contains(format))
			return dojo.date.locale.format(this, { selector: selector, formatLength: format });
		if (Date.Patterns[format])
			return dojo.date.locale.format(this, { selector: selector, datePattern: Date.Patterns[format] });
		if (Array.type(format))
			return dojo.date.locale.format(this, { selector: selector, datePattern: format[0], timeFormat: format[1] });
		if (String.type(format))
			return dojo.date.locale.format(this, { selector: selector, datePattern: format });
		return '';
	},
	add: function(unit, amount) {
		return dojo.date.add(this, unit, amount);
	},
	compare: function(date) {
		return dojo.date.compare(this, date);
	},
	toISO: function(type) {
		return dojo.date.locale.format(this, { selector: 'date', datePattern: Date.Patterns[type] || Date.Patterns['date'] });
	}
});

Date.parse = function(string, format, selector) {
	if (!string) return false;
	if (string == '0001-01-01') return null;
	selector = selector || 'date';
	if (format) {
		if (String.type(format)) {
			if (Date.Lengths.contains(format))
				return dojo.date.locale.parse(string, { selector: selector, formatLength: format });
			if (Date.Patterns[format]) {
				if (format == 'time') string = string.substring(0, 8);
				if (format == 'datetime') string = string.substring(0, 19);
				return dojo.date.locale.parse(string, { selector: selector, datePattern: Date.Patterns[format] });
			}
			return dojo.date.locale.parse(string, { selector: selector, datePattern: format });
		}
		if (Object.type(format))
			return dojo.date.locale.parse(string, format);
		if (Array.type(format))
			return dojo.date.locale.parse(string, { selector: selector, datePattern: format[0], timeFormat: format[1] });
	} else {
		var date, temp;
		for (var i = 0; i < 4; i++) if ((date = dojo.date.locale.parse(string, { selector: selector, formatLength: Date.Lengths[i] }))) return date;
		for (type in Date.Patterns) {
			temp = string;
			if (type == 'time') temp = string.substring(0, 8);
			if (type == 'datetime') temp = string.substring(0, 19);
			if ((date = dojo.date.locale.parse(temp, { selector: selector, datePattern: Date.Patterns[type] }))) return date;
		}
	}
	return false;
};

Date.getTime = function(string, force, format) {
	var date;
	return (date = Date.parse(string, format)) ? date.getTime() - date.getTimezoneOffset() * Date.MINUTE : (force ? -62135575200001 : NaN);
};

Date.reformat = function(string, format) {
	var date;
	return (date = Date.parse(string)) ? date.format(format) : '';
};

Date.SECOND = 1000;
Date.MINUTE = 60000;
Date.HOUR = 3600000;
Date.DAY = 86400000;
Date.YEAR = 31536000000;

var $el = function(tag, props) { return new Element(tag, props); };
var $div = function(props) { return new Element('div', props); };
var $br = function() { return document.createElement('br'); };
var $button = function(span, a) {
	if (!a) { a = span; span = {}; }
	return $el('span', { 'class': 'button' }).set(span).grab($el('a', { 'class': 'glass' }).set(a));
};
/*!
 * Sizzle CSS Selector Engine - v0.9.1
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){

var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,
	done = 0,
	toString = Object.prototype.toString;

var Sizzle = function(selector, context, results, seed) {
	results = results || [];
	context = context || document;

	if ( context.nodeType !== 1 && context.nodeType !== 9 )
		return [];
	
	if ( !selector || typeof selector !== "string" ) {
		return results;
	}

	var parts = [], m, set, checkSet, check, mode, extra, prune = true;
	
	// Reset the position of the chunker regexp (start from head)
	chunker.lastIndex = 0;
	
	while ( (m = chunker.exec(selector)) !== null ) {
		parts.push( m[1] );
		
		if ( m[2] ) {
			extra = RegExp.rightContext;
			break;
		}
	}

	if ( parts.length > 1 && origPOS.exec( selector ) ) {
		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
			set = posProcess( parts[0] + parts[1], context );
		} else {
			set = Expr.relative[ parts[0] ] ?
				[ context ] :
				Sizzle( parts.shift(), context );

			while ( parts.length ) {
				selector = parts.shift();

				if ( Expr.relative[ selector ] )
					selector += parts.shift();

				set = posProcess( selector, set );
			}
		}
	} else {
		var ret = seed ?
			{ expr: parts.pop(), set: makeArray(seed) } :
			Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context );
		set = Sizzle.filter( ret.expr, ret.set );

		if ( parts.length > 0 ) {
			checkSet = makeArray(set);
		} else {
			prune = false;
		}

		while ( parts.length ) {
			var cur = parts.pop(), pop = cur;

			if ( !Expr.relative[ cur ] ) {
				cur = "";
			} else {
				pop = parts.pop();
			}

			if ( pop == null ) {
				pop = context;
			}

			Expr.relative[ cur ]( checkSet, pop, isXML(context) );
		}
	}

	if ( !checkSet ) {
		checkSet = set;
	}

	if ( !checkSet ) {
		throw "Syntax error, unrecognized expression: " + (cur || selector);
	}

	if ( toString.call(checkSet) === "[object Array]" ) {
		if ( !prune ) {
			results.push.apply( results, checkSet );
		} else if ( context.nodeType === 1 ) {
			for ( var i = 0; checkSet[i] != null; i++ ) {
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
					results.push( set[i] );
				}
			}
		} else {
			for ( var i = 0; checkSet[i] != null; i++ ) {
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
					results.push( set[i] );
				}
			}
		}
	} else {
		makeArray( checkSet, results );
	}

	if ( extra ) {
		Sizzle( extra, context, results, seed );
	}

	return results;
};

Sizzle.matches = function(expr, set){
	return Sizzle(expr, null, null, set);
};

Sizzle.find = function(expr, context){
	var set, match;

	if ( !expr ) {
		return [];
	}

	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
		var type = Expr.order[i], match;
		
		if ( (match = Expr.match[ type ].exec( expr )) ) {
			var left = RegExp.leftContext;

			if ( left.substr( left.length - 1 ) !== "\\" ) {
				match[1] = (match[1] || "").replace(/\\/g, "");
				set = Expr.find[ type ]( match, context );
				if ( set != null ) {
					expr = expr.replace( Expr.match[ type ], "" );
					break;
				}
			}
		}
	}

	if ( !set ) {
		set = context.getElementsByTagName("*");
	}

	return {set: set, expr: expr};
};

Sizzle.filter = function(expr, set, inplace, not){
	var old = expr, result = [], curLoop = set, match, anyFound;

	while ( expr && set.length ) {
		for ( var type in Expr.filter ) {
			if ( (match = Expr.match[ type ].exec( expr )) != null ) {
				var filter = Expr.filter[ type ], found, item;
				anyFound = false;

				if ( curLoop == result ) {
					result = [];
				}

				if ( Expr.preFilter[ type ] ) {
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not );

					if ( !match ) {
						anyFound = found = true;
					} else if ( match === true ) {
						continue;
					}
				}

				if ( match ) {
					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
						if ( item ) {
							found = filter( item, match, i, curLoop );
							var pass = not ^ !!found;

							if ( inplace && found != null ) {
								if ( pass ) {
									anyFound = true;
								} else {
									curLoop[i] = false;
								}
							} else if ( pass ) {
								result.push( item );
								anyFound = true;
							}
						}
					}
				}

				if ( found !== undefined ) {
					if ( !inplace ) {
						curLoop = result;
					}

					expr = expr.replace( Expr.match[ type ], "" );

					if ( !anyFound ) {
						return [];
					}

					break;
				}
			}
		}

		expr = expr.replace(/\s*,\s*/, "");

		// Improper expression
		if ( expr == old ) {
			if ( anyFound == null ) {
				throw "Syntax error, unrecognized expression: " + expr;
			} else {
				break;
			}
		}

		old = expr;
	}

	return curLoop;
};

var Expr = Sizzle.selectors = {
	order: [ "ID", "NAME", "TAG" ],
	match: {
		ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
		CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
		TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
		PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
	},
	attrMap: {
		"class": "className",
		"for": "htmlFor"
	},
	attrHandle: {
		href: function(elem){
			return elem.getAttribute("href");
		}
	},
	relative: {
		"+": function(checkSet, part){
			for ( var i = 0, l = checkSet.length; i < l; i++ ) {
				var elem = checkSet[i];
				if ( elem ) {
					var cur = elem.previousSibling;
					while ( cur && cur.nodeType !== 1 ) {
						cur = cur.previousSibling;
					}
					checkSet[i] = typeof part === "string" ?
						cur || false :
						cur === part;
				}
			}

			if ( typeof part === "string" ) {
				Sizzle.filter( part, checkSet, true );
			}
		},
		">": function(checkSet, part, isXML){
			if ( typeof part === "string" && !/\W/.test(part) ) {
				part = isXML ? part : part.toUpperCase();

				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
					var elem = checkSet[i];
					if ( elem ) {
						var parent = elem.parentNode;
						checkSet[i] = parent.nodeName === part ? parent : false;
					}
				}
			} else {
				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
					var elem = checkSet[i];
					if ( elem ) {
						checkSet[i] = typeof part === "string" ?
							elem.parentNode :
							elem.parentNode === part;
					}
				}

				if ( typeof part === "string" ) {
					Sizzle.filter( part, checkSet, true );
				}
			}
		},
		"": function(checkSet, part, isXML){
			var doneName = "done" + (done++), checkFn = dirCheck;

			if ( !part.match(/\W/) ) {
				var nodeCheck = part = isXML ? part : part.toUpperCase();
				checkFn = dirNodeCheck;
			}

			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
		},
		"~": function(checkSet, part, isXML){
			var doneName = "done" + (done++), checkFn = dirCheck;

			if ( typeof part === "string" && !part.match(/\W/) ) {
				var nodeCheck = part = isXML ? part : part.toUpperCase();
				checkFn = dirNodeCheck;
			}

			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
		}
	},
	find: {
		ID: function(match, context){
			if ( context.getElementById ) {
				var m = context.getElementById(match[1]);
				return m ? [m] : [];
			}
		},
		NAME: function(match, context){
			return context.getElementsByName ? context.getElementsByName(match[1]) : null;
		},
		TAG: function(match, context){
			return context.getElementsByTagName(match[1]);
		}
	},
	preFilter: {
		CLASS: function(match, curLoop, inplace, result, not){
			match = " " + match[1].replace(/\\/g, "") + " ";

			for ( var i = 0; curLoop[i] != null; i++ ) {
				if ( curLoop[i] ) {
					if ( not ^ (" " + curLoop[i].className + " ").indexOf(match) >= 0 ) {
						if ( !inplace )
							result.push( curLoop[i] );
					} else if ( inplace ) {
						curLoop[i] = false;
					}
				}
			}

			return false;
		},
		ID: function(match){
			return match[1].replace(/\\/g, "");
		},
		TAG: function(match, curLoop){
			for ( var i = 0; curLoop[i] === false; i++ ){}
			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
		},
		CHILD: function(match){
			if ( match[1] == "nth" ) {
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);

				// calculate the numbers (first)n+(last) including if they are negative
				match[2] = (test[1] + (test[2] || 1)) - 0;
				match[3] = test[3] - 0;
			}

			// TODO: Move to normal caching system
			match[0] = "done" + (done++);

			return match;
		},
		ATTR: function(match){
			var name = match[1].replace(/\\/g, "");
			
			if ( Expr.attrMap[name] ) {
				match[1] = Expr.attrMap[name];
			}

			if ( match[2] === "~=" ) {
				match[4] = " " + match[4] + " ";
			}

			return match;
		},
		PSEUDO: function(match, curLoop, inplace, result, not){
			if ( match[1] === "not" ) {
				// If we're dealing with a complex expression, or a simple one
				if ( match[3].match(chunker).length > 1 ) {
					match[3] = Sizzle(match[3], null, null, curLoop);
				} else {
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
					if ( !inplace ) {
						result.push.apply( result, ret );
					}
					return false;
				}
			} else if ( Expr.match.POS.test( match[0] ) ) {
				return true;
			}
			
			return match;
		},
		POS: function(match){
			match.unshift( true );
			return match;
		}
	},
	filters: {
		enabled: function(elem){
			return elem.disabled === false && elem.type !== "hidden";
		},
		disabled: function(elem){
			return elem.disabled === true;
		},
		checked: function(elem){
			return elem.checked === true;
		},
		selected: function(elem){
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			elem.parentNode.selectedIndex;
			return elem.selected === true;
		},
		parent: function(elem){
			return !!elem.firstChild;
		},
		empty: function(elem){
			return !elem.firstChild;
		},
		has: function(elem, i, match){
			return !!Sizzle( match[3], elem ).length;
		},
		header: function(elem){
			return /h\d/i.test( elem.nodeName );
		},
		text: function(elem){
			return "text" === elem.type;
		},
		radio: function(elem){
			return "radio" === elem.type;
		},
		checkbox: function(elem){
			return "checkbox" === elem.type;
		},
		file: function(elem){
			return "file" === elem.type;
		},
		password: function(elem){
			return "password" === elem.type;
		},
		submit: function(elem){
			return "submit" === elem.type;
		},
		image: function(elem){
			return "image" === elem.type;
		},
		reset: function(elem){
			return "reset" === elem.type;
		},
		button: function(elem){
			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
		},
		input: function(elem){
			return /input|select|textarea|button/i.test(elem.nodeName);
		}
	},
	setFilters: {
		first: function(elem, i){
			return i === 0;
		},
		last: function(elem, i, match, array){
			return i === array.length - 1;
		},
		even: function(elem, i){
			return i % 2 === 0;
		},
		odd: function(elem, i){
			return i % 2 === 1;
		},
		lt: function(elem, i, match){
			return i < match[3] - 0;
		},
		gt: function(elem, i, match){
			return i > match[3] - 0;
		},
		nth: function(elem, i, match){
			return match[3] - 0 == i;
		},
		eq: function(elem, i, match){
			return match[3] - 0 == i;
		}
	},
	filter: {
		CHILD: function(elem, match){
			var type = match[1], parent = elem.parentNode;

			var doneName = "child" + parent.childNodes.length;
			
			if ( parent && (!parent[ doneName ] || !elem.nodeIndex) ) {
				var count = 1;

				for ( var node = parent.firstChild; node; node = node.nextSibling ) {
					if ( node.nodeType == 1 ) {
						node.nodeIndex = count++;
					}
				}

				parent[ doneName ] = count - 1;
			}

			if ( type == "first" ) {
				return elem.nodeIndex == 1;
			} else if ( type == "last" ) {
				return elem.nodeIndex == parent[ doneName ];
			} else if ( type == "only" ) {
				return parent[ doneName ] == 1;
			} else if ( type == "nth" ) {
				var add = false, first = match[2], last = match[3];

				if ( first == 1 && last == 0 ) {
					return true;
				}

				if ( first == 0 ) {
					if ( elem.nodeIndex == last ) {
						add = true;
					}
				} else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) {
					add = true;
				}

				return add;
			}
		},
		PSEUDO: function(elem, match, i, array){
			var name = match[1], filter = Expr.filters[ name ];

			if ( filter ) {
				return filter( elem, i, match, array );
			} else if ( name === "contains" ) {
				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
			} else if ( name === "not" ) {
				var not = match[3];

				for ( var i = 0, l = not.length; i < l; i++ ) {
					if ( not[i] === elem ) {
						return false;
					}
				}

				return true;
			}
		},
		ID: function(elem, match){
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
		},
		TAG: function(elem, match){
			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
		},
		CLASS: function(elem, match){
			return match.test( elem.className );
		},
		ATTR: function(elem, match){
			var result = Expr.attrHandle[ match[1] ] ? Expr.attrHandle[ match[1] ]( elem ) : elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4];
			return result == null ?
				false :
				type === "=" ?
				value === check :
				type === "*=" ?
				value.indexOf(check) >= 0 :
				type === "~=" ?
				(" " + value + " ").indexOf(check) >= 0 :
				!match[4] ?
				result :
				type === "!=" ?
				value != check :
				type === "^=" ?
				value.indexOf(check) === 0 :
				type === "$=" ?
				value.substr(value.length - check.length) === check :
				type === "|=" ?
				value === check || value.substr(0, check.length + 1) === check + "-" :
				false;
		},
		POS: function(elem, match, i, array){
			var name = match[2], filter = Expr.setFilters[ name ];

			if ( filter ) {
				return filter( elem, i, match, array );
			}
		}
	}
};

var origPOS = Expr.match.POS;

for ( var type in Expr.match ) {
	Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
}

var makeArray = function(array, results) {
	array = Array.prototype.slice.call( array );

	if ( results ) {
		results.push.apply( results, array );
		return results;
	}
	
	return array;
};

// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
try {
	Array.prototype.slice.call( document.documentElement.childNodes );

// Provide a fallback method if it does not work
} catch(e){
	makeArray = function(array, results) {
		var ret = results || [];

		if ( toString.call(array) === "[object Array]" ) {
			Array.prototype.push.apply( ret, array );
		} else {
			if ( typeof array.length === "number" ) {
				for ( var i = 0, l = array.length; i < l; i++ ) {
					ret.push( array[i] );
				}
			} else {
				for ( var i = 0; array[i]; i++ ) {
					ret.push( array[i] );
				}
			}
		}

		return ret;
	};
}

// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
	// We're going to inject a fake input element with a specified name
	var form = document.createElement("form"),
		id = "script" + (new Date).getTime();
	form.innerHTML = "<input name='" + id + "'/>";

	// Inject it into the root element, check its status, and remove it quickly
	var root = document.documentElement;
	root.insertBefore( form, root.firstChild );

	// The workaround has to do additional checks after a getElementById
	// Which slows things down for other browsers (hence the branching)
	if ( !!document.getElementById( id ) ) {
		Expr.find.ID = function(match, context){
			if ( context.getElementById ) {
				var m = context.getElementById(match[1]);
				return m ? m.id === match[1] || m.getAttributeNode && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
			}
		};

		Expr.filter.ID = function(elem, match){
			var node = elem.getAttributeNode && elem.getAttributeNode("id");
			return elem.nodeType === 1 && node && node.nodeValue === match;
		};
	}

	root.removeChild( form );
})();

(function(){
	// Check to see if the browser returns only elements
	// when doing getElementsByTagName("*")

	// Create a fake element
	var div = document.createElement("div");
	div.appendChild( document.createComment("") );

	// Make sure no comments are found
	if ( div.getElementsByTagName("*").length > 0 ) {
		Expr.find.TAG = function(match, context){
			var results = context.getElementsByTagName(match[1]);

			// Filter out possible comments
			if ( match[1] === "*" ) {
				var tmp = [];

				for ( var i = 0; results[i]; i++ ) {
					if ( results[i].nodeType === 1 ) {
						tmp.push( results[i] );
					}
				}

				results = tmp;
			}

			return results;
		};
	}

	// Check to see if an attribute returns normalized href attributes
	div.innerHTML = "<a href='#'></a>";
	if ( div.firstChild.getAttribute("href") !== "#" ) {
		Expr.attrHandle.href = function(elem){
			return elem.getAttribute("href", 2);
		};
	}
})();

if ( document.querySelectorAll ) (function(){
	var oldSizzle = Sizzle;
	
	Sizzle = function(query, context, extra, seed){
		context = context || document;

		if ( !seed && context.nodeType === 9 ) {
			try {
				return makeArray( context.querySelectorAll(query), extra );
			} catch(e){}
		}
		
		return oldSizzle(query, context, extra, seed);
	};

	Sizzle.find = oldSizzle.find;
	Sizzle.filter = oldSizzle.filter;
	Sizzle.selectors = oldSizzle.selectors;
	Sizzle.matches = oldSizzle.matches;
})();

if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) {
	Expr.order.splice(1, 0, "CLASS");
	Expr.find.CLASS = function(match, context) {
		return context.getElementsByClassName(match[1]);
	};
}

function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
		var elem = checkSet[i];
		if ( elem ) {
			elem = elem[dir];
			var match = false;

			while ( elem && elem.nodeType ) {
				var done = elem[doneName];
				if ( done ) {
					match = checkSet[ done ];
					break;
				}

				if ( elem.nodeType === 1 && !isXML )
					elem[doneName] = i;

				if ( elem.nodeName === cur ) {
					match = elem;
					break;
				}

				elem = elem[dir];
			}

			checkSet[i] = match;
		}
	}
}

function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
		var elem = checkSet[i];
		if ( elem ) {
			elem = elem[dir];
			var match = false;

			while ( elem && elem.nodeType ) {
				if ( elem[doneName] ) {
					match = checkSet[ elem[doneName] ];
					break;
				}

				if ( elem.nodeType === 1 ) {
					if ( !isXML )
						elem[doneName] = i;

					if ( typeof cur !== "string" ) {
						if ( elem === cur ) {
							match = true;
							break;
						}

					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
						match = elem;
						break;
					}
				}

				elem = elem[dir];
			}

			checkSet[i] = match;
		}
	}
}

var contains = document.compareDocumentPosition ?  function(a, b){
	return a.compareDocumentPosition(b) & 16;
} : function(a, b){
	return a !== b && (a.contains ? a.contains(b) : true);
};

var isXML = function(elem){
	return elem.documentElement && !elem.body ||
		elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
};

var posProcess = function(selector, context){
	var tmpSet = [], later = "", match,
		root = context.nodeType ? [context] : context;

	// Position selectors must be done after the filter
	// And so must :not(positional) so we move all PSEUDOs to the end
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
		later += match[0];
		selector = selector.replace( Expr.match.PSEUDO, "" );
	}

	selector = Expr.relative[selector] ? selector + "*" : selector;

	for ( var i = 0, l = root.length; i < l; i++ ) {
		Sizzle( selector, root[i], tmpSet );
	}

	return Sizzle.filter( later, tmpSet );
}

// EXPOSE

window.Sizzle = Sizzle;


// Integrate With MooTools

Native.implement([Document, Element], {
	
	getElements: function(expression, nocash){
		return new Elements(Sizzle(expression, this));
	}
	
});

/* matches function is SLOW!
Element.implement({
	
	match: function(expression){
		return !expression || Sizzle.matches(expression, [this]).length > 0;
	}
	
});*/

})();
(function(){
	
	var delegateEvents = function(handlers, type, event) {
		event = new Event(event);
		if (event.type == 'click' && event.rightClick) return;
		for (var selector in handlers) {
			if (!handlers.hasOwnProperty(selector)) continue;
			for (var a=0, l=handlers[selector].length; a<l; a++) {
				var handler = handlers[selector][a];
				var depth = (handler.depth < 0) ? 100 : handler.depth;
				var el = event.target;
				for (var b=-1; b<depth && el; b++, el=el.parentNode) {
					if (el.nodeType == 1 && Element.match(el, selector)) {
						if (el.disabled) break;
						if (handler.condition && !handler.condition.call($(el),event)) break;
						if (handler.fn.call($(el),event) === false) event.preventDefault();
						break;
					}
				}
			}
		}
	};
	
	Native.implement([Document, Element], {
		registerEvent: function(selector, type, fn, depth) {
			if (!fn) return;
			if (String.type(depth)) depth = depth.toInt();
			depth = $chk(depth) ? depth : -1;
			var eventHandlers = this.retrieve('eventHandlers', {});
			var realType = type, custom = Element.Events.get(type), condition, focus = type.match(/focus|blur/);
			if (custom){
				if (custom.condition) condition = custom.condition;
				if (custom.base) realType = custom.base;
			}
			if (focus && typeof document.onactivate == 'object') realType = (type == 'focus') ? 'activate' : 'deactivate';
			if (!eventHandlers[type]) {
				eventHandlers[type] = {};
				this.addEvent(realType, function(event){ delegateEvents(eventHandlers[type], type, event); }, focus);
			}
			var array = selector.split(',');
			var i = array.length; while (i--) {
				selector = array[i].trim();
				if (!eventHandlers[type][selector]) eventHandlers[type][selector]=[];
				eventHandlers[type][selector].push({ fn:fn, condition:condition, depth:depth });
			}
			
		},
		unregisterEvent: function(selector, type, fn) {
			var eventHandlers = this.retrieve('eventHandlers', {});
			var handlers = eventHandlers[type][selector];
			if (fn) {
				for (var i = handlers.length; i--; i){
					if (handlers[i].fn === fn) {
						handlers.splice(i, 1);
						break;
					}
				}
				if (handlers.length == 0) delete handlers;
			} else {
				delete handlers;
			}
			if (eventHandlers[type].length == 0) delete eventHandlers[type];
		},
		registerEvents: function(selector, handlers, depth) {
			for (var type in handlers) this.registerEvent(selector, type, handlers[type], depth);
		},
		unregisterEvents: function(selector, handlers) {
			for (var type in handlers) this.unregisterEvent(selector, type, handlers[type]);
		},
		linkEvents: function(selector, relatedSelector) {
			var eventLinks = this.retrieve('eventLinks', {});
						
		}
	});
	
	Selectors.RegExps.matcher = /(.*[^\s>+~])\s*([\s>+~](?![^\[]*\]))\s*([^\s>+~].*)/;
	Selectors.Cache.matcher = {};

	Element.implement({
		
		match: function(selector){
			if (!selector || (selector == this)) return true;
			
			var selectors = Selectors.Cache.matcher[selector];
			if (selectors === undefined) selectors = (Selectors.Cache.matcher[selector] = Selectors.RegExps.matcher.exec(selector));
			if (selectors) selector = selectors[3];
			
			var tagid = Selectors.Utils.parseTagAndID(selector);
			var tag = tagid[0], id = tagid[1];
			if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false;
			var parsed = Selectors.Utils.parseSelector(selector);
			var match = (!parsed || Selectors.Utils.filter(this, parsed, {})) ? this : null;
			
			if (match && selectors) switch(selectors[2]) {
				case ' ': match = Element.getParent(match, selectors[1]); break;
				case '>': match = Element.getParent(match); if (!Element.match(match, selectors[1])) match = null; break;
				case '+': match = Element.getPrevious(match); if (!Element.match(match, selectors[1])) match = null; break;
				case '~': match = Element.getPrevious(match, selectors[1]); break;
			}
			
			return !!match;
		}
		
	});
	
	// Fix IE Non-Bubbling Form Events
	if (Browser.Engine.trident) {
		var relayEvent = function(event) {
			document.fireEvent(event.type, event);
		}
		document.registerEvent('form', 'focus', function(e) {
			if (!this.retrieve('relay:submit')) {
				this.store('onsubmit', this.onsubmit);
				this.onsubmit = null;
				this.addEvent('submit', this.retrieve('relay:submit', relayEvent));
				this.addEvent('reset' , this.retrieve('relay:reset' , relayEvent));
			}
		});
		document.registerEvent('input,select,textarea', 'focus', function(e) {
			if (!this.retrieve('relay:change')) {
				this.addEvent('change', this.retrieve('relay:change', relayEvent));
				this.addEvent('select', this.retrieve('relay:select', relayEvent));
			}
		});
	}
	
})();
(function(){
	
	var init = function(el, styles) {
		if (!el.retrieve('coz:init')) {
			el.store('coz:init', true);
			el.setStyles(styles.base);
		}
	};
	
	var start = function(el, styles, options) {
		if (options.duration == 0) {
			el.get('morph').cancel();
			el.setStyles(styles);
		} else {
			el.get('morph', options).start(styles);
		}
	};
	
	var getChildren = function(el, selector) {
		selector = selector.split(/\s/);
		if (selector.length == 1) {
			return el.getElements(selector[0]) || new Elements([]);
		} else switch(selector[0]) {
			case '>': return el.getChildren(selector[1]) || new Elements([]);
			case '+': return el.getNext(selector[1]) || new Elements([]);
			case '~': return el.getAllNext(selector[1]) || new Elements([]);
		}
	};
	
	var transitions = {
			
		mouseenter: function(el, styles, options) {
			init(el, styles);
			el.store('hovered', true);
			var style = (el.retrieve('focused') && styles['hover:focus']) ? styles['hover:focus'] : styles['hover'];
			start(el, style, options.to || options);
		},
		mouseleave: function(el, styles, options) {
			init(el, styles);
			el.eliminate('hovered');
			var style = (el.retrieve('focused') && styles['focus']) ? styles['focus'] : styles['base'];
			start(el, style, options.from || options);
		},
		focus: function(el, styles, options) {
			init(el, styles);
			el.store('focused', true);
			var style = (el.retrieve('hovered') && styles['hover:focus']) ? styles['hover:focus'] : styles['focus'];
			start(el, style, options.to || options);
		},
		blur: function(el, styles, options) {
			init(el, styles);
			el.eliminate('focused');
			var style = (el.retrieve('hovered') && styles['hover']) ? styles['hover'] : styles['base'];
			start(el, style, options.from || options);
		},
		children: {
			mouseenter: function(el, styles, options) {
				el.store('hovered', true);
				for (var selector in styles.children) {
					var child = styles.children[selector];
					var style = (el.retrieve('focused') && child['hover:focus']) ? child['hover:focus'] : child['hover'];
					getChildren(el, selector).each(function(el) { init(el, child); start(el, style, options.to || options); });
				}
			},
			mouseleave: function(el, styles, options) {
				el.eliminate('hovered');
				for (var selector in styles.children) {
					var child = styles.children[selector];
					var style = (el.retrieve('focused') && child['focus']) ? child['focus'] : child['base'];
					getChildren(el, selector).each(function(el) { init(el, child); start(el, style, options.from || options); });
				}
			},
			focus: function(el, styles, options) {
				el.store('focused', true);
				for (var selector in styles.children) {
					var child = styles.children[selector];
					var style = (el.retrieve('hovered') && child['hover:focus']) ? child['hover:focus'] : child['focus'];
					getChildren(el, selector).each(function(el) { init(el, child); start(el, style, options.to || options); });
				}
			},
			blur: function(el, styles, options) {
				el.eliminate('focused');
				for (var selector in styles.children) {
					var child = styles.children[selector];
					var style = (el.retrieve('hovered') && child['hover']) ? child['hover'] : child['base'];
					getChildren(el, selector).each(function(el) { init(el, child); start(el, style, options.from || options); });
				}
			}
		}
	
	};
	
	var checkChildren = function(children, type) {
		if (children) for (var selector in children) {
			if (children[selector][type]) return true;
		}
		return false;
	};

	Document.implement({
		registerTransitions: function(selector, styles, options, depth) {
			if (!options) options = {};
			if (styles.hover) {
				document.registerEvents(selector, {
					mouseenter: function(e) { transitions.mouseenter(this, styles, options); },
					mouseleave: function(e) { transitions.mouseleave(this, styles, options); }
				}, depth);
			}
			if (styles.focus) {
				document.registerEvents(selector, {
					focus: function(e) { transitions.focus(this, styles, options); },
					blur: function(e) { transitions.blur(this, styles, options); }
				}, depth);
			}
			if (styles.active) {
				document.registerEvents(selector, {
					mousedown: function(e) { transitions.mousedown(this, styles, options); },
					mouseup: function(e) { transitions.mouseup(this, styles, options); }
				}, depth);
			}
			if (styles.children) {
				if (checkChildren(styles.children, 'hover')) {
					document.registerEvents(selector, {
						mouseenter: function(e) { transitions.children.mouseenter(this, styles, options); },
						mouseleave: function(e) { transitions.children.mouseleave(this, styles, options); }
					}, depth);
				}
				if (checkChildren(styles.children, 'focus')) {
					document.registerEvents(selector, {
						focus: function(e) { transitions.children.focus(this, styles, options); },
						blur: function(e) { transitions.children.blur(this, styles, options); }
					}, depth);
				}
				if (checkChildren(styles.children, 'active')) {
					document.registerEvents(selector, {
						mousedown: function(e) { transitions.children.mousedown(this, styles, options); },
						mouseup: function(e) { transitions.children.mouseup(this, styles, options); }
					}, depth);
				}
			}
		}
	});

})();
// compatibility
var trim = String.trim;

var WebShop = {
		
	loginRedirect: false,
	logoutRedirect: '/index.do',
	
	start: function() {
		WebShop.tips = new WebShop.Tips();
		WebShop.initialize();
		window.fireEvent('webshopready');
	},
	
	ajaxUnavailable: function() {
		var ajaxAvailable = ajaxEnabled && Browser.Features.xhr;
		this.ajaxUnavailable = function(){
			return !ajaxAvailable;
		};
		return !ajaxAvailable;
	},

	toggleTour: function() {
		var link    = $('tourLink');
		var content = $('tourContent').toggleDisplay();
		var on = content.getStyle('display') != 'none';
		link.set('html', 'Turn guided tour ' + (on ? 'off' : 'on'));
		if (!this.ajaxUnavailable()) ajax.setAttribute('tour', on ? null : 'on');
		return;
	},
	
	page: function(i) {
		var href = window.location.href;
		window.location.href = href.indexOf("page=") > 0 ? href.replace(/page=[\d]*/,"page="+i) : 
							   href+(href.indexOf("?") > 0 ? "&" : "?")+"page="+i;
	},
	
	feedback: function(page, no, ver, ext) {
		window.addEvent('scriptready', function(){ ajax.webFeedback(page, no, ver, ext); });
	},
	
	fixImages: function(parent){
		parent.getElements('img:not([src])').set('src', context+'/images/webshop/transparent.gif');
	},
	
	fixTables: function(parent){
		parent.getElements('table[cellspacing]').each(function(table){
			table.setStyle('border-spacing', table.get('cellspacing')+'px');
			table.setStyle('border-collapse', 'separate');
		});
	},
	
	fixLinks: function(parent){
		if (context == '') return;
		var regexp = RegExp.cache(server.escapeRegExp()+'(?!'+context.escapeRegExp()+')'), match;
		parent.getElements('img').each(function(img){
			if ((match = img.src.match(regexp)))
			img.src = img.src.replace(match, server+context);
		});
		parent.getElements('a:not([class~=glass])').each(function(a){
			if ((match = a.href.match(regexp)))
			a.href = a.href.replace(match, server+context).replace('http://', '//');
		});
	},
	
	initialize: function(parent) {
		parent = $(parent)||document;
		WebShop.parseInputs(parent);
		WebShop.fixLinks(parent);
		WebShop.fixImages(parent);
		WebShop.fixTables(parent);
		if (!Browser.Engine.trident4) {
			if (WebShop.shadowElements) parent.getElements(WebShop.shadowElements).addShadow();
			if (window['Reflection']) parent.getElements('img.reflect').createNew(Reflection);
		}
		parent.getElements('.productContainer').each(function(container){
			container.getElements('.info').each(function(info){
				info.setStyle('margin-right', container.hasClass('blockView') ? 0 : info.getNext('.buttons').offsetWidth + 10);
			});
		});
	}

};

var webshop = WebShop;

WebShop.Box = function(){
	WebShop.box = $('box-template');
	if (WebShop.box) {
		WebShop.box = WebShop.box.getFirst();
		WebShop.box.store('size', WebShop.box.getActualSize());
		WebShop.Box = function(){
			var options = Object.type(arguments[0]) ? Array.shift(arguments) : {};
			var box = $(WebShop.box.clone());
			if (options.align == 'left') box = box.getFirst().getFirst();
			if (options.align == 'full' || !options.align) box = box.getElement('.box');
			box.retrieve('content', box.getElement('div.box-content') || box).adopt(arguments);
			return box;
		};
		return WebShop.Box.run(arguments);
	} else {
		WebShop.Box = function(){ return new Element('div'); };
	}
};

document.registerEvent('a.glass:not([href])', 'click', function(){ return false; });

document.registerEvent('.product', 'mouseover', function(event){
	if (this.retrieve('tip:text') || !this.getParent('.productContainer') || this.getParent('.dragging')) return;
	var tip = {
		title: this.getElement('a.title').get('text'),
		text: [
			this.getElement('div.short-description'),
			this.getElement('div.description'),
			this.getElement('span.price'),
			this.getElement('span.extras')
		]
	};
	tip.text = tip.text.filter(function(el) { return el && el.innerHTML.match(/[^\s]/); }).map(Element.clone);
	this.store('tip:title', tip.title);
	this.store('tip:text', tip.text);
	if (Browser.Engine.trident && WebShop.tips && this === WebShop.tips.current) {
		WebShop.tips.current = null;
		WebShop.tips.elementEnter(event, this);
	}
});

document.registerEvents('.search, .dateField, .copyField, .numberField, .coz-ui-combo, .coz-ui-select', {
	mouseover: function(e){ if (!e.event.related) document.fireEvent('mouseover', { type: 'mouseover', target: Element.get(e.target,'tag') == 'input' ? this.getElement('button') : this.getElement('input'), related: true }); },
	mouseout: function(e){ if (!e.event.related) document.fireEvent('mouseout', { type: 'mouseout', target: Element.get(e.target,'tag') == 'input' ? this.getElement('button') : this.getElement('input'), related: true }); },
	focus: function(e){ if (!e.event.related) document.fireEvent('focus', { type: 'focus', target: Element.get(e.target,'tag') == 'input' ? this.getElement('button') : this.getElement('input'), related: true }); },
	blur: function(e){ if (!e.event.related) document.fireEvent('blur', { type: 'blur', target: Element.get(e.target,'tag') == 'input' ? this.getElement('button') : this.getElement('input'), related: true }); }
});

window.addEvent('domready', WebShop.start);

window.addEvent('onbeforeunload', function(){ webshop = WebShop = null; });
WebShop.submitForm = function(form, action, params) {
	form.action.value = action;
	for (var param in params) form[param].value = params[param];
	form.submit();
};

WebShop.performSubmit = WebShop.ajaxUnavailable() ? function(form) {
	if (form.checkValidity && !form.checkValidity()) return false;
	return true;
} : function(form, event) {
	try {
		if (form.checkValidity && !form.checkValidity()) return false;
		var path = form.getAttributeNode('action').nodeValue;
		var type = RegExp.cache('/([^/]+)\.do$').exec(path)[1].capitalize();
		var button = event && event.explicitOriginalTarget ? event.explicitOriginalTarget : document.activeElement;
		if (button.nodeName.toLowerCase() != 'button') button = form.action.length ? form.action[0] : form.action;
		var action = button.name == 'action' ? button.getAttributeNode('value').nodeValue : form.action.value;
		var params = {};
		var buttons = $(form).getElements('button:not([disabled])').set('disabled',true);
		form.getElements('input,select,textarea').each(function(el){
			if (!el.name || el.disabled) return;
			params[el.name] = ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
		});
		var submit = WebShop[type].perform(action, params, button, buttons, form) == true;
		return submit;
	} catch (e) {
		console.log(e);
		return false;
	}
};

// CART

WebShop.Cart = WebShop.ajaxUnavailable() ? {
	
	perform: function(action, params) {
		WebShop.submitForm(document['webshop.cartForm'], action, params);
	}

} : {

	perform: function(action, params, button) {
		WebShop.busy();
		WebShop.Cart[action](params, button);
		return false;
	},
	
	updateStatus: function() {
		if ($('cartStatus')) new Request.HTML({
			url: context+'/ajax/cartStatus.jsp',
			update: $('cartStatus')
		}).get();
		if ($('cartMenu')) new Request.HTML({
			url: context+'/ajax/cartMenu.jsp',
			update: $('cartMenu')
		}).get();
	},
	
	empty: function() {
		cart.empty(function(data) {
			WebShop[data[0] ? 'message' : 'error'](data[1]);
			if (data[0]) {
				WebShop.Cart[$('ajaxCart') ? 'refresh' : 'updateStatus']();
				if (window.location.href.contains('checkout.do')) window.location.href = 'cart.do';
			}
		});
	},
	
	add: function(params, button) {
		cart.addConv(params.no, params.ver, params.ext, params.type, params.convType, params.convOrder, params.convLine, function(data){
			WebShop[data[0] ? 'message' : 'error'](data[1]);
			if (data[0]) {
				if (WebShop.InstallationParameters['ajax.cartRedirect']) window.location.href = context+'/cart.do';
				else WebShop.Cart.updateStatus();
			}
			button.set('disabled',false);
		});
	},
	
	addConv: function(params, button) {
		WebShop.Cart.add(params, button);
	}

};

var updateCartStatus = WebShop.Cart.updateStatus

var emptyCart = function() {
	WebShop.Cart.perform('empty');
};

var add = function(no,ver,ext,type) {
	addConv(no,ver,ext,type,'','','');
};
var addConv = function(no,ver,ext,type,convType,convOrder,convLine) {
	WebShop.Cart.perform('add', {
		no: no,
		ver: ver,
		ext: ext,
		type: type,
		convType: convType,
		convOrder: convOrder,
		convLine: convLine
	});
};

// WISHLIST

WebShop.Wishlist = WebShop.ajaxUnavailable() ? {
	
	perform: function(action, params) {
		WebShop.submitForm(document['webshop.wishlistForm'], action, params);
	}

} : {
	
	perform: function(action, params, button) {
		ajax.checkLogin(function(data){
			if (data) {
				WebShop.busy();
				WebShop.Wishlist[action](params, button);
			} else {
				WebShop.error('You must be registered and logged in to access your wishlist.', function() {
					if (window.location.href.match(/wishlist/)) window.location.href=window.location.href;
				});
				button.set('disabled',false);
			}
		});
		return false;
	},
	
	add: function(params, button) {
		wishlist.add(params.no,function(data){
			WebShop[data[0] ? 'message' : 'error'](data[1]);
			if (data[0]) {
				if (WebShop.InstallationParameters['ajax.wishlistRedirect']) window.location.href = context+'/wishlist.do';
				var text = WebShop.Messages['button.wishlist.in'];
				var tip = WebShop.Messages['tooltip.wishlist.in'];
				button.set('html', '<i></i>'+text).store('tips:text',tip).removeClass('wishlist').addClass('inwishlist');
			} else {
				button.set('disabled',false);
			}
		});
	}
};

var wish = function(no, button, inWishlist) {
	if (inWishlist) return;
	WebShop.Wishlist.perform('add', { no: no }, button);
};

WebShop.MyCourses = WebShop.ajaxUnavailable() ? {
	
	perform: function(action, params) {
		WebShop.submitForm(document['webshop.mycoursesForm'], action, params);
	}

} : {
	
	perform: function(action, params, button, callback) {
		ajax.checkLogin(function(data){
			if (data) {
				WebShop.busy();
				WebShop.MyCourses[action](params, button, callback);
			} else {
				WebShop.error('You must be registered and logged in to access your courses.', function() {
					if (window.location.href.match(/myCourses/)) window.location.href=window.location.href;
				});
			}
		});
		return false;
	},
	
	requests: [],
	
	add: function(params, button, callback) {
		new WebShop.Request({
			url: context+'/arclearn/courseViewer/course.jsp',
			requireLogin: true,
			onComplete: function(data){
				data = JSON.decode(data);
				WebShop[data[0] ? 'message' : 'error'](data[1]);
				if (data[0]) {
					if (callback) callback(data[2]);
					if (WebShop.MyCourses.redirect) window.location.href = context+'/myCourses.do';
					if (window.location.href.match(/myCourses/)) $('courses').retrieve('sort').load();
				} else {
					if (WebShop.overlay) WebShop.overlay.hide();
				}
				if (button) button.set('disabled', false);
			}
		}).post({
			action: 'add',
			json: JSON.encode({
				'MMPROD': params.no || 0,
				'MMCUS#': params.account || 0,
				'MMNAME': params.name || '',
				'MMSELTYPE': params.type || 'personal',
				'MMTYPE': params.mode || ''
			})
		});
	}
};

// ITEMS ON ORDER

WebShop.cancel = WebShop.ajaxUnavailable() ? function(order, line) {
	if (confirm('Are you sure you want to cancel this item you have on order?')) {
		WebShop.submitForm(document['webshop.cancelRentalForm'], {
			order: order,
			line: line,
			page: window.location.href
		});
	}
} : function(order, line) {
	if (confirm('Are you sure you want to cancel this item you have on order?')) {
		ajax.checkLogin(function(data){
			WebShop[data ? 'busy' : 'error']('You must be registered and logged in to cancel an order.');
			if (data) ajax.cancelRental(order,line,function(data){
				WebShop[data[0] ? 'message' : 'error'](data[1]);
				if (data[0]) $(order+'-'+line).setStyle('background-color', '#fcc').get('tween', 'opacity', { duration: 500 }).start(0).chain(function(){
					$(order+'-'+line).remove();
				});
			});
		});
	}
};

var cancel = WebShop.cancel;

// LOGIN

WebShop.Login = WebShop.ajaxUnavailable() ? {
		
	perform: function(action, params) {
		if (action == 'logout') {
			Cookie.dispose('login', { domain: cookieDomain, path: cookiePath });
			Cookie.dispose('JForumSSO', { domain: cookieDomain, path: cookiePath.substr(cookiePath.lastIndexOf('/')+1) });
		}
		WebShop.submitForm(document['webshop.loginForm'], action, params);
	}
		
} : {
	
	perform: function(action, params, button, buttons, form) {
		WebShop.busy();
		WebShop.Login[action](params, button, buttons, form);
		return false;
	},
	
	login: function(params, button, buttons, form) {
		loginRedirect = WebShop.InstallationParameters['account.loginRedirect'];
		var loc = window.location;
		if (loc.protocol == 'http:') {
			dwr.engine.setRpcType(dwr.engine.ScriptTag);
			ajax._path = 'https://'+server+context+'/dwr';
		}
		ajax.login(params.emailAddress, params.password, function(data) {
			WebShop[data[0]?'message':'error'](data[1], data[0] ? function(){
				if (!loc.href.contains('login.do')) loc.reload();
				else loc.href = params.redirect ? context + params.redirect : loginRedirect ? context + loginRedirect : loc.href.split('#')[0];
			} : function() { 
				buttons.set('disabled',false);
			});
		});
		if (loc.protocol == 'http:') {
			dwr.engine.setRpcType(dwr.engine.XMLHttpRequest);
			ajax._path = '/dwr';
		}
	},
	
	logout: function() {
		logoutRedirect = WebShop.InstallationParameters['account.logoutRedirect'];
		Cookie.dispose('login', { domain: cookieDomain, path: cookiePath });
		Cookie.dispose('JForumSSO', { domain: cookieDomain, path: cookiePath.substr(cookiePath.lastIndexOf('/')+1) });
		ajax.logout(function(data) {
			WebShop[data[0] ? 'message' : 'error'](data[1], data[0] ? function() {
				window.location.href = logoutRedirect ? context + logoutRedirect : window.location.href.split('#')[0];
			} : null);
		});
	},
	
	email: function(params, button, buttons) {
		ajax.emailPassword(params.emailAddress, function(data) {
			WebShop[data[0]?'message':'error'](data[1], function(){
				buttons.set('disabled',false);
			});
		});
	},
	
	preregister: function(params, button) {
		ajax.preRegister(params.emailAddress, params.password || '', function(data) {
			WebShop[data[0]?'message':'error'](data[1], data[0] ? function(){
				button.className = '';
				button.getAttributeNode('value').nodeValue = 'register';
				button.value = 'register';
				button.click();
			} : null);
		});
	},
	
	change: function(params) {
		loginRedirect = WebShop.InstallationParameters['account.loginRedirect'];
		ajax.changeLogin(params.emailAddress, params.password, params.newEmailAddress, params.newPassword, function(data) {
			WebShop[data[0]?'message':'error'](data[1], data[0] ? function(){
				if (loginRedirect) window.location.href = context + loginRedirect;
				else window.history.go(-1);
			} : function() { 
				buttons.set('disabled',false);
			});
		});
	}
	
};

var logout = function() { WebShop.Login.perform('logout'); };
WebShop.message = function (message, callback) { WebShop.showMessage(message, 'message', callback); };
WebShop.error = function (message, callback) { WebShop.showMessage(message || 'Unknown Error', 'error', callback); };
WebShop.busy = function (callback) { WebShop.showMessage('<img class="busy" src="'+context+'/images/webshop/transparent.gif"/>', 'busy', callback instanceof Function ? callback : null); };
WebShop.clearMessage = function() { WebShop.showMessage(null); };
WebShop.showMessage = function (message, type, callback) {
	if (!message) return;
	var bar = new Element('div', { 'class': 'message-bar', title: 'Click to hide' }).inject(document.body);
		bar.adopt([
			(bar.icon = new Element('img', { 'class': 'message-icon', src: context+'/images/webshop/transparent.gif' })),
			(new Element('span', { 'class': 'button red removeButton' }).grab((bar.close = new Element('a', { 'class': 'glass' })))),
			(bar.text = new Element('div', { 'class': 'message-text' }))
		]);
	//WebShop.smooth.smooth(bar.close, '.red a.glass');
	//WebShop.tips.attach([bar]);
	bar.get('slide', { link: 'cancel' }).wrapper.addClass('message-wrapper');
	bar.addEvent('click', WebShop.clearMessage);
	WebShop.showMessage = function (message, type, callback) {
		clearTimeout(bar.timer);
		if (!message) return bar.slide('out');
		bar.slide('hide').set('class', 'message-bar ' + type);
		bar.text.innerHTML = message;
		bar.slide('in');
		if (type == 'message') bar.timer = bar.slide.delay(3000, bar, 'out');
		if (callback) callback.delay(500);
	};
	return WebShop.showMessage(message, type, callback);
};

// backwards compatibility
var alertBar = WebShop.showMessage;
var alertError = WebShop.error;
var alertMessage = WebShop.message;
var alertBusy = WebShop.busy;
var alertClear = WebShop.clearMessage;
(function(){
	
Element.implement('fireChange', function(args){
	args = [{ type: 'change', target: this }].concat($splat(args));
	this.fireEvent('change', args);
	if (this.onchange) this.onchange.run(args, this);
	document.fireEvent('change', args);
});

Element.Properties.action = {get: function(){
	return Element.type(this.action) ? this.getAttributeNode('action').value : this.action.value;
}};
	
/* Form Events */
document.registerEvent('form', 'submit', function(e){
	if (this.retrieve('onsubmit') && this.retrieve('onsubmit')(window.event) == false) return false;
	if (!this.checkValidity()) return false;
	if (Browser.Engine.trident && Browser.Engine.version < 6) {
		if (Browser.Engine.trident4) {
			var buttons = this.getElements('button[type="submit"]');
			if (buttons.length > 1) buttons.each(function(button){
				button.disabled = (button !== document.activeElement);
			});
		}
		var button = $(document.activeElement);
		if (button && button.name != '') {
			button.innerHTML = button.getAttributeNode('value').nodeValue;
			button.removeClass('ie-button');
		}
	}
}, 0);
document.registerEvent('form', 'reset', function(e){
	new Elements(this.elements).each(function(element) {
		if (element.disabled) return;
		if (element.type == 'button') return;
		if (element.name == '' || !element.name) return;
		element.removeClass('invalidField').removeClass('validField');
		element.store('tip:title', '');
		element.store('tip:text', '');
	});
	WebShop.clearMessage();
}, 0);
document.registerEvent('input,select,textarea', 'change', function(e){
	this.removeClass('invalidField').removeClass('validField');
	this.store('tip:title', '');
	this.store('tip:text', '');
	this.checkValidity();
}, 0);

document.registerEvent('input[type=password]', 'keydown', function(e) {
	if (e.key == 'space') return false;
}, 0);
if (Browser.Engine.trident)
document.registerEvent('.login-container input', 'keypress', function(e) {
	if (e.key == 'enter') {
		$(this.form).getElement('button').click();
		return false;
	}
}, 0);

/* Input Alt */
document.registerEvents('input[alt]:not([type=image]):not([type=password]), textarea[alt]', {
	focus: function() { 
		if (this.value == this.get('alt')) { 
			this.value = ''; 
			this.removeClass('alt'); 
		}
	},
	blur: function() { 
		if (this.value == '' || this.value == this.get('alt')) { 
			this.addClass('alt'); 
			this.value = this.get('alt'); 
		}
	}
}, 0);
document.registerEvent('input.password-alt', 'focus', function(e){
	this.hide(); 
	this.getPrevious().show().focus();
}, 0);
document.registerEvent('input[alt][type=password]', 'blur', function(e){
	if (this.value == '') {
		this.hide(); 
		var input = this.getNext().show(); 
		document.fireEvent('mouseleave', { type: 'mouseout', target: input }); 
		document.fireEvent('blur', { type: 'blur', target: input }); 
	}
}, 0);


/* Number */
var incrementNumber = function(input, steps) {
	var value = +input.value || 0;
	var min = input.get('min'); min = (min && !isNaN(min)) ? +min : -999999999999;
	var max = input.get('max'); max = (max && !isNaN(max)) ? +max : 999999999999;
	var step = input.get('step'); step = (step && !isNaN(step)) ? +step : 1;
	value = Math[steps > 0 ? 'floor' : 'ceil'](value / step) * step;
	value = value + steps * step;
	if (min > -999999999999 && max < 999999999999)
		value = value > max ? min : value < min ? max : value;
	else
		value = Math.max(min, Math.min(max, value));
	input.value = value;
	input.fireChange([value, min, max, step]);
};
document.registerEvent('.numberField input', 'change', function(event, value, min, max, step){
	if (!$chk(value)) {
		value = +this.value || 0;
		min = this.get('min'); min = (min && !isNaN(min)) ? +min : -999999999999;
		max = this.get('max'); max = (max && !isNaN(max)) ? +max : 999999999999;
		step = this.get('step'); step = (step && !isNaN(step)) ? +step : 1;
	}
	var format = this.get('rel');
	if (format && !isNaN(this.value)) {
		if (format.contains('.')) {
			if (!this.value.contains('.')) this.value = this.value+'.';
			var integers = format.split('.')[0].length - this.value.split('.')[0].length;
			var fractions = format.split('.')[1].length - this.value.split('.')[1].length;
			while (integers--) this.value = '0'+this.value;
			while (fractions--) this.value = this.value+'0';
		} else {
			while (this.value.length < format.length) this.value = '0'+this.value;
		}
	}
	if (min == -999999999999 || max == 999999999999 || min == max) {
		this.getNext('button.increment').set('disabled', Math.floor(value / step) * step + step > max);
		this.getNext('button.decrement').set('disabled', Math.ceil(value / step) * step - step < min);
	}
});
document.registerEvent('.numberField input', 'keydown', function(event){
	if (event.key == 'up') incrementNumber(this, 1);
	if (event.key == 'down') incrementNumber(this, -1);
	var code = ''+event.code;
	if (event.shift && code.match(/^(4[89]|5[0-7]|109|190)$/)) return false;
	if (code.match(/^(3[2-48]|40|59|6[5-9]|7[0-9]|8[0-9]|90|10[67]|111|18[7-9]|19[12]|219|22[0-2])$/)) return false;
});
document.registerEvent('.numberField button.increment', 'click', function(){
	incrementNumber(this.getPrevious('input'), 1);
}, 0);
document.registerEvent('.numberField button.decrement', 'click', function(){
	incrementNumber(this.getPrevious('input'), -1);
}, 0);

/* Time Field */
document.registerEvent('.timeField', 'change', function(event){
	var input = this.getFirst();
	if (input == event.target) return;
	var hour = this.getElement('input.hour');
	var minute = this.getElement('input.minute');
	var ampm = this.getElement('button.ampm');
	if (!(input.value || hour.value || minute.value)) return;
	if (isNaN(hour.value) || isNaN(minute.value) || (hour.value+minute.value).contains('.')) {
		input.value = '';
	} else {
		if (minute.value && !hour.value) hour.set('value', '12').fireChange();
		if (hour.value && !minute.value) minute.set('value', '00').fireChange();
			hour = +hour.value || 13;
			hour = (hour > 12 ? -1 : hour % 12 + (ampm.innerHTML.contains('PM') ? 12 : 0));
			minute = minute.value || '00';
		input.value = hour + ':' + minute + ':00';
	}
	input.fireChange();
}, 2);
document.registerEvent('button.ampm', 'click', function(){
	this.innerHTML = this.innerHTML.replace(/AM|PM/, this.innerHTML.contains('PM') ? 'AM' : 'PM');
	document.fireEvent('change', { type: 'change', target: this.getParent('.timeField') });
}, 0);

/* Checkbox */
document.registerEvent('a.checkbox', 'click', function(e){
	var checkbox = this.retrieve('checkbox');
	if (checkbox.readonly || checkbox.disabled) return false;
	checkbox.set('checked', !checkbox.checked);
	if (checkbox.onclick) checkbox.onclick(e);
	checkbox.fireEvent('click');
	return false;
}, 1);
document.registerEvent('input[type=checkbox]', 'change', function(e){
	var a = this.retrieve('a');
	var i = this.retrieve('i');
		i.className = this.checked ? 'checked' : '';
	var type = a.retrieve('hovered') ? 'mouseover' : 'mouseout';
	document.fireEvent('mouseout', { type: 'mouseout', target: a });
}, 0);
Element.Properties.checked = {
	set: function(checked) {
		if (this.checked != checked) {
			this.checked = checked;
			this.fireChange();
		}
	}
};

/* Button States */
if (Browser.Engine.trident && Browser.Engine.version < 6) {
	document.registerEvents('a.button, button', {
		focus: function(){ this.addClass('focus'); },
		blur:  function(){ this.removeClass('focus'); },
		mousedown: function(){ this.addClass('active'); },
		mouseup:   function(){ this.removeClass('active'); },
		mouseleave: function(){ this.removeClass('active'); }
	}, 3);
} else {
	document.registerEvents('a.button', {
		mousedown: function(){ this.addClass('active'); },
		mouseup:   function(){ this.removeClass('active'); },
		mouseleave: function(){ this.removeClass('active'); }
	}, 2);
}

WebShop.Inputs = {
	number: function(input) {
		var value = +input.value || 0;
		var min = input.get('min'); min = (min && !isNaN(min)) ? +min : -999999999999;
		var max = input.get('max'); max = (max && !isNaN(max)) ? +max : 999999999999;
		var spin = min > -999999999999 && max < 999999999999 && min != max;
		var step = input.get('step'); step = (step && !isNaN(step)) ? +step : 1;
		input.set('maxlength', Math.max((input.get('min')||'-999999999999').length, (input.get('max')||'999999999999').length));
		new Element('span', { 'class': 'numberField' }).wraps(input).adopt(
			new Element('button', { type: 'button', 'class': 'increment', disabled: !spin && value + step > max }).grab(new Element('i')),
			new Element('button', { type: 'button', 'class': 'decrement', disabled: !spin && value - step < min }).grab(new Element('i'))
		);
	},
	date: function(input) {
		input.valueAsDate = Date.parse(input.value, 'date');
		new Element('span', { 'class': 'dateField', styles: { width: input.offsetWidth } }).wraps(input.hide()).adopt(
			new Element('input', { type: 'text', value: input.value, required: input.get('required'), rel: input.get('rel') }),
			new Element('button', { type: 'button' }).grab(new Element('i'))
		);
		new WebShop.DatePicker(input.getNext()).addEvent('setDate', function(){
			input.value = input.getNext().valueAsDate.toISO('date');
			input.fireChange();
		});
		input.retrieve('form:components', []).push(input.getNext());
	},
	time: function(input) {
		input.valueAsDate = Date.parse(input.value, 'time');
		var time = dojo.date.locale.parse(input.value, { selector: 'time', timePattern: 'HH:mm:ss' });
		var step = dojo.date.locale.parse(input.get('step'), { selector: 'time', timePattern: 'HH:mm:ss' });
		var hour = new Element('input', { type: 'number', value: time ? time.getHours() % 12 || 12 : '', min: 1, max: 12, step: step ? step.getHours() || 1 : 1, 'class': 'hour' });
		var minute = new Element('input', { type: 'number', value: time ? (time.getMinutes() < 10 ? '0' : '') + time.getMinutes() : '', min: 0, max: 59, step: step ? step.getMinutes() || 1 : 1, rel: '##', 'class': 'minute', required: input.get('required') });
		var ampm = new Element('button', { type: 'button', html: time && time.getHours() > 11 ? 'PM' : 'AM', 'class': 'ampm' });
		new Element('span', { 'class': 'timeField' }).wraps(input.hide()).adopt(hour, minute, ampm);
		WebShop.Inputs.number(hour.store('webshop:parsed', true));
		WebShop.Inputs.number(minute.store('webshop:parsed', true));
		input.retrieve('form:components', []).push(hour, minute);
	},
	checkbox: function(input) {
		var label = input.hide().getParent('label');
		var a = new Element('a', { 'class': 'checkbox', href: '' }).wraps(label ? label : input);
		var i = new Element('i').inject(a, 'top');
		a.store('checkbox', input.store('a', a).store('i', i));
		if (input.checked) i.addClass('checked');
		document.fireEvent('mouseout', { type: 'mouseout', target: a });
	},
	file: function(input) {
		//if (window.FancyUpload2)
		//parent.getElements('input[type=file].fancy').createNew(FancyUpload2);
	},
	phone: function(input) {
		
	},
	creditcard: function(input) {
		
	}
};

WebShop.parseInputs = function(parent){
	parent = $(parent||document);
	// Alternate Input Text
	var blur = typeof document.onactivate == 'object' ? 'deactivate' : 'blur';
	parent.getElements('input[alt]:not([type=image]), textarea[alt]').each(function(input){
		if (!input.offsetHeight) return;
		if (input.retrieve('webshop:parsed')) return;
		if (input.type == 'password') {
			var alt = new Element('input', { type:'text', value:input.alt, 'class':'alt password-alt', style:'display:none;' }).inject(input, 'after');
			input.store('webshop:parsed', true);
		}
		document.fireEvent(blur, { type: blur, target: input });
	});
	// Input Parsing
	parent.getElements('input').each(function(input){
		if (!input.offsetHeight) return;
		if (input.retrieve('webshop:parsed')) return;
		var type = WebShop.Inputs[input.get('type')];
		if (type) type(input);
		var list = $(input.get('list'));
		if (list && WebShop.Combo) new WebShop.Combo(input);
		input.store('webshop:parsed', true);
	});
	// HTML Editor Widget (MooEditable)
	if (window.MooEditable)
	parent.getElements('textarea.mooeditable').each(function(textarea){
		if (!textarea.offsetHeight) return;
		if (textarea.retrieve('mooeditable')) return;
		textarea.store('mooeditable', new MooEditable(textarea, { cleanup: true }));
	});
	// Input Autofocus
	if ((autofocus = parent.getElement('input[autofocus]'))) try { autofocus.focus(); } catch(e) {}
	// Select Styling
	if (WebShop.Select)
		parent.getElements(WebShop.Select.selector).createNew(WebShop.Select);
	/* Fix Firefox 3 non-bubbling mouse events for delegation */
	if (Browser.Engine.gecko19) parent.getElements('input,select,textarea').each(function(el){
		if (el.retrieve('webshop:ff3fix')) return;
		el.addEvents({
			'mouseover': function(e){
				if (e.event) try {
					var a = e.event.originalTarget.nodeType;
				} catch(error) {
					document.fireEvent('mouseover', { type: 'mouseover', target: e.target, relatedTarget: e.relatedTarget });
					document.fireEvent('mouseout', { type: 'mouseout', target: e.event.relatedTarget, relatedTarget: e.target });
				}
			},
			'mouseout': function(e){
				if (e.event) try {
					var a = e.event.originalTarget.nodeType;
				} catch(error) {
					document.fireEvent('mouseout', { type: 'mouseout', target: e.target, relatedTarget: e.relatedTarget });
					document.fireEvent('mouseover', { type: 'mouseover', target: e.event.relatedTarget, relatedTarget: e.target });
				}
			}
		});
		el.store('webshop:ff3fix', true);
	});
};

})();

/* Auto Tab for Credit Card and Phone Numbers */
// TODO: Use delegation
var autoTab = function(input, length, e) {
	var filter = /^([089]|1[36-9]|2[07]|3[3-9]|4[056]|9[1-3]|11[2-9]|12[0-3]|14[45]|18[23])$/;
	//var filter = /^(32|4[89]|5[0-79]|6[15-9]|[78][0-9]|9[06-9]|10[0-79]|11[01]|188|19[0-2]|219|22[0-2])$/
	if(input.value.length >= length && !e.ctrlKey && !filter.test(e.keyCode)) {
		for (i=0; i<input.form.length; i++) {
			if (input.form[i] == input) input.form[i+1].focus();
		}
		return false;
	}
	return true;
};

/* Implement HTML5 Form Specifications */

var ValidityState = function(){};
	ValidityState.prototype = {
		typeMismatch: false,
		rangeUnderflow: false,
		rangeOverflow: false,
		stepMismatch: false,
		tooLong: false,
		patternMismatch: false,
		valueMissing: false,
		customError: false,
		valid: true
	};
	
(function(){
	
var setValid = function(el){
	el.removeClass('invalidField');
	el.eliminate('tip:title');
	el.eliminate('tip:text');
	el.erase('title');
	document.fireEvent('blur', { type: 'blur', target: el });
	el.retrieve('form:components', []).each(setValid);
};
	
var setInvalid = function(el, related){
	el.addClass('invalidField');
	el.store('tip:title', '<span class="error">'+WebShop.Messages['validation.error']+'</span>');
	el.store('tip:text', el.validationMessage || related.validationMessage);
	if (!el.hasClass('coz-tips')) el.title = 'title';
	document.fireEvent('blur', { type: 'blur', target: el });
	el.retrieve('form:components', []).each(function(component) { setInvalid(component, el); });
};
	
var validate = {
	willValidate: true,
	validity: new ValidityState,
	validationMessage: '',
	setCustomValidity: function(message){
		this.validity = new ValidityState;
		this.validity.customError = !!message;
		this.validationMessage = message;
		if (message) setInvalid(this);
		else setValid(this);
	}
};
var checkRequired = {
	checkValidity: function(){
		this.willValidate = !!this.form &&
							!!this.name &&
							this.name != '' &&
							!this.disabled &&
							!this.readOnly;
		var customError = this.validity.customError;
		if (this.validity.customError) {
			var customValidationMessage = this.validationMessage.split('<br/>');
				customValidationMessage = customValidationMessage[customValidationMessage.length-1];
		}
		this.validity = new ValidityState;
		this.validity.customError = customError;
		this.validationMessage = '';
		if (this.willValidate) {
			var validationMessages = [];
			var value = (this.get('alt') && this.get('alt') == this.value) ? '' : this.value.trim();
			if (/^\s*$/.test(value)) {
				this.validity.valueMissing = this.type != 'button' && !!this.get('required');
				if (this.validity.valueMissing) validationMessages.push(WebShop.Messages['validation.valueMissing']); //'This field is required.';
			} else { 
				var maxlength = this.get('maxlength');
				var pattern = this.get('pattern');
				this.validity.tooLong = !!maxlength && maxlength != -1 && value.length > maxlength;
				this.validity.patternMismatch = !!pattern && pattern != '' && !RegExp.cache(pattern).test(value);
				if (this.validity.tooLong)           validationMessages.push(WebShop.Messages['validation.tooLong']);
				if (this.validity.patternMismatch)   validationMessages.push(WebShop.Messages['validation.patternMismatch']);
			}
			if (this.validity.customError) validationMessages.push(customValidationMessage);
			this.validationMessage = validationMessages.join('<br/>');
			this.validity.valid = !(this.validity.tooLong ||
									this.validity.patternMismatch ||
									this.validity.valueMissing ||
									this.validity.customError);
			this.validity.valid ? setValid(this) : setInvalid(this);
		}
		return this.validity.valid;
	}
};

Element.Properties.required = {
	set: function(required) {
		this[required ? 'setAttribute' : 'removeAttribute']('required', 'required');
	}
};

var HTMLFormElement = new Native({ legacy: window.HTMLFormElement, initialize: function(){}, afterImplement: function(key, value){ Element.Prototypes['form'][key] = value; } });
var HTMLInputElement = new Native({ legacy: window.HTMLInputElement, initialize: function(){}, afterImplement: function(key, value){ Element.Prototypes['input'][key] = value; } });
var HTMLSelectElement = new Native({ legacy: window.HTMLSelectElement, initialize: function(){}, afterImplement: function(key, value){ Element.Prototypes['select'][key] = value; } });
var HTMLTextAreaElement = new Native({ legacy: window.HTMLTextAreaElement, initialize: function(){}, afterImplement: function(key, value){ Element.Prototypes['textarea'][key] = value; } });
var HTMLButtonElement = new Native({ legacy: window.HTMLButtonElement, initialize: function(){}, afterImplement: function(key, value){ Element.Prototypes['button'][key] = value; } });
	
Element.Prototypes = { form: {}, input: {}, select: {}, textarea: {}, button: {} };

HTMLFormElement.implement({
	checkValidity: function(){
		var invalidElements = [];
		new Elements(this.elements).each(function(element){
			if (!element.checkValidity()) invalidElements.push(element);
		});
		var invalid = invalidElements.length;
		if (invalid) {
			for (var i=0; i<invalid; i++) try { invalidElements[i].focus(); break; } catch(e) {}
			WebShop.error(WebShop.Messages['validation.alert']);
		}
		return !invalid;
	},
	dispatchFormInput: function(){
		new Elements(this.elements).fireEvent('forminput');
	},
	dispatchFormChange: function(){
		new Elements(this.elements).fireEvent('formchange');
	}
});

HTMLInputElement.implement(validate);
HTMLInputElement.implement({
	valueAsDate: null,
	valueAsNumber: null,
	checkValidity: function(){
		this.willValidate = !!this.form &&
							!!this.name &&
							this.name != '' &&
							!this.disabled &&
							!this.readOnly &&
							this.type != 'hidden' &&
							this.type != 'button' &&
							this.type != 'reset';
		var customError = this.validity.customError;
		if (this.validity.customError) {
			var customValidationMessage = this.validationMessage.split('<br/>');
				customValidationMessage = customValidationMessage[customValidationMessage.length-1];
		}
		this.validity = new ValidityState;
		this.validity.customError = customError;
		this.validationMessage = '';
		if (this.willValidate) {
			var validationMessages = [];
			var value = (this.get('alt') && this.get('alt') == this.value) ? '' : this.value.trim();
			if (/^\s*$/.test(value)) {
				this.validity.valueMissing = this.type != 'button' && !!this.get('required');
				if (this.validity.valueMissing) validationMessages.push(WebShop.Messages['validation.valueMissing']);
			} else { 
				var type = this.get('type').toLowerCase();
				var min = this.get('min');
				var max = this.get('max');
				var step = this.get('step');
				var maxlength = this.get('maxlength');
				var pattern = this.get('pattern');
					pattern = dojox.validate[pattern] || pattern;
				switch(type){
					case 'date':	
					case 'time':	value = Date.getTime(value, false, type);
									this.validity.typeMismatch = !$chk(value);
									if (value) {
										min = !!min ? Date.getTime(min, false, type) : false;
										max = !!max ? Date.getTime(max, false, type) : false;
										step = !!step ? Date.getTime(step, false, type) : false;
										this.validity.rangeUnderflow = $chk(min) && value < min;
										this.validity.rangeOverflow = $chk(max) && value > max;
										this.validity.stepMismatch = !!step && (value / step) > parseInt(value / step);
									}
									break;
					case 'number':  value = +(value);
									min = +(min);
									max = +(max);
									step = +(step);
									this.validity.typeMismatch = !$chk(value);
									this.validity.rangeUnderflow = !this.validity.typeMismatch && !!min && value < min;
									this.validity.rangeOverflow = !this.validity.typeMismatch && !!max && value > max;
									this.validity.stepMismatch = !this.validity.typeMismatch && !!step && (value / step) > parseInt(value / step);
									break;
					case 'email':	this.validity.typeMismatch = !dojox.validate.isEmailAddress(value);
									break;
					case 'url':		this.validity.typeMismatch = !dojox.validate.isUrl(value);
									break;
					case 'text':	this.validity.tooLong = !!maxlength && maxlength != -1 && value.length > maxlength;
									this.validity.patternMismatch = !!pattern && pattern != '' && !RegExp.cache(pattern).test(value);
									break;
				}
				if (this.validity.typeMismatch)    validationMessages.push(WebShop.Messages['validation.typeMismatch.'+type]);
				if (this.validity.rangeUnderflow)  validationMessages.push(WebShop.Messages['validation.rangeUnderflow.'+type]);
				if (this.validity.rangeOverflow)   validationMessages.push(WebShop.Messages['validation.rangeOverflow.'+type]);
				if (this.validity.stepMismatch)    validationMessages.push(WebShop.Messages['validation.stepMismatch.'+type]);
				if (this.validity.tooLong)         validationMessages.push(WebShop.Messages['validation.tooLong']);
				if (this.validity.patternMismatch) validationMessages.push(WebShop.Messages['validation.patternMismatch']);
			}
			if (this.validity.customError) validationMessages.push(customValidationMessage);
			this.validationMessage = validationMessages.join('<br/>');
			this.validity.valid = !(this.validity.typeMismatch ||
									this.validity.rangeUnderflow ||
									this.validity.rangeOverflow ||
									this.validity.stepMismatch ||
									this.validity.tooLong ||
									this.validity.patternMismatch ||
									this.validity.valueMissing ||
									this.validity.customError);
			//if (!this.validity.valid) this.fireEvent('invalid');
			this.validity.valid ? setValid(this) : setInvalid(this);
		}
		return this.validity.valid;
	}
});
HTMLSelectElement.implement(validate);
HTMLSelectElement.implement(checkRequired);
HTMLTextAreaElement.implement(validate);
HTMLTextAreaElement.implement(checkRequired);
HTMLButtonElement.implement({
	willValidate: false,
	validity: new ValidityState,
	validationMessage: '',
	checkValidity: function(){ return true; }
});

$.element = function(el, notrash){
	$uid(el);
	if (!notrash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
		var proto = Element.Prototype;
		for (var p in proto) el[p] = proto[p];
		proto = Element.Prototypes[el.get('tag')];
		if (proto) for (p in proto) el[p] = proto[p];
	};
	return el;
};

})();
WebShop.Tips = new Class({

	Implements: [Events, Options],

	options: {
		onShow: function(tip){
			if (tip) tip.setStyles({ visibility: 'visible' });
		},
		onHide: function(tip){
			if (tip) tip.setStyles({ visibility: 'hidden', left: -10000, top: -10000, width: 'auto' });
		},
		showDelay: 200,
		hideDelay: 0,
		className: 'tool-tip',
		offsets: {x: 16, y: 16},
		fixed: false,
		useHref: false,
		useRel: true
	},
	
	initialize: function(options){
		this.setOptions(options);
		var tips = this;
		document.registerEvent('*[title]', 'mouseover', function(e){
			if (this.hasClass('coz-tips')) return;
			var elementTitle = this.get('title');
			this.set('title', '');
			this.addClass('coz-tips-loading');
			(function(){
				var title = this.retrieve('tip:title', elementTitle);
				var text = this.retrieve('tip:text', (tips.options.useRel ? this.get('rel') : false) || (tips.options.useHref && this.get('href') ? this.get('href').replace('http://', '') : false));
				if (title && !text) {
					this.store('tip:title', false);
					this.store('tip:text', title);
				}
				this.removeClass('coz-tips-loading');
				this.addClass('coz-tips');
				this.erase('title');
				if (!this.retrieve('tip:cancel')) tips.elementEnter(e, this);
			}).delay(1, this);
		});
		document.registerEvent('.coz-tips-loading', 'mouseleave', function(e){
			this.store('tip:cancel', true);
		});
		document.registerEvent('.coz-tips', 'mouseover', function(e){
			if (tips.current !== this) tips.elementEnter(e, this);
		});
		document.registerEvent('.coz-tips', 'mouseleave', function(e){
			if (tips.current === this) tips.elementLeave(e);
		});
		if (!tips.options.fixed) document.registerEvent('.coz-tips', 'mousemove', function(e){
			if (tips.current === this) tips.elementMove(e);
		});
	},
	
	build: function(){
		if (!this.tip) {
			this.tip = new WebShop.Box({align:'left'}).inject(document.body);
			if (this.options.className) this.tip.addClass(this.options.className);
			this.container = this.tip.retrieve('content');
			this.tip.setStyles({position: 'absolute', top: -10000, left: -10000, visibility: 'hidden'});
		}
	},
	
	elementEnter: function(event, element){
		this.build();
		$A(this.container.childNodes).each(this.empty, this);
		var title = element.retrieve('tip:title');
		if (title){
			this.titleElement = new Element('div', {'class': 'tip-title'}).inject(this.container);
			this.fill(this.titleElement, title);
		}
		var text = element.retrieve('tip:text');
		if (text){
			this.textElement = new Element('div', {'class': 'tip-text'}).inject(this.container);
			this.fill(this.textElement, text);
		}
		if (title || text) {
			this.hide();
			this.current = element;
			this.timer = $clear(this.timer);
			this.timer = this.show.delay(this.options.showDelay, this);
			this.position((!this.options.fixed) ? event : {page: element.getPosition()});
		}
	},
	
	elementLeave: function(event){
		this.current = null;
		this.timer = $clear(this.timer);
		this.timer = this.hide.delay(this.options.hideDelay, this);
	},
	
	elementMove: function(event){
		this.build();
		this.position(event);
	},
	
	position: function(event){
		if (Browser.Engine.trident && Browser.Engine.version < 6)
			this.tip.setStyle('width', this.tip.offsetWidth > 399 ? '400px' : 'auto');
		var doc = this.tip.getDocument();
			doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
		var size = {x: doc.clientWidth, y: doc.clientHeight}, scroll = window.getScroll();
		var tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight};
		var props = {x: 'left', y: 'top'}, pos = {}, sop = {};
		for (var z in props){
			pos[z] = Math.min(event.page[z] + this.options.offsets[z], size[z] + scroll[z] - tip[z] - this.options.offsets[z]);
			sop[z] = event.page[z] - this.options.offsets[z];
			this.tip.setStyle(props[z], pos[z]);
		}
		if (event.page.x + this.options.offsets.x > pos.x && (sop.x - tip.x - scroll.x) > 0 &&
			event.page.y + this.options.offsets.y > pos.y && (sop.y - tip.y - scroll.y) > 0) {
			this.tip.setStyle(props.y, sop.y - tip.y);
			this.tip.addClass('tip-flipped');
		} else {
			this.tip.removeClass('tip-flipped');
		}
	},
	
	fill: function(element, contents){
		element.store('tip:type', typeof contents);
		(typeof contents == 'string') ? element.set('html', contents) : element.adopt(contents);
	},
	
	empty: function(element){
		this.container.removeChild(element);
		if (element.retrieve('tip:type') == 'string') {
			element.empty();
			memfree(element);
		}
	},

	show: function(){
		this.fireEvent('onShow', this.tip);
	},

	hide: function(){
		this.fireEvent('onHide', this.tip);
	}
	
});
WebShop.RatingPicker = new Class({

	initialize: function(element) {
		if (element.retrieve('ratingPicker')) return;
		this.picker = element;
		this.stars = 0;
		this.rating = element.getPrevious();
		/*
		if (this.rating) {
			this.picker.getParent().addEvent('mouseenter', this.rating.setStyle.pass(['display','none'], this.rating));
			this.picker.getParent().addEvent('mouseleave', this.rating.setStyle.pass(['display',''], this.rating));
		}
		this.picker.addEvent('mouseleave', this.fillStars.pass(0,this));
		this.picker.addEvent('mouseover', function(e){
			if (e.target.get('tag') == 'a') this.fillStars(this.elements.indexOf(e.target)+1);
		}.bind(this));
		this.picker.addEvent('click', function(e){
			if (e.target.get('tag') == 'a') this.setStars(this.elements.indexOf(e.target)+1);
		}.bind(this));
		*/
		this.elements = this.picker.getChildren();
		var uFormats = this.picker.uFormats();
		this.no = uFormats.no;
		this.stars = uFormats.stars;
		var form = document[uFormats.form];
		this.input = form ? form[uFormats.input] : null;
		this.fillStars();
	},
	
	fillStars: function(stars) {
		if (!stars) stars = this.stars || 0;
		this.elements.each(function(star, i) {
			star[(i+1) <= stars ? 'addClass' : 'removeClass']('hover');
		});
	},
	
	setStars: function(stars) {
		this.stars = stars;
		if (this.input) 
			this.input.value = stars;
		else if (this.no) 
			ajax.checkLogin(function(data){
				if (data) ajax.addRating(this.no, stars, function(data) {
					if (data[0]) webshop.message(data[1]); else webshop.error(data[1]);
				});
				else webshop.error("You must be logged in to use this feature.");
			}.bind(this));
	}

});

document.registerEvents('.rating', {
	mouseenter: function(){
		var picker = this.getElement('div.picker');
		if (!picker) return;
		var rating = picker.retrieve('ratingPicker', new WebShop.RatingPicker(picker)).rating;
		if (rating) rating.setStyle('display', 'none');
	},
	mouseleave: function(){
		var picker = this.getElement('div.picker');
		if (!picker) return;
		var ratingPicker = picker.retrieve('ratingPicker', new WebShop.RatingPicker(picker));
		var rating = ratingPicker.rating;
		if (rating) rating.setStyle('display', '');
		ratingPicker.fillStars();
	}
}, 2);
document.registerEvents('.picker', {
	mouseover: function(e){
		if (e.target.get('tag') == 'a') {
			var ratingPicker = this.retrieve('ratingPicker', new WebShop.RatingPicker(this));
			ratingPicker.fillStars(ratingPicker.elements.indexOf(e.target)+1);
		}
	},
	click: function(e){
		if (e.target.get('tag') == 'a') {
			var ratingPicker = this.retrieve('ratingPicker', new WebShop.RatingPicker(this));
			ratingPicker.setStars(ratingPicker.elements.indexOf(e.target)+1);
		}
	}
}, 1);

/*
reg.hover('.rating', function(){
	var rating = this.retrieve('ratingPicker', new WebShop.RatingPicker(this)).rating;
	if (rating) rating.setStyle('display', 'none');
}, function(){
	var rating = this.retrieve('ratingPicker', new WebShop.RatingPicker(this)).rating;
	if (rating) rating.setStyle('display', '');
});
reg.hover('.rating .picker', $empty, function(){
	var element = this.getParent();
	var ratingPicker = element.retrieve('ratingPicker', new WebShop.RatingPicker(element));
	ratingPicker.fillStars(0);
});
reg.hover('.rating .picker a', function(){
	var element = this.getParent().getParent();
	var ratingPicker = element.retrieve('ratingPicker', new WebShop.RatingPicker(element));
	ratingPicker.fillStars(ratingPicker.elements.indexOf(this)+1);
});
reg.click('.rating .picker a', function(){
	var element = this.getParent().getParent();
	var ratingPicker = element.retrieve('ratingPicker', new WebShop.RatingPicker(element));
	ratingPicker.setStars(ratingPicker.elements.indexOf(this)+1);
});
*/
(function(){
	
document.registerEvents('.dateField input[type=text]', {
	click: function(){
		this.retrieve('date:picker').show();
	},
	keydown: function(){
		this.retrieve('date:picker').show();
	}
}, 0);
	
document.registerEvents('.dateField button', {
	click: function(){
		this.getPrevious('input').retrieve('date:picker').toggle();
	}
}, 0);

WebShop.DatePicker = new Class({

	Implements: [Options, Events],

	options: {
		formatLength: 'medium',
		valid: function(date) { return true; },
		draggable: false,
		fade: !Browser.Engine.trident
	},

	initialize: function(element, options) {
		
		this.setOptions(options);
	
		this.input = $(element).store('date:picker', this);
		this.format = { selector: 'date', formatLength: this.options.formatLength };
		this.iso = { selector: 'date', datePattern: 'yyyy-MM-dd' };
		
		this.date = Date.parse(this.input.value, this.format) || Date.parse(this.input.value, this.iso) || null;
		this.view = Date.parse(this.input.value, this.format) || Date.parse(this.input.value, this.iso) || new Date();
		this.input.value = this.date ? dojo.date.locale.format(this.date, this.format) : '';
		this.input.valueAsDate = this.date;
		this.input.valueAsNumber = this.date ? this.date.getTime() : 0;
		this.input.store('date:iso', this.date ? this.date.toISO('date') : '0001-01-01');
		this.input.readOnly = true;
		this.input.addEvent('garbage', Element.destroy.pass(this.element));
		this.button = this.input.getNext('button');
		if (WebShop.DatePicker[this.input.get('rel')])
			this.options.valid = WebShop.DatePicker[this.input.get('rel')];
		
		this.hidefn = this.hide.bind(this);
	
	},
	
	mousedown: function(event){
		if (this.open) Event.stopPropagation(event);
	},
	
	position: function() {
		this.element.setStyles({
			left: this.input.getLeft() + this.input.offsetWidth,
			top: this.input.getTop()
		});
	},
	
	show: function() {
		if (!this.element) this.build();
		this.open = true;
		this.position();
		this.view = this.date ? new Date(this.date) : new Date();
		this.render();
		this.input.addEvent('mousedown', this.mousedown.bind(this));
		this.button.addEvent('mousedown', this.mousedown.bind(this));
		document.addEvent('mousedown', this.hidefn);
		if (this.options.fade) this.element.get('tween', {
			duration: 200,
			onStart: Element.show.pass(this.element)
		}).start('opacity', 1);
		else this.element.show();
		return this;
	},
	
	hide: function() {
		this.open = false;
		this.input.removeEvents('mousedown');
		this.button.removeEvents('mousedown');
		document.removeEvent('mousedown', this.hidefn);
		if (this.element) {
			if (this.options.fade) this.element.get('tween', {
				onComplete: Element.hide.pass(this.element)
			}).start('opacity', 0);
			else this.element.hide();
		}
		return this;
	},
	
	toggle: function() {
		return this[!this.element || this.element.getStyle('display') == 'none' ? 'show' : 'hide']();
	},
	
	navigate: function(direction) {
		this.view = dojo.date.add(this.view, "month", direction);
		return this.render();
	},
	
	setDate: function(date) {
		this.date = date;
		this.input.value = this.date.format(this.options.formatLength, 'date');
		this.input.valueAsDate = this.date;
		this.input.valueAsNumber = this.date.getTime();
		this.input.store('date:iso', this.date.toISO('date'));
		this.fireEvent('setDate');
		if (WebShop.tips) document.fireEvent('mouseout', { type: 'mouseout', target: WebShop.tips.current });
		return this.hide().render();
	},
	
	build: function() {
		this.element = new Element('div', { 'class': 'datePicker', styles: { display: 'none', opacity: Browser.Engine.trident ? 1 : 0 } }).grab(
			(this.box = new WebShop.Box())
		);
		
		this.element.addEvent('mousedown', this.mousedown.bind(this));
		if (this.options.draggable) this.element.makeDraggable();
			
		this.content = this.box.retrieve('content').grab(new Element('div', { 'class': 'calendar' }).grab((this.table = new Element('table'))));
			
		// <caption>
		this.caption = new Element('caption').adopt(
			(this.prev = new Element('a', { html: '&laquo;', 'class': 'prev', events: { click: this.navigate.pass(-1, this) } })),
			(this.next = new Element('a', { html: '&raquo;', 'class': 'next', events: { click: this.navigate.pass( 1, this) } })),
			(this.title = new Element('span'))
		).inject(this.table);

		// <thead>
		this.head = new Element('thead').grab(
			new Element('tr').adopt(days.map(function(day, i){
				return new Element('th', { html: day, title: daynames[i] });
			}))
		).inject(this.table);
	
		// <tbody>
		this.body =  new Element('tbody').inject(this.table);
		
		// <tr><td>
		var tr, td, day, date, a;
		for (var w=0; w<6; w++) {
			tr = new Element('tr').inject(this.body);
			for (var d=0; d<7; d++) {
				td = new Element('td').inject(tr);
			}
		}
		
		this.element.inject(document.body);
	},
	
	render: function() {
		
		var year = this.view.getFullYear();
		var month = this.view.getMonth();
		
		var offset = (new Date(year, month, 1).getDay() + 6) % 7; // day of the week (offset)
		var last = new Date(year, month + 1, 0).getDate(); // last day of this month
		var prev = new Date(year, month, 0).getDate(); // last day of previous month
		
		if (this.date)
		var active = this.date.getFullYear() == year && this.date.getMonth() == month ? this.date.getDate() : 0; // active date (if set and within curr month)
		
		this.title.set('html', months[month] + ' ' + year);
		this.prev.setStyle('display', true ? 'block' : 'none');
		this.next.setStyle('display', true ? 'block' : 'none');

		var day, date, a;
		for (var w=0, tr; tr = this.body.childNodes[w++];) {
			for (var d=0, td; td = tr.childNodes[d++];) {
				day = (w-1) * 7 + (d-1) - offset;
				td.empty().set('class', '');
				if (day > 0 && day <= last) {
					date = new Date(year, month, day); 
					if (this.options.valid(date)) {
						button = new Element('button', {
							'html': day,
							'class': day == active ? 'selected' : '',
							'disabled': day == active,
							'title': date.format(this.options.formatLength, 'date'),
							'events': { click: this.setDate.pass(date, this) }
						});
						td.grab(button);
					} else td.set({ 'html': day, 'class': 'invalid' });
				} else td.set('html', day < 1 ? day + prev : day - last);
			}
		}
		
		return this;
	
	}

});

WebShop.DatePicker.future = function(date) {
	return dojo.date.compare(date, new Date(), 'date') >= 0;
};
WebShop.DatePicker.futureBusiness = function(date) {
	return dojo.date.compare(date, new Date(), 'date') >= 0 && !dojo.date.locale.isWeekend(date);
};

// Dojo Localization
var locale = dojo.i18n.normalizeLocale().replace('-','_');
var info = dojo.cldr.nls.gregorian[locale] || dojo.cldr.nls.gregorian[locale.split('_')[0]];
var months = info['months-format-wide'];
var days = info['days-standAlone-narrow'];
var daynames = info['days-format-wide'];

})();
(function(){

	document.registerEvents('.tabrow button, .tabbar button', {
		mousedown: function(event){
			return event.rightClick ? true : WebShop.selectTab(this);
		},
		keydown: function(event){
			return event.key != 'enter' ? true : WebShop.selectTab(this);
		}
	});

})();

WebShop.selectTab = function(tab) {
	
	var tabrow = tab.getParent('.tabrow') || tab.getParent('.tabbar');
	var tabbox = tabrow.getNext();
	var tabs = tabrow.getElements('button');

	var rel = (tabrow.get('rel') || '').split(':');
	var form = rel[0];
	var input = rel[1];
	
	var value = tab.getAttributeNode('value');
		value = value ? value.nodeValue : null;

	form = document[form];
	if (form) {
		input = form[input];
		if (input) input.value = value;
		focus = form[focus];
	}
	
	var showDiv;
	tabs.each(function(t,i){
		var div = tabbox.getElementById(t.get('text').replace('amp;',''));
		if (t === tab) {
			t.removeClass('bg').addClass('fg');
			if (i == 0) tabbox.addClass('fs');
			if (div) showDiv = div;
		} else {
			t.removeClass('fg').addClass('bg');
			if (div && !div.hasClass('hidden-tab'))
				div.addClass('hidden-tab').fireEvent('tabhide');
		}
	});
	if (showDiv) {
		showDiv.removeClass('hidden-tab').fireEvent('tabshow');
		WebShop.initialize(showDiv);
	}
	
	if (Browser.Engine.trident) tabrow.className = tabrow.className;
	
	if (focus) try { focus.focus(); } catch (e) {}
	
	return false;
};
WebShop.Menu = new Class({

	Implements: Options,

	options: {
		openDelay: 250,
		closeDelay: 250,
		opacity: false
	},

	initialize: function(element, options) {
		this.setOptions(options);
		this.submenu = element.getFirst('ul');
		if (!this.submenu) return;
		this.element = element.store('menu',this).addClass('closed');
		if (this.options.opacity) this.submenu.set('opacity', 0);
		if (Browser.Engine.trident4) {
			this.iframe = (this.element.getElement('iframe') || new Element('iframe').inject(this.submenu, 'before')).setStyles({
				'top': this.submenu.getStyle('top'),
				'left': this.submenu.getStyle('left'),
				'right': this.submenu.getStyle('right')
			});
		}
		this.element.getElements('.menu').addClass('closed');
	},
	
	open: function(delay, force) {
		if (delay == undefined) delay = this.options.openDelay;
		window.clearTimeout(this.timer);
		if (this.element.hasClass('open')) return;
		this.forced = force;
		this.timer = function() {
			this.element.addClass('open');
			this.element.removeClass('closed');
			this.submenu.scrollTo(0);
			if (Browser.Engine.trident4) {
				this.iframe.setStyles({ width: this.submenu.offsetWidth, height: this.submenu.offsetHeight });
				return;
				this.submenu.setStyle('width', 250);
				this.iframe.setStyles({ width: 0, height: 0 });
				(function(){
					if (this.submenu.offsetWidth < this.element.offsetWidth) this.submenu.setStyle('width', this.element.offsetWidth);
					this.iframe.setStyles({ width: this.submenu.offsetWidth, height: this.submenu.offsetHeight });
				}).delay(1, this);
			} else {
				this.submenu.setStyle('min-width', this.element.offsetWidth);
				var padding = false;
				if (Browser.Engine.gecko18) {
					this.submenu.getChildren().setStyles({
						'-moz-box-sizing': 'border-box',
						'min-width': this.element.offsetWidth
					});
				}
				if (Browser.Engine.trident5) {
					var items = [];
					this.submenu.getChildren().each(function(el){ items.push(el.getFirst()); });
					items = new Elements(items);
					items.setStyle('min-width', 0);
					(function(){
						var padding = this.submenu.getFirst().getFirst().getOuterSize().x;
						items.setStyle('min-width', Math.max(this.submenu.scrollWidth, this.element.offsetWidth)-padding);
					}).delay(1, this);
				}
			}
			/*(function(){
				var coords = this.submenu.getCoordinates();
				var top = window.getScroll().y;
				var bottom = top + window.getSize().y - 10;
				if (coords.bottom > bottom) this.submenu.setStyle('top', Math.max(coords.top - top, bottom - coords.bottom + this.submenu.getStyle('top').toInt()));
			}.delay(1, this));*/
		}.delay(delay,this);
	},
	
	close: function(delay, force) {
		if (delay == undefined) delay = this.options.closeDelay;
		window.clearTimeout(this.timer);
		if (!force && this.forced) return;
		if (this.element.hasClass('closed')) return;
		this.timer = function() {
			this.element.removeClass('open');
			this.element.addClass('closed');
			//this.submenu.style.top = null;
		}.delay(delay,this);
	},
	
	toggle: function(delay, force) {
		this.element.hasClass('open') ? this.close(delay, force) : this.open(delay, force);
	}

});

WebShop.Menu.menusOpen = 0;

document.registerEvents('.menu', {
	mousedown: function(){
		(this.retrieve('menu') || new WebShop.Menu(this)).open(0);
	},
	mouseenter: function(){
		(this.retrieve('menu') || new WebShop.Menu(this)).open();
		var parent = this.getParent('.menu');
		if (parent) document.fireEvent('mouseover', { type: 'mouseover', target: parent });
	},
	mouseleave: function(event){
		(this.retrieve('menu') || new WebShop.Menu(this)).close();
		var parent = this.getParent('.menu');
		if (parent && Element.Events.mouseleave.condition.call(parent, event)) {
			document.fireEvent('mouseout', { type: 'mouseout', target: parent, relatedTarget: event.relatedTarget, page: event.page });
		}
	},
	focus: function(){
		(this.retrieve('menu') || new WebShop.Menu(this)).open();
	},
	blur: function(){
		(this.retrieve('menu') || new WebShop.Menu(this)).close();
	}
});
var TextShadow = new Class({

	Implements: Options,
	
	options: {
		x: 0,
		y: 2,
		color: '#000',
		opacity: 0.2,
		soft: false
	},
	
	initialize: function(el, options) {
		el = $(el);
		this.setOptions(options);
		new Element('div').setStyles({
			'position': 'relative',
			'z-index': (el.getStyle('z-index') || '0').toInt() || 0,
			'margin': el.getStyle('margin'),
			'zoom': 1
		}).wraps(el);
		var shadow = el.setStyles({
			'position': 'relative',
			'z-index': 2,
			'margin': 0,
			'zoom': 1
		}).clone(false).addClass('text-shadow').setStyles({
			'position': 'absolute',
			'z-index': 1,
			'opacity': this.options.opacity,
			'left': this.options.x,
			'top': this.options.y,
			'width': Browser.Engine.trident && Browser.Engine.version < 6 ? '' : '100%'
		}).inject(el, 'before').set('html', el.get('html').stripLinks());
		if (this.options.color)
			shadow.setStyle('color', this.options.color);
		if (this.options.soft) {
			shadow.setStyles({
				'opacity': this.options.opacity/3,
				'left': this.options.x-1
			}).clone(true).setStyles({
				'left': this.options.x+1
			}).inject(el, 'before').clone(true).setStyles({
				'left': this.options.x,
				'top': this.options.y-1
			}).inject(el, 'before').clone(true).setStyles({
				'top': this.options.y+1
			}).inject(el, 'before');
		}
	}

});

Element.implement({

	addShadow: function(options) {
		return this.retrieve('shadow') || this.retrieve('shadow', new TextShadow(this, options));
	}

});
var Overlay = new Class({

	initialize: function(){
		if (Browser.Engine.trident4) this.iframe = new Element('iframe', { src: 'javascript:\'<html></html>\';', 'class': 'coz_overlay_iframe' }).set('opacity', 0.01).inject(document.body).hide();
		this.element = new Element('div', { 'class': 'coz_overlay' }).adopt([
			(this.background = new Element('div', { 'class': 'coz_overlay_background', styles: Browser.Engine.gecko19 ? { background: 'rgba(0,0,0,0.8)' } : { opacity: 0.8 } })),
			(this.content = new Element('div', { 'class': 'coz_overlay_content' }))
		]).set('opacity', 0).hide().inject(document.body);
	},
	
	show: function(chain) {
		WebShop.tips.elementLeave();
		if (Browser.Engine.trident4) this.iframe.show();
		this.objects = document.getElements('object, embed');
		Array.each(this.objects, function(el){ el.style.display = 'none'; });
		this.element.show();
		return this.element.setStyle('display','block').get('tween').start('opacity', 1).chain(chain||$empty);
	},
	
	hide: function(chain) {
		return this.element.get('tween').start('opacity', 0).chain(function(){
			if (Browser.Engine.trident4) this.iframe.hide();
			Array.each(this.objects, function(el){ el.style.display = ''; });
			this.element.hide();
			this.content.removeEvents('click');
			if (chain) chain();
		}.bind(this));
	}

});
WebShop.Dialog = new Class({

	Implements: [Options, Events],

	options: {
		'class': '',
		url: null,
		wrapper: null,
		width: 480,
		height: 320,
		titlebar: true,
		bottombar: false,
		title: '&nbsp;',
		minimize: false,
		maximize: false,
		close: true,
		draggable: false,
		resizable: false,
		centered: false,
		constrain: true,
		evalScripts: false
	},

	initialize: function(options) {
		this.setOptions(options);
	},
	
	build: function() {
		this.buildBox();
		this.center();
		this.element.hide();
		this.hideObjects = Browser.Engine.trident ? {
			'onStart': function() {
				this.element.getElements('object').each(function(object){
					object.style.display = 'none';
				});
			}.bind(this),
			'onComplete': function() {
				this.element.getElements('object').each(function(object){
					object.style.display = '';
				});
			}.bind(this)
		} : {};
		this.element.set({ 'morph': this.hideObjects, 'tween': this.hideObjects });
		if (this.options.draggable) this.element.makeDraggable({
			handle: this.titlebar.setStyle('cursor','move'),
			limit: this.options.constrain ? {
				x: [0, function() { return Math.max(this.wrapper.getSize().x - this.element.getSize().x, 0); }.bind(this)], 
				y: [0, function() { return Math.max(this.wrapper.getSize().y - this.element.getSize().y, 0); }.bind(this)]
			} : null
		}).addEvents(this.hideObjects);
		if (this.options.resizable) this.element.makeResizable({
			handle: this.bottombar.setStyle('cursor','se-resize'),
			limit: this.options.constrain ? {
				x: [function() { return Math.max(this.options.width, this.title.getSize().x + this.buttons.getSize().x + this.offsets.x - this.outerSize.x); }.bind(this),
					function() { return this.wrapper.getSize().x - this.element.getPosition(this.wrapper).x - this.outerSize.x; }.bind(this)],
				y: [function() { return this.options.height; }.bind(this), 
					function() { return this.wrapper.getSize().y - this.element.getPosition(this.wrapper).y - this.outerSize.y; }.bind(this)]
			} : null
		}).addEvents(this.hideObjects).addEvents({
			'onDrag': function(element) {
				element.fireEvent('onResize');
			}
		});
		//this.element.getElements('a').addEvent('mousedown', Event.stopPropagation);
		//this.element.addEvent('onResize', function() {
		//	this.container.setStyle('height', this.element.getStyle('height').toInt() - this.offsets.y);
		//}.bind(this));
		//this.element.fireEvent('onResize');
		window.addEvent('resize', this.resize.bind(this));
		this.built = true;
		if (this.options.url) this.setContent(this.options.url);
	},
	
	buildBox: function() {
		this.wrapper = this.options.wrapper ||
			new Element('div').setStyles({
				position: 'fixed',
				left: 0, right: 0,
				top: 0, bottom: 0,
				zIndex: 1000
			}).inject(document.body);
		this.element = new WebShop.Box({},
			(this.container = new Element('div', { 'class': 'content' }).grab((this.content = new Element('div'))))
		).addClass('dialog').addClass(this.options['class']).setStyles({
			width: this.options.width,
			height: this.options.height
		}).inject(this.wrapper).store('wrapper', this.wrapper);
		if (this.options.titlebar) this.buildTitlebar().inject(this.container, 'before');
		if (this.options.bottombar || this.options.resizable) this.buildBottombar().inject(this.container, 'after');
		var size = this.element.getInnerSize(), innersize = this.container.getInnerSize();
		this.offsets = {
			x: size.x - innersize.x,
			y: size.y - innersize.y
		};
		this.outerSize = this.element.getOuterSize();
		if (this.options.titlebar) this.setTitle(this.options.title);
		this.content.set('load', {
			evalScripts: this.options.evalScripts,
			onSuccess: function() {
				//var content = arguments[2];
				//if (content.contains('<title>')) this.setTitle(content.substringBetween('<title>','</title>'));
				this.container.scrollTo(0);
				if (this.fitContent) this.morph(this.content.offsetWidth, this.content.offsetHeight);
				WebShop.initialize(this.content);
			}.bind(this)
		});
		//this.content.get('load').xhr.overrideMimeType('text/html; charset=UTF-8');
	},
	
	buildTitlebar: function() {
		this.titlebar = new Element('div', { 'class': 'titlebar position' }).adopt([
			(this.title = new Element('div', { 'class': 'left' })),
			(this.buttons = new Element('div', { 'class': 'right' }))
		]);
		if (this.options.minimize) {
			this.buttons.minimize = new Element('button', { type: 'button', 'class': 'icon minimize' }).grab(new Element('i')).addEvent('click', this.minimize.bind(this)).inject(this.buttons);
		}
		if (this.options.maximize) {
			this.buttons.maximize = new Element('button', { type: 'button', 'class': 'icon maximize' }).grab(new Element('i')).addEvent('click', this.maximize.bind(this)).inject(this.buttons);
		}
		if (this.options.close) {
			this.buttons.close = new Element('button', { type: 'button', 'class': 'icon close' }).grab(new Element('i')).addEvent('click', this.close.bind(this)).inject(this.buttons);
		}
		return this.titlebar;
	},
	
	buildBottombar: function() {
		this.bottombar = new Element('div');
		if (this.options.resizable) new Element('img', { 'class': 'resizer' }).inject(this.bottombar);
		return this.bottombar;
	},
	
	setContent: function(url, params, fit) {
		this.show();
		this.fitContent = fit;
		this.content.getParent().setStyle('overflow-y', fit ? 'hidden' : 'auto');
		this.content.load(url, params);
	},
	
	setTitle: function(title) {
		new Element('h1', { html: title }).inject(this.title.empty());
		if (WebShop.shadowElements) this.title.getElements(WebShop.shadowElements).addShadow();
	},
	
	center: function() {
		var size = this.element.getInnerSize(), winsize = this.wrapper.getSize();
		this.element.setStyles({
			left: Math.max(0, (winsize.x - size.x) / 2),
			top: Math.max(0, (winsize.y - size.y) / 2)
		});
	},
	
	morph: function(width, height, chain) {
		if (this.options.centered) this.center();
		var winSize = this.wrapper.getSize();
		var currentSize = this.maximized ? this.restoreSize : this.element.getInnerSize();
		var currentPosition = this.maximized ? this.restorePosition: this.element.getPosition(this.wrapper);
		var minSize = {
			x: (this.options.titlebar ? Math.max(this.title.getSize().x + this.buttons.getSize().x, width) : width) + this.offsets.x,
			y: height + this.offsets.y
		}, size = {
			x: Math.min(this.options.constrain ? winSize.x : 10000, Math.max(this.options.resizable ? currentSize.x : 0, minSize.x)),
			y: Math.min(this.options.constrain ? winSize.y : 10000, Math.max(this.options.resizable ? currentSize.y : 0, minSize.y))
		}, position = {
			x: Math.max(0, Math.min(currentPosition.x - (size.x - currentSize.x) / 2, winSize.x - size.x)),
			y: Math.max(0, Math.min(currentPosition.y - (size.y - currentSize.y) / 2, winSize.y - size.y))
		};
		this.setOptions({ width: minSize.x, height: minSize.y });
		if (this.maximized) {
			this.restoreSize = size;
			this.restorePosition = position;
			if (chain) chain.delay(1);
		} else if (currentSize.x != size.x || currentSize.y != size.y) {
			this.element.get('morph').start({ width: size.x, height: size.y, left: position.x, top: position.y }).chain(chain ? function(){ chain.delay(1); }.bind(this) : $empty);
			//this.container.tween('height', size.y - this.offsets.y);
		} else if (chain) chain.delay(1);
	},
	
	resize: function() {
		var winsize = this.wrapper.getSize();
		if (this.minimized || this.maximized) {/*
		} else if (this.maximized) {
			if (Browser.Engine.trident4) this.element.setStyles({
				'width': winsize.x,
				'height': winsize.y
			}).fireEvent('onResize');*/
		} else {
			if (this.options.centered) this.center();
			var position = this.element.getPosition(this.wrapper);
			if (this.options.constrain) {
				var w = winsize.x - position.x;
				var h = winsize.y - position.y;
				if (this.element.offsetWidth > w && w >= this.options.width)
					this.element.setStyle('width', w - this.outerSize.x);
				if (this.element.offsetHeight > h && h >= this.options.height)
					this.element.setStyle('height', h - this.outerSize.y);
			}
		}
	},
	
	minimize: function() {
		if (this.minimized) return this.restore();
		this.restoreSize = this.element.getInnerSize();
		this.restorePosition = this.element.getPosition(this.wrapper);
		var winsize = this.wrapper.getSize();
		this.container.hide();
		this.bottombar.hide();
		this.buttons.minimize.removeClass('minimize').addClass('restore');
		if (this.options.maximize) this.buttons.maximize.hide();
		this.element.setStyles({
			right: winsize.x - this.element.getSize().x - this.restorePosition.x,
			bottom: winsize.y - this.element.getSize().y - this.restorePosition.y,
			left: 'auto',
			top: 'auto'
		});
		this.element.morph({
			right: 0,
			bottom: Browser.Engine.trident ? (this.element.getStyle('border-top-width').toInt() + this.element.getStyle('border-bottom-width').toInt()) : 0,
			width: this.title.getInnerSize().x + this.buttons.getSize().x + this.offsets.x,
			height: 22 + 8
		});
		this.minimized = true;
	},
	
	maximize: function() {
		if (this.maximized) return this.restore();
		this.restoreSize = this.element.getInnerSize();
		this.restorePosition = this.element.getPosition(this.wrapper);
		var winsize = this.wrapper.getSize();
		if (Browser.Engine.trident4) {
			this.element.morph({
				left: 0,
				top: 0,
				width: winsize.x - 2 * this.outerSize.x,
				height: winsize.y - 2 * this.outerSize.y
			});
		} else {
			this.element.setStyles({
				right: winsize.x - this.element.getSize().x - this.restorePosition.x,
				bottom: winsize.y - this.element.getSize().y - this.restorePosition.y,
				width: 'auto',
				height: 'auto'
			})
			this.element.morph({
				left: 0,
				top: 0,
				right: 0,
				bottom: Browser.Engine.trident ? (this.element.getStyle('border-top-width').toInt() + this.element.getStyle('border-bottom-width').toInt()) : 0
			});
		}
		//this.container.tween('height', winsize.y - this.offsets.y);
		this.maximized = true;
		this.buttons.maximize.removeClass('maximize').addClass('restore');
		if (this.options.minimize) this.buttons.minimize.setStyle('visibility','hidden');
	},
	
	restore: function() {
		this.container.show();
		this.bottombar.show();
		var size = this.element.getInnerSize();
		var position = this.element.getPosition(this.wrapper);
		this.element.setStyles({
			left: position.x,
			top: position.y,
			width: size.x,
			height: size.y
		})
		this.element.morph({
			left: this.restorePosition.x,
			top: this.restorePosition.y,
			width: this.restoreSize.x,
			height: this.restoreSize.y
		});
		//this.container.tween('height', this.restoreSize.y - this.offsets.y);
		this.minimized = false;
		this.maximized = false;
		if (this.options.minimize) this.buttons.minimize.removeClass('restore').addClass('minimize').setStyle('visibility','visible');
		if (this.options.maximize) this.buttons.maximize.removeClass('restore').addClass('maximize').show();
	},
	
	show: function() {
		if (!this.built) this.build();
		this.visible = true;
		this.element.show();
		if (this.minimized) this.restore();
		if (this.options.centered) this.center();
		this.fireEvent('onShow');
		return this;
	},
	
	close: function() {
		this.visible = false;
		this.element.hide();
		this.fireEvent('onClose');
		return this;
	}

});
﻿(function(){

WebShop.Video = new Class({

	Implements: [Options, Events],

	options: {
		product: null,
		url: '',
		width: 0,
		height: 0,
		type: false,
		quality: 'high',
		title: '',
		parent: document.body,
		resume: false,
		autoplay: true,
		debug: false,
		startPosition: 0,
		color: '#0080ff'
	},

	initialize: function(options) {
	
		var quality = Cookie.read('quality');
		if (quality) this.options.quality = quality;
		this.setOptions(options);
		this.wrapper = new Element('div').grab(
			(this.div = new Element('div', { 'class': 'videoContainer', styles: { height: this.options.parent.parentNode.offsetHeight - 34 } }))
		).inject(this.options.parent);
		this.div.addEvent('destroy', function(){ this.fireEvent('destroy'); }.bind(this));
		if (Browser.Engine.trident) this.addEvent('destroy', function(){ if (this.object && this.object.controls) this.object.controls.stop(); }.create({bind: this, attempt: true}));
		this.load();
		
	},
	
	load: function() {
		
		if (this.notfound) this.notfound.destroy();
	
		this.drm = false;
		this.preview = false;
		var w = 720, h = 480;
		switch (this.options.quality) {
			case 'drm': this.drm = true;
			case 'low': w = 160; h = 120; break;
			case 'pre': case 'preview': this.preview = true;
			case 'med': case 'medium': 	w = 320; h = 240; break;
		}
		
		if (this.options.product) {
			var videos = WebShop.Video.videos[this.options.product];
			if (videos) {
				var video = this.preview ? videos['preview'] : this.drm ? videos['low'] : videos[this.options.quality] || videos[Cookie.read('quality')] || videos['local'] || videos['smooth'] || videos['high'] || videos['medium'] || videos['low'];
				var options = this.preview || this.drm ? $merge(video, { quality: this.options.quality }) : $merge(video, { videos: videos });
				this.setOptions(options);
			} else {
				new Request.JSON({
					url: context+'/ajax/videos.jsp',
					data: { no: this.options.product, title: this.options.title, preview: this.preview ? true : null },
					onComplete: function(videos) {
						if (videos) {
							WebShop.Video.videos[this.options.product] = videos;
							this.load();
						} else {
							this.notfound = new Element('div', { html: 'Video not found', styles: { background: '#000', color: '#fff', border: 0, lineHeight: 240 } }).inject(this.div);
							this.width  = 320;
							this.height = 240;
							this.type   = '';
							this.build();
						}
					}.bind(this)
				}).get();
				return;
			}
		}
			
		this.url = this.options.url;
		this.type = this.options.type;
		this.player = this.options.player;
		if (!this.type) {
			this.type = 'S';
			if (this.url.match(/\.(avi|mpe?g)[\?&$]/i)) this.type = 'W';
			if (this.url.match(/\.(mov)[\?&$]/i)) this.type = 'Q';
			if (this.url.match(/\.(swf|f[l4]v)[\?&$]/i)) this.type = 'F';
		}
		this.width  = +this.options.width  || w;
		this.height = +this.options.height || h;
		this.build.delay(1, this);
		
	},
	
	build: function() {
	
		this.width = Math.max(this.width, 320);
	
		this.position = this.position || Math.max(+this.options.startPosition || 0, 0);
		
		if (this.toolbar) this.toolbar.destroy();
		
		this.object = this.div.getFirst();
		
		if (this.object) {
			if (this.object.controls) {
				if (this.options.resume) {
					this.position = this.object.controls.currentPosition;
					if (this.object.width == this.width && this.object.height == this.height + 64) {
						this.object.URL = this.url;
						this.object.controls.currentPosition = this.position;
						this.object.controls.play();
						return;
					}
				} else this.object.controls.stop();
			}
			try {
				this.div.removeChild(this.object);
				this.fireEvent('destroy');
			} catch(e) {}
		}
		
		this.toolbar = new Element('div', { 'class': 'videoToolbar', 'id': 'videoToolbar' }).grab(
			new Element('a', { href: context+'/troubleshooting.do', target: '_blank', 'class': 'button right', html: '<b>Video Troubleshooting</b>' })
		).inject(this.wrapper);
		if (this.preview) {
			if (WebShop.InstallationParameters['preview.feedback']) {
				var feedbackOpen, feedbackDiv;
				this.toolbar.adopt(
					new Element('button', { html: 'Tell us what you think' }).addEvent('click', function(e){
						feedbackOpen = !feedbackOpen;
						if (!Browser.Engine.trident) feedbackDiv.fade('toggle');
						this.fireEvent('build', [ this.width, this.height+34+(feedbackOpen ? feedbackDiv.offsetHeight : 0), true ]);
					}.bind(this)),
					(feedbackDiv = new Element('div', {
						styles: {
							padding: '1em 0 0'
						},
						load : {
							onSuccess: function(){
								ajax.webFeedback('Product Preview', this.options.product, '', '', function(timestamp){
									document.feedbackForm.timestamp.value = timestamp;
								});
							}.bind(this)
						}
					}))
				);
				if (!Browser.Engine.trident) feedbackDiv.fade('hide');
				new Request({
					url: context+'/ajax/feedbackForm.jsp',
					data: { no: this.options.product, nocache: $time() },
					onSuccess: function(data){
						feedbackDiv.set('html', data);
					}
				}).get();
				//feedbackDiv.load(context+'/ajax/feedbackForm.jsp?no='+this.options.product+'&nocache='+$time());
			} else {
				ajax.webFeedback('Product Preview', this.options.product, '', '', $empty);
				this.toolbar.grab(
					new Element('b', { html: this.options.caption || 'Preview' })
				);
			}
		} else if (this.options.quality == 'drm') {
			this.toolbar.grab(
				new Element('b', { html: WebShop.Messages['video.drm'] })
			);
		} else {
			var options = Hash.filter(this.options.videos, function(video, quality){
				return quality != 'preview';
			});
			if (Hash.getLength(options) > 1) {
				options = Hash.map(options, function(video, quality){
					return new Element('option', { value: quality, selected: this.options.quality == quality, html: WebShop.Messages['video.'+quality] });
				}, this).getValues();
				this.toolbar.grab(
					new Element('select').adopt(options).addEvent('change', function(e) {
						this.change({ quality: e.target.value, resume: true });
					}.bind(this))
				);
			} else {
				this.toolbar.grab(
					new Element('b', { html: WebShop.Messages['video.'+this.options.quality] })
				);
			}
		}
		this.toolbar.grab(new Element('br', { clear: 'all' }));
		
		// Check Silverlight support, fallback to Windows Media Player if necessary
		if (this.type.match(/^(I|S|ism|xap)$/) && !((Browser.Plugins.Silverlight || !Cookie.read('useWindowsMediaPlayer')) && (this.preview || !Browser.Platform.linux))) {
			this.type = 'W';
			this.url = this.url.replace(/\.(xap|ism)/, '.asx').replace('.smooth.', '.high.');
		}
		
		switch (this.type) {
			// Windows Media
			case 'W': case 'asx':
				this.height += 64; break;
			case 'Q': case 'mov':
				this.height += 15; break;
		}
		
		var toolbarWidth = 10;
		this.toolbar.getChildren().each(function(el){ toolbarWidth += el.offsetWidth; });
		this.fireEvent('build', [ Math.max(this.width, toolbarWidth), this.height+32 ]);
		
		this.div.get('tween').start('height', this.height).chain(function(){
		
			switch (this.type) {
	
				// Silverlight
				case 'I': case 'ism':
				case 'S': case 'xap':
					
					var player = this.player || '/ClientBin/VideoPlayer.xap';
					var params = this.player ? this.url : 'Source='+escape(this.url)+',AutoPlay='+!!this.options.autoplay+',Debug='+!!this.options.debug+',Locale='+locale+',ShowEndScreen='+(!!window['CourseViewer']&&!!CourseViewer.loadedCourse)+(this.position ? ',Position='+this.position : '')+(this.options.maxBitrate ? ',MaxBitrate='+this.options.maxBitrate : '')+',Color='+this.options.color;
	
					var install = Browser.Platform.win ? [
									'<div style="position:absolute; left:0; width:100%; top:50%; margin-top:-80px; text-align:center; background:#000; color:#fff;">',
										'<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">',
											'<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" onload="WebShop.parseInputs(document.getElement(\'.videoContainer\'));"/>',
										'</a>',
										'<br/><br/>',
										'-- OR -- ',
										'<br/><br/>',
										'<a class="button" href="', this.url.replace(/\.(xap|ism)/,".asx").replace('.smooth.','.high.'), '" onclick="onSilverlightError(); if ($(this).getParent().getElement(\'input\').checked) Cookie.write(\'useWindowsMediaPlayer\', true); return false;"><b>Play with Windows Media Player</b></a>',
										'<br/><br/>',
										'<label style="color:#fff;"><input type="checkbox">Remember this decision.</label>',
									'</div>'
								  ] : [
									'<div style="position:absolute; left:0; width:100%; top:50%; margin-top:-33px; text-align:center; background:#000; color:#fff;">',
										'<a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">',
											'<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" onload="WebShop.parseInputs(document.getElement(\'.videoContainer\'));"/>',
										'</a>',
									'</div>'
								  ];
						
					window.onSilverlightMediaTick = function(position, duration) {
						this.position = position;
						this.fireEvent('tick', [ position, duration ]);
					}.bind(this);
					window.onSilverlightError = function(sender, args) {
						if (args) console.log(args.errorType, args.errorCode, args.errorMessage);
						if (args && args.errorCode == 8001) {
							(function(){ this.div.set('html', install); }).delay(1, this);
						} else {
							this.type = 'W';
							this.url = this.url.replace(/\.(xap|ism)/, '.asx').replace('.smooth.', '.high.');
							this.build();
						}
					}.bind(this);
					
					this.div.set('html',
						'<object width="100%" height="', this.height, '" type="application/x-silverlight" data="data:application/x-silverlight,">',
							'<param name="source" value="', player, '"></param>',
							'<param name="initparams" value="', params, '"></param>',
							'<param name="background" value="#000000"></param>',
							'<param name="onerror" value="onSilverlightError"></param>',
							'<param name="minRuntimeVersion" value="3.0.40307.0" />',
							'<param name="autoUpgrade" value="false" />',
							install.join(''),
						'</object>'
					);
					
					var timer;
					timer = (function(){
						this.object = this.div.getFirst();
						if (this.object) $clear(timer);
					}).periodical(100, this);
					
					break;
	
				// Windows Media
				case 'W': case 'asx':
					var plugin = Browser.Plugins.WindowsMediaPlayer;
					
					if (!plugin.activex) this.url = this.url + '?jsessionid=' + jsessionid;
					
					if (plugin.activex || plugin.firefox) {
						this.div.set('html',
							'<object width="', this.width, '" height="', this.height, '" ',
								plugin.activex ? 'classid="clsid:'+plugin.activex.classid+'"' : 'type="application/x-ms-wmp" data="'+this.url+'"', '>',
								plugin.firefox && Browser.Engine.webkit ? '<param name="src" value="'+this.url+'"></param>' :
								plugin.activex ? '<param name="url" value="'+this.url+'"></param>' : '',
								this.position ? '<param name="currentPosition" value="'+this.position/1000+'"></param>' : '',
								'<param name="stretchToFit" value="true"></param>',
								'<param name="volume" value="100"></param>',
							'</object>'
						); 
					} else {
						this.div.set('html',
							'<embed width="', this.width, '" height="', this.height, '" ',
								'type="video/x-ms-asf" src="', this.url, '"',
								this.position ? ' currentPosition="'+this.position/1000+'"' : '',
								' stretchToFit="1"',
								' volume="100">',
							'</embed>'
						); 
					}
					
					var timer;
					timer = (function(){
						this.object = this.div.getFirst();
						if (this.object) {
							$clear(timer);
							timer = (function(){
								if (this.object.settings) {
									$clear(timer);
									this.object.settings.volume = 100;
									if (this.object.controls) timer = (function(){
										if (!this.object || !this.object.controls) return $clear(timer);
										var position = Math.round(this.object.controls.currentPosition)*1000;
										if (position != this.position) {
											this.position = position;
											this.fireEvent('tick', [ position, Math.round(this.object.currentMedia.duration)*1000 ]);
										}
									}).periodical(1000, this);
								}
							}).periodical(100, this);
						}
					}).periodical(100, this);
					
					break;
					
				// Quicktime
				case 'Q': case 'mov':
					
					var activex = Browser.Engine.trident;
					
					this.div.set('html',
						'<object width="', this.width, '" height="', this.height, '" ',
							activex ? 'classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"'
									: 'type="video/quicktime" data="'+this.url+'"', '>',
							activex ? '<param name="src" value="'+this.url+'"></param>' : '',
							'<param name="controller" value="true"></param>',
							'<param name="autoplay" value="', !!this.options.autoplay, '"></param>',
							'<param name="bgcolor" value="#000000"></param>',
							'<param name="volume" value="255"></param>',
						'</object>'
					);
					
					break;
					
				// Flash
				case 'F': case 'swf':
					
					if (!this.player && this.url.matches(/\.f[l4]v[\?&$]/)) {
						this.player = '/flash/AkamaiMultiPlayer.swf';
						this.url = 'src=' + escape(this.url) + '&themeColor=' + this.options.color;
					}
					
					var player = this.player || this.url;
					var params = this.player && this.url;
					
					var activex = Browser.Engine.trident;
					
					this.div.set('html',
						'<object width="', this.width, '" height="', this.height, '" ',
							activex ? 'classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
									: 'type="application/x-shockwave-flash" data="'+player+'"', '>',
							activex ? '<param name="movie" value="'+player+'"></param>' : '',
							params  ? '<param name="flashvars" value="'+params+'"></param>' : '',
						'</object>'
					);
					
					break;
				
				// Template	
				case 'T': case 'html':
				
					this.url = this.url + (this.url.contains('?') ? '&' : '?') + 'width='+this.width+'&height='+this.height;
					
					this.div.set('html',
						'<iframe width="', this.width, '" height="', this.height, '" src="', this.url, '">',
						'</iframe>'
					);
					
					break;
				
			}
			
		}.bind(this));
	
	},
	
	change: function(options) {
		
		if (options.quality && options.resume && this.options.videos) {
		
			this.setOptions(this.options.videos[options.quality]);
			this.load();
			
		} else {
			
			if (!$defined(options.resume)) options.resume = (this.options.type == options.type == 'W') && (this.options.product == options.product);
			options.destroy = !(this.options.type == options.type && this.options.width == options.width && this.options.height == options.height);
			
			this.setOptions(options);
			this.load();
		}
			
		if (options.quality && options.quality.match(/^(low|med(ium)?|high)$/i)) Cookie.write('quality', options.quality, { domain: cookieDomain, path: cookiePath });

	}

});

WebShop.Video.videos = {};

Browser.Plugins.WindowsMediaPlayer = {
	activex: Browser.Engine.trident ? {
		classid: $try(function(){ return new ActiveXObject('WMPlayer.OCX.7'); }) ? '6BF52A52-394A-11d3-B153-00C04F79FAA6' : '22D6F312-B0F6-11D0-94AB-0080C74C7E95'
	} : false,
	firefox: !!navigator.plugins['Microsoft® Windows Media Player Firefox Plugin']
};

Browser.Plugins.Silverlight = Browser.Engine.trident ? $try(function(){ return new ActiveXObject('AgControl.AgControl'); }) : !!navigator.plugins['Silverlight Plug-In'];

})();
WebShop.VideoDialog = new Class({

	Extends: WebShop.Dialog,
	
	options: {
		'class': 'videoDialog',
		centered: true,
		constrain: false
	},
	
	initialize: function(options) {
		this.parent(options);
		this.videos = {};
	},
	
	show: function(el) {
		WebShop.overlay.show(function(){
			if (!this.built) {
				this.build();
				this.element.set({ 'morph': {}, 'tween': {} });
			}
			var options = Hash.extend({}, el.retrieve('video:options'));
			this.visible = true;
			this.setTitle(options.title);
			this.element.show();
			this.center();
			if (this.video) {
				this.video.change(options);
			} else {
				this.video = new WebShop.Video(Hash.extend(options, { parent: this.content }));
				this.video.addEvent('build', this.morph.bind(this));
			}
		}.bind(this));
		//this.element.addEvent('click', Event.stopPropagation);
		//WebShop.overlay.content.addEvent('click', this.close.bind(this));
		return false;
	},
	
	close: function() {
		this.visible = false;
		this.element.hide();
		try {
			this.video.div.removeChild(this.video.object);
			this.video.object.controls.stop();
		} catch(e) {}
		WebShop.overlay.hide.delay(100, WebShop.overlay);
	}

});

document.registerEvents('a[target=videoDialog]', {
	click: function(e){
		var href = this.getAttribute('href'), rel = this.get('rel').split(' ');
		if (!href) return false;
		var options = this.retrieve('video:options');
		if (!options) {
			var video = RegExp.cache('video/streaming/([^/]+)/((?:.*)(?=\\.(low|med(?:ium)|high|preview|drm|smooth|local)(?:\\.(.*))?)|.*)').exec(href);
			if (video) {
				options = {
					url: href,
					product: video[1],
					title: video[2],
					quality: video[3],
					type: video[4],
					debug: true
				};
			} else {
				options = {
					url: href,
					quality: false
				};
			}
			this.get('rel').split(' ').each(function(rel){
				rel = rel.split(':');
				options[rel[0]] = unescape(rel[1]);
			});
			this.store('video:options', options);
		}
		if (!WebShop.overlay) WebShop.overlay = new Overlay();
		if (!WebShop.videoDialog) WebShop.videoDialog = new WebShop.VideoDialog({ wrapper: WebShop.overlay.content });
		WebShop.videoDialog.show(this);
		return false;
	}, 
	mouseover: function(e){
		this.retrieve('tip:title', '');
		this.retrieve('tip:text', this.title);
	}
}, 1);
WebShop.ImageDialog = new Class({

	Extends: WebShop.Dialog,
	
	options: {
		'class': 'imageDialog',
		titlebar: false,
		width: 160,
		height: 160,
		centered: true
	},
	
	initialize: function(options) {
		this.setOptions(options);
	},
	
	add: function(parent) {
		return;
		var elements = $(parent||document).getElements('a[rel^=lightbox]');
			elements.each(function(el){
				el.onclick = this.show.pass(el, this);
			}, this);
		WebShop.tips.attach(elements.store('tip:text', 'View full size image'));
	},
	
	show: function(link) {
		if (!this.built) {
			this.build();
			this.element.set({ 'morph': {}, 'tween': {} });
			this.image = new Element('img').setStyle('opacity', 0).inject(this.content);
			this.preload = new Image();
			this.preload.onload = function(){
				this.element.show().fade('show');
				this.image.hide().src = this.preload.src;
				this.morph(this.preload.width, this.preload.height, function(){
					this.image.show().fade('in');
				}.bind(this));
			}.bind(this);
		}
		this.preload.src = link.href;
		WebShop.overlay.show(function(){
			this.visible = true;
			this.element.show().fade('show');
			this.center();
		}.bind(this));
		this.element.addEvent('click', Event.stop);
		WebShop.overlay.content.addEvent('click', this.close.bind(this));
		return false;
	},
	
	close: function() {
		this.visible = false;
		this.element.hide().fade('hide');
		this.image.fade('hide');
		WebShop.overlay.hide();
	}
	
});

document.registerEvents('a[rel^=lightbox]', {
	mouseover: function(){
		this.store('tip:text', 'View full size image');
	},
	click: function() { 
		if (!WebShop.imageDialog) {
			if (!WebShop.overlay) WebShop.overlay = new Overlay();
			WebShop.imageDialog = new WebShop.ImageDialog({ wrapper: WebShop.overlay.content });
		}
		WebShop.imageDialog.show(this); 
		return false; 
	}
}, 1);
(function(){

var pingRequest = new Request.JSON({
	url: context+'/ajax/ping.do',
	async: false
});

var ping = function(events) {
	pingRequest.removeEvents().addEvents(events).get();
};

var requestBase = new Class({
	
	options: {
		ping: true,
		requireLogin: false,
		nocache: true
	},
	
	initialize: function(options){
		if (!Browser.Features.xhr) return;
		this.setOptions(options);
		this.user = null;
		this.parent(options);
	},
	
	send: function(options){
		if (!this.check(options)) return this;
		
		if (this.options.ping) ping({
			'onSuccess': function(data){ this.user = data.user; }.bind(this)
		});
		
		if (this.options.nocache) {
			var _time = { '_time':  new Date().getTime() };
			options.data = (options.data) ? $extend(options.data, _time) : _time;
		}
		
		if (this.options.requireLogin && !this.user) {
			WebShop.error('You must be logged in to perform this action.');
			this.fireEvent('onFailure');
		} else {
			this.parent(options);
		}
		
		return this;
	}

});

WebShop.Request = new Class({
	
	Extends: Request,
	
	Implements: requestBase
	
});

WebShop.Request.HTML = new Class({
	
	Extends: Request.HTML,
	
	Implements: requestBase,

	options: {
		update: false,
		evalScripts: true,
		filter: false,
		onSuccess: function(){
			if (this.options.update) WebShop.initialize(this.options.update);
		}
	}
	
});

WebShop.Request.JSON = new Class({
	
	Extends: Request.JSON,
	
	Implements: requestBase
	
});

})();
WebShop.Accordion = new Class({
	
	Extends: Accordion,
	
	options: {
		onActive: function(toggler, element){
			toggler.addClass('active');
		},
		onBackground: function(toggler, element) {
			toggler.removeClass('active');
			for (var fx in this.effects) if (fx != 'opacity') element.setStyle(fx, element['offset'+fx.capitalize()]);
			element.setStyle('overflow', 'hidden');
		},
		onComplete: function(){
			var element = $(this.elements[this.previous]);
			if (element.get('src') && !element.retrieve('accordion:loaded')) return;
			if (element && element.offsetWidth > 0 && element.offsetHeight > 0) {
				for (var fx in this.effects) if (fx != 'opacity') element.setStyle(fx, 'auto');
				element.setStyle('overflow', 'visible');
			}
		},
		alwaysHide: true,
		opacity: !Browser.Engine.trident,
		link: 'cancel'
	},

	display: function(index){
		index = ($type(index) == 'element') ? this.elements.indexOf(index) : index;
		if (index < 0 || (this.timer && this.options.wait) || (index === this.previous && !this.options.alwaysHide)) return this;
		var element = this.elements[index];
		var content = element.getElement('div.element-content') || new Element('div', { 'class': 'element-content' }).adopt(element.childNodes).inject(element);
		if (element.get('src') && !(element.retrieve('accordion:loaded') || element.retrieve('accordion:loading'))) {
			
			content.grab(new Element('div', { 'class': 'coz-loading-spacer' }));
			
			if (content.getStyle('position') == 'static') content.setStyle('position', 'relative');

			var overlay = new Element('div', { 'class': 'coz-loading-overlay' }).set('opacity', 0.8).inject(content);
			var loading = new Element('div', { 'class': 'coz-loading' }).inject(content);
			
			var delay = 2;
			var x = 128-delay*16, d = 1;
			(function(){
				if (x == 128-delay*16) d =  1;
				if (x == 464+delay*16) d = -1;
				x += d*16;
				loading.setStyle('background-position', [x,0]);
			}).periodical(1000/15);
			
			(function(){
				
				element.store('accordion:loading', true);
				this.display(element);
				
				content.set('load', {
					url: element.get('src'),
					onRequest: WebShop.busy,
					onComplete: WebShop.clearMessage,
					onSuccess: function(){
						element.store('accordion:loaded', true);
						//this.display(element);
						this.stopTimer();
						for (var fx in this.effects) if (fx != 'opacity') element.setStyle(fx, element['offset'+fx.capitalize()]);
						element.setStyle('overflow', 'hidden');
						var obj = {};
						this.elements.each(function(el, i){
							obj[i] = {};
							var hide = (i != index);
							for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]];
						}, this);
						var from = {}, to = {};
						for (var i in obj){
							var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
							for (var p in iProps){
								var parsed = this.prepare(this.elements[i], p, iProps[p]);
								iFrom[p] = parsed.from;
								iTo[p] = parsed.to;
							}
						}
						this.from = from;
						this.to = to;
						this.time = 0;
						this.startTimer();
						//this.start(obj);
						WebShop.initialize(content);
					}.bind(this)
				}).load();
			
			}).delay(1, this);
			
			return this;
		}
		this.previous = index;
		var obj = {};
		this.elements.each(function(el, i){
			obj[i] = {};
			var hide = (i != index) || (this.options.alwaysHide && (el.offsetHeight > 0));
			this.fireEvent(hide ? 'onBackground' : 'onActive', [this.togglers[i], el]);
			for (var fx in this.effects) obj[i][fx] = hide ? 0 : el[this.effects[fx]];
		}, this);
		return this.start(obj);
	}
	
});

document.registerEvent('.accordion > dt', 'click', function(e){
	var element = this.getParent('.accordion');
	if (!element) return;
	var accordion = element.retrieve('accordion');
	if (!accordion) {
		var togglers = element.getChildren('dt');
		var elements = element.getChildren('dd');
		accordion = new WebShop.Accordion(element, togglers, elements, { display: -1 });
		element.store('accordion', accordion);
	}
	var idx = accordion.togglers.indexOf(this);
	accordion.display(idx);
});