// Ember.js 

var config = {"site_url":"http:\/\/dalemanning.com\/"};

var site_settings = {"total":14,"items":{"logo":{"id":"428","sect_id":"1890","last_updated":"2011-06-29 10:58:06","name":"logo","type":"image","value":"52049","sort":"0","description":"The logo for your site. The image size should fit the sidebar of your site (By default this is 200px wide)","title":"Logo","active":"1","photo":{"base_url":"http:\/\/photos.osmek.com\/get\/52049","type":"jpg","sizes":{"o":{"url":"http:\/\/photos.osmek.com\/get\/52049.o.png","html":"<img src=\"http:\/\/photos.osmek.com\/get\/52049.o.png\" width=\"160\" height=\"216\" title=\"croppedlogo2.png\" alt=\"\" \/>"},"l":{"url":"http:\/\/photos.osmek.com\/get\/52049.l.jpg","html":"<img src=\"http:\/\/photos.osmek.com\/get\/52049.l.jpg\" width=\"160\" height=\"216\" title=\"croppedlogo2.png\" alt=\"\" \/>"},"sq":{"url":"http:\/\/photos.osmek.com\/get\/52049.sq.jpg","html":"<img src=\"http:\/\/photos.osmek.com\/get\/52049.sq.jpg\" width=\"70\" height=\"70\" title=\"croppedlogo2.png\" alt=\"\" \/>"},"thumb":{"url":"http:\/\/photos.osmek.com\/get\/52049.thumb.jpg","html":"<img src=\"http:\/\/photos.osmek.com\/get\/52049.thumb.jpg\" width=\"134\" height=\"180\" title=\"croppedlogo2.png\" alt=\"\" \/>"}}},"tagstring":""},"site_name":{"id":"429","sect_id":"1890","last_updated":"2011-06-28 12:17:03","name":"site_name","type":"input","value":"Dale Manning Photography @ Idea Den","sort":"1","description":"This will be used as your site name in the browser title.","title":"Site Name","active":"1","tagstring":""},"background_color":{"id":"430","sect_id":"1890","last_updated":"2011-06-27 20:59:48","name":"background_color","type":"color","value":"#1a1a1a","sort":"2","description":"Background color for your site.","title":"Background Color","active":"1","tagstring":""},"text_color":{"id":"431","sect_id":"1890","last_updated":"2011-06-30 09:03:39","name":"text_color","type":"color","value":"#d1d0cf","sort":"3","description":"","title":"Text Color","active":"1","tagstring":""},"highlight_color":{"id":"441","sect_id":"1890","last_updated":"2011-06-30 09:04:24","name":"highlight_color","type":"color","value":"#f78707","sort":"4","description":"","title":"Highlight Color","active":"1","tagstring":""},"css":{"id":"432","sect_id":"1890","last_updated":"2011-06-27 21:06:47","name":"css","type":"textarea","value":"","sort":"5","description":"You can add custom CSS for your site here.","title":"Custom CSS","active":"1","tagstring":""},"typekit_code":{"id":"433","sect_id":"1890","last_updated":"2011-06-27 21:06:43","name":"typekit_code","type":"textarea","value":"","sort":"6","description":"Use Typekit (http:\/\/www.typekit.com) in your site by pasting your typekit code here.","title":"Typekit Code","active":"1","tagstring":""},"footer_text":{"id":"434","sect_id":"1890","last_updated":"2011-06-29 11:36:31","name":"footer_text","type":"textarea","value":"\u00a9 Dale Manning. Powered by <a href=\"http:\/\/ideaden.com\" target=\"_blank\">Idea Den<\/a>.  Contact <a href=\"mailto:dale@ideaden.com\">dale@ideaden.com<a\/>","sort":"7","description":"Text for the site footer.","title":"Footer Text","active":"1","tagstring":""},"google_analytics_id":{"id":"435","sect_id":"1890","last_updated":"2011-06-30 09:10:22","name":"google_analytics_id","type":"input","value":"UA-24278340-1","sort":"8","description":"Your google Analytics ID. This is the id that shows next to your site profile. It looks like: UA-12345678-1","title":"Analytics ID","active":"1","tagstring":""},"gallery_nav_bottom":{"id":"436","sect_id":"1890","last_updated":"2011-06-28 12:17:22","name":"gallery_nav_bottom","type":"checkbox","value":"1","sort":"9","description":"Put gallery navigation below images","title":"Gallery Nav Position","active":"1","tagstring":""},"sidebar_right":{"id":"437","sect_id":"1890","last_updated":"2011-06-29 11:20:09","name":"sidebar_right","type":"checkbox","value":"0","sort":"10","description":"Put the sidebar on the right","title":"Sidebar on right","active":"1","tagstring":""},"run_intro":{"id":"438","sect_id":"1890","last_updated":"2011-06-27 21:06:33","name":"run_intro","type":"checkbox","value":"1","sort":"11","description":"Show a short intro animation when your site loads.","title":"Intro Animation","active":"1","tagstring":""},"use_mobile_version":{"id":"439","sect_id":"1890","last_updated":"2011-06-27 21:06:33","name":"use_mobile_version","type":"checkbox","value":"1","sort":"12","description":"Redirect mobile users to mobile specific site.","title":"Mobile Version","active":"1","tagstring":""},"header_contact_area":{"id":"440","sect_id":"1890","last_updated":"2011-06-29 17:04:10","name":"header_contact_area","type":"textarea","value":".","sort":"13","description":"","title":"Sidebar Contact Area","active":"1","tagstring":""}}};

/* Javascripts
----------------------------------------------------------------------------------------------------- */



/* mootools-core.js
----------------------------------------------------------------------------------------------------- */

/*
---
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.1",build:"af48c8d589f43f32212f9bb8ff68a127e6a3ba6c"};var o=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 j=this.instanceOf=function(t,i){if(t==null){return false;}var s=t.$constructor||t.constructor;
while(s){if(s===i){return true;}s=s.parent;}return t instanceof i;};var f=this.Function;var p=true;for(var k in {toString:1}){p=null;}if(p){p=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];
}f.prototype.overloadSetter=function(s){var i=this;return function(u,t){if(u==null){return this;}if(s||typeof u!="string"){for(var v in u){i.call(this,v,u[v]);
}if(p){for(var w=p.length;w--;){v=p[w];if(u.hasOwnProperty(v)){i.call(this,v,u[v]);}}}}else{i.call(this,u,t);}return this;};};f.prototype.overloadGetter=function(s){var i=this;
return function(u){var v,t;if(s||typeof u!="string"){v=u;}else{if(arguments.length>1){v=arguments;}}if(v){t={};for(var w=0;w<v.length;w++){t[v[w]]=i.call(this,v[w]);
}}else{t=i.call(this,u);}return t;};};f.prototype.extend=function(i,s){this[i]=s;}.overloadSetter();f.prototype.implement=function(i,s){this.prototype[i]=s;
}.overloadSetter();var n=Array.prototype.slice;f.from=function(i){return(o(i)=="function")?i:function(){return i;};};Array.from=function(i){if(i==null){return[];
}return(a.isEnumerable(i)&&typeof i!="string")?(o(i)=="array")?i:n.call(i):[i];};Number.from=function(s){var i=parseFloat(s);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 a=this.Type=function(u,t){if(u){var s=u.toLowerCase();var i=function(v){return(o(v)==s);};a["is"+u]=i;if(t!=null){t.prototype.$family=(function(){return s;
}).hide();}}if(t==null){return null;}t.extend(this);t.$constructor=a;t.prototype.$constructor=t;return t;};var e=Object.prototype.toString;a.isEnumerable=function(i){return(i!=null&&typeof i.length=="number"&&e.call(i)!="[object Function]");
};var q={};var r=function(i){var s=o(i.prototype);return q[s]||(q[s]=[]);};var b=function(t,x){if(x&&x.$hidden){return;}var s=r(this);for(var u=0;u<s.length;
u++){var w=s[u];if(o(w)=="type"){b.call(w,t,x);}else{w.call(this,t,x);}}var v=this.prototype[t];if(v==null||!v.$protected){this.prototype[t]=x;}if(this[t]==null&&o(x)=="function"){m.call(this,t,function(i){return x.apply(i,n.call(arguments,1));
});}};var m=function(i,t){if(t&&t.$hidden){return;}var s=this[i];if(s==null||!s.$protected){this[i]=t;}};a.implement({implement:b.overloadSetter(),extend:m.overloadSetter(),alias:function(i,s){b.call(this,i,this.prototype[s]);
}.overloadSetter(),mirror:function(i){r(this).push(i);return this;}});new a("Type",a);var d=function(s,w,u){var t=(w!=Object),A=w.prototype;if(t){w=new a(s,w);
}for(var x=0,v=u.length;x<v;x++){var B=u[x],z=w[B],y=A[B];if(z){z.protect();}if(t&&y){delete A[B];A[B]=y.protect();}}if(t){w.implement(A);}return d;};d("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=m.overloadSetter();Date.extend("now",function(){return +(new Date);});new a("Boolean",Boolean);Number.prototype.$family=function(){return isFinite(this)?"number":"null";
}.hide();Number.extend("random",function(s,i){return Math.floor(Math.random()*(i-s+1)+s);});var g=Object.prototype.hasOwnProperty;Object.extend("forEach",function(i,t,u){for(var s in i){if(g.call(i,s)){t.call(u,i[s],s,i);
}}});Object.each=Object.forEach;Array.implement({forEach:function(u,v){for(var t=0,s=this.length;t<s;t++){if(t in this){u.call(v,this[t],t,this);}}},each:function(i,s){Array.forEach(this,i,s);
return this;}});var l=function(i){switch(o(i)){case"array":return i.clone();case"object":return Object.clone(i);default:return i;}};Array.implement("clone",function(){var s=this.length,t=new Array(s);
while(s--){t[s]=l(this[s]);}return t;});var h=function(s,i,t){switch(o(t)){case"object":if(o(s[i])=="object"){Object.merge(s[i],t);}else{s[i]=Object.clone(t);
}break;case"array":s[i]=t.clone();break;default:s[i]=t;}return s;};Object.extend({merge:function(z,u,t){if(o(u)=="string"){return h(z,u,t);}for(var y=1,s=arguments.length;
y<s;y++){var w=arguments[y];for(var x in w){h(z,x,w[x]);}}return z;},clone:function(i){var t={};for(var s in i){t[s]=l(i[s]);}return t;},append:function(w){for(var v=1,t=arguments.length;
v<t;v++){var s=arguments[v]||{};for(var u in s){w[u]=s[u];}}return w;}});["Object","WhiteSpace","TextNode","Collection","Arguments"].each(function(i){new a(i);
});var c=Date.now();String.extend("uniqueID",function(){return(c++).toString(36);});}).call(this);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("");}});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==null?[]:a),c),b);
},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={};
for(var e=0,b=g.length;e<b;e++){var c=g[e];f[c]=d[c];}return f;},map:function(b,e,f){var d={};for(var c in b){if(a.call(b,c)){d[c]=e.call(f,b[c],c,b);}}return d;
},filter:function(b,d,e){var c={};Object.each(b,function(g,f){if(d.call(e,g,f,b)){c[f]=g;}});return c;},every:function(b,d,e){for(var c in b){if(a.call(b,c)&&!d.call(e,b[c],c)){return false;
}}return true;},some:function(b,d,e){for(var c in b){if(a.call(b,c)&&d.call(e,b[c],c)){return true;}}return false;},keys:function(b){var d=[];for(var c in b){if(a.call(b,c)){d.push(c);
}}return d;},values:function(c){var b=[];for(var d in c){if(a.call(c,d)){b.push(c[d]);}}return b;},getLength:function(b){return Object.keys(b).length;},keyOf:function(b,d){for(var c in b){if(a.call(b,c)&&b[c]===d){return c;
}}return null;},contains:function(b,c){return Object.keyOf(b,c)!=null;},toQueryString:function(b,c){var d=[];Object.each(b,function(h,g){if(c){g=c+"["+g+"]";
}var f;switch(typeOf(h)){case"object":f=Object.toQueryString(h,g);break;case"array":var e={};h.each(function(k,j){e[j]=k;});f=Object.toQueryString(e,g);
break;default:f=g+"="+encodeURIComponent(h);}if(h!=null){d.push(f);}});return d.join("&");}});})();(function(){var k=this.document;var i=k.window=this;
var b=1;this.$uid=(i.ActiveXObject)?function(e){return(e.uid||(e.uid=[b++]))[0];}:function(e){return e.uid||(e.uid=b++);};$uid(i);$uid(k);var a=navigator.userAgent.toLowerCase(),c=navigator.platform.toLowerCase(),j=a.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0],f=j[1]=="ie"&&k.documentMode;
var o=this.Browser={extend:Function.prototype.extend,name:(j[1]=="version")?j[3]:j[1],version:f||parseFloat((j[1]=="opera"&&j[4])?j[4]:j[2]),Platform:{name:a.match(/ip(?:ad|od|hone)/)?"ios":(a.match(/(?:webos|android)/)||c.match(/mac|win|linux/)||["other"])[0]},Features:{xpath:!!(k.evaluate),air:!!(i.runtime),query:!!(k.querySelector),json:!!(i.JSON)},Plugins:{}};
o[o.name]=true;o[o.name+parseInt(o.version,10)]=true;o.Platform[o.Platform.name]=true;o.Request=(function(){var q=function(){return new XMLHttpRequest();
};var p=function(){return new ActiveXObject("MSXML2.XMLHTTP");};var e=function(){return new ActiveXObject("Microsoft.XMLHTTP");};return Function.attempt(function(){q();
return q;},function(){p();return p;},function(){e();return e;});})();o.Features.xhr=!!(o.Request);var h=(Function.attempt(function(){return navigator.plugins["Shockwave Flash"].description;
},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);o.Plugins.Flash={version:Number(h[0]||"0."+h[1])||0,build:Number(h[2])||0};
o.exec=function(p){if(!p){return p;}if(i.execScript){i.execScript(p);}else{var e=k.createElement("script");e.setAttribute("type","text/javascript");e.text=p;
k.head.appendChild(e);k.head.removeChild(e);}return p;};String.implement("stripScripts",function(p){var e="";var q=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(r,s){e+=s+"\n";
return"";});if(p===true){o.exec(e);}else{if(typeOf(p)=="function"){p(e,q);}}return q;});o.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,p){i[e]=p;});this.Document=k.$constructor=new Type("Document",function(){});
k.$family=Function.from("document").hide();Document.mirror(function(e,p){k[e]=p;});k.html=k.documentElement;k.head=k.getElementsByTagName("head")[0];if(k.execCommand){try{k.execCommand("BackgroundImageCache",false,true);
}catch(g){}}if(this.attachEvent&&!this.addEventListener){var d=function(){this.detachEvent("onunload",d);k.head=k.html=k.window=null;};this.attachEvent("onunload",d);
}var m=Array.from;try{m(k.html.childNodes);}catch(g){Array.from=function(p){if(typeof p!="string"&&Type.isEnumerable(p)&&typeOf(p)!="array"){var e=p.length,q=new Array(e);
while(e--){q[e]=p[e];}return q;}return m(p);};var l=Array.prototype,n=l.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var p=l[e];
Array[e]=function(q){return p.apply(Array.from(q),n.call(arguments,1));};});}}).call(this);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={},q=null,h,l,b,p;while(k&&k.nodeType==3){k=k.parentNode;
}if(n.indexOf("key")!=-1){b=a.which||a.keyCode;p=Object.keyOf(Event.Keys,b);if(n=="keydown"){var d=b-111;if(d>0&&d<13){p="f"+d;}}if(!p){p=String.fromCharCode(b).toLowerCase();
}}else{if((/click|mouse|menu/i).test(n)){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((/DOMMouseScroll|mousewheel/).test(n)){l=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;
}h=(a.which==3)||(a.button==2);if((/over|out/).test(n)){q=a.relatedTarget||a[(n=="mouseover"?"from":"to")+"Element"];var j=function(){while(q&&q.nodeType==3){q=q.parentNode;
}return true;};var g=(Browser.firefox2)?j.attempt():j();q=(g)?q:null;}}else{if((/gesture|touch/i).test(n)){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(q),target:document.id(k),code:b,key:p,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.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);}};}).call(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);
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--;){if(b in c){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){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;}});}).call(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[k.raw]=(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,function(p){return"\\"+p;});};var j=new RegExp("^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".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,G,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(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"});
}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)");
break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break;
case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I);
};}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 j={},l={},b=Object.prototype.toString;
j.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};j.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(b.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML");
};j.setDocument=function(w){var t=w.nodeType;if(t==9){}else{if(t){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return;
}this.document=w;var y=w.documentElement,u=this.getUIDXML(y),o=l[u],A;if(o){for(A in o){this[A]=o[A];}return;}o=l[u]={};o.root=y;o.isXMLDocument=this.isXML(w);
o.brokenStarGEBTN=o.starSelectsClosedQSA=o.idGetsName=o.brokenMixedCaseQSA=o.brokenGEBCN=o.brokenCheckedQSA=o.brokenEmptyAttributeQSA=o.isHTMLDocument=o.nativeMatchesSelector=false;
var m,n,x,q,r;var s,c="slick_uniqueid";var z=w.createElement("div");var p=w.body||w.getElementsByTagName("body")[0]||y;p.appendChild(z);try{z.innerHTML='<a id="'+c+'"></a>';
o.isHTMLDocument=!!w.getElementById(c);}catch(v){}if(o.isHTMLDocument){z.style.display="none";z.appendChild(w.createComment(""));n=(z.getElementsByTagName("*").length>1);
try{z.innerHTML="foo</foo>";s=z.getElementsByTagName("*");m=(s&&!!s.length&&s[0].nodeName.charAt(0)=="/");}catch(v){}o.brokenStarGEBTN=n||m;try{z.innerHTML='<a name="'+c+'"></a><b id="'+c+'"></b>';
o.idGetsName=w.getElementById(c)===z.firstChild;}catch(v){}if(z.getElementsByClassName){try{z.innerHTML='<a class="f"></a><a class="b"></a>';z.getElementsByClassName("b").length;
z.firstChild.className="b";q=(z.getElementsByClassName("b").length!=2);}catch(v){}try{z.innerHTML='<a class="a"></a><a class="f b a"></a>';x=(z.getElementsByClassName("a").length!=2);
}catch(v){}o.brokenGEBCN=q||x;}if(z.querySelectorAll){try{z.innerHTML="foo</foo>";s=z.querySelectorAll("*");o.starSelectsClosedQSA=(s&&!!s.length&&s[0].nodeName.charAt(0)=="/");
}catch(v){}try{z.innerHTML='<a class="MiX"></a>';o.brokenMixedCaseQSA=!z.querySelectorAll(".MiX").length;}catch(v){}try{z.innerHTML='<select><option selected="selected">a</option></select>';
o.brokenCheckedQSA=(z.querySelectorAll(":checked").length==0);}catch(v){}try{z.innerHTML='<a class=""></a>';o.brokenEmptyAttributeQSA=(z.querySelectorAll('[class*=""]').length!=0);
}catch(v){}}try{z.innerHTML='<form action="s"><input id="action"/></form>';r=(z.firstChild.getAttribute("action")!="s");}catch(v){}o.nativeMatchesSelector=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector;
if(o.nativeMatchesSelector){try{o.nativeMatchesSelector.call(y,":slick");o.nativeMatchesSelector=null;}catch(v){}}}try{y.slick_expando=1;delete y.slick_expando;
o.getUID=this.getUIDHTML;}catch(v){o.getUID=this.getUIDXML;}p.removeChild(z);z=s=p=null;o.getAttribute=(o.isHTMLDocument&&r)?function(D,B){var E=this.attributeGetters[B];
if(E){return E.call(D);}var C=D.getAttributeNode(B);return(C)?C.nodeValue:null;}:function(C,B){var D=this.attributeGetters[B];return(D)?D.call(C):C.getAttribute(B);
};o.hasAttribute=(y&&this.isNativeCode(y.hasAttribute))?function(C,B){return C.hasAttribute(B);}:function(C,B){C=C.getAttributeNode(B);return !!(C&&(C.specified||C.nodeValue));
};o.contains=(y&&this.isNativeCode(y.contains))?function(B,C){return B.contains(C);}:(y&&y.compareDocumentPosition)?function(B,C){return B===C||!!(B.compareDocumentPosition(C)&16);
}:function(B,C){if(C){do{if(C===B){return true;}}while((C=C.parentNode));}return false;};o.documentSorter=(y.compareDocumentPosition)?function(C,B){if(!C.compareDocumentPosition||!B.compareDocumentPosition){return 0;
}return C.compareDocumentPosition(B)&4?-1:C===B?0:1;}:("sourceIndex" in y)?function(C,B){if(!C.sourceIndex||!B.sourceIndex){return 0;}return C.sourceIndex-B.sourceIndex;
}:(w.createRange)?function(E,C){if(!E.ownerDocument||!C.ownerDocument){return 0;}var D=E.ownerDocument.createRange(),B=C.ownerDocument.createRange();D.setStart(E,0);
D.setEnd(E,0);B.setStart(C,0);B.setEnd(C,0);return D.compareBoundaryPoints(Range.START_TO_END,B);}:null;y=null;for(A in o){this[A]=o[A];}};var e=/^([#.]?)((?:[\w-]+|\*))$/,g=/\[.+[*$^]=(?:""|'')?\]/,f={};
j.search=function(q,D,O,v){var B=this.found=(v)?null:(O||[]);if(!q){return B;}else{if(q.navigator){q=q.document;}else{if(!q.nodeType){return B;}}}var z,N,s=this.uniques={},y=!!(O&&O.length),c=(q.nodeType==9);
if(this.document!==(c?q:q.ownerDocument)){this.setDocument(q);}if(y){for(N=B.length;N--;){s[this.getUID(B[N])]=true;}}if(typeof D=="string"){var C=D.match(e);
simpleSelectors:if(C){var K=C[1],V=C[2],I,G;if(!K){if(V=="*"&&this.brokenStarGEBTN){break simpleSelectors;}G=q.getElementsByTagName(V);if(v){return G[0]||null;
}for(N=0;I=G[N++];){if(!(y&&s[this.getUID(I)])){B.push(I);}}}else{if(K=="#"){if(!this.isHTMLDocument||!c){break simpleSelectors;}I=q.getElementById(V);
if(!I){return B;}if(this.idGetsName&&I.getAttributeNode("id").nodeValue!=V){break simpleSelectors;}if(v){return I||null;}if(!(y&&s[this.getUID(I)])){B.push(I);
}}else{if(K=="."){if(!this.isHTMLDocument||((!q.getElementsByClassName||this.brokenGEBCN)&&q.querySelectorAll)){break simpleSelectors;}if(q.getElementsByClassName&&!this.brokenGEBCN){G=q.getElementsByClassName(V);
if(v){return G[0]||null;}for(N=0;I=G[N++];){if(!(y&&s[this.getUID(I)])){B.push(I);}}}else{var u=new RegExp("(^|\\s)"+d.escapeRegExp(V)+"(\\s|$)");G=q.getElementsByTagName("*");
for(N=0;I=G[N++];){className=I.className;if(!(className&&u.test(className))){continue;}if(v){return I;}if(!(y&&s[this.getUID(I)])){B.push(I);}}}}}}if(y){this.sort(B);
}return(v)?null:B;}querySelector:if(q.querySelectorAll){if(!this.isHTMLDocument||this.brokenMixedCaseQSA||f[D]||(this.brokenCheckedQSA&&D.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&g.test(D))||d.disableQSA){break querySelector;
}var A=D;if(!c){var M=q.getAttribute("id"),p="slickid__";q.setAttribute("id",p);A="#"+p+" "+A;}try{if(v){return q.querySelector(A)||null;}else{G=q.querySelectorAll(A);
}}catch(P){f[D]=1;break querySelector;}finally{if(!c){if(M){q.setAttribute("id",M);}else{q.removeAttribute("id");}}}if(this.starSelectsClosedQSA){for(N=0;
I=G[N++];){if(I.nodeName>"@"&&!(y&&s[this.getUID(I)])){B.push(I);}}}else{for(N=0;I=G[N++];){if(!(y&&s[this.getUID(I)])){B.push(I);}}}if(y){this.sort(B);
}return B;}z=this.Slick.parse(D);if(!z.length){return B;}}else{if(D==null){return B;}else{if(D.Slick){z=D;}else{if(this.contains(q.documentElement||q,D)){(B)?B.push(D):B=D;
return B;}else{return B;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!y&&(v||(z.length==1&&z.expressions[0].length==1)))?this.pushArray:this.pushUID;
if(B==null){B=[];}var L,H,F;var J,U,E,T,Q,x,t;var w,r,o,R,S=z.expressions;search:for(N=0;(r=S[N]);N++){for(L=0;(o=r[L]);L++){J="combinator:"+o.combinator;
if(!this[J]){continue search;}U=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();E=o.id;T=o.classList;Q=o.classes;x=o.attributes;t=o.pseudos;R=(L===(r.length-1));
this.bitUniques={};if(R){this.uniques=s;this.found=B;}else{this.uniques={};this.found=[];}if(L===0){this[J](q,U,E,Q,x,t,T);if(v&&R&&B.length){break search;
}}else{if(v&&R){for(H=0,F=w.length;H<F;H++){this[J](w[H],U,E,Q,x,t,T);if(B.length){break search;}}}else{for(H=0,F=w.length;H<F;H++){this[J](w[H],U,E,Q,x,t,T);
}}}w=this.found;}}if(y||(z.expressions.length>1)){this.sort(B);}return(v)?(B[0]||null):B;};j.uidx=1;j.uidk="slick-uniqueid";j.getUIDXML=function(m){var c=m.getAttribute(this.uidk);
if(!c){c=this.uidx++;m.setAttribute(this.uidk,c);}return c;};j.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};j.sort=function(c){if(!this.documentSorter){return c;
}c.sort(this.documentSorter);return c;};j.cacheNTH={};j.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;j.parseNTHArgument=function(p){var n=p.match(this.matchNTH);
if(!n){return false;}var o=n[2]||false;var m=n[1]||1;if(m=="-"){m=-1;}var c=+n[3]||0;n=(o=="n")?{a:m,b:c}:(o=="odd")?{a:2,b:1}:(o=="even")?{a:2,b:0}:{a:0,b:m};
return(this.cacheNTH[p]=n);};j.createNTHPseudo=function(o,m,c,n){return function(r,p){var t=this.getUID(r);if(!this[c][t]){var z=r.parentNode;if(!z){return false;
}var q=z[o],s=1;if(n){var y=r.nodeName;do{if(q.nodeName!=y){continue;}this[c][this.getUID(q)]=s++;}while((q=q[m]));}else{do{if(q.nodeType!=1){continue;
}this[c][this.getUID(q)]=s++;}while((q=q[m]));}}p=p||"n";var u=this.cacheNTH[p]||this.parseNTHArgument(p);if(!u){return false;}var x=u.a,w=u.b,v=this[c][t];
if(x==0){return w==v;}if(x>0){if(v<w){return false;}}else{if(w<v){return false;}}return((v-w)%x)==0;};};j.pushArray=function(o,c,q,n,m,p){if(this.matchSelector(o,c,q,n,m,p)){this.found.push(o);
}};j.pushUID=function(p,c,r,o,m,q){var n=this.getUID(p);if(!this.uniques[n]&&this.matchSelector(p,c,r,o,m,q)){this.uniques[n]=true;this.found.push(p);}};
j.matchNode=function(m,n){if(this.isHTMLDocument&&this.nativeMatchesSelector){try{return this.nativeMatchesSelector.call(m,n.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g,'[$1="$2"]'));
}catch(u){}}var t=this.Slick.parse(n);if(!t){return true;}var r=t.expressions,p,s=0,q;for(q=0;(currentExpression=r[q]);q++){if(currentExpression.length==1){var o=currentExpression[0];
if(this.matchSelector(m,(this.isXMLDocument)?o.tag:o.tag.toUpperCase(),o.id,o.classes,o.attributes,o.pseudos)){return true;}s++;}}if(s==t.length){return false;
}var c=this.search(this.document,t),v;for(q=0;v=c[q++];){if(v===m){return true;}}return false;};j.matchPseudo=function(p,c,o){var m="pseudo:"+c;if(this[m]){return this[m](p,o);
}var n=this.getAttribute(p,c);return(o)?o==n:!!n;};j.matchSelector=function(n,u,c,o,p,r){if(u){var s=(this.isXMLDocument)?n.nodeName:n.nodeName.toUpperCase();
if(u=="*"){if(s<"@"){return false;}}else{if(s!=u){return false;}}}if(c&&n.getAttribute("id")!=c){return false;}var q,m,t;if(o){for(q=o.length;q--;){t=n.getAttribute("class")||n.className;
if(!(t&&o[q].regexp.test(t))){return false;}}}if(p){for(q=p.length;q--;){m=p[q];if(m.operator?!m.test(this.getAttribute(n,m.key)):!this.hasAttribute(n,m.key)){return false;
}}}if(r){for(q=r.length;q--;){m=r[q];if(!this.matchPseudo(n,m.key,m.value)){return false;}}}return true;};var i={" ":function(p,v,m,q,r,t,o){var s,u,n;
if(this.isHTMLDocument){getById:if(m){u=this.document.getElementById(m);if((!u&&p.all)||(this.idGetsName&&u&&u.getAttributeNode("id").nodeValue!=m)){n=p.all[m];
if(!n){return;}if(!n[0]){n=[n];}for(s=0;u=n[s++];){var c=u.getAttributeNode("id");if(c&&c.nodeValue==m){this.push(u,v,null,q,r,t);break;}}return;}if(!u){if(this.contains(this.root,p)){return;
}else{break getById;}}else{if(this.document!==p&&!this.contains(p,u)){return;}}this.push(u,v,null,q,r,t);return;}getByClass:if(q&&p.getElementsByClassName&&!this.brokenGEBCN){n=p.getElementsByClassName(o.join(" "));
if(!(n&&n.length)){break getByClass;}for(s=0;u=n[s++];){this.push(u,v,m,null,r,t);}return;}}getByTag:{n=p.getElementsByTagName(v);if(!(n&&n.length)){break getByTag;
}if(!this.brokenStarGEBTN){v=null;}for(s=0;u=n[s++];){this.push(u,v,m,q,r,t);}}},">":function(o,c,q,n,m,p){if((o=o.firstChild)){do{if(o.nodeType==1){this.push(o,c,q,n,m,p);
}}while((o=o.nextSibling));}},"+":function(o,c,q,n,m,p){while((o=o.nextSibling)){if(o.nodeType==1){this.push(o,c,q,n,m,p);break;}}},"^":function(o,c,q,n,m,p){o=o.firstChild;
if(o){if(o.nodeType==1){this.push(o,c,q,n,m,p);}else{this["combinator:+"](o,c,q,n,m,p);}}},"~":function(p,c,r,o,m,q){while((p=p.nextSibling)){if(p.nodeType!=1){continue;
}var n=this.getUID(p);if(this.bitUniques[n]){break;}this.bitUniques[n]=true;this.push(p,c,r,o,m,q);}},"++":function(o,c,q,n,m,p){this["combinator:+"](o,c,q,n,m,p);
this["combinator:!+"](o,c,q,n,m,p);},"~~":function(o,c,q,n,m,p){this["combinator:~"](o,c,q,n,m,p);this["combinator:!~"](o,c,q,n,m,p);},"!":function(o,c,q,n,m,p){while((o=o.parentNode)){if(o!==this.document){this.push(o,c,q,n,m,p);
}}},"!>":function(o,c,q,n,m,p){o=o.parentNode;if(o!==this.document){this.push(o,c,q,n,m,p);}},"!+":function(o,c,q,n,m,p){while((o=o.previousSibling)){if(o.nodeType==1){this.push(o,c,q,n,m,p);
break;}}},"!^":function(o,c,q,n,m,p){o=o.lastChild;if(o){if(o.nodeType==1){this.push(o,c,q,n,m,p);}else{this["combinator:!+"](o,c,q,n,m,p);}}},"!~":function(p,c,r,o,m,q){while((p=p.previousSibling)){if(p.nodeType!=1){continue;
}var n=this.getUID(p);if(this.bitUniques[n]){break;}this.bitUniques[n]=true;this.push(p,c,r,o,m,q);}}};for(var h in i){j["combinator:"+h]=i[h];}var k={empty:function(c){var m=c.firstChild;
return !(m&&m.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,m){return !this.matchNode(c,m);},contains:function(c,m){return(c.innerText||c.textContent||"").indexOf(m)>-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(n){var m=n;while((m=m.previousSibling)){if(m.nodeType==1){return false;}}var c=n;while((c=c.nextSibling)){if(c.nodeType==1){return false;
}}return true;},"nth-child":j.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":j.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":j.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":j.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(m,c){return this["pseudo:nth-child"](m,""+c+1);
},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var m=c.nodeName;
while((c=c.previousSibling)){if(c.nodeName==m){return false;}}return true;},"last-of-type":function(c){var m=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==m){return false;
}}return true;},"only-of-type":function(n){var m=n,o=n.nodeName;while((m=m.previousSibling)){if(m.nodeName==o){return false;}}var c=n;while((c=c.nextSibling)){if(c.nodeName==o){return false;
}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},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 a in k){j["pseudo:"+a]=k[a];}j.attributeGetters={"class":function(){return this.getAttribute("class")||this.className;
},"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");},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;
},type:function(){return this.getAttribute("type");}};var d=j.Slick=(this.Slick||{});d.version="1.1.5";d.search=function(m,n,c){return j.search(m,n,c);
};d.find=function(c,m){return j.search(c,m,null,true);};d.contains=function(c,m){j.setDocument(c);return j.contains(c,m);};d.getAttribute=function(m,c){return j.getAttribute(m,c);
};d.match=function(m,c){if(!(m&&c)){return false;}if(!c||c===m){return true;}j.setDocument(m);return j.matchNode(m,c);};d.defineAttributeGetter=function(c,m){j.attributeGetters[c]=m;
return this;};d.lookupAttributeGetter=function(c){return j.attributeGetters[c];};d.definePseudo=function(c,m){j["pseudo:"+c]=function(o,n){return m.call(o,n);
};return this;};d.lookupPseudo=function(c){var m=j["pseudo:"+c];if(m){return function(n){return m.call(this,n);};}return null;};d.override=function(m,c){j.override(m,c);
return this;};d.isXML=j.isXML;d.uidOf=function(c){return j.getUIDHTML(c);};if(!this.Slick){this.Slick=d;}}).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(!(/^[\w-]+$/).test(b)){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={};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(),unshift:function(){var b=[];for(var c=0,a=arguments.length;
c<a;c++){var d=document.id(arguments[c]);if(d){b.push(d);}}return Array.prototype.unshift.apply(this,b);}.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));}});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 k={},i={};var n={input:"checked",option:"selected",textarea:"value"};
var e=function(p){return(i[p]||(i[p]={}));};var j=function(q){var p=q.uid;if(q.removeEvents){q.removeEvents();}if(q.clearAttributes){q.clearAttributes();
}if(p!=null){delete k[p];delete i[p];}return q;};var o=["defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];
var d=["compact","nowrap","ismap","declare","noshade","checked","disabled","readOnly","multiple","selected","noresize","defer","defaultChecked"];var g={html:"innerHTML","class":"className","for":"htmlFor",text:(function(){var p=document.createElement("div");
return(p.textContent==null)?"innerText":"textContent";})()};var m=["type"];var h=["value","defaultValue"];var l=/^(?:href|src|usemap)$/i;d=d.associate(d);
o=o.associate(o.map(String.toLowerCase));m=m.associate(m);Object.append(g,h.associate(h));var c={before:function(q,p){var r=p.parentNode;if(r){r.insertBefore(q,p);
}},after:function(q,p){var r=p.parentNode;if(r){r.insertBefore(q,p.nextSibling);}},bottom:function(q,p){p.appendChild(q);},top:function(q,p){p.insertBefore(q,p.firstChild);
}};c.inside=c.bottom;var b=function(s,r){if(!s){return r;}s=Object.clone(Slick.parse(s));var q=s.expressions;for(var p=q.length;p--;){q[p][0].combinator=r;
}return s;};Element.implement({set:function(r,q){var p=Element.Properties[r];(p&&p.set)?p.set.call(this,q):this.setProperty(r,q);}.overloadSetter(),get:function(q){var p=Element.Properties[q];
return(p&&p.get)?p.get.apply(this):this.getProperty(q);}.overloadGetter(),erase:function(q){var p=Element.Properties[q];(p&&p.erase)?p.erase.apply(this):this.removeProperty(q);
return this;},setProperty:function(q,r){q=o[q]||q;if(r==null){return this.removeProperty(q);}var p=g[q];(p)?this[p]=r:(d[q])?this[q]=!!r:this.setAttribute(q,""+r);
return this;},setProperties:function(p){for(var q in p){this.setProperty(q,p[q]);}return this;},getProperty:function(q){q=o[q]||q;var p=g[q]||m[q];return(p)?this[p]:(d[q])?!!this[q]:(l.test(q)?this.getAttribute(q,2):(p=this.getAttributeNode(q))?p.nodeValue:null)||null;
},getProperties:function(){var p=Array.from(arguments);return p.map(this.getProperty,this).associate(p);},removeProperty:function(q){q=o[q]||q;var p=g[q];
(p)?this[p]="":(d[q])?this[q]=false:this.removeAttribute(q);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
},hasClass:function(p){return this.className.clean().contains(p," ");},addClass:function(p){if(!this.hasClass(p)){this.className=(this.className+" "+p).clean();
}return this;},removeClass:function(p){this.className=this.className.replace(new RegExp("(^|\\s)"+p+"(?:\\s|$)"),"$1");return this;},toggleClass:function(p,q){if(q==null){q=!this.hasClass(p);
}return(q)?this.addClass(p):this.removeClass(p);},adopt:function(){var s=this,p,u=Array.flatten(arguments),t=u.length;if(t>1){s=p=document.createDocumentFragment();
}for(var r=0;r<t;r++){var q=document.id(u[r],true);if(q){s.appendChild(q);}}if(p){this.appendChild(p);}return this;},appendText:function(q,p){return this.grab(this.getDocument().newTextNode(q),p);
},grab:function(q,p){c[p||"bottom"](document.id(q,true),this);return this;},inject:function(q,p){c[p||"bottom"](this,document.id(q,true));return this;},replaces:function(p){p=document.id(p,true);
p.parentNode.replaceChild(this,p);return this;},wraps:function(q,p){q=document.id(q,true);return this.replaces(q).grab(q,p);},getPrevious:function(p){return document.id(Slick.find(this,b(p,"!~")));
},getAllPrevious:function(p){return Slick.search(this,b(p,"!~"),new Elements);},getNext:function(p){return document.id(Slick.find(this,b(p,"~")));},getAllNext:function(p){return Slick.search(this,b(p,"~"),new Elements);
},getFirst:function(p){return document.id(Slick.search(this,b(p,">"))[0]);},getLast:function(p){return document.id(Slick.search(this,b(p,">")).getLast());
},getParent:function(p){return document.id(Slick.find(this,b(p,"!")));},getParents:function(p){return Slick.search(this,b(p,"!"),new Elements);},getSiblings:function(p){return Slick.search(this,b(p,"~~"),new Elements);
},getChildren:function(p){return Slick.search(this,b(p,">"),new Elements);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
},getElementById:function(p){return document.id(Slick.find(this,"#"+(""+p).replace(/(\W)/g,"\\$1")));},getSelected:function(){this.selectedIndex;return new Elements(Array.from(this.options).filter(function(p){return p.selected;
}));},toQueryString:function(){var p=[];this.getElements("input, select, textarea").each(function(r){var q=r.type;if(!r.name||r.disabled||q=="submit"||q=="reset"||q=="file"||q=="image"){return;
}var s=(r.get("tag")=="select")?r.getSelected().map(function(t){return document.id(t).get("value");}):((q=="radio"||q=="checkbox")&&!r.checked)?null:r.get("value");
Array.from(s).each(function(t){if(typeof t!="undefined"){p.push(encodeURIComponent(r.name)+"="+encodeURIComponent(t));}});});return p.join("&");},destroy:function(){var p=j(this).getElementsByTagName("*");
Array.each(p,j);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(p){return !p||Slick.match(this,p);}});var a=function(t,s,q){if(!q){t.setAttributeNode(document.createAttribute("id"));}if(t.clearAttributes){t.clearAttributes();
t.mergeAttributes(s);t.removeAttribute("uid");if(t.options){var u=t.options,p=s.options;for(var r=u.length;r--;){u[r].selected=p[r].selected;}}}var v=n[s.tagName.toLowerCase()];
if(v&&s[v]){t[v]=s[v];}};Element.implement("clone",function(r,p){r=r!==false;var w=this.cloneNode(r),q;if(r){var s=w.getElementsByTagName("*"),u=this.getElementsByTagName("*");
for(q=s.length;q--;){a(s[q],u[q],p);}}a(w,this,p);if(Browser.ie){var t=w.getElementsByTagName("object"),v=this.getElementsByTagName("object");for(q=t.length;
q--;){t[q].outerHTML=v[q].outerHTML;}}return document.id(w);});var f={contains:function(p){return Slick.contains(this,p);}};if(!document.contains){Document.implement(f);
}if(!document.createElement("div").contains){Element.implement(f);}[Element,Window,Document].invoke("implement",{addListener:function(s,r){if(s=="unload"){var p=r,q=this;
r=function(){q.removeListener("unload",r);p();};}else{k[$uid(this)]=this;}if(this.addEventListener){this.addEventListener(s,r,!!arguments[2]);}else{this.attachEvent("on"+s,r);
}return this;},removeListener:function(q,p){if(this.removeEventListener){this.removeEventListener(q,p,!!arguments[2]);}else{this.detachEvent("on"+q,p);
}return this;},retrieve:function(q,p){var s=e($uid(this)),r=s[q];if(p!=null&&r==null){r=s[q]=p;}return r!=null?r:null;},store:function(q,p){var r=e($uid(this));
r[q]=p;return this;},eliminate:function(p){var q=e($uid(this));delete q[p];return this;}});if(window.attachEvent&&!window.addEventListener){window.addListener("unload",function(){Object.each(k,j);
if(window.CollectGarbage){CollectGarbage();}});}})();Element.Properties={};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=d.test(h)?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((/^(height|width)$/).test(l)){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((/^border(.+)Width|margin|padding/).test(l)){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.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(@, @, @)";});}).call(this);(function(){Element.Properties.events={set:function(b){this.addEvents(b);
}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{});if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;
}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h);}if(b.condition){d=function(k){if(b.condition.call(this,k)){return h.call(this,k);
}return true;};}g=b.base||g;}var e=function(){return h.call(j);};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new Event(k,j.getWindow());
if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]);}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");
if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d);if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];
if(f){if(f.onRemove){f.onRemove.call(this,d);}e=f.base||e;}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);
}return this;},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");
if(!c){return this;}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);
delete c[b];}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c);
}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b);
}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});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(b){var c=b.relatedTarget;if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c));
};Element.Events={mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};
}).call(this);(function(){var h=document.createElement("div"),e=document.createElement("div");h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);
h=e=null;var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName);};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n);
}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};
},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(a(this)){return this.getWindow().getScroll();
}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0};while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop;
n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}var n=(k(m,"position")=="static")?i:l;
while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null;}try{return m.offsetParent;
}catch(n){}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var r=this.getBoundingClientRect(),o=document.id(this.getDocument().documentElement),q=o.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed");
return{x:r.left.toInt()+t.x+((s)?0:q.x)-o.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-o.clientTop};}var n=this,m={x:0,y:0};if(a(this)){return m;}while(n&&!a(n)){m.x+=n.offsetLeft;
m.y+=n.offsetTop;if(Browser.firefox){if(!c(n)){m.x+=b(n);m.y+=g(n);}var p=n.parentNode;if(p&&k(p,"overflow")!="visible"){m.x+=b(p);m.y+=g(p);}}else{if(n!=this&&Browser.safari){m.x+=b(n);
m.y+=g(n);}}n=n.offsetParent;}if(Browser.firefox&&!c(this)){m.x-=b(this);m.y-=g(this);}return m;},getPosition:function(p){if(a(this)){return{x:0,y:0};}var q=this.getOffsets(),n=this.getScrolls();
var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates();
}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")};
},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight};
},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body;
return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize();
return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box";
}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName);
}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}}).call(this);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 f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,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(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval;
this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame<this.frames){var j=this.transition(this.frame/this.frames);this.set(this.compute(this.from,this.to,j));
}else{this.frame=this.frames;this.set(this.compute(this.from,this.to,1));this.stop();}},set:function(g){return g;},compute:function(i,h,g){return f.compute(i,h,g);
},check:function(){if(!this.isRunning()){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(k,j){if(!this.check(k,j)){return this;}this.from=k;this.to=j;this.frame=(this.options.frameSkip)?0:-1;this.time=null;
this.transition=this.getTransition();var i=this.options.frames,h=this.options.fps,g=this.options.duration;this.duration=f.Durations[g]||g.toInt();this.frameInterval=1000/h;
this.frames=i||Math.round(this.duration/this.frameInterval);this.fireEvent("start",this.subject);b.call(this,h);return this;},stop:function(){if(this.isRunning()){this.time=null;
d.call(this,this.options.fps);if(this.frames==this.frame){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
}}else{this.fireEvent("stop",this.subject);}}return this;},cancel:function(){if(this.isRunning()){this.time=null;d.call(this,this.options.fps);this.frame=this.frames;
this.fireEvent("cancel",this.subject).clearChain();}return this;},pause:function(){if(this.isRunning()){this.time=null;d.call(this,this.options.fps);}return this;
},resume:function(){if((this.frame<this.frames)&&!this.isRunning()){b.call(this,this.options.fps);}return this;},isRunning:function(){var g=e[this.options.fps];
return g&&g.contains(this);}});f.compute=function(i,h,g){return(h-i)*g+i;};f.Durations={"short":250,normal:500,"long":1000};var e={},c={};var a=function(){var h=Date.now();
for(var j=this.length;j--;){var g=this[j];if(g){g.step(h);}}};var b=function(h){var g=e[h]||(e[h]=[]);g.push(this);if(!c[h]){c[h]=a.periodical(Math.round(1000/h),g);
}};var d=function(h){var g=e[h];if(g){g.erase(this);if(!g.length&&c[h]){delete e[h];c[h]=clearInterval(c[h]);}}};}).call(this);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 c={},b=new RegExp("^"+a.escapeRegExp()+"$");
Array.each(document.styleSheets,function(f,e){var d=f.href;if(d&&d.contains("://")&&!d.contains(document.domain)){return;}var g=f.rules||f.cssRules;Array.each(g,function(k,h){if(!k.style){return;
}var j=(k.selectorText)?k.selectorText.replace(/^\w+/,function(i){return i.toLowerCase();}):null;if(!j||!b.test(j)){return;}Object.each(Element.Styles,function(l,i){if(!k.style[i]||Element.ShortStyles[i]){return;
}l=String(k.style[i]);c[i]=((/^rgb/).test(l))?l.rgbToHex():l;});});});return Fx.CSS.Cache[a]=c;}});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.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(c,b){b=Array.from(b);
var a=function(d){return c(d,b);};return Object.append(a,{easeIn:a,easeOut:function(d){return 1-c(1-d,b);},easeInOut:function(d){return(d<=0.5?c(2*d,b):(2-c(2*(1-d),b)))/2;
}});};Fx.Transitions={linear:function(a){return a;}};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.cos(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 d=function(){},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(e){this.xhr=new Browser.Request();
this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false;
this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d;
}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 e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e);
}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},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(e){this.fireEvent("loadstart",[e,this.xhr]);
},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f;
return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.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(o){if(!this.check(o)){return this;
}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options;
o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString();
break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e;
j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g;
}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.contains("?")?"&":"?")+String.uniqueID();
}if(j&&e=="get"){f+=(f.contains("?")?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this);
}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true;
}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]);
}},this);this.fireEvent("request");n.send(j);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 e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d;
if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e};
if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e);
return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")});
this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.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(typeof JSON=="undefined"){this.JSON={};}(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};
var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4);};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"");
return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON();
}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[];
Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj;
case"null":return"null";}return null;};JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure||JSON.secure){if(JSON.parse){return JSON.parse(string);
}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure.");}}return eval("("+string+")");
};}).call(this);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;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure();
}else{this.onSuccess(b,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 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()].append(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);};}).call(this);

/* mootools-more.js
----------------------------------------------------------------------------------------------------- */

// MooTools: the javascript framework.
// Load this file's selection again by visiting: http://mootools.net/more/2a6459ede7952b36e4a11ae5990761bb 
// Or build this file again with packager using: packager build More/Hash More/Element.Position More/Fx.Reveal More/Fx.Scroll More/Drag More/Drag.Move
/*
---
copyrights:
  - [MooTools](http://mootools.net)

licenses:
  - [MIT License](http://mootools.net/license.txt)
...
*/
MooTools.More={version:"1.3.1.1",build:"0292a3af1eea242b817fecf9daa127417d10d4ce"};(function(){if(this.Hash){return;}var a=this.Hash=new Type("Hash",function(b){if(typeOf(b)=="hash"){b=Object.clone(b.getClean());
}for(var c in b){this[c]=b[c];}return this;});this.$H=function(b){return new a(b);};a.implement({forEach:function(b,c){Object.forEach(this,b,c);},getClean:function(){var c={};
for(var b in this){if(this.hasOwnProperty(b)){c[b]=this[b];}}return c;},getLength:function(){var c=0;for(var b in this){if(this.hasOwnProperty(b)){c++;
}}return c;}});a.alias("each","forEach");a.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){return Object.keyOf(this,b);},hasValue:function(b){return Object.contains(this,b);
},extend:function(b){a.each(b||{},function(d,c){a.set(this,c,d);},this);return this;},combine:function(b){a.each(b||{},function(d,c){a.include(this,c,d);
},this);return this;},erase:function(b){if(this.hasOwnProperty(b)){delete this[b];}return this;},get:function(b){return(this.hasOwnProperty(b))?this[b]:null;
},set:function(b,c){if(!this[b]||this.hasOwnProperty(b)){this[b]=c;}return this;},empty:function(){a.each(this,function(c,b){delete this[b];},this);return this;
},include:function(b,c){if(this[b]==undefined){this[b]=c;}return this;},map:function(b,c){return new a(Object.map(this,b,c));},filter:function(b,c){return new a(Object.filter(this,b,c));
},every:function(b,c){return Object.every(this,b,c);},some:function(b,c){return Object.some(this,b,c);},getKeys:function(){return Object.keys(this);},getValues:function(){return Object.values(this);
},toQueryString:function(b){return Object.toQueryString(this,b);}});a.alias({indexOf:"keyOf",contains:"hasValue"});}).call(this);(function(){var b=function(e,d){var f=[];
Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":""));});});});return f;};var c=function(f,e){var d=0;
Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth);};Element.implement({measure:function(h){if(a(this)){return h.call(this);
}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose());g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();
});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){};}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});
return function(){this.style.cssText=d;}.bind(this);},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize();
};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height});
},getComputedSize:function(d){d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d);var g={},e={width:0,height:0},f;
if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height;}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt();
},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h);if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt();
e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l;e["total"+k]+=l;});},this);return Object.append(e,g);}});}).call(this);(function(){var a=Element.prototype.position;
Element.implement({position:function(g){if(g&&(g.x!=null||g.y!=null)){return a?a.apply(this,arguments):this;}Object.each(g||{},function(u,t){if(u==null){delete g[t];
}});g=Object.merge({relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},g);var r={x:0,y:0},e=false;var c=this.measure(function(){return document.id(this.getOffsetParent());
});if(c&&c!=this.getDocument().body){r=c.measure(function(){return this.getPosition();});e=c!=document.id(g.relativeTo);g.offset.x=g.offset.x-r.x;g.offset.y=g.offset.y-r.y;
}var s=function(t){if(typeOf(t)!="string"){return t;}t=t.toLowerCase();var u={};if(t.test("left")){u.x="left";}else{if(t.test("right")){u.x="right";}else{u.x="center";
}}if(t.test("upper")||t.test("top")){u.y="top";}else{if(t.test("bottom")){u.y="bottom";}else{u.y="center";}}return u;};g.edge=s(g.edge);g.position=s(g.position);
if(!g.edge){if(g.position.x=="center"&&g.position.y=="center"){g.edge={x:"center",y:"center"};}else{g.edge={x:"left",y:"top"};}}this.setStyle("position","absolute");
var f=document.id(g.relativeTo)||document.body,d=f==document.body?window.getScroll():f.getPosition(),l=d.y,h=d.x;var n=this.getDimensions({computeSize:true,styles:["padding","border","margin"]});
var j={},o=g.offset.y,q=g.offset.x,k=window.getSize();switch(g.position.x){case"left":j.x=h+q;break;case"right":j.x=h+q+f.offsetWidth;break;default:j.x=h+((f==document.body?k.x:f.offsetWidth)/2)+q;
break;}switch(g.position.y){case"top":j.y=l+o;break;case"bottom":j.y=l+o+f.offsetHeight;break;default:j.y=l+((f==document.body?k.y:f.offsetHeight)/2)+o;
break;}if(g.edge){var b={};switch(g.edge.x){case"left":b.x=0;break;case"right":b.x=-n.x-n.computedRight-n.computedLeft;break;default:b.x=-(n.totalWidth/2);
break;}switch(g.edge.y){case"top":b.y=0;break;case"bottom":b.y=-n.y-n.computedTop-n.computedBottom;break;default:b.y=-(n.totalHeight/2);break;}j.x+=b.x;
j.y+=b.y;}j={left:((j.x>=0||e||g.allowNegative)?j.x:0).toInt(),top:((j.y>=0||e||g.allowNegative)?j.y:0).toInt()};var i={left:"x",top:"y"};["minimum","maximum"].each(function(t){["left","top"].each(function(u){var v=g[t]?g[t][i[u]]:null;
if(v!=null&&((t=="minimum")?j[u]<v:j[u]>v)){j[u]=v;}});});if(f.getStyle("position")=="fixed"||g.relFixedPosition){var m=window.getScroll();j.top+=m.y;j.left+=m.x;
}if(g.ignoreScroll){var p=f.getScroll();j.top-=p.y;j.left-=p.x;}if(g.ignoreMargins){j.left+=(g.edge.x=="right"?n["margin-right"]:g.edge.x=="center"?-n["margin-left"]+((n["margin-right"]+n["margin-left"])/2):-n["margin-left"]);
j.top+=(g.edge.y=="bottom"?n["margin-bottom"]:g.edge.y=="center"?-n["margin-top"]+((n["margin-bottom"]+n["margin-top"])/2):-n["margin-top"]);}j.left=Math.ceil(j.left);
j.top=Math.ceil(j.top);if(g.returnPos){return j;}else{this.setStyles(j);}return this;}});}).call(this);Element.implement({isDisplayed:function(){return this.getStyle("display")!="none";
},isVisible:function(){var a=this.offsetWidth,b=this.offsetHeight;return(a==0&&b==0)?false:(a>0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"]();
},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none");
},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a);
},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection();
if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs;
if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null;
};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:!Browser.ie6,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row";
},opacity:1,hideInputs:Browser.ie?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true;
this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"});
var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText;
this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c);
}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this));
}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false;
this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt();
}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)};
Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText;
this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible");
}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element);
}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal();
}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments);
if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b);
return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal;
Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve();
return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"]();
}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options);
b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});}).call(this);(function(){Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(c,b){this.element=this.subject=document.id(c);
this.parent(b);if(typeOf(this.element)!="element"){this.element=document.id(this.element.getDocument().body);}if(this.options.wheelStops){var d=this.element,e=this.cancel.pass(false,this);
this.addEvent("start",function(){d.addEvent("mousewheel",e);},true);this.addEvent("complete",function(){d.removeEvent("mousewheel",e);},true);}},set:function(){var b=Array.flatten(arguments);
if(Browser.firefox){b=[Math.round(b[0]),Math.round(b[1])];}this.element.scrollTo(b[0],b[1]);},compute:function(d,c,b){return[0,1].map(function(e){return Fx.compute(d[e],c[e],b);
});},start:function(c,d){if(!this.check(c,d)){return this;}var b=this.element.getScroll();return this.parent([b.x,b.y],[c,d]);},calculateScroll:function(g,f){var d=this.element,b=d.getScrollSize(),h=d.getScroll(),j=d.getSize(),c=this.options.offset,i={x:g,y:f};
for(var e in i){if(!i[e]&&i[e]!==0){i[e]=h[e];}if(typeOf(i[e])!="number"){i[e]=b[e]-j[e];}i[e]+=c[e];}return[i.x,i.y];},toTop:function(){return this.start.apply(this,this.calculateScroll(false,0));
},toLeft:function(){return this.start.apply(this,this.calculateScroll(0,false));},toRight:function(){return this.start.apply(this,this.calculateScroll("right",false));
},toBottom:function(){return this.start.apply(this,this.calculateScroll(false,"bottom"));},toElement:function(d,e){e=e?Array.from(e):["x","y"];var c=a(this.element)?{x:0,y:0}:this.element.getScroll();
var b=Object.map(document.id(d).getPosition(this.element),function(g,f){return e.contains(f)?g+c[f]:false;});return this.start.apply(this,this.calculateScroll(b.x,b.y));
},toElementEdge:function(d,g,e){g=g?Array.from(g):["x","y"];d=document.id(d);var i={},f=d.getPosition(this.element),j=d.getSize(),h=this.element.getScroll(),b=this.element.getSize(),c={x:f.x+j.x,y:f.y+j.y};
["x","y"].each(function(k){if(g.contains(k)){if(c[k]>h[k]+b[k]){i[k]=c[k]-b[k];}if(f[k]<h[k]){i[k]=f[k];}}if(i[k]==null){i[k]=h[k];}if(e&&e[k]){i[k]=i[k]+e[k];
}},this);if(i.x!=h.x||i.y!=h.y){this.start(i.x,i.y);}return this;},toElementCenter:function(e,f,h){f=f?Array.from(f):["x","y"];e=document.id(e);var i={},c=e.getPosition(this.element),d=e.getSize(),b=this.element.getScroll(),g=this.element.getSize();
["x","y"].each(function(j){if(f.contains(j)){i[j]=c[j]-(g[j]-d[j])/2;}if(i[j]==null){i[j]=b[j];}if(h&&h[j]){i[j]=i[j]+h[j];}},this);if(i.x!=b.x||i.y!=b.y){this.start(i.x,i.y);
}return this;}});function a(b){return(/^(?:body|html)$/i).test(b.tagName);}}).call(this);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));}});Drag.Move=new Class({Extends:Drag,options:{droppables:[],container:false,precalculate:false,includeMargins:true,checkDroppables:true},initialize:function(b,a){this.parent(b,a);
b=this.element;this.droppables=$$(this.options.droppables);this.container=document.id(this.options.container);if(this.container&&typeOf(this.container)!="element"){this.container=document.id(this.container.getDocument().body);
}if(this.options.style){if(this.options.modifiers.x=="left"&&this.options.modifiers.y=="top"){var e,c=b.getOffsetParent();var d=b.getStyles("left","top");
if(c&&(d.left=="auto"||d.top=="auto")){b.setPosition(b.getPosition(c));}}if(b.getStyle("position")=="static"){b.setStyle("position","absolute");}}this.addEvent("start",this.checkDroppables,true);
this.overed=null;},start:function(a){if(this.container){this.options.limit=this.calculateLimit();}if(this.options.precalculate){this.positions=this.droppables.map(function(b){return b.getCoordinates();
});}this.parent(a);},calculateLimit:function(){var j=this.element,e=this.container,d=document.id(j.getOffsetParent())||document.body,h=e.getCoordinates(d),c={},b={},k={},g={},m={};
["top","right","bottom","left"].each(function(q){c[q]=j.getStyle("margin-"+q).toInt();b[q]=j.getStyle("border-"+q).toInt();k[q]=e.getStyle("margin-"+q).toInt();
g[q]=e.getStyle("border-"+q).toInt();m[q]=d.getStyle("padding-"+q).toInt();},this);var f=j.offsetWidth+c.left+c.right,p=j.offsetHeight+c.top+c.bottom,i=0,l=0,o=h.right-g.right-f,a=h.bottom-g.bottom-p;
if(this.options.includeMargins){i+=c.left;l+=c.top;}else{o+=c.right;a+=c.bottom;}if(j.getStyle("position")=="relative"){var n=j.getCoordinates(d);n.left-=j.getStyle("left").toInt();
n.top-=j.getStyle("top").toInt();i-=n.left;l-=n.top;if(e.getStyle("position")!="relative"){i+=g.left;l+=g.top;}o+=c.left-n.left;a+=c.top-n.top;if(e!=d){i+=k.left+m.left;
l+=((Browser.ie6||Browser.ie7)?0:k.top)+m.top;}}else{i-=c.left;l-=c.top;if(e!=d){i+=h.left+g.left;l+=h.top+g.top;}}return{x:[i,o],y:[l,a]};},getDroppableCoordinates:function(c){var b=c.getCoordinates();
if(c.getStyle("position")=="fixed"){var a=window.getScroll();b.left+=a.x;b.right+=a.x;b.top+=a.y;b.bottom+=a.y;}return b;},checkDroppables:function(){var a=this.droppables.filter(function(d,c){d=this.positions?this.positions[c]:this.getDroppableCoordinates(d);
var b=this.mouse.now;return(b.x>d.left&&b.x<d.right&&b.y<d.bottom&&b.y>d.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]);
}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables();
}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a);
this.store("dragger",b);return b;}});

/* mootools-kemso.js
----------------------------------------------------------------------------------------------------- */

/*
---
Kemso More Extensions

copyrights:
  - [Kemso](http://kemso.com)

licenses:
  - You may not under any circumstances copy, redistribute, or re-sell this code, 
  	or use it as the basis for another site or application.
  - You may modify this code for the purposes of modifying a single insillation of the 
  	purchased product which which this code was distributed
  - http://whiteloupe.com/license.txt
...
*/



/*
---
MooTools: Kemso extensions

/*
---

name: Kemso

description: Mootools additions by Kemso

license: MIT-style license.

authors: Kemso, LLC (http://www.kemso.com)

provides: [Kemso]

...
*/

(function(){

this.Kemso = {
	version: '1.3'
};

// trace

var show_trace_hud = true;
var trace_hud_levels = ['debug', 'error'];

var trace = this.trace = function(){
	if(show_trace_hud){
		var level = false;
		var str = '';
		
		if(arguments.length == 2) level = arguments[0], str = arguments[1];
		else str = arguments[0];
		
		if(level && ! trace_hud_levels.contains(level.toLocaleLowerCase())) return false;
		if(level) str = level.toUpperCase()+' --> '+str;
		
		var hud = false;
		if( ! $('trace_hud')){
			hud = new Element('div', {
				'id': 'trace_hud',
				'styles': {
					'position': 'fixed',
					'z-index': '40',
					'top': '10px',
					'right': '10px',
					'width': Math.min($(document.body).getSize().x - 40, 400),
					'padding': '10px',
					'background-color': '#000',
					'color': '#FFF',
					'font-size': '11px',
					'opacity': .9,
					'font-family': 'Helvetica'
				}
			}).inject($(document.body), 'bottom');
			new Element('a', {'href': '#', 'class': 'hud_close', 'text': 'close'}).inject(hud).addEvent('click', function(e){
				e.stop();
				$('trace_hud').fade(0);
			});
			hud.appendText(' | ');
			new Element('a', {'href': '#', 'class': 'hud_close', 'text': 'off'}).inject(hud).addEvent('click', function(e){
				e.stop();
				window.show_trace_hud = false;
				$('trace_hud').fade(0);
			});
			new Element('div', {'class': 'hud_content', 'styles': {'position': 'static', 'max-height': 200, 'overflow-y': 'auto'}}).inject(hud);
		}else{
			hud = $('trace_hud');
		}
		var new_item = new Element('div', {'text': str, 'styles': {'border-bottom': '1px dotted #333'}}).inject(hud.getElement('.hud_content'));
		$('trace_hud').set('styles', {'display': 'block', 'visibility': 'visible', 'opacity': .9});
		hud.getElement('.hud_content').scrollTo(0, hud.getElement('.hud_content').getScrollSize().y - hud.getElement('.hud_content').getSize().y);
	}
};


// Alternate - adds even/odd classes to a collection of elements

var alternate = this.alternate = function(alternations){
	for(var i = 0, l = alternations.length; i < l; i++){
		var obj = $(alternations[i]);
		if(obj.getStyle('display') == 'none') continue;
		if (i % 2 == 0) obj.removeClass('even').addClass('odd');
		else obj.removeClass('odd').addClass('even');
	}
};


// Return stored class reference
var $C = this.$C = function(el){ return $(el).retrieve('ClassRef'); };


})();




/* Add to the Element Class */
Element.implement({

	getIndex: function(selector){
		var parent = this.getParent();
		if( ! parent) return 0;
		var children = parent.getChildren(selector);
		for(var i = 0, l = children.length; i < l; i++) if(children[i] == this) return i;
		return 0;
	},
	
	off: function(){
		if( ! this.retrieve('init_display_state') && this.getStyle('display') != 'none') this.store('init_display_state', this.getStyle('display'));
		this.setStyle('display', 'none');
		return this;
	},
	
	on: function(options){
		if(this.getStyle('display') != 'none') return this;
		this.setStyles(Object.append({opacity: 1, display: this.retrieve('init_display_state', 'block')}, options));
		return this;
	},
	
	toggle: function(){
		if(this.getStyle('display') != 'none') this.off(); else this.on();
		return this;
	},
	
	fadeOut: function(opts){
		options = Object.merge({ duration: 200, delay: 0, onComplete: function(){} }, opts);
		this.set('morph', {duration: options.duration, transition: Fx.Transitions.Quint.easeOut}).morph({opacity: 0});
		this.get('morph').addEvent('complete', options.onComplete).addEvent('complete', function(){
			$(this).setStyles({'visibility': 'visible', 'display': 'none', 'opacity': 1});
		}.bind(this));
		return this;
	},
	
	kill: function(opts){		
		this.fadeOut({onComplete: function(){ if(this) this.destroy(); }.bind(this)});
		return this;
	}
});



/*
---
description: Added the onhashchange event

license: MIT-style

authors: 
- sdf1981cgn
- Greggory Hernandez

requires: 
- core/1.2.4: '*'

provides: [Element.Events.hashchange]

...
*/
Element.Events.hashchange = {
    onAdd: function(){
        var hash = self.location.hash;

        var hashchange = function(){
            if (hash == self.location.hash) return;
            else hash = self.location.hash;

            var value = (hash.indexOf('#') == 0 ? hash.substr(1) : hash);
            window.fireEvent('hashchange', value);
            document.fireEvent('hashchange', value);
        };

        if ("onhashchange" in window){
            window.onhashchange = hashchange;
        } else {
            hashchange.periodical(50);
        }
    }
};

function location_hash(hash)
{
	if(typeOf(hash) == 'number') return location_hash_segment(hash);
	if(typeof(hash) != 'undefined') window.location.hash = hash;
	return window.location.hash.length > 1 ? window.location.hash.substr(1) : '';
}

function location_hash_segment(num)
{
	var hash = location_hash();
	if(hash.substr(0, 1) == '/') hash = hash.substr(1);
	if(hash.substr(-1) == '/') hash = hash.substr(0, hash.length - 1); // Don't think this works in IE
	
	var parts = hash.split('/');
	if(typeOf(parts[num]) == 'null') return false;
	return parts[num];
}


var LocationHash = new Class({
	
	Implements: [Options, Events],
	
	options: {
		seperator: '/',
		schema: ['controller', 'method'],
		listen_only: false
	},
	
	parts: [],
	
	initialize: function(options)
	{
		this.setOptions(options);
		this.fire_change = true;
		window.addEvent('hashchange', this.onChange.bind(this));
		
        this.parts = location_hash().split(this.options.seperator);
	},
	
	onChange: function(value)
	{
		var oldparts = this.parts;
		var changes = [];
		this.parts = value.split(this.options.seperator);
		
		this.parts.each(function(item, key){
			if(item != oldparts[key]) changes.push(true); else changes.push(false);
		});
		
		if( ! this.fire_change)
		{
			this.fire_change = true;
		}
		else
		{
			this.fireEvent('change', [this.get(), this.parts, oldparts, changes]);
		}
	},
	
	set: function()
	{
		var hash = [];
		
		// Pass an object to change only specific parts of the hash
		if(typeOf(arguments[0]) == 'object')
		{
			hash = Array.clone(this.parts);
			for(var i in arguments[0]) hash.splice(i, 1, arguments[0][i]);
		}
		
		// Pass an array
		else if(typeOf(arguments[0]) == 'array')
		{
			hash = arguments[0];
		}
		
		// Parts as arguments
		else
		{
			for(var i = 0, l = arguments.length; i < l; i++) hash.push(arguments[i]);
		}
		
		hash = hash.join(this.options.seperator);
		
		// If we're we're in listen only mode AND the hash is different, don't fire change.
		if(this.options.listen_only && location_hash() != hash) this.fire_change = false;
		
		location_hash(hash);
	},
	
	
	get: function()
	{
		if(this.options.schema)
		{
			var schema = {arguments: false};
			this.options.schema.each(function(name, key){
				schema[name] = this.parts[key];
			}.bind(this));
			
			if(this.parts.length > this.options.schema.length) schema.arguments = this.parts.slice(this.options.schema.length);
			
			return schema;
		}
		else
		{
			return this.parts;
		}
	},
	
	
	schema: function()
	{
		this.options.schema = arguments;
		return this;
	}
	
});




/*
---
 
name: Kemso.Scrollbar
description: A MooTools Overflow scrollbar class

version: 1.0
copyright: Kemso, LLC (http://kemso.com)
license: MIT License
authors:
- Matt McCloskey

requires: [MooTools Core, More/Drag]

provides: Kemso.ScrollBar
 
...
*/


/* Implement a new Set method of Fx to fire an update event for the scroll bar */
Fx.implement({
	step: function(now){
		if (this.options.frameSkip){
			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
			this.time = now;
			this.frame += frames;
		} else {
			this.frame++;
		}
		
		if (this.frame < this.frames){
			var delta = this.transition(this.frame / this.frames);
			this.set(this.compute(this.from, this.to, delta));
			this.fireEvent('update');
		} else {
			this.frame = this.frames;
			this.set(this.compute(this.from, this.to, 1));
			this.stop();
		}
	},
});


/* Create a scroll bar from existing elements */
Kemso.ScrollBar = new Class({
	
	Implements: [Options, Events],

	options: {
		axis: 'y',
		trackClick: true,
		wheel: true,
		wheelSensitivity: 4,
		minHandleSize: 30,
		autoResize: true,
		events: {}
	},

	initialize: function(content, track, handle, options){
		this.setOptions(options);
		
		if(Browser.firefox) this.options.wheelSensitivity = .5;
		if(Browser.chrome) this.options.wheelSensitivity = .1;
		
		this.addEvents(this.options.events);
		
		/* Elements */
		this.content = document.id(content);
		this.control = false;
		if(typeOf(track) != 'null' && track) this.control = new Kemso.ScrollBar.Track(handle, track, this.options).addEvents({
			'move': this.update.bind(this)
		});
		
		this.has_scroll = false;
		this.scroll_pos = {x:0, y:0};
		this.wheel_last_value = 0;
		this.wheel_speed = 0;
			
		this.resize();		
		
		if(this.options.wheel)
		{
			this.content.addEvent('mousewheel', this.mousewheel.bind(this));
			if(this.control) this.control.track.addEvent('mousewheel', this.mousewheel.bind(this));
		}
				
		// Autoresize with window
		if(this.options.autoResize) window.addEvent('resize', this.resize.bind(this));
		
		// Is it an iPad?
		// Scroll Effect
		var desktop_touch = false; //Browser.safari;
		if(typeOf(Touch.Scroll) != 'null' && (desktop_touch || Browser.Platform.ios || Browser.Platform.android || Browser.Platform.webos))
		{
			// There has to be a wrapper around the content here for touch scroll to work.
			if(this.content.getChildren().length > 1)
			{
				var wrap = new Element('div', {'class': 'scroll-container-wrapper'});
				this.content.getChildren().each(function(el){
					el.inject(wrap);
				});
				wrap.inject(this.content);
			}
			
			this.touch_scroll = new Touch.Scroll(this.content, {
				desktopCompatibility: desktop_touch,
				direction: this.options.axis == 'x' ? 'horizontal' : 'vertical',
				snap: false,
				momentum: true,
				vScrollbar: false,
				hScrollbar: false,
				events: {
					'scroll': function(pos){
						pos.x = -pos.x;
						pos.y = -pos.y;
						this.scroll_pos = {
							x: pos.x / (this.content.getScrollSize().x - this.content.getSize().x),
							y: pos.y / (this.content.getScrollSize().y - this.content.getSize().y)
						};
						if(this.control) this.control.move(this.scroll_pos.x, this.scroll_pos.y);
					}.bind(this)
				}
			});
		}

	},
	
	// --------------------------------------------------------------------
		
	/**
	 * Set scroll by percentage object
	 * 
	 */
	update: function(pos)
	{
		this.scroll_pos = pos;
		this.scrollTo(
			this.scroll_pos.x * (this.content.getScrollSize().x - this.content.getSize().x),
			this.scroll_pos.y * (this.content.getScrollSize().y - this.content.getSize().y),
			false
		);
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Set scroll by x & y values.
	 * 
	 */
	scrollTo: function(x, y, animate)
	{
		if(typeOf(this.watch_timeout) == 'null' || this.watch_timeout === false){
			this.fireEvent('start');
			this.v_change = 0;
			this.h_change = 0;
			clearTimeout(this.watch_timeout);
		}else{
			this.fireEvent('scroll');
			clearTimeout(this.watch_timeout);
		}
		this.watch_timeout = setTimeout(function(){
			this.fireEvent('end');
			this.watch_timeout = false;
		}.bind(this), 100);
		
		//trace('scrollTo: '+x+', '+y);
		if( ! this.has_scroll) return false;
		
		if(typeOf(animate) == 'null') animate = true;
		var scroll_size = this.content.getScrollSize();
		var content_size = this.content.getSize();
		x = this.options.axis == 'x' ? Math.max(0, Math.min(x || this.content.getScroll().x, scroll_size.x - content_size.x)) : 0;
		y = this.options.axis == 'y' ? Math.max(0, Math.min(y || this.content.getScroll().y, scroll_size.y - content_size.y)) : 0;
		
		if(animate)
		{
			new Fx.Scroll(this.content, {duration: 500, transition: 'sine:in:out'}).addEvent('update', function(){
				this.scroll_pos = {
					x: this.content.getScroll().x / (this.content.getScrollSize().x - this.content.getSize().x),
					y: this.content.getScroll().y / (this.content.getScrollSize().y - this.content.getSize().y)
				};
				if(this.control) this.control.move(this.scroll_pos.x, this.scroll_pos.y);
			}.bind(this)).start(x, y);
		}
		else
		{
			this.content.scrollTo(x, y);
			
			this.scroll_pos = {
				x: this.content.getScroll().x / (this.content.getScrollSize().x - this.content.getSize().x),
				y: this.content.getScroll().y / (this.content.getScrollSize().y - this.content.getSize().y)
			};
			if(this.control) this.control.move(this.scroll_pos.x, this.scroll_pos.y);
			//trace(this.scroll_pos.x+', '+this.scroll_pos.y);
		}
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Handle mousewheel event
	 * 
	 */
	mousewheel: function(event){
		if(this.has_scroll){
		
			// Add X & Y values to event if possible
			event.wheelX = (typeOf(event.event.wheelDeltaX) == 'number') ? event.event.wheelDeltaX / 120 : false;
			event.wheelY = (typeOf(event.event.wheelDeltaY) == 'number') ? event.event.wheelDeltaY / 120 : false;
			if(Browser.firefox){
				var ff_diviser = 3;
				if (typeOf(event.event.axis) && event.event.axis == event.event.HORIZONTAL_AXIS){
	                // FF can only scroll one dirction at a time
	                event.wheelX = (-event.event.detail/ff_diviser) * Math.max(1, Math.abs(((event.event.detail/ff_diviser)/1.2)));
	                event.wheelY = false;
	            }else {
	            	event.wheelX = false;
	            	event.wheelY = (-event.event.detail/ff_diviser) * Math.max(1, Math.abs(((event.event.detail/ff_diviser)/1.2)));
	            } 
			}
			
			// Only use mouse wheel if the scroll is in the same direction as our axis (or if we can't tell direction)
			if(
				(this.options.axis == 'x' && event.wheelX) || 
				(this.options.axis == 'y' && event.wheelY) || 
				( ! event.wheelX && ! event.wheelY)
			)
			{
				var wheel = (this.options.axis == 'x' && event.wheelX) ? event.wheelX : ((this.options.axis == 'y' && event.wheelY) ? event.wheelY : event.wheel);
				
				// If we're getting data in both directions, try to calculate the change.
				if(event.wheelX && event.wheelY)
				{
					if(typeOf(this.v_change) == 'null') this.v_change = 0;
					if(typeOf(this.h_change) == 'null') this.h_change = 0;
					this.v_change += Math.abs(event.wheelY);
					this.h_change += Math.abs(event.wheelX);
					var dir = this.v_change > this.h_change ? 'y' : 'x';
					if(dir != this.options.axis) return;
				}
				
				// Only move if there's room left to scroll in the current scroll direction
				if((this.scroll_pos[this.options.axis] > 0 && this.scroll_pos[this.options.axis] < 1) || (wheel < 0 /* down */ && this.scroll_pos[this.options.axis] == 0) || (wheel > 0 /* up */ && this.scroll_pos[this.options.axis] == 1)){
					
					// Stop default window scroll
					event.stop();
					event.preventDefault();
					
					// Wheel speed
					if(this.wheel_last_value){
						this.wheel_speed = wheel - this.wheel_last_value;
					} else {
						this.wheel_speed = 0;
					}
					this.wheel_last_value = wheel;					
					var sensitivity = this.options.wheelSensitivity;
					//if(this.wheel_speed < 2 && sensitivity > 1) sensitivity = 1;
					//sensitivity = Math.abs(event.wheel) > sensitivity ? sensitivity : 1;
					var cur_scroll = this.content.getScroll();
					this.scrollTo(cur_scroll.x - (wheel/sensitivity), cur_scroll.y - (wheel/sensitivity), false);
					if(this.control) this.control.move(this.scroll_pos.x, this.scroll_pos.y);
				}
			}
		}
	},
	
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Resize
	 * 
	 */
	resize: function()
	{
		if(this.content.getScrollSize()[this.options.axis] > this.content.getSize()[this.options.axis]){
			if(this.control) this.control.on();
			this.content.addClass('has-bar');
			this.has_scroll = true;
		}else{
			if(this.control) this.control.off();
			this.content.removeClass('has-bar');
			this.has_scroll = false;
		}
		if(this.control) this.control.resize(this.content.getSize()[this.options.axis] / this.content.getScrollSize()[this.options.axis]);
	}
});


/* Handle the scroll bar */
Kemso.ScrollBar.Track = new Class({

	Implements: [Options, Events],
	
	options: {
		axis: 'y',
		minHandleSize: 30
	},
	
	initialize: function(handle, track, options)
	{
		this.setOptions(options);
		this.handle = document.id(handle);
		this.track = document.id(track);
		this.handle_init = this.handle.getPosition(this.track);
		this.position = {x:0, y:0};
		this.resize();
		
		this.handle.setStyles({'position': 'absolute', 'left': this.handle_limit.left, 'top': this.handle_limit.top});
		
		this.drag = new Drag(this.handle, {
			preventDefault: true,
			snap: 0,
			limit: {
				x: [this.handle_limit.left, this.handle_limit.right], 
				y: [this.handle_limit.top, this.handle_limit.bottom]
			}
		}).addEvents({
			'drag': function(el, e){
				this.fireEvent('move', [this.getPosition()]);
			}.bind(this)
		});
		
		this.handle.addEvent('click', function(e){ e.stop(); });
		//this.handle.set('tween', {duration: 300, transition: 'sine:in:out'}).get('tween').addEvent('update', this.update.bind(this));
		
		if(this.options.trackClick){
			this.track.addEvent('click', function(e){
				var mouse = {x: e.page.x - this.track.getPosition().x, y: e.page.y - this.track.getPosition().y};
				var change = {x: this.handle.getSize().x, y: this.handle.getSize().y};
				if(mouse.x < this.handle.getPosition(this.track).x) change.x = -change.x;
				if(mouse.y > this.handle.getPosition(this.track).y) change.y = -change.y;
				//trace('trackClick');
			}.bind(this));
		}
	},
	
	/* Return an object with percentage x & y values for position of the handle */
	getPosition: function()
	{
		this.position = {
			x: (this.handle.getPosition(this.track).x - (this.handle_limit.left)) / (this.track.getSize().x - (this.handle_limit.left * 2) - this.handle.getSize().x),
			y: (this.handle.getPosition(this.track).y - (this.handle_limit.top)) / (this.track.getSize().y - (this.handle_limit.top * 2) - this.handle.getSize().y)
		};
		
		return this.position;
	},
	
	/* Move handle by a percentage */
	move: function(perc_x, perc_y)
	{
		this.handle.setStyles({
			'left': this.handle_limit.left + (perc_x * (this.track.getSize().x - this.handle.getSize().x - (this.handle_limit.left * 2))),
			'top': this.handle_limit.top + (perc_y * (this.track.getSize().y - this.handle.getSize().y - (this.handle_limit.top * 2)))
		});
	},
	
	resize: function(bar_size_perc)
	{
		if(typeOf(bar_size_perc) != 'null')
		{
			this.handle.setStyle(
				this.options.axis == 'x' ? 'width' : 'height', 
				Math.max(this.options.minHandleSize, (bar_size_perc * this.track.getSize()[this.options.axis]))
			);

		}	
		
		this.handle_limit = {
			'left': this.handle_init.x,
			'top': this.handle_init.y,
			'right': this.options.axis == 'x' ? this.track.getSize().x - this.handle.getSize().x - this.handle_init.x : this.handle_init.x,
			'bottom': this.options.axis == 'y' ? this.track.getSize().y - this.handle.getSize().y - this.handle_init.y : this.handle_init.y
		};
		if(this.drag) this.drag.options.limit = {
			x: [this.handle_limit.left, this.handle_limit.right], 
			y: [this.handle_limit.top, this.handle_limit.bottom]
		};
		
		this.move(this.position.x, this.position.y);
	},
	
	off: function()
	{
		this.handle.setStyle('display', 'none');
		this.track.setStyle('display', 'none');
	},
	
	on: function()
	{
		this.handle.setStyle('display', 'block');
		this.track.setStyle('display', 'block');
	},
	
	toElement: function()
	{
		return this.el;
	}
});
	

/* Automatically create a scroll bar from an existing element. */
Kemso.ScrollBar.Auto = new Class({
	
	Extends: Kemso.ScrollBar,
	
	options: {
		axis: 'y',
		position: 'relative'
	},

	initialize: function(el, options)
	{
		this.setOptions(options);
		
		this.el = $(el);
		this.el.store('ScrollBar', this);
		this.el.setStyles({'overflow': 'hidden', 'position': (this.el.getStyle('position') == 'absolute' ? 'absolute' : this.options.position)});
		
		this.content = new Element('div', {'class': 'scroll-container', 'styles': {
			'position': 'absolute', 
			'overflow': 'hidden',
			'top': 0, 'right': 0, 'bottom': 0, 'left': 0,
			'padding': this.el.getStyle('padding')
		}});
		var childNodes = Array.clone(this.el.childNodes);
		for(var i = 0, l = childNodes.length; i < l; i++){
			var child = childNodes[i];
			if(child.nodeType == 1) document.id(child).inject(this.content);
			else if(child.nodeType == 3) this.content.appendChild(child);
		}
		this.content.inject(this.el);
		
		
		this.track = new Element('div', {
			'class': 'scroll-bar-track',
			'styles': {
				'position': 'absolute',
				'top': 0,
				'right': 0,
				'bottom': 0
			}
		}).inject(this.el);
	
		this.handle = new Element('div', {
			'class': 'scroll-bar-handle',
			'styles': {
				'position': 'absolute',
				'top': 0,
				'left': 0
			}
		}).inject(this.track);
			
		this.parent(this.content, this.track, this.handle);
	}
	
});

function $ScrollBar(el){
	return $(el).retrieve('ScrollBar');
}





var AssetLoader = new Class({
	Implements: [Options, Events],
	options: {
		type: false,
		auto_load: true,
		events: {}
	},
	initialize: function(src, options)
	{
		this.setOptions(options);
		this.loaded = false;
		this.addEvent('load', function(){ this.loaded = true; }.bind(this));
		this.addEvents(this.options.events);
		
		if(typeOf(src) == 'array')
		{
			this.assets = [];
			this.load_count = 0;
			for(var i = 0, l = src.length; i < l; i++)
			{
				this.assets.push(new AssetLoader(src[i], {
					auto_load: false, 
					events: {
						'load': function(){
							this.load_count++;
							if(this.load_count == this.assets.length)
							{
								this.fireEvent('load');
							}
						}.bind(this)
					}
				}));
			}
			
			this.assets.each(function(a){ a.load(); });
			
			return true;
		}		
		
		this.source = src;
		this.filetype = typeOf(this.options.type) == 'string' ? type : this.source.substr(this.source.lastIndexOf('.')+1);
		
		if(this.options.auto_load === true) this.load();
	},
	
	
	load: function()
	{
		switch(this.filetype)
		{
			case 'png':
			case 'jpg':
			case 'jpeg':
			case 'gif':
			case 'tiff':
				var image = new Image();
				image.src = this.source;
				if(image.complete) this.fireEvent('load');
				else image.onload = this.fireEvent.bind(this, 'load');
				break;
			case 'js':
				this.el = new Element('script', {
					'type': 'text/javascript',
					'src': this.source, 
					'onload': function(){ this.fireEvent('load'); }.bind(this)
				}).inject($(document.body).getElementsByName('head')[0]);
				break;
			case 'css':
				this.el = new Element('img', {
					'type': 'text/css',
					'rel': 'stylesheet',
					'media': 'screen',
					'href': this.source, 
					'onload': function(){ this.fireEvent('load'); }.bind(this)
				}).inject($(document.body).getElementsByName('head')[0]);
				break;
		}
	}
});

/* kemso-more.js
----------------------------------------------------------------------------------------------------- */

/*
---
Kemso More Extensions

copyrights:
  - [Kemso](http://kemso.com)

licenses:
  - You may not under any circumstances copy, redistribute, or re-sell this code, 
  	or use it as the basis for another site or application.
  - You may modify this code for the purposes of modifying a single insillation of the 
  	purchased product which which this code was distributed
  - http://whiteloupe.com/license.txt
...
*/



/*
---
Kemso more extensions

/*
---

name: Spinner

description: Creates a loader/spinner

license: MIT-style license.

authors: Kemso, LLC (http://www.kemso.com)

provides: [Spinner]

...
*/

var Spinner = new Class({
	
	Implements: Options,
	
	options: {
		element: false,
		height: 20,
		steps: 12,
		speed: 65,
		class_name: 'spinner',
		auto_start: false,
		relativeTo: false,
		
		size: false,
		spinners: {
			small: {
				src: 'assets/images/spinner.png',
				width: 20,
				height: 240,
				preload: true,
				has2x: true,
			},
			large: {
				src: 'assets/images/spinner-large.png',
				width: 40,
				height: 480,
				preload: true,
				has2x: true,
			}
		}
	},
	
	initialize: function(options)
	{
		
		this.setOptions(options);
		
		// Preload images
		for(var i in this.options.spinners){
			this.options.spinners[i].src = config.get('site_url') + this.options.spinners[i].src;
			var size = this.options.spinners[i];
			if(size.preload){
				if(window.devicePixelRatio >= 2 && size.has2x){
					new Image().src = size.src.substr(0, size.src.lastIndexOf('.'))+'@2x'+size.src.substr(size.src.lastIndexOf('.'));
				}else{
					new Image().src = size.src;
				}
			}
		}
		
		this.element = this.options.element ? $(this.options.element) : new Element('div', {'class': this.options.class_name, 'styles': {'visibility': 'hidden', 'opacity': 0}}).inject($(this.options.relativeTo || document.body));
		if(this.options.size)
		{
			var size = this.options.spinners[this.options.size];
			this.element.setStyles({
				'background-image': 'url('+size.src+')',
				'width': size.width,
				'height': size.width
			});
			this.options.height = size.width;
			
			if(window.devicePixelRatio >= 2 && size.has2x)
			{
				this.element.setStyles({
					'background-image': 'url('+size.src.substr(0, size.src.lastIndexOf('.'))+'@2x'+size.src.substr(size.src.lastIndexOf('.'))+')',
					'-webkit-background-size': size.width+'px '+size.height+'px'
				});
			}
		}
		this.element.set('tween', {duration: 250});
		this.timer = false;
		this.current_step = 0;
		if(this.options.auto_start) this.start();
	},
	
	start: function()
	{
		// for some reason IE doesn't like tween here
		this.element.setStyles({'opacity': 1, 'visibility': 'visible'})// .tween('opacity', 1);
		if( ! this.timer)
		this.timer = this.step.periodical(this.options.speed, this);
		return this;
	},
	
	stop: function()
	{
		//$(this).tween('opacity', 0);
		this.element.setStyle('opacity', 0);
		
		//(function(timer){ clearInterval(timer); }).delay(300, this, this.timer);
		clearInterval(this.timer)
		this.timer = false;
		
		return this;
	},
	
	step: function()
	{
		this.current_step++;
		this.element.style.backgroundPosition = '0px -' + (this.options.height * this.current_step) + 'px';
		if(this.current_step >= this.options.steps) this.current_step = 0;
	},
	
	off: function(){ this.stop(); return this; },
	
	on: function(){ this.start(); return this; },
	
	destroy: function()
	{
		this.off();
		this.element.destroy();
	},
	
	toElement: function()
	{
		return this.element;
	}
	
});



/*
---

name: LoadImage

description: Loads an image, showing a spinner and fading in on load. 
Optionally replaces image with pixel.gif, setting source to background-image

license: MIT-style license.

authors: Kemso, LLC (http://www.kemso.com)
			- Matt McCloskey

provides: [Touch]

...
*/

var LoadImage = new Class({
	Implements: [Options, Events],
	options: {
		replace: true,
		spinner_size: 'large'
	},
	initialize: function(el, options)
	{
		this.setOptions(options);
		this.img = $(el);
		
		if(this.img.retrieve('loading') || this.img.retrieve('loaded'))
		{
			// image has been loaded already, check the source
			//if($(this.img).src == this.img)
			return $C(this.img);
		}
		
		this.img.store('ClassRef', this);
		
		this.spinner = new Spinner({relativeTo: this.img.getParent(), 'size': this.options.spinner_size}).start();
		$(this.spinner).position({relativeTo: this.img});
		
		// Are we lazy loading this image?
		if(this.img.get('data-src')){
			this.img.set('src', this.img.get('data-src'));
		}
		
		// Fade the image in when it's loaded
		this.img.style.visibility = 'hidden';
		this.img.store('loading', true);
		this.src = this.img.get('src');
		new AssetLoader(this.src, {
			events: {
				'load': function(){
					
					$(this.img).addClass('loaded');
					this.img.store('loading', false);
					this.img.store('loaded', true);
					// Use CSS transitions where available for better results
					var usecss = false;
					if(usecss && (Browser.Platform.ios || Browser.Platform.android || Browser.Platform.webos || Browser.safari || Browser.chrome))
					{
						setTimeout(function(){
							this.img.style.webkitTransition = 'opacity 500ms cubic-bezier(0,0,0.25,1)';
							this.img.setStyle('opacity', 1);
						}.bind(this), 1);
					}
					else
					{
						//$(this.img).setStyle('opacity', 1);
						$(this.img).tween('opacity', [0,1]);
						//this.img.style.visibility = 'visible';
					}
					
					this.spinner.destroy();
					this.fireEvent('load', this.img);
				}.bind(this)
			}
		});
		
		// Swap image src with pixel.gif and set background-image to original source
		// This helps prevent image theft, and gets around mobile web-kit memory issues
		if(this.options.replace && config && config.get('site_url')) 
		this.img.setStyles({
			'background-image': 'url('+this.src+')',
			'background-repeat': 'no-repeat'
		}).set('src', config.get('site_url')+'assets/images/pixel.gif');
	},
	
	toElement: function()
	{
		return this.img;
	}
});



/*
---
MooTools: Touch extensions

/*
---

name: Touch

description: Mootools Touch by Kemso

license: MIT-style license.

authors: Kemso, LLC (http://www.kemso.com)
			- Matt McCloskey

provides: [Touch]

...
*/


(function(){

this.Touch = {
	version: '1.0'
};

// Touch.Scroll stuff - (Note: Left for compatibility. Need to upgrade these to Mootools 1.3 core vars)
// Is translate3d compatible?
var has3d = this.has3d = ('WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix());
// Device sniffing
var isIthing = this.isIthing = (/iphone|ipad/gi).test(navigator.appVersion);
var isTouch = this.isTouch = ('ontouchstart' in window);
// Translate3d helper
var translateOpen = this.translateOpen = 'translate' + (has3d ? '3d(' : '(');
var translateClose = this.translateClose = has3d ? ',0)' : ')';
	
})();



/* Add touch events */
Element.Events.swipe = {

	onAdd: function(){
		var startEvent = {}, endEvent = {};
		var buffer = 3;
		var body = document.getElementsByTagName('body')[0];
		this.addEventListener('touchstart', function (event) {
			//event.preventDefault();
			startEvent.x = event.touches[0].pageX;
			startEvent.y = event.touches[0].pageY;
		}, false);
		this.addEventListener('touchmove', function (event) {
			endEvent.x = event.touches[0].pageX;
			endEvent.y = event.touches[0].pageY;
			if(Math.abs(startEvent.x - endEvent.x) > buffer || Math.abs(startEvent.y - endEvent.y) > buffer){
				event.preventDefault();
			}			
		}, false);
	
		this.addEventListener('touchend', function (event) {
			var changeX = startEvent.x - endEvent.x,
			    changeY = startEvent.y - endEvent.y,
			    changeRatio = Math.abs(changeX / changeY);
			
			if (changeRatio > 2.5) {
				// The swipe was "clearly" dominant in either the X or Y directions.
				if (changeX < 0) {
					// Motion was left-to-right across the screen.
					event.direction = 'right';
				} else {
					// Motion was right-to-left across the screen.
					event.direction = 'left'
				}
				this.fireEvent('swipe', event);
			} else if (changeRatio < 0.4) {
					if (changeY < 0) {
			    	// Motion was top-to-bottom across the screen.
					event.direction = 'down';
				} else {
			   		// Motion was bottom-to-top across the screen.
					event.direction = 'up';
				}
				this.fireEvent('swipe', event);
			}
			
		}, false);
	}
};


Element.Events.tap = {

	onAdd: function(){
		var startEvent = {};
		var endEvent = {};
		var buffer = 3;
		this.addEvents({
			'touchstart': function(e){ 
				e.preventDefault(); 
				this.store('touchmoved', false);
				this.store('hastouch', true);
				startEvent.x = e.touches[0].pageX; 
				startEvent.y = e.touches[0].pageY;
			},
			'touchmove': function(e){ 
				endEvent.x = e.touches[0].pageX;
				endEvent.y = e.touches[0].pageY;
				if(Math.abs(startEvent.x - endEvent.x) > buffer || Math.abs(startEvent.y - endEvent.y) > buffer)
				this.store('touchmoved', true); 
			},
			'click': function(e){ e.stop(); if( ! this.retrieve('touchmoved') && ! this.retrieve('hastouch')) this.fireEvent('tap', e); }.bind(this),
			'touchend': function(e){ if( ! this.retrieve('touchmoved')){ /* trace('tap'); */ this.fireEvent('tap', e); }else{ /* trace('touch move') */ } }.bind(this)
		});
	}

};


/*
---

name: Touch.Scroll

description: Provides single finger touch scroll for overflow elements. Based on iScroll version 3.7.1 by Matteo Spinelli (http://cubiq.org/iscroll)

license: MIT-style license.

authors:
	- Matt McCloskey, Kemso, LLC (http://www.kemso.com)
	- Matteo Spinelli, http://cubiq.org/

provides: [Touch.Scroll]

...
*/
Touch.Scroll = new Class({
	
	Implements: [Options, Events],
	
	options: {
		element: false,
		bounce: has3d,
		momentum: has3d,
		friction: 2.5,
		checkDOMChanges: true,
		topOnDOMChanges: false,
		hScrollbar: has3d,
		vScrollbar: has3d,
		direction: 'both',
		fadeScrollbar: isIthing || ! isTouch,
		shrinkScrollbar: isIthing || ! isTouch,
		desktopCompatibility: false,
		overflow: 'hidden',
		snap: false,
		bounceLock: false,
		scrollbarColor: 'rgba(0,0,0,0.5)',
		events: {
			'scrollStart': function(){},
			'scroll': function(){},
			'scrollEnd': function(){}
		},
		
		start_event: isTouch ? 'touchstart' : 'mousedown',
		move_event: isTouch ? 'touchmove' : 'mousemove',
		end_event: isTouch ? 'touchend' : 'mouseup'
	},
	
	initialize: function(container, options)
	{
		this.setOptions(options);
		this.addEvents(this.options.events);
		
		this.wrapper = document.id(container);
		this.wrapper.style.overflow = this.options.desktopCompatibility ? 'hidden' : this.options.overflow;
		
		this.element = this.options.element ? document.id(this.options.element) : this.wrapper.getChildren()[0];
		this.element.style.webkitTransitionProperty = '-webkit-transform';
		this.element.style.webkitTransitionTimingFunction = 'cubic-bezier(0,0,0.25,1)';
		this.element.style.webkitTransitionDuration = '0';
		this.element.style.webkitTransform = translateOpen + '0,0' + translateClose;
		
		this.refresh();
	
		window.addEventListener('onorientationchange' in window ? 'orientationchange' : 'resize', this, false);
	
		if (isTouch || this.options.desktopCompatibility) {
			this.element.addEventListener(this.options.start_event, this, false);
			this.element.addEventListener(this.options.move_event, this, false);
			this.element.addEventListener(this.options.end_event, this, false);
		}
		
		if (this.options.checkDOMChanges) {
			this.element.addEventListener('DOMSubtreeModified', this, false);
		}
		
		// -------------
		this.x = 0;
		this.y = 0;
		this.enabled = true;
	},
	
	handleEvent: function (e) {		
		switch (e.type) {
			case this.options.start_event:
				this.touchStart(e);
				break;
			case this.options.move_event:
				this.touchMove(e);
				break;
			case this.options.end_event:
				this.touchEnd(e);
				break;
			case 'webkitTransitionEnd':
				this.transitionEnd();
				break;
			case 'orientationchange':
			case 'resize':
				this.refresh();
				break;
			case 'DOMSubtreeModified':
				this.onDOMModified(e);
				break;
		}
	},
	
	onDOMModified: function (e) {
		// (Hopefully) execute onDOMModified only once
		if (e.target.parentNode != this.element) {
			return;
		}

		setTimeout(function () { this.refresh(); }.bind(this), 0);

		if (this.options.topOnDOMChanges && (this.x!=0 || this.y!=0)) {
			this.scrollTo(0,0,'0');
		}
	},

	refresh: function () {
		var resetX = this.x, resetY = this.y,
			snap;
		
		this.scrollWidth = this.wrapper.clientWidth;
		this.scrollHeight = this.wrapper.clientHeight;
		this.scrollerWidth = this.element.offsetWidth;
		this.scrollerHeight = this.element.offsetHeight;
		this.maxScrollX = this.scrollWidth - this.scrollerWidth;
		this.maxScrollY = this.scrollHeight - this.scrollerHeight;
		this.directionX = 0;
		this.directionY = 0;

		if (this.scrollX) {
			if (this.maxScrollX >= 0) {
				resetX = 0;
			} else if (this.x < this.maxScrollX) {
				resetX = this.maxScrollX;
			}
		}
		if (this.scrollY) {
			if (this.maxScrollY >= 0) {
				resetY = 0;
			} else if (this.y < this.maxScrollY) {
				resetY = this.maxScrollY;
			}
		}

		// Snap
		if (this.options.snap) {
			this.maxPageX = -Math.floor(this.maxScrollX/this.scrollWidth);
			this.maxPageY = -Math.floor(this.maxScrollY/this.scrollHeight);

			snap = this.snap(resetX, resetY);
			resetX = snap.x;
			resetY = snap.y;
		}

		if (resetX!=this.x || resetY!=this.y) {
			this.setTransitionTime('0');
			this.setPosition(resetX, resetY, true);
		}
		
		this.scrollX = this.scrollerWidth > this.scrollWidth;
		this.scrollY = !this.options.bounceLock && !this.scrollX || this.scrollerHeight > this.scrollHeight;

		// Update horizontal scrollbar
		if (this.options.hScrollbar && this.scrollX) {
			this.scrollBarX = this.scrollBarX || new Touch.ScrollBar('horizontal', this.wrapper, this.options.fadeScrollbar, this.options.shrinkScrollbar, this.options.scrollbarColor);
			this.scrollBarX.init(this.scrollWidth, this.scrollerWidth);
		} else if (this.scrollBarX) {
			this.scrollBarX = this.scrollBarX.remove();
		}

		// Update vertical scrollbar
		if (this.options.vScrollbar && this.scrollY && this.scrollerHeight > this.scrollHeight) {
			this.scrollBarY = this.scrollBarY || new Touch.ScrollBar('vertical', this.wrapper, this.options.fadeScrollbar, this.options.shrinkScrollbar, this.options.scrollbarColor);
			this.scrollBarY.init(this.scrollHeight, this.scrollerHeight);
		} else if (this.scrollBarY) {
			this.scrollBarY = this.scrollBarY.remove();
		}
	},

	setPosition: function (x, y, hideScrollBars) {
		
		this.x = x;
		this.y = y;

		this.element.style.webkitTransform = translateOpen + this.x + 'px,' + this.y + 'px' + translateClose;

		// Move the scrollbars
		if ( ! hideScrollBars) {
			if (this.scrollBarX) {
				this.scrollBarX.setPosition(this.x);
			}
			if (this.scrollBarY) {
				this.scrollBarY.setPosition(this.y);
			}
		}
		
		this.fireEvent('scroll', [{x: this.x, y: this.y}]);
	},
	
	setTransitionTime: function(time) {
		
		time = time || '0';
		this.element.style.webkitTransitionDuration = time;
		
		if (this.scrollBarX) {
			this.scrollBarX.bar.style.webkitTransitionDuration = time;
			this.scrollBarX.wrapper.style.webkitTransitionDuration = has3d && this.options.fadeScrollbar ? '300ms' : '0';
		}
		if (this.scrollBarY) {
			this.scrollBarY.bar.style.webkitTransitionDuration = time;
			this.scrollBarY.wrapper.style.webkitTransitionDuration = has3d && this.options.fadeScrollbar ? '300ms' : '0';
		}
	},
		
	touchStart: function(e)
	{
		var matrix;
		if ( ! this.enabled) { return; }
		
		if( ! e.touchs || e.touches.length == 1)
		{
			//e.preventDefault();
			//e.stopPropagation();
		
			this.scrolling = true;		// This is probably not needed, but may be useful if iScroll is used in conjuction with other frameworks
	
			this.moved = false;
			this.distX = 0;
			this.distY = 0;
	
			this.setTransitionTime('0');
	
			// Check if the scroller is really where it should be
			if (this.options.momentum || this.options.snap) {
				matrix = new WebKitCSSMatrix(window.getComputedStyle(this.element).webkitTransform);
				if (matrix.e != this.x || matrix.f != this.y) {
					this.element.removeEventListener('webkitTransitionEnd', this, false);
					this.setPosition(matrix.e, matrix.f);
					this.moved = true;
				}
			}
	
			this.touchStartX = isTouch ? e.changedTouches[0].pageX : e.pageX;
			this.scrollStartX = this.x;
	
			this.touchStartY = isTouch ? e.changedTouches[0].pageY : e.pageY;
			this.scrollStartY = this.y;
	
			this.scrollStartTime = e.timeStamp;
	
			this.directionX = 0;
			this.directionY = 0;
			
			this.fireEvent('scrollStart');
		}
	},
	
	touchMove: function(e) {
		if (!this.scrolling) {
			return;
		}
		if( ! e.touchs || e.touches.length == 1)
		{
		
			var pageX = isTouch ? e.changedTouches[0].pageX : e.pageX,
				pageY = isTouch ? e.changedTouches[0].pageY : e.pageY,
				leftDelta = this.scrollX ? pageX - this.touchStartX : 0,
				topDelta = this.scrollY ? pageY - this.touchStartY : 0,
				newX = this.x + leftDelta,
				newY = this.y + topDelta;
				
			var changeX = this.touchStartX - pageX,
			    changeY = this.touchStartY - pageY,
			    changeRatio = Math.abs(changeX / changeY),
			    dir = false;
			
			if (changeRatio > 2.5) {
				// The swipe was "clearly" dominant in either the X or Y directions.
				dir = 'horizontal';
				if (changeX < 0) {
					// Motion was left-to-right across the screen.
				} else {
					// Motion was right-to-left across the screen.
				}
			} else if (changeRatio < 0.4) {
				dir = 'vertical';
				if (changeY < 0) {
			    	// Motion was top-to-bottom across the screen.
				} else {
			   		// Motion was bottom-to-top across the screen.
				}
			}
			
			//trace(this.options.direction+' / '+dir);
			if( ! dir || this.options.direction == "both" || this.options.direction == dir)
			{
				e.preventDefault();
				//e.stopPropagation();	// Stopping propagation just saves some cpu cycles (I presume)
				
				this.touchStartX = pageX;
				this.touchStartY = pageY;
		
				// Slow down if outside of the boundaries
				if (newX >= 0 || newX < this.maxScrollX) {
					newX = this.options.bounce ? Math.round(this.x + leftDelta / 3) : (newX >= 0 || this.maxScrollX>=0) ? 0 : this.maxScrollX;
				}
				if (newY >= 0 || newY < this.maxScrollY) { 
					newY = this.options.bounce ? Math.round(this.y + topDelta / 3) : (newY >= 0 || this.maxScrollY>=0) ? 0 : this.maxScrollY;
				}
		
				if (this.distX + this.distY > 5) {			// 5 pixels threshold
		
					// Lock scroll direction
					if (this.distX-3 > this.distY) {
						newY = this.y;
						topDelta = 0;
					} else if (this.distY-3 > this.distX) {
						newX = this.x;
						leftDelta = 0;
					}
		
					this.setPosition(newX, newY);
					this.moved = true;
					this.directionX = leftDelta > 0 ? -1 : 1;
					this.directionY = topDelta > 0 ? -1 : 1;
				} else {
					this.distX+= Math.abs(leftDelta);
					this.distY+= Math.abs(topDelta);
					//this.dist+= Math.abs(leftDelta) + Math.abs(topDelta);
				}
			}			
		}
	},
	
	touchEnd: function(e)
	{
		if ( ! this.scrolling) return;
		//e.stopPropagation();

		var time = e.timeStamp - this.scrollStartTime,
			point = isTouch ? e.changedTouches[0] : e,
			target, ev,
			momentumX, momentumY,
			newDuration = 0,
			newPositionX = this.x, newPositionY = this.y,
			snap;

		this.scrolling = false;

		if ( ! this.moved) {
			this.resetPosition();

			if (isTouch) {
				// Find the last touched element
				target = point.target;
				while (target.nodeType != 1) {
					target = target.parentNode;
				}

				// Create the fake event
				ev = document.createEvent('MouseEvents');
				ev.initMouseEvent('click', true, true, e.view, 1,
					point.screenX, point.screenY, point.clientX, point.clientY,
					e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
					0, null);
				ev._fake = true;
				target.dispatchEvent(ev);
			}

			return;
		}

		if (!this.options.snap && time > 250) {			// Prevent slingshot effect
			this.resetPosition();
			return;
		}

		if (this.options.momentum) {
			momentumX = this.scrollX === true
				? this.momentum(this.x - this.scrollStartX,
								time,
								this.options.bounce ? -this.x + this.scrollWidth/5 : -this.x,
								this.options.bounce ? this.x + this.scrollerWidth - this.scrollWidth + this.scrollWidth/5 : this.x + this.scrollerWidth - this.scrollWidth)
				: { dist: 0, time: 0 };

			momentumY = this.scrollY === true
				? this.momentum(this.y - this.scrollStartY,
								time,
								this.options.bounce ? -this.y + this.scrollHeight/5 : -this.y,
								this.options.bounce ? (this.maxScrollY < 0 ? this.y + this.scrollerHeight - this.scrollHeight : 0) + this.scrollHeight/5 : this.y + this.scrollerHeight - this.scrollHeight)
				: { dist: 0, time: 0 };

			newDuration = Math.max(Math.max(momentumX.time, momentumY.time), 1);		// The minimum animation length must be 1ms
			newPositionX = this.x + momentumX.dist;
			newPositionY = this.y + momentumY.dist;
		}

		if (this.options.snap) {
			snap = this.snap(newPositionX, newPositionY);
			newPositionX = snap.x;
			newPositionY = snap.y;
			newDuration = Math.max(snap.time, newDuration);
		}

		this.scrollTo(newPositionX, newPositionY, newDuration + 'ms');
	},

	transitionEnd: function ()
	{
		this.element.removeEventListener('webkitTransitionEnd', this, false);
		this.resetPosition();
	},

	resetPosition: function ()
	{
		var resetX = this.x,
		 	resetY = this.y;

		if (this.x >= 0) {
			resetX = 0;
		} else if (this.x < this.maxScrollX) {
			resetX = this.maxScrollX;
		}

		if (this.y >= 0 || this.maxScrollY > 0) {
			resetY = 0;
		} else if (this.y < this.maxScrollY) {
			resetY = this.maxScrollY;
		}
		
		if (resetX != this.x || resetY != this.y) {
			this.scrollTo(resetX, resetY);
		} else {
			if (this.moved) {
				this.fireEvent('scrollEnd', [{x: this.x, y: this.y}]);		// Execute custom code on scroll end
				this.moved = false;
			}

			// Hide the scrollbars
			if (this.scrollBarX) {
				this.scrollBarX.hide();
			}
			if (this.scrollBarY) {
				this.scrollBarY.hide();
			}
		}
	},
	
	snap: function (x, y) {
		var time;

		if (this.directionX > 0) {
			x = Math.floor(x/this.scrollWidth);
		} else if (this.directionX < 0) {
			x = Math.ceil(x/this.scrollWidth);
		} else {
			x = Math.round(x/this.scrollWidth);
		}
		this.pageX = -x;
		x = x * this.scrollWidth;
		if (x > 0) {
			x = this.pageX = 0;
		} else if (x < this.maxScrollX) {
			this.pageX = this.maxPageX;
			x = this.maxScrollX;
		}

		if (this.directionY > 0) {
			y = Math.floor(y/this.scrollHeight);
		} else if (this.directionY < 0) {
			y = Math.ceil(y/this.scrollHeight);
		} else {
			y = Math.round(y/this.scrollHeight);
		}
		this.pageY = -y;
		y = y * this.scrollHeight;
		if (y > 0) {
			y = this.pageY = 0;
		} else if (y < this.maxScrollY) {
			this.pageY = this.maxPageY;
			y = this.maxScrollY;
		}

		// Snap with constant speed (proportional duration)
		time = Math.round(Math.max(
				Math.abs(this.x - x) / this.scrollWidth * 500,
				Math.abs(this.y - y) / this.scrollHeight * 500
			));
			
		return { x: x, y: y, time: time };
	},

	scrollTo: function (destX, destY, runtime) {
		
		// values have to be negative
		if(destX >= 0) destX = -destX;

		if (this.x == destX && this.y == destY) {
			this.resetPosition();
			return;
		}

		this.moved = true;
		this.setTransitionTime(runtime || '500ms');
		this.setPosition(destX, destY);

		if (runtime==='0' || runtime=='0s' || runtime=='0ms') {
			this.resetPosition();
		} else {
			this.element.addEventListener('webkitTransitionEnd', this, false);	// At the end of the transition check if we are still inside of the boundaries
		}
	},
	
	set: function(x, y, time)
	{
		this.scrollTo(x, y, '0ms');
	},
	
	scrollToPage: function (pageX, pageY, runtime) {
		var snap;

		if (!this.options.snap) {
			this.pageX = -Math.round(this.x / this.scrollWidth);
			this.pageY = -Math.round(this.y / this.scrollHeight);
		}

		if (pageX == 'next') {
			pageX = ++this.pageX;
		} else if (pageX == 'prev') {
			pageX = --this.pageX;
		}

		if (pageY == 'next') {
			pageY = ++this.pageY;
		} else if (pageY == 'prev') {
			pageY = --this.pageY;
		}

		pageX = -pageX*this.scrollWidth;
		pageY = -pageY*this.scrollHeight;

		snap = this.snap(pageX, pageY);
		pageX = snap.x;
		pageY = snap.y;
		
		
		this.scrollTo(pageX, pageY, runtime || '500ms');
	},

	toElement: function (el, runtime) {
		el = typeof el == 'object' ? el : this.element.querySelector(el);

		if (!el) {
			return;
		}

		var x = this.scrollX ? -el.offsetLeft : 0,
			y = this.scrollY ? -el.offsetTop : 0;

		if (x >= 0) {
			x = 0;
		} else if (x < this.maxScrollX) {
			x = this.maxScrollX;
		}

		if (y >= 0) {
			y = 0;
		} else if (y < this.maxScrollY) {
			y = this.maxScrollY;
		}

		this.scrollTo(x, y, runtime);
	},
	
	scrollToElement: function(el, runtime){ this.scrollToElement(el, runtime); },

	momentum: function (dist, time, maxDistUpper, maxDistLower) {
		var friction = this.options.friction,
			deceleration = 1.2,
			speed = Math.abs(dist) / time * 1000,
			newDist = speed * speed / friction / 1000,
			newTime = 0;

		// Proportinally reduce speed if we are outside of the boundaries 
		if (dist > 0 && newDist > maxDistUpper) {
			speed = speed * maxDistUpper / newDist / friction;
			newDist = maxDistUpper;
		} else if (dist < 0 && newDist > maxDistLower) {
			speed = speed * maxDistLower / newDist / friction;
			newDist = maxDistLower;
		}
		
		newDist = newDist * (dist < 0 ? -1 : 1);
		newTime = speed / deceleration;

		return { dist: Math.round(newDist), time: Math.round(newTime) };
	},
	
	destroy: function (full) {

		window.removeEventListener('onorientationchange' in window ? 'orientationchange' : 'resize', this, false);		
		this.element.removeEventListener(this.options.start_event, this, false);
		this.element.removeEventListener(this.options.move_event, this, false);
		this.element.removeEventListener(this.options.end_event, this, false);
		this.element.removeEventListener('webkitTransitionEnd', this, false);

		if (this.options.checkDOMChanges) {
			this.element.removeEventListener('DOMSubtreeModified', this, false);
		}

		if (this.scrollBarX) {
			this.scrollBarX = this.scrollBarX.remove();
		}

		if (this.scrollBarY) {
			this.scrollBarY = this.scrollBarY.remove();
		}
		
		if (full) {
			this.wrapper.parentNode.removeChild(this.wrapper);
		}
		
		return null;
	}

});



/* ! Touch.ScrollBar */
/*
---

name: Touch.ScrollBar

description: Provides single finger touch scroll for overflow elements. Based on iScroll version 3.7.1 by Matteo Spinelli (http://cubiq.org/iscroll)

license: MIT-style license.

authors:
	- Matt McCloskey, Kemso, LLC (http://www.kemso.com)
	- Matteo Spinelli, http://cubiq.org/

provides: [Touch.ScrollBar]

...
*/
Touch.ScrollBar = new Class({
	
	Implemenets: [Options, Events],
	
	initialize: function(dir, wrapper, fade, shrink, color)
	{
		var doc = document;
		
		this.dir = dir;
		this.fade = fade;
		this.shrink = shrink;
		this.uid = Touch.ScrollBar.register(this);
	
		// Create main scrollbar
		this.bar = doc.createElement('div');
	
		this.bar.style.cssText = 'position:absolute;top:0;left:0;-webkit-transition-timing-function:cubic-bezier(0,0,0.25,1);pointer-events:none;-webkit-transition-duration:0;-webkit-transition-delay:0;-webkit-transition-property:-webkit-transform;z-index:10;background:' + color + ';' +
			'-webkit-transform:' + translateOpen + '0,0' + translateClose + ';' +
			(dir == 'horizontal' ? '-webkit-border-radius:3px 2px;min-width:6px;min-height:5px' : '-webkit-border-radius:2px 3px;min-width:5px;min-height:6px');
	
		// Create scrollbar wrapper
		this.wrapper = doc.createElement('div');
		this.wrapper.style.cssText = '-webkit-mask:-webkit-canvas(scrollbar' + this.uid + this.dir + ');position:absolute;z-index:10;pointer-events:none;overflow:hidden;opacity:0;-webkit-transition-duration:' + (fade ? '300ms' : '0') + ';-webkit-transition-delay:0;-webkit-transition-property:opacity;' +
			(this.dir == 'horizontal' ? 'bottom:2px;left:2px;right:7px;height:5px' : 'top:2px;right:2px;bottom:7px;width:5px;');
	
		// Add scrollbar to the DOM
		this.wrapper.appendChild(this.bar);
		wrapper.appendChild(this.wrapper);
	},
	
	init: function (scroll, size) {
		var doc = document,
			pi = Math.PI,
			ctx;

		// Create scrollbar mask
		if (this.dir == 'horizontal') {
			if (this.maxSize != this.wrapper.offsetWidth) {
				this.maxSize = this.wrapper.offsetWidth;
				ctx = doc.getCSSCanvasContext("2d", "scrollbar" + this.uid + this.dir, this.maxSize, 5);
				ctx.fillStyle = "rgb(0,0,0)";
				ctx.beginPath();
				ctx.arc(2.5, 2.5, 2.5, pi/2, -pi/2, false);
				ctx.lineTo(this.maxSize-2.5, 0);
				ctx.arc(this.maxSize-2.5, 2.5, 2.5, -pi/2, pi/2, false);
				ctx.closePath();
				ctx.fill();
			}
		} else {
			if (this.maxSize != this.wrapper.offsetHeight) {
				this.maxSize = this.wrapper.offsetHeight;
				ctx = doc.getCSSCanvasContext("2d", "scrollbar" + this.uid + this.dir, 5, this.maxSize);
				ctx.fillStyle = "rgb(0,0,0)";
				ctx.beginPath();
				ctx.arc(2.5, 2.5, 2.5, pi, 0, false);
				ctx.lineTo(5, this.maxSize-2.5);
				ctx.arc(2.5, this.maxSize-2.5, 2.5, 0, pi, false);
				ctx.closePath();
				ctx.fill();
			}
		}

		this.size = Math.max(Math.round(this.maxSize * this.maxSize / size), 6);
		this.maxScroll = this.maxSize - this.size;
		this.toWrapperProp = this.maxScroll / (scroll - size);
		this.bar.style[this.dir == 'horizontal' ? 'width' : 'height'] = this.size + 'px';
	},
	
	setPosition: function (pos) {
		
		if (this.wrapper.style.opacity != '1') {
			this.show();
		}

		pos = Math.round(this.toWrapperProp * pos);

		if (pos < 0) {
			pos = this.shrink ? pos + pos*3 : 0;
			if (this.size + pos < 7) {
				pos = -this.size + 6;
			}
		} else if (pos > this.maxScroll) {
			pos = this.shrink ? pos + (pos-this.maxScroll)*3 : this.maxScroll;
			if (this.size + this.maxScroll - pos < 7) {
				pos = this.size + this.maxScroll - 6;
			}
		}

		pos = this.dir == 'horizontal'
			? translateOpen + pos + 'px,0' + translateClose
			: translateOpen + '0,' + pos + 'px' + translateClose;

		this.bar.style.webkitTransform = pos;
	},

	show: function () {
		if (has3d) {
			this.wrapper.style.webkitTransitionDelay = '0';
		}
		this.wrapper.style.opacity = '1';
	},

	hide: function () {
		if (has3d) {
			this.wrapper.style.webkitTransitionDelay = '350ms';
		}
		this.wrapper.style.opacity = '0';
	},
	
	remove: function () {
		this.wrapper.parentNode.removeChild(this.wrapper);
		return null;
	}
});


Touch.ScrollBar.instances = [];
Touch.ScrollBar.register = function(instance) {
	return Touch.ScrollBar.instances.push(instance);
}





/*
---

name: PaneManager

description: Creates and manages slidable pages on an iPhone

license: MIT-style license.

authors: Kemso, LLC (http://www.kemso.com)

provides: [PaneManager]

...
*/

var PaneManager = new Class({

	Implements: [Options, Events],
	
	options: {
		speed: '500ms',
		events: {
			'add': function(pane){}
		}
	},
	
	initialize: function(wrapper, panes, options)
	{
		
		this.setOptions(options);
		this.addEvents(this.options.events);
		
		this.el = $(wrapper);
		this.el.setStyles({'overflow': 'hidden'});
		
		this.wrapper = new Element('div', {'class': 'pane-wrapper', 'styles': {'height': '100%'}}).inject(this.el);
		this.wrapper.style.webkitTransitionProperty = '-webkit-transform';
		this.wrapper.style.webkitTransitionTimingFunction = 'cubic-bezier(0,0,0.25,1)';
		this.wrapper.style.webkitTransitionDuration = this.options.speed;
		this.wrapper.style.webkitTransform = translateOpen + '0,0' + translateClose;
	
		this.x = 0;
		this.y = 0;
		
		this.current_pane = 0;
		
		// Listen for orientation change
		this.setOrientation();
		window.addEventListener('load', this.setOrientation.bind(this), false);
		window.addEventListener('orientationchange', this.setOrientation.bind(this), false);

		// Add existing pages
		if(typeOf(panes) != 'null') panes.each(this.add.bind(this));		
		
		
	},
	
	setOrientation: function()
	{
		setTimeout(function() {
			window.scrollTo(0, 1);
		}, 100);
		
		var orient = Math.abs(window.orientation) === 90 ? 'landscape' : 'portrait';
		this.el.className = this.el.className.replace(/portrait|landscape/, orient);
		document.body.className = document.body.className.replace(/portrait|landscape/, orient);
		
		// Update wrapper size && pane position
		this.wrapper.setStyle('width', this.wrapper.getChildren().length * this.el.getSize().x);
		this.x = this.current_pane * (orient == 'landscape' ? 480 : 320);
		this.wrapper.style.webkitTransitionDuration = '0';
		this.wrapper.style.webkitTransform = translateOpen + -this.x + 'px,' + this.y + 'px' + translateClose;
		
		
		// Update scroll for each pane
		// Edit: this should be done automatically through the window resize event
		/*
this.wrapper.getChildren().each(function(el){
			if($C(el) && $C(el).scroll) $C(el).scroll.refresh();
		});
*/
	},
	
	
	add: function(el, options)
	{
		if(typeOf(options) != 'object') options = {};
		var pane = new Pane(el, options);
		$(pane).inject(this.wrapper);
		
		if(pane.scroll) pane.scroll.refresh();
		
		this.wrapper.setStyle('width', this.wrapper.getChildren().length * this.el.getSize().x);
		
		// Tell the world
		this.fireEvent('add', [pane]);
		
		return pane;
	},
	
	remove: function(el)
	{
		if(typeOf(el) == 'number') el = this.wrapper.getChildren()[el];
		else el = $(el);
		$C(el).destroy();
	},
	
	go_to: function(el, onComplete)
	{
		if(typeOf(el) == 'number') el = this.wrapper.getChildren()[el];
		else el = $(el);
		
		this.current_pane = el.getIndex();
		
		// Hide URL bar
		window.scrollTo(0, 1);
		
		if( ! this.bind_complete) this.bind_complete = function(){ 
			this.onMoveComplete.attempt(); 
			this.wrapper.removeEventListener('webkitTransitionEnd', this.bind_complete);
		}.bind(this);
			
		if(onComplete)
		{
			this.onMoveComplete = onComplete;
			this.wrapper.addEventListener('webkitTransitionEnd', this.bind_complete);
		}

		this.x = el.getPosition(this.wrapper).x;
		this.y = 0;

		this.wrapper.style.webkitTransitionDuration = this.options.speed;
		this.wrapper.style.webkitTransform = translateOpen + -this.x + 'px,' + this.y + 'px' + translateClose;
	}

});


var Pane = new Class({
	
	Implements: Options,
	
	options: {
		'class_name': 'pane',
		'content_class_name': 'pane-content',
		'scroll': true,
		'toolbar': false //
	},
	
	initialize: function(el, options)
	{
		this.setOptions(options);
		
		if(typeOf(el) == 'null' || (typeOf(el) == 'element' && ! el.hasClass(this.options.class_name)))
		{
			this.el = new Element('div', {'class': this.options.class_name});
			this.content = new Element('div', {'class': this.options.content_class_name}).inject(this.el);
			this.scroll_wrap = new Element('div').inject(this.content);
			if(typeOf(el) == 'element') el.inject(this.scroll_wrap);
		}
		else
		{
			this.el = $(el);
		}
		
		this.el.store('ClassRef', this);
		
		if(this.options.scroll)
		{
			this.scroll = new Touch.Scroll(this.content, {element: this.scroll_wrap, direction: 'vertical', desktopCompatibility: true});
			// make sure window url bar is hidden
			this.scroll.addEvent('scrollStart', function(){ window.scrollTo(0, 1); });
		}
		
		if(this.options.toolbar)
		{
			this.toolbar = new PaneToolbar(this.options.toolbar);
			$(this.toolbar).inject(this.el, 'top');
			this.el.addClass('toolbar');
			
			if(this.options.toolbar.fade)
			{
				this.content.addEvent('tap', function(){
					/* trace('content tap'); */
					$(this.toolbar).fade('toggle');
				}.bind(this));
			}
		}
	},
	
	destroy: function()
	{
		this.el.destroy();
	},
	
	toElement: function()
	{
		return this.el;
	}
	
});


var PaneToolbar = new Class({
	
	Implements: [Options, Events],
	
	options: { 
		'class_name': 'pane-toolbar',
		'back': {
			'class': 'button back',
			'href': '#',
			'text': 'Back'
		}, 
		'title': 'Toolbar', 
		'right': {},
		'fade': false
	},
	
	initialize: function(options)
	{
		this.setOptions(options);
		this.el = new Element('div', {'class': 'pane-toolbar', 'text': this.options.title});
		if(this.options.back)
		this.back = new Element('a', this.options.back).inject(this.el).addEvents({
			/*
'touchstart': function(e){ e.preventDefault(); },
			'click': function(e){ e.stop(); this.fireEvent('back'); }.bind(this),
			'touchend': function(e){ e.stop(); this.fireEvent('back'); }.bind(this)
*/
			'tap': function(e){ this.fireEvent('back'); }.bind(this)
		}); 
		
		if(this.options.fade)
		{
			
		}
	},
	
	toElement: function()
	{
		return this.el;
	}
	
});








/* PageManager.js
----------------------------------------------------------------------------------------------------- */

/*
---
Kemso More Extensions

copyrights:
  - [Kemso](http://kemso.com)

licenses:
  - You may not under any circumstances copy, redistribute, or re-sell this code, 
  	or use it as the basis for another site or application.
  - You may modify this code for the purposes of modifying a single insillation of the 
  	purchased product which which this code was distributed
  - http://whiteloupe.com/license.txt
...
*/

var PageManager = new Class({

	Implements: [Options, Events],
	
	options: {
		page_data: {}
	},
	
	initialize: function(container)
	{
		this.container = document.id(container);
		this.spinner = new Spinner({relativeTo: $('content'), 'size': 'large'});
		$(this.spinner).position({relativeTo: $('content')}).setStyle('top', 150);
		
		// Object to hold the current page data;
		this.page_data = {};
		
		this.page_scroll = new Fx.Scroll(window, {duration: 400});
	},
	
	load: function(url, onComplete)
	{
		this.spinner.on();

		//this.container.getChildren().kill();	
		this.container.set('tween', {duration: 300}).tween('opacity', 0);
		
		this.page_scroll.start(0, 0);
		
		new Request.JSON({url: url}).addEvent('success', function(rsp){
			this.page_data = rsp;
			this.spinner.off();
			this.container.getChildren().destroy();
			this.container.empty().setStyle('opacity', 0).set('html', this.page_data.data.html).tween('opacity', 1);
			this.fireEvent('load', [this.page_data, this.container]);
			if(onComplete) onComplete(rsp, this.container);	
		}.bind(this)).send();
	},
	
	on_load: function(container)
	{
		
	}
});

/* Gallery.js
----------------------------------------------------------------------------------------------------- */

/*
---
Kemso More Extensions

copyrights:
  - [Kemso](http://kemso.com)

licenses:
  - You may not under any circumstances copy, redistribute, or re-sell this code, 
  	or use it as the basis for another site or application.
  - You may modify this code for the purposes of modifying a single insillation of the 
  	purchased product which which this code was distributed
  - http://whiteloupe.com/license.txt
...
*/


var Gallery = new Class({
	
	Implements: [Options, Events],
	
	options: {
		item_selector: '.photo',
		use_hash: true,
		hash_selector: '.hash',
		events: {
			'current': function(){}
		}
	},
	
	current: false,
	last: false,
	
	initialize: function(container, items, options)
	{
		this.setOptions(options);
		
		// The container for the photos
		this.container = document.id(container);
		
		// The photos array
		items = typeOf(items) == 'null' ? this.options.item_selector : items;
		this.items = typeOf(items) == 'elements' ? items : this.container.getElements(items);
		
		// Add default events
		this.addEvents(this.options.events);
		
		// Key nav
		window.addEvent('keyup', function(e){
			switch(e.key)
			{
				case 'right':
					this.next();
					break;
				case 'left':
					this.prev();
					break;
			}
		}.bind(this));
	},
	
	
	next: function()
	{
		this.go_to(Math.min(this.items.length - 1, this.current + 1));
	},
	
	prev: function()
	{
		this.go_to(Math.max(this.current - 1, 0));
	},
	
	go_to: function(el, animate)
	{
		if(typeOf(el) == 'null') return false;
		// el should be an elemnet
		if(typeOf(el) == 'string')
		{
			this.go_to_hash(el, animate); 
			return false;
		}
		el = typeOf(el) == 'number' ? this.items[el] : document.id(el);
				
		// return false if we're on the requested image
		if(el == this.current_item()) return false;
		
		this.last = this.current;
		this.current = el.getIndex(this.options.item_selector);
		this.transition(this.items[this.last], el, animate);
		this.fireEvent('current', [el, this.current, this.items.length, this.get_hash(el)]);
		return el;
	},
	
	go_to_hash: function(hash, animate)
	{
		for(var i = 0, l = this.items.length; i < l; i++)
		{
			if(this.get_hash(this.items[i]) == hash)
			{
				this.go_to(this.items[i], animate);
				break;
			}
		}
	},
	
	transition: function(from, to, animate)
	{
		// Should be overwritten by the sub-class
		
		if(from) from.removeClass('current');
		to.addClass('current');
	},
	
	
	/* Return the current item element */
	current_item: function()
	{
		return this.items[this.current];
	},
	
	/* Get the hash for an element */
	get_hash: function(el)
	{
		if(typeOf(el) == 'number') el = this.items[i];
		if(typeOf(el) == 'null') el = this.current_item();
		if(el.getElement(this.options.hash_selector))
		return el.getElement(this.options.hash_selector).get('value');
		else return false;
	}
	
});





/* ! Gallery.Slide */
// --------------------------------------------------------------------
	
/**
 * A gallery which slides left to right between images.
 * 
 */
 
Gallery.Slide = new Class({
	
	Extends: Gallery,
	
	options: {
		transition: Fx.Transitions.Cubic.easeOut,
		debugTouch: false,
		mouse_scroll: true,
		mouse_scroll_snap: true
	},
	
	initialize: function(container, items, options)
	{
		this.transition_type = 'slide';
		
		this.parent.attempt(arguments, this);
		
		// The element that holds the photos
		this.holder = this.items[0].getParent();
		
		// Set the width of the holder so the photos can fload left.
		var w = 0;
		//var h = 0;
		//var container_width = this.container.getSize().x;
		this.items.each(function(el){
			//el.setStyle('width', container_width);
			w += el.getSize().x + el.getStyle('margin-left').toInt() + el.getStyle('margin-right').toInt();
			//h = Math.max(h, el.getSize().y + el.getStyle('margin-top').toInt() + el.getStyle('margin-top').toIn());
		}.bind(this));
		
		this.holder.setStyle('width', w);
		//this.holder.setStyles({'height')
		
		// Hide all not visible images.
		this.items.each(function(item, i){ 
			//if(i != this.current) item.setStyle('opacity', 0);
			item.set('tween', {transition: this.options.transition, link: 'cancel'});
		}.bind(this));
		
		// Scroll Effect
		var desktop_touch = false; //Browser.safari;
		if(desktop_touch || this.options.debugTouch || Browser.Platform.ios || Browser.Platform.android || Browser.Platform.webos)
		{
			this.scroll = new Touch.Scroll(this.container, {
				desktopCompatibility: this.options.debugTouch,
				direction: 'horizontal',
				snap: true,
				momentum: false,
				vScrollbar: false,
				hScrollbar: false,
				events: {
					'scrollEnd': function (pos) {
						for(var i = 0, l = this.items.length; i < l; i++)
						{
							var item = this.items[i];
							var x = item.getPosition(this.holder).x;
							var scroll_x = Math.abs(pos.x);
							if(x - scroll_x >= 0 && x - scroll_x + item.getSize().x <= this.container.getSize().x)
							{
								this.current = i;
								this.fireEvent('current', [item, this.current, this.items.length, this.get_hash(item)]);
								break;
							}
						}
						this.fireEvent('transitionEnd');
					}.bind(this),
					
					'scrollStart': function(){
						this.fireEvent('transitionStart');
					}.bind(this)
				}
			 });
		}
		else
		{
			this.scroll = new Fx.Scroll(this.container, {transition: this.options.transition, link: 'cancel', duration: 650}).addEvent('complete', function(){
				this.fireEvent('transitionEnd');
			}.bind(this));
			
			// Mouse scroll?
			if( ! Browser.firefox && ! Browser.safari && ! Browser.chrome) this.options.mouse_scroll = false;
			if(this.options.mouse_scroll == '1' || this.options.mouse_scroll === true){
				var mw_tracker = 0;
				this.mouse_scroll = new Kemso.ScrollBar(this.container, false, false, {axis: 'x', events: {
					'start': function(){
						this.scroll.cancel();
						this.fireEvent('mouseScrollStart');
						mw_tracker = 0;
					}.bind(this),
					'scroll': function(){
						mw_tracker++;
						if(mw_tracker % 2 == 0){
							this.fireEvent('mouseScroll');
							var visible_items = [];
							var pos = this.container.getScroll();
							var container_width = this.container.getSize().x;
							var found = false;
							for(var i = 0, l = this.items.length; i < l; i++)
							{
								var item = this.items[i];
								var x = item.getPosition(this.holder).x;
								var scroll_x = Math.abs(pos.x);
								// if more than half of the item is showing.
								var halfway = x + (item.getSize().x/2);
								if(x >= scroll_x && x <= scroll_x + container_width && ! visible_items.contains(i))
								{
									found = true;
									visible_items.push(i);
									this.fireEvent('mouseScrollItemVisible', item);
								}else{
									if(found == true) break;
								}
							}
						}
					}.bind(this),
					'end': function(){
						var pos = this.container.getScroll();
						this.fireEvent('mouseScrollEnd');
						for(var i = 0, l = this.items.length; i < l; i++)
						{
							var item = this.items[i];
							var x = item.getPosition(this.holder).x;
							var scroll_x = Math.abs(pos.x);
							// if more than half of the item is showing.
							var halfway = x + (item.getSize().x/2);
							if(halfway >= scroll_x && halfway <= scroll_x + this.container.getSize().x)
							{
								if(this.options.mouse_scroll_snap){
									this.current = false;
									this.go_to(i);
								}else{
									this.current = i;
									this.fireEvent('current', [item, this.current, this.items.length, this.get_hash(item)]);
									this.fireEvent('transitionEnd');
								}
								break;
							}
						}
					}.bind(this)
				}});
			}
			
		}
		
		 
		this.addEvent('current', function(el){
			//el.get('tween').cancel();
			//el.tween('opacity', [0,1]);
		});
	},
	
	transition: function(from, to, animate)
	{
		this.parent(from, to, animate);
		
		animate = typeOf(animate) == 'null' ? true : animate;
		
		if(animate)
		{
			//if(from) from.fade('out');
			//to.get('tween').cancel();
			//to.setStyle('opacity', 1);
			this.scroll.toElement(to);
			this.fireEvent('transitionStart', to);
		}
		else
		{
			//if(from) from.setStyle('opacity', 0);
			//to.get('tween').cancel();
			//to.setStyle('opacity', 0).tween('opacity', [0,1]);
			this.scroll.set(to.getPosition(this.holder).x, 0);
			this.fireEvent('transitionEnd', [from, to]);
		}
	}

});




/* ! Gallery.Fade */

// --------------------------------------------------------------------
	
/**
 * A gallery which fades between images.
 * 
 */
 
Gallery.Fade = new Class({
	
	Extends: Gallery,
	
	options: {
		transition: Fx.Transitions.Sine.easeOut
	},
	
	initialize: function()
	{
		this.transition_type = 'fade';
		
		this.parent.attempt(arguments, this);
		
		// The element that holds the photos
		this.holder = this.items[0].getParent().setStyle('overflow', 'hidden');
				
		// Hide all not visible images.
		this.items.each(function(item, i){
			if(item.hasClass('overview')) item.setStyles({'position': 'relative'});
			else item.setStyles({'position': 'absolute'});
			item.setStyles({'z-index': 0, 'opacity': 0});
			item.set('tween', {transition: this.options.transition, link: 'cancel'});
		}.bind(this));
		
		this.addEvent('current', function(el){
			this.container.setStyle('min-height', el.getSize().y);
		});
		
		// Is touch?
		if(Browser.Platform.ios || Browser.Platform.android || Browser.Platform.webos)
		{
			this.container.addEvent('swipe', function(e){
				if(e.direction == 'left') this.next();
				else if(e.direction == 'right') this.prev();
			}.bind(this));
		}
		
		// For css fade transitions
		this.css_fade_end = function(){ this.fireEvent('transitionEnd'); }.bind(this);
	},
	
	transition: function(from, to, animate)
	{
		//this.container.setStyle('min-height', to.getSize().y);
	
		this.parent(from, to, animate);
		
		animate = typeOf(animate) == 'null' ? true : animate;
		if(animate)
		{
			this.fireEvent('transitionStart', to);
			
			// Use CSS transitions where available for better results
			var usecss = true;
			if(usecss && (Browser.Platform.ios || Browser.Platform.android || Browser.Platform.webos || Browser.safari || Browser.chrome))
			{
				
				if(from)
				{
					from.removeEventListener('webkitTransitionEnd', this.css_fade_end);
					from.style.webkitTransitionProperty = 'opacity';
					from.style.webkitTransitionTimingFunction = 'cubic-bezier(0,0,0.25,1)';
					from.style.webkitTransitionDuration = '500ms';
					from.style.opacity = 0;
				}
				
				to.removeEventListener('webkitTransitionEnd', this.css_fade_end);
				to.addEventListener('webkitTransitionEnd', this.css_fade_end);
				to.style.webkitTransitionProperty = 'opacity';
				to.style.webkitTransitionTimingFunction = 'cubic-bezier(0,0,0.25,1)';
				to.style.webkitTransitionDuration = '500ms';
				to.setStyle('opacity', 1);
			}
			else
			{
				
				if(from){
					from.get('tween').removeEvents('complete');
					from.fade('out');
				}
				to.get('tween').removeEvents('complete');
				to.get('tween').addEvent('complete', function(){ this.fireEvent('transitionEnd'); }.bind(this));
				to.fade('in');
			}
		}
		else
		{
			if(from) from.setStyle('opacity', 0);
			to.setStyle('opacity', 1);
			this.fireEvent('transitionEnd');
		}
		
		(function(){
			if(from) from.setStyle('z-index', 1);
			to.setStyle('z-index', 5);
		}).delay(500);
	}

});





// --------------------------------------------------------------------
	
/**
 * THIS gallery
 * 
 */
Gallery.One = {
	
	Extends: Gallery.Slide,
	
	initialize: function(gallery, items, options)
	{				
		this.root = document.id(gallery);
		this.navigation = this.root.getElement('.navigation');
		this.next_area = this.root.getElement('.right-button').off();
		this.prev_area = this.root.getElement('.left-button').off();
	
		
		this.parent(this.root.getElement('.container'), items, options);
		
		// Add mouse scroll to event to buttons, since they overlay the container
		if(typeOf(this.mouse_scroll) != 'null' && this.mouse_scroll){
			this.next_area.addEvent('mousewheel', this.mouse_scroll.mousewheel.bind(this.mouse_scroll));
			this.prev_area.addEvent('mousewheel', this.mouse_scroll.mousewheel.bind(this.mouse_scroll));
		}
		
		
		// Add meta area
		this.meta = new Element('div', {'id': 'photo_meta', 'styles': {'z-index': 0}}).inject('content-container').set('tween', {duration: 250});
		this.items.each(function(el){
			if(el.getElement('.meta')) el.getElement('.meta').setStyle('visibility', 'hidden');
		});
		
		// When a photo is selected, set the current status
		this.addEvent('current', function(el, index, total){
			// Gallery height is the height of the largest image
			//this.container.setStyle('height', el.getSize().y + this.navigation.getSize().y + this.navigation.getStyle('margin-top').toInt() + this.navigaton.getStyle('margin-bottom').toInt());
			
			
			
			// Change navigation
			if(el.hasClass('overview'))
			{
				this.navigation.getElement('.current').set('text', 'Overview');
				this.navigation.getElement('.location').off();
				
				// Hide clickable areas
				this.next_area.off();
				this.prev_area.off();
			}
			else
			{
				var current = this.items[0].hasClass('overview') ? index : index + 1;
				this.navigation.getElement('.current').set('text', current);
				
				this.navigation.getElement('.location').on();
				
				// Show clickable areas
				if(typeOf(isTouch) == 'null' || isTouch == false)
				{
					this.next_area.on({opacity: 0, visibility: 'visible'});
					this.prev_area.on({opacity: 0, visibility: 'visible'});
				}
			}
			
			
			if(index == 0) this.navigation.getElement('.prev').addClass('disabled');
			else this.navigation.getElement('.prev').removeClass('disabled');
			
			if(index == this.items.length - 1) this.navigation.getElement('.next').addClass('disabled');
			else this.navigation.getElement('.next').removeClass('disabled');
			
			// Set height of buttons
			var props = {
				'top': this.container.getPosition(this.root).y, 
				'bottom': 'auto', 
				'height': el.getElement('img').getSize().y
			};
			this.prev_area.setStyles(props);
			this.next_area.setStyles(props);
		}.bind(this));
		
		this.addEvent('transitionStart', function(){
			this.meta.tween('opacity', 0);
		}.bind(this));
		
		this.addEvent('transitionEnd', function(){
			var el = this.current_item();
			// update meta
			if(el.getElement('.meta') && el.getElement('.meta').get('text').trim() != '')
			{
				this.meta.on().setStyles({'opacity': 0, 'width': el.getElement('.meta').getStyle('width')}).set('html', el.getElement('.meta').get('html'));
				this.meta.setStyles({
					'position': 'absolute',
					'left': el.getElement('.meta').getPosition(el).x + this.container.getPosition('content-container').x,
					'top': el.getElement('.meta').getPosition(el).y + this.container.getPosition('content-container').y
				});
				//el.getElement('.meta').off();
				this.meta.tween('opacity', 1);
			}
			else
			{
				this.meta.set('html', '').off();
			}
		}.bind(this));
		
		// Clickabe Nave Regions
		this.prev_area.addEvent('click', function(e){ e.stop(); this.prev(); }.bind(this));
		this.next_area.addEvent('click', function(e){ e.stop(); this.next(); }.bind(this));
		
		// So fast double clicks don't select text - DOESN'T WORK
		// this.root.addEvent('select', function(e){ return false; });
		
		this.navigation.getElement('.prev').addEvent('click', function(e){ e.stop(); this.prev(); }.bind(this));
		this.navigation.getElement('.next').addEvent('click', function(e){ e.stop(); this.next(); }.bind(this));
		this.navigation.getElement('.total').set('text', this.items[0].hasClass('overview') ? this.items.length - 1 : this.items.length);
		this.navigation.getElement('.title').addEvent('click', function(e){ e.stop(); this.go_to(0); }.bind(this));
		
		// If there's an album overview, add click events to thumbnails
		if(this.items[0].hasClass('overview'))
		{
			this.items[0].getElements('.thumbnail').addEvent('tap', function(e){
				e.stop();
				var a = e.target.get('tag') == 'a' ? e.target : e.target.getParent('a');
				this.go_to($(a.get('href').substr(1)));
			}.bind(this));
		}
		
		
		// go_to first image - (This is now handled by the location hash)
		//this.go_to(0);
	}
		
};


Gallery.One.Extends = Gallery.Slide;
Gallery.OneSlide = new Class(Gallery.One);

Gallery.One.Extends = Gallery.Fade;
Gallery.OneFade = new Class(Gallery.One);


Gallery.Controller = new Class({
	
	Implements: [Options, Events],
	
	options: {
		location: false,	// The initial location to go to
		
		// Album data
		id: false,
		title: false,
		url_title: false,
		show_overview: 0,
		hide_description: 1,
		transition_type: 'Slide',
		mouse_scroll: true,
		mouse_scroll_snap: true
	
	},
	
	initialize: function(el, items, options)
	{
		this.setOptions(options);
		
		// Extract variables into scope
		for(var i in this.options) this[i] = this.options[i];
		
		this.transition_type = this.transition_type != '0' ? this.transition_type : 'Slide';
		this.gallery = new Gallery['One'+this.transition_type](el, items, this.options);
		
		// Expose gallery methods to this class
		['get_hash', 'go_to'].each(function(method){
			this[method] = this.gallery[method].bind(this.gallery);
		}.bind(this));
		
		
		// Do we show the gallery description?
		if(this.hide_description == '1')
		{
			this.gallery.container.getElement('.overview .description').off();
			//this.gallery.container.getElement('.overview .title').off();
			
			if(this.gallery.container.getElement('.overview .description').get('text') != '')
			{
				new Element('a', {'href': '#', 'text': 'Info', 'class': 'show-description'}).inject(this.gallery.container.getElement('.overview .title'))
				.addEvent('click', function(e){
					e.stop();
					this.gallery.container.getElement('.overview .description').get('reveal').toggle();
				}.bind(this));
			}
			
		}
		
		
		// Go to either the requested hash location, or the thumbs/first image.
		var location = this.options.location && document.id('content').getElement('.gallery').getElement('input[value="'+this.options.location+'"]') 
		? document.id('content').getElement('.gallery').getElement('input[value="'+this.options.location+'"]').getParent('.item') 
		: (this.show_overview == '1' ? 0 : 1);
		this.go_to(location, false);
	}
	
});

/* Controller.js
----------------------------------------------------------------------------------------------------- */

/*
---
Ember Page Controller: The Ember default controller

copyrights:
  - [Kemso, Whiteloupe](http://kemso.com, http://whiteloupe.com)

licenses:
  - You may not under any circumstances copy, redistribute, or re-sell this code, 
  	or use it as the basis for another site or application.
  - You may modify this code for the purposes of modifying a single insillation of the 
  	purchased product which which this code was distributed
  - http://whiteloupe.com/license.txt
...
*/


var Controller = new Class({
	
	Implements: [Options, Events],
	
	options: {
		page_id: false,		/* ID of the page - used for setting the selected navigation */
		run_intro: false,
		preload_assets: ['assets/images/input-shadow.png']
	},
	
	/* 
	|
	|	Set options.Initialize the page.
	|
	*/
	initialize: function(options)
	{

		/*
		*	Set the options
		*/
		this.setOptions(options);
		
		/*
		*	Window reference
		*/
		window.controller = this;
		
		/*
		*	Add selected class to the current page in the navigation
		*/
		if(this.options.page_id !== false && $(this.options.page_id))
		{
			if($('navigation').getElement('.selected')) $('navigation').getElement('.selected').removeClass('selected');
			$(this.options.page_id).addClass('selected');
		}
		
		
		/*
		*	Page Manager
		*/
		this.page_manager = new PageManager('content-container');
		
		
		/*
		*	iPad detection
		*/
		var isiPad = navigator.userAgent.match(/iPad/i) != null;
		if(isiPad)
		{
			$(document.body).addClass('ipad');
			var onorientationchange = function(e){
				switch(window.orientation)
				{
					case 0:
						$(document.body).addClass('portrait');
						break;
					default:
						$(document.body).removeClass('portrait');
						break;
				}
			};
			window.onorientationchange = onorientationchange;
			onorientationchange();
		}
		
		this.hide_site();
		
		this.fireEvent('siteReady');
		
		/*
		 *	Preload assets
		 */ 
		 
		this.preload_spinner = new Spinner({size: 'large'}).start();
		$(this.preload_spinner).position();
			
		var assets = this.options.preload_assets;
		if(this.options.assets_to_preload) assets.combine(this.options.assets_to_preload);
		if($('logo').getElement('img')) assets.push($('logo').getElement('img').get('src'));
		
		new AssetLoader(assets, {events: {
			'load': function(){
				this.preload_spinner.destroy();
				this.animate();
			}.bind(this)
		}});
		
		/*
		*	Animation.
		*/
		//this.animate();

	},
	
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Hide site - set up for animation
	 * 
	 */
	hide_site: function()
	{
		// Turn off content
		
		$('content').setStyles({'opacity': 0, 'height': 10, 'overflow': 'hidden'});
		$('site').store('orig_height', $('site').getStyle('height') || 'auto').setStyles({'height': '600px', 'overflow': 'hidden'});
				
		// Logo, Nav & footer
		var logo_width = $('logo').getSize().x;
		if( ! $('logo').getElement('.logo img')){
			$('logo').getElement('.logo').setStyles({'width': logo_width});
		}
		$('logo').setStyles({'overflow': 'hidden', 'padding-left': logo_width})
		.set('tween', {transition: Fx.Transitions.Quint.easeInOut});
		$('navigation').getElements('li').setStyle('opacity', 0);
		$('footer').setStyle('opacity', 0);
		$('sidebar').getElement('.footer').setStyle('opacity', 0);
		$('sidebar').setStyle('visibility', 'hidden');	
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Initial page animation
	 * 
	 */
	animate: function()
	{
		// Turn intro off for testing purposes
		//this.options.run_intro = false;
				
		if(this.options.run_intro)
		{
			this.intro_animate();
		}
		else
		{
			$('content').tween.delay(100, $('content'), ['opacity', 1]);
			this.simple_animate();
		}		
	},
	
	simple_animate: function()
	{
		this.ready();
		$('sidebar').setStyle('visibility', 'visible');
		$('logo').tween('padding-left', 0);
		
		$('navigation').getElements('li').each(function(li, i){
			li.tween.delay(100*i, li, ['opacity', 1]);
		});
		
		$('content').setStyles({'height': 'auto', 'overflow': 'visible'});
		$('site').setStyles({'height': $('site').retrieve('orig_height'), 'overflow': 'visible'});
		$('content').tween.delay(100, $('content'), ['opacity', 1]);
		$('footer').tween.delay(100, $('footer'), ['opacity', 1]);
		$('sidebar').getElement('.footer').tween.delay(400, $('sidebar').getElement('.footer'), ['opacity', 1]);
		
		this.fireEvent.delay(900, this, ['postAnimation']);
	},
	
	intro_animate: function()
	{
		var logo = new Element('div', {'styles': {'opacity' : 0}}).inject($(document.body));
		$('logo').clone().setStyles({'padding': 0, 'margin': 0}).addClass('intro-anim-image').inject(logo);
		if(logo.getElement('a')) {
			new Element('span', {html: logo.getElement('a').get('html'), 'class': logo.getElement('a').get('class')}).inject(logo.getElement('a').getParent());
			logo.getElement('a').destroy();
		}
		
		logo.position().set('morph', {duration: 500});
		var logo_top = logo.getStyle('top').toInt();
		logo.setStyle('top', logo_top - 30);
		logo.morph({'opacity': [0, 1], 'top': logo_top});
		
		setTimeout(function(){
			this.ready();
			$('sidebar').setStyle('visibility', 'visible');
			logo.morph({'opacity': [1, 0], 'top': logo.getStyle('top').toInt() + 30});
			logo.get('morph').addEvent('complete', function(){
				logo.destroy();
				$('logo').tween('padding-left', 0);
				$('navigation').getElements('li').each(function(li, i){
					li.tween.delay(100*i, li, ['opacity', 1]);
				});
				$('content').setStyles({'height': 'auto', 'overflow': 'visible'});
				$('site').setStyles({'height': $('site').retrieve('orig_height'), 'overflow': 'visible'});
				$('content').tween.delay(100, $('content'), ['opacity', 1]);
				$('footer').tween.delay(100, $('footer'), ['opacity', 1]);
				$('sidebar').getElement('.footer').tween.delay(1000, $('sidebar').getElement('.footer'), ['opacity', 1]);
				this.fireEvent.delay(1500, this, ['postAnimation']);
				
			}.bind(this))
		}.bind(this), 2500);		
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * When this controller is done and ready to move on
	 * 
	 */
	ready: function()
	{
		
	}
	
	
	
});


function preloadImages() {
  	var d=document;
  	if(d.images){
  		if(!d.MM_p) d.MM_p=new Array();
		var i,j=d.MM_p.length,a=preloadImages.arguments;
		for(i=0; i<a.length; i++){
			if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}
		}
    }
}

preloadImages('assets/images/spinner.png');

/* Portfolio.js
----------------------------------------------------------------------------------------------------- */

/*
---
Portfolio page Controller: Home handles pages & galleris

copyrights:
  - [Kemso, Whiteloupe](http://kemso.com, http://whiteloupe.com)

licenses:
  - You may not under any circumstances copy, redistribute, or re-sell this code, 
  	or use it as the basis for another site or application.
  - You may modify this code for the purposes of modifying a single insillation of the 
  	purchased product which which this code was distributed
  - http://whiteloupe.com/license.txt
...
*/


var Portfolio = new Class({
	
	Extends: Controller,
	
	// Extend options here
	options: {
		page_type: 'Gallery',
		page_data: {} /* Options for the specific page data */,

		auto_gallery_height: true,
		mouse_scroll: true,
		mouse_scroll_snap: true,
		mouse_scroll_hide_navigation: false,
		gallery_height_on_mouse_scroll: true,
		change_page_with_arrows: true,
		lazy_load: true,
		lazy_load_count: 1
	},
	
	initialize: function(options)
	{
		if(typeOf(window.portfolio_default_options) == 'object')
		{
			this.setOptions(window.portfolio_default_options);
		}
		
		this.parent(options);
		
		/*
$(document.body).setStyles({'height': '100%'});
		$('site').setStyles({
			'height': '100%',
			'width': '100%',
			'position': 'absolute',
			'top': 0, 'right': 'auto', 'bottom': 0, 'left': 'auto'
		});
		new Kemso.ScrollBar.Auto($('site'));
*/
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * When the home page is loaded.
	 * 
	 */
	ready: function()
	{
		this.parent.attempt(arguments, this);
		
		this.page = false;
		
		
		/*
		*	Intercept navigation link clicks to load via AJAX
		*/
		$('navigation').getElements('a[rel^=create]').addEvent('click', function(e){
			e.stop();
			this.nav_click(e.target);
		}.bind(this));
		
			
		/*
		*	Locaton Hash
		*/
		this.hash = new LocationHash({schema: ['type'], listen_only: true}).addEvent('change', this.handle_hash_change.bind(this));		
		
		
		/*
		* Rest before starting the current page, so the controller has a change to return
		*/
		this.start.delay(50, this);
		
		
		/*
		*	Change pages with vertical arrow keys
		*/
		if(this.options.change_page_with_arrows)
		{
			window.addEvent('keyup', function(e){
				switch(e.key)
				{
					case 'up':
						if($('galleries-nav').getElement('.selected') && $('galleries-nav').getElement('.selected').getPrevious('li a[rel^=create]'))
						{
							this.nav_click($('galleries-nav').getElement('.selected').getPrevious('li a[rel^=create]'));
						}
						break;
					case 'down':
						if($('galleries-nav').getElement('.selected') && $('galleries-nav').getElement('.selected').getNext('li a[rel^=create]'))
						{
							this.nav_click($('galleries-nav').getElement('.selected').getNext('li a[rel^=create]'));
						}
						break;
				}
			}.bind(this));
		}
		
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Start
	 * 
	 */
	start: function()
	{
		/*
		*	Load the hash location, or set up the present location
		*/		
		if(location_hash())
		{
			this.handle_hash_change();
		}
		else
		{
			this.create(this.options.page_type);
			this.page.setup(this.options.page_data);
		}
	},
	
	
	nav_click: function(el)
	{
		if(el.get('ext') && el.get('ext') != '')
		{
			window.open(el.get('ext'));
			return false;
		}
		var rules = eval(el.get('rel').match(/^create(\[.+\])$/)[1]);
		if(this.create(rules.shift(), rules))
		{			
			// Analytics
			if(typeOf(_gaq) != 'null' && _gaq){
				_gaq.push(['_trackPageview', el.get('href').substr(config.get('site_url').length)]);
			}
		}
		else
		{
			// Couldn't create the page?
		}
		
		// Select the item in the nav
		$('navigation').getElements('.selected').removeClass('selected');
		el.getParent('li').addClass('selected');
		
		this.fireEvent('navClick', el.getParent('li'));
	},
	
	
	
	// --------------------------------------------------------------------
		
	/**
	 * When a link that has a create rule is clicked
	 * 
	 */
	create: function(type, args)
	{
		if( ! Pages[type]) { trace('Couldn\'t find a page controller for "'+type+'"'); return false; }
		
		/*
		*	If the current page matches the requeste type, call the current method to see if we need to reload.
		* 	If current method returns false, then we're not in the right place, so load a new page.
		*/
		if(this.page && this.page.type == type && typeOf(this.page.current) == 'function')
		{
			if(this.page.current.attempt(args, this.page)) return true;
		}
		delete this.page;
		this.page = new Pages[type]().addEvents({
			'ready': this.page_ready.bind(this)
		});
		this.page.start.attempt(args, this.page);
		
		return true;
	},
	
	get_page: function()
	{
		return this.create.attempt(arguments, this);
	},
	
	
	page_ready: function()
	{
		// Select the item in the nav
		$('navigation').getElements('.selected').removeClass('selected');
		var nav_item = false;
		switch(this.page.type)
		{
			case 'Gallery':
				nav_item = 'gallery_'+this.page.options.id;
				break;
			case 'Page':
				nav_item = 'page_'+this.page.options.id;
				break;
			case 'Contact':
				nav_item = 'page_contact';
				break;
		}
		if(nav_item && $(nav_item)) $(nav_item).addClass('selected');
		
		/*
		*	Add class to body
		*/
		$(document.body).set('class', this.page.type);
		var c = this.page.type;
		if(this.page.options.id) $(document.body).addClass(this.page.type + this.page.options.id);
		
		// Tell anyone listening
		this.fireEvent('pageReady', [this.page]);
	},
	
	
	// --------------------------------------------------------------------
		
	/**
	 * On hash changes
	 * 
	 */
	handle_hash_change: function()
	{
		var schema = this.hash.get();
		// trace('hashchange: '+schema.type+': '+schema.arguments);
		this.get_page(schema.type, schema.arguments);
	}
	
});




// --------------------------------------------------------------------
	
/**
 * Pages object holds page type classes
 * Page controllers stand along to support ajax page loading
 * 
 */
var Pages = {};




// ! Standard Page --------------------------------------------------------------------
	
/**
 * 
 * 
 */
Pages.Page = new Class({
	
	Implements: [Options, Events],
	
	type: 'Page',
	
	initialize: function()
	{
	
	},
	
	options: {
		
	},
	
	initialize: function()
	{
	
	},
	
	start: function(id)
	{
		if(typeOf(id) != 'null')
		{
			// Need to load a new page
			controller.page_manager.load(config.get('site_url')+'portfolio/page/'+id+'/json', function(rsp, el){
				
				this.setup(rsp.data.page_data);
				
			}.bind(this));
		}
	},
	
	
	setup: function(data)
	{
		this.setOptions(data);
		controller.hash.set('Page', this.options.url_title);
		if(this.options.hide_title == '1') $('content').getElement('h1.title').off();
		
		/*
		*	Add loaders to images
		*/
		document.id('content').getElements('img').each(function(img){
			new LoadImage(img, {'spinner_size': 'small', replace: false});
		});
		
		this.fireEvent('ready');
	},
	
	current: function(id)
	{
		if(id == this.options.id || id == this.options.url_title) return true;
		else return false;
	}
	
});






// ! Contact Page --------------------------------------------------------------------
	
/**
 * Contact Page
 * 
 */
Pages.Contact = new Class({
	
	Extends: Pages.Page,
	
	type: 'Contact',
	
	start: function()
	{		
		// Need to load a new page
		controller.page_manager.load(config.get('site_url')+'portfolio/contact/json', function(rsp, el){
			
			this.setup(rsp.data.page_data);
			
		}.bind(this));
		
	},
	
	setup: function(data)
	{
		this.setOptions(data);
		controller.hash.set('Contact');
		if(this.options.hide_title == '1') $('content').getElement('h1.title').off();
		
		/*
		*	Add loaders to images
		*/
		document.id('content').getElements('img').each(function(img){
			new LoadImage(img, {'spinner_size': 'small', replace: false});
		});
		
		if($('contact-form'))
		{
			var sending_spinner = new Spinner({size: 'small'});
			var form_button = $('contact-form').getElement('button[type="submit"]');
			var response = $('contact-form').getElement('.response-text');
			$('contact-form').addEvent('submit', function(e){
				e.stop();				
				this.send();
			});
			
			$('contact-form').get('send').addEvents({
				'request': function(rsp){
					form_button.set('html', '<em>Sending</em>');
					$(sending_spinner).position({relativeTo: form_button, position: 'centerRight', edge: 'centerLeft', offset: {x: 10}});
					sending_spinner.on();
					response.off();
				},
				'complete': function(rsp){
					form_button.set('html', 'Send');
					sending_spinner.off();
					response.on();
				},
				'success': function(rsp){
					rsp = JSON.decode(rsp);
					response.set('text', rsp.msg);
					if(rsp.status == 'ok')
					{
						$('contact-form').reset();
					}
				},
				'failure': function(){
					response.set('text', 'An error occured sending your message. Please try again.');
				}
			});
		}
		
		
		this.fireEvent('ready');
	}	
	
});






// ! Gallery page --------------------------------------------------------------------
	
/**
 * Gallery page
 * 
 */
Pages.Gallery = new Class({
	
	Implements: [Options, Events],
	
	type: 'Gallery',
	
	options: {
		
	},
	
	initialize: function()
	{		
		
	},
	
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Start
	 * 
	 */
	start: function(id, location)
	{
		/*
		*	Need to load a new gallery
		*	The controllers page manager handles loading content via Ajax
		*/
		
		if(typeOf(id) != 'null')
		{
			controller.page_manager.load(config.get('site_url')+'portfolio/gallery/'+id+'/json', function(rsp, el){
				//var new_hash = data.data.album.url_title;
				//if(typeOf(image) != 'null') new_hash += '/'+image;
				this.setup(rsp.data.page_data);
				if(location) this.gallery.go_to(location, false);
			}.bind(this));
		}
		
		$('content').getElement('.gallery .container').set('tween', {duration: 250});
	},
	
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Set up the page
	 * album - object of album information
	 */
	setup: function(options)
	{
		// Copy in controller options
		this.setOptions(window.controller.options);
				
		// Then override with gallery options
		this.setOptions(options);
	
	
		if(typeOf(this.options.lazy_load) == 'null' || ! this.options.lazy_load || this.options.lazy_load == '[lazy_load]')
		{
			document.id('content').getElement('.gallery').getElements('.photo img').each(function(img){
				new LoadImage(img, {'spinner_size': 'small', replace: true});
			});
		}
		
		
		// Stop flashing/bad rendering on iOS
		document.id('content').getElement('.gallery').getElements('.item').setStyles({
			'-webkit-transform': 'translate3d(0px, 0px, 0px)'
		});
		
		
		/*
		*	Start the Gallery
		*/
		this.gallery = new Gallery.Controller(document.id('content').getElement('.gallery'), null, Object.merge({}, this.options, {
			/* location: location, */
			item_selector: '.item',
			events: {
				'current': function(el, index, total, hash){
					
					/*
					*	Thumbnails
					*/
					if(index == 0 && el.hasClass('overview'))
					{
						// Add loaders to thumbnails
						el.getElements('.thumbnail img').each(function(img){
							new LoadImage(img, {'spinner_size': 'small', replace: true});
						});
					}
					
					/*
					*	Image
					*/
					// Load the image
					if( ! el.hasClass('overview'))
					{
						var img = el.getElement('img');
						new LoadImage(img, {'spinner_size': 'small', replace: true});
					}					
					
					
					
					// Set the url hash & page title
					controller.hash.set(this.type, this.options.url_title, hash);
					var page_title = controller.options.site_name + ' - ' + this.options.title;
					if(el.getElement('.meta .title') && el.getElement('.meta .title').get('text').trim() != '')
					page_title += ' - ' + el.getElement('.meta .title').get('text').trim();
					document.title = page_title;
					
					// Select the appropriate tick.
					$('content').getElements('.gallery .navigation .tick').removeClass('selected');
					if(index > 0) $('content').getElements('.gallery .navigation .tick')[index - 1].addClass('selected');
					
					// Size the gallery container
					if(typeOf(this.options.auto_gallery_height) == 'null' || this.options.auto_gallery_height)
					{
						$('content').getElement('.gallery .container').tween('height', el.getSize().y);
					}
					
				}.bind(this),
				
				'transitionStart': function(){
					// Scroll to top of image if more than 1/3 is hidden
					if(this.current_item().getPosition().y < $(window).getScroll().y 
						&& $(window).getScroll().y - this.current_item().getPosition().y > this.current_item().getSize().x / 3){
						controller.page_manager.page_scroll.start(0, this.current_item().getPosition().y);
					}
				},
				
				'transitionEnd': function(){
					
					var el = this.current_item();
					
					// Preload the next images
					var lc = el;
					var cc = 0;
					while(cc < this.options.lazy_load_count)
					{
						if(lc.getNext('.photo'))
						{
							lc = lc.getNext('.photo');
							cc++;
							new LoadImage(lc.getElement('img'), {'spinner_size': 'small', replace: true});
						}else {
							break;
						}
					}
					
					// Preload the previous images
					var lc = el;
					var cc = 0;
					while(cc < this.options.lazy_load_count)
					{
						if(lc.getPrevious('.photo'))
						{
							lc = lc.getPrevious('.photo');
							cc++;
							new LoadImage(lc.getElement('img'), {'spinner_size': 'small', replace: true});
						}else{
							break;
						}
					}
				},
				
				'mouseScrollStart': function(){
					
					$('photo_meta').fade('out');
					controller.page_manager.page_scroll.cancel();
					// open up the container
					if(this.options.auto_gallery_height && this.options.gallery_height_on_mouse_scroll)
					$('content').getElement('.gallery .container').setStyle('height', $('content').getElement('.gallery .container .photos').getSize().y);
										
					if(this.options.mouse_scroll_hide_navigation)
					$('content').getElement('.gallery .navigation').setStyle('opacity', 0);
				},
				
				'mouseScrollItemVisible': function(el){
					var img = el.getElement('img');
					new LoadImage(img, {'spinner_size': 'small', replace: true});
				},
				
				'mouseScrollEnd': function(){
					if(this.options.mouse_scroll_hide_navigation)
					$('content').getElement('.gallery .navigation').tween('opacity', 1);
				}
			}
		}));
		
		$('content').getElements('.gallery .navigation .tick').each(function(el, index){
			el.addEvent('click', function(e){
				e.stop();
				this.gallery.go_to(index + 1);
			}.bind(this));
		}.bind(this));
		
		this.fireEvent('ready');
	},
	

	
	
	// --------------------------------------------------------------------
		
	/**
	 * Change
	 * 
	 */
	change: function(location)
	{
		this.gallery.go_to(location);
	},
	
	
	
	// --------------------------------------------------------------------
		
	/**
	 * Current
	 * 
	 */
	current: function(id, location)
	{
		if(id == this.options.id || id == this.options.url_title)
		{
			if(typeOf(location) != 'null') this.change(location);
			return true;
		}
		else
		{
			return false;
		}
	}
	
});



/* End of file */

/* Domready
----------------------------------------------------------------------------------------------------- */

window.addEvent('domready', function(){ config = new Hash(config); if(typeOf(ember_domready) == 'function') ember_domready(); });
