//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2009 Aaron Newton <http://clientcide.com/>, Valerio Proietti <http://mad4milk.net> & the MooTools team <http://mootools.net/developers>, MIT Style License.

/*
---

script: More.js

description: MooTools More

license: MIT-style license

authors:
- Guillermo Rauch
- Thomas Aylott
- Scott Kyle

requires:
- core:1.2.4/MooTools

provides: [MooTools.More]

...
*/

MooTools.More = {
    'version': '1.2.4.2',
    'build': 'bd5a93c0913cce25917c48cbdacde568e15e02ef'
};

/*
---

script: Elements.From.js

description: Returns a collection of elements from a string of html.

license: MIT-style license

authors:
- Aaron Newton

requires:
- core:1.2.4/Element
- /MooTools.More

provides: [Elements.from]

...
*/

Elements.from = function(text, excludeScripts){
    if ($pick(excludeScripts, true)) text = text.stripScripts();
    
    var container, match = text.match(/^\s*<(t[dhr]|tbody|tfoot|thead)/i);
    
    if (match){
        container = new Element('table');
        var tag = match[1].toLowerCase();
        if (['td', 'th', 'tr'].contains(tag)){
            container = new Element('tbody').inject(container);
            if (tag != 'tr') container = new Element('tr').inject(container);
        }
    }
    
    return (container || new Element('div')).set('html', text).getChildren();
};

/*
---

script: Element.Delegation.js

description: Extends the Element native object to include the delegate method for more efficient event management.

credits:
- "Event checking based on the work of Daniel Steigerwald. License: MIT-style license.  Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"

license: MIT-style license

authors:
- Aaron Newton
- Daniel Steigerwald

requires:
- core:1.2.4/Element.Event
- core:1.2.4/Selectors
- /MooTools.More

provides: [Element.Delegation]

...
*/
(function(){
    
    var match = /(.*?):relay\(([^)]+)\)$/,
        combinators = /[+>~\s]/,
        splitType = function(type){
            var bits = type.match(match);
            return !bits ? {event: type} : {
                event: bits[1],
                selector: bits[2]
            };
        },
        check = function(e, selector){
            var t = e.target;
            if (combinators.test(selector = selector.trim())){
                var els = this.getElements(selector);
                for (var i = els.length; i--; ){
                    var el = els[i];
                    if (t == el || el.hasChild(t)) return el;
                }
            } else {
                for ( ; t && t != this; t = t.parentNode){
                    if (Element.match(t, selector)) return document.id(t);
                }
            }
            return null;
        };
    
    var oldAddEvent = Element.prototype.addEvent,
        oldRemoveEvent = Element.prototype.removeEvent;
    
    Element.implement({
        
        addEvent: function(type, fn){
            var splitted = splitType(type);
            if (splitted.selector){
                var monitors = this.retrieve('$moo:delegateMonitors', {});
                if (!monitors[type]){
                    var monitor = function(e){
                        var el = check.call(this, e, splitted.selector);
                        if (el) this.fireEvent(type, [e, el], 0, el);
                    }.bind(this);
                    monitors[type] = monitor;
                    oldAddEvent.call(this, splitted.event, monitor);
                }
            }
            return oldAddEvent.apply(this, arguments);
        },
        
        removeEvent: function(type, fn){
            var splitted = splitType(type);
            if (splitted.selector){
                var events = this.retrieve('events');
                if (!events || !events[type] || (fn && !events[type].keys.contains(fn))) return this;
                
                if (fn) oldRemoveEvent.apply(this, [type, fn]);
                else oldRemoveEvent.apply(this, type);
                
                events = this.retrieve('events');
                if (events && events[type] && events[type].length == 0){
                    var monitors = this.retrieve('$moo:delegateMonitors', {});
                    oldRemoveEvent.apply(this, [splitted.event, monitors[type]]);
                    delete monitors[type];
                }
                return this;
            }
            
            return oldRemoveEvent.apply(this, arguments);
        },
        
        fireEvent: function(type, args, delay, bind){
            var events = this.retrieve('events');
            if (!events || !events[type]) return this;
            events[type].keys.each(function(fn){
                fn.create({bind: bind || this, delay: delay, arguments: args})();
            }, this);
            return this;
        }
    
    });

})();

/*
---

script: Tips.js

description: Class for creating nice tips that follow the mouse cursor when hovering an element.

license: MIT-style license

authors:
- Valerio Proietti
- Christoph Pojer

requires:
- core:1.2.4/Options
- core:1.2.4/Events
- core:1.2.4/Element.Event
- core:1.2.4/Element.Style
- core:1.2.4/Element.Dimensions
- /MooTools.More

provides: [Tips]

...
*/

(function(){

var read = function(option, element){
    return (option) ? ($type(option) == 'function' ? option(element) : element.get(option)) : '';
};

this.Tips = new Class({
    
    Implements: [Events, Options],
    
    options: {
        /*
        onAttach: $empty(element),
        onDetach: $empty(element),
        */
        onShow: function(){
            this.tip.setStyle('display', 'block');
        },
        onHide: function(){
            this.tip.setStyle('display', 'none');
        },
        title: 'title',
        text: function(element){
            return element.get('rel') || element.get('href');
        },
        showDelay: 100,
        hideDelay: 100,
        className: 'tip-wrap',
        offset: {x: 16, y: 16},
        fixed: false
    },
    
    initialize: function(){
        var params = Array.link(arguments, {options: Object.type, elements: $defined});
        this.setOptions(params.options);
        document.id(this);
        
        if (params.elements) this.attach(params.elements);
    },
    
    toElement: function(){
        if (this.tip) return this.tip;
        
        this.container = new Element('div', {'class': 'tip'});
        return this.tip = new Element('div', {
            'class': this.options.className,
            styles: {
                position: 'absolute',
                top: 0,
                left: 0
            }
        }).adopt(
            new Element('div', {'class': 'tip-top'}),
            this.container,
            new Element('div', {'class': 'tip-bottom'})
        ).inject(document.body);
    },
    
    attach: function(elements){
        $$(elements).each(function(element){
            var title = read(this.options.title, element),
                text = read(this.options.text, element);
            
            element.erase('title').store('tip:native', title).retrieve('tip:title', title);
            element.retrieve('tip:text', text);
            this.fireEvent('attach', [element]);
            
            var events = ['enter', 'leave'];
            if (!this.options.fixed) events.push('move');
            
            events.each(function(value){
                var event = element.retrieve('tip:' + value);
                if (!event) event = this['element' + value.capitalize()].bindWithEvent(this, element);
                
                element.store('tip:' + value, event).addEvent('mouse' + value, event);
            }, this);
        }, this);
        
        return this;
    },
    
    detach: function(elements){
        $$(elements).each(function(element){
            ['enter', 'leave', 'move'].each(function(value){
                element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value);
            });
            
            this.fireEvent('detach', [element]);
            
            if (this.options.title == 'title'){ // This is necessary to check if we can revert the title
                var original = element.retrieve('tip:native');
                if (original) element.set('title', original);
            }
        }, this);
        
        return this;
    },
    
    elementEnter: function(event, element){
        this.container.empty();
        
        ['title', 'text'].each(function(value){
            var content = element.retrieve('tip:' + value);
            if (content) this.fill(new Element('div', {'class': 'tip-' + value}).inject(this.container), content);
        }, this);
        
        $clear(this.timer);
        this.timer = this.show.delay(this.options.showDelay, this, element);
        this.position((this.options.fixed) ? {page: element.getPosition()} : event);
    },
    
    elementLeave: function(event, element){
        $clear(this.timer);
        this.timer = this.hide.delay(this.options.hideDelay, this, element);
        this.fireForParent(event, element);
    },
    
    fireForParent: function(event, element){
        if (!element) return;
        parentNode = element.getParent();
        if (parentNode == document.body) return;
        if (parentNode.retrieve('tip:enter')) parentNode.fireEvent('mouseenter', event);
        else this.fireForParent(event, parentNode);
    },
    
    elementMove: function(event, element){
        this.position(event);
    },
    
    position: function(event){
        var size = window.getSize(), scroll = window.getScroll(),
            tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
            props = {x: 'left', y: 'top'},
            obj = {};
        
        for (var z in props){
            obj[props[z]] = event.page[z] + this.options.offset[z];
            if ((obj[props[z]] + tip[z] - scroll[z]) > size[z]) obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
        }
        
        this.tip.setStyles(obj);
    },
    
    fill: function(element, contents){
        if(typeof contents == 'string') element.set('html', contents);
        else element.adopt(contents);
    },
    
    show: function(element){
        this.fireEvent('show', [this.tip, element]);
    },
    
    hide: function(element){
        this.fireEvent('hide', [this.tip, element]);
    }

});

})();
/** datepicker.js - MooTools Datepicker class by MonkeyPhysics.com */
var DatePicker=new Class({Implements:Options,d:"",today:"",choice:{},bodysize:{},limit:{},attachTo:null,picker:null,slider:null,oldContents:null,newContents:null,input:null,visual:null,options:{pickerClass:"datepicker",days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],dayShort:2,monthShort:3,startDay:1,timePicker:false,timePickerOnly:false,yearPicker:true,
yearsPerPage:20,format:"d-m-Y",allowEmpty:false,inputOutputFormat:"U",animationDuration:400,useFadeInOut:!Browser.Engine.trident,startView:"month",positionOffset:{x:0,y:0},minDate:null,maxDate:null,debug:false,toggleElements:null,onShow:$empty,onClose:$empty,onSelect:$empty},initialize:function(a,c){this.attachTo=a;this.setOptions(c).attach();if(this.options.timePickerOnly){this.options.timePicker=true;this.options.startView="time"}this.formatMinMaxDates();document.addEvent("mousedown",this.close.bind(this))},
formatMinMaxDates:function(){if(this.options.minDate&&this.options.minDate.format)this.options.minDate=this.unformat(this.options.minDate.date,this.options.minDate.format);if(this.options.maxDate&&this.options.maxDate.format){this.options.maxDate=this.unformat(this.options.maxDate.date,this.options.maxDate.format);this.options.maxDate.setHours(23);this.options.maxDate.setMinutes(59);this.options.maxDate.setSeconds(59)}},attach:function(){if($chk(this.options.toggleElements)){var a=$$(this.options.toggleElements);
document.addEvents({keydown:function(c){c.key=="tab"&&this.close(null,true)}.bind(this)})}$$(this.attachTo).each(function(c,b){if(!c.retrieve("datepicker")){var d=$chk(c.get("value"))?this.format(new Date(this.unformat(c.get("value"),this.options.inputOutputFormat)),this.options.format):this.options.allowEmpty?"":this.format(new Date,this.options.format),e=c.getStyle("display"),f=c.setStyle("display",this.options.debug?e:"none").store("datepicker",true).clone().store("datepicker",true).removeProperty("name").setStyle("display",
e).set("value",d).inject(c,"after");if($chk(this.options.toggleElements)){a[b].setStyle("cursor","pointer").addEvents({click:function(){this.onFocus(c,f)}.bind(this)});f.addEvents({blur:function(){c.set("value",f.get("value"))}})}else f.addEvents({keydown:function(h){if(this.options.allowEmpty&&(h.key=="delete"||h.key=="backspace")){c.set("value","");h.target.set("value","");this.close(null,true)}else h.key=="tab"?this.close(null,true):h.stop()}.bind(this),focus:function(){this.onFocus(c,f)}.bind(this)})}}.bind(this))},
onFocus:function(a,c){var b,d=c.getCoordinates();if($chk(a.get("value")))b=this.unformat(a.get("value"),this.options.inputOutputFormat).valueOf();else{b=new Date;if($chk(this.options.maxDate)&&b.valueOf()>this.options.maxDate.valueOf())b=new Date(this.options.maxDate.valueOf());if($chk(this.options.minDate)&&b.valueOf()<this.options.minDate.valueOf())b=new Date(this.options.minDate.valueOf())}this.show({left:d.left+this.options.positionOffset.x,top:d.top+d.height+this.options.positionOffset.y},b);
this.input=a;this.visual=c;this.options.onShow()},dateToObject:function(a){return{year:a.getFullYear(),month:a.getMonth(),day:a.getDate(),hours:a.getHours(),minutes:a.getMinutes(),seconds:a.getSeconds()}},dateFromObject:function(a){var c=new Date;c.setDate(1);["year","month","day","hours","minutes","seconds"].each(function(b){var d=a[b];if($chk(d))switch(b){case "day":c.setDate(d);break;case "month":c.setMonth(d);break;case "year":c.setFullYear(d);break;case "hours":c.setHours(d);break;case "minutes":c.setMinutes(d);
break;case "seconds":c.setSeconds(d);break}});return c},show:function(a,c){this.formatMinMaxDates();this.d=$chk(c)?new Date(c):new Date;this.today=new Date;this.choice=this.dateToObject(this.d);this.mode=this.options.startView=="time"&&!this.options.timePicker?"month":this.options.startView;this.render();this.picker.setStyles(a)},render:function(a){if($chk(this.picker)){var c=this.oldContents;this.oldContents=this.newContents;this.newContents=c;this.newContents.empty()}else this.constructPicker();
c=new Date(this.d.getTime());this.limit={right:false,left:false};if(this.mode=="decades")this.renderDecades();else if(this.mode=="year")this.renderYear();else if(this.mode=="time"){this.renderTime();this.limit={right:true,left:true}}else this.renderMonth();this.picker.getElement(".previous").setStyle("visibility",this.limit.left?"hidden":"visible");this.picker.getElement(".next").setStyle("visibility",this.limit.right?"hidden":"visible");this.picker.getElement(".titleText").setStyle("cursor",this.allowZoomOut()?
"pointer":"default");this.d=c;this.picker.getStyle("opacity")==0&&this.picker.tween("opacity",0,1);$chk(a)&&this.fx(a)},fx:function(a){if(a=="right"){this.oldContents.setStyles({left:0,opacity:1});this.newContents.setStyles({left:this.bodysize.x,opacity:1});this.slider.setStyle("left",0).tween("left",0,-this.bodysize.x)}else if(a=="left"){this.oldContents.setStyles({left:this.bodysize.x,opacity:1});this.newContents.setStyles({left:0,opacity:1});this.slider.setStyle("left",-this.bodysize.x).tween("left",
-this.bodysize.x,0)}else if(a=="fade"){this.slider.setStyle("left",0);this.oldContents.setStyle("left",0).set("tween",{duration:this.options.animationDuration/2}).tween("opacity",1,0);this.newContents.setStyles({opacity:0,left:0}).set("tween",{duration:this.options.animationDuration}).tween("opacity",0,1)}},constructPicker:function(){this.picker=(new Element("div",{"class":this.options.pickerClass})).inject(document.body);this.options.useFadeInOut&&this.picker.setStyle("opacity",0).set("tween",{duration:this.options.animationDuration});
var a=(new Element("div",{"class":"header"})).inject(this.picker),c=(new Element("div",{"class":"title"})).inject(a);(new Element("div",{"class":"previous"})).addEvent("click",this.previous.bind(this)).set("text","\u00ab").inject(a);(new Element("div",{"class":"next"})).addEvent("click",this.next.bind(this)).set("text","\u00bb").inject(a);(new Element("div",{"class":"closeButton"})).addEvent("click",this.close.bindWithEvent(this,true)).set("text","x").inject(a);(new Element("span",{"class":"titleText"})).addEvent("click",
this.zoomOut.bind(this)).inject(c);a=(new Element("div",{"class":"body"})).inject(this.picker);this.bodysize=a.getSize();this.slider=(new Element("div",{styles:{position:"absolute",top:0,left:0,width:2*this.bodysize.x,height:this.bodysize.y}})).set("tween",{duration:this.options.animationDuration,transition:Fx.Transitions.Quad.easeInOut}).inject(a);this.oldContents=(new Element("div",{styles:{position:"absolute",top:0,left:this.bodysize.x,width:this.bodysize.x,height:this.bodysize.y}})).inject(this.slider);
this.newContents=(new Element("div",{styles:{position:"absolute",top:0,left:0,width:this.bodysize.x,height:this.bodysize.y}})).inject(this.slider)},renderTime:function(){var a=(new Element("div",{"class":"time"})).inject(this.newContents);this.options.timePickerOnly?this.picker.getElement(".titleText").set("text","Select a time"):this.picker.getElement(".titleText").set("text",this.format(this.d,"j M, Y"));(new Element("input",{type:"text","class":"hour"})).set("value",this.leadZero(this.d.getHours())).addEvents({mousewheel:function(c){var b=
c.target,d=b.get("value").toInt();b.focus();d=c.wheel>0?d<23?d+1:0:d>0?d-1:23;b.set("value",this.leadZero(d));c.stop()}.bind(this)}).set("maxlength",2).inject(a);(new Element("input",{type:"text","class":"minutes"})).set("value",this.leadZero(this.d.getMinutes())).addEvents({mousewheel:function(c){var b=c.target,d=b.get("value").toInt();b.focus();d=c.wheel>0?d<59?d+1:0:d>0?d-1:59;b.set("value",this.leadZero(d));c.stop()}.bind(this)}).set("maxlength",2).inject(a);(new Element("div",{"class":"separator"})).set("text",
":").inject(a);(new Element("input",{type:"submit",value:"OK","class":"ok"})).addEvents({click:function(c){c.stop();this.select($merge(this.dateToObject(this.d),{hours:this.picker.getElement(".hour").get("value").toInt(),minutes:this.picker.getElement(".minutes").get("value").toInt()}))}.bind(this)}).set("maxlength",2).inject(a)},renderMonth:function(){var a=this.d.getMonth();this.picker.getElement(".titleText").set("text",this.options.months[a]+" "+this.d.getFullYear());for(this.d.setDate(1);this.d.getDay()!=
this.options.startDay;)this.d.setDate(this.d.getDate()-1);var c=(new Element("div",{"class":"days"})).inject(this.newContents),b=(new Element("div",{"class":"titles"})).inject(c),d,e,f;for(d=this.options.startDay;d<this.options.startDay+7;d++)(new Element("div",{"class":"title day day"+d%7})).set("text",this.options.days[d%7].substring(0,this.options.dayShort)).inject(b);d=false;var h=this.today.toDateString(),g=this.dateFromObject(this.choice).toDateString();for(b=0;b<42;b++){e=[];e.push("day");
e.push("day"+this.d.getDay());this.d.toDateString()==h&&e.push("today");this.d.toDateString()==g&&e.push("selected");this.d.getMonth()!=a&&e.push("otherMonth");if(b%7==0)f=(new Element("div",{"class":"week week"+Math.floor(b/7)})).inject(c);e=(new Element("div",{"class":e.join(" ")})).set("text",this.d.getDate()).inject(f);if(this.limited("date")){e.addClass("unavailable");if(d)this.limit.right=true;else if(this.d.getMonth()==a)this.limit.left=true}else{d=true;e.addEvent("click",function(i,j){if(this.options.timePicker){this.d.setDate(j.day);
this.d.setMonth(j.month);this.mode="time";this.render("fade")}else this.select(j)}.bindWithEvent(this,{day:this.d.getDate(),month:this.d.getMonth(),year:this.d.getFullYear()}))}this.d.setDate(this.d.getDate()+1)}if(!d)this.limit.right=true},renderYear:function(){var a=this.today.getMonth(),c=this.d.getFullYear()==this.today.getFullYear(),b=this.d.getFullYear()==this.choice.year;this.picker.getElement(".titleText").set("text",this.d.getFullYear());this.d.setMonth(0);var d,e,f=false,h=(new Element("div",
{"class":"months"})).inject(this.newContents);for(d=0;d<=11;d++){e=(new Element("div",{"class":"month month"+(d+1)+(d==a&&c?" today":"")+(d==this.choice.month&&b?" selected":"")})).set("text",this.options.monthShort?this.options.months[d].substring(0,this.options.monthShort):this.options.months[d]).inject(h);if(this.limited("month")){e.addClass("unavailable");if(f)this.limit.right=true;else this.limit.left=true}else{f=true;e.addEvent("click",function(g,i){this.d.setDate(1);this.d.setMonth(i);this.mode=
"month";this.render("fade")}.bindWithEvent(this,d))}this.d.setMonth(d)}if(!f)this.limit.right=true},renderDecades:function(){for(;this.d.getFullYear()%this.options.yearsPerPage>0;)this.d.setFullYear(this.d.getFullYear()-1);this.picker.getElement(".titleText").set("text",this.d.getFullYear()+"-"+(this.d.getFullYear()+this.options.yearsPerPage-1));var a,c,b,d=false,e=(new Element("div",{"class":"years"})).inject(this.newContents);if($chk(this.options.minDate)&&this.d.getFullYear()<=this.options.minDate.getFullYear())this.limit.left=
true;for(a=0;a<this.options.yearsPerPage;a++){c=this.d.getFullYear();b=(new Element("div",{"class":"year year"+a+(c==this.today.getFullYear()?" today":"")+(c==this.choice.year?" selected":"")})).set("text",c).inject(e);if(this.limited("year")){b.addClass("unavailable");if(d)this.limit.right=true;else this.limit.left=true}else{d=true;b.addEvent("click",function(f,h){this.d.setFullYear(h);this.mode="year";this.render("fade")}.bindWithEvent(this,c))}this.d.setFullYear(this.d.getFullYear()+1)}if(!d)this.limit.right=
true;if($chk(this.options.maxDate)&&this.d.getFullYear()>=this.options.maxDate.getFullYear())this.limit.right=true},limited:function(a){var c=$chk(this.options.minDate),b=$chk(this.options.maxDate);if(!c&&!b)return false;switch(a){case "year":return c&&this.d.getFullYear()<this.options.minDate.getFullYear()||b&&this.d.getFullYear()>this.options.maxDate.getFullYear();case "month":a=(""+this.d.getFullYear()+this.leadZero(this.d.getMonth())).toInt();return c&&a<(""+this.options.minDate.getFullYear()+
this.leadZero(this.options.minDate.getMonth())).toInt()||b&&a>(""+this.options.maxDate.getFullYear()+this.leadZero(this.options.maxDate.getMonth())).toInt();case "date":return c&&this.d<this.options.minDate||b&&this.d>this.options.maxDate}},allowZoomOut:function(){if(this.mode=="time"&&this.options.timePickerOnly)return false;if(this.mode=="decades")return false;if(this.mode=="year"&&!this.options.yearPicker)return false;return true},zoomOut:function(){if(this.allowZoomOut()){this.mode=this.mode==
"year"?"decades":this.mode=="time"?"month":"year";this.render("fade")}},previous:function(){if(this.mode=="decades")this.d.setFullYear(this.d.getFullYear()-this.options.yearsPerPage);else if(this.mode=="year")this.d.setFullYear(this.d.getFullYear()-1);else this.mode=="month"&&this.d.setMonth(this.d.getMonth()-1);this.render("left")},next:function(){if(this.mode=="decades")this.d.setFullYear(this.d.getFullYear()+this.options.yearsPerPage);else if(this.mode=="year")this.d.setFullYear(this.d.getFullYear()+
1);else this.mode=="month"&&this.d.setMonth(this.d.getMonth()+1);this.render("right")},close:function(a,c){if($(this.picker)){var b=$chk(a)&&a.target!=this.picker&&!this.picker.hasChild(a.target)&&a.target!=this.visual;if(c||b)this.options.useFadeInOut?this.picker.set("tween",{duration:this.options.animationDuration/2,onComplete:this.destroy.bind(this)}).tween("opacity",1,0):this.destroy()}},destroy:function(){this.picker.destroy();this.picker=null;this.options.onClose()},select:function(a){this.choice=
$merge(this.choice,a);a=this.dateFromObject(this.choice);this.input.set("value",this.format(a,this.options.inputOutputFormat));this.visual.set("value",this.format(a,this.options.format));this.options.onSelect(a);this.close(null,true)},leadZero:function(a){return a<10?"0"+a:a},format:function(a,c){for(var b="",d=a.getHours(),e=a.getMonth(),f=0;f<c.length;f++)switch(c.charAt(f)){case "\\":f++;b+=c.charAt(f);break;case "y":b+=(100+a.getYear()+"").substring(1);break;case "Y":b+=a.getFullYear();break;
case "m":b+=this.leadZero(e+1);break;case "n":b+=e+1;break;case "M":b+=this.options.months[e].substring(0,this.options.monthShort);break;case "F":b+=this.options.months[e];break;case "d":b+=this.leadZero(a.getDate());break;case "j":b+=a.getDate();break;case "D":b+=this.options.days[a.getDay()].substring(0,this.options.dayShort);break;case "l":b+=this.options.days[a.getDay()];break;case "G":b+=d;break;case "H":b+=this.leadZero(d);break;case "g":b+=d%12?d%12:12;break;case "h":b+=this.leadZero(d%12?
d%12:12);break;case "a":b+=d>11?"pm":"am";break;case "A":b+=d>11?"PM":"AM";break;case "i":b+=this.leadZero(a.getMinutes());break;case "s":b+=this.leadZero(a.getSeconds());break;case "U":b+=Math.floor(a.valueOf()/1E3);break;default:b+=c.charAt(f)}return b},unformat:function(a,c){var b=new Date,d={},e,f;a=a.toString();for(var h=0;h<c.length;h++){e=c.charAt(h);switch(e){case "\\":r=null;h++;break;case "y":r="[0-9]{2}";break;case "Y":r="[0-9]{4}";break;case "m":r="0[1-9]|1[012]";break;case "n":r="[1-9]|1[012]";
break;case "M":r="[A-Za-z]{"+this.options.monthShort+"}";break;case "F":r="[A-Za-z]+";break;case "d":r="0[1-9]|[12][0-9]|3[01]";break;case "j":r="[1-9]|[12][0-9]|3[01]";break;case "D":r="[A-Za-z]{"+this.options.dayShort+"}";break;case "l":r="[A-Za-z]+";break;case "G":case "H":case "g":case "h":r="[0-9]{1,2}";break;case "a":r="(am|pm)";break;case "A":r="(AM|PM)";break;case "i":case "s":r="[012345][0-9]";break;case "U":r="-?[0-9]+$";break;default:r=null}if($chk(r)){f=a.match("^"+r);if($chk(f)){d[e]=
f[0];a=a.substring(d[e].length)}else{this.options.debug&&alert("Fatal Error in DatePicker\n\nUnexpected format at: '"+a+"' expected format character '"+e+"' (pattern '"+r+"')");return b}}else a=a.substring(1)}for(e in d){var g=d[e];switch(e){case "y":b.setFullYear(g<30?2E3+g.toInt():1900+g.toInt());break;case "Y":b.setFullYear(g);break;case "m":case "n":b.setMonth(g-1);break;case "M":g=this.options.months.filter(function(i){return i.substring(0,this.options.monthShort)==g}.bind(this))[0];case "F":b.setMonth(this.options.months.indexOf(g));
break;case "d":case "j":b.setDate(g);break;case "G":case "H":b.setHours(g);break;case "g":case "h":d.a=="pm"||d.A=="PM"?b.setHours(g==12?0:g.toInt()+12):b.setHours(g);break;case "i":b.setMinutes(g);break;case "s":b.setSeconds(g);break;case "U":b=new Date(g.toInt()*1E3)}}return b}});

GenericOverlayHandler = new Class({
    initialize: function(overlay, target) {
        this.overlay = overlay;
        this.target = target;
        var close = this.target.getElement('a.close_action');
        if (close)
            close.addEvent('click', function(e){e.stop();this.hide();}.bind(this));
    },
    show: function() {
        this.overlay.setStyle('display', 'block');
        this.overlay.setStyle('height', window.getScrollSize().y);
        this.overlay.setStyle('width', window.getScrollSize().x);
        this.overlay.addEvent('click', this.hide.bind(this));
        this.target.setStyle('display', 'block');
        this.target.setStyle('top', $(document.documentElement).getScroll().y + 200);
    },
    hide: function() {
        this.target.setStyle('display', 'none');
        this.overlay.setStyle('display', 'none');
        this.overlay.removeEvents('click');
    }
});

BackTextFactory = new Class({
    initialize: function(form, elements) {
        this.form = $(form);
        this.elements = $H(elements);
        this.attach();
    },
    attach: function() {
        this.form.addEvent('submit', this.reset.bind(this));
        this.elements.each(function(v, k) {
            k = $(k);
            k.store('back_text', v);
            k.addEvents({
                'focus': function() {
                    if (k.hasClass('back_text')) {
                        k.removeClass('back_text');
                        k.set('value', '');
                    }
                },
                'blur': function() {
                    if (k.get('value') == '' || k.get('value') == v) {
                        k.set('value', v)
                        k.addClass('back_text');
                    }
                }
            });
            k.fireEvent('blur');
        });
    },
    reset: function() {
        this.elements.each(function(v, k) {
            k = $(k);
            if(k.get('value') == v)
                k.set('value', '');
        });
    }
});

SearchHandler = new Class({
    initialize: function(form, input, output, url, param_name) {
        this.form = form;
        this.input = input;
        this.output = output;
        this.url = url;
        this.param_name = param_name;
        this.timeout = null;
        this.last_value = null;
        this.attach();
    },
    queueLookup: function() {
        clearTimeout(this.timeout);
        this.timeout = setTimeout(this.lookup.bind(this), 700);
    },
    lookup: function() {
        var value = this.input.value;
        var back_text = this.input.retrieve('back_text');
        if (value != this.last_value && (!back_text || (back_text && value != back_text))) {
            var params = {};
            params[this.param_name] = value;
            if (value)
                new Request.HTML({'url': this.url,
                                'update': this.output,
                                onSuccess: function() {
                                    this.output.getElement('a.search_close').addEvent('click', function(e) {
                                        this.output.empty();
                                        $('search_input').set('value', '').fireEvent('blur');
                                        this.last_value = '';
                                        return false;
                                    }.bind(this));
                                }.bind(this)
                }).get(params);
            else
                this.output.empty();
            this.last_value = value;
        }
    },
    attach: function() {
        this.form.addEvent('submit', function(e){new Event(e).stop();});
        this.input.setAttribute('autocomplete', 'off');
        this.input.addEvent('blur', this.queueLookup.bind(this));
        this.input.addEvent('keydown', this.queueLookup.bind(this));
    }
});


document.addEvent('domready', function() {
    var sort_form = $('sort_form');
    if (sort_form)
        $('sort_select').addEvent('change', function(e){sort_form.submit();});
    var search_form = $('public_search_form');
    if (search_form) {
        search_form.store('back_text', new BackTextFactory(search_form, {'search_input': 'Enter address or id#'}));
        var ie6 = (Browser.Engine.trident && Browser.Engine.version < 5);
        if (!ie6)
            new SearchHandler(search_form, $('search_input'), $('search_results'), '/search/', 'q');
        if ($('search_box')) {
            var search_box_loc = $('search_box').getCoordinates();
            $('search_results').setPosition({x: search_box_loc.left, y: search_box_loc.bottom});
        }
    }
    else
        $('search_results').setStyle('visibility', 'hidden');
    //Hook up tooltip image previews
    var tipObj = new Tips($$('.img_tip'), {offset: {x: 10, y: 10}, hideDelay: 50, showDelay: 150});
    $$('.img_tip').each(function(tip) {
        var src = tip.retrieve('tip:text');
        var alt = tip.retrieve('tip:title');
        tip.store('tip:text', new Element('img', {'src': src, 'alt': alt}));
        tip.store('tip:title', '');
        tip.getElement('img').set('tween', {duration: 250, link: 'cancel'});
    });
    tipObj.tip.set('tween', {duration: 250});
    tipObj.addEvents({
        'show': function(tip, el) {
            tip.fade('in');
            el.getElement('img').fade(0.7);
        },
        'hide': function(tip, el) {
            tip.fade('out');
            el.getElement('img').fade(1.0);
        }
    });
    //Hook up any remove_action anchors 
    $$('div.dialog a.remove_action').each(function(el) {
        el.store('original_text', el.get('text'));
        el.addEvent('click', function(e) {
            e.stop();
            var input_id = el.getNext('input[type=hidden]').get('id');
            var checkbox = $(input_id.replace('-id', '-DELETE'));
            if(checkbox) {
                if(!checkbox.get('checked')) {
                    checkbox.set('checked', 'checked');
                    el.set('text', '- Undo');
                    el.getParent().fade(0.5);
                }
                else {
                    checkbox.removeProperty('checked');
                    el.set('text', el.retrieve('original_text'));
                    el.getParent().fade(1);
                }
            }
        })
    });
});

