/*
---
MooTools: the javascript framework

web build:
 - http://mootools.net/core/7c56cfef9dddcf170a5d68e3fb61cfd7

packager build:
 - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff

copyrights:
  - [MooTools](http://mootools.net)

licenses:
  - [MIT License](http://mootools.net/license.txt)
...
*/
(function(){this.MooTools={version:"1.3",build:"a3eed692dd85050d80168ec2c708efe901bb7db3"};var e=this.typeOf=function(i){if(i==null){return"null";}if(i.$family){return i.$family();
}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments";
}if("item" in i){return"collection";}}}return typeof i;};var t=this.instanceOf=function(v,i){if(v==null){return false;}var u=v.$constructor||v.constructor;
while(u){if(u===i){return true;}u=u.parent;}return v instanceof i;};var f=this.Function;var q=true;for(var p in {toString:1}){q=null;}if(q){q=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];
}f.prototype.overloadSetter=function(u){var i=this;return function(w,v){if(w==null){return this;}if(u||typeof w!="string"){for(var x in w){i.call(this,x,w[x]);
}if(q){for(var y=q.length;y--;){x=q[y];if(w.hasOwnProperty(x)){i.call(this,x,w[x]);}}}}else{i.call(this,w,v);}return this;};};f.prototype.overloadGetter=function(u){var i=this;
return function(w){var x,v;if(u||typeof w!="string"){x=w;}else{if(arguments.length>1){x=arguments;}}if(x){v={};for(var y=0;y<x.length;y++){v[x[y]]=i.call(this,x[y]);
}}else{v=i.call(this,w);}return v;};};f.prototype.extend=function(i,u){this[i]=u;}.overloadSetter();f.prototype.implement=function(i,u){this.prototype[i]=u;
}.overloadSetter();var n=Array.prototype.slice;f.from=function(i){return(e(i)=="function")?i:function(){return i;};};Array.from=function(i){if(i==null){return[];
}return(k.isEnumerable(i)&&typeof i!="string")?(e(i)=="array")?i:n.call(i):[i];};Number.from=function(u){var i=parseFloat(u);return isFinite(i)?i:null;
};String.from=function(i){return i+"";};f.implement({hide:function(){this.$hidden=true;return this;},protect:function(){this.$protected=true;return this;
}});var k=this.Type=function(w,v){if(w){var u=w.toLowerCase();var i=function(x){return(e(x)==u);};k["is"+w]=i;if(v!=null){v.prototype.$family=(function(){return u;
}).hide();v.type=i;}}if(v==null){return null;}v.extend(this);v.$constructor=k;v.prototype.$constructor=v;return v;};var o=Object.prototype.toString;k.isEnumerable=function(i){return(i!=null&&typeof i.length=="number"&&o.call(i)!="[object Function]");
};var b={};var d=function(i){var u=e(i.prototype);return b[u]||(b[u]=[]);};var h=function(v,z){if(z&&z.$hidden){return this;}var u=d(this);for(var w=0;
w<u.length;w++){var y=u[w];if(e(y)=="type"){h.call(y,v,z);}else{y.call(this,v,z);}}var x=this.prototype[v];if(x==null||!x.$protected){this.prototype[v]=z;
}if(this[v]==null&&e(z)=="function"){s.call(this,v,function(i){return z.apply(i,n.call(arguments,1));});}return this;};var s=function(i,v){if(v&&v.$hidden){return this;
}var u=this[i];if(u==null||!u.$protected){this[i]=v;}return this;};k.implement({implement:h.overloadSetter(),extend:s.overloadSetter(),alias:function(i,u){h.call(this,i,this.prototype[u]);
}.overloadSetter(),mirror:function(i){d(this).push(i);return this;}});new k("Type",k);var c=function(u,y,w){var v=(y!=Object),C=y.prototype;if(v){y=new k(u,y);
}for(var z=0,x=w.length;z<x;z++){var D=w[z],B=y[D],A=C[D];if(B){B.protect();}if(v&&A){delete C[D];C[D]=A.protect();}}if(v){y.implement(C);}return c;};c("String",String,["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","quote","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase"])("Array",Array,["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","indexOf","lastIndexOf","filter","forEach","every","map","some","reduce","reduceRight"])("Number",Number,["toExponential","toFixed","toLocaleString","toPrecision"])("Function",f,["apply","call","bind"])("RegExp",RegExp,["exec","test"])("Object",Object,["create","defineProperty","defineProperties","keys","getPrototypeOf","getOwnPropertyDescriptor","getOwnPropertyNames","preventExtensions","isExtensible","seal","isSealed","freeze","isFrozen"])("Date",Date,["now"]);
Object.extend=s.overloadSetter();Date.extend("now",function(){return +(new Date);});new k("Boolean",Boolean);Number.prototype.$family=function(){return isFinite(this)?"number":"null";
}.hide();Number.extend("random",function(u,i){return Math.floor(Math.random()*(i-u+1)+u);});Object.extend("forEach",function(i,v,w){for(var u in i){if(i.hasOwnProperty(u)){v.call(w,i[u],u,i);
}}});Object.each=Object.forEach;Array.implement({forEach:function(w,x){for(var v=0,u=this.length;v<u;v++){if(v in this){w.call(x,this[v],v,this);}}},each:function(i,u){Array.forEach(this,i,u);
return this;}});var r=function(i){switch(e(i)){case"array":return i.clone();case"object":return Object.clone(i);default:return i;}};Array.implement("clone",function(){var u=this.length,v=new Array(u);
while(u--){v[u]=r(this[u]);}return v;});var a=function(u,i,v){switch(e(v)){case"object":if(e(u[i])=="object"){Object.merge(u[i],v);}else{u[i]=Object.clone(v);
}break;case"array":u[i]=v.clone();break;default:u[i]=v;}return u;};Object.extend({merge:function(B,x,w){if(e(x)=="string"){return a(B,x,w);}for(var A=1,u=arguments.length;
A<u;A++){var y=arguments[A];for(var z in y){a(B,z,y[z]);}}return B;},clone:function(i){var v={};for(var u in i){v[u]=r(i[u]);}return v;},append:function(y){for(var x=1,v=arguments.length;
x<v;x++){var u=arguments[x]||{};for(var w in u){y[w]=u[w];}}return y;}});["Object","WhiteSpace","TextNode","Collection","Arguments"].each(function(i){new k(i);
});var j=Date.now();String.extend("uniqueID",function(){return(j++).toString(36);});var g=this.Hash=new k("Hash",function(i){if(e(i)=="hash"){i=Object.clone(i.getClean());
}for(var u in i){this[u]=i[u];}return this;});g.implement({forEach:function(i,u){Object.forEach(this,i,u);},getClean:function(){var u={};for(var i in this){if(this.hasOwnProperty(i)){u[i]=this[i];
}}return u;},getLength:function(){var u=0;for(var i in this){if(this.hasOwnProperty(i)){u++;}}return u;}});g.alias("each","forEach");Object.type=k.isObject;
var m=this.Native=function(i){return new k(i.name,i.initialize);};m.type=k.type;m.implement=function(w,u){for(var v=0;v<w.length;v++){w[v].implement(u);
}return m;};var l=Array.type;Array.type=function(i){return t(i,Array)||l(i);};this.$A=function(i){return Array.from(i).slice();};this.$arguments=function(u){return function(){return arguments[u];
};};this.$chk=function(i){return !!(i||i===0);};this.$clear=function(i){clearTimeout(i);clearInterval(i);return null;};this.$defined=function(i){return(i!=null);
};this.$each=function(v,u,w){var i=e(v);((i=="arguments"||i=="collection"||i=="array"||i=="elements")?Array:Object).each(v,u,w);};this.$empty=function(){};
this.$extend=function(u,i){return Object.append(u,i);};this.$H=function(i){return new g(i);};this.$merge=function(){var i=Array.slice(arguments);i.unshift({});
return Object.merge.apply(null,i);};this.$lambda=f.from;this.$mixin=Object.merge;this.$random=Number.random;this.$splat=Array.from;this.$time=Date.now;
this.$type=function(i){var u=e(i);if(u=="elements"){return"array";}return(u=="null")?false:u;};this.$unlink=function(i){switch(e(i)){case"object":return Object.clone(i);
case"array":return Array.clone(i);case"hash":return new g(i);default:return i;}};})();Array.implement({invoke:function(a){var b=Array.slice(arguments,1);
return this.map(function(c){return c[a].apply(c,b);});},every:function(c,d){for(var b=0,a=this.length;b<a;b++){if((b in this)&&!c.call(d,this[b],b,this)){return false;
}}return true;},filter:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){if((b in this)&&d.call(e,this[b],b,this)){c.push(this[b]);}}return c;},clean:function(){return this.filter(function(a){return a!=null;
});},indexOf:function(c,d){var a=this.length;for(var b=(d<0)?Math.max(0,a+d):d||0;b<a;b++){if(this[b]===c){return b;}}return -1;},map:function(d,e){var c=[];
for(var b=0,a=this.length;b<a;b++){if(b in this){c[b]=d.call(e,this[b],b,this);}}return c;},some:function(c,d){for(var b=0,a=this.length;b<a;b++){if((b in this)&&c.call(d,this[b],b,this)){return true;
}}return false;},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a];}return d;},link:function(c){var a={};
for(var e=0,b=this.length;e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break;}}}return a;},contains:function(a,b){return this.indexOf(a,b)!=-1;
},append:function(a){this.push.apply(this,a);return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[Number.random(0,this.length-1)]:null;
},include:function(a){if(!this.contains(a)){this.push(a);}return this;},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b]);}return this;
},erase:function(b){for(var a=this.length;a--;){if(this[a]===b){this.splice(a,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var d=[];
for(var b=0,a=this.length;b<a;b++){var c=typeOf(this[b]);if(c=="null"){continue;}d=d.concat((c=="array"||c=="collection"||c=="arguments"||instanceOf(this[b],Array))?Array.flatten(this[b]):this[b]);
}return d;},pick:function(){for(var b=0,a=this.length;b<a;b++){if(this[b]!=null){return this[b];}}return null;},hexToRgb:function(b){if(this.length!=3){return null;
}var a=this.map(function(c){if(c.length==1){c+=c;}return c.toInt(16);});return(b)?a:"rgb("+a+")";},rgbToHex:function(d){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!d){return"transparent";
}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);b.push((c.length==1)?"0"+c:c);}return(d)?b:"#"+b.join("");}});Array.alias("extend","append");
var $pick=function(){return Array.from(arguments).pick();};String.implement({test:function(a,b){return((typeOf(a)=="regexp")?a:new RegExp(""+a,b)).test(this);
},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());
});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);
}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0);
return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a<this;a++){b.call(c,a,this);}},toFloat:function(){return parseFloat(this);},toInt:function(a){return parseInt(this,a||10);
}});Number.alias("each","times");(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat(Array.from(arguments)));
};}});Number.implement(a);})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);Function.extend({attempt:function(){for(var b=0,a=arguments.length;
b<a;b++){try{return arguments[b]();}catch(c){}}return null;}});Function.implement({attempt:function(a,c){try{return this.apply(c,Array.from(a));}catch(b){}return null;
},bind:function(c){var a=this,b=(arguments.length>1)?Array.slice(arguments,1):null;return function(){if(!b&&!arguments.length){return a.call(c);}if(b&&arguments.length){return a.apply(c,b.concat(Array.from(arguments)));
}return a.apply(c,b||arguments);};},pass:function(b,c){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass(a,c),b);
},periodical:function(c,b,a){return setInterval(this.pass(a,b),c);}});delete Function.prototype.bind;Function.implement({create:function(b){var a=this;
b=b||{};return function(d){var c=b.arguments;c=(c!=null)?Array.from(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);}var e=function(){return a.apply(b.bind||null,c);
};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return Function.attempt(e);}return e();};
},bind:function(c,b){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},bindWithEvent:function(c,b){var a=this;
if(b!=null){b=Array.from(b);}return function(d){return a.apply(c,(b==null)?arguments:[d].concat(b));};},run:function(a,b){return this.apply(b,Array.from(a));
}});var $try=Function.attempt;Object.extend({subset:function(c,f){var e={};for(var d=0,a=f.length;d<a;d++){var b=f[d];e[b]=c[b];}return e;},map:function(a,d,e){var c={};
for(var b in a){if(a.hasOwnProperty(b)){c[b]=d.call(e,a[b],b,a);}}return c;},filter:function(a,c,d){var b={};Object.each(a,function(f,e){if(c.call(d,f,e,a)){b[e]=f;
}});return b;},every:function(a,c,d){for(var b in a){if(a.hasOwnProperty(b)&&!c.call(d,a[b],b)){return false;}}return true;},some:function(a,c,d){for(var b in a){if(a.hasOwnProperty(b)&&c.call(d,a[b],b)){return true;
}}return false;},keys:function(a){var c=[];for(var b in a){if(a.hasOwnProperty(b)){c.push(b);}}return c;},values:function(b){var a=[];for(var c in b){if(b.hasOwnProperty(c)){a.push(b[c]);
}}return a;},getLength:function(a){return Object.keys(a).length;},keyOf:function(a,c){for(var b in a){if(a.hasOwnProperty(b)&&a[b]===c){return b;}}return null;
},contains:function(a,b){return Object.keyOf(a,b)!=null;},toQueryString:function(a,b){var c=[];Object.each(a,function(g,f){if(b){f=b+"["+f+"]";}var e;switch(typeOf(g)){case"object":e=Object.toQueryString(g,f);
break;case"array":var d={};g.each(function(j,h){d[h]=j;});e=Object.toQueryString(d,f);break;default:e=f+"="+encodeURIComponent(g);}if(g!=null){c.push(e);
}});return c.join("&");}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(a){return Object.keyOf(this,a);},hasValue:function(a){return Object.contains(this,a);
},extend:function(a){Hash.each(a||{},function(c,b){Hash.set(this,b,c);},this);return this;},combine:function(a){Hash.each(a||{},function(c,b){Hash.include(this,b,c);
},this);return this;},erase:function(a){if(this.hasOwnProperty(a)){delete this[a];}return this;},get:function(a){return(this.hasOwnProperty(a))?this[a]:null;
},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b;}return this;},empty:function(){Hash.each(this,function(b,a){delete this[a];},this);
return this;},include:function(a,b){if(this[a]==null){this[a]=b;}return this;},map:function(a,b){return new Hash(Object.map(this,a,b));},filter:function(a,b){return new Hash(Object.filter(this,a,b));
},every:function(a,b){return Object.every(this,a,b);},some:function(a,b){return Object.some(this,a,b);},getKeys:function(){return Object.keys(this);},getValues:function(){return Object.values(this);
},toQueryString:function(a){return Object.toQueryString(this,a);}});Hash.extend=Object.append;Hash.alias({indexOf:"keyOf",contains:"hasValue"});(function(){var l=this.document;
var j=l.window=this;var b=1;this.$uid=(j.ActiveXObject)?function(e){return(e.uid||(e.uid=[b++]))[0];}:function(e){return e.uid||(e.uid=b++);};$uid(j);$uid(l);
var a=navigator.userAgent.toLowerCase(),c=navigator.platform.toLowerCase(),k=a.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0],g=k[1]=="ie"&&l.documentMode;
var p=this.Browser={extend:Function.prototype.extend,name:(k[1]=="version")?k[3]:k[1],version:g||parseFloat((k[1]=="opera"&&k[4])?k[4]:k[2]),Platform:{name:a.match(/ip(?:ad|od|hone)/)?"ios":(a.match(/(?:webos|android)/)||c.match(/mac|win|linux/)||["other"])[0]},Features:{xpath:!!(l.evaluate),air:!!(j.runtime),query:!!(l.querySelector),json:!!(j.JSON)},Plugins:{}};
p[p.name]=true;p[p.name+parseInt(p.version,10)]=true;p.Platform[p.Platform.name]=true;p.Request=(function(){var r=function(){return new XMLHttpRequest();
};var q=function(){return new ActiveXObject("MSXML2.XMLHTTP");};var e=function(){return new ActiveXObject("Microsoft.XMLHTTP");};return Function.attempt(function(){r();
return r;},function(){q();return q;},function(){e();return e;});})();p.Features.xhr=!!(p.Request);var i=(Function.attempt(function(){return navigator.plugins["Shockwave Flash"].description;
},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);p.Plugins.Flash={version:Number(i[0]||"0."+i[1])||0,build:Number(i[2])||0};
p.exec=function(q){if(!q){return q;}if(j.execScript){j.execScript(q);}else{var e=l.createElement("script");e.setAttribute("type","text/javascript");e.text=q;
l.head.appendChild(e);l.head.removeChild(e);}return q;};String.implement("stripScripts",function(q){var e="";var r=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(s,t){e+=t+"\n";
return"";});if(q===true){p.exec(e);}else{if(typeOf(q)=="function"){q(e,r);}}return r;});p.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event});
this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,q){j[e]=q;});this.Document=l.$constructor=new Type("Document",function(){});
l.$family=Function.from("document").hide();Document.mirror(function(e,q){l[e]=q;});l.html=l.documentElement;l.head=l.getElementsByTagName("head")[0];if(l.execCommand){try{l.execCommand("BackgroundImageCache",false,true);
}catch(h){}}if(this.attachEvent&&!this.addEventListener){var d=function(){this.detachEvent("onunload",d);l.head=l.html=l.window=null;};this.attachEvent("onunload",d);
}var n=Array.from;try{n(l.html.childNodes);}catch(h){Array.from=function(q){if(typeof q!="string"&&Type.isEnumerable(q)&&typeOf(q)!="array"){var e=q.length,r=new Array(e);
while(e--){r[e]=q[e];}return r;}return n(q);};var m=Array.prototype,o=m.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var q=m[e];
Array[e]=function(r){return q.apply(Array.from(r),o.call(arguments,1));};});}if(p.Platform.ios){p.Platform.ipod=true;}p.Engine={};var f=function(q,e){p.Engine.name=q;
p.Engine[q+e]=true;p.Engine.version=e;};if(p.ie){p.Engine.trident=true;switch(p.version){case 6:f("trident",4);break;case 7:f("trident",5);break;case 8:f("trident",6);
}}if(p.firefox){p.Engine.gecko=true;if(p.version>=3){f("gecko",19);}else{f("gecko",18);}}if(p.safari||p.chrome){p.Engine.webkit=true;switch(p.version){case 2:f("webkit",419);
break;case 3:f("webkit",420);break;case 4:f("webkit",525);}}if(p.opera){p.Engine.presto=true;if(p.version>=9.6){f("presto",960);}else{if(p.version>=9.5){f("presto",950);
}else{f("presto",925);}}}if(p.name=="unknown"){switch((a.match(/(?:webkit|khtml|gecko)/)||[])[0]){case"webkit":case"khtml":p.Engine.webkit=true;break;case"gecko":p.Engine.gecko=true;
}}this.$exec=p.exec;})();var Event=new Type("Event",function(a,i){if(!i){i=window;}var o=i.document;a=a||i.event;if(a.$extended){return a;}this.$extended=true;
var n=a.type,k=a.target||a.srcElement,m={},c={};while(k&&k.nodeType==3){k=k.parentNode;}if(n.indexOf("key")!=-1){var b=a.which||a.keyCode;var q=Object.keyOf(Event.Keys,b);
if(n=="keydown"){var d=b-111;if(d>0&&d<13){q="f"+d;}}if(!q){q=String.fromCharCode(b).toLowerCase();}}else{if(n.test(/click|mouse|menu/i)){o=(!o.compatMode||o.compatMode=="CSS1Compat")?o.html:o.body;
m={x:(a.pageX!=null)?a.pageX:a.clientX+o.scrollLeft,y:(a.pageY!=null)?a.pageY:a.clientY+o.scrollTop};c={x:(a.pageX!=null)?a.pageX-i.pageXOffset:a.clientX,y:(a.pageY!=null)?a.pageY-i.pageYOffset:a.clientY};
if(n.test(/DOMMouseScroll|mousewheel/)){var l=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;}var h=(a.which==3)||(a.button==2),p=null;if(n.test(/over|out/)){p=a.relatedTarget||a[(n=="mouseover"?"from":"to")+"Element"];
var j=function(){while(p&&p.nodeType==3){p=p.parentNode;}return true;};var g=(Browser.firefox2)?j.attempt():j();p=(g)?p:null;}}else{if(n.test(/gesture|touch/i)){this.rotation=a.rotation;
this.scale=a.scale;this.targetTouches=a.targetTouches;this.changedTouches=a.changedTouches;var f=this.touches=a.touches;if(f&&f[0]){var e=f[0];m={x:e.pageX,y:e.pageY};
c={x:e.clientX,y:e.clientY};}}}}return Object.append(this,{event:a,type:n,page:m,client:c,rightClick:h,wheel:l,relatedTarget:document.id(p),target:document.id(k),code:b,key:q,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey});
});Event.Keys={enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46};Event.Keys=new Hash(Event.Keys);Event.implement({stop:function(){return this.stopPropagation().preventDefault();
},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
}else{this.event.returnValue=false;}return this;}});(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h};
}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null;
return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.');
}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments);
};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone();
break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.');
}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h});
return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this;
}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping;
return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j;
for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments));
return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty();
return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d);
if(c==$empty){return this;}this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);
}return this;},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c);
}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this;
},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue;
}var c=this.$events[e];for(var b=c.length;b--;){this.removeEvent(e,c[b]);}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments));
if(!this.addEvent){return this;}for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}return this;
}});})();(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");
g=!!p;var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length;
return o[q]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o;
}}}};var h=function(u){var r=u.expressions;for(var p=0;p<r.length;p++){var t=r[p];var q={parts:[],tag:"*",combinator:i(t[0].combinator)};for(var o=0;o<t.length;
o++){var s=t[o];if(!s.reverseCombinator){s.reverseCombinator=" ";}s.combinator=s.reverseCombinator;delete s.reverseCombinator;}t.reverse().push(q);}return u;
};var f=function(o){return o.replace(/[-[\]{}()*+?.\\^$|,#\s]/g,"\\$&");};var j=new RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|:+(<unicode>+)(?:\\((?:(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(/<combinator>/,"["+f(">+~`!@$%^&={}\\;</")+"]").replace(/<unicode>/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(/<unicode1>/g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])"));
function b(x,s,D,z,r,C,q,B,A,y,u,F,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n];if(g&&t[l]){t[l].reverseCombinator=i(D);
}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,"");}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];
}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")});}else{if(F){w=w||p;w=w?w.replace(m,""):null;
if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:F.replace(m,""),value:w});}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,G;switch(A){case"^=":G=new RegExp("^"+f(u));
break;case"$=":G=new RegExp(f(u)+"$");break;case"~=":G=new RegExp("(^|\\s)"+f(u)+"(\\s|$)");break;case"|=":G=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(H){return u==H;
};break;case"*=":E=function(H){return H&&H.indexOf(u)>-1;};break;case"!=":E=function(H){return u!=H;};break;default:E=function(H){return !!H;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;
};}if(!E){E=function(H){return H&&G.test(H);};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});
d.parse=function(o){return e(o);};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var b={};
b.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};b.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(Object.prototype.toString.call(c)==="[object XMLDocument]")||(c.nodeType===9&&c.documentElement.nodeName!=="HTML");
};b.setDocument=function(n){if(n.nodeType===9){}else{if(n.ownerDocument){n=n.ownerDocument;}else{if(n.navigator){n=n.document;}else{return;}}}if(this.document===n){return;
}this.document=n;var o=this.root=n.documentElement;this.isXMLDocument=this.isXML(n);this.brokenStarGEBTN=this.starSelectsClosedQSA=this.idGetsName=this.brokenMixedCaseQSA=this.brokenGEBCN=this.brokenCheckedQSA=this.brokenEmptyAttributeQSA=this.isHTMLDocument=false;
var i,j,p,k;var l,c;var q=n.createElement("div");o.appendChild(q);try{c="slick_getbyid_test";q.innerHTML='<a id="'+c+'"></a>';this.isHTMLDocument=!!n.getElementById(c);
}catch(m){}if(this.isHTMLDocument){q.style.display="none";q.appendChild(n.createComment(""));j=(q.getElementsByTagName("*").length>0);try{q.innerHTML="foo</foo>";
l=q.getElementsByTagName("*");i=(l&&l.length&&l[0].nodeName.charAt(0)=="/");}catch(m){}this.brokenStarGEBTN=j||i;if(q.querySelectorAll){try{q.innerHTML="foo</foo>";
l=q.querySelectorAll("*");this.starSelectsClosedQSA=(l&&l.length&&l[0].nodeName.charAt(0)=="/");}catch(m){}}try{c="slick_id_gets_name";q.innerHTML='<a name="'+c+'"></a><b id="'+c+'"></b>';
this.idGetsName=n.getElementById(c)===q.firstChild;}catch(m){}try{q.innerHTML='<a class="MiXedCaSe"></a>';this.brokenMixedCaseQSA=!q.querySelectorAll(".MiXedCaSe").length;
}catch(m){}try{q.innerHTML='<a class="f"></a><a class="b"></a>';q.getElementsByClassName("b").length;q.firstChild.className="b";k=(q.getElementsByClassName("b").length!=2);
}catch(m){}try{q.innerHTML='<a class="a"></a><a class="f b a"></a>';p=(q.getElementsByClassName("a").length!=2);}catch(m){}this.brokenGEBCN=k||p;try{q.innerHTML='<select><option selected="selected">a</option></select>';
this.brokenCheckedQSA=(q.querySelectorAll(":checked").length==0);}catch(m){}try{q.innerHTML='<a class=""></a>';this.brokenEmptyAttributeQSA=(q.querySelectorAll('[class*=""]').length!=0);
}catch(m){}}o.removeChild(q);q=null;this.hasAttribute=(o&&this.isNativeCode(o.hasAttribute))?function(s,r){return s.hasAttribute(r);}:function(s,r){s=s.getAttributeNode(r);
return !!(s&&(s.specified||s.nodeValue));};this.contains=(o&&this.isNativeCode(o.contains))?function(r,s){return r.contains(s);}:(o&&o.compareDocumentPosition)?function(r,s){return r===s||!!(r.compareDocumentPosition(s)&16);
}:function(r,s){if(s){do{if(s===r){return true;}}while((s=s.parentNode));}return false;};this.documentSorter=(o.compareDocumentPosition)?function(s,r){if(!s.compareDocumentPosition||!r.compareDocumentPosition){return 0;
}return s.compareDocumentPosition(r)&4?-1:s===r?0:1;}:("sourceIndex" in o)?function(s,r){if(!s.sourceIndex||!r.sourceIndex){return 0;}return s.sourceIndex-r.sourceIndex;
}:(n.createRange)?function(u,s){if(!u.ownerDocument||!s.ownerDocument){return 0;}var t=u.ownerDocument.createRange(),r=s.ownerDocument.createRange();t.setStart(u,0);
t.setEnd(u,0);r.setStart(s,0);r.setEnd(s,0);return t.compareBoundaryPoints(Range.START_TO_END,r);}:null;this.getUID=(this.isHTMLDocument)?this.getUIDHTML:this.getUIDXML;
};b.search=function(k,x,F,q){var w=this.found=(q)?null:(F||[]);if(!k){return w;}if(k.navigator){k=k.document;}else{if(!k.nodeType){return w;}}var t,E;var o=this.uniques={};
if(this.document!==(k.ownerDocument||k)){this.setDocument(k);}var y=!!(F&&F.length);if(y){for(E=w.length;E--;){this.uniques[this.getUID(w[E])]=true;}}if(typeof x=="string"){for(E=this.overrides.length;
E--;){var u=this.overrides[E];if(u.regexp.test(x)){var v=u.method.call(k,x,w,q);if(v===false){continue;}if(v===true){return w;}return v;}}t=this.Slick.parse(x);
if(!t.length){return w;}}else{if(x==null){return w;}else{if(x.Slick){t=x;}else{if(this.contains(k.documentElement||k,x)){(w)?w.push(x):w=x;return w;}else{return w;
}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!y&&(q||(t.length==1&&t.expressions[0].length==1)))?this.pushArray:this.pushUID;
if(w==null){w=[];}var D,B,A;var C,K,z,J,G,s,p;var r,l,c,H,I=t.expressions;search:for(E=0;(l=I[E]);E++){for(D=0;(c=l[D]);D++){C="combinator:"+c.combinator;
if(!this[C]){continue search;}K=(this.isXMLDocument)?c.tag:c.tag.toUpperCase();z=c.id;J=c.classList;G=c.classes;s=c.attributes;p=c.pseudos;H=(D===(l.length-1));
this.bitUniques={};if(H){this.uniques=o;this.found=w;}else{this.uniques={};this.found=[];}if(D===0){this[C](k,K,z,G,s,p,J);if(q&&H&&w.length){break search;
}}else{if(q&&H){for(B=0,A=r.length;B<A;B++){this[C](r[B],K,z,G,s,p,J);if(w.length){break search;}}}else{for(B=0,A=r.length;B<A;B++){this[C](r[B],K,z,G,s,p,J);
}}}r=this.found;}}if(y||(t.expressions.length>1)){this.sort(w);}return(q)?(w[0]||null):w;};b.uidx=1;b.uidk="slick:uniqueid";b.getUIDXML=function(i){var c=i.getAttribute(this.uidk);
if(!c){c=this.uidx++;i.setAttribute(this.uidk,c);}return c;};b.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};b.sort=function(c){if(!this.documentSorter){return c;
}c.sort(this.documentSorter);return c;};b.cacheNTH={};b.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;b.parseNTHArgument=function(l){var j=l.match(this.matchNTH);
if(!j){return false;}var k=j[2]||false;var i=j[1]||1;if(i=="-"){i=-1;}var c=+j[3]||0;j=(k=="n")?{a:i,b:c}:(k=="odd")?{a:2,b:1}:(k=="even")?{a:2,b:0}:{a:0,b:i};
return(this.cacheNTH[l]=j);};b.createNTHPseudo=function(k,i,c,j){return function(n,l){var p=this.getUID(n);if(!this[c][p]){var v=n.parentNode;if(!v){return false;
}var m=v[k],o=1;if(j){var u=n.nodeName;do{if(m.nodeName!==u){continue;}this[c][this.getUID(m)]=o++;}while((m=m[i]));}else{do{if(m.nodeType!==1){continue;
}this[c][this.getUID(m)]=o++;}while((m=m[i]));}}l=l||"n";var q=this.cacheNTH[l]||this.parseNTHArgument(l);if(!q){return false;}var t=q.a,s=q.b,r=this[c][p];
if(t==0){return s==r;}if(t>0){if(r<s){return false;}}else{if(s<r){return false;}}return((r-s)%t)==0;};};b.pushArray=function(k,c,m,j,i,l){if(this.matchSelector(k,c,m,j,i,l)){this.found.push(k);
}};b.pushUID=function(l,c,n,k,i,m){var j=this.getUID(l);if(!this.uniques[j]&&this.matchSelector(l,c,n,k,i,m)){this.uniques[j]=true;this.found.push(l);}};
b.matchNode=function(n,c){var k=this.Slick.parse(c);if(!k){return true;}if(k.length==1&&k.expressions[0].length==1){var o=k.expressions[0][0];return this.matchSelector(n,(this.isXMLDocument)?o.tag:o.tag.toUpperCase(),o.id,o.classes,o.attributes,o.pseudos);
}var j=this.search(this.document,k);for(var l=0,m;m=j[l++];){if(m===n){return true;}}return false;};b.matchPseudo=function(l,c,k){var i="pseudo:"+c;if(this[i]){return this[i](l,k);
}var j=this.getAttribute(l,c);return(k)?k==j:!!j;};b.matchSelector=function(k,q,c,l,m,o){if(q){if(q=="*"){if(k.nodeName<"@"){return false;}}else{if(k.nodeName!=q){return false;
}}}if(c&&k.getAttribute("id")!=c){return false;}var n,j,p;if(l){for(n=l.length;n--;){p=("className" in k)?k.className:k.getAttribute("class");if(!(p&&l[n].regexp.test(p))){return false;
}}}if(m){for(n=m.length;n--;){j=m[n];if(j.operator?!j.test(this.getAttribute(k,j.key)):!this.hasAttribute(k,j.key)){return false;}}}if(o){for(n=o.length;
n--;){j=o[n];if(!this.matchPseudo(k,j.key,j.value)){return false;}}}return true;};var a={" ":function(l,r,c,m,n,p,k){var o,q,j;if(this.isHTMLDocument){getById:if(c){q=this.document.getElementById(c);
if((!q&&l.all)||(this.idGetsName&&q&&q.getAttributeNode("id").nodeValue!=c)){j=l.all[c];if(!j){return;}if(!j[0]){j=[j];}for(o=0;q=j[o++];){if(q.getAttributeNode("id").nodeValue==c){this.push(q,r,null,m,n,p);
break;}}return;}if(!q){if(this.contains(this.document.documentElement,l)){return;}else{break getById;}}else{if(this.document!==l&&!this.contains(l,q)){return;
}}this.push(q,r,null,m,n,p);return;}getByClass:if(m&&l.getElementsByClassName&&!this.brokenGEBCN){j=l.getElementsByClassName(k.join(" "));if(!(j&&j.length)){break getByClass;
}for(o=0;q=j[o++];){this.push(q,r,c,null,n,p);}return;}}getByTag:{j=l.getElementsByTagName(r);if(!(j&&j.length)){break getByTag;}if(!this.brokenStarGEBTN){r=null;
}for(o=0;q=j[o++];){this.push(q,r,c,m,n,p);}}},">":function(k,c,m,j,i,l){if((k=k.firstChild)){do{if(k.nodeType===1){this.push(k,c,m,j,i,l);}}while((k=k.nextSibling));
}},"+":function(k,c,m,j,i,l){while((k=k.nextSibling)){if(k.nodeType===1){this.push(k,c,m,j,i,l);break;}}},"^":function(k,c,m,j,i,l){k=k.firstChild;if(k){if(k.nodeType===1){this.push(k,c,m,j,i,l);
}else{this["combinator:+"](k,c,m,j,i,l);}}},"~":function(l,c,n,k,i,m){while((l=l.nextSibling)){if(l.nodeType!==1){continue;}var j=this.getUID(l);if(this.bitUniques[j]){break;
}this.bitUniques[j]=true;this.push(l,c,n,k,i,m);}},"++":function(k,c,m,j,i,l){this["combinator:+"](k,c,m,j,i,l);this["combinator:!+"](k,c,m,j,i,l);},"~~":function(k,c,m,j,i,l){this["combinator:~"](k,c,m,j,i,l);
this["combinator:!~"](k,c,m,j,i,l);},"!":function(k,c,m,j,i,l){while((k=k.parentNode)){if(k!==this.document){this.push(k,c,m,j,i,l);}}},"!>":function(k,c,m,j,i,l){k=k.parentNode;
if(k!==this.document){this.push(k,c,m,j,i,l);}},"!+":function(k,c,m,j,i,l){while((k=k.previousSibling)){if(k.nodeType===1){this.push(k,c,m,j,i,l);break;
}}},"!^":function(k,c,m,j,i,l){k=k.lastChild;if(k){if(k.nodeType===1){this.push(k,c,m,j,i,l);}else{this["combinator:!+"](k,c,m,j,i,l);}}},"!~":function(l,c,n,k,i,m){while((l=l.previousSibling)){if(l.nodeType!==1){continue;
}var j=this.getUID(l);if(this.bitUniques[j]){break;}this.bitUniques[j]=true;this.push(l,c,n,k,i,m);}}};for(var h in a){b["combinator:"+h]=a[h];}var g={empty:function(c){var i=c.firstChild;
return !(i&&i.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,i){return !this.matchNode(c,i);},contains:function(c,i){return(c.innerText||c.textContent||"").indexOf(i)>-1;
},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType===1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType===1){return false;
}}return true;},"only-child":function(j){var i=j;while((i=i.previousSibling)){if(i.nodeType===1){return false;}}var c=j;while((c=c.nextSibling)){if(c.nodeType===1){return false;
}}return true;},"nth-child":b.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":b.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":b.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":b.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(i,c){return this["pseudo:nth-child"](i,""+c+1);
},even:function(i,c){return this["pseudo:nth-child"](i,"2n");},odd:function(i,c){return this["pseudo:nth-child"](i,"2n+1");},"first-of-type":function(c){var i=c.nodeName;
while((c=c.previousSibling)){if(c.nodeName===i){return false;}}return true;},"last-of-type":function(c){var i=c.nodeName;while((c=c.nextSibling)){if(c.nodeName===i){return false;
}}return true;},"only-of-type":function(j){var i=j,k=j.nodeName;while((i=i.previousSibling)){if(i.nodeName===k){return false;}}var c=j;while((c=c.nextSibling)){if(c.nodeName===k){return false;
}}return true;},enabled:function(c){return(c.disabled===false);},disabled:function(c){return(c.disabled===true);},checked:function(c){return c.checked||c.selected;
},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex"));},root:function(c){return(c===this.root);
},selected:function(c){return c.selected;}};for(var d in g){b["pseudo:"+d]=g[d];}b.attributeGetters={"class":function(){return("className" in this)?this.className:this.getAttribute("class");
},"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for");},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");
},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style");}};b.getAttribute=function(j,c){var k=this.attributeGetters[c];if(k){return k.call(j);
}var i=j.getAttributeNode(c);return i?i.nodeValue:null;};b.overrides=[];b.override=function(c,i){this.overrides.push({regexp:c,method:i});};var f=/\[.*[*$^]=(?:["']{2})?\]/;
b.override(/./,function(p,n,o){if(!this.querySelectorAll||this.nodeType!=9||!b.isHTMLDocument||b.brokenMixedCaseQSA||(b.brokenCheckedQSA&&p.indexOf(":checked")>-1)||(b.brokenEmptyAttributeQSA&&f.test(p))||e.disableQSA){return false;
}var j,m;try{if(o){return this.querySelector(p)||null;}else{j=this.querySelectorAll(p);}}catch(k){return false;}var l,c=!!(n.length);if(b.starSelectsClosedQSA){for(l=0;
m=j[l++];){if(m.nodeName>"@"&&(!c||!b.uniques[b.getUIDHTML(m)])){n.push(m);}}}else{for(l=0;m=j[l++];){if(!c||!b.uniques[b.getUIDHTML(m)]){n.push(m);}}}if(c){b.sort(n);
}return true;});b.override(/^[\w-]+$|^\*$/,function(p,n,o){var j=p;if(j=="*"&&b.brokenStarGEBTN){return false;}var k=this.getElementsByTagName(j);if(o){return k[0]||null;
}var l,m,c=!!(n.length);for(l=0;m=k[l++];){if(!c||!b.uniques[b.getUID(m)]){n.push(m);}}if(c){b.sort(n);}return true;});b.override(/^\.[\w-]+$/,function(o,q,m){if(!b.isHTMLDocument||(!this.getElementsByClassName&&this.querySelectorAll)){return false;
}var c,k,l,j=!!(q&&q.length),p=o.substring(1);if(this.getElementsByClassName&&!b.brokenGEBCN){c=this.getElementsByClassName(p);if(m){return c[0]||null;
}for(l=0;k=c[l++];){if(!j||!b.uniques[b.getUIDHTML(k)]){q.push(k);}}}else{var n=new RegExp("(^|\\s)"+e.escapeRegExp(p)+"(\\s|$)");c=this.getElementsByTagName("*");
for(l=0;k=c[l++];){p=k.className;if(!p||!n.test(p)){continue;}if(m){return k;}if(!j||!b.uniques[b.getUIDHTML(k)]){q.push(k);}}}if(j){b.sort(q);}return(m)?null:true;
});b.override(/^#[\w-]+$/,function(l,j,k){if(!b.isHTMLDocument||this.nodeType!=9){return false;}var m=l.substring(1),i=this.getElementById(m);if(!i){return j;
}if(b.idGetsName&&i.getAttributeNode("id").nodeValue!=m){return false;}if(k){return i||null;}var c=!!(j.length);if(!c||!b.uniques[b.getUIDHTML(i)]){j.push(i);
}if(c){b.sort(j);}return true;});if(typeof document!="undefined"){b.setDocument(document);}var e=b.Slick=(this.Slick||{});e.version="0.9dev";e.search=function(i,j,c){return b.search(i,j,c);
};e.find=function(c,i){return b.search(c,i,null,true);};e.contains=function(c,i){b.setDocument(c);return b.contains(c,i);};e.getAttribute=function(i,c){return b.getAttribute(i,c);
};e.match=function(i,c){if(!(i&&c)){return false;}if(!c||c===i){return true;}if(typeof c!="string"){return false;}b.setDocument(i);return b.matchNode(i,c);
};e.defineAttributeGetter=function(c,i){b.attributeGetters[c]=i;return this;};e.lookupAttributeGetter=function(c){return b.attributeGetters[c];};e.definePseudo=function(c,i){b["pseudo:"+c]=function(k,j){return i.call(k,j);
};return this;};e.lookupPseudo=function(c){var i=b["pseudo:"+c];if(i){return function(j){return i.call(this,j);};}return null;};e.override=function(i,c){b.override(i,c);
return this;};e.isXML=b.isXML;e.uidOf=function(c){return b.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this);
var Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={};}if(!b.test(/^[\w-]+$/)){var e=Slick.parse(b).expressions[0][0];
b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var f=0,c=d.length;f<c;f++){var a=d[f];if(a.value!=null&&a.operator=="="&&g[a.key]==null){g[a.key]=a.value;
}}}if(e.classList&&g["class"]==null){g["class"]=e.classList.join(" ");}}return document.newElement(b,g);};if(Browser.Element){Element.prototype=Browser.Element.prototype;
}new Type("Element",Element).mirror(function(a){if(Array.prototype[a]){return;}var b={};b[a]=function(){var h=[],e=arguments,j=true;for(var g=0,d=this.length;
g<d;g++){var f=this[g],c=h[g]=f[a].apply(f,e);j=(j&&typeOf(c)=="element");}return(j)?new Elements(h):h;};Elements.implement(b);});if(!Browser.Element){Element.parent=Object;
Element.Prototype={"$family":Function.from("element").hide()};Element.mirror(function(a,b){Element.Prototype[a]=b;});}Element.Constructors={};Element.Constructors=new Hash;
var IFrame=new Type("IFrame",function(){var e=Array.link(arguments,{properties:Type.isObject,iframe:function(f){return(f!=null);}});var c=e.properties||{},b;
if(e.iframe){b=document.id(e.iframe);}var d=c.onload||function(){};delete c.onload;c.id=c.name=[c.id,c.name,b?(b.id||b.name):"IFrame_"+String.uniqueID()].pick();
b=new Element(b||"iframe",c);var a=function(){d.call(b.contentWindow);};if(window.frames[c.id]){a();}else{b.addListener("load",a);}return b;});var Elements=this.Elements=function(a){if(a&&a.length){var e={},d;
for(var c=0;d=a[c++];){var b=Slick.uidOf(d);if(!e[b]){e[b]=true;this.push(d);}}}};Elements.prototype={length:0};Elements.parent=Array;new Type("Elements",Elements).implement({filter:function(a,b){if(!a){return this;
}return new Elements(Array.filter(this,(typeOf(a)=="string")?function(c){return c.match(a);}:a,b));}.protect(),push:function(){var d=this.length;for(var b=0,a=arguments.length;
b<a;b++){var c=document.id(arguments[b]);if(c){this[d++]=c;}}return(this.length=d);}.protect(),concat:function(){var b=new Elements(this);for(var c=0,a=arguments.length;
c<a;c++){var d=arguments[c];if(Type.isEnumerable(d)){b.append(d);}else{b.push(d);}}return b;}.protect(),append:function(c){for(var b=0,a=c.length;b<a;b++){this.push(c[b]);
}return this;}.protect(),empty:function(){while(this.length){delete this[--this.length];}return this;}.protect()});(function(){var g=Array.prototype.splice,b={"0":0,"1":1,length:2};
g.call(b,1,1);if(b[1]==1){Elements.implement("splice",function(){var e=this.length;g.apply(this,arguments);while(e>=this.length){delete this[e--];}return this;
}.protect());}Elements.implement(Array.prototype);Array.mirror(Elements);var f;try{var a=document.createElement("<input name=x>");f=(a.name=="x");}catch(c){}var d=function(e){return(""+e).replace(/&/g,"&amp;").replace(/"/g,"&quot;");
};Document.implement({newElement:function(e,h){if(h&&h.checked!=null){h.defaultChecked=h.checked;}if(f&&h){e="<"+e;if(h.name){e+=' name="'+d(h.name)+'"';
}if(h.type){e+=' type="'+d(h.type)+'"';}e+=">";delete h.name;delete h.type;}return this.id(this.createElement(e)).set(h);}});})();Document.implement({newTextNode:function(a){return this.createTextNode(a);
},getDocument:function(){return this;},getWindow:function(){return this.window;},id:(function(){var a={string:function(d,c,b){d=Slick.find(b,"#"+d.replace(/(\W)/g,"\\$1"));
return(d)?a.element(d,c):null;},element:function(b,c){$uid(b);if(!c&&!b.$family&&!(/^object|embed$/i).test(b.tagName)){Object.append(b,Element.Prototype);
}return b;},object:function(c,d,b){if(c.toElement){return a.element(c.toElement(b),d);}return null;}};a.textnode=a.whitespace=a.window=a.document=function(b){return b;
};return function(c,e,d){if(c&&c.$family&&c.uid){return c;}var b=typeOf(c);return(a[b])?a[b](c,e,d||document):null;};})()});if(window.$==null){Window.implement("$",function(a,b){return document.id(a,b,this.document);
});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(a){return Slick.search(this,a,new Elements);
},getElement:function(a){return document.id(Slick.find(this,a));}});(function(b,d,a){this.Selectors={};var e=this.Selectors.Pseudo=new Hash();var c=function(){for(var f in e){if(e.hasOwnProperty(f)){Slick.definePseudo(f,e[f]);
delete e[f];}}};Slick.search=function(g,h,f){c();return b.call(this,g,h,f);};Slick.find=function(f,g){c();return d.call(this,f,g);};Slick.match=function(g,f){c();
return a.call(this,g,f);};})(Slick.search,Slick.find,Slick.match);if(window.$$==null){Window.implement("$$",function(a){var f=new Elements;if(arguments.length==1&&typeof a=="string"){return Slick.search(this.document,a,f);
}var c=Array.flatten(arguments);for(var d=0,b=c.length;d<b;d++){var e=c[d];switch(typeOf(e)){case"element":f.push(e);break;case"string":Slick.search(this.document,e,f);
}}return f;});}if(window.$$==null){Window.implement("$$",function(a){if(arguments.length==1){if(typeof a=="string"){return Slick.search(this.document,a,new Elements);
}else{if(Type.isEnumerable(a)){return new Elements(a);}}}return new Elements(arguments);});}(function(){var j={},h={};var l={input:"checked",option:"selected",textarea:"value"};
var d=function(o){return(h[o]||(h[o]={}));};var i=function(p){if(p.removeEvents){p.removeEvents();}if(p.clearAttributes){p.clearAttributes();}var o=p.uid;
if(o!=null){delete j[o];delete h[o];}return p;};var n=["defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];
var c=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer"];var f={html:"innerHTML","class":"className","for":"htmlFor",text:(function(){var o=document.createElement("div");
return(o.innerText==null)?"textContent":"innerText";})()};var m=["type"];var g=["value","defaultValue"];var k=/^(?:href|src|usemap)$/i;c=c.associate(c);
n=n.associate(n.map(String.toLowerCase));m=m.associate(m);Object.append(f,g.associate(g));var b={before:function(p,o){var q=o.parentNode;if(q){q.insertBefore(p,o);
}},after:function(p,o){var q=o.parentNode;if(q){q.insertBefore(p,o.nextSibling);}},bottom:function(p,o){o.appendChild(p);},top:function(p,o){o.insertBefore(p,o.firstChild);
}};b.inside=b.bottom;Object.each(b,function(p,q){q=q.capitalize();var o={};o["inject"+q]=function(r){p(this,document.id(r,true));return this;};o["grab"+q]=function(r){p(document.id(r,true),this);
return this;};Element.implement(o);});var a=function(r,q){if(!r){return q;}r=Slick.parse(r);var p=r.expressions;for(var o=p.length;o--;){p[o][0].combinator=q;
}return r;};Element.implement({set:function(q,p){var o=Element.Properties[q];(o&&o.set)?o.set.call(this,p):this.setProperty(q,p);}.overloadSetter(),get:function(p){var o=Element.Properties[p];
return(o&&o.get)?o.get.apply(this):this.getProperty(p);}.overloadGetter(),erase:function(p){var o=Element.Properties[p];(o&&o.erase)?o.erase.apply(this):this.removeProperty(p);
return this;},setProperty:function(p,q){p=n[p]||p;if(q==null){return this.removeProperty(p);}var o=f[p];(o)?this[o]=q:(c[p])?this[p]=!!q:this.setAttribute(p,""+q);
return this;},setProperties:function(o){for(var p in o){this.setProperty(p,o[p]);}return this;},getProperty:function(p){p=n[p]||p;var o=f[p]||m[p];return(o)?this[o]:(c[p])?!!this[p]:(k.test(p)?this.getAttribute(p,2):(o=this.getAttributeNode(p))?o.nodeValue:null)||null;
},getProperties:function(){var o=Array.from(arguments);return o.map(this.getProperty,this).associate(o);},removeProperty:function(p){p=n[p]||p;var o=f[p];
(o)?this[o]="":(c[p])?this[p]=false:this.removeAttribute(p);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
},hasClass:function(o){return this.className.clean().contains(o," ");},addClass:function(o){if(!this.hasClass(o)){this.className=(this.className+" "+o).clean();
}return this;},removeClass:function(o){this.className=this.className.replace(new RegExp("(^|\\s)"+o+"(?:\\s|$)"),"$1");return this;},toggleClass:function(o,p){if(p==null){p=!this.hasClass(o);
}return(p)?this.addClass(o):this.removeClass(o);},adopt:function(){var r=this,o,t=Array.flatten(arguments),s=t.length;if(s>1){r=o=document.createDocumentFragment();
}for(var q=0;q<s;q++){var p=document.id(t[q],true);if(p){r.appendChild(p);}}if(o){this.appendChild(o);}return this;},appendText:function(p,o){return this.grab(this.getDocument().newTextNode(p),o);
},grab:function(p,o){b[o||"bottom"](document.id(p,true),this);return this;},inject:function(p,o){b[o||"bottom"](this,document.id(p,true));return this;},replaces:function(o){o=document.id(o,true);
o.parentNode.replaceChild(this,o);return this;},wraps:function(p,o){p=document.id(p,true);return this.replaces(p).grab(p,o);},getPrevious:function(o){return document.id(Slick.find(this,a(o,"!~")));
},getAllPrevious:function(o){return Slick.search(this,a(o,"!~"),new Elements);},getNext:function(o){return document.id(Slick.find(this,a(o,"~")));},getAllNext:function(o){return Slick.search(this,a(o,"~"),new Elements);
},getFirst:function(o){return document.id(Slick.search(this,a(o,">"))[0]);},getLast:function(o){return document.id(Slick.search(this,a(o,">")).getLast());
},getParent:function(o){return document.id(Slick.find(this,a(o,"!")));},getParents:function(o){return Slick.search(this,a(o,"!"),new Elements);},getSiblings:function(o){return Slick.search(this,a(o,"~~"),new Elements);
},getChildren:function(o){return Slick.search(this,a(o,">"),new Elements);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
},getElementById:function(o){return document.id(Slick.find(this,"#"+(""+o).replace(/(\W)/g,"\\$1")));},getSelected:function(){this.selectedIndex;return new Elements(Array.from(this.options).filter(function(o){return o.selected;
}));},toQueryString:function(){var o=[];this.getElements("input, select, textarea").each(function(q){var p=q.type;if(!q.name||q.disabled||p=="submit"||p=="reset"||p=="file"||p=="image"){return;
}var r=(q.get("tag")=="select")?q.getSelected().map(function(s){return document.id(s).get("value");}):((p=="radio"||p=="checkbox")&&!q.checked)?null:q.get("value");
Array.from(r).each(function(s){if(typeof s!="undefined"){o.push(encodeURIComponent(q.name)+"="+encodeURIComponent(s));}});});return o.join("&");},clone:function(r,p){r=r!==false;
var w=this.cloneNode(r);var v=function(C,B){if(!p){C.removeAttribute("id");}if(Browser.ie){C.clearAttributes();C.mergeAttributes(B);C.removeAttribute("uid");
if(C.options){var D=C.options,z=B.options;for(var A=D.length;A--;){D[A].selected=z[A].selected;}}}var E=l[B.tagName.toLowerCase()];if(E&&B[E]){C[E]=B[E];
}};var s;if(r){var o=w.getElementsByTagName("*"),q=this.getElementsByTagName("*");for(s=o.length;s--;){v(o[s],q[s]);}}v(w,this);if(Browser.ie){var u=this.getElementsByTagName("object"),t=w.getElementsByTagName("object"),y=u.length,x=t.length;
for(s=0;s<y&&s<x;s++){t[s].outerHTML=u[s].outerHTML;}}return document.id(w);},destroy:function(){var o=i(this).getElementsByTagName("*");Array.each(o,i);
Element.dispose(this);return null;},empty:function(){Array.from(this.childNodes).each(Element.dispose);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;
},match:function(o){return !o||Slick.match(this,o);}});var e={contains:function(o){return Slick.contains(this,o);}};if(!document.contains){Document.implement(e);
}if(!document.createElement("div").contains){Element.implement(e);}Element.implement("hasChild",function(o){return this!==o&&this.contains(o);});[Element,Window,Document].invoke("implement",{addListener:function(r,q){if(r=="unload"){var o=q,p=this;
q=function(){p.removeListener("unload",q);o();};}else{j[this.uid]=this;}if(this.addEventListener){this.addEventListener(r,q,false);}else{this.attachEvent("on"+r,q);
}return this;},removeListener:function(p,o){if(this.removeEventListener){this.removeEventListener(p,o,false);}else{this.detachEvent("on"+p,o);}return this;
},retrieve:function(p,o){var r=d(this.uid),q=r[p];if(o!=null&&q==null){q=r[p]=o;}return q!=null?q:null;},store:function(p,o){var q=d(this.uid);q[p]=o;return this;
},eliminate:function(o){var p=d(this.uid);delete p[o];return this;}});if(window.attachEvent&&!window.addEventListener){window.addListener("unload",function(){Object.each(j,i);
if(window.CollectGarbage){CollectGarbage();}});}})();Element.Properties={};Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a;
},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
}};(function(a){if(a!=null){Element.Properties.maxlength=Element.Properties.maxLength={get:function(){var b=this.getAttribute("maxLength");return b==a?null:b;
}};}})(document.createElement("input").getAttribute("maxLength"));Element.Properties.html=(function(){var c=Function.attempt(function(){var e=document.createElement("table");
e.innerHTML="<tr><td></td></tr>";});var d=document.createElement("div");var a={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};
a.thead=a.tfoot=a.tbody;var b={set:function(){var f=Array.flatten(arguments).join("");var g=(!c&&a[this.get("tag")]);if(g){var h=d;h.innerHTML=g[1]+f+g[2];
for(var e=g[0];e--;){h=h.firstChild;}this.empty().adopt(h.childNodes);}else{this.innerHTML=f;}}};b.erase=b.set;return b;})();(function(){var c=document.html;
Element.Properties.styles={set:function(f){this.setStyles(f);}};var e=(c.style.opacity!=null);var d=/alpha\(opacity=([\d.]+)\)/i;var b=function(g,f){if(!g.currentStyle||!g.currentStyle.hasLayout){g.style.zoom=1;
}if(e){g.style.opacity=f;}else{f=(f==1)?"":"alpha(opacity="+f*100+")";var h=g.style.filter||g.getComputedStyle("filter")||"";g.style.filter=h.test(d)?h.replace(d,f):h+f;
}};Element.Properties.opacity={set:function(g){var f=this.style.visibility;if(g==0&&f!="hidden"){this.style.visibility="hidden";}else{if(g!=0&&f!="visible"){this.style.visibility="visible";
}}b(this,g);},get:(e)?function(){var f=this.style.opacity||this.getComputedStyle("opacity");return(f=="")?1:f;}:function(){var f,g=(this.style.filter||this.getComputedStyle("filter"));
if(g){f=g.match(d);}return(f==null||g==null)?1:(f[1]/100);}};var a=(c.style.cssFloat==null)?"styleFloat":"cssFloat";Element.implement({getComputedStyle:function(h){if(this.currentStyle){return this.currentStyle[h.camelCase()];
}var g=Element.getDocument(this).defaultView,f=g?g.getComputedStyle(this,null):null;return(f)?f.getPropertyValue((h==a)?"float":h.hyphenate()):null;},setOpacity:function(f){b(this,f);
return this;},getOpacity:function(){return this.get("opacity");},setStyle:function(g,f){switch(g){case"opacity":return this.set("opacity",parseFloat(f));
case"float":g=a;}g=g.camelCase();if(typeOf(f)!="string"){var h=(Element.Styles[g]||"@").split(" ");f=Array.from(f).map(function(k,j){if(!h[j]){return"";
}return(typeOf(k)=="number")?h[j].replace("@",Math.round(k)):k;}).join(" ");}else{if(f==String(Number(f))){f=Math.round(f);}}this.style[g]=f;return this;
},getStyle:function(l){switch(l){case"opacity":return this.get("opacity");case"float":l=a;}l=l.camelCase();var f=this.style[l];if(!f||l=="zIndex"){f=[];
for(var k in Element.ShortStyles){if(l!=k){continue;}for(var j in Element.ShortStyles[k]){f.push(this.getStyle(j));}return f.join(" ");}f=this.getComputedStyle(l);
}if(f){f=String(f);var h=f.match(/rgba?\([\d\s,]+\)/);if(h){f=f.replace(h[0],h[0].rgbToHex());}}if(Browser.opera||(Browser.ie&&isNaN(parseFloat(f)))){if(l.test(/^(height|width)$/)){var g=(l=="width")?["left","right"]:["top","bottom"],i=0;
g.each(function(m){i+=this.getStyle("border-"+m+"-width").toInt()+this.getStyle("padding-"+m).toInt();},this);return this["offset"+l.capitalize()]-i+"px";
}if(Browser.opera&&String(f).indexOf("px")!=-1){return f;}if(l.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return f;},setStyles:function(g){for(var f in g){this.setStyle(f,g[f]);
}return this;},getStyles:function(){var f={};Array.flatten(arguments).each(function(g){f[g]=this.getStyle(g);},this);return f;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"};
Element.Styles=new Hash(Element.Styles);Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(l){var k=Element.ShortStyles;
var g=Element.Styles;["margin","padding"].each(function(m){var n=m+l;k[m][n]=g[n]="@px";});var j="border"+l;k.border[j]=g[j]="@px @ rgb(@, @, @)";var i=j+"Width",f=j+"Style",h=j+"Color";
k[j]={};k.borderWidth[i]=k[j][i]=g[i]="@px";k.borderStyle[f]=k[j][f]=g[f]="@";k.borderColor[h]=k[j][h]=g[h]="rgb(@, @, @)";});})();(function(){Element.Properties.events={set:function(c){this.addEvents(c);
}};[Element,Window,Document].invoke("implement",{addEvent:function(g,i){var j=this.retrieve("events",{});if(!j[g]){j[g]={keys:[],values:[]};}if(j[g].keys.contains(i)){return this;
}j[g].keys.push(i);var h=g,c=Element.Events[g],e=i,k=this;if(c){if(c.onAdd){c.onAdd.call(this,i);}if(c.condition){e=function(l){if(c.condition.call(this,l)){return i.call(this,l);
}return true;};}h=c.base||h;}var f=function(){return i.call(k);};var d=Element.NativeEvents[h];if(d){if(d==2){f=function(l){l=new Event(l,k.getWindow());
if(e.call(k,l)===false){l.stop();}};}this.addListener(h,f);}j[g].values.push(f);return this;},removeEvent:function(f,e){var d=this.retrieve("events");if(!d||!d[f]){return this;
}var i=d[f];var c=i.keys.indexOf(e);if(c==-1){return this;}var h=i.values[c];delete i.keys[c];delete i.values[c];var g=Element.Events[f];if(g){if(g.onRemove){g.onRemove.call(this,e);
}f=g.base||f;}return(Element.NativeEvents[f])?this.removeListener(f,h):this;},addEvents:function(c){for(var d in c){this.addEvent(d,c[d]);}return this;
},removeEvents:function(c){var e;if(typeOf(c)=="object"){for(e in c){this.removeEvent(e,c[e]);}return this;}var d=this.retrieve("events");if(!d){return this;
}if(!c){for(e in d){this.removeEvents(e);}this.eliminate("events");}else{if(d[c]){d[c].keys.each(function(f){this.removeEvent(c,f);},this);delete d[c];
}}return this;},fireEvent:function(f,d,c){var e=this.retrieve("events");if(!e||!e[f]){return this;}d=Array.from(d);e[f].keys.each(function(g){if(c){g.delay(c,this,d);
}else{g.apply(this,d);}},this);return this;},cloneEvents:function(f,e){f=document.id(f);var d=f.retrieve("events");if(!d){return this;}if(!e){for(var c in d){this.cloneEvents(f,c);
}}else{if(d[e]){d[e].keys.each(function(g){this.addEvent(e,g);},this);}}return this;}});try{if(typeof HTMLElement!="undefined"){HTMLElement.prototype.fireEvent=Element.prototype.fireEvent;
}}catch(b){}Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
var a=function(c){var d=c.relatedTarget;if(d==null){return true;}if(!d){return false;}return(d!=this&&d.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(d));
};Element.Events={mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};
Element.Events=new Hash(Element.Events);})();(function(){Element.implement({scrollTo:function(h,i){if(b(this)){this.getWindow().scrollTo(h,i);}else{this.scrollLeft=h;
this.scrollTop=i;}return this;},getSize:function(){if(b(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};},getScrollSize:function(){if(b(this)){return this.getWindow().getScrollSize();
}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(b(this)){return this.getWindow().getScroll();}return{x:this.scrollLeft,y:this.scrollTop};
},getScrolls:function(){var i=this.parentNode,h={x:0,y:0};while(i&&!b(i)){h.x+=i.scrollLeft;h.y+=i.scrollTop;i=i.parentNode;}return h;},getOffsetParent:function(){var h=this;
if(b(h)){return null;}if(!Browser.ie){return h.offsetParent;}while((h=h.parentNode)){if(d(h,"position")!="static"||b(h)){return h;}}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var m=this.getBoundingClientRect(),j=document.id(this.getDocument().documentElement),l=j.getScroll(),o=this.getScrolls(),n=(d(this,"position")=="fixed");
return{x:m.left.toInt()+o.x+((n)?0:l.x)-j.clientLeft,y:m.top.toInt()+o.y+((n)?0:l.y)-j.clientTop};}var i=this,h={x:0,y:0};if(b(this)){return h;}while(i&&!b(i)){h.x+=i.offsetLeft;
h.y+=i.offsetTop;if(Browser.firefox){if(!f(i)){h.x+=c(i);h.y+=g(i);}var k=i.parentNode;if(k&&d(k,"overflow")!="visible"){h.x+=c(k);h.y+=g(k);}}else{if(i!=this&&Browser.safari){h.x+=c(i);
h.y+=g(i);}}i=i.offsetParent;}if(Browser.firefox&&!f(this)){h.x-=c(this);h.y-=g(this);}return h;},getPosition:function(k){if(b(this)){return{x:0,y:0};}var l=this.getOffsets(),i=this.getScrolls();
var h={x:l.x-i.x,y:l.y-i.y};if(k&&(k=document.id(k))){var j=k.getPosition();return{x:h.x-j.x-c(k),y:h.y-j.y-g(k)};}return h;},getCoordinates:function(j){if(b(this)){return this.getWindow().getCoordinates();
}var h=this.getPosition(j),i=this.getSize();var k={left:h.x,top:h.y,width:i.x,height:i.y};k.right=k.left+k.width;k.bottom=k.top+k.height;return k;},computePosition:function(h){return{left:h.x-e(this,"margin-left"),top:h.y-e(this,"margin-top")};
},setPosition:function(h){return this.setStyles(this.computePosition(h));}});[Document,Window].invoke("implement",{getSize:function(){var h=a(this);return{x:h.clientWidth,y:h.clientHeight};
},getScroll:function(){var i=this.getWindow(),h=a(this);return{x:i.pageXOffset||h.scrollLeft,y:i.pageYOffset||h.scrollTop};},getScrollSize:function(){var j=a(this),i=this.getSize(),h=this.getDocument().body;
return{x:Math.max(j.scrollWidth,h.scrollWidth,i.x),y:Math.max(j.scrollHeight,h.scrollHeight,i.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var h=this.getSize();
return{top:0,left:0,bottom:h.y,right:h.x,height:h.y,width:h.x};}});var d=Element.getComputedStyle;function e(h,i){return d(h,i).toInt()||0;}function f(h){return d(h,"-moz-box-sizing")=="border-box";
}function g(h){return e(h,"border-top-width");}function c(h){return e(h,"border-left-width");}function b(h){return(/^(?:body|html)$/i).test(h.tagName);
}function a(h){var i=h.getDocument();return(!i.compatMode||i.compatMode=="CSS1Compat")?i.html:i.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y;
},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;
},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;
},getLeft:function(){return this.getPosition().x;}});(function(){var e=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(g){this.subject=this.subject||this;
this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(){var g=Date.now();if(g<this.time+this.options.duration){var h=this.transition((g-this.time)/this.options.duration);
this.set(this.compute(this.from,this.to,h));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(g){return g;},compute:function(i,h,g){return e.compute(i,h,g);
},check:function(){if(!this.timer){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));
return false;}return false;},start:function(i,h){if(!this.check(i,h)){return this;}var g=this.options.duration;this.options.duration=e.Durations[g]||g.toInt();
this.from=i;this.to=h;this.time=0;this.transition=this.getTransition();this.startTimer();this.onStart();return this;},complete:function(){if(this.stopTimer()){this.onComplete();
}return this;},cancel:function(){if(this.stopTimer()){this.onCancel();}return this;},onStart:function(){this.fireEvent("start",this.subject);},onComplete:function(){this.fireEvent("complete",this.subject);
if(!this.callChain()){this.fireEvent("chainComplete",this.subject);}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain();},pause:function(){this.stopTimer();
return this;},resume:function(){this.startTimer();return this;},stopTimer:function(){if(!this.timer){return false;}this.time=Date.now()-this.time;this.timer=f(this);
return true;},startTimer:function(){if(this.timer){return false;}this.time=Date.now()-this.time;this.timer=b(this);return true;}});e.compute=function(i,h,g){return(h-i)*g+i;
};e.Durations={"short":250,normal:500,"long":1000};var d={},c={};var a=function(){for(var g=this.length;g--;){if(this[g]){this[g].step();}}};var b=function(g){var i=g.options.fps,h=d[i]||(d[i]=[]);
h.push(g);if(!c[i]){c[i]=a.periodical(Math.round(1000/i),h);}return true;};var f=function(g){var i=g.options.fps,h=d[i]||[];h.erase(g);if(!h.length&&c[i]){c[i]=clearInterval(c[i]);
}return false;};})();Fx.CSS=new Class({Extends:Fx,prepare:function(c,d,b){b=Array.from(b);if(b[1]==null){b[1]=b[0];b[0]=c.getStyle(d);}var a=b.map(this.parse);
return{from:a[0],to:a[1]};},parse:function(a){a=Function.from(a)();a=(typeof a=="string")?a.split(" "):Array.from(a);return a.map(function(c){c=String(c);
var b=false;Object.each(Fx.CSS.Parsers,function(f,e){if(b){return;}var d=f.parse(c);if(d||d===0){b={value:d,parser:f};}});b=b||{value:c,parser:Fx.CSS.Parsers.String};
return b;});},compute:function(d,c,b){var a=[];(Math.min(d.length,c.length)).times(function(e){a.push({value:d[e].parser.compute(d[e].value,c[e].value,b),parser:d[e].parser});
});a.$family=Function.from("fx:css:value");return a;},serve:function(c,b){if(typeOf(c)!="fx:css:value"){c=this.parse(c);}var a=[];c.each(function(d){a=a.concat(d.parser.serve(d.value,b));
});return a;},render:function(a,d,c,b){a.setStyle(d,this.serve(c,b));},search:function(a){if(Fx.CSS.Cache[a]){return Fx.CSS.Cache[a];}var b={};Array.each(document.styleSheets,function(e,d){var c=e.href;
if(c&&c.contains("://")&&!c.contains(document.domain)){return;}var f=e.rules||e.cssRules;Array.each(f,function(j,g){if(!j.style){return;}var h=(j.selectorText)?j.selectorText.replace(/^\w+/,function(i){return i.toLowerCase();
}):null;if(!h||!h.test("^"+a+"$")){return;}Element.Styles.each(function(k,i){if(!j.style[i]||Element.ShortStyles[i]){return;}k=String(j.style[i]);b[i]=(k.test(/^rgb/))?k.rgbToHex():k;
});});});return Fx.CSS.Cache[a]=b;}});Fx.CSS.Cache={};Fx.CSS.Parsers={Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true);
}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a));
});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:Function.from(false),compute:function(b,a){return a;
},serve:function(a){return a;}}};Fx.CSS.Parsers=new Hash(Fx.CSS.Parsers);Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);
this.parent(a);},set:function(b,a){if(arguments.length==1){a=b;b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);
return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this;}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);
return this.parent(a.from,a.to);}});Element.Properties.tween={set:function(a){this.get("tween").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("tween");
if(!a){a=new Fx.Tween(this,{link:"cancel"});this.store("tween",a);}return a;}};Element.implement({tween:function(a,c,b){this.get("tween").start(arguments);
return this;},fade:function(c){var e=this.get("tween"),d="opacity",a;c=[c,"toggle"].pick();switch(c){case"in":e.start(d,1);break;case"out":e.start(d,0);
break;case"show":e.set(d,1);break;case"hide":e.set(d,0);break;case"toggle":var b=this.retrieve("fade:flag",this.get("opacity")==1);e.start(d,(b)?0:1);this.store("fade:flag",!b);
a=true;break;default:e.start(d,arguments);}if(!a){this.eliminate("fade:flag");}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));
a=(a=="transparent")?"#fff":a;}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);
},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={};
for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={};
for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){this.get("morph").cancel().setOptions(a);
return this;},get:function(){var a=this.retrieve("morph");if(!a){a=new Fx.Morph(this,{link:"cancel"});this.store("morph",a);}return a;}};Element.implement({morph:function(a){this.get("morph").start(a);
return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":");
a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(b,a){a=Array.from(a);
return Object.append(b,{easeIn:function(c){return b(c,a);},easeOut:function(c){return 1-b(1-c,a);},easeInOut:function(c){return(c<=0.5)?b(2*c,a)/2:(2-b(2*(1-c),a))/2;
}});};Fx.Transitions={linear:function(a){return a;}};Fx.Transitions=new Hash(Fx.Transitions);Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);
}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a&&a[0]||6);},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));
},Sine:function(a){return 1-Math.sin((1-a)*Math.PI/2);},Back:function(b,a){a=a&&a[0]||1.618;return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;
for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3);
}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2]);});});(function(){var a=("onprogress" in new Browser.Request);
var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(d){this.xhr=new Browser.Request();
this.setOptions(d);this.headers=this.options.headers;},onStateChange:function(){var d=this.xhr;if(d.readyState!=4||!this.running){return;}this.running=false;
this.status=0;Function.attempt(function(){var e=d.status;this.status=(e==1223)?204:e;}.bind(this));d.onreadystatechange=function(){};clearTimeout(this.timer);
this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml);
}else{this.failure();}},isSuccess:function(){var d=this.status;return(d>=200&&d<300);},isRunning:function(){return !!this.running;},processScripts:function(d){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(d);
}return d.stripScripts(this.options.evalScripts);},success:function(e,d){this.onSuccess(this.processScripts(e),d);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(d){this.fireEvent("loadstart",[d,this.xhr]);
},progress:function(d){this.fireEvent("progress",[d,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(d,e){this.headers[d]=e;
return this;},getHeader:function(d){return Function.attempt(function(){return this.xhr.getResponseHeader(d);}.bind(this));},check:function(){if(!this.running){return true;
}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(n){if(!this.check(n)){return this;
}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var k=typeOf(n);if(k=="string"||k=="element"){n={data:n};}var g=this.options;
n=Object.append({data:g.data,url:g.url,method:g.method},n);var i=n.data,e=String(n.url),d=n.method.toLowerCase();switch(typeOf(i)){case"element":i=document.id(i).toQueryString();
break;case"object":case"hash":i=Object.toQueryString(i);}if(this.options.format){var l="format="+this.options.format;i=(i)?l+"&"+i:l;}if(this.options.emulation&&!["get","post"].contains(d)){var j="_method="+d;
i=(i)?j+"&"+i:j;d="post";}if(this.options.urlEncoded&&["post","put"].contains(d)){var f=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+f;
}if(!e){e=document.location.pathname;}var h=e.lastIndexOf("/");if(h>-1&&(h=e.indexOf("#"))>-1){e=e.substr(0,h);}if(this.options.noCache){e+=(e.contains("?")?"&":"?")+String.uniqueID();
}if(i&&d=="get"){e+=(e.contains("?")?"&":"?")+i;i=null;}var m=this.xhr;if(a){m.onloadstart=this.loadstart.bind(this);m.onprogress=this.progress.bind(this);
}m.open(d.toUpperCase(),e,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in m){m.withCredentials=true;
}m.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(p,o){try{m.setRequestHeader(o,p);}catch(q){this.fireEvent("exception",[o,p]);
}},this);this.fireEvent("request");m.send(i);if(!this.options.async){this.onStateChange();}if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this);
}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var d=this.xhr;d.abort();clearTimeout(this.timer);d.onreadystatechange=d.onprogress=d.onloadstart=function(){};
this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(d){b[d]=function(e){return this.send({data:e,method:d});
};});c.implement(b);Element.Properties.send={set:function(d){var e=this.get("send").cancel();e.setOptions(d);return this;},get:function(){var d=this.retrieve("send");
if(!d){d=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")});this.store("send",d);}return d;}};Element.implement({send:function(d){var e=this.get("send");
e.send({data:this,url:d||e.options.url});return this;}});})();Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(e){var d=this.options,b=this.response;
b.html=e.stripScripts(function(f){b.javascript=f;});var c=b.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);if(c){b.html=c[1];}var a=new Element("div").set("html",b.html);
b.tree=a.childNodes;b.elements=a.getElements("*");if(d.filter){b.tree=b.elements.filter(d.filter);}if(d.update){document.id(d.update).empty().set("html",b.html);
}else{if(d.append){document.id(d.append).adopt(a.getChildren());}}if(d.evalScripts){Browser.exec(b.javascript);}this.onSuccess(b.tree,b.elements,b.html,b.javascript);
}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this;},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});
this.store("load",a);}return a;}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));
return this;}});if(!this.JSON){this.JSON={};}JSON=new Hash({stringify:JSON.stringify,parse:JSON.parse});Object.append(JSON,{$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16);
},encode:function(b){switch(typeOf(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).clean())+"]";
case"object":case"hash":var a=[];Object.each(b,function(e,d){var c=JSON.encode(e);if(c){a.push(JSON.encode(d)+":"+c);}});return"{"+a+"}";case"number":case"boolean":return String(b);
case"null":return"null";}return null;},decode:function(string,secure){if(typeOf(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null;
}return eval("("+string+")");}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"});
},success:function(c){var b=this.options.secure;var a=this.response.json=Function.attempt(function(){return JSON.decode(c,b);});if(a==null){this.onFailure();
}else{this.onSuccess(a,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b;
this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path;
}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure";
}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}});
Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose();
};(function(j,l){var m,g,f=[],c,b,n=true;try{n=j.frameElement!=null;}catch(i){}var h=function(){clearTimeout(b);if(m){return;}Browser.loaded=m=true;l.removeListener("DOMContentLoaded",h).removeListener("readystatechange",a);
l.fireEvent("domready");j.fireEvent("domready");};var a=function(){for(var e=f.length;e--;){if(f[e]()){h();return true;}}return false;};var k=function(){clearTimeout(b);
if(!a()){b=setTimeout(k,10);}};l.addListener("DOMContentLoaded",h);var d=l.createElement("div");if(d.doScroll&&!n){f.push(function(){try{d.doScroll();return true;
}catch(o){}return false;});c=true;}if(l.readyState){f.push(function(){var e=l.readyState;return(e=="loaded"||e=="complete");});}if("onreadystatechange" in l){l.addListener("readystatechange",a);
}else{c=true;}if(c){k();}Element.Events.domready={onAdd:function(e){if(m){e.call(this);}}};Element.Events.load={base:"load",onAdd:function(e){if(g&&this==j){e.call(this);
}},condition:function(){if(this==j){h();delete Element.Events.load;}return true;}};j.addEvent("load",function(){g=true;});})(window,document);(function(){var id=0;
var Swiff=this.Swiff=new Class({Implements:Options,options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"window",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;
},initialize:function(path,options){this.instance="Swiff_"+String.uniqueID();this.setOptions(options);options=this.options;var id=this.id=options.id||this.instance;
var container=document.id(options.container);Swiff.CallBacks[this.instance]={};var params=options.params,vars=options.vars,callBacks=options.callBacks;
var properties=Object.append({height:options.height,width:options.width},options.properties);var self=this;for(var callBack in callBacks){Swiff.CallBacks[this.instance][callBack]=(function(option){return function(){return option.apply(self.object,arguments);
};})(callBacks[callBack]);vars[callBack]="Swiff.CallBacks."+this.instance+"."+callBack;}params.flashVars=Object.toQueryString(vars);if(Browser.ie){properties.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
params.movie=path;}else{properties.type="application/x-shockwave-flash";}properties.data=path;var build='<object id="'+id+'"';for(var property in properties){build+=" "+property+'="'+properties[property]+'"';
}build+=">";for(var param in params){if(params[param]){build+='<param name="'+param+'" value="'+params[param]+'" />';}}build+="</object>";this.object=((container)?container.empty():new Element("div")).set("html",build).firstChild;
},replaces:function(element){element=document.id(element,true);element.parentNode.replaceChild(this.toElement(),element);return this;},inject:function(element){document.id(element,true).appendChild(this.toElement());
return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments));}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+"</invoke>");
return eval(rs);};})();


// MooTools: the javascript framework.
// Load this file's selection again by visiting: http://mootools.net/more/e05eb93e48601b00936e110baf366039
// Or build this file again with packager using: packager build More/Slider
/*
---
copyrights:
  - [MooTools](http://mootools.net)

licenses:
  - [MIT License](http://mootools.net/license.txt)
...
*/
MooTools.More={version:"1.3.0.1",build:"6dce99bed2792dffcbbbb4ddc15a1fb9a41994b5"};Class.Mutators.Binds=function(a){return a;};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b];
if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null;
}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element;
this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.ie)?"selectstart":"mousedown";if(Browser.ie&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false);
Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)};
this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);
return this;},start:function(a){var k=this.options;if(a.rightClick){return;}if(k.preventDefault){a.preventDefault();}if(k.stopPropagation){a.stopPropagation();
}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=k.limit;this.limit={x:[],y:[]};var j=this.element.getStyles("left","right","top","bottom");
this._invert={x:k.modifiers.x=="left"&&j.left=="auto"&&!isNaN(j.right.toInt())&&(k.modifiers.x="right"),y:k.modifiers.y=="top"&&j.top=="auto"&&!isNaN(j.bottom.toInt())&&(k.modifiers.y="bottom")};
var e,g;for(e in k.modifiers){if(!k.modifiers[e]){continue;}var b=this.element.getStyle(k.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());
}b=g[k.modifiers[e]];}if(k.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[k.modifiers[e]];}if(k.invert){this.value.now[e]*=-1;
}if(this._invert[e]){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e];if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;
}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};
h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault();}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));
if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);
}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault();}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;
}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1;}if(this._invert[c]){this.value.now[c]*=-1;}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];
}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]<this.limit[c][0])){this.value.now[c]=this.limit[c][0];}}}if(a.grid[c]){this.value.now[c]-=((this.value.now[c]-(this.limit[c][0]||0))%a.grid[c]);
}if(a.style){this.element.setStyle(a.modifiers[c],this.value.now[c]+a.unit);}else{this.element[a.modifiers[c]]=this.value.now[c];}}this.fireEvent("drag",[this.element,b]);
},cancel:function(a){this.document.removeEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});if(a){this.document.removeEvent(this.selection,this.bound.eventStop);
this.fireEvent("cancel",this.element);}},stop:function(b){var a={mousemove:this.bound.drag,mouseup:this.bound.stop};a[this.selection]=this.bound.eventStop;
this.document.removeEvents(a);if(b){this.fireEvent("complete",[this.element,b]);}}});Element.implement({makeResizable:function(a){var b=new Drag(this,Object.merge({modifiers:{x:"width",y:"height"}},a));
this.store("resizer",b);return b.addEvent("drag",function(){this.fireEvent("resize",b);}.bind(this));}});(function(){var a=function(d,c){var e=[];Object.each(c,function(f){Object.each(f,function(g){d.each(function(h){e.push(h+"-"+g+(h=="border"?"-width":""));
});});});return e;};var b=function(e,d){var c=0;Object.each(d,function(g,f){if(f.test(e)){c=c+g.toInt();}});return c;};Element.implement({measure:function(h){var d=function(j){return !!(!j||j.offsetHeight||j.offsetWidth);
};if(d(this)){return h.apply(this);}var g=this.getParent(),i=[],e=[];while(!d(g)&&g!=document.body){e.push(g.expose());g=g.getParent();}var f=this.expose();
var c=h.apply(this);f();e.each(function(j){j();});return c;},expose:function(){if(this.getStyle("display")!="none"){return function(){};}var c=this.style.cssText;
this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=c;}.bind(this);},getDimensions:function(c){c=Object.merge({computeSize:false},c);
var h={x:0,y:0};var g=function(i,e){return(e.computeSize)?i.getComputedSize(e):i.getSize();};var d=this.getParent("body");if(d&&this.getStyle("display")=="none"){h=this.measure(function(){return g(this,c);
});}else{if(d){try{h=g(this,c);}catch(f){}}}return Object.append(h,(h.x||h.x===0)?{width:h.x,height:h.y}:{x:h.width,y:h.height});},getComputedSize:function(c){if(c&&c.plains){c.planes=c.plains;
}c=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},c);var e={},d={width:0,height:0};if(c.mode=="vertical"){delete d.width;
delete c.planes.width;}else{if(c.mode=="horizontal"){delete d.height;delete c.planes.height;}}a(c.styles,c.planes).each(function(f){e[f]=this.getStyle(f).toInt();
},this);Object.each(c.planes,function(g,f){var h=f.capitalize();e[f]=this.getStyle(f).toInt();d["total"+h]=e[f];g.each(function(j){var i=b(j,e);d["computed"+j.capitalize()]=i;
d["total"+h]+=i;});},this);return Object.append(d,e);}});})();var Slider=new Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){if(this.options.snap){a=this.toPosition(this.step);
}this.knob.setStyle(this.property,a);},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);
this.element=document.id(f);this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var g,b={},d={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";
this.property="top";g="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";g="offsetWidth";}this.full=this.element.measure(function(){this.half=this.knob[g]/2;
return this.element[g]-this.knob[g]+(this.options.offset*2);}.bind(this));this.setRange(this.options.range);this.knob.setStyle("position","relative").setStyle(this.property,-this.options.offset);
d[this.axis]=this.property;b[this.axis]=[-this.options.offset,this.full-this.options.offset];var c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true;
}).bind(this),onCancel:function(){this.isDragging=false;}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end();}.bind(this)};
if(this.options.snap){c.grid=Math.ceil(this.stepWidth);c.limit[this.axis][1]=this.full;}this.drag=new Drag(this.knob,c);this.attach();if(this.options.initialStep!=null){this.set(this.options.initialStep);
}},attach:function(){this.element.addEvent("mousedown",this.clickedElement);if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement);
}this.drag.attach();return this;},detach:function(){this.element.removeEvent("mousedown",this.clickedElement);this.element.removeEvent("mousewheel",this.scrolledElement);
this.drag.detach();return this;},set:function(a){if(!((this.range>0)^(a<this.min))){a=this.min;}if(!((this.range>0)^(a>this.max))){a=this.max;}this.step=Math.round(a);
this.checkStep();this.fireEvent("tick",this.toPosition(this.step));this.end();return this;},setRange:function(a,b){this.min=Array.pick([a[0],0]);this.max=Array.pick([a[1],this.options.steps]);
this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;this.stepWidth=this.stepSize*this.full/Math.abs(this.range);
this.set(Array.pick([b,this.step]).floor(this.min).max(this.max));return this;},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return;
}var b=this.range<0?-1:1;var a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;a=a.limit(-this.options.offset,this.full-this.options.offset);
this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();this.fireEvent("tick",a);this.end();},scrolledElement:function(a){var b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0);
this.set(b?this.step-this.stepSize:this.step+this.stepSize);a.stop();},draggedKnob:function(){var b=this.range<0?-1:1;var a=this.drag.value.now[this.axis];
a=a.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;
this.fireEvent("change",this.step);}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"");
}},toStep:function(a){var b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(b-=b%this.stepSize):b;},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset;
}});

/**
 * Fx.ProgressBar
 *
 * @version		1.1
 *
 * @license		MIT License
 *
 * @author		Harald Kirschner <mail [at] digitarald [dot] de>
 * @copyright	Authors
 */

Fx.ProgressBar = new Class({

	Extends: Fx,

	options: {
		text: null,
		url: null,
		transition: Fx.Transitions.Circ.easeOut,
		fit: true,
		link: 'cancel'
	},

	initialize: function(element, options) {
		this.element = $(element);
		this.parent(options);
				
		var url = this.options.url;
		if (url) {
			this.element.setStyles({
				'background-image': 'url(' + url + ')',
				'background-repeat': 'no-repeat'
			});
		}
		
		if (this.options.fit) {
			url = url || this.element.getStyle('background-image').replace(/^url\(["']?|["']?\)$/g, '');
			if (url) {
				var fill = new Image();
				fill.onload = function() {
					this.fill = fill.width;
					fill = fill.onload = null;
					this.set(this.now || 0);
				}.bind(this);
				fill.src = url;
				if (!this.fill && fill.width) fill.onload();
			}
		} else {
			this.set(0);
		}
	},

	start: function(to, total) {
		return this.parent(this.now, (arguments.length == 1) ? to.limit(0, 100) : to / total * 100);
	},

	set: function(to) {
		this.now = to;
		var css = (this.fill)
			? (((this.fill / -2) + (to / 100) * (this.element.width || 1) || 0).round() + 'px')
			: ((100 - to) + '%');
		
		this.element.setStyle('backgroundPosition', css + ' 0px').title = Math.round(to) + '%';
		
		var text = $(this.options.text);
		if (text) text.set('text', Math.round(to) + '%');
		
		return this;
	}

});

/**
 * Swiff.Uploader - Flash FileReference Control
 *
 * @version		3.0
 *
 * @license		MIT License
 *
 * @author		Harald Kirschner <http://digitarald.de>
 * @author		Valerio Proietti, <http://mad4milk.net>
 * @copyright	Authors
 */

Swiff.Uploader = new Class({

	Extends: Swiff,

	Implements: Events,

	options: {
		path: 'Swiff.Uploader.swf',
		
		target: null,
		zIndex: 9999,
		
		callBacks: null,
		params: {
			wMode: 'opaque',
			menu: 'false',
			allowScriptAccess: 'always'
		},

		typeFilter: null,
		multiple: true,
		queued: true,
		verbose: false,
		height: 30,
		width: 100,
		passStatus: null,

		url: null,
		method: null,
		data: null,
		mergeData: true,
		fieldName: null,

		fileSizeMin: 1,
		fileSizeMax: null, // Official limit is 100 MB for FileReference, but I tested up to 2Gb!
		allowDuplicates: false,
		timeLimit: (Browser.Platform.linux) ? 0 : 30,

		policyFile: null,
		buttonImage: null,
		
		fileListMax: 0,
		fileListSizeMax: 0,

		instantStart: false,
		appendCookieData: false,
		
		fileClass: null
		/*
		onLoad: $empty,
		onFail: $empty,
		onStart: $empty,
		onQueue: $empty,
		onComplete: $empty,
		onBrowse: $empty,
		onDisabledBrowse: $empty,
		onCancel: $empty,
		onSelect: $empty,
		onSelectSuccess: $empty,
		onSelectFail: $empty,
		
		onButtonEnter: $empty,
		onButtonLeave: $empty,
		onButtonDown: $empty,
		onButtonDisable: $empty,
		
		onFileStart: $empty,
		onFileStop: $empty,
		onFileRequeue: $empty,
		onFileOpen: $empty,
		onFileProgress: $empty,
		onFileComplete: $empty,
		onFileRemove: $empty,
		
		onBeforeStart: $empty,
		onBeforeStop: $empty,
		onBeforeRemove: $empty
		*/
	},

	initialize: function(options) {
		// protected events to control the class, added
		// before setting options (which adds own events)
		this.addEvent('load', this.initializeSwiff, true)
			.addEvent('select', this.processFiles, true)
			.addEvent('complete', this.update, true)
			.addEvent('fileRemove', function(file) {
				this.fileList.erase(file);
			}.bind(this), true);

		this.setOptions(options);

		// callbacks are no longer in the options, every callback
		// is fired as event, this is just compat
		if (this.options.callBacks) {
			Hash.each(this.options.callBacks, function(fn, name) {
				this.addEvent(name, fn);
			}, this);
		}

		this.options.callBacks = {
			fireCallback: this.fireCallback.bind(this)
		};

		var path = this.options.path;
		if (!path.contains('?')) path += '?noCache=' + $time(); // cache in IE

		// container options for Swiff class
		this.options.container = this.box = new Element('span', {'class': 'swiff-uploader-box'}).inject($(this.options.container) || document.body);

		// target 
		this.target = $(this.options.target);
		if (this.target) {
			var scroll = window.getScroll();
			this.box.setStyles({
				position: 'absolute',
				visibility: 'visible',
				zIndex: this.options.zIndex,
				overflow: 'hidden',
				height: 1, width: 1,
				top: scroll.y, left: scroll.x
			});
			
			// we force wMode to transparent for the overlay effect
			this.parent(path, {
				params: {
					wMode: 'transparent'
				},
				height: '100%',
				width: '100%'
			});
			
			this.target.addEvent('mouseenter', this.reposition.bind(this, []));
			
			// button interactions, relayed to to the target
			this.addEvents({
				buttonEnter: this.targetRelay.bind(this, ['mouseenter']),
				buttonLeave: this.targetRelay.bind(this, ['mouseleave']),
				buttonDown: this.targetRelay.bind(this, ['mousedown']),
				buttonDisable: this.targetRelay.bind(this, ['disable'])
			});
			
			this.reposition();
			window.addEvent('resize', this.reposition.bind(this, []));
		} else {
			this.parent(path);
		}

		this.inject(this.box);

		this.fileList = [];
		
		this.size = this.uploading = this.bytesLoaded = this.percentLoaded = 0;
		
		if (Browser.Plugins.Flash.version < 9) {
			this.fireEvent('fail', ['flash']);
		} else {
			this.verifyLoad.delay(1000, this);
		}
	},
	
	verifyLoad: function() {
		if (this.loaded) return;
		if (!this.object.parentNode) {
			this.fireEvent('fail', ['disabled']);
		} else if (this.object.style.display == 'none') {
			this.fireEvent('fail', ['hidden']);
		} else if (!this.object.offsetWidth) {
			this.fireEvent('fail', ['empty']);
		}
	},

	fireCallback: function(name, args) {
		// file* callbacks are relayed to the specific file
		if (name.substr(0, 4) == 'file') {
			// updated queue data is the second argument
			if (args.length > 1) this.update(args[1]);
			var data = args[0];
			
			var file = this.findFile(data.id);
			this.fireEvent(name, file || data, 5);
			if (file) {
				var fire = name.replace(/^file([A-Z])/, function($0, $1) {
					return $1.toLowerCase();
				});
				file.update(data).fireEvent(fire, [data], 10);
			}
		} else {
			this.fireEvent(name, args, 5);
		}
	},

	update: function(data) {
		// the data is saved right to the instance 
		$extend(this, data);
		this.fireEvent('queue', [this], 10);
		return this;
	},

	findFile: function(id) {
		for (var i = 0; i < this.fileList.length; i++) {
			if (this.fileList[i].id == id) return this.fileList[i];
		}
		return null;
	},

	initializeSwiff: function() {
		// extracted options for the swf 
		this.remote('xInitialize', {
			typeFilter: this.options.typeFilter,
			multiple: this.options.multiple,
			queued: this.options.queued,
			verbose: this.options.verbose,
			width: this.options.width,
			height: this.options.height,
			passStatus: this.options.passStatus,
			url: this.options.url,
			method: this.options.method,
			data: this.options.data,
			mergeData: this.options.mergeData,
			fieldName: this.options.fieldName,
			fileSizeMin: this.options.fileSizeMin,
			fileSizeMax: this.options.fileSizeMax,
			allowDuplicates: this.options.allowDuplicates,
			timeLimit: this.options.timeLimit,
			policyFile: this.options.policyFile,
			buttonImage: this.options.buttonImage
		});

		this.loaded = true;

		this.appendCookieData();
	},
	
	targetRelay: function(name) {
		if (this.target) this.target.fireEvent(name);
	},

	reposition: function(coords) {
		// update coordinates, manual or automatically
		coords = coords || (this.target && this.target.offsetHeight)
			? this.target.getCoordinates(this.box.getOffsetParent())
			: {top: window.getScrollTop(), left: 0, width: 40, height: 40}
		this.box.setStyles(coords);
		this.fireEvent('reposition', [coords, this.box, this.target]);
	},

	setOptions: function(options) {
		if (options) {
			if (options.url) options.url = Swiff.Uploader.qualifyPath(options.url);
			if (options.buttonImage) options.buttonImage = Swiff.Uploader.qualifyPath(options.buttonImage);
			this.parent(options);
			if (this.loaded) this.remote('xSetOptions', options);
		}
		return this;
	},

	setEnabled: function(status) {
		this.remote('xSetEnabled', status);
	},

	start: function() {
		this.fireEvent('beforeStart');
		this.remote('xStart');
	},

	stop: function() {
		this.fireEvent('beforeStop');
		this.remote('xStop');
	},

	remove: function() {
		this.fireEvent('beforeRemove');
		this.remote('xRemove');
	},

	fileStart: function(file) {
		this.remote('xFileStart', file.id);
	},

	fileStop: function(file) {
		this.remote('xFileStop', file.id);
	},

	fileRemove: function(file) {
		this.remote('xFileRemove', file.id);
	},

	fileRequeue: function(file) {
		this.remote('xFileRequeue', file.id);
	},

	appendCookieData: function() {
		var append = this.options.appendCookieData;
		if (!append) return;
		
		var hash = {};
		document.cookie.split(/;\s*/).each(function(cookie) {
			cookie = cookie.split('=');
			if (cookie.length == 2) {
				hash[decodeURIComponent(cookie[0])] = decodeURIComponent(cookie[1]);
			}
		});

		var data = this.options.data || {};
		if ($type(append) == 'string') data[append] = hash;
		else $extend(data, hash);

		this.setOptions({data: data});
	},

	processFiles: function(successraw, failraw, queue) {
		var cls = this.options.fileClass || Swiff.Uploader.File;

		var fail = [], success = [];

		if (successraw) {
			successraw.each(function(data) {
				var ret = new cls(this, data);
				if (!ret.validate()) {
					ret.remove.delay(10, ret);
					fail.push(ret);
				} else {
					this.size += data.size;
					this.fileList.push(ret);
					success.push(ret);
					ret.render();
				}
			}, this);

			this.fireEvent('selectSuccess', [success], 10);
		}

		if (failraw || fail.length) {
			fail.extend((failraw) ? failraw.map(function(data) {
				return new cls(this, data);
			}, this) : []).each(function(file) {
				file.invalidate().render();
			});

			this.fireEvent('selectFail', [fail], 10);
		}

		this.update(queue);

		if (this.options.instantStart && success.length) this.start();
	}

});

$extend(Swiff.Uploader, {

	STATUS_QUEUED: 0,
	STATUS_RUNNING: 1,
	STATUS_ERROR: 2,
	STATUS_COMPLETE: 3,
	STATUS_STOPPED: 4,

	log: function() {
		if (window.console && console.info) console.info.apply(console, arguments);
	},

	unitLabels: {
		b: [{min: 1, unit: 'B'}, {min: 1024, unit: 'kB'}, {min: 1048576, unit: 'MB'}, {min: 1073741824, unit: 'GB'}],
		s: [{min: 1, unit: 's'}, {min: 60, unit: 'm'}, {min: 3600, unit: 'h'}, {min: 86400, unit: 'd'}]
	},

	formatUnit: function(base, type, join) {
		var labels = Swiff.Uploader.unitLabels[(type == 'bps') ? 'b' : type];
		var append = (type == 'bps') ? '/s' : '';
		var i, l = labels.length, value;

		if (base < 1) return '0 ' + labels[0].unit + append;

		if (type == 's') {
			var units = [];

			for (i = l - 1; i >= 0; i--) {
				value = Math.floor(base / labels[i].min);
				if (value) {
					units.push(value + ' ' + labels[i].unit);
					base -= value * labels[i].min;
					if (!base) break;
				}
			}

			return (join === false) ? units : units.join(join || ', ');
		}

		for (i = l - 1; i >= 0; i--) {
			value = labels[i].min;
			if (base >= value) break;
		}

		return (base / value).toFixed(1) + ' ' + labels[i].unit + append;
	}

});

Swiff.Uploader.qualifyPath = (function() {
	
	var anchor;
	
	return function(path) {
		(anchor || (anchor = new Element('a'))).href = path;
		return anchor.href;
	};

})();

Swiff.Uploader.File = new Class({

	Implements: Events,

	initialize: function(base, data) {
		this.base = base;
		this.update(data);
	},

	update: function(data) {
		return $extend(this, data);
	},

	validate: function() {
		var options = this.base.options;
		
		if (options.fileListMax && this.base.fileList.length >= options.fileListMax) {
			this.validationError = 'fileListMax';
			return false;
		}
		
		if (options.fileListSizeMax && (this.base.size + this.size) > options.fileListSizeMax) {
			this.validationError = 'fileListSizeMax';
			return false;
		}
		
		return true;
	},

	invalidate: function() {
		this.invalid = true;
		this.base.fireEvent('fileInvalid', this, 10);
		return this.fireEvent('invalid', this, 10);
	},

	render: function() {
		return this;
	},

	setOptions: function(options) {
		if (options) {
			if (options.url) options.url = Swiff.Uploader.qualifyPath(options.url);
			this.base.remote('xFileSetOptions', this.id, options);
			this.options = $merge(this.options, options);
		}
		return this;
	},

	start: function() {
		this.base.fileStart(this);
		return this;
	},

	stop: function() {
		this.base.fileStop(this);
		return this;
	},

	remove: function() {
		this.base.fileRemove(this);
		return this;
	},

	requeue: function() {
		this.base.fileRequeue(this);
	} 

});


var Validate = {

	isEmail: function(value) {
		var email = trim(value).toLowerCase();
		// var emailReg = /^[a-z0-9!#_=~.+-]+@[a-z0-9\.\-]+\.?[a-z]{2,4}$/;
		// The Official Standard: RFC 2822
		var emailReg = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/;
		var cnoReg = /^[a-z]*\:\d*$/;
		return emailReg.test(email) || cnoReg.test(email);
	},

	isNotEmpty: function(value) {
		return trim(value);
	},

	isPhoneNumber: function(value) {
		var phoneNumber = trim(value).replace(new RegExp('[^0-9() -]', 'g'), '');
		return phoneNumber != '';
	},

	isUrl: function(value) {
		var url = trim(value).toLowerCase();
		var urlReg = /^(https?:\/\/)?.+\..+$/i;
		return urlReg.test(url);
	},

	isDomain: function(value) {
		var domain = trim(value).toLowerCase();
		var domainReg = /^.+\..+$/i;
		return domainReg.test(domain);
	},

	isCardNumber: function(value) {
		var creditCardNumber = value.replace(new RegExp('[^0-9]', 'g'), '');
		return creditCardNumber.length >= 13;
	},

	isRePassword: function(value, t)
	{
		var password = t.getParent('form').getElement('input[name=password]').value;
		var password2 = value;
		if(password2)
		{
			return password == password2;
		}
		else
		{
			return true;
		}
	},

	isNotSpecialChar: function(value)
	{
		var _value = trim(value);
		var _reg = /^[a-zA-Z]+\S+$/;
		return _reg.test(_value);
	}
};

function trim(s)
{
	return s.replace(/^\s+|\s+$/g,'');
}

// init page
window.addEvent('domready', function() {
	initInputs();
	initPopups();
	initLinks();
	//initWLH();
	//initOrderPage();
	initCustomForms();
	initValidate();
	setGmtOffset();
	initUpload();
	initLogin();
	initHomeGallery();
	initPortfolioGallery();
	initTabs();
	initProfile();
	initOrderForm();
	initOrderListActivePage();
    initSpamProtection();
});

// homepage sliding tabs
function initHomeGallery() {
	$$('div.main-holder').each(function(obj){
		new fadeGallery(obj,{
			pagerLinks: '.tabset-nav li',
			slides: 'div.slide',
			activeClass: 'active',
			autoSlide: false,
			switchTime: 3000,
			duration: 200
		});
	});
}

// portfolio cycle gallery
function initPortfolioGallery() {
	$$('div.gallery-holder').each(function(obj,i){
		var _gallery = new cycleCarousel(obj,{
			sliderHolder: 'div.photo-section',
			slider: '>ul',
			slides: '>li',
			btPrev: 'a.prev',
			btNext: 'a.next',
			duration: 400
		});
	});
}

// tabs init
function initTabs() {
	var _activeClass = 'active';
	$$('.tabs-here').each(function(_el){
		var _item = _el;
		var _links = _item.getElements('a');
		var _tabs = [];
		var activeElement = null;

		_links.each(function(_opener, i){
			var _target = $(_opener.href.substring(_opener.href.indexOf('#')+1));
			_tabs.push(_target);

			if(window.location.hash == _opener.get('href'))
			{
				activeElement = _opener;
			}
			else if(!activeElement && (_opener.getParent().hasClass(_activeClass) || i == 0))
			{
				activeElement = _opener;
			}

			// show/hide tabs
			//if(_opener.getParent().hasClass(_activeClass)) _target.setStyles({'display':'block'});
			//else _target.setStyles({'display':'none'});
			_target.setStyles({'display':'none'});

			// switch tab
			_opener.addEvent('click', function(){
				_tabs.each(function(_tab){
					if(_tab == _target) _tab.setStyles({'display':'block'});
					else _tab.setStyles({'display':'none'});
				});
				_links.getParent().removeClass(_activeClass);
				_opener.getParent().addClass(_activeClass);
				return false;
			});
		});

		if(activeElement)
		{
			activeElement.fireEvent('click');
		}
	});
}

function initProfile()
{
	var _activeClass = 'active';
	var togglePasswordContainer = $('change-password-toggle');
	var toggleGeneralContainer = $('general-toggle');

	if(!togglePasswordContainer) return;

	togglePasswordContainer.getElements('input').each(function(element){
		element.setProperty('value', '');
	});

	togglePasswordContainer.setStyles({'display':'none'});
	$$('.more').each(function(_el){
		_el.addEvent('click', function(){
			if(togglePasswordContainer.hasClass(_activeClass))
			{
				_el.set('html', 'Change password');

				togglePasswordContainer.setStyles({'display':'none'});
				togglePasswordContainer.removeClass(_activeClass);
				toggleGeneralContainer.setStyles({'display':'block'});
			}
			else
			{
				_el.set('html', 'Back to general');
				togglePasswordContainer.setStyles({'display':'block'});
				togglePasswordContainer.addClass(_activeClass);
				toggleGeneralContainer.setStyles({'display':'none'});
			}
			return false;
		});
	});
}

// cycle gallery code
var cycleCarousel = new Class({
	options: {
		activeClass: 'active',
		btPrev: 'a.btn-prev',
		btNext: 'a.btn-next',
		pagerLinks: 'ul.tabset li',
		slidesHolder: 'div',
		slider: '.slide',
		slides: 'li',
		switchTime: 3000,
		duration : 2000,
		stopAfterClick:false,
		autoRotation:false
	},

	// create class
	initialize: function(element, options){
		this.setOptions(options);
		var _this = this;

		if (this.options.btNext) this.next = element.getElement(this.options.btNext);
		else this.next = false;

		if (this.options.btPrev) this.prev = element.getElement(this.options.btPrev);
		else this.prev = false;

		if (this.options.pagerLinks) this.pagerLinks = element.getElements(this.options.pagerLinks);
		else this.pagerLinks = false;

		this.animated = false;
		this.holder = element.getElement(this.options.slidesHolder);
		this.slider = this.holder.getElement(this.options.slider);
		this.slides = this.slider.getElements(this.options.slides);

		this.stepWidth = this.slides[0].getSize().x;
		this.switchTime = this.options.switchTime;
		this.activeClass = this.options.activeClass;
		this.autoRotation = this.options.autoRotation;
		this.stopAfterClick = this.options.stopAfterClick;

		// gallery init
		this.duration = this.options.duration;
		this.slideCount = this.slides.length;
		this.oldIndex = 0;
		this.currentIndex = 0;
		this.timer = false;
		this.direction = false;

		// slides init
		this.slider.setStyles({position:'relative',height:this.slider.getSize().y, width:this.stepWidth});
		this.slides.each(function(slide){
			slide.setStyles({position:'absolute',top:0,left:_this.stepWidth});
		});
		this.slides[this.currentIndex].setStyles({left:0});

		// mouseover
		_this.addEvent('mouseover', function(){
			if (_this.timer) clearInterval(_this.timer);
		}).addEvent('mouseout', function(){
			_this.autoSlide();
		});

		// gallery control
		if (this.next) {
			this.next.addEvent('click', function(){
				if (!_this.animated) {
					if(_this.stopAfterClick) {
						_this.autoRotation = false;
						clearTimeout(_this.timer);
					}
					_this.nextSlide();
				}
				return false;
			});
		}
		if (this.prev) {
			this.prev.addEvent('click', function(){
				if (!_this.animated) {
					if(_this.stopAfterClick) {
						_this.autoRotation = false;
						clearTimeout(_this.timer);
					}
					_this.prevSlide();
				}
				return false;
			});
		}
		if (this.pagerLinks) {
			this.pagerLinks.each(function(link,ind){
				link.addEvent('click', function(){
					if (!_this.animated && _this.currentIndex!=ind) {

						if(_this.stopAfterClick) {
							_this.autoRotation = false;
							clearTimeout(_this.timer);
						}
						_this.direction = (_this.currentIndex < ind);
						_this.oldIndex = _this.currentIndex;
						_this.currentIndex = ind;
						_this.switchSlide();
					}
					return false;
				});
			});
		}

		// autoslide
		if (this.options.autoRotation) {
			this.autoSlide();
		}
	},
	nextSlide: function(){
		this.oldIndex = this.currentIndex;
		if(this.currentIndex < this.slideCount-1) this.currentIndex++;
		else this.currentIndex = 0;
		this.direction = true;
		this.switchSlide();
	},
	prevSlide: function(){
		this.oldIndex = this.currentIndex;
		if(this.currentIndex < this.slideCount-1) this.currentIndex++;
		else this.currentIndex = 0;
		this.direction = false;
		this.switchSlide();
	},
	refreshPager: function() {
		// refresh pagination
		if (this.pagerLinks) {
			this.pagerLinks.each(function(link,ind){
				if(ind != this.currentIndex) {
					link.removeClass(this.activeClass);
				} else {
					link.addClass(this.activeClass);
				}
			}.bind(this));
		}
	},
	switchSlide: function(){
		var _d = (this.direction ? -1 : 1);
		var oldSlide = this.slides[this.oldIndex];
		var newSlide = this.slides[this.currentIndex];
		var fxOldSlide = new Fx.Morph(oldSlide, {duration: this.duration});
		var fxNewSlide = new Fx.Morph(newSlide, {duration: this.duration});

		newSlide.setStyles({left:-this.stepWidth*_d});
		fxOldSlide.start({'left':this.stepWidth*_d});
		fxNewSlide.start({'left':0});
		this.autoSlide();
		this.refreshPager();
	},
	autoSlide : function(){
		if(this.autoRotation) {
			var _this = this;
			if(this.timer) clearTimeout(this.timer);
			this.timer = setInterval(function(){_this.nextSlide();}, this.options.switchTime);
		}
	},

	// add options and events
	Implements : [Options, Events]
});

// fade gallery module
var fadeGallery = new Class({
	options: {
		pagerLinks: 'ul.pagerlinks li',
		slides: 'ul.slidelist li',
		activeClass: 'active',
		autoSlide: false,
		switchTime: 3000,
		duration : 500
	},

	// create class
	initialize: function(element, options){
		this.setOptions(options);
		var _this = this;

		this.slideset = element.getElements(this.options.slides);
		if(!this.slideset[0])
		{
			return false;
		}
		this.slidesetHolder = this.slideset[0].getParent();
		this.slidesCount = this.slideset.length;
		this.pagerLinks = element.getElements(this.options.pagerLinks);
		this.autoRotation = this.options.autoSlide;
		this.activeClass = this.options.activeClass;
		this.switchTime = this.options.switchTime;

		// slides
		if (this.slidesCount < 2) return;
		this.duration = this.options.duration;
		this.currentIndex = 0;
		this.oldIndex = 0;
		this.timer = false;

		this.pagerLinks.each(function(_slide, _index){
			if(_slide.hasClass(this.activeClass)) {
				this.oldIndex = this.currentIndex = _index;
			}
		}.bind(this));

		// gallery init
		this.slideset.each(function(_slide, _index){
			if(_index != _this.currentIndex) _slide.removeClass(_this.activeClass).setStyles({display:'none',opacity:0});
			else _slide.addClass(_this.activeClass).setStyles({display:'block',opacity:1});
		});
		this.slidesetHolder.setStyles({height:this.slideset[this.currentIndex].getSize().y})

		// init control
		if(this.pagerLinks.length) {
			this.pagerLinks.each(function(item,ind){
				item.addEvent('click', function(){
					_this.numSlide(ind);
					return false;
				});
			});
		}

		// start autoslide
		if (this.options.autoSlide) {
			this.autoSlide();
		}
	},
	refreshPagination:function(){
		var _this = this;
		if(this.pagerLinks.length) {
			this.pagerLinks.each(function(item,ind){
				if(ind == _this.currentIndex) item.addClass(_this.activeClass);
				else item.removeClass(_this.activeClass)
			});
		}
	},
	numSlide: function(ind){
		if(this.currentIndex != ind) {
			this.oldIndex = this.currentIndex;
			this.currentIndex = ind;
			this.switchSlide();
		}
	},
	nextSlide: function(){
		this.oldIndex = this.currentIndex;
		if(this.currentIndex < this.slidesCount-1) this.currentIndex++;
		else this.currentIndex = 0;
		this.switchSlide();
	},
	prevSlide: function(){
		this.oldIndex = this.currentIndex;
		this.currentIndex--;
		if (this.currentIndex < 0) this.currentIndex = this.slidesCount-1;
		this.switchSlide();
	},
	switchSlide:function(){
		var _oldSlide = this.slideset[this.oldIndex].removeClass(this.activeClass).setStyles({opacity:1,display:'block'});
		var _newSlide = this.slideset[this.currentIndex].addClass(this.activeClass).setStyles({opacity:0,display:'block'});

		// fade elements
		var fxFadeOut = new Fx.Morph(_oldSlide, {duration: this.duration, onComplete:function(){_oldSlide.setStyles({display:'none'})}});
		var fxFadeIn = new Fx.Morph(_newSlide, {duration: this.duration});
		var fxSlideset = new Fx.Morph(this.slidesetHolder, {duration: this.duration});

		fxFadeOut.start({opacity:0});
		fxFadeIn.start({opacity:1});
		fxSlideset.start({height:_newSlide.getSize().y});
		this.autoSlide();
		this.refreshPagination();
	},
	autoSlide: function(){
		if(this.autoRotation) {
			var _this = this;
			if(this.timer) clearTimeout(this.timer);
			this.timer = setTimeout(function(){_this.nextSlide()}, this.switchTime);
		}
	},
	// add options and events
	Implements : [Options, Events]
});

function initLogin()
{
	if($('login'))
	{
		$('forgot-password-link').addEvent('click', function(){
			$('forgot-password-email').value = $('login-email').value;
		});
		$('back-login').addEvent('click', function(){
			$('login-email').value = $('forgot-password-email').value;
		});

		// remove note before click link
		$$('a.open-popup').addEvent('click', function(){
			var href = this.get('href').substr(1);
			var note = $(href).getElement('strong.note');
			if(note)
			{
				note.destroy();
			}
		});
	}
}

// init hover for IE6
function ieHover() {
	hoverForIE6(".chat-form .submit, .feedback .submit-send, .account .submit-send, .account-login .submit, .account .submit-send, .profile-form .submit, .order-form .submit-payment, .placeorder .submit", "hover");
}

// add link handlers
function initLinks() {
	$$('a[rel*=external]').set('target', '_blank');
	$$('a.noclick').addEvent('click', function(){return false;});
	$$('.cancel-link').addEvent('click', function() {
		var form = this.getParent('form');
		form.getElement('[name=upload_file_id]').value = '';
		var uploadList = form.getElement('.upload-list');
		if(uploadList)
		{
			uploadList.destroy();
		}
		return false;
	});
	/*
	var alertMessage = $$('[href=#alert-message]')[0];
	if(alertMessage)
	{
		alertMessage.fireEvent('click');
	}
	*/
}

// window location hash handler
function initWLH() {
	var hash = window.location.hash;
	if (hash != '') {
		$$('a[href=' + hash + ']').fireEvent('click');
	}
}

// form validation
function initValidate() {
	$$('[class*=Validate:]').addEvents({
		blur: function(){
			var value = this.value.trim();
			if(this.get('keydown') == 'true' && value)
			{
				this.fireEvent('check');
			}
		},
		focus: function(){
			var row = this.getParent('.row');
			var strong = row.getElement('strong');
			if(strong)
			{
				strong.addClass('hidden');
			}
			row.removeClass('error');
		},
		check: function(){
			var fun=/validate\:(\S+)/i.exec(this.get('class'));
			var validate = true;
			if(typeof fun[1] != 'undefined')
			{
				var r = eval('Validate.' + fun[1] + '("' + this.value + '", this)');
				if(!r)
				{
					var row = this.getParent('.row');
					var strong = row.getElement('strong');
					if(strong)
					{
						strong.removeClass('hidden');
					}
					row.addClass('error');
					validate = false;
				}
			}
			this.set('validate', validate);
		},
		keydown: function(){
			this.set('keydown', true);
		}
	});
	$$(document.getElements('form')).addEvent('submit', function(isForce){
	//$$('form').addEvent('submit', function(isForce){
		var isSubmit = true;
		var submit = this.getElements('input[type=submit]');
		submit.addClass('hover');
		this.getElements('[class*=Validate:]').each(function(el){
			el.fireEvent('check');
			if(el.get('validate') == 'false')
			{
				isSubmit = false;
			}
		});
		var uploadFileId = this.getElement('[name=upload_file_id]');
		if(uploadFileId && uploadFileId.get('validate') == 'false')
		{
			isSubmit = false;
			this.set('submitAfterUpload', true);
		}
		if(isForce === true && isSubmit)
		{
			this.submit();
		}
		if(!isSubmit)
		{
			submit.removeClass('hover');
		}
		return isSubmit;
	});
}

function initUpload()
{
	function getShortName(name)
	{
		var maxLen = 18;
		var len = name.length;
		if(len > maxLen)
		{
			split = name.split('.');
			var ext = split.pop();
			var lenExt = ext.length;
			name = name.substr(0, maxLen - lenExt) + '..' + ext;
		}
		return name;
	};
	var links = $$('.btn-choose');
	links.each(function(link){
		new Swiff.Uploader({
			path: '/js/Swiff.Uploader.swf',
			url: '/file-upload',
			fileSizeMax: 67108864, //64 * 1024 * 1024,
			multiple: false,
			queued: false,
			//verbose: true,
			target: link,
			instantStart: true,
			appendCookieData: true,
			//onQueue: linkUpdate,
			onButtonEnter: function()
			{
				this.target.addClass('hover');
			},
			onButtonLeave: function()
			{
				this.target.removeClass('hover').blur();
			},
			onButtonDown: function()
			{
				this.target.focus();
			},
			onSelectSuccess: function(files) {
				var swf = this;
				var file = files[0];
				swf.setEnabled(false);
				var uploadFileId = swf.target.getParent('form').getElement('[name=upload_file_id]');
				uploadFileId.set('validate', false);
				var uploadList = swf.target.getParent('form').getElement('.upload-list-container');
				if(uploadList)
				{
					uploadList.set('html', '<ul class="upload-list"><li><a class="cancel-link" href="#">Cancel UPLOADS</a><img height="16" width="16" alt="" src="/images/img.gif"><span>' +
						getShortName(file.name) + '</span></li></ul>');
					uploadList.getElement('.cancel-link').addEvent('click', function() {
						uploadFileId.value = '';
						uploadFileId.set('validate', true);
						file.remove();
						uploadList.getChildren().destroy();
						swf.setEnabled(true);
						return false;
					});
				}
			},
			onFileProgress: function(file)
			{
				var form = this.target.getParent('form');
				var uploadList = form.getElement('.upload-list-container');
				if(uploadList)
				{
					var span = uploadList.getElement('span');
					if(span)
					{
						span.set('text', getShortName(file.name) + ' - ' + file.progress.percentLoaded + '%');
					}
				}
			},
			onFileComplete: function(file) {
				var form = this.target.getParent('form');
				var uploadList = form.getElement('.upload-list-container');
				if(uploadList)
				{
					var img = uploadList.getElement('img');
					if(img)
					{
						img.set('src', '/images/img3.gif');
					}
					var span = uploadList.getElement('span');
					if(span)
					{
						span.set('text', getShortName(file.name));
						span.set('title', file.name);
					}
				}
				var uploadFileId = form.getElement('[name=upload_file_id]');
				uploadFileId.value = file.response.text;
				uploadFileId.set('validate', true);
				file.remove();
				this.setEnabled(true);
				if(form.get('submitAfterUpload') == 'true')
				{
					form.fireEvent('submit', true);
				}
			},
			onSelectFail: function(files) {
				alert(files[0].name + ' was not added! Please select file smaller than 64 Mb.');
			}/*,
			onFileError: function(file) {
				console.log('onFileError', file);
			},
			onComplete: function(files) {
				//console.log('onComplete', files);
				//link.set('html', linkIdle);
			},
			onFileSuccess: function(file) {
				console.log('onFileSuccess', file);
				new Element('input', {type: 'checkbox', 'checked': true}).inject(file.ui.element, 'top');
				file.ui.element.highlight('#e6efc2');
			},
			onFileRequeue: function(file) {
				console.log('onFileRequeue', file);
				file.ui.element.getElement('.file-error').destroy();
				file.ui.cancel.set('html', 'Cancel').removeEvents().addEvent('click', function() {
					file.remove();
					return false;
				});
				this.start();
			}
			*/
		});
	});

    function setUploadFileShortName()
    {
        var form = $('order-form');
        if(!form) return;
        var uploadList = form.getElement('.upload-list-container');
        if(uploadList)
        {
            var span = uploadList.getElement('span');
            if(span)
            {
                span.set('text', getShortName(span.get('text')));
            }
        }
    }

    setUploadFileShortName();
}

function setGmtOffset()
{
	function getGmtOffset()
	{
		var d = new Date();
		var winter = new Date(d.getFullYear(), 0, 1);
		var summer = new Date(d.getFullYear(), 6, 1);
		var winterOffset = -winter.getTimezoneOffset();
		var summerOffset = -summer.getTimezoneOffset();
		return (winterOffset < summerOffset)? winterOffset: summerOffset;
	}
	$$('input[name=gmt_offset]').set('value', getGmtOffset());
}

// custom form elements styling
function initCustomForms() {
	var cfManager = new jcf.customForms();
	cfManager.replace();
}

// clear inputs on focus
function initInputs() {
	clearFormFields({
		clearInputs: false,
		clearTextareas: false,
		passwordFieldText: false,
		addClassFocus: "focus",
		filterClass: "default"
	});
}

// order page class
orderPageCalculator = new Class({
	Implements: [Options, Events],
	options: {
		priceWP: 0,
		basePriceProfessional: 0,
		basePriceExpert: 0,
		totalPrice: 0,
		selectedPages: 1,
		pricePackage: 0,
        bulkOrderPages: 11,
        bulkOrderPrice: 'Custom',
		holidays: '',
		scheduleHour: {},
		optDelivery: {},
		months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
		hiddenClass: 'hidden', // hidden class
		activeClass: 'active', // options list expanded class
		markClass: 'mark', // selected option parent class
		objTotalPrice: $('total-price'), // total price dom-object
		objCheckboxes: $$('ul.options-list input[type=checkbox]'), // project options checkboxes
		objCheckboxesMarkup: $$('#group-markup input[type=checkbox]'), // project options checkboxes
		objCheckboxesWordpress: $$('#group-wordpress input[type=checkbox]'), // project options checkboxes
		objRadios: $$('.proposal input[type=radio]'), // project type radios
		objEtaMarkup: $('eta-markup'),
		objEtaWordpress: $('eta-wordpress'),
		objForm: $('order-form'),
		objPages: $('pages')
	},
	initialize: function(options){
		this.setOptions(options);
		this.initTooltips();
		this.initSlider();
		//this.initUpload();
		//this.initSubmit();
		this.initProjectOptions();
		this.allReady = true;
		this.recalculate();
	},
	recalculate: function() {
		if(!this.allReady) {
			return;
		}

		// calculate price
		//this.priceMarkup = this.pricePackage;
		this.markupOptionsPrice = 0;
		this.options.objCheckboxesMarkup.each(function(obj){
			if(obj.checked) {
			    //this.priceMarkup += obj.price;
			    this.markupOptionsPrice += obj.price;
			}
		}.bind(this));

		var hoursWordpress = 0;
		//this.priceWordpress = 0; //this.options.priceWP;
		this.wordpressOptionsPrice = 0;
		this.options.objCheckboxesWordpress.each(function(obj){
			if(obj.checked) {
				//this.priceWordpress += obj.price;
				this.wordpressOptionsPrice += obj.price;
				// opt delivery
				var optDelivery = this.options.optDelivery;
				var id = obj.get('id');
				var val = obj.value;
				if(optDelivery[id])
				{
					if(optDelivery[id][val])
					{
						hoursWordpress += optDelivery[id][val];
					}
				}
			}
		}.bind(this));
		var _totalExists = false;
        var _bulkOrder = false;
        var _totalPrice = 0;
		if(this.selectedPages > 1)
		{
		    _totalExists = true;
            if(this.selectedPages >= this.options.bulkOrderPages)
            {
                _bulkOrder = true;
                _totalPrice = this.options.bulkOrderPrice;

            }
            else
            {
    			_totalPrice = Math.ceil(this.options.priceWP + (this.basePackagePrice / 2) * (this.selectedPages + 1) + this.wordpressOptionsPrice + (this.selectedPages + 1) * (this.markupOptionsPrice / 2));
            }
		}
		// calculate ETA
        if(_bulkOrder)
        {
            var htmlMarkup = '';
            var htmlWordpress = '';
        }
        else
        {
        	var daysMarkup = Math.ceil(0.75 * this.selectedPages + 0.25 + (this.selectedPages == 1?1:0));
            var daysWordpress = daysMarkup + Math.ceil(0.2 * this.selectedPages + 1.375 + hoursWordpress / 8);
            var etaMarkup = this.getWorkingDate(daysMarkup);
            var etaWordpress = this.getWorkingDate(daysWordpress);
            var htmlMarkup = 'Markup ETA ' + this.options.months[etaMarkup.getMonth()] + ' - ' + etaMarkup.getDate() + ' <sup>' + this.getTh(etaMarkup) + '</sup>';
            var htmlWordpress = 'Wordpress ETA ' + this.options.months[etaWordpress.getMonth()] + ' - ' + etaWordpress.getDate() + ' <sup>' + this.getTh(etaWordpress) + '</sup>';
        }
		this.options.objEtaMarkup.set('html', htmlMarkup);
		this.options.objEtaWordpress.set('html', htmlWordpress);

		// total
		if(!_totalExists)
		{
		    this.totalPrice =  this.markupOptionsPrice + this.wordpressOptionsPrice + this.pricePackage;
		}
		else
		{
		    this.totalPrice = _totalPrice;
		}
        if(_bulkOrder)
        {
            this.options.objTotalPrice.set('html', this.totalPrice);
        }
        else
        {
    		this.options.objTotalPrice.set('html', '$' + this.totalPrice);
        }
	},
	getTh: function(deliveryDate)
	{
		var date = deliveryDate.getDate();
		var th = 'TH';
		switch(date) {
			case 1:
			case 21:
			case 31:
				th = 'ST';
				break;
			case 2:
			case 22:
				th = 'ND';
				break;
			case 3:
				th = 'RD';
				break;
			default:
				th = 'TH';
		}
		return th;
	},
	getWorkingDate: function(afterDays)
	{
		var now = new Date();
		var resultDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + (now.getSeconds()? 1: 0), 0, 0);
		var dateHour = resultDate.getUTCHours();
		var isHoliday = this.isHoliday(resultDate);
		var scheduleHourStart = this.options.scheduleHour.startTime ? this.options.scheduleHour.startTime : 0;
		var scheduleHourEnd = this.options.scheduleHour.endTime ? this.options.scheduleHour.endTime : 24;
		if(dateHour <= scheduleHourStart || dateHour > scheduleHourEnd || isHoliday) {
			if(dateHour <= scheduleHourStart && !isHoliday && afterDays) {
				afterDays--;
			}
			resultDate.setUTCHours(scheduleHourEnd);
		}
		var i = 0;
		while(i < afterDays) {
			resultDate.setDate(resultDate.getDate() + 1);
			if(this.isHoliday(resultDate)) {
				afterDays++;
			}
			i++;
		}
		return resultDate;
	},
	isHoliday: function(value)
	{
		var dayOfWeek = value.getUTCDay();
		var dayMonth = value.getUTCDate() + '-' + (value.getUTCMonth() + 1);
		var date = dayMonth + '-' + value.getUTCFullYear();
		var holidays = this.options.holidays.split(';');
		for(var i = 0; i < holidays.length; i++) {
			var length = holidays[i].split('-').length;
			switch(length) {
				case 1:
					var result = dayOfWeek == holidays[i];
					break;
				case 2:
					var result = dayMonth == holidays[i];
					break;
				case 3:
					var result = date == holidays[i];
					break;
				default:
					var result = false;
			}
			if(result) {
				return true;
			}
		}
		return false;
	},
	initProjectOptions: function() {
		// project type
		if(this.options.objRadios) {
			this.options.objRadios.each(function(radio){
				radio.addEvent('click',function(e){
					var fullPackageName = e.target.getNext('.txt').getElement('.area label').get('text');
					var shortPackageName = fullPackageName.substr(0, fullPackageName.indexOf(' '));

					if(shortPackageName == 'Professional')
					{
					    this.basePackagePrice = parseInt(this.options.basePriceProfessional, 10);
					}
					else if(shortPackageName == 'Expert')
					{
					    this.basePackagePrice = parseInt(this.options.basePriceExpert, 10);
					}
					this.pricePackage = parseInt(e.target.getNext('.txt').getElement('.price').get('text').substr(1), 10);
					this.recalculate();
				}.bind(this));
				if(radio.checked) {
					var fullPackageName = radio.getNext('.txt').getElement('.area label').get('text');
					var shortPackageName = fullPackageName.substr(0, fullPackageName.indexOf(' '));
					if(shortPackageName == 'Professional')
					{
					    this.basePackagePrice = parseInt(this.options.basePriceProfessional, 10);
					}
					else if(shortPackageName == 'Expert')
					{
					    this.basePackagePrice = parseInt(this.options.basePriceExpert, 10);
					}
					this.pricePackage = parseInt(radio.getNext('.txt').getElement('.price').get('text').substr(1), 10);
				}
			}.bind(this));
		}

		// checkbox event handlers
		if(this.options.objCheckboxes) {
			this.options.objCheckboxes.each(function(checkbox){
				var chkParent = checkbox.getParent();
				checkbox.price = parseInt(checkbox.getNext('.price').get('text').substr(2),10);
				checkbox.addEvent('click',function(){
					if(checkbox.get('checked')) {
						chkParent.addClass(this.options.markClass);
					}
					else {
						chkParent.removeClass(this.options.markClass);
					}
					this.recalculate();
				}.bind(this));
			}.bind(this));
		}

		// open-close blocks
		$$('ul.add-options > li').each(function(holder){
			var opener = holder.getElement('h3 a');
			var slider = holder.getElement('ul.options-list');
			opener.addEvent('click', function(){
				if(holder.hasClass(this.options.activeClass)) {
					holder.removeClass(this.options.activeClass);
					slider.setStyles({'display':'none'});
				} else {
					holder.addClass(this.options.activeClass);
					slider.setStyles({'display':'block'});
				}
				return false;
			}.bind(this));
			if(holder.hasClass(this.options.activeClass)) slider.setStyles({'display':'block'});
			else slider.setStyles({'display':'none'});
		}.bind(this));
	},
	initTooltips: function() {
		$$('ul.options-list li').each(function(holder){
			var popup = holder.getElement('.popup');
			var opener = holder.getElement('label');
			if(popup) {
				popup.removeClass(this.options.hiddenClass);//.setStyles({display: 'block'});
				popup.setStyles({top: -(popup.getSize().y) + 'px'});
				popup.addClass(this.options.hiddenClass);
				opener.addEvents({
					mouseover: function(){
						popup.removeClass(this.options.hiddenClass);
					}.bind(this),
					mouseout: function(){
						popup.addClass(this.options.hiddenClass);
					}.bind(this)
				});
			}
		}.bind(this));
	},
	initSlider: function() {
		$$('.switcher').each(function(holder){
			var slider = holder.getElement('.knob-holder'),
				counter = holder.getElement('span'),
				btnDec = holder.getElement('a.minus'),
				btnInc = holder.getElement('a.plus'),
				defaultPageInput = this.options.objPages,
                bulkOrderPages = this.options.bulkOrderPages,
				inst = this;

			this.sliderClass = new Slider(slider, slider.getElement('a'), {
				//snap: true,
				range : [1, 11],
				steps : 10,
				wheel : true,
				initialStep : defaultPageInput ? parseInt(defaultPageInput.value) : 1,
				onChange : function() {
                    if(this.step >= bulkOrderPages)
                    {
                        counter.set('text', '10+ Pages');
                    }
                    else
                    {
    					counter.set('text', this.step + (this.step == 1 ? ' Page' : ' Pages'));
                    }
					inst.options.objPages.value = inst.selectedPages = this.step;
					inst.recalculate();
				}
			});
			slider.getElement('a').addEvent('click', function(){
				return false;
			}.bind(this));
			btnDec.addEvent('click', function(){
				this.sliderClass.set(this.sliderClass.step - 1);
				return false;
			}.bind(this));
			btnInc.addEvent('click', function(){
				this.sliderClass.set(this.sliderClass.step + 1);
				return false;
			}.bind(this));
		}.bind(this));
	}
});

// order page init
function initOrderPage() {
	if($('total-price')) {
		window.orderPage = new orderPageCalculator();
	}
}

// lightbox modal function
function initPopups() {
	var _zIndex = 1000;
	var _faderOpacity = 0.50;
	var _faderBackground = '#000';
	var _faderId = 'lightbox-overlay';
	var _closeLink = 'span.close a';
	var _fader;
	var _lightbox = null;
	var _openers = $$('a.open-popup');
	var _page = $('main');
	var _pageHeightForFader = $('wrapper');
	var _minWidth = _page.getSize().x;

	// init popup fader
	var _body = $$('body')[0];
	_fader = document.createElement("DIV");
	_fader.id = _faderId;
	_body.grab(_fader);
	_fader = $(_faderId);
	_fader.setStyles({
		'backgroundColor' : _faderBackground,
		'position' : 'absolute',
		'overflow' : 'hidden',
		'display' : 'none',
		'top' : 0,
		'left' : 0,
		'zIndex' : _zIndex
	});
	_fader.setOpacity(_faderOpacity);

	// IE6 iframe fix
//	if (document.uniqueID && document.compatMode && !window.XMLHttpRequest) {
//		var _frame = document.createElement('IFRAME');
//		_frame.src = 'javascript:false';
//		_frame.frameborder = '0';
//		_frame.scrolling = 'no';
//		_frame.width = '100%';
//		_frame.height = '100%';
//		// _frame.style.filter = "alpha(opacity=0)";
//		_frame.style.zIndex = -1;
//		_fader.grab(_frame);
//	}

	// window height/width
	function getClientWidth() {
		return document.compatMode == 'CSS1Compat' && !window.opera ? document.documentElement.clientWidth
				: document.body.clientWidth;
	}
	function getClientHeight() {
		return document.compatMode == 'CSS1Compat' && !window.opera ? document.documentElement.clientHeight
				: document.body.clientHeight;
	}

	// lightbox positioning function
	function positionLightbox() {
		if (_lightbox) {
			var _windowHeight = getClientHeight();
			var _windowWidth = getClientWidth();
			var _lightboxWidth = _lightbox.getSize().x;
			var _lightboxHeight = _lightbox.getSize().y;
			//var _pageHeight = _page.getSize().y;
			var _pageHeight = _pageHeightForFader.getSize().y;

			if (_windowWidth < _minWidth)
				_fader.setStyle('width', _minWidth);
			else
				_fader.setStyle('width', '100%');
			if (_windowHeight < _pageHeight)
				_fader.setStyle('height', _pageHeight);
			else
				_fader.setStyle('height', _windowHeight);

			_lightbox.setStyles({
				'position' : 'absolute',
				'zIndex' : (_zIndex + 1)
			});

			// vertical position
			if (_windowHeight > _lightboxHeight) {
				if (document.uniqueID && document.compatMode
						&& !window.XMLHttpRequest) {
					_lightbox.setStyles({
						'position' : 'absolute',
						'top' : document.documentElement.scrollTop
								+ (_windowHeight - _lightboxHeight) / 2
					});
				} else {
					_lightbox.setStyles({
						'position' : 'fixed',
						'top' : (_windowHeight - _lightboxHeight) / 2
					});
				}
			} else {
				_lightbox.setStyles({
					'position' : 'absolute',
					'top' : 0
				});
				if (_fader.getSize().y < _lightboxHeight) {
				    _fader.setStyle('height', _lightboxHeight);
				}

			}

			// horizontal position
			if (_fader.getSize().x > _lightbox.getSize().x)
				_lightbox.setStyles({
					'left' : (_fader.getSize().x - _lightbox.getSize().x) / 2
				});
			else
				_lightbox.setStyles({
					'left' : 0
				});
		}
	}

	// show/hide lightbox
	function toggleState(_state) {
		if (_lightbox) {
//            var element = _lightbox.getProperty('id');
			if (_state) {
				_fader.setStyles({
					'display' : 'block',
					'opacity' : _faderOpacity
				});
				_lightbox.setStyles({'display' : 'block'});
//                if(element == 'profile')
//                {
//                    $(document.body).setStyle('overflow', 'hidden');
//                }
				positionLightbox();
			} else {
				_fader.setStyles({'display' : 'none'});
				_lightbox.setStyles({'display' : 'none'});
                //$(document.body).setStyle('overflow', 'visible');
			}
			removeErrorMessages(_lightbox);
		}
	}

	// popup actions
	function initPopupActions(_obj) {
		if (!_obj.jsInit) {
			_obj.jsInit = true;
			// close link
			_obj.getElement(_closeLink).addEvent('click', function() {
				_lightbox = _obj;
				toggleState(false);
				return false;
			});
		}
	}
	function removeErrorMessages(_obj) {
	    //remove error above inputs
	    var row = _obj.getElements('.row, .area');
	    row.each(function(_elem){
		var strong = _elem.getElement('strong');
		if(strong)
		{
			strong.addClass('hidden');
		}
		_elem.removeClass('error');
	    });
	}
	// lightbox openers
	_openers.each(function(_el, i) {
		var _opener = _el;
		var _target = _opener.href.substring(_opener.href.indexOf('#') + 1);
		var _popup = $(_target);
		if (_popup) {
			// init actions for popup
			initPopupActions(_popup);

			// open popup
			_opener.addEvent('click', function() {
				if(_lightbox != _popup) {
					if(_lightbox) {
						_lightbox.setStyle('display', 'none');
					}
					_lightbox = _popup.setStyle('display', 'none');
					toggleState(true);
				} else {
					_lightbox = _popup.setStyle('display', 'none');
					toggleState(true);
				}
				return false;
			});

			if(_opener.getAttribute('href',2) == window.location.hash) {
				_opener.fireEvent('click');
			}
		}
	});

	// event handlers
	window.addEvent('resize', positionLightbox);
    window.addEvent('scroll', positionLightbox);
	document.addEvent('keydown', function(e) {
		if (e.key == 'esc') {
			toggleState(false);
		}
	});
	_fader.addEvent('click', function() {
		toggleState(false);
		return false;
	});
}

// clear field module
function clearFormFields(o){
	if (o.clearInputs == null) o.clearInputs = true;
	if (o.clearTextareas == null) o.clearTextareas = true;
	if (o.passwordFieldText == null) o.passwordFieldText = false;
	if (o.addClassFocus == null) o.addClassFocus = false;
	if (!o.filter) o.filter = "default";
	if(o.clearInputs) {
		var inputs = document.getElementsByTagName("input");
		for (var i = 0; i < inputs.length; i++ ) {
			if((inputs[i].type == "text" || inputs[i].type == "password") && inputs[i].className.indexOf(o.filterClass)) {
				inputs[i].valueHtml = inputs[i].value;
				inputs[i].onfocus = function ()	{
					if(this.valueHtml == this.value) this.value = "";
					if(this.fake) {
						inputsSwap(this, this.previousSibling);
						this.previousSibling.focus();
					}
					if(o.addClassFocus && !this.fake) {
						this.className += " " + o.addClassFocus;
						this.parentNode.className += " parent-" + o.addClassFocus;
					}
				};
				inputs[i].onblur = function () {
					if(this.value == "") {
						this.value = this.valueHtml;
						if(o.passwordFieldText && this.type == "password") inputsSwap(this, this.nextSibling);
					}
					if(o.addClassFocus) {
						this.className = this.className.replace(o.addClassFocus, "");
						this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
					}
				};
				if(o.passwordFieldText && inputs[i].type == "password") {
					var fakeInput = document.createElement("input");
					fakeInput.type = "text";
					fakeInput.value = inputs[i].value;
					fakeInput.className = inputs[i].className;
					fakeInput.fake = true;
					inputs[i].parentNode.insertBefore(fakeInput, inputs[i].nextSibling);
					inputsSwap(inputs[i], null);
				}
			}
		}
	}
	if(o.clearTextareas) {
		var textareas = document.getElementsByTagName("textarea");
		for(var i=0; i<textareas.length; i++) {
			if(textareas[i].className.indexOf(o.filterClass)) {
				textareas[i].valueHtml = textareas[i].value;
				textareas[i].onfocus = function() {
					if(this.value == this.valueHtml) this.value = "";
					if(o.addClassFocus) {
						this.className += " " + o.addClassFocus;
						this.parentNode.className += " parent-" + o.addClassFocus;
					}
				};
				textareas[i].onblur = function() {
					if(this.value == "") this.value = this.valueHtml;
					if(o.addClassFocus) {
						this.className = this.className.replace(o.addClassFocus, "");
						this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
					}
				};
			}
		}
	}
	function inputsSwap(el, el2) {
		if(el) el.style.display = "none";
		if(el2) el2.style.display = "inline";
	}
}

// JavaScript Custom Forms
jcf = {};
jcf.modules = {};
jcf.baseOptions = {
	hiddenClass:'outtaHere',
	replaceAll:true
};

// advanced replacer class
jcf.customForms = function(opt) {
	this.options = jcf.baseOptions;
	jcf.lib.extend(this.options, opt);
};
jcf.customForms.prototype.replace = function(obj, opt) {
	for(var k in jcf.modules) {
		var els = jcf.lib.queryBySelector(jcf.modules[k].prototype.selector);
		for(var i = 0; i<els.length; i++) {
			new jcf.modules[k]({
				replaces:els[i]
			});
		}
	}
};
jcf.setBaseModule = function(obj) {
	jcf.customControl = function(opt){
		this.options = {
			labelActiveClass: 'jcf-label-active',
			focusClass:'jcf-focus',
			foo:'bar'
		};
		jcf.lib.extend(this.options, opt);
		this.init();
	};
	for(var p in obj) {
		jcf.customControl.prototype[p] = obj[p];
	}
};
jcf.addModule = function(obj) {
	if(obj.name){
		// create new module proto class
		jcf.modules[obj.name] = function(){
			jcf.modules[obj.name].superclass.constructor.apply(this, arguments);
		};
		jcf.lib.inherit(jcf.modules[obj.name], jcf.customControl);
		for(var p in obj) {
			jcf.modules[obj.name].prototype[p] = obj[p];
		}

		// on create module
		jcf.modules[obj.name].prototype.onCreateModule();

		// make callback for exciting modules
		for(var mod in jcf.modules) {
			if(jcf.modules[mod] != jcf.modules[obj.name]) {
				jcf.modules[mod].prototype.onModuleAdded(jcf.modules[obj.name]);
			}
		}
	}
};

// custom control base class
jcf.setBaseModule({
	init: function(){
		this.initOptions();
		this.realElement = this.options.replaces;
		if(this.realElement) {
			this.replaceObject();
		}
	},
	initOptions: function(){

	},
	createWrapper: function(){
		this.fakeElement = document.createElement('div');
		this.fakeElement.jcf = this;
		this.realElement.jcf = this;
		this.labelFor = jcf.lib.getLabelFor(this.realElement);
		jcf.lib.disableTextSelection(this.fakeElement);
		jcf.lib.addClass(this.realElement, jcf.baseOptions.hiddenClass);
	},
	initEvents: function(){
		jcf.lib.event.add(this.realElement, 'click', this.onClick);
		jcf.lib.event.add(this.realElement, 'focus', this.onFocus);
		jcf.lib.event.add(this.realElement, 'blur', this.onBlur);

		jcf.lib.event.add(this.fakeElement, 'click', this.onFakeClick);
		jcf.lib.event.add(this.fakeElement, 'mousedown', this.onFakeMouseDown);
		jcf.lib.event.add(this.fakeElement, 'mouseup', this.onFakeMouseUp);

		if(this.labelFor) {
			this.labelFor.jcf = this;
			jcf.lib.event.add(this.labelFor, 'click', this.onFakeClick);
			jcf.lib.event.add(this.labelFor, 'mousedown', this.onFakeMouseDown);
			jcf.lib.event.add(this.labelFor, 'mouseup', this.onFakeMouseUp);
		}
	},
	setupWrapper: function(){
		// implement in subclass
	},
	refreshState: function(){
		// implement in subclass
	},
	replaceObject: function(){
		this.createWrapper();
		this.initEvents();
		this.setupWrapper();
	},
	onClick: function(){
		this.jcf.refreshState();
	},
	onFocus: function(){
		clearTimeout(this.jcf.focusTimer);
		this.jcf.fakeElement.mouseDownFlag = false;
		if(!this.jcf.realElement.disabled) {
			jcf.lib.addClass(this.jcf.fakeElement,this.jcf.options.focusClass);
		}
	},
	onBlur: function(){
		var _this = this;
		this.jcf.focusTimer = setTimeout(function(){
			if(!_this.jcf.fakeElement.mouseDownFlag) {
				jcf.lib.removeClass(_this.jcf.fakeElement,_this.jcf.options.focusClass);
			}
		},10);
	},
	onFakeClick: function(){
		this.jcf.realElement.focus();
	},
	onFakeMouseDown: function(){
		this.jcf.fakeElement.mouseDownFlag = true;
		return false;
	},
	onFakeMouseUp: function(){
		this.jcf.fakeElement.mouseDownFlag = false;
	},
	onCreateModule: function(){
		// implement in subclass
	},
	onModuleAdded: function(module) {
		// implement in subclass
	},
	onControlReady: function() {
		// implement in subclass
	}
});










// custom forms util library
jcf.lib = {
	bind: function(func, scope){
		var _function = func;
		return function() {
			return _function.apply(scope, arguments);
		};
	},
	browser: (function() {
		var rwebkit = /(webkit)[ \/]([\w.]+)/,
		ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
		rmsie = /(msie) ([\w.]+)/,
		rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/;
		var ua = navigator.userAgent.toLowerCase();
		var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || [];
		var res = {};
		res[match[1]] = true;
		res.version = match[2] || "0";
		return res;
	})(),
	getOffset: function(element) {
        var pos = $(element).getPosition();
        return {top:pos.y,left:pos.x};
        /*
		var el = element;
		var valueT = 0, valueL = 0;
		if (element.offsetParent) {
			do {
				// hello reflow
				valueT += element.offsetTop  || 0;
				valueL += element.offsetLeft || 0;
				if(element != document.body && element != document.body.parentNode) {
					valueT -= element.scrollTop  || 0;
					valueL -= element.scrollLeft  || 0;
				}
				valueT += parseInt(jcf.lib.getStyle(element,'borderTopWidth')) || 0;
				valueL += parseInt(jcf.lib.getStyle(element,'borderLeftWidth')) || 0;
				element = element.offsetParent;
			} while (element);
		}
		return {top:valueT, left:valueL};*/
	},
	getStyle: function(el, prop) {
		if (document.defaultView && document.defaultView.getComputedStyle) {
			return document.defaultView.getComputedStyle(el, null)[prop];
		} else if (el.currentStyle) {
			return el.currentStyle[prop];
		} else {
			return el.style[prop];
		}
	},
	getParent: function(obj, selector) {
		while(obj.parentNode && obj.parentNode != document.body) {
			if(obj.parentNode.tagName.toLowerCase() == selector.toLowerCase()) {
				return obj.parentNode;
			}
			obj = obj.parentNode;
		}
		return false;
	},
	isParent: function(child, parent) {
		while(child.parentNode) {
			if(child.parentNode === parent) {
				return true;
			}
			child = child.parentNode;
		}
		return false;
	},
	getLabelFor: function(object) {
		if(jcf.lib.getParent(object,'label')) {
			return object.parentNode;
		} else if(object.id && object.id.length) {
			return jcf.lib.queryBySelector('label[for=' + object.id + ']')[0];
		}
	},
	disableSelection: function() {
		document.onselectstart = function(){return false;};
	},
	enableSelection: function() {
		document.onselectstart = null;
	},
	disableTextSelection: function(el){
		if(el.setProperty) {
			el.setProperty("unselectable","on");
		}
		el.style.MozUserSelect = 'none';
		el.style.KhtmlUserSelect = 'none';
	},
	queryBySelector: function(selector, scope){
		return document.querySelectorAll ? (scope || document).querySelectorAll(selector) : jcf.lib.getElementsBySelector(selector, scope);
	},
	prevSibling: function(node) {
		while(node = node.previousSibling) if(node.nodeType == 1) break;
		return node;
	},
	nextSibling: function(node) {
		while(node = node.nextSibling) if(node.nodeType == 1) break;
		return node;
	},
	fireEvent: function(element,event) {
		if (document.createEventObject){
			var evt = document.createEventObject();
			return element.fireEvent('on'+event,evt);
		}
		else{
			var evt = document.createEvent('HTMLEvents');
			evt.initEvent(event, true, true );
			return !element.dispatchEvent(evt);
		}
	},
	isParent: function(p, c) {
		while(c.parentNode) {
			if(p == c) {
				return true;
			}
			c = c.parentNode;
		}
		return false;
	},
	inherit: function(Child, Parent) {
		var F = function() { };
		F.prototype = Parent.prototype;
		Child.prototype = new F();
		Child.prototype.constructor = Child;
		Child.superclass = Parent.prototype;
	},
	extend: function(obj1,obj2) {
		for(var prop in obj2) {
			obj1[prop] = obj2[prop];
		}
	},
	hasClass: function (obj,cname) {
		return (obj.className ? obj.className.match(new RegExp('(\\s|^)'+cname+'(\\s|$)')) : false);
	},
	addClass: function (obj,cname) {
		if (!this.hasClass(obj,cname)) obj.className += " "+cname;
	},
	removeClass: function (obj,cname) {
		if (this.hasClass(obj,cname)) obj.className=obj.className.replace(new RegExp('(\\s|^)'+cname+'(\\s|$)'),' ');
	},
	getAllClasses: function(cname, prefix, skip) {
		if(!skip) skip = '';
		if(!prefix) prefix = '';
		return cname ? cname.replace(new RegExp('(\\s|^)'+skip+'(\\s|$)'),' ').replace(/[\s]*([\S]+)+[\s]*/gi,prefix+"$1 ") : '';
	},
	getElementsBySelector: function(selector, scope) {
		// Attempt to fail gracefully in lesser browsers
		if (!document.getElementsByTagName) {
			return new Array();
		}
		// Split selector in to tokens
		var tokens = selector.split(' ');
		var currentContext = new Array(scope || document.body);
		for (var i = 0; i < tokens.length; i++) {
			token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
			if (token.indexOf('#') > -1) {
				// Token is an ID selector
				var bits = token.split('#');
				var tagName = bits[0];
				var id = bits[1];
				var element = document.getElementById(id);
				if (tagName && element.nodeName.toLowerCase() != tagName) {
					// tag with that ID not found, return false
					return new Array();
				}
				// Set currentContext to contain just this element
				currentContext = new Array(element);
				continue; // Skip to next token
			}
			if (token.indexOf('.') > -1) {
				// Token contains a class selector
				var bits = token.split('.');
				var tagName = bits[0];
				var className = bits[1];
				if (!tagName) {
					tagName = '*';
				}
				// Get elements matching tag, filter them for class selector
				var found = new Array;
				var foundCount = 0;
				for (var h = 0; h < currentContext.length; h++) {
					var elements;
					if (tagName == '*') {
						elements = currentContext[h].getElementsByTagName('*');
					} else {
						elements = currentContext[h].getElementsByTagName(tagName);
					}
					for (var j = 0; j < elements.length; j++) {
						found[foundCount++] = elements[j];
					}
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				for (var k = 0; k < found.length; k++) {
					if (found[k].className && found[k].className.match(new RegExp('(\\s|^)'+className+'(\\s|$)'))) {
						currentContext[currentContextIndex++] = found[k];
					}
				}
				continue; // Skip to next token
			}
			// Code to deal with attribute selectors
			if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
				var tagName = RegExp.$1;
				var attrName = RegExp.$2;
				var attrOperator = RegExp.$3;
				var attrValue = RegExp.$4;
				if (!tagName) {
					tagName = '*';
				}
				// Grab all of the tagName elements within current context
				var found = new Array;
				var foundCount = 0;
				for (var h = 0; h < currentContext.length; h++) {
					var elements;
					if (tagName == '*') {
						elements = currentContext[h].getElementsByTagName('*');
					} else {
						elements = currentContext[h].getElementsByTagName(tagName);
					}
					for (var j = 0; j < elements.length; j++) {
						found[foundCount++] = elements[j];
					}
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				var checkFunction; // This function will be used to filter the elements
				if(attrName.toLowerCase() == 'for' && jcf.lib.browser.msie && jcf.lib.browser.version < 8) {
					attrName = 'htmlFor';
				}
				switch (attrOperator) {
					case '=': // Equality
						checkFunction = function(e) {return (e.getAttribute(attrName) == attrValue);};
						break;
					case '~': // Match one of space seperated words
						checkFunction = function(e) {return (e.getAttribute(attrName).match(new RegExp('(\\s|^)'+attrValue+'(\\s|$)')));};
						break;
					case '|': // Match start with value followed by optional hyphen
						checkFunction = function(e) {return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?')));};
						break;
					case '^': // Match starts with value
						checkFunction = function(e) {return (e.getAttribute(attrName).indexOf(attrValue) == 0);};
						break;
					case '$': // Match ends with value
						checkFunction = function(e) {return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length);};
						break;
					case '*': // Match ends with value
						checkFunction = function(e) {return (e.getAttribute(attrName).indexOf(attrValue) > -1);};
						break;
					default :
						// Just test for existence of attribute
						checkFunction = function(e) {return e.getAttribute(attrName);};
				}
				currentContext = new Array;
				var currentContextIndex = 0;
				for (var k = 0; k < found.length; k++) {
					if (checkFunction(found[k])) {
						currentContext[currentContextIndex++] = found[k];
					}
				}
				continue; // Skip to next token
			}
			// If we get here, token is JUST an element (not a class or ID selector)
			tagName = token;
			var found = new Array;
			var foundCount = 0;
			for (var h = 0; h < currentContext.length; h++) {
				var elements = currentContext[h].getElementsByTagName(tagName);
				for (var j = 0; j < elements.length; j++) {
					found[foundCount++] = elements[j];
				}
			}
			currentContext = found;
		}
		return currentContext;
	},
	domReady: function (handler){
		var called = false;
		function ready() {
			if (called) return;
			called = true;
			handler();
		}
		if (document.addEventListener) {
			document.addEventListener( "DOMContentLoaded", ready, false );
		} else if (document.attachEvent) {
			if (document.documentElement.doScroll && window == window.top) {
				function tryScroll(){
					if (called) return
					if (!document.body) return
					try {
						document.documentElement.doScroll("left");
						ready();
					} catch(e) {
						setTimeout(tryScroll, 0);
					}
				}
				tryScroll();
			}
			document.attachEvent("onreadystatechange", function(){
				if ( document.readyState === "complete" ) {
					ready();
				}
			});
		}
		if (window.addEventListener) window.addEventListener('load', ready, false);
		else if (window.attachEvent) window.attachEvent('onload', ready);
	},
	event: (function(){
		var guid = 0;
		function fixEvent(event) {
			event = event || window.event;
			if ( event.isFixed ) {
				return event;
			}
			event.isFixed = true;
			event.preventDefault = event.preventDefault || function(){this.returnValue = false;};
			event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true;};
			if(!event.target) {
				event.target = event.srcElement;
			}
			if(!event.relatedTarget && event.fromElement) {
				event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
			}
			if(event.pageX == null && event.clientX != null ) {
				var html = document.documentElement, body = document.body;
				event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
				event.pageY = event.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
			}
			if(typeof event.layerX == 'undefined') {
				event.layerX = event.offsetX;
				event.layerY = event.offsetY;
			}
			if(!event.which && event.button ) {
				event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
			}
			return event;
		}

		function commonHandle(event) {
			event = fixEvent(event);
			if(!this.events) return;
			var handlers = this.events[event.type];
			for(var g in handlers ) {
				var handler = handlers[g];
				var ret = handler.call(this, event);
				if ( ret === false ) {
					event.preventDefault();
					event.stopPropagation();
				}
			}
		}

		return {
			add: function(elem, type, handler) {
				if (elem.setInterval && (elem != window && !elem.frameElement)) {
					elem = window;
				}
				if (!handler.guid) {
					handler.guid = ++guid;
				}
				if (!elem.events) {
					elem.events = {};
					elem.handle = function(event) {
						if (typeof jcf.lib.event !== "undefined") {
							return commonHandle.call(elem, event);
						}
					};
				}

				if (!elem.events[type]) {
					elem.events[type] = {};
					if (elem.addEventListener) {
						elem.addEventListener(type, elem.handle, true);
					} else {
						if (elem.attachEvent) elem.attachEvent('on' + type, elem.handle);
					}
				}
				elem.events[type][handler.guid] = handler;
			},

			remove: function(elem, type, handler) {
				var handlers = elem.events && elem.events[type];
				if (!handlers) return;
				delete handlers[handler.guid];
				for(var any in handlers) return;
				if (elem.removeEventListener) elem.removeEventListener(type, elem.handle, false);
				else if (elem.detachEvent) elem.detachEvent("on" + type, elem.handle);
				delete elem.events[type];

				for (var any in elem.events) return;
				try {
					delete elem.handle;
					delete elem.events;
				} catch(e) { // IE
					try {
						elem.removeAttribute("handle");
						elem.removeAttribute("events");
					} catch(e) {}
				}
			}
		};
	}())
};

// custom checkbox module
jcf.addModule({
	name:'checkbox',
	selector:'input[type=checkbox]',
	initOptions: function(){
		jcf.lib.extend(this.options,{
			wrapperClass:'checkboxArea',
			focusClass:'checkboxAreaFocus',
			checkedClass:'checkboxAreaChecked',
			labelActiveClass:'chk-label-active',
			uncheckedClass:'chk-unchecked',
			disabledClass:'chk-disabled',
			chkStructure:'<span></span>'
		});
	},
	setupWrapper: function(){
		jcf.lib.addClass(this.fakeElement, this.options.wrapperClass);
		this.fakeElement.innerHTML = this.options.chkStructure;
		this.realElement.parentNode.insertBefore(this.fakeElement, this.realElement);
		this.refreshState();
		this.addEvents();
	},
	addEvents: function(){
		jcf.lib.event.add(this.fakeElement, 'click', this.toggle);
		if(jcf.lib.browser.msie && jcf.lib.browser.version < 7 && this.labelFor && !this.labelFor.getAttribute('htmlFor')) {
			jcf.lib.event.add(this.labelFor, 'mousedown', this.onLabelMouseDown);
		}
	},
	onFakeMouseDown: function(e){
		jcf.modules[this.jcf.name].superclass.onFakeMouseDown.apply(this, arguments);

		// IE image inside label fix
		if(jcf.lib.browser.msie && e.target && e.target.tagName.toLowerCase() == 'img') {
			if(jcf.lib.browser.version < 7) {
				if(this.jcf.labelFor && this.jcf.labelFor.getAttribute('htmlFor')) {
					this.jcf.toggle.apply(this);
				}
			} else {
				this.jcf.toggle.apply(this);
			}
		}
		return false;
	},
	onLabelMouseDown: function(e){
		jcf.modules[this.jcf.name].superclass.onFakeMouseDown.apply(this, arguments);
		this.jcf.toggle.apply(this);
	},
	toggle: function(e){
		if(!this.jcf.realElement.disabled) {
			if(this.jcf.realElement.checked) {
				this.jcf.realElement.checked = false;
			} else {
				this.jcf.realElement.checked = true;
			}
		}
		if(jcf.lib.browser.opera) {
			this.jcf.realElement.checked = !this.jcf.realElement.checked;
		}
		this.jcf.realElement.fireEvent('click');
		this.jcf.realElement.fireEvent('change');
		this.jcf.refreshState();
		return false;
	},
	refreshState: function(){
		if(this.realElement.checked) {
			jcf.lib.addClass(this.fakeElement, this.options.checkedClass);
			jcf.lib.removeClass(this.fakeElement, this.options.uncheckedClass);
			if(this.labelFor) {
				jcf.lib.addClass(this.labelFor, this.options.labelActiveClass);
			}
		} else {
			jcf.lib.removeClass(this.fakeElement, this.options.checkedClass);
			jcf.lib.addClass(this.fakeElement, this.options.uncheckedClass);
			if(this.labelFor) {
				jcf.lib.removeClass(this.labelFor, this.options.labelActiveClass);
			}
		}
		if(this.realElement.disabled) {
			jcf.lib.addClass(this.fakeElement, this.options.disabledClass);
		} else {
			jcf.lib.removeClass(this.fakeElement, this.options.disabledClass);
		}
	}
});

// custom radio module
jcf.addModule({
	name:'radio',
	selector: 'input[type=radio]',
	initOptions: function(){
		jcf.lib.extend(this.options,{
			wrapperClass:'radioArea',
			focusClass:'radioAreaFocus',
			checkedClass:'radioAreaChecked',
			uncheckedClass:'rad-unchecked',
			disabledClass:'rad-disabled',
			radStructure:'<span></span>'
		});
	},
	getRadioGroup: function(item){
		var name = item.getAttribute('name');
		if(name) {
			return jcf.lib.queryBySelector('input[name='+name+']', jcf.lib.getParent('form'));
		} else {
			return [item];
		}
	},
	setupWrapper: function(){
		jcf.lib.addClass(this.fakeElement, this.options.wrapperClass);
		this.fakeElement.innerHTML = this.options.radStructure;
		this.realElement.parentNode.insertBefore(this.fakeElement, this.realElement);
		this.refreshState();
		this.addEvents();
	},
	addEvents: function(){
		jcf.lib.event.add(this.fakeElement, 'click', this.toggleRadioWithEvent);
		if(this.labelFor) {
			jcf.lib.event.add(this.labelFor, 'click', this.toggleRadio);
		}
	},
	toggleRadioWithEvent: function() {
		this.jcf.toggleRadio.call(this);
	},
	toggleRadio: function(){
		if(!this.jcf.realElement.disabled) {
			this.jcf.realElement.checked = true;
		}
		this.jcf.realElement.fireEvent('click',{target:this.jcf.realElement});
		this.jcf.realElement.fireEvent('change',{target:this.jcf.realElement});
		this.jcf.refreshState();
	},
	refreshState: function(){
		var els = this.getRadioGroup(this.realElement);
		for(var i = 0; i < els.length; i++) {
			var curEl = els[i].jcf;
			if(curEl) {
				if(curEl.realElement.checked) {
					jcf.lib.addClass(curEl.fakeElement, curEl.options.checkedClass);
					jcf.lib.removeClass(curEl.fakeElement, curEl.options.uncheckedClass);
					if(curEl.labelFor) {
						jcf.lib.addClass(curEl.labelFor, curEl.options.labelActiveClass);
					}
				} else {
					jcf.lib.removeClass(curEl.fakeElement, curEl.options.checkedClass);
					jcf.lib.addClass(curEl.fakeElement, curEl.options.uncheckedClass);
					if(curEl.labelFor) {
						jcf.lib.removeClass(curEl.labelFor, curEl.options.labelActiveClass);
					}
				}
				if(curEl.realElement.disabled) {
					jcf.lib.addClass(curEl.fakeElement, curEl.options.disabledClass);
				} else {
					jcf.lib.removeClass(curEl.fakeElement, curEl.options.disabledClass);
				}
			}
		}
	}
});

// custom select module
jcf.addModule({
	name:'select',
	selector:'select',
	initOptions: function(){
		jcf.lib.extend(this.options,{
			wrapperClass:'selectArea',
			focusClass:'selectAreaFocus',
			selectedClass:'item-selected',
			disabledClass:'selectAreaDisabled',
			valueSelector:'span.center',
			optGroupClass:'optgroup',
			openerSelector:'a.selectButton',
			selectStructure:'<span class="left"></span><span class="center"></span><a class="selectButton"></a>',
			selectPrefixClass:'select-',
			dropMaxHeight: 200,
			dropHiddenClass:'optionsDivInvisible',
			dropScrollableClass:'options-overflow',
			dropClass:'optionsDivVisible',
			dropClassPrefix:'drop-',
			dropStructure:'<div class="drop-holder"><div class="drop-list"></div></div>',
			dropSelector:'div.drop-list'
		});
	},
	setupWrapper: function(){
		jcf.lib.addClass(this.fakeElement, this.options.wrapperClass);
		this.realElement.parentNode.insertBefore(this.fakeElement, this.realElement);
		this.fakeElement.innerHTML = this.options.selectStructure;
		this.fakeElement.style.width = this.realElement.offsetWidth + 'px';
		jcf.lib.addClass(this.fakeElement, jcf.lib.getAllClasses(this.realElement.className, this.options.selectPrefixClass, jcf.baseOptions.hiddenClass));

		// create select body
		this.opener = jcf.lib.queryBySelector(this.options.openerSelector, this.fakeElement)[0];
		this.valueText = jcf.lib.queryBySelector(this.options.valueSelector, this.fakeElement)[0];
		this.opener.jcf = this;

		this.createDropdown();
		this.refreshState();
		this.addEvents();
		this.onControlReady(this);
	},
	addEvents: function(){
		jcf.lib.event.add(this.fakeElement, 'click', this.toggleDropdown);
		jcf.lib.event.add(this.realElement, 'change', this.onChange);
	},
	onFocus: function(){
		jcf.modules[this.jcf.name].superclass.onFocus.apply(this, arguments);
		jcf.lib.event.add(this.jcf.realElement, 'keydown', this.jcf.onKeyDown);
		if(jcf.activeControl && jcf.activeControl != this.jcf) {
			jcf.activeControl.hideDropdown();
		}
	},
	onBlur: function(){
		if(!this.jcf.isActiveDrop() || !this.jcf.isOverDrop()) {
			jcf.modules[this.jcf.name].superclass.onBlur.apply(this, arguments);
		}
		jcf.lib.event.remove(this.jcf.realElement, 'keydown', this.jcf.onKeyDown);
	},
	onChange: function() {
		this.jcf.refreshState();
	},
	onKeyDown: function(e){
		var context = this;
		setTimeout(function(){
			context.jcf.refreshState();
		},10);
		if(e.keyCode == 13) {
			context.jcf.toggleDropdown.apply(context);
			return false;
		}
	},
	onResizeWindow: function(e){
		if(jcf.activeControl) {
			jcf.activeControl.hideDropdown();
		}
	},
	onScrollWindow: function(e){
		if(jcf.activeControl) {
			jcf.activeControl.positionDropdown();
            //jcf.activeControl.hideDropdown();
		}
	},
	onOptionClick: function(e){
		var opener = e.target && e.target.tagName && e.target.tagName.toLowerCase() == 'li' ? e.target : jcf.lib.getParent(e.target, 'li');
		if(opener) {
			this.jcf.realElement.selectedIndex = parseInt(opener.getAttribute('rel'));
			this.jcf.realElement.focus();
			this.jcf.refreshState();
			this.jcf.hideDropdown();
			jcf.lib.fireEvent(this.jcf.realElement, 'change');
		}
		return false;
	},
	onClickOutside: function(e){
		if(jcf.activeControl && !jcf.lib.isParent(jcf.activeControl.selectDrop, e.target) && !jcf.lib.isParent(jcf.activeControl.fakeElement, e.target)) {
			jcf.activeControl.hideDropdown();
		}
	},
	onDropHover: function(e){
		if(jcf.activeControl) {
			jcf.activeControl.hoverFlag = true;
			var opener = e.target && e.target.tagName && e.target.tagName.toLowerCase() == 'li' ? e.target : jcf.lib.getParent(e.target, 'li');
			if(opener) {
				jcf.activeControl.realElement.selectedIndex = parseInt(opener.getAttribute('rel'));
				jcf.activeControl.refreshSelectedClass(parseInt(opener.getAttribute('rel')));
			}
		}
	},
	onDropLeave: function(){
		if(jcf.activeControl) {
			jcf.activeControl.hoverFlag = false;
		}
	},
	isActiveDrop: function(){
		return !jcf.lib.hasClass(this.selectDrop, this.options.dropHiddenClass);
	},
	isOverDrop: function(){
		return this.hoverFlag;
	},
	createDropdown: function(){
		// remove old dropdown if exists
		if(this.selectDrop) {
			this.selectDrop.parentNode.removeChild(this.selectDrop);
		}

		// create dropdown holder
		this.selectDrop = document.createElement('div');
		this.selectDrop.className = this.options.dropClass;
		this.selectDrop.innerHTML = this.options.dropStructure;
		this.selectList = jcf.lib.queryBySelector(this.options.dropSelector,this.selectDrop)[0];
		jcf.lib.addClass(this.selectDrop, this.options.dropHiddenClass);
		document.body.appendChild(this.selectDrop);
		this.selectDrop.jcf = this;
		jcf.lib.event.add(this.selectDrop, 'click', this.onOptionClick);
		jcf.lib.event.add(this.selectDrop, 'mouseover', this.onDropHover);
		jcf.lib.event.add(this.selectDrop, 'mouseout', this.onDropLeave);
		this.buildDropdown();
	},
	buildDropdown: function() {
		// build select options / optgroups
		this.buildDropdownOptions();

		// position and resize dropdown
		this.positionDropdown();

		// cut dropdown if height exceedes
		this.buildDropdownScroll();
	},
	buildDropdownOptions: function() {
		this.resStructure = '';
		this.optNum = 0;
		for(var i = 0; i < this.realElement.children.length; i++) {
			this.resStructure += this.buildElement(this.realElement.children[i]) +'\n';
		}
		this.selectList.innerHTML = this.resStructure;
	},
	buildDropdownScroll: function() {
		if(this.options.dropMaxHeight) {
			if(this.selectDrop.offsetHeight > this.options.dropMaxHeight) {
				this.selectList.style.height = this.options.dropMaxHeight+'px';
				this.selectList.style.overflow = 'auto';
				this.selectList.style.overflowX = 'hidden';
				jcf.lib.addClass(this.selectDrop, this.options.dropScrollableClass);
			}
		}
		jcf.lib.addClass(this.selectDrop, jcf.lib.getAllClasses(this.realElement.className, this.options.dropClassPrefix, jcf.baseOptions.hiddenClass));
	},
	buildElement: function(obj){
		// build option
		var res = '';
		if(obj.tagName.toLowerCase() == 'option') {
			if(!jcf.lib.prevSibling(obj) || jcf.lib.prevSibling(obj).tagName.toLowerCase() != 'option') {
				res += '<ul>';
			}
			res += '<li rel="'+(this.optNum++)+'" class="'+(obj.className? obj.className : '')+' jcfcalc"><a href="#">'+(obj.title? '<img src="'+obj.title+'" alt="" />' : '')+'<span>' + obj.innerHTML + '</span></a></li>';
			if(!jcf.lib.nextSibling(obj) || jcf.lib.nextSibling(obj).tagName.toLowerCase() != 'option') {
				res += '</ul>';
			}
			return res;
		}
		// build option group with options
		else if(obj.tagName.toLowerCase() == 'optgroup' && obj.label) {
			res += '<div class="'+this.options.optGroupClass+'">';
			res += '<strong class="jcfcalc"><em>'+(obj.label)+'</em></strong>';
			for(var i = 0; i < obj.children.length; i++) {
				res += this.buildElement(obj.children[i]);
			}
			res += '</div>';
			return res;
		}
	},
	positionDropdown: function(){
		var ofs = jcf.lib.getOffset(this.fakeElement);
		this.selectDrop.style.top = (ofs.top+this.fakeElement.offsetHeight)+'px';
		this.selectDrop.style.left = ofs.left+'px';
		this.selectDrop.style.width = this.fakeElement.offsetWidth+'px';
	},
	showDropdown: function(){
		jcf.lib.removeClass(this.selectDrop, this.options.dropHiddenClass);
		this.positionDropdown();

		// hide active dropdown
		if(jcf.activeControl) {
			jcf.activeControl.hideDropdown();
		}

		// show current dropdown
		jcf.activeControl = this;
		jcf.lib.event.add(window, 'resize', this.onResizeWindow);
		jcf.lib.event.add(window, 'scroll', this.onScrollWindow);
		jcf.lib.event.add(document.body, 'click', this.onClickOutside);
		this.positionDropdown();
	},
	hideDropdown: function(){
		if(jcf.activeControl && typeof jcf.activeControl.origSelectedIndex === 'number') {
			jcf.activeControl.realElement.selectedIndex = jcf.activeControl.origSelectedIndex;
		}
		jcf.lib.addClass(this.selectDrop, this.options.dropHiddenClass);
		jcf.activeControl = null;
		jcf.lib.event.remove(window, 'resize', this.onResizeWindow);
		jcf.lib.event.remove(window, 'scroll', this.onScrollWindow);
		jcf.lib.event.remove(document.body, 'click', this.onClickOutside);
	},
	toggleDropdown: function(){
		this.jcf.dropOpened = true;
		if(!this.jcf.realElement.disabled) {
			if(this.jcf.isActiveDrop()) {
				this.jcf.hideDropdown();
			} else {
				this.jcf.showDropdown();
			}
		}
		this.jcf.refreshState();
	},
	scrollToItem: function(){
		if(this.isActiveDrop()) {
			var dropHeight = this.selectList.offsetHeight;
			var offsetTop = this.calcOptionOffset(this.getFakeActiveOption());
			var sTop = this.selectList.scrollTop;
			var oHeight = this.getFakeActiveOption().offsetHeight;
			//offsetTop+=sTop;

			if(offsetTop >= sTop + dropHeight) {
				this.selectList.scrollTop = offsetTop - dropHeight + oHeight;
			} else if(offsetTop < sTop) {
				this.selectList.scrollTop = offsetTop;
			}
		}
	},
	getFakeActiveOption: function(c) {
		return jcf.lib.queryBySelector('li[rel="'+(typeof c === 'number' ? c : this.realElement.selectedIndex) +'"]',this.selectList)[0];
	},
	calcOptionOffset: function(fake) {
		var h = 0;
		var els = jcf.lib.queryBySelector('.jcfcalc',this.selectList);
		for(var i = 0; i < els.length; i++) {
			if(els[i] == fake) break;
			h+=els[i].offsetHeight;
		}
		return h;
	},
	childrenHasItem: function(hold,item) {
		var items = hold.getElementsByTagName('*');
		for(i = 0; i < items.length; i++) {
			if(items[i] == item) return true;
		}
		return false;
	},
	removeSelectedClass: function(){
		var children = jcf.lib.queryBySelector('li',this.selectList);
		for(var i = children.length - 1; i >= 0; i--) {
			jcf.lib.removeClass(children[i], this.options.selectedClass);
		}
	},
	setSelectedClass: function(c){
		jcf.lib.addClass(this.getFakeActiveOption(c), this.options.selectedClass);
	},
	refreshSelectedClass: function(c){
		this.removeSelectedClass(c);
		this.setSelectedClass(c);
		if(this.realElement.disabled) {
			jcf.lib.addClass(this.fakeElement, this.options.disabledClass);
		} else {
			jcf.lib.removeClass(this.fakeElement, this.options.disabledClass);
		}
	},
	refreshSelectedText: function() {
		if(!this.dropOpened && this.realElement.title) {
			this.valueText.innerHTML = this.realElement.title;
		} else {
			if(this.realElement.options[this.realElement.selectedIndex].title) {
				this.valueText.innerHTML = '<img src="'+this.realElement.options[this.realElement.selectedIndex].title+'" alt="" />' + this.realElement.options[this.realElement.selectedIndex].innerHTML;
			} else {
				this.valueText.innerHTML = this.realElement.options[this.realElement.selectedIndex].innerHTML;
			}
		}
	},
	refreshState: function(){
		if(jcf.activeControl) {
			jcf.activeControl.origSelectedIndex = jcf.activeControl.realElement.selectedIndex;
		}
		this.refreshSelectedClass();
		this.refreshSelectedText();
		this.scrollToItem();
	}
});


// custom scrollbars module
jcf.addModule({
	name:'customscroll',
	selector:'div.scrollable-area',
	initOptions: function(){
		jcf.lib.extend(this.options,{
			scrollSensitivity: 6,
			scrollDistance: 125,
			scrollInterval: 10,
			focusClass:'scrollable-focus',
			innerWrapperClass:'scrollable-inner-wrapper',
			scrollWrapperClass:'scrollable-area-wrapper',
			horizontalClass: 'hscrollable',
			verticalClass: 'vscrollable',
			bothClass: 'anyscrollable',
			vScrollBarClass:'vscrollbar',
			vScrollStructure: '<div class="vscroll-up"></div><div class="vscroll-down"></div><div class="vscroll-line"></div><div class="vscroll-slider"><div class="scroll-bar-top"></div><div class="scroll-bar-bottom"></div></div></div>',
			vScrollBtnUpClass:'div.vscroll-up',
			vScrollBtnDownClass:'div.vscroll-down',
			vScrollSliderClass:'div.vscroll-slider',
			hScrollBarClass:'hscrollbar',
			hScrollStructure: '<div class="hscroll-left"></div><div class="hscroll-right"></div><div class="hscroll-line"></div><div class="hscroll-slider"><div class="scroll-bar-left"></div><div class="scroll-bar-right"></div></div></div>',
			hScrollBtnLeftClass:'div.hscroll-left',
			hScrollBtnRightClass:'div.hscroll-right',
			hScrollSliderClass:'div.hscroll-slider'
		});
	},
	replaceObject: function(){
		this.initStructure();
		this.refreshState();
		this.addEvents();
	},
	initStructure: function(){
		// set type of scroll
		//this.realElement.setAttribute('tabindex',0);
		if(jcf.lib.hasClass(this.realElement, this.options.bothClass)) {
			this.scrollType = 'both';
		} else {
			if(jcf.lib.hasClass(this.realElement, this.options.horizontalClass) && jcf.lib.hasClass(this.realElement, this.options.verticalClass)) {
				this.scrollType = 'both';
			} else {
				if(jcf.lib.hasClass(this.realElement, this.options.horizontalClass)) {
					this.scrollType = 'horizontal';
				} else {
					this.scrollType = 'vertical';
				}
			}
		}

		// build structure for scrollable area
		this.origDimensions = {
			scrollWidth:this.realElement.scrollWidth,
			scrollHeight:this.realElement.scrollHeight,
			scrollTop:this.realElement.scrollTop,
			scrollLeft:this.realElement.scrollLeft,
			width:this.realElement.offsetWidth,
			height:this.realElement.offsetHeight
		};

		this.realElement.jcf = this;
		this.realElement.style.width = this.origDimensions.width+'px';
		this.realElement.style.height = this.origDimensions.height+'px';
		this.realElement.style.position = 'relative';
		this.realElement.style.overflow = 'hidden';

		this.buildWrapper();
		if(this.scrollType == 'horizontal' || this.scrollType == 'both') {
			this.buildHorizontalScrollbar();
		}
		if(this.scrollType == 'vertical' || this.scrollType == 'both'){
			this.buildVerticalScrollbar();
		}

		// get elements
		if(this.vScrollBar) {
			this.btnUp = jcf.lib.queryBySelector(this.options.vScrollBtnUpClass,this.vScrollBar)[0];
			this.btnDown = jcf.lib.queryBySelector(this.options.vScrollBtnDownClass,this.vScrollBar)[0];
			this.vSlider = jcf.lib.queryBySelector(this.options.vScrollSliderClass,this.vScrollBar)[0];
			this.btnUp.jcf = this;
			this.btnDown.jcf = this;
			this.vSlider.jcf = this;
		}
		if(this.hScrollBar) {
			this.btnLeft = jcf.lib.queryBySelector(this.options.hScrollBtnLeftClass,this.hScrollBar)[0];
			this.btnRight = jcf.lib.queryBySelector(this.options.hScrollBtnRightClass,this.hScrollBar)[0];
			this.hSlider = jcf.lib.queryBySelector(this.options.hScrollSliderClass,this.hScrollBar)[0];
			this.hSlider.jcf = this;
			this.btnLeft.jcf = this;
			this.btnRight.jcf = this;
		}

		// resize by scrollbar styles
		this.skipMargin = this.scrollType == 'both' ? this.vScrollBar.offsetWidth : 0;
		if(this.vScrollBar) {
			this.realElement.style.width = this.origDimensions.width - this.vScrollBar.offsetWidth + 'px';
			this.vScrollBar.style.height = this.origDimensions.height - this.skipMargin + 'px';
		}
		if(this.hScrollBar) {
			this.realElement.style.height = this.origDimensions.height - this.hScrollBar.offsetHeight + 'px';
			this.hScrollBar.style.width = this.origDimensions.width - this.skipMargin + 'px';
		}
		this.resizeControls();
	},
	buildWrapper: function(){
		// create wrapper
		this.scrollWrapper = document.createElement('div');
		this.scrollWrapper.className = this.options.scrollWrapperClass;
		this.scrollWrapper.style.width = this.realElement.style.width;
		this.scrollWrapper.style.height = this.realElement.style.height;
		this.scrollWrapper.style.overflow = 'hidden';
		this.realElement.parentNode.insertBefore(this.scrollWrapper, this.realElement);
		this.scrollWrapper.appendChild(this.realElement);

		// create scroll wrapper
		this.contentScroll = document.createElement('div');
		this.contentScroll.className = this.options.innerWrapperClass;
		this.contentScroll.style.overflow = 'hidden';
		this.contentScroll.style.width = this.origDimensions.scrollWidth + 'px';
		while(this.realElement.children.length) this.contentScroll.appendChild(this.realElement.children[0]);
		this.realElement.appendChild(this.contentScroll);
		this.realElement.scrollTop = this.origDimensions.scrollTop;
	},
	buildHorizontalScrollbar: function() {
		this.hScrollBar = document.createElement('div');
		this.hScrollBar.className = this.options.hScrollBarClass;
		this.hScrollBar.innerHTML = this.options.hScrollStructure;
		this.scrollWrapper.appendChild(this.hScrollBar);
		this.layX = 0;
	},
	buildVerticalScrollbar: function() {
		this.vScrollBar = document.createElement('div');
		this.vScrollBar.className = this.options.vScrollBarClass;
		this.vScrollBar.innerHTML = this.options.vScrollStructure;
		this.scrollWrapper.appendChild(this.vScrollBar);
		this.layY = 0;
	},
	recalcDimensions: function() {
		this.holderHeight = this.realElement.offsetHeight - this.skipMargin;
		this.holderWidth = this.realElement.offsetWidth - this.skipMargin;
		this.wrapperHeight = this.contentScroll.offsetHeight;
		this.wrapperWidth = this.contentScroll.offsetWidth;
	},
	resizeControls: function(e) {
		this.recalcDimensions();
		if(this.vScrollBar) {
			this.btnUpHeight = this.btnUp.offsetHeight;
			this.btnDownHeight = this.btnDown.offsetHeight;
			this.diffHeight = this.holderHeight - this.btnUpHeight - this.btnDownHeight + this.skipMargin;
			this.sliderHeight = Math.round((this.holderHeight * 100 / this.wrapperHeight) * this.diffHeight / 100);
			this.vSliderTop = this.vSliderTop || this.btnUpHeight;
			this.vSliderMaxTop = this.diffHeight + this.btnUpHeight - this.vSlider.offsetHeight;
			this.vSliderMinTop = this.btnUpHeight;
			if(e && e.layerY) this.layY = e.layerY;
			this.offsetTop = jcf.lib.getOffset(this.vScrollBar).top;
			this.minVerticalOffset = this.offsetTop + this.btnUpHeight;
			this.maxVerticalOffset = this.offsetTop + this.vSliderMaxTop;
		}
		if(this.hScrollBar) {
			this.btnLeftWidth = this.btnLeft.offsetWidth;
			this.btnRightWidth = this.btnRight.offsetWidth;
			this.diffWidth = this.holderWidth - this.btnLeftWidth - this.btnRightWidth + this.skipMargin;
			this.sliderWidth = Math.round((this.holderWidth * 100 / this.wrapperWidth) * this.diffWidth / 100);
			this.hSliderLeft = this.hSliderLeft || this.btnLeftWidth;
			this.hSliderMaxLeft = this.diffWidth + this.btnLeftWidth - this.hSlider.offsetWidth;
			this.hSliderMinLeft = this.btnLeftWidth;
			if(e && e.layerX) this.layX = e.layerX;
			this.offsetLeft = jcf.lib.getOffset(this.hScrollBar).left;
			this.minHorizontalOffset = this.offsetLeft + this.btnLeftWidth;
			this.maxHorizontalOffset = this.offsetLeft + this.hSliderMaxLeft;
		}
	},
	refreshState: function(posOnly) {
		if(this.vScrollBar) {
			this.vSlider.style.top = this.vSliderTop + 'px';
			this.vSlider.style.height = this.sliderHeight + 'px';
			if(!posOnly) this.realElement.scrollTop = this.offsetToScrollTop(parseInt(this.vSlider.style.top) - this.btnUpHeight);
		}
		if(this.hScrollBar) {
			this.hSlider.style.left = this.hSliderLeft + 'px';
			this.hSlider.style.width = this.sliderWidth + 'px';
			if(!posOnly) this.realElement.scrollLeft = this.offsetToScrollLeft(parseInt(this.hSlider.style.left) - this.btnLeftWidth);
		}
	},
	offsetToScrollLeft: function(c) {
		this.scrollPercent = c * 100 / (this.diffWidth - this.hSlider.offsetWidth);
		return (this.scrollPercent * (this.wrapperWidth - this.holderWidth)) / 100;
	},
	offsetToScrollTop: function(c) {
		this.scrollPercent = c * 100 / (this.diffHeight - this.vSlider.offsetHeight);
		return (this.scrollPercent * (this.wrapperHeight - this.holderHeight)) / 100;
	},
	scrollTopToOffset: function(c) {
		this.scrollPercent = c * 100 / (this.wrapperHeight - this.holderHeight);
		return this.scrollPercent * (this.diffHeight - this.vSlider.offsetHeight) / 100;
	},
	scrollLeftToOffset: function(c) {
		this.scrollPercent = c * 100 / (this.wrapperWidth - this.holderWidth);
		return this.scrollPercent * (this.diffWidth - this.hSlider.offsetWidth) / 100;
	},
	scrollUp: function() {
		clearInterval(jcf.actScroll.scrollTimer);
		if(jcf.actScroll.realElement.scrollTop - jcf.actScroll.options.scrollSensitivity > 0) {
			jcf.actScroll.realElement.scrollTop -= jcf.actScroll.options.scrollSensitivity;
			jcf.actScroll.vSliderTop = jcf.actScroll.scrollTopToOffset(jcf.actScroll.realElement.scrollTop) + jcf.actScroll.btnUpHeight;
			jcf.actScroll.refreshState(true);
			jcf.actScroll.scrollTimer = setInterval(jcf.actScroll.scrollUp, jcf.actScroll.options.scrollInterval);
		} else {
			jcf.actScroll.vSliderTop = jcf.actScroll.btnUpHeight;
			jcf.actScroll.refreshState();
		}
	},
	scrollDown: function() {
		clearInterval(jcf.actScroll.scrollTimer);
		if(jcf.actScroll.realElement.scrollTop + jcf.actScroll.options.scrollSensitivity < jcf.actScroll.wrapperHeight) {
			jcf.actScroll.realElement.scrollTop += jcf.actScroll.options.scrollSensitivity;
			jcf.actScroll.vSliderTop = jcf.actScroll.scrollTopToOffset(jcf.actScroll.realElement.scrollTop) + jcf.actScroll.btnUpHeight;
			jcf.actScroll.refreshState(true);
			jcf.actScroll.scrollTimer = setInterval(jcf.actScroll.scrollDown, jcf.actScroll.options.scrollInterval);
		} else {
			jcf.actScroll.vSliderTop = jcf.actScroll.vSliderMaxTop;
			jcf.actScroll.refreshState();
		}
	},
	scrollLeft: function() {
		clearInterval(jcf.actScroll.scrollTimer);
		if(jcf.actScroll.realElement.scrollLeft - jcf.actScroll.options.scrollSensitivity > 0) {
			jcf.actScroll.realElement.scrollLeft -= jcf.actScroll.options.scrollSensitivity;
			jcf.actScroll.hSliderLeft = jcf.actScroll.scrollLeftToOffset(jcf.actScroll.realElement.scrollLeft) + jcf.actScroll.btnLeftWidth;
			jcf.actScroll.refreshState(true);
			jcf.actScroll.scrollTimer = setInterval(jcf.actScroll.scrollLeft, jcf.actScroll.options.scrollInterval);
		} else {
			jcf.actScroll.hSliderLeft = jcf.actScroll.btnLeftWidth;
			jcf.actScroll.refreshState();
		}
	},
	scrollRight: function() {
		clearInterval(jcf.actScroll.scrollTimer);
		if(jcf.actScroll.realElement.scrollLeft + jcf.actScroll.options.scrollSensitivity < jcf.actScroll.wrapperWidth) {
			jcf.actScroll.realElement.scrollLeft += jcf.actScroll.options.scrollSensitivity;
			jcf.actScroll.hSliderLeft = jcf.actScroll.scrollLeftToOffset(jcf.actScroll.realElement.scrollLeft) + jcf.actScroll.btnLeftWidth;
			jcf.actScroll.refreshState(true);
			jcf.actScroll.scrollTimer = setInterval(jcf.actScroll.scrollRight, jcf.actScroll.options.scrollInterval);
		} else {
			jcf.actScroll.hSliderLeft = jcf.actScroll.hSliderMaxLeft;
			jcf.actScroll.refreshState();
		}
	},
	scrollUpBy: function(px) {
		jcf.actScroll.stopScroll();
		jcf.actScroll.destTop = jcf.actScroll.realElement.scrollTop - px > 0 ? jcf.actScroll.realElement.scrollTop - px : 0;
		jcf.actScroll.scrollByTimer = setInterval(function(){
			if(jcf.actScroll.realElement.scrollTop <= jcf.actScroll.destTop) {
				jcf.actScroll.stopScroll();
			} else {
				jcf.actScroll.scrollUp();
			}
		},jcf.actScroll.options.scrollInterval);
	},
	scrollDownBy: function(px) {
		jcf.actScroll.stopScroll();
		jcf.actScroll.destTop = jcf.actScroll.realElement.scrollTop + px < jcf.actScroll.wrapperHeight - jcf.actScroll.holderHeight ? jcf.actScroll.realElement.scrollTop + px : jcf.actScroll.wrapperHeight - jcf.actScroll.holderHeight;
		jcf.actScroll.scrollByTimer = setInterval(function(){
			if(jcf.actScroll.realElement.scrollTop >= jcf.actScroll.destTop) {
				jcf.actScroll.stopScroll();
			} else {
				jcf.actScroll.scrollDown();
			}
		},jcf.actScroll.options.scrollInterval);
	},
	stopScroll: function() {
		clearInterval(jcf.actScroll.scrollTimer);
		clearInterval(jcf.actScroll.scrollByTimer);
	},
	scrollTo: function(x,y) {
		x = x || jcf.actScroll.realElement.scrollLeft;
		y = y || jcf.actScroll.realElement.scrollTop;
		jcf.actScroll.vSliderTop = jcf.actScroll.scrollTopToOffset(y) + jcf.actScroll.btnUpHeight;
		jcf.actScroll.refreshState(true);
	},
	scrollAtTop: function() {
		if(this.vSliderTop == this.vSliderMinTop) {
			return true;
		}
		return false;
	},
	scrollAtBottom: function() {
		if(this.vSliderTop == this.vSliderMaxTop) {
			return true;
		}
		return false;
	},
	addEvents: function(){
		// vertical scrollbar
		if(this.vScrollBar) {
			jcf.lib.event.add(this.vSlider, 'click', function(e){return false;});
			jcf.lib.event.add(this.vSlider, 'mousedown', this.onVerticalMouseDown);
			jcf.lib.event.add(this.btnDown, 'mousedown', this.onBtnDownPress);
			jcf.lib.event.add(this.btnDown, 'mouseup', this.onBtnDownRelease);
			jcf.lib.event.add(this.btnUp, 'mousedown', this.onBtnUpPress);
			jcf.lib.event.add(this.btnUp, 'mouseup', this.onBtnUpRelease);
		}
		// horizontal scrollbar
		if(this.hScrollBar) {
			jcf.lib.event.add(this.hSlider, 'click', function(e){return false;});
			jcf.lib.event.add(this.hSlider, 'mousedown', this.onHorizontalMouseDown);
			jcf.lib.event.add(this.btnRight, 'mousedown', this.onBtnRightPress);
			jcf.lib.event.add(this.btnRight, 'mouseup', this.onBtnRightRelease);
			jcf.lib.event.add(this.btnLeft, 'mousedown', this.onBtnLeftPress);
			jcf.lib.event.add(this.btnLeft, 'mouseup', this.onBtnLeftRelease);
		}

		// wheel events
		jcf.lib.event.add(this.realElement, 'DOMMouseScroll', this.onMouseWheel);
		jcf.lib.event.add(this.realElement, 'mousewheel', this.onMouseWheel);
		jcf.lib.event.add(this.realElement, 'focus', this.onFocus);
		jcf.lib.event.add(this.realElement, 'blur', this.onBlur);
	},
	onFocus: function(){
		jcf.lib.addClass(this.jcf.scrollWrapper,this.jcf.options.focusClass);
	},
	onBlur: function(){
		jcf.lib.removeClass(this.jcf.scrollWrapper,this.jcf.options.focusClass);
	},
	onBtnUpPress: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.resizeControls();
		jcf.actScroll.scrollUp();
	},
	onBtnUpRelease: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.stopScroll();
	},
	onBtnDownPress: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.resizeControls();
		jcf.actScroll.scrollDown();
	},
	onBtnDownRelease: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.stopScroll();
	},
	onBtnLeftPress: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.resizeControls();
		jcf.actScroll.scrollLeft();
	},
	onBtnLeftRelease: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.stopScroll();
	},
	onBtnRightPress: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.resizeControls();
		jcf.actScroll.scrollRight();
	},
	onBtnRightRelease: function() {
		jcf.actScroll = this.jcf;
		jcf.actScroll.stopScroll();
	},
	onMouseWheel: function(e) {
		// detect wheel direction
		var delta = 0;
		if (e.wheelDelta) {
			delta = e.wheelDelta/120;
		} else if (e.detail) {
			delta = -e.detail/3;
		}

		// nested scrollbars check
		var curTarget = e.target;
		var scrollTarget = this.jcf;
		do {
			if(curTarget.jcf && curTarget.jcf.name == 'customscroll') {
				scrollTarget = curTarget;
				break;
			}
			curTarget = curTarget.parentNode;
		} while(curTarget.parentNode);

		// perform scroll
		if(jcf.actScroll) {
			jcf.actScroll.stopScroll();
		}
		if(delta < 0) {
			if(!scrollTarget.jcf.scrollAtBottom()) {
				jcf.actScroll = scrollTarget.jcf;
				jcf.actScroll.resizeControls();
				jcf.actScroll.scrollDownBy(jcf.actScroll.options.scrollDistance);
				return false;
			}
		} else {
			if(!scrollTarget.jcf.scrollAtTop()) {
				jcf.actScroll = scrollTarget.jcf;
				jcf.actScroll.resizeControls();
				jcf.actScroll.scrollUpBy(jcf.actScroll.options.scrollDistance);
				return false;
			}
		}
	},
	onVerticalMouseDown: function(e){
		jcf.actScroll = this.jcf;
		jcf.actScroll.resizeControls(e);
		jcf.lib.event.add(document.body, 'mouseup', jcf.actScroll.onVerticalMouseUp);
		jcf.lib.event.add(document.body, 'mousemove', jcf.actScroll.onVerticalMouseMove);
		jcf.lib.disableSelection(); // IE
		return false; // W3C
	},
	onVerticalMouseMove: function(e){
		if(jcf.actScroll) {
			if(e.pageY - jcf.actScroll.layY > jcf.actScroll.minVerticalOffset) {
				if(e.pageY - jcf.actScroll.layY < jcf.actScroll.maxVerticalOffset) {
					jcf.actScroll.vSliderTop = e.pageY - jcf.actScroll.layY - jcf.actScroll.offsetTop;
				} else {
					jcf.actScroll.vSliderTop = jcf.actScroll.maxVerticalOffset - jcf.actScroll.offsetTop;
				}
			} else {
				jcf.actScroll.vSliderTop = jcf.actScroll.btnUpHeight;
			}
			jcf.actScroll.refreshState();
		}
	},
	onVerticalMouseUp: function(){
		jcf.lib.event.remove(document.body, 'mouseup', jcf.actScroll.onVerticalMouseUp);
		jcf.lib.event.remove(document.body, 'mousemove', jcf.actScroll.onVerticalMouseMove);
		jcf.lib.enableSelection(); // IE
		return false;
	},
	onHorizontalMouseDown: function(e){
		jcf.actScroll = this.jcf;
		jcf.actScroll.resizeControls(e);
		jcf.lib.event.add(document.body, 'mouseup', jcf.actScroll.onHorizontalMouseUp);
		jcf.lib.event.add(document.body, 'mousemove', jcf.actScroll.onHorizontalMouseMove);
		jcf.lib.disableSelection(); // IE
		return false; // W3C
	},
	onHorizontalMouseMove: function(e){
		if(jcf.actScroll) {
			if(e.pageX - jcf.actScroll.layX > jcf.actScroll.minHorizontalOffset) {
				if(e.pageX - jcf.actScroll.layX < jcf.actScroll.maxHorizontalOffset) {
					jcf.actScroll.hSliderLeft = e.pageX - jcf.actScroll.layX - jcf.actScroll.offsetLeft;
				} else {
					jcf.actScroll.hSliderLeft = jcf.actScroll.maxHorizontalOffset - jcf.actScroll.offsetLeft;
				}
			} else {
				jcf.actScroll.hSliderLeft = jcf.actScroll.btnLeftWidth;
			}
			jcf.actScroll.refreshState();
		}
	},
	onHorizontalMouseUp: function(){
		jcf.lib.event.remove(document.body, 'mouseup', jcf.actScroll.onHorizontalMouseUp);
		jcf.lib.event.remove(document.body, 'mousemove', jcf.actScroll.onHorizontalMouseMove);
		jcf.lib.enableSelection(); // IE
	},
	onCreateModule: function(){
		if(jcf.modules.select) {
			this.extendSelect();
		}
	},
	onModuleAdded: function(module){
		if(module.prototype.name == 'select') {
			this.extendSelect();
		}
	},
	extendSelect: function() {
		// add scrollable if needed on control ready
		jcf.modules.select.prototype.onControlReady = function(obj){
			if(obj.selectDrop.offsetHeight > obj.options.dropMaxHeight) {
				obj.jcfScrollable = new jcf.modules.customscroll({
					replaces:obj.selectList
				});
			}
		};

		// update scroll function
		var orig = jcf.modules.select.prototype.scrollToItem;
		jcf.modules.select.prototype.scrollToItem = function(){
			orig.apply(this);
			if(this.jcfScrollable) {
				jcf.actScroll = this.jcfScrollable;
				jcf.actScroll.scrollTo();
			}
		};
	}
});

function initOrderForm()
{
	var holder  = $$('.proposal');
	if(!holder.length) return;

	var textHolders = $$('.proposal')[0].getElements('div.txt');
	textHolders[0].addClass('active');
	$$('.holder input[type="radio"]').each(function(_input){
		_input.addEvent('click', function(){
			textHolders.each(function(_el){
				_el.removeClass('active');
			});
			_input.getSiblings('.txt').addClass('active');
		});
	});
}

function initOrderListActivePage()
{
    var _pager = $$('ul.paging');
    if(!_pager.length) return;
    var _active = _pager.getElement('li.pager-active').getFirst();
    _active.addEvent('click', function(){
	return false;
    });
}

function initSpamProtection()
{
    var target = $$('.spam-protect');
    if(!target.length || uniqueId == 'undefined') return;
    target.setProperty('value', uniqueId);
    return false;
}

// IE Hover module
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 u=k(){9 g=/^([^#.>`]*)(#|\\.|\\>|\\`)(.+)$/;k u(a,b){9 c=a.J(/\\s*\\,\\s*/);9 d=[];n(9 i=0;i<c.l;i++){d=d.v(o(c[i],b))};6 d};k o(a,b,c){a=a.z(" ","`");9 d=a.r(g);9 e,5,m,7,i,h;9 f=[];4(d==8){d=[a,a]};4(d[1]==""){d[1]="*"};4(c==8){c="`"};4(b==8){b=E};K(d[2]){w"#":7=d[3].r(g);4(7==8){7=[8,d[3]]};e=E.L(7[1]);4(e==8||(d[1]!="*"&&!x(e,d[1]))){6 f};4(7.l==2){f.A(e);6 f};6 o(7[3],e,7[2]);w".":4(c!=">"){5=p(b,d[1])}y{5=b.B};n(i=0,h=5.l;i<h;i++){e=5[i];4(e.C!=1){q};7=d[3].r(g);4(7!=8){4(e.j==8||e.j.r("(\\\\s|^)"+7[1]+"(\\\\s|$)")==8){q};m=o(7[3],e,7[2]);f=f.v(m)}y 4(e.j!=8&&e.j.r("(\\\\s|^)"+d[3]+"(\\\\s|$)")!=8){f.A(e)}};6 f;w">":4(c!=">"){5=p(b,d[1])}y{5=b.B};n(i=0,h=5.l;i<h;i++){e=5[i];4(e.C!=1){q};4(!x(e,d[1])){q};m=o(d[3],e,">");f=f.v(m)};6 f;w"`":5=p(b,d[1]);n(i=0,h=5.l;i<h;i++){e=5[i];m=o(d[3],e,"`");f=f.v(m)};6 f;M:4(c!=">"){5=p(b,d[1])}y{5=b.B};n(i=0,h=5.l;i<h;i++){e=5[i];4(e.C!=1){q};4(!x(e,d[1])){q};f.A(e)};6 f}};k p(a,b){4(b=="*"&&a.F!=8){6 a.F};6 a.p(b)};k x(a,b){4(b=="*"){6 N};6 a.O.G().z("P:","")==b.G()};6 u}();k Q(a,b){9 c=u(a);n(9 i=0;i<c.l;i++){c[i].R=k(){4(t.j.H(b)==-1){t.j+=" "+b}};c[i].S=k(){4(t.j.H(b)!=-1){t.j=t.j.z(b,"")}}}}4(D.I&&!D.T){D.I("U",V)}',58,58,'||||if|listNodes|return|subselector|null|var||||||||limit||className|function|length|listSubNodes|for|doParse|getElementsByTagName|continue|match||this|parseSelector|concat|case|matchNodeNames|else|replace|push|childNodes|nodeType|window|document|all|toLowerCase|indexOf|attachEvent|split|switch|getElementById|default|true|nodeName|html|hoverForIE6|onmouseover|onmouseout|opera|onload|ieHover'.split('|'),0,{}))

// DOM ready handler
function bindReady(d){function a(){if(!b){b=true;d()}}var b=false;if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,false);else if(document.attachEvent){if(document.documentElement.doScroll&&window==window.top){var c=function(){if(!b)if(document.body)try{document.documentElement.doScroll("left");a()}catch(e){setTimeout(c,0)}};c()}document.attachEvent("onreadystatechange",function(){document.readyState==="complete"&&a()})}if(window.addEventListener)window.addEventListener("load",a,false);else window.attachEvent&&window.attachEvent("onload",a)};




