/* Copyright Canon 2009 */
var Prototype={
    Version:"1.6.0.3",
    Browser:{
        IE:!!(window.attachEvent&&navigator.userAgent.indexOf("Opera")===-1),
        Opera:navigator.userAgent.indexOf("Opera")>-1,
        WebKit:navigator.userAgent.indexOf("AppleWebKit/")>-1,
        Gecko:navigator.userAgent.indexOf("Gecko")>-1&&navigator.userAgent.indexOf("KHTML")===-1,
        MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
        },
    BrowserFeatures:{
        XPath:!!document.evaluate,
        SelectorsAPI:!!document.querySelector,
        ElementExtensions:!!window.HTMLElement,
        SpecificElementExtensions:document.createElement("div")["__proto__"]&&document.createElement("div")["__proto__"]!==document.createElement("form")["__proto__"]
        },
    ScriptFragment:"<script[^>]*>([\\S\\s]*?)<\/script>",
    JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,
    emptyFunction:function(){},
    K:function(a){
        return a
        }
    };

if(Prototype.Browser.MobileSafari){
    Prototype.BrowserFeatures.SpecificElementExtensions=false
        }
        var Class={
    create:function(){
        var f=null,d=$A(arguments);
        if(Object.isFunction(d[0])){
            f=d.shift()
            }
            function a(){
            this.initialize.apply(this,arguments)
            }
            Object.extend(a,Class.Methods);
        a.superclass=f;
        a.subclasses=[];
        if(f){
            var b=function(){};

            b.prototype=f.prototype;
            a.prototype=new b;
            f.subclasses.push(a)
            }
            for(var c=0;c<d.length;c++){
            a.addMethods(d[c])
            }
            if(!a.prototype.initialize){
            a.prototype.initialize=Prototype.emptyFunction
            }
            a.prototype.constructor=a;
        return a
        }
    };

Class.Methods={
    addMethods:function(h){
        var c=this.superclass&&this.superclass.prototype;
        var b=Object.keys(h);
        if(!Object.keys({
            toString:true
        }).length){
            b.push("toString","valueOf")
            }
            for(var a=0,d=b.length;a<d;a++){
            var g=b[a],f=h[g];
            if(c&&Object.isFunction(f)&&f.argumentNames().first()=="$super"){
                var j=f;
                f=(function(k){
                    return function(){
                        return c[k].apply(this,arguments)
                        }
                    })(g).wrap(j);
            f.valueOf=j.valueOf.bind(j);
            f.toString=j.toString.bind(j)
            }
            this.prototype[g]=f
        }
        return this
    }
};

var Abstract={};

Object.extend=function(a,c){
    for(var b in c){
        a[b]=c[b]
        }
        return a
    };

Object.extend(Object,{
    inspect:function(a){
        try{
            if(Object.isUndefined(a)){
                return"undefined"
                }
                if(a===null){
                return"null"
                }
                return a.inspect?a.inspect():String(a)
            }catch(b){
            if(b instanceof RangeError){
                return"..."
                }
                throw b
            }
        },
toJSON:function(a){
    var c=typeof a;
    switch(c){
        case"undefined":case"function":case"unknown":
            return;
        case"boolean":
            return a.toString()
            }
            if(a===null){
        return"null"
        }
        if(a.toJSON){
        return a.toJSON()
        }
        if(Object.isElement(a)){
        return
    }
    var b=[];
    for(var f in a){
        var d=Object.toJSON(a[f]);
        if(!Object.isUndefined(d)){
            b.push(f.toJSON()+": "+d)
            }
        }
    return"{"+b.join(", ")+"}"
    },
toQueryString:function(a){
    return $H(a).toQueryString()
    },
toHTML:function(a){
    return a&&a.toHTML?a.toHTML():String.interpret(a)
    },
keys:function(a){
    var b=[];
    for(var c in a){
        b.push(c)
        }
        return b
    },
values:function(b){
    var a=[];
    for(var c in b){
        a.push(b[c])
        }
        return a
    },
clone:function(a){
    return Object.extend({},a)
    },
isElement:function(a){
    return !!(a&&a.nodeType==1)
    },
isArray:function(a){
    return a!=null&&typeof a=="object"&&"splice" in a&&"join" in a
    },
isHash:function(a){
    return a instanceof Hash
    },
isFunction:function(a){
    return typeof a=="function"
    },
isString:function(a){
    return typeof a=="string"
    },
isNumber:function(a){
    return typeof a=="number"
    },
isUndefined:function(a){
    return typeof a=="undefined"
    }
});
Object.extend(Function.prototype,{
    argumentNames:function(){
        var a=this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1].replace(/\s+/g,"").split(",");
        return a.length==1&&!a[0]?[]:a
        },
    bind:function(){
        if(arguments.length<2&&Object.isUndefined(arguments[0])){
            return this
            }
            var a=this,c=$A(arguments),b=c.shift();
        return function(){
            return a.apply(b,c.concat($A(arguments)))
            }
        },
bindAsEventListener:function(){
    var a=this,c=$A(arguments),b=c.shift();
    return function(d){
        return a.apply(b,[d||window.event].concat(c))
        }
    },
curry:function(){
    if(!arguments.length){
        return this
        }
        var a=this,b=$A(arguments);
    return function(){
        return a.apply(this,b.concat($A(arguments)))
        }
    },
delay:function(){
    var a=this,b=$A(arguments),c=b.shift()*1000;
    return window.setTimeout(function(){
        return a.apply(a,b)
        },c)
    },
defer:function(){
    var a=[0.01].concat($A(arguments));
    return this.delay.apply(this,a)
    },
wrap:function(b){
    var a=this;
    return function(){
        return b.apply(this,[a.bind(this)].concat($A(arguments)))
        }
    },
methodize:function(){
    if(this._methodized){
        return this._methodized
        }
        var a=this;
    return this._methodized=function(){
        return a.apply(null,[this].concat($A(arguments)))
        }
    }
});
Date.prototype.toJSON=function(){
    return'"'+this.getUTCFullYear()+"-"+(this.getUTCMonth()+1).toPaddedString(2)+"-"+this.getUTCDate().toPaddedString(2)+"T"+this.getUTCHours().toPaddedString(2)+":"+this.getUTCMinutes().toPaddedString(2)+":"+this.getUTCSeconds().toPaddedString(2)+'Z"'
    };

var Try={
    these:function(){
        var c;
        for(var b=0,d=arguments.length;b<d;b++){
            var a=arguments[b];
            try{
                c=a();
                break
            }catch(f){}
        }
        return c
    }
};

RegExp.prototype.match=RegExp.prototype.test;
RegExp.escape=function(a){
    return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")
    };

var PeriodicalExecuter=Class.create({
    initialize:function(b,a){
        this.callback=b;
        this.frequency=a;
        this.currentlyExecuting=false;
        this.registerCallback()
        },
    registerCallback:function(){
        this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000)
        },
    execute:function(){
        this.callback(this)
        },
    stop:function(){
        if(!this.timer){
            return
        }
        clearInterval(this.timer);
        this.timer=null
        },
    onTimerEvent:function(){
        if(!this.currentlyExecuting){
            try{
                this.currentlyExecuting=true;
                this.execute()
                }finally{
                this.currentlyExecuting=false
                }
            }
    }
});
Object.extend(String,{
    interpret:function(a){
        return a==null?"":String(a)
        },
    specialChar:{
        "\b":"\\b",
        "\t":"\\t",
        "\n":"\\n",
        "\f":"\\f",
        "\r":"\\r",
        "\\":"\\\\"
    }
});
Object.extend(String.prototype,{
    gsub:function(f,c){
        var a="",d=this,b;
        c=arguments.callee.prepareReplacement(c);
        while(d.length>0){
            if(b=d.match(f)){
                a+=d.slice(0,b.index);
                a+=String.interpret(c(b));
                d=d.slice(b.index+b[0].length)
                }else{
                a+=d,d=""
                }
            }
        return a
    },
sub:function(c,a,b){
    a=this.gsub.prepareReplacement(a);
    b=Object.isUndefined(b)?1:b;
    return this.gsub(c,function(d){
        if(--b<0){
            return d[0]
            }
            return a(d)
        })
    },
scan:function(b,a){
    this.gsub(b,a);
    return String(this)
    },
truncate:function(b,a){
    b=b||30;
    a=Object.isUndefined(a)?"...":a;
    return this.length>b?this.slice(0,b-a.length)+a:String(this)
    },
strip:function(){
    return this.replace(/^\s+/,"").replace(/\s+$/,"")
    },
stripTags:function(){
    return this.replace(/<\/?[^>]+>/gi,"")
    },
stripScripts:function(){
    return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"")
    },
extractScripts:function(){
    var b=new RegExp(Prototype.ScriptFragment,"img");
    var a=new RegExp(Prototype.ScriptFragment,"im");
    return(this.match(b)||[]).map(function(c){
        return(c.match(a)||["",""])[1]
        })
    },
evalScripts:function(){
    return this.extractScripts().map(function(script){
        return eval(script)
        })
    },
escapeHTML:function(){
    var a=arguments.callee;
    a.text.data=this;
    return a.div.innerHTML
    },
unescapeHTML:function(){
    var a=new Element("div");
    a.innerHTML=this.stripTags();
    return a.childNodes[0]?(a.childNodes.length>1?$A(a.childNodes).inject("",function(b,c){
        return b+c.nodeValue
        }):a.childNodes[0].nodeValue):""
    },
toQueryParams:function(b){
    var a=this.strip().match(/([^?#]*)(#.*)?$/);
    if(!a){
        return{}
    }
    return a[1].split(b||"&").inject({},function(f,g){
    if((g=g.split("="))[0]){
        var c=decodeURIComponent(g.shift());
        var d=g.length>1?g.join("="):g[0];
        if(d!=undefined){
            d=decodeURIComponent(d)
            }
            if(c in f){
            if(!Object.isArray(f[c])){
                f[c]=[f[c]]
                }
                f[c].push(d)
            }else{
            f[c]=d
            }
        }
    return f
})
},
toArray:function(){
    return this.split("")
    },
succ:function(){
    return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)
    },
times:function(a){
    return a<1?"":new Array(a+1).join(this)
    },
camelize:function(){
    var d=this.split("-"),a=d.length;
    if(a==1){
        return d[0]
        }
        var c=this.charAt(0)=="-"?d[0].charAt(0).toUpperCase()+d[0].substring(1):d[0];
    for(var b=1;b<a;b++){
        c+=d[b].charAt(0).toUpperCase()+d[b].substring(1)
        }
        return c
    },
capitalize:function(){
    return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase()
    },
underscore:function(){
    return this.gsub(/::/,"/").gsub(/([A-Z]+)([A-Z][a-z])/,"#{1}_#{2}").gsub(/([a-z\d])([A-Z])/,"#{1}_#{2}").gsub(/-/,"_").toLowerCase()
    },
dasherize:function(){
    return this.gsub(/_/,"-")
    },
inspect:function(b){
    var a=this.gsub(/[\x00-\x1f\\]/,function(c){
        var d=String.specialChar[c[0]];
        return d?d:"\\u00"+c[0].charCodeAt().toPaddedString(2,16)
        });
    if(b){
        return'"'+a.replace(/"/g,'\\"')+'"'
        }
        return"'"+a.replace(/'/g,"\\'")+"'"
    },
toJSON:function(){
    return this.inspect(true)
    },
unfilterJSON:function(a){
    return this.sub(a||Prototype.JSONFilter,"#{1}")
    },
isJSON:function(){
    var a=this;
    if(a.blank()){
        return false
        }
        a=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");
    return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(a)
    },
evalJSON:function(sanitize){
    var json=this.unfilterJSON();
    try{
        if(!sanitize||json.isJSON()){
            return eval("("+json+")")
            }
        }catch(e){}
throw new SyntaxError("Badly formed JSON string: "+this.inspect())
},
include:function(a){
    return this.indexOf(a)>-1
    },
startsWith:function(a){
    return this.indexOf(a)===0
    },
endsWith:function(a){
    var b=this.length-a.length;
    return b>=0&&this.lastIndexOf(a)===b
    },
empty:function(){
    return this==""
    },
blank:function(){
    return/^\s*$/.test(this)
    },
interpolate:function(a,b){
    return new Template(this,b).evaluate(a)
    }
});
if(Prototype.Browser.WebKit||Prototype.Browser.IE){
    Object.extend(String.prototype,{
        escapeHTML:function(){
            return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")
            },
        unescapeHTML:function(){
            return this.stripTags().replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")
            }
        })
    }
    String.prototype.gsub.prepareReplacement=function(b){
    if(Object.isFunction(b)){
        return b
        }
        var a=new Template(b);
    return function(c){
        return a.evaluate(c)
        }
    };

String.prototype.parseQuery=String.prototype.toQueryParams;
Object.extend(String.prototype.escapeHTML,{
    div:document.createElement("div"),
    text:document.createTextNode("")
    });
String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);
var Template=Class.create({
    initialize:function(a,b){
        this.template=a.toString();
        this.pattern=b||Template.Pattern
        },
    evaluate:function(a){
        if(Object.isFunction(a.toTemplateReplacements)){
            a=a.toTemplateReplacements()
            }
            return this.template.gsub(this.pattern,function(d){
            if(a==null){
                return""
                }
                var g=d[1]||"";
            if(g=="\\"){
                return d[2]
                }
                var b=a,h=d[3];
            var f=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
            d=f.exec(h);
            if(d==null){
                return g
                }while(d!=null){
                var c=d[1].startsWith("[")?d[2].gsub("\\\\]","]"):d[1];
                b=b[c];
                if(null==b||""==d[3]){
                    break
                }
                h=h.substring("["==d[3]?d[1].length:d[0].length);
                d=f.exec(h)
                }
                return g+String.interpret(b)
            })
        }
    });
Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;
var $break={};

var Enumerable={
    each:function(c,b){
        var a=0;
        try{
            this._each(function(f){
                c.call(b,f,a++)
                })
            }catch(d){
            if(d!=$break){
                throw d
                }
            }
        return this
    },
eachSlice:function(d,c,b){
    var a=-d,f=[],g=this.toArray();
    if(d<1){
        return g
        }while((a+=d)<g.length){
        f.push(g.slice(a,a+d))
        }
        return f.collect(c,b)
    },
all:function(c,b){
    c=c||Prototype.K;
    var a=true;
    this.each(function(f,d){
        a=a&&!!c.call(b,f,d);
        if(!a){
            throw $break
            }
        });
return a
},
any:function(c,b){
    c=c||Prototype.K;
    var a=false;
    this.each(function(f,d){
        if(a=!!c.call(b,f,d)){
            throw $break
            }
        });
return a
},
collect:function(c,b){
    c=c||Prototype.K;
    var a=[];
    this.each(function(f,d){
        a.push(c.call(b,f,d))
        });
    return a
    },
detect:function(c,b){
    var a;
    this.each(function(f,d){
        if(c.call(b,f,d)){
            a=f;
            throw $break
            }
        });
return a
},
findAll:function(c,b){
    var a=[];
    this.each(function(f,d){
        if(c.call(b,f,d)){
            a.push(f)
            }
        });
return a
},
grep:function(d,c,b){
    c=c||Prototype.K;
    var a=[];
    if(Object.isString(d)){
        d=new RegExp(d)
        }
        this.each(function(g,f){
        if(d.match(g)){
            a.push(c.call(b,g,f))
            }
        });
return a
},
include:function(a){
    if(Object.isFunction(this.indexOf)){
        if(this.indexOf(a)!=-1){
            return true
            }
        }
    var b=false;
this.each(function(c){
    if(c==a){
        b=true;
        throw $break
        }
    });
return b
},
inGroupsOf:function(b,a){
    a=Object.isUndefined(a)?null:a;
    return this.eachSlice(b,function(c){
        while(c.length<b){
            c.push(a)
            }
            return c
        })
    },
inject:function(a,c,b){
    this.each(function(f,d){
        a=c.call(b,a,f,d)
        });
    return a
    },
invoke:function(b){
    var a=$A(arguments).slice(1);
    return this.map(function(c){
        return c[b].apply(c,a)
        })
    },
max:function(c,b){
    c=c||Prototype.K;
    var a;
    this.each(function(f,d){
        f=c.call(b,f,d);
        if(a==null||f>=a){
            a=f
            }
        });
return a
},
min:function(c,b){
    c=c||Prototype.K;
    var a;
    this.each(function(f,d){
        f=c.call(b,f,d);
        if(a==null||f<a){
            a=f
            }
        });
return a
},
partition:function(d,b){
    d=d||Prototype.K;
    var c=[],a=[];
    this.each(function(g,f){
        (d.call(b,g,f)?c:a).push(g)
        });
    return[c,a]
    },
pluck:function(b){
    var a=[];
    this.each(function(c){
        a.push(c[b])
        });
    return a
    },
reject:function(c,b){
    var a=[];
    this.each(function(f,d){
        if(!c.call(b,f,d)){
            a.push(f)
            }
        });
return a
},
sortBy:function(b,a){
    return this.map(function(d,c){
        return{
            value:d,
            criteria:b.call(a,d,c)
            }
        }).sort(function(g,f){
    var d=g.criteria,c=f.criteria;
    return d<c?-1:d>c?1:0
    }).pluck("value")
},
toArray:function(){
    return this.map()
    },
zip:function(){
    var b=Prototype.K,a=$A(arguments);
    if(Object.isFunction(a.last())){
        b=a.pop()
        }
        var c=[this].concat(a).map($A);
    return this.map(function(f,d){
        return b(c.pluck(d))
        })
    },
size:function(){
    return this.toArray().length
    },
inspect:function(){
    return"#<Enumerable:"+this.toArray().inspect()+">"
    }
};

Object.extend(Enumerable,{
    map:Enumerable.collect,
    find:Enumerable.detect,
    select:Enumerable.findAll,
    filter:Enumerable.findAll,
    member:Enumerable.include,
    entries:Enumerable.toArray,
    every:Enumerable.all,
    some:Enumerable.any
    });
function $A(c){
    if(!c){
        return[]
        }
        if(c.toArray){
        return c.toArray()
        }
        var b=c.length||0,a=new Array(b);
    while(b--){
        a[b]=c[b]
        }
        return a
    }
    if(Prototype.Browser.WebKit){
    $A=function(c){
        if(!c){
            return[]
            }
            if(!(typeof c==="function"&&typeof c.length==="number"&&typeof c.item==="function")&&c.toArray){
            return c.toArray()
            }
            var b=c.length||0,a=new Array(b);
        while(b--){
            a[b]=c[b]
            }
            return a
        }
    }
    Array.from=$A;
Object.extend(Array.prototype,Enumerable);
if(!Array.prototype._reverse){
    Array.prototype._reverse=Array.prototype.reverse
        }
        Object.extend(Array.prototype,{
    _each:function(b){
        for(var a=0,c=this.length;a<c;a++){
            b(this[a])
            }
        },
clear:function(){
    this.length=0;
    return this
    },
first:function(){
    return this[0]
    },
last:function(){
    return this[this.length-1]
    },
compact:function(){
    return this.select(function(a){
        return a!=null
        })
    },
flatten:function(){
    return this.inject([],function(b,a){
        return b.concat(Object.isArray(a)?a.flatten():[a])
        })
    },
without:function(){
    var a=$A(arguments);
    return this.select(function(b){
        return !a.include(b)
        })
    },
reverse:function(a){
    return(a!==false?this:this.toArray())._reverse()
    },
reduce:function(){
    return this.length>1?this:this[0]
    },
uniq:function(a){
    return this.inject([],function(d,c,b){
        if(0==b||(a?d.last()!=c:!d.include(c))){
            d.push(c)
            }
            return d
        })
    },
intersect:function(a){
    return this.uniq().findAll(function(b){
        return a.detect(function(c){
            return b===c
            })
        })
    },
clone:function(){
    return[].concat(this)
    },
size:function(){
    return this.length
    },
inspect:function(){
    return"["+this.map(Object.inspect).join(", ")+"]"
    },
toJSON:function(){
    var a=[];
    this.each(function(b){
        var c=Object.toJSON(b);
        if(!Object.isUndefined(c)){
            a.push(c)
            }
        });
return"["+a.join(", ")+"]"
    }
});
if(Object.isFunction(Array.prototype.forEach)){
    Array.prototype._each=Array.prototype.forEach
        }
        if(!Array.prototype.indexOf){
    Array.prototype.indexOf=function(c,a){
        a||(a=0);
        var b=this.length;
        if(a<0){
            a=b+a
            }
            for(;a<b;a++){
            if(this[a]===c){
                return a
                }
            }
        return -1
    }
    }
if(!Array.prototype.lastIndexOf){
    Array.prototype.lastIndexOf=function(b,a){
        a=isNaN(a)?this.length:(a<0?this.length+a:a)+1;
        var c=this.slice(0,a).reverse().indexOf(b);
        return(c<0)?c:a-c-1
        }
    }
    Array.prototype.toArray=Array.prototype.clone;
function $w(a){
    if(!Object.isString(a)){
        return[]
        }
        a=a.strip();
    return a?a.split(/\s+/):[]
    }
    if(Prototype.Browser.Opera){
    Array.prototype.concat=function(){
        var f=[];
        for(var b=0,c=this.length;b<c;b++){
            f.push(this[b])
            }
            for(var b=0,c=arguments.length;b<c;b++){
            if(Object.isArray(arguments[b])){
                for(var a=0,d=arguments[b].length;a<d;a++){
                    f.push(arguments[b][a])
                    }
                }else{
            f.push(arguments[b])
            }
        }
        return f
    }
}
Object.extend(Number.prototype,{
    toColorPart:function(){
        return this.toPaddedString(2,16)
        },
    succ:function(){
        return this+1
        },
    times:function(b,a){
        $R(0,this,true).each(b,a);
        return this
        },
    toPaddedString:function(c,b){
        var a=this.toString(b||10);
        return"0".times(c-a.length)+a
        },
    toJSON:function(){
        return isFinite(this)?this.toString():"null"
        }
    });
$w("abs round ceil floor").each(function(a){
    Number.prototype[a]=Math[a].methodize()
    });
function $H(a){
    return new Hash(a)
    }
    var Hash=Class.create(Enumerable,(function(){
    function a(b,c){
        if(Object.isUndefined(c)){
            return b
            }
            return b+"="+encodeURIComponent(String.interpret(c))
        }
        return{
        initialize:function(b){
            this._object=Object.isHash(b)?b.toObject():Object.clone(b)
            },
        _each:function(c){
            for(var b in this._object){
                var d=this._object[b],f=[b,d];
                f.key=b;
                f.value=d;
                c(f)
                }
            },
    set:function(b,c){
        return this._object[b]=c
        },
    get:function(b){
        if(this._object[b]!==Object.prototype[b]){
            return this._object[b]
            }
        },
unset:function(b){
    var c=this._object[b];
    delete this._object[b];
    return c
    },
toObject:function(){
    return Object.clone(this._object)
    },
keys:function(){
    return this.pluck("key")
    },
values:function(){
    return this.pluck("value")
    },
index:function(c){
    var b=this.detect(function(d){
        return d.value===c
        });
    return b&&b.key
    },
merge:function(b){
    return this.clone().update(b)
    },
update:function(b){
    return new Hash(b).inject(this,function(c,d){
        c.set(d.key,d.value);
        return c
        })
    },
toQueryString:function(){
    return this.inject([],function(d,f){
        var c=encodeURIComponent(f.key),b=f.value;
        if(b&&typeof b=="object"){
            if(Object.isArray(b)){
                return d.concat(b.map(a.curry(c)))
                }
            }else{
        d.push(a(c,b))
        }
        return d
    }).join("&")
    },
inspect:function(){
    return"#<Hash:{"+this.map(function(b){
        return b.map(Object.inspect).join(": ")
        }).join(", ")+"}>"
    },
toJSON:function(){
    return Object.toJSON(this.toObject())
    },
clone:function(){
    return new Hash(this)
    }
}
})());
Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;
Hash.from=$H;
var ObjectRange=Class.create(Enumerable,{
    initialize:function(c,a,b){
        this.start=c;
        this.end=a;
        this.exclusive=b
        },
    _each:function(a){
        var b=this.start;
        while(this.include(b)){
            a(b);
            b=b.succ()
            }
        },
include:function(a){
    if(a<this.start){
        return false
        }
        if(this.exclusive){
        return a<this.end
        }
        return a<=this.end
    }
});
var $R=function(c,a,b){
    return new ObjectRange(c,a,b)
    };

var Ajax={
    getTransport:function(){
        return Try.these(function(){
            return new XMLHttpRequest()
            },function(){
            return new ActiveXObject("Msxml2.XMLHTTP")
            },function(){
            return new ActiveXObject("Microsoft.XMLHTTP")
            })||false
        },
    activeRequestCount:0
};

Ajax.Responders={
    responders:[],
    _each:function(a){
        this.responders._each(a)
        },
    register:function(a){
        if(!this.include(a)){
            this.responders.push(a)
            }
        },
unregister:function(a){
    this.responders=this.responders.without(a)
    },
dispatch:function(d,b,c,a){
    this.each(function(f){
        if(Object.isFunction(f[d])){
            try{
                f[d].apply(f,[b,c,a])
                }catch(g){}
        }
    })
}
};

Object.extend(Ajax.Responders,Enumerable);
Ajax.Responders.register({
    onCreate:function(){
        Ajax.activeRequestCount++
    },
    onComplete:function(){
        Ajax.activeRequestCount--
    }
});
Ajax.Base=Class.create({
    initialize:function(a){
        this.options={
            method:"post",
            asynchronous:true,
            contentType:"application/x-www-form-urlencoded",
            encoding:"UTF-8",
            parameters:"",
            evalJSON:true,
            evalJS:true
        };

        Object.extend(this.options,a||{});
        this.options.method=this.options.method.toLowerCase();
        if(Object.isString(this.options.parameters)){
            this.options.parameters=this.options.parameters.toQueryParams()
            }else{
            if(Object.isHash(this.options.parameters)){
                this.options.parameters=this.options.parameters.toObject()
                }
            }
    }
});
Ajax.Request=Class.create(Ajax.Base,{
    _complete:false,
    initialize:function($super,b,a){
        $super(a);
        this.transport=Ajax.getTransport();
        this.request(b)
        },
    request:function(b){
        this.url=b;
        this.method=this.options.method;
        var d=Object.clone(this.options.parameters);
        if(!["get","post"].include(this.method)){
            d._method=this.method;
            this.method="post"
            }
            this.parameters=d;
        if(d=Object.toQueryString(d)){
            if(this.method=="get"){
                this.url+=(this.url.include("?")?"&":"?")+d
                }else{
                if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){
                    d+="&_="
                    }
                }
        }
    try{
    var a=new Ajax.Response(this);
    if(this.options.onCreate){
        this.options.onCreate(a)
        }
        Ajax.Responders.dispatch("onCreate",this,a);
    this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);
    if(this.options.asynchronous){
        this.respondToReadyState.bind(this).defer(1)
        }
        this.transport.onreadystatechange=this.onStateChange.bind(this);
    this.setRequestHeaders();
    this.body=this.method=="post"?(this.options.postBody||d):null;
    this.transport.send(this.body);
    if(!this.options.asynchronous&&this.transport.overrideMimeType){
        this.onStateChange()
        }
    }catch(c){
    this.dispatchException(c)
    }
},
onStateChange:function(){
    var a=this.transport.readyState;
    if(a>1&&!((a==4)&&this._complete)){
        this.respondToReadyState(this.transport.readyState)
        }
    },
setRequestHeaders:function(){
    var f={
        "X-Requested-With":"XMLHttpRequest",
        "X-Prototype-Version":Prototype.Version,
        Accept:"text/javascript, text/html, application/xml, text/xml, */*"
    };

    if(this.method=="post"){
        f["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");
        if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){
            f.Connection="close"
            }
        }
    if(typeof this.options.requestHeaders=="object"){
    var c=this.options.requestHeaders;
    if(Object.isFunction(c.push)){
        for(var b=0,d=c.length;b<d;b+=2){
            f[c[b]]=c[b+1]
            }
        }else{
    $H(c).each(function(g){
        f[g.key]=g.value
        })
    }
}
for(var a in f){
    this.transport.setRequestHeader(a,f[a])
    }
},
success:function(){
    var a=this.getStatus();
    return !a||(a>=200&&a<300)
    },
getStatus:function(){
    try{
        return this.transport.status||0
        }catch(a){
        return 0
        }
    },
respondToReadyState:function(a){
    var c=Ajax.Request.Events[a],b=new Ajax.Response(this);
    if(c=="Complete"){
        try{
            this._complete=true;
            (this.options["on"+b.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(b,b.headerJSON)
            }catch(d){
            this.dispatchException(d)
            }
            var f=b.getHeader("Content-type");
        if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&f&&f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){
            this.evalResponse()
            }
        }
    try{
    (this.options["on"+c]||Prototype.emptyFunction)(b,b.headerJSON);
    Ajax.Responders.dispatch("on"+c,this,b,b.headerJSON)
    }catch(d){
    this.dispatchException(d)
    }
    if(c=="Complete"){
    this.transport.onreadystatechange=Prototype.emptyFunction
    }
},
isSameOrigin:function(){
    var a=this.url.match(/^\s*https?:\/\/[^\/]*/);
    return !a||(a[0]=="#{protocol}//#{domain}#{port}".interpolate({
        protocol:location.protocol,
        domain:document.domain,
        port:location.port?":"+location.port:""
        }))
    },
getHeader:function(a){
    try{
        return this.transport.getResponseHeader(a)||null
        }catch(b){
        return null
        }
    },
evalResponse:function(){
    try{
        return eval((this.transport.responseText||"").unfilterJSON())
        }catch(e){
        this.dispatchException(e)
        }
    },
dispatchException:function(a){
    (this.options.onException||Prototype.emptyFunction)(this,a);
    Ajax.Responders.dispatch("onException",this,a)
    }
});
Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];
Ajax.Response=Class.create({
    initialize:function(c){
        this.request=c;
        var d=this.transport=c.transport,a=this.readyState=d.readyState;
        if((a>2&&!Prototype.Browser.IE)||a==4){
            this.status=this.getStatus();
            this.statusText=this.getStatusText();
            this.responseText=String.interpret(d.responseText);
            this.headerJSON=this._getHeaderJSON()
            }
            if(a==4){
            var b=d.responseXML;
            this.responseXML=Object.isUndefined(b)?null:b;
            this.responseJSON=this._getResponseJSON()
            }
        },
status:0,
statusText:"",
getStatus:Ajax.Request.prototype.getStatus,
getStatusText:function(){
    try{
        return this.transport.statusText||""
        }catch(a){
        return""
        }
    },
    getHeader:Ajax.Request.prototype.getHeader,
    getAllHeaders:function(){
    try{
        return this.getAllResponseHeaders()
        }catch(a){
        return null
        }
    },
getResponseHeader:function(a){
    return this.transport.getResponseHeader(a)
    },
getAllResponseHeaders:function(){
    return this.transport.getAllResponseHeaders()
    },
_getHeaderJSON:function(){
    var a=this.getHeader("X-JSON");
    if(!a){
        return null
        }
        a=decodeURIComponent(escape(a));
    try{
        return a.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())
        }catch(b){
        this.request.dispatchException(b)
        }
    },
_getResponseJSON:function(){
    var a=this.request.options;
    if(!a.evalJSON||(a.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){
        return null
        }
        try{
        return this.responseText.evalJSON(a.sanitizeJSON||!this.request.isSameOrigin())
        }catch(b){
        this.request.dispatchException(b)
        }
    }
});
Ajax.Updater=Class.create(Ajax.Request,{
    initialize:function($super,a,c,b){
        this.container={
            success:(a.success||a),
            failure:(a.failure||(a.success?null:a))
            };

        b=Object.clone(b);
        var d=b.onComplete;
        b.onComplete=(function(f,g){
            this.updateContent(f.responseText);
            if(Object.isFunction(d)){
                d(f,g)
                }
            }).bind(this);
    $super(c,b)
    },
updateContent:function(d){
    var c=this.container[this.success()?"success":"failure"],a=this.options;
    if(!a.evalScripts){
        d=d.stripScripts()
        }
        if(c=$(c)){
        if(a.insertion){
            if(Object.isString(a.insertion)){
                var b={};

                b[a.insertion]=d;
                c.insert(b)
                }else{
                a.insertion(c,d)
                }
            }else{
        c.update(d)
        }
    }
}
});
Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{
    initialize:function($super,a,c,b){
        $super(b);
        this.onComplete=this.options.onComplete;
        this.frequency=(this.options.frequency||2);
        this.decay=(this.options.decay||1);
        this.updater={};

        this.container=a;
        this.url=c;
        this.start()
        },
    start:function(){
        this.options.onComplete=this.updateComplete.bind(this);
        this.onTimerEvent()
        },
    stop:function(){
        this.updater.options.onComplete=undefined;
        clearTimeout(this.timer);
        (this.onComplete||Prototype.emptyFunction).apply(this,arguments)
        },
    updateComplete:function(a){
        if(this.options.decay){
            this.decay=(a.responseText==this.lastText?this.decay*this.options.decay:1);
            this.lastText=a.responseText
            }
            this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)
        },
    onTimerEvent:function(){
        this.updater=new Ajax.Updater(this.container,this.url,this.options)
        }
    });
function $(b){
    if(arguments.length>1){
        for(var a=0,d=[],c=arguments.length;a<c;a++){
            d.push($(arguments[a]))
            }
            return d
        }
        if(Object.isString(b)){
        b=document.getElementById(b)
        }
        return Element.extend(b)
    }
    if(Prototype.BrowserFeatures.XPath){
    document._getElementsByXPath=function(g,a){
        var c=[];
        var f=document.evaluate(g,$(a)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
        for(var b=0,d=f.snapshotLength;b<d;b++){
            c.push(Element.extend(f.snapshotItem(b)))
            }
            return c
        }
    }
    if(!window.Node){
    var Node={}
}
if(!Node.ELEMENT_NODE){
    Object.extend(Node,{
        ELEMENT_NODE:1,
        ATTRIBUTE_NODE:2,
        TEXT_NODE:3,
        CDATA_SECTION_NODE:4,
        ENTITY_REFERENCE_NODE:5,
        ENTITY_NODE:6,
        PROCESSING_INSTRUCTION_NODE:7,
        COMMENT_NODE:8,
        DOCUMENT_NODE:9,
        DOCUMENT_TYPE_NODE:10,
        DOCUMENT_FRAGMENT_NODE:11,
        NOTATION_NODE:12
    })
    }(function(){
    var a=this.Element;
    this.Element=function(d,c){
        c=c||{};

        d=d.toLowerCase();
        var b=Element.cache;
        if(Prototype.Browser.IE&&c.name){
            d="<"+d+' name="'+c.name+'">';
            delete c.name;
            return Element.writeAttribute(document.createElement(d),c)
            }
            if(!b[d]){
            b[d]=Element.extend(document.createElement(d))
            }
            return Element.writeAttribute(b[d].cloneNode(false),c)
        };

    Object.extend(this.Element,a||{});
    if(a){
        this.Element.prototype=a.prototype
        }
    }).call(window);
Element.cache={};

Element.Methods={
    visible:function(a){
        return $(a).style.display!="none"
        },
    toggle:function(a){
        a=$(a);
        Element[Element.visible(a)?"hide":"show"](a);
        return a
        },
    hide:function(a){
        a=$(a);
        a.style.display="none";
        return a
        },
    show:function(a){
        a=$(a);
        a.style.display="";
        return a
        },
    remove:function(a){
        a=$(a);
        a.parentNode.removeChild(a);
        return a
        },
    update:function(a,b){
        a=$(a);
        if(b&&b.toElement){
            b=b.toElement()
            }
            if(Object.isElement(b)){
            return a.update().insert(b)
            }
            b=Object.toHTML(b);
        a.innerHTML=b.stripScripts();
        b.evalScripts.bind(b).defer();
        return a
        },
    replace:function(b,c){
        b=$(b);
        if(c&&c.toElement){
            c=c.toElement()
            }else{
            if(!Object.isElement(c)){
                c=Object.toHTML(c);
                var a=b.ownerDocument.createRange();
                a.selectNode(b);
                c.evalScripts.bind(c).defer();
                c=a.createContextualFragment(c.stripScripts())
                }
            }
        b.parentNode.replaceChild(c,b);
    return b
    },
insert:function(c,f){
    c=$(c);
    if(Object.isString(f)||Object.isNumber(f)||Object.isElement(f)||(f&&(f.toElement||f.toHTML))){
        f={
            bottom:f
        }
    }
    var d,g,b,h;
for(var a in f){
    d=f[a];
    a=a.toLowerCase();
    g=Element._insertionTranslations[a];
    if(d&&d.toElement){
        d=d.toElement()
        }
        if(Object.isElement(d)){
        g(c,d);
        continue
    }
    d=Object.toHTML(d);
    b=((a=="before"||a=="after")?c.parentNode:c).tagName.toUpperCase();
    h=Element._getContentFromAnonymousElement(b,d.stripScripts());
    if(a=="top"||a=="after"){
        h.reverse()
        }
        h.each(g.curry(c));
    d.evalScripts.bind(d).defer()
    }
    return c
},
wrap:function(b,c,a){
    b=$(b);
    if(Object.isElement(c)){
        $(c).writeAttribute(a||{})
        }else{
        if(Object.isString(c)){
            c=new Element(c,a)
            }else{
            c=new Element("div",c)
            }
        }
    if(b.parentNode){
    b.parentNode.replaceChild(c,b)
    }
    c.appendChild(b);
return c
},
inspect:function(b){
    b=$(b);
    var a="<"+b.tagName.toLowerCase();
    $H({
        id:"id",
        className:"class"
    }).each(function(g){
        var f=g.first(),c=g.last();
        var d=(b[f]||"").toString();
        if(d){
            a+=" "+c+"="+d.inspect(true)
            }
        });
return a+">"
},
recursivelyCollect:function(a,c){
    a=$(a);
    var b=[];
    while(a=a[c]){
        if(a.nodeType==1){
            b.push(Element.extend(a))
            }
        }
    return b
},
ancestors:function(a){
    return $(a).recursivelyCollect("parentNode")
    },
descendants:function(a){
    return $(a).select("*")
    },
firstDescendant:function(a){
    a=$(a).firstChild;
    while(a&&a.nodeType!=1){
        a=a.nextSibling
        }
        return $(a)
    },
immediateDescendants:function(a){
    if(!(a=$(a).firstChild)){
        return[]
        }while(a&&a.nodeType!=1){
        a=a.nextSibling
        }
        if(a){
        return[a].concat($(a).nextSiblings())
        }
        return[]
    },
previousSiblings:function(a){
    return $(a).recursivelyCollect("previousSibling")
    },
nextSiblings:function(a){
    return $(a).recursivelyCollect("nextSibling")
    },
siblings:function(a){
    a=$(a);
    return a.previousSiblings().reverse().concat(a.nextSiblings())
    },
match:function(b,a){
    if(Object.isString(a)){
        a=new Selector(a)
        }
        return a.match($(b))
    },
up:function(b,d,a){
    b=$(b);
    if(arguments.length==1){
        return $(b.parentNode)
        }
        var c=b.ancestors();
    return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)
    },
down:function(b,c,a){
    b=$(b);
    if(arguments.length==1){
        return b.firstDescendant()
        }
        return Object.isNumber(c)?b.descendants()[c]:Element.select(b,c)[a||0]
    },
previous:function(b,d,a){
    b=$(b);
    if(arguments.length==1){
        return $(Selector.handlers.previousElementSibling(b))
        }
        var c=b.previousSiblings();
    return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)
    },
next:function(c,d,b){
    c=$(c);
    if(arguments.length==1){
        return $(Selector.handlers.nextElementSibling(c))
        }
        var a=c.nextSiblings();
    return Object.isNumber(d)?a[d]:Selector.findElement(a,d,b)
    },
select:function(){
    var a=$A(arguments),b=$(a.shift());
    return Selector.findChildElements(b,a)
    },
adjacent:function(){
    var a=$A(arguments),b=$(a.shift());
    return Selector.findChildElements(b.parentNode,a).without(b)
    },
identify:function(b){
    b=$(b);
    var c=b.readAttribute("id"),a=arguments.callee;
    if(c){
        return c
        }
        do{
        c="anonymous_element_"+a.counter++
    }while($(c));
    b.writeAttribute("id",c);
    return c
    },
readAttribute:function(c,a){
    c=$(c);
    if(Prototype.Browser.IE){
        var b=Element._attributeTranslations.read;
        if(b.values[a]){
            return b.values[a](c,a)
            }
            if(b.names[a]){
            a=b.names[a]
            }
            if(a.include(":")){
            return(!c.attributes||!c.attributes[a])?null:c.attributes[a].value
            }
        }
    return c.getAttribute(a)
},
writeAttribute:function(f,c,g){
    f=$(f);
    var b={},d=Element._attributeTranslations.write;
    if(typeof c=="object"){
        b=c
        }else{
        b[c]=Object.isUndefined(g)?true:g
        }
        for(var a in b){
        c=d.names[a]||a;
        g=b[a];
        if(d.values[a]){
            c=d.values[a](f,g)
            }
            if(g===false||g===null){
            f.removeAttribute(c)
            }else{
            if(g===true){
                f.setAttribute(c,c)
                }else{
                f.setAttribute(c,g)
                }
            }
    }
    return f
},
getHeight:function(a){
    return $(a).getDimensions().height
    },
getWidth:function(a){
    return $(a).getDimensions().width
    },
classNames:function(a){
    return new Element.ClassNames(a)
    },
hasClassName:function(a,b){
    if(!(a=$(a))){
        return
    }
    var c=a.className;
    return(c.length>0&&(c==b||new RegExp("(^|\\s)"+b+"(\\s|$)").test(c)))
    },
addClassName:function(a,b){
    if(!(a=$(a))){
        return
    }
    if(!a.hasClassName(b)){
        a.className+=(a.className?" ":"")+b
        }
        return a
    },
removeClassName:function(a,b){
    if(!(a=$(a))){
        return
    }
    a.className=a.className.replace(new RegExp("(^|\\s+)"+b+"(\\s+|$)")," ").strip();
    return a
    },
toggleClassName:function(a,b){
    if(!(a=$(a))){
        return
    }
    return a[a.hasClassName(b)?"removeClassName":"addClassName"](b)
    },
cleanWhitespace:function(b){
    b=$(b);
    var c=b.firstChild;
    while(c){
        var a=c.nextSibling;
        if(c.nodeType==3&&!/\S/.test(c.nodeValue)){
            b.removeChild(c)
            }
            c=a
        }
        return b
    },
empty:function(a){
    return $(a).innerHTML.blank()
    },
descendantOf:function(b,a){
    b=$(b),a=$(a);
    if(b.compareDocumentPosition){
        return(b.compareDocumentPosition(a)&8)===8
        }
        if(a.contains){
        return a.contains(b)&&a!==b
        }while(b=b.parentNode){
        if(b==a){
            return true
            }
        }
    return false
},
scrollTo:function(a){
    a=$(a);
    var b=a.cumulativeOffset();
    window.scrollTo(b[0],b[1]);
    return a
    },
getStyle:function(b,c){
    b=$(b);
    c=c=="float"?"cssFloat":c.camelize();
    var d=b.style[c];
    if(!d||d=="auto"){
        var a=document.defaultView.getComputedStyle(b,null);
        d=a?a[c]:null
        }
        if(c=="opacity"){
        return d?parseFloat(d):1
        }
        return d=="auto"?null:d
    },
getOpacity:function(a){
    return $(a).getStyle("opacity")
    },
setStyle:function(b,c){
    b=$(b);
    var f=b.style,a;
    if(Object.isString(c)){
        b.style.cssText+=";"+c;
        return c.include("opacity")?b.setOpacity(c.match(/opacity:\s*(\d?\.?\d*)/)[1]):b
        }
        for(var d in c){
        if(d=="opacity"){
            b.setOpacity(c[d])
            }else{
            f[(d=="float"||d=="cssFloat")?(Object.isUndefined(f.styleFloat)?"cssFloat":"styleFloat"):d]=c[d]
            }
        }
    return b
},
setOpacity:function(a,b){
    a=$(a);
    a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;
    return a
    },
getDimensions:function(c){
    c=$(c);
    var h=c.getStyle("display");
    if(h!="none"&&h!=null){
        return{
            width:c.offsetWidth,
            height:c.offsetHeight
            }
        }
    var b=c.style;
var g=b.visibility;
var d=b.position;
var a=b.display;
b.visibility="hidden";
b.position="absolute";
b.display="block";
var j=c.clientWidth;
var f=c.clientHeight;
b.display=a;
b.position=d;
b.visibility=g;
return{
    width:j,
    height:f
}
},
makePositioned:function(a){
    a=$(a);
    var b=Element.getStyle(a,"position");
    if(b=="static"||!b){
        a._madePositioned=true;
        a.style.position="relative";
        if(Prototype.Browser.Opera){
            a.style.top=0;
            a.style.left=0
            }
        }
    return a
},
undoPositioned:function(a){
    a=$(a);
    if(a._madePositioned){
        a._madePositioned=undefined;
        a.style.position=a.style.top=a.style.left=a.style.bottom=a.style.right=""
        }
        return a
    },
makeClipping:function(a){
    a=$(a);
    if(a._overflow){
        return a
        }
        a._overflow=Element.getStyle(a,"overflow")||"auto";
    if(a._overflow!=="hidden"){
        a.style.overflow="hidden"
        }
        return a
    },
undoClipping:function(a){
    a=$(a);
    if(!a._overflow){
        return a
        }
        a.style.overflow=a._overflow=="auto"?"":a._overflow;
    a._overflow=null;
    return a
    },
cumulativeOffset:function(b){
    var a=0,c=0;
    do{
        a+=b.offsetTop||0;
        c+=b.offsetLeft||0;
        b=b.offsetParent
        }while(b);
    return Element._returnOffset(c,a)
    },
positionedOffset:function(b){
    var a=0,d=0;
    do{
        a+=b.offsetTop||0;
        d+=b.offsetLeft||0;
        b=b.offsetParent;
        if(b){
            if(b.tagName.toUpperCase()=="BODY"){
                break
            }
            var c=Element.getStyle(b,"position");
            if(c!=="static"){
                break
            }
        }
    }while(b);
return Element._returnOffset(d,a)
},
absolutize:function(b){
    b=$(b);
    if(b.getStyle("position")=="absolute"){
        return b
        }
        var d=b.positionedOffset();
    var g=d[1];
    var f=d[0];
    var c=b.clientWidth;
    var a=b.clientHeight;
    b._originalLeft=f-parseFloat(b.style.left||0);
    b._originalTop=g-parseFloat(b.style.top||0);
    b._originalWidth=b.style.width;
    b._originalHeight=b.style.height;
    b.style.position="absolute";
    b.style.top=g+"px";
    b.style.left=f+"px";
    b.style.width=c+"px";
    b.style.height=a+"px";
    return b
    },
relativize:function(a){
    a=$(a);
    if(a.getStyle("position")=="relative"){
        return a
        }
        a.style.position="relative";
    var c=parseFloat(a.style.top||0)-(a._originalTop||0);
    var b=parseFloat(a.style.left||0)-(a._originalLeft||0);
    a.style.top=c+"px";
    a.style.left=b+"px";
    a.style.height=a._originalHeight;
    a.style.width=a._originalWidth;
    return a
    },
cumulativeScrollOffset:function(b){
    var a=0,c=0;
    do{
        a+=b.scrollTop||0;
        c+=b.scrollLeft||0;
        b=b.parentNode
        }while(b);
    return Element._returnOffset(c,a)
    },
getOffsetParent:function(a){
    if(a.offsetParent){
        return $(a.offsetParent)
        }
        if(a==document.body){
        return $(a)
        }while((a=a.parentNode)&&a!=document.body){
        if(Element.getStyle(a,"position")!="static"){
            return $(a)
            }
        }
    return $(document.body)
},
viewportOffset:function(d){
    var a=0,c=0;
    var b=d;
    do{
        a+=b.offsetTop||0;
        c+=b.offsetLeft||0;
        if(b.offsetParent==document.body&&Element.getStyle(b,"position")=="absolute"){
            break
        }
    }while(b=b.offsetParent);
b=d;
do{
    if(!Prototype.Browser.Opera||(b.tagName&&(b.tagName.toUpperCase()=="BODY"))){
        a-=b.scrollTop||0;
        c-=b.scrollLeft||0
        }
    }while(b=b.parentNode);
return Element._returnOffset(c,a)
},
clonePosition:function(b,d){
    var a=Object.extend({
        setLeft:true,
        setTop:true,
        setWidth:true,
        setHeight:true,
        offsetTop:0,
        offsetLeft:0
    },arguments[2]||{});
    d=$(d);
    var f=d.viewportOffset();
    b=$(b);
    var g=[0,0];
    var c=null;
    if(Element.getStyle(b,"position")=="absolute"){
        c=b.getOffsetParent();
        g=c.viewportOffset()
        }
        if(c==document.body){
        g[0]-=document.body.offsetLeft;
        g[1]-=document.body.offsetTop
        }
        if(a.setLeft){
        b.style.left=(f[0]-g[0]+a.offsetLeft)+"px"
        }
        if(a.setTop){
        b.style.top=(f[1]-g[1]+a.offsetTop)+"px"
        }
        if(a.setWidth){
        b.style.width=d.offsetWidth+"px"
        }
        if(a.setHeight){
        b.style.height=d.offsetHeight+"px"
        }
        return b
    }
};

Element.Methods.identify.counter=1;
Object.extend(Element.Methods,{
    getElementsBySelector:Element.Methods.select,
    childElements:Element.Methods.immediateDescendants
    });
Element._attributeTranslations={
    write:{
        names:{
            className:"class",
            htmlFor:"for"
        },
        values:{}
}
};

if(Prototype.Browser.Opera){
    Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(d,b,c){
        switch(c){
            case"left":case"top":case"right":case"bottom":
                if(d(b,"position")==="static"){
                return null
                }
                case"height":case"width":
                if(!Element.visible(b)){
                return null
                }
                var f=parseInt(d(b,c),10);
                if(f!==b["offset"+c.capitalize()]){
                return f+"px"
                }
                var a;
            if(c==="height"){
                a=["border-top-width","padding-top","padding-bottom","border-bottom-width"]
                }else{
                a=["border-left-width","padding-left","padding-right","border-right-width"]
                }
                return a.inject(f,function(g,h){
                var j=d(b,h);
                return j===null?g:g-parseInt(j,10)
                })+"px";
            default:
                return d(b,c)
                }
            });
Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(c,a,b){
    if(b==="title"){
        return a.title
        }
        return c(a,b)
    })
}else{
    if(Prototype.Browser.IE){
        Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(c,b){
            b=$(b);
            try{
                b.offsetParent
                }catch(f){
                return $(document.body)
                }
                var a=b.getStyle("position");
            if(a!=="static"){
                return c(b)
                }
                b.setStyle({
                position:"relative"
            });
            var d=c(b);
            b.setStyle({
                position:a
            });
            return d
            });
        $w("positionedOffset viewportOffset").each(function(a){
            Element.Methods[a]=Element.Methods[a].wrap(function(f,c){
                c=$(c);
                try{
                    c.offsetParent
                    }catch(h){
                    return Element._returnOffset(0,0)
                    }
                    var b=c.getStyle("position");
                if(b!=="static"){
                    return f(c)
                    }
                    var d=c.getOffsetParent();
                if(d&&d.getStyle("position")==="fixed"){
                    d.setStyle({
                        zoom:1
                    })
                    }
                    c.setStyle({
                    position:"relative"
                });
                var g=f(c);
                c.setStyle({
                    position:b
                });
                return g
                })
            });
        Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap(function(b,a){
            try{
                a.offsetParent
                }catch(c){
                return Element._returnOffset(0,0)
                }
                return b(a)
            });
        Element.Methods.getStyle=function(a,b){
            a=$(a);
            b=(b=="float"||b=="cssFloat")?"styleFloat":b.camelize();
            var c=a.style[b];
            if(!c&&a.currentStyle){
                c=a.currentStyle[b]
                }
                if(b=="opacity"){
                if(c=(a.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){
                    if(c[1]){
                        return parseFloat(c[1])/100
                        }
                    }
                return 1
            }
            if(c=="auto"){
            if((b=="width"||b=="height")&&(a.getStyle("display")!="none")){
                return a["offset"+b.capitalize()]+"px"
                }
                return null
            }
            return c
        };

    Element.Methods.setOpacity=function(b,f){
        function g(h){
            return h.replace(/alpha\([^\)]*\)/gi,"")
            }
            b=$(b);
        var a=b.currentStyle;
        if((a&&!a.hasLayout)||(!a&&b.style.zoom=="normal")){
            b.style.zoom=1
            }
            var d=b.getStyle("filter"),c=b.style;
        if(f==1||f===""){
            (d=g(d))?c.filter=d:c.removeAttribute("filter");
            return b
            }else{
            if(f<0.00001){
                f=0
                }
            }
        c.filter=g(d)+"alpha(opacity="+(f*100)+")";
        return b
        };

Element._attributeTranslations={
    read:{
        names:{
            "class":"className",
            "for":"htmlFor"
        },
        values:{
            _getAttr:function(a,b){
                return a.getAttribute(b,2)
                },
            _getAttrNode:function(a,c){
                var b=a.getAttributeNode(c);
                return b?b.value:""
                },
            _getEv:function(a,b){
                b=a.getAttribute(b);
                return b?b.toString().slice(23,-2):null
                },
            _flag:function(a,b){
                return $(a).hasAttribute(b)?b:null
                },
            style:function(a){
                return a.style.cssText.toLowerCase()
                },
            title:function(a){
                return a.title
                }
            }
    }
};

Element._attributeTranslations.write={
    names:Object.extend({
        cellpadding:"cellPadding",
        cellspacing:"cellSpacing"
    },Element._attributeTranslations.read.names),
    values:{
        checked:function(a,b){
            a.checked=!!b
            },
        style:function(a,b){
            a.style.cssText=b?b:""
            }
        }
};

Element._attributeTranslations.has={};

$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder").each(function(a){
    Element._attributeTranslations.write.names[a.toLowerCase()]=a;
    Element._attributeTranslations.has[a.toLowerCase()]=a
    });
(function(a){
    Object.extend(a,{
        href:a._getAttr,
        src:a._getAttr,
        type:a._getAttr,
        action:a._getAttrNode,
        disabled:a._flag,
        checked:a._flag,
        readonly:a._flag,
        multiple:a._flag,
        onload:a._getEv,
        onunload:a._getEv,
        onclick:a._getEv,
        ondblclick:a._getEv,
        onmousedown:a._getEv,
        onmouseup:a._getEv,
        onmouseover:a._getEv,
        onmousemove:a._getEv,
        onmouseout:a._getEv,
        onfocus:a._getEv,
        onblur:a._getEv,
        onkeypress:a._getEv,
        onkeydown:a._getEv,
        onkeyup:a._getEv,
        onsubmit:a._getEv,
        onreset:a._getEv,
        onselect:a._getEv,
        onchange:a._getEv
        })
    })(Element._attributeTranslations.read.values)
    }else{
    if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){
        Element.Methods.setOpacity=function(a,b){
            a=$(a);
            a.style.opacity=(b==1)?0.999999:(b==="")?"":(b<0.00001)?0:b;
            return a
            }
        }else{
    if(Prototype.Browser.WebKit){
        Element.Methods.setOpacity=function(a,b){
            a=$(a);
            a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;
            if(b==1){
                if(a.tagName.toUpperCase()=="IMG"&&a.width){
                    a.width++;
                    a.width--
                }else{
                    try{
                        var d=document.createTextNode(" ");
                        a.appendChild(d);
                        a.removeChild(d)
                        }catch(c){}
                }
            }
        return a
        };

Element.Methods.cumulativeOffset=function(b){
    var a=0,c=0;
    do{
        a+=b.offsetTop||0;
        c+=b.offsetLeft||0;
        if(b.offsetParent==document.body){
            if(Element.getStyle(b,"position")=="absolute"){
                break
            }
        }
        b=b.offsetParent
    }while(b);
    return Element._returnOffset(c,a)
    }
}
}
}
}
if(Prototype.Browser.IE||Prototype.Browser.Opera){
    Element.Methods.update=function(b,c){
        b=$(b);
        if(c&&c.toElement){
            c=c.toElement()
            }
            if(Object.isElement(c)){
            return b.update().insert(c)
            }
            c=Object.toHTML(c);
        var a=b.tagName.toUpperCase();
        if(a in Element._insertionTranslations.tags){
            $A(b.childNodes).each(function(d){
                b.removeChild(d)
                });
            Element._getContentFromAnonymousElement(a,c.stripScripts()).each(function(d){
                b.appendChild(d)
                })
            }else{
            b.innerHTML=c.stripScripts()
            }
            c.evalScripts.bind(c).defer();
        return b
        }
    }
    if("outerHTML" in document.createElement("div")){
    Element.Methods.replace=function(c,f){
        c=$(c);
        if(f&&f.toElement){
            f=f.toElement()
            }
            if(Object.isElement(f)){
            c.parentNode.replaceChild(f,c);
            return c
            }
            f=Object.toHTML(f);
        var d=c.parentNode,b=d.tagName.toUpperCase();
        if(Element._insertionTranslations.tags[b]){
            var g=c.next();
            var a=Element._getContentFromAnonymousElement(b,f.stripScripts());
            d.removeChild(c);
            if(g){
                a.each(function(h){
                    d.insertBefore(h,g)
                    })
                }else{
                a.each(function(h){
                    d.appendChild(h)
                    })
                }
            }else{
        c.outerHTML=f.stripScripts()
        }
        f.evalScripts.bind(f).defer();
        return c
        }
    }
Element._returnOffset=function(b,c){
    var a=[b,c];
    a.left=b;
    a.top=c;
    return a
    };

Element._getContentFromAnonymousElement=function(c,b){
    var d=new Element("div"),a=Element._insertionTranslations.tags[c];
    if(a){
        d.innerHTML=a[0]+b+a[1];
        a[2].times(function(){
            d=d.firstChild
            })
        }else{
        d.innerHTML=b
        }
        return $A(d.childNodes)
    };

Element._insertionTranslations={
    before:function(a,b){
        a.parentNode.insertBefore(b,a)
        },
    top:function(a,b){
        a.insertBefore(b,a.firstChild)
        },
    bottom:function(a,b){
        a.appendChild(b)
        },
    after:function(a,b){
        a.parentNode.insertBefore(b,a.nextSibling)
        },
    tags:{
        TABLE:["<table>","</table>",1],
        TBODY:["<table><tbody>","</tbody></table>",2],
        TR:["<table><tbody><tr>","</tr></tbody></table>",3],
        TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],
        SELECT:["<select>","</select>",1]
        }
    };
(function(){
    Object.extend(this.tags,{
        THEAD:this.tags.TBODY,
        TFOOT:this.tags.TBODY,
        TH:this.tags.TD
        })
    }).call(Element._insertionTranslations);
Element.Methods.Simulated={
    hasAttribute:function(a,c){
        c=Element._attributeTranslations.has[c]||c;
        var b=$(a).getAttributeNode(c);
        return !!(b&&b.specified)
        }
    };

Element.Methods.ByTag={};

Object.extend(Element,Element.Methods);
if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement("div")["__proto__"]){
    window.HTMLElement={};

    window.HTMLElement.prototype=document.createElement("div")["__proto__"];
    Prototype.BrowserFeatures.ElementExtensions=true
        }
        Element.extend=(function(){
    if(Prototype.BrowserFeatures.SpecificElementExtensions){
        return Prototype.K
        }
        var a={},b=Element.Methods.ByTag;
    var c=Object.extend(function(g){
        if(!g||g._extendedByPrototype||g.nodeType!=1||g==window){
            return g
            }
            var d=Object.clone(a),f=g.tagName.toUpperCase(),j,h;
        if(b[f]){
            Object.extend(d,b[f])
            }
            for(j in d){
            h=d[j];
            if(Object.isFunction(h)&&!(j in g)){
                g[j]=h.methodize()
                }
            }
        g._extendedByPrototype=Prototype.emptyFunction;
    return g
    },{
        refresh:function(){
            if(!Prototype.BrowserFeatures.ElementExtensions){
                Object.extend(a,Element.Methods);
                Object.extend(a,Element.Methods.Simulated)
                }
            }
    });
c.refresh();
return c
})();
Element.hasAttribute=function(a,b){
    if(a.hasAttribute){
        return a.hasAttribute(b)
        }
        return Element.Methods.Simulated.hasAttribute(a,b)
    };

Element.addMethods=function(c){
    var j=Prototype.BrowserFeatures,d=Element.Methods.ByTag;
    if(!c){
        Object.extend(Form,Form.Methods);
        Object.extend(Form.Element,Form.Element.Methods);
        Object.extend(Element.Methods.ByTag,{
            FORM:Object.clone(Form.Methods),
            INPUT:Object.clone(Form.Element.Methods),
            SELECT:Object.clone(Form.Element.Methods),
            TEXTAREA:Object.clone(Form.Element.Methods)
            })
        }
        if(arguments.length==2){
        var b=c;
        c=arguments[1]
        }
        if(!b){
        Object.extend(Element.Methods,c||{})
        }else{
        if(Object.isArray(b)){
            b.each(h)
            }else{
            h(b)
            }
        }
    function h(l){
    l=l.toUpperCase();
    if(!Element.Methods.ByTag[l]){
        Element.Methods.ByTag[l]={}
    }
    Object.extend(Element.Methods.ByTag[l],c)
    }
    function a(n,m,l){
    l=l||false;
    for(var p in n){
        var o=n[p];
        if(!Object.isFunction(o)){
            continue
        }
        if(!l||!(p in m)){
            m[p]=o.methodize()
            }
        }
    }
    function f(n){
    var l;
    var m={
        OPTGROUP:"OptGroup",
        TEXTAREA:"TextArea",
        P:"Paragraph",
        FIELDSET:"FieldSet",
        UL:"UList",
        OL:"OList",
        DL:"DList",
        DIR:"Directory",
        H1:"Heading",
        H2:"Heading",
        H3:"Heading",
        H4:"Heading",
        H5:"Heading",
        H6:"Heading",
        Q:"Quote",
        INS:"Mod",
        DEL:"Mod",
        A:"Anchor",
        IMG:"Image",
        CAPTION:"TableCaption",
        COL:"TableCol",
        COLGROUP:"TableCol",
        THEAD:"TableSection",
        TFOOT:"TableSection",
        TBODY:"TableSection",
        TR:"TableRow",
        TH:"TableCell",
        TD:"TableCell",
        FRAMESET:"FrameSet",
        IFRAME:"IFrame"
    };

    if(m[n]){
        l="HTML"+m[n]+"Element"
        }
        if(window[l]){
        return window[l]
        }
        l="HTML"+n+"Element";
    if(window[l]){
        return window[l]
        }
        l="HTML"+n.capitalize()+"Element";
    if(window[l]){
        return window[l]
        }
        window[l]={};

    window[l].prototype=document.createElement(n)["__proto__"];
    return window[l]
    }
    if(j.ElementExtensions){
    a(Element.Methods,HTMLElement.prototype);
    a(Element.Methods.Simulated,HTMLElement.prototype,true)
    }
    if(j.SpecificElementExtensions){
    for(var k in Element.Methods.ByTag){
        var g=f(k);
        if(Object.isUndefined(g)){
            continue
        }
        a(d[k],g.prototype)
        }
    }
    Object.extend(Element,Element.Methods);
delete Element.ByTag;
if(Element.extend.refresh){
    Element.extend.refresh()
    }
    Element.cache={}
};

document.viewport={
    getDimensions:function(){
        var a={},b=Prototype.Browser;
        $w("width height").each(function(f){
            var c=f.capitalize();
            if(b.WebKit&&!document.evaluate){
                a[f]=self["inner"+c]
                }else{
                if(b.Opera&&parseFloat(window.opera.version())<9.5){
                    a[f]=document.body["client"+c]
                    }else{
                    a[f]=document.documentElement["client"+c]
                    }
                }
        });
return a
},
getWidth:function(){
    return this.getDimensions().width
    },
getHeight:function(){
    return this.getDimensions().height
    },
getScrollOffsets:function(){
    return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)
    }
};

var Selector=Class.create({
    initialize:function(a){
        this.expression=a.strip();
        if(this.shouldUseSelectorsAPI()){
            this.mode="selectorsAPI"
            }else{
            if(this.shouldUseXPath()){
                this.mode="xpath";
                this.compileXPathMatcher()
                }else{
                this.mode="normal";
                this.compileMatcher()
                }
            }
    },
shouldUseXPath:function(){
    if(!Prototype.BrowserFeatures.XPath){
        return false
        }
        var a=this.expression;
    if(Prototype.Browser.WebKit&&(a.include("-of-type")||a.include(":empty"))){
        return false
        }
        if((/(\[[\w-]*?:|:checked)/).test(a)){
        return false
        }
        return true
    },
shouldUseSelectorsAPI:function(){
    if(!Prototype.BrowserFeatures.SelectorsAPI){
        return false
        }
        if(!Selector._div){
        Selector._div=new Element("div")
        }
        try{
        Selector._div.querySelector(this.expression)
        }catch(a){
        return false
        }
        return true
    },
compileMatcher:function(){
    var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m;
    if(Selector._cache[e]){
        this.matcher=Selector._cache[e];
        return
    }
    this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];
    while(e&&le!=e&&(/\S/).test(e)){
        le=e;
        for(var i in ps){
            p=ps[i];
            if(m=e.match(p)){
                this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m));
                e=e.replace(m[0],"");
                break
            }
        }
        }
        this.matcher.push("return h.unique(n);\n}");
eval(this.matcher.join("\n"));
Selector._cache[this.expression]=this.matcher
},
compileXPathMatcher:function(){
    var f=this.expression,g=Selector.patterns,b=Selector.xpath,d,a;
    if(Selector._cache[f]){
        this.xpath=Selector._cache[f];
        return
    }
    this.matcher=[".//*"];
    while(f&&d!=f&&(/\S/).test(f)){
        d=f;
        for(var c in g){
            if(a=f.match(g[c])){
                this.matcher.push(Object.isFunction(b[c])?b[c](a):new Template(b[c]).evaluate(a));
                f=f.replace(a[0],"");
                break
            }
        }
        }
        this.xpath=this.matcher.join("");
Selector._cache[this.expression]=this.xpath
},
findElements:function(a){
    a=a||document;
    var c=this.expression,b;
    switch(this.mode){
        case"selectorsAPI":
            if(a!==document){
            var d=a.id,f=$(a).identify();
            c="#"+f+" "+c
            }
            b=$A(a.querySelectorAll(c)).map(Element.extend);
            a.id=d;
            return b;
        case"xpath":
            return document._getElementsByXPath(this.xpath,a);
        default:
            return this.matcher(a)
            }
        },
match:function(j){
    this.tokens=[];
    var o=this.expression,a=Selector.patterns,f=Selector.assertions;
    var b,d,g;
    while(o&&b!==o&&(/\S/).test(o)){
        b=o;
        for(var k in a){
            d=a[k];
            if(g=o.match(d)){
                if(f[k]){
                    this.tokens.push([k,Object.clone(g)]);
                    o=o.replace(g[0],"")
                    }else{
                    return this.findElements(document).include(j)
                    }
                }
        }
        }
    var n=true,c,l;
for(var k=0,h;h=this.tokens[k];k++){
    c=h[0],l=h[1];
    if(!Selector.assertions[c](j,l)){
        n=false;
        break
    }
}
return n
},
toString:function(){
    return this.expression
    },
inspect:function(){
    return"#<Selector:"+this.expression.inspect()+">"
    }
});
Object.extend(Selector,{
    _cache:{},
    xpath:{
        descendant:"//*",
        child:"/*",
        adjacent:"/following-sibling::*[1]",
        laterSibling:"/following-sibling::*",
        tagName:function(a){
            if(a[1]=="*"){
                return""
                }
                return"[local-name()='"+a[1].toLowerCase()+"' or local-name()='"+a[1].toUpperCase()+"']"
            },
        className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",
        id:"[@id='#{1}']",
        attrPresence:function(a){
            a[1]=a[1].toLowerCase();
            return new Template("[@#{1}]").evaluate(a)
            },
        attr:function(a){
            a[1]=a[1].toLowerCase();
            a[3]=a[5]||a[6];
            return new Template(Selector.xpath.operators[a[2]]).evaluate(a)
            },
        pseudo:function(a){
            var b=Selector.xpath.pseudos[a[1]];
            if(!b){
                return""
                }
                if(Object.isFunction(b)){
                return b(a)
                }
                return new Template(Selector.xpath.pseudos[a[1]]).evaluate(a)
            },
        operators:{
            "=":"[@#{1}='#{3}']",
            "!=":"[@#{1}!='#{3}']",
            "^=":"[starts-with(@#{1}, '#{3}')]",
            "$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
            "*=":"[contains(@#{1}, '#{3}')]",
            "~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
            "|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
        },
        pseudos:{
            "first-child":"[not(preceding-sibling::*)]",
            "last-child":"[not(following-sibling::*)]",
            "only-child":"[not(preceding-sibling::* or following-sibling::*)]",
            empty:"[count(*) = 0 and (count(text()) = 0)]",
            checked:"[@checked]",
            disabled:"[(@disabled) and (@type!='hidden')]",
            enabled:"[not(@disabled) and (@type!='hidden')]",
            not:function(b){
                var j=b[6],h=Selector.patterns,a=Selector.xpath,f,c;
                var g=[];
                while(j&&f!=j&&(/\S/).test(j)){
                    f=j;
                    for(var d in h){
                        if(b=j.match(h[d])){
                            c=Object.isFunction(a[d])?a[d](b):new Template(a[d]).evaluate(b);
                            g.push("("+c.substring(1,c.length-1)+")");
                            j=j.replace(b[0],"");
                            break
                        }
                    }
                    }
                    return"[not("+g.join(" and ")+")]"
        },
    "nth-child":function(a){
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",a)
        },
    "nth-last-child":function(a){
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",a)
        },
    "nth-of-type":function(a){
        return Selector.xpath.pseudos.nth("position() ",a)
        },
    "nth-last-of-type":function(a){
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",a)
        },
    "first-of-type":function(a){
        a[6]="1";
        return Selector.xpath.pseudos["nth-of-type"](a)
        },
    "last-of-type":function(a){
        a[6]="1";
        return Selector.xpath.pseudos["nth-last-of-type"](a)
        },
    "only-of-type":function(a){
        var b=Selector.xpath.pseudos;
        return b["first-of-type"](a)+b["last-of-type"](a)
        },
    nth:function(h,f){
        var j,k=f[6],d;
        if(k=="even"){
            k="2n+0"
            }
            if(k=="odd"){
            k="2n+1"
            }
            if(j=k.match(/^(\d+)$/)){
            return"["+h+"= "+j[1]+"]"
            }
            if(j=k.match(/^(-?\d*)?n(([+-])(\d+))?/)){
            if(j[1]=="-"){
                j[1]=-1
                }
                var g=j[1]?Number(j[1]):1;
            var c=j[2]?Number(j[2]):0;
            d="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";
            return new Template(d).evaluate({
                fragment:h,
                a:g,
                b:c
            })
            }
        }
}
},
criteria:{
    tagName:'n = h.tagName(n, r, "#{1}", c);      c = false;',
    className:'n = h.className(n, r, "#{1}", c);    c = false;',
    id:'n = h.id(n, r, "#{1}", c);           c = false;',
    attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',
    attr:function(a){
        a[3]=(a[5]||a[6]);
        return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(a)
        },
    pseudo:function(a){
        if(a[6]){
            a[6]=a[6].replace(/"/g,'\\"')
            }
            return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(a)
        },
    descendant:'c = "descendant";',
    child:'c = "child";',
    adjacent:'c = "adjacent";',
    laterSibling:'c = "laterSibling";'
},
patterns:{
    laterSibling:/^\s*~\s*/,
    child:/^\s*>\s*/,
    adjacent:/^\s*\+\s*/,
    descendant:/^\s/,
    tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,
    id:/^#([\w\-\*]+)(\b|$)/,
    className:/^\.([\w\-\*]+)(\b|$)/,
    pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
    attrPresence:/^\[((?:[\w]+:)?[\w]+)\]/,
    attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
},
assertions:{
    tagName:function(a,b){
        return b[1].toUpperCase()==a.tagName.toUpperCase()
        },
    className:function(a,b){
        return Element.hasClassName(a,b[1])
        },
    id:function(a,b){
        return a.id===b[1]
        },
    attrPresence:function(a,b){
        return Element.hasAttribute(a,b[1])
        },
    attr:function(b,c){
        var a=Element.readAttribute(b,c[1]);
        return a&&Selector.operators[c[2]](a,c[5]||c[6])
        }
    },
handlers:{
    concat:function(d,c){
        for(var f=0,g;g=c[f];f++){
            d.push(g)
            }
            return d
        },
    mark:function(a){
        var d=Prototype.emptyFunction;
        for(var b=0,c;c=a[b];b++){
            c._countedByPrototype=d
            }
            return a
        },
    unmark:function(a){
        for(var b=0,c;c=a[b];b++){
            c._countedByPrototype=undefined
            }
            return a
        },
    index:function(a,d,h){
        a._countedByPrototype=Prototype.emptyFunction;
        if(d){
            for(var b=a.childNodes,f=b.length-1,c=1;f>=0;f--){
                var g=b[f];
                if(g.nodeType==1&&(!h||g._countedByPrototype)){
                    g.nodeIndex=c++
                }
            }
            }else{
    for(var f=0,c=1,b=a.childNodes;g=b[f];f++){
        if(g.nodeType==1&&(!h||g._countedByPrototype)){
            g.nodeIndex=c++
        }
    }
    }
},
unique:function(b){
    if(b.length==0){
        return b
        }
        var d=[],f;
    for(var c=0,a=b.length;c<a;c++){
        if(!(f=b[c])._countedByPrototype){
            f._countedByPrototype=Prototype.emptyFunction;
            d.push(Element.extend(f))
            }
        }
    return Selector.handlers.unmark(d)
},
descendant:function(a){
    var d=Selector.handlers;
    for(var c=0,b=[],f;f=a[c];c++){
        d.concat(b,f.getElementsByTagName("*"))
        }
        return b
    },
child:function(a){
    var f=Selector.handlers;
    for(var d=0,c=[],g;g=a[d];d++){
        for(var b=0,k;k=g.childNodes[b];b++){
            if(k.nodeType==1&&k.tagName!="!"){
                c.push(k)
                }
            }
        }
    return c
},
adjacent:function(a){
    for(var c=0,b=[],f;f=a[c];c++){
        var d=this.nextElementSibling(f);
        if(d){
            b.push(d)
            }
        }
    return b
},
laterSibling:function(a){
    var d=Selector.handlers;
    for(var c=0,b=[],f;f=a[c];c++){
        d.concat(b,Element.nextSiblings(f))
        }
        return b
    },
nextElementSibling:function(a){
    while(a=a.nextSibling){
        if(a.nodeType==1){
            return a
            }
        }
    return null
},
previousElementSibling:function(a){
    while(a=a.previousSibling){
        if(a.nodeType==1){
            return a
            }
        }
    return null
},
tagName:function(a,k,c,b){
    var l=c.toUpperCase();
    var f=[],j=Selector.handlers;
    if(a){
        if(b){
            if(b=="descendant"){
                for(var g=0,d;d=a[g];g++){
                    j.concat(f,d.getElementsByTagName(c))
                    }
                    return f
                }else{
                a=this[b](a)
                }
                if(c=="*"){
                return a
                }
            }
        for(var g=0,d;d=a[g];g++){
        if(d.tagName.toUpperCase()===l){
            f.push(d)
            }
        }
    return f
}else{
    return k.getElementsByTagName(c)
    }
},
id:function(b,a,k,g){
    var j=$(k),d=Selector.handlers;
    if(!j){
        return[]
        }
        if(!b&&a==document){
        return[j]
        }
        if(b){
        if(g){
            if(g=="child"){
                for(var c=0,f;f=b[c];c++){
                    if(j.parentNode==f){
                        return[j]
                        }
                    }
                }else{
        if(g=="descendant"){
            for(var c=0,f;f=b[c];c++){
                if(Element.descendantOf(j,f)){
                    return[j]
                    }
                }
            }else{
    if(g=="adjacent"){
        for(var c=0,f;f=b[c];c++){
            if(Selector.handlers.previousElementSibling(j)==f){
                return[j]
                }
            }
        }else{
    b=d[g](b)
    }
}
}
}
for(var c=0,f;f=b[c];c++){
    if(f==j){
        return[j]
        }
    }
return[]
}
return(j&&Element.descendantOf(j,a))?[j]:[]
},
className:function(b,a,c,d){
    if(b&&d){
        b=this[d](b)
        }
        return Selector.handlers.byClassName(b,a,c)
    },
byClassName:function(c,b,g){
    if(!c){
        c=Selector.handlers.descendant([b])
        }
        var j=" "+g+" ";
    for(var f=0,d=[],h,a;h=c[f];f++){
        a=h.className;
        if(a.length==0){
            continue
        }
        if(a==g||(" "+a+" ").include(j)){
            d.push(h)
            }
        }
    return d
},
attrPresence:function(c,b,a,h){
    if(!c){
        c=b.getElementsByTagName("*")
        }
        if(c&&h){
        c=this[h](c)
        }
        var f=[];
    for(var d=0,g;g=c[d];d++){
        if(Element.hasAttribute(g,a)){
            f.push(g)
            }
        }
    return f
},
attr:function(a,k,j,l,c,b){
    if(!a){
        a=k.getElementsByTagName("*")
        }
        if(a&&b){
        a=this[b](a)
        }
        var m=Selector.operators[c],g=[];
    for(var f=0,d;d=a[f];f++){
        var h=Element.readAttribute(d,j);
        if(h===null){
            continue
        }
        if(m(h,l)){
            g.push(d)
            }
        }
    return g
},
pseudo:function(b,c,f,a,d){
    if(b&&d){
        b=this[d](b)
        }
        if(!b){
        b=a.getElementsByTagName("*")
        }
        return Selector.pseudos[c](b,f,a)
    }
},
pseudos:{
    "first-child":function(b,g,a){
        for(var d=0,c=[],f;f=b[d];d++){
            if(Selector.handlers.previousElementSibling(f)){
                continue
            }
            c.push(f)
            }
            return c
        },
    "last-child":function(b,g,a){
        for(var d=0,c=[],f;f=b[d];d++){
            if(Selector.handlers.nextElementSibling(f)){
                continue
            }
            c.push(f)
            }
            return c
        },
    "only-child":function(b,j,a){
        var f=Selector.handlers;
        for(var d=0,c=[],g;g=b[d];d++){
            if(!f.previousElementSibling(g)&&!f.nextElementSibling(g)){
                c.push(g)
                }
            }
        return c
    },
"nth-child":function(b,c,a){
    return Selector.pseudos.nth(b,c,a)
    },
"nth-last-child":function(b,c,a){
    return Selector.pseudos.nth(b,c,a,true)
    },
"nth-of-type":function(b,c,a){
    return Selector.pseudos.nth(b,c,a,false,true)
    },
"nth-last-of-type":function(b,c,a){
    return Selector.pseudos.nth(b,c,a,true,true)
    },
"first-of-type":function(b,c,a){
    return Selector.pseudos.nth(b,"1",a,false,true)
    },
"last-of-type":function(b,c,a){
    return Selector.pseudos.nth(b,"1",a,true,true)
    },
"only-of-type":function(b,d,a){
    var c=Selector.pseudos;
    return c["last-of-type"](c["first-of-type"](b,d,a),d,a)
    },
getIndices:function(d,c,f){
    if(d==0){
        return c>0?[c]:[]
        }
        return $R(1,f).inject([],function(a,b){
        if(0==(b-c)%d&&(b-c)/d>=0){
            a.push(b)
            }
            return a
        })
    },
nth:function(c,t,v,s,f){
    if(c.length==0){
        return[]
        }
        if(t=="even"){
        t="2n+0"
        }
        if(t=="odd"){
        t="2n+1"
        }
        var r=Selector.handlers,q=[],d=[],k;
    r.mark(c);
    for(var p=0,g;g=c[p];p++){
        if(!g.parentNode._countedByPrototype){
            r.index(g.parentNode,s,f);
            d.push(g.parentNode)
            }
        }
    if(t.match(/^\d+$/)){
    t=Number(t);
    for(var p=0,g;g=c[p];p++){
        if(g.nodeIndex==t){
            q.push(g)
            }
        }
    }else{
    if(k=t.match(/^(-?\d*)?n(([+-])(\d+))?/)){
        if(k[1]=="-"){
            k[1]=-1
            }
            var w=k[1]?Number(k[1]):1;
        var u=k[2]?Number(k[2]):0;
        var x=Selector.pseudos.getIndices(w,u,c.length);
        for(var p=0,g,n=x.length;g=c[p];p++){
            for(var o=0;o<n;o++){
                if(g.nodeIndex==x[o]){
                    q.push(g)
                    }
                }
            }
        }
}
r.unmark(c);
r.unmark(d);
return q
},
empty:function(b,g,a){
    for(var d=0,c=[],f;f=b[d];d++){
        if(f.tagName=="!"||f.firstChild){
            continue
        }
        c.push(f)
        }
        return c
    },
not:function(a,d,l){
    var j=Selector.handlers,n,c;
    var k=new Selector(d).findElements(l);
    j.mark(k);
    for(var g=0,f=[],b;b=a[g];g++){
        if(!b._countedByPrototype){
            f.push(b)
            }
        }
    j.unmark(k);
return f
},
enabled:function(b,g,a){
    for(var d=0,c=[],f;f=b[d];d++){
        if(!f.disabled&&(!f.type||f.type!=="hidden")){
            c.push(f)
            }
        }
    return c
},
disabled:function(b,g,a){
    for(var d=0,c=[],f;f=b[d];d++){
        if(f.disabled){
            c.push(f)
            }
        }
    return c
},
checked:function(b,g,a){
    for(var d=0,c=[],f;f=b[d];d++){
        if(f.checked){
            c.push(f)
            }
        }
    return c
}
},
operators:{
    "=":function(b,a){
        return b==a
        },
    "!=":function(b,a){
        return b!=a
        },
    "^=":function(b,a){
        return b==a||b&&b.startsWith(a)
        },
    "$=":function(b,a){
        return b==a||b&&b.endsWith(a)
        },
    "*=":function(b,a){
        return b==a||b&&b.include(a)
        },
    "$=":function(b,a){
        return b.endsWith(a)
        },
    "*=":function(b,a){
        return b.include(a)
        },
    "~=":function(b,a){
        return(" "+b+" ").include(" "+a+" ")
        },
    "|=":function(b,a){
        return("-"+(b||"").toUpperCase()+"-").include("-"+(a||"").toUpperCase()+"-")
        }
    },
split:function(b){
    var a=[];
    b.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(c){
        a.push(c[1].strip())
        });
    return a
    },
matchElements:function(g,j){
    var f=$$(j),d=Selector.handlers;
    d.mark(f);
    for(var c=0,b=[],a;a=g[c];c++){
        if(a._countedByPrototype){
            b.push(a)
            }
        }
    d.unmark(f);
return b
},
findElement:function(b,c,a){
    if(Object.isNumber(c)){
        a=c;
        c=false
        }
        return Selector.matchElements(b,c||"*")[a||0]
    },
findChildElements:function(f,j){
    j=Selector.split(j.join(","));
    var d=[],g=Selector.handlers;
    for(var c=0,b=j.length,a;c<b;c++){
        a=new Selector(j[c].strip());
        g.concat(d,a.findElements(f))
        }
        return(b>1)?g.unique(d):d
    }
});
if(Prototype.Browser.IE){
    Object.extend(Selector.handlers,{
        concat:function(d,c){
            for(var f=0,g;g=c[f];f++){
                if(g.tagName!=="!"){
                    d.push(g)
                    }
                }
            return d
        },
    unmark:function(a){
        for(var b=0,c;c=a[b];b++){
            c.removeAttribute("_countedByPrototype")
            }
            return a
        }
    })
}
function $$(){
    return Selector.findChildElements(document,$A(arguments))
    }
    var Form={
    reset:function(a){
        $(a).reset();
        return a
        },
    serializeElements:function(h,b){
        if(typeof b!="object"){
            b={
                hash:!!b
                }
            }else{
        if(Object.isUndefined(b.hash)){
            b.hash=true
            }
        }
    var c,g,a=false,f=b.submit;
var d=h.inject({},function(j,k){
    if(!k.disabled&&k.name){
        c=k.name;
        g=$(k).getValue();
        if(g!=null&&k.type!="file"&&(k.type!="submit"||(!a&&f!==false&&(!f||c==f)&&(a=true)))){
            if(c in j){
                if(!Object.isArray(j[c])){
                    j[c]=[j[c]]
                    }
                    j[c].push(g)
                }else{
                j[c]=g
                }
            }
    }
return j
});
return b.hash?d:Object.toQueryString(d)
}
};

Form.Methods={
    serialize:function(b,a){
        return Form.serializeElements(Form.getElements(b),a)
        },
    getElements:function(a){
        return $A($(a).getElementsByTagName("*")).inject([],function(b,c){
            if(Form.Element.Serializers[c.tagName.toLowerCase()]){
                b.push(Element.extend(c))
                }
                return b
            })
        },
    getInputs:function(h,c,d){
        h=$(h);
        var a=h.getElementsByTagName("input");
        if(!c&&!d){
            return $A(a).map(Element.extend)
            }
            for(var f=0,j=[],g=a.length;f<g;f++){
            var b=a[f];
            if((c&&b.type!=c)||(d&&b.name!=d)){
                continue
            }
            j.push(Element.extend(b))
            }
            return j
        },
    disable:function(a){
        a=$(a);
        Form.getElements(a).invoke("disable");
        return a
        },
    enable:function(a){
        a=$(a);
        Form.getElements(a).invoke("enable");
        return a
        },
    findFirstElement:function(b){
        var c=$(b).getElements().findAll(function(d){
            return"hidden"!=d.type&&!d.disabled
            });
        var a=c.findAll(function(d){
            return d.hasAttribute("tabIndex")&&d.tabIndex>=0
            }).sortBy(function(d){
            return d.tabIndex
            }).first();
        return a?a:c.find(function(d){
            return["input","select","textarea"].include(d.tagName.toLowerCase())
            })
        },
    focusFirstElement:function(a){
        a=$(a);
        a.findFirstElement().activate();
        return a
        },
    request:function(b,a){
        b=$(b),a=Object.clone(a||{});
        var d=a.parameters,c=b.readAttribute("action")||"";
        if(c.blank()){
            c=window.location.href
            }
            a.parameters=b.serialize(true);
        if(d){
            if(Object.isString(d)){
                d=d.toQueryParams()
                }
                Object.extend(a.parameters,d)
            }
            if(b.hasAttribute("method")&&!a.method){
            a.method=b.method
            }
            return new Ajax.Request(c,a)
        }
    };

Form.Element={
    focus:function(a){
        $(a).focus();
        return a
        },
    select:function(a){
        $(a).select();
        return a
        }
    };

Form.Element.Methods={
    serialize:function(a){
        a=$(a);
        if(!a.disabled&&a.name){
            var b=a.getValue();
            if(b!=undefined){
                var c={};

                c[a.name]=b;
                return Object.toQueryString(c)
                }
            }
        return""
    },
getValue:function(a){
    a=$(a);
    var b=a.tagName.toLowerCase();
    return Form.Element.Serializers[b](a)
    },
setValue:function(a,b){
    a=$(a);
    var c=a.tagName.toLowerCase();
    Form.Element.Serializers[c](a,b);
    return a
    },
clear:function(a){
    $(a).value="";
    return a
    },
present:function(a){
    return $(a).value!=""
    },
activate:function(a){
    a=$(a);
    try{
        a.focus();
        if(a.select&&(a.tagName.toLowerCase()!="input"||!["button","reset","submit"].include(a.type))){
            a.select()
            }
        }catch(b){}
    return a
    },
disable:function(a){
    a=$(a);
    a.disabled=true;
    return a
    },
enable:function(a){
    a=$(a);
    a.disabled=false;
    return a
    }
};

var Field=Form.Element;
var $F=Form.Element.Methods.getValue;
Form.Element.Serializers={
    input:function(a,b){
        switch(a.type.toLowerCase()){
            case"checkbox":case"radio":
                return Form.Element.Serializers.inputSelector(a,b);
            default:
                return Form.Element.Serializers.textarea(a,b)
                }
            },
inputSelector:function(a,b){
    if(Object.isUndefined(b)){
        return a.checked?a.value:null
        }else{
        a.checked=!!b
        }
    },
textarea:function(a,b){
    if(Object.isUndefined(b)){
        return a.value
        }else{
        a.value=b
        }
    },
select:function(c,g){
    if(Object.isUndefined(g)){
        return this[c.type=="select-one"?"selectOne":"selectMany"](c)
        }else{
        var b,d,h=!Object.isArray(g);
        for(var a=0,f=c.length;a<f;a++){
            b=c.options[a];
            d=this.optionValue(b);
            if(h){
                if(d==g){
                    b.selected=true;
                    return
                }
            }else{
            b.selected=g.include(d)
            }
        }
    }
},
selectOne:function(b){
    var a=b.selectedIndex;
    return a>=0?this.optionValue(b.options[a]):null
    },
selectMany:function(d){
    var a,f=d.length;
    if(!f){
        return null
        }
        for(var c=0,a=[];c<f;c++){
        var b=d.options[c];
        if(b.selected){
            a.push(this.optionValue(b))
            }
        }
    return a
},
optionValue:function(a){
    return Element.extend(a).hasAttribute("value")?a.value:a.text
    }
};

Abstract.TimedObserver=Class.create(PeriodicalExecuter,{
    initialize:function($super,a,b,c){
        $super(c,b);
        this.element=$(a);
        this.lastValue=this.getValue()
        },
    execute:function(){
        var a=this.getValue();
        if(Object.isString(this.lastValue)&&Object.isString(a)?this.lastValue!=a:String(this.lastValue)!=String(a)){
            this.callback(this.element,a);
            this.lastValue=a
            }
        }
});
Form.Element.Observer=Class.create(Abstract.TimedObserver,{
    getValue:function(){
        return Form.Element.getValue(this.element)
        }
    });
Form.Observer=Class.create(Abstract.TimedObserver,{
    getValue:function(){
        return Form.serialize(this.element)
        }
    });
Abstract.EventObserver=Class.create({
    initialize:function(a,b){
        this.element=$(a);
        this.callback=b;
        this.lastValue=this.getValue();
        if(this.element.tagName.toLowerCase()=="form"){
            this.registerFormCallbacks()
            }else{
            this.registerCallback(this.element)
            }
        },
onElementEvent:function(){
    var a=this.getValue();
    if(this.lastValue!=a){
        this.callback(this.element,a);
        this.lastValue=a
        }
    },
registerFormCallbacks:function(){
    Form.getElements(this.element).each(this.registerCallback,this)
    },
registerCallback:function(a){
    if(a.type){
        switch(a.type.toLowerCase()){
            case"checkbox":case"radio":
                Event.observe(a,"click",this.onElementEvent.bind(this));
                break;
            default:
                Event.observe(a,"change",this.onElementEvent.bind(this));
                break
                }
            }
}
});
Form.Element.EventObserver=Class.create(Abstract.EventObserver,{
    getValue:function(){
        return Form.Element.getValue(this.element)
        }
    });
Form.EventObserver=Class.create(Abstract.EventObserver,{
    getValue:function(){
        return Form.serialize(this.element)
        }
    });
if(!window.Event){
    var Event={}
}
Object.extend(Event,{
    KEY_BACKSPACE:8,
    KEY_TAB:9,
    KEY_RETURN:13,
    KEY_ESC:27,
    KEY_LEFT:37,
    KEY_UP:38,
    KEY_RIGHT:39,
    KEY_DOWN:40,
    KEY_DELETE:46,
    KEY_HOME:36,
    KEY_END:35,
    KEY_PAGEUP:33,
    KEY_PAGEDOWN:34,
    KEY_INSERT:45,
    cache:{},
    relatedTarget:function(b){
        var a;
        switch(b.type){
            case"mouseover":
                a=b.fromElement;
                break;
            case"mouseout":
                a=b.toElement;
                break;
            default:
                return null
                }
                return Element.extend(a)
        }
    });
Event.Methods=(function(){
    var a;
    if(Prototype.Browser.IE){
        var b={
            0:1,
            1:4,
            2:2
        };

        a=function(d,c){
            return d.button==b[c]
            }
        }else{
    if(Prototype.Browser.WebKit){
        a=function(d,c){
            switch(c){
                case 0:
                    return d.which==1&&!d.metaKey;
                case 1:
                    return d.which==1&&d.metaKey;
                default:
                    return false
                    }
                }
    }else{
    a=function(d,c){
        return d.which?(d.which===c+1):(d.button===c)
        }
    }
}
return{
    isLeftClick:function(c){
        return a(c,0)
        },
    isMiddleClick:function(c){
        return a(c,1)
        },
    isRightClick:function(c){
        return a(c,2)
        },
    element:function(f){
        f=Event.extend(f);
        var d=f.target,c=f.type,g=f.currentTarget;
        if(g&&g.tagName){
            if(c==="load"||c==="error"||(c==="click"&&g.tagName.toLowerCase()==="input"&&g.type==="radio")){
                d=g
                }
            }
        if(d.nodeType==Node.TEXT_NODE){
        d=d.parentNode
        }
        return Element.extend(d)
    },
findElement:function(d,g){
    var c=Event.element(d);
    if(!g){
        return c
        }
        var f=[c].concat(c.ancestors());
    return Selector.findElement(f,g,0)
    },
pointer:function(f){
    var d=document.documentElement,c=document.body||{
        scrollLeft:0,
        scrollTop:0
    };

    return{
        x:f.pageX||(f.clientX+(d.scrollLeft||c.scrollLeft)-(d.clientLeft||0)),
        y:f.pageY||(f.clientY+(d.scrollTop||c.scrollTop)-(d.clientTop||0))
        }
    },
pointerX:function(c){
    return Event.pointer(c).x
    },
pointerY:function(c){
    return Event.pointer(c).y
    },
stop:function(c){
    Event.extend(c);
    c.preventDefault();
    c.stopPropagation();
    c.stopped=true
    }
}
})();
Event.extend=(function(){
    var a=Object.keys(Event.Methods).inject({},function(b,c){
        b[c]=Event.Methods[c].methodize();
        return b
        });
    if(Prototype.Browser.IE){
        Object.extend(a,{
            stopPropagation:function(){
                this.cancelBubble=true
                },
            preventDefault:function(){
                this.returnValue=false
                },
            inspect:function(){
                return"[object Event]"
                }
            });
    return function(b){
        if(!b){
            return false
            }
            if(b._extendedByPrototype){
            return b
            }
            b._extendedByPrototype=Prototype.emptyFunction;
        var c=Event.pointer(b);
        Object.extend(b,{
            target:b.srcElement,
            relatedTarget:Event.relatedTarget(b),
            pageX:c.x,
            pageY:c.y
            });
        return Object.extend(b,a)
        }
    }else{
    Event.prototype=Event.prototype||document.createEvent("HTMLEvents")["__proto__"];
    Object.extend(Event.prototype,a);
    return Prototype.K
    }
})();
Object.extend(Event,(function(){
    var b=Event.cache;
    function c(l){
        if(l._prototypeEventID){
            return l._prototypeEventID[0]
            }
            arguments.callee.id=arguments.callee.id||1;
        return l._prototypeEventID=[++arguments.callee.id]
        }
        function h(l){
        if(l&&l.include(":")){
            return"dataavailable"
            }
            return l
        }
        function a(l){
        return b[l]=b[l]||{}
    }
    function g(n,l){
    var m=a(n);
    return m[l]=m[l]||[]
    }
    function j(m,l,n){
    var q=c(m);
    var p=g(q,l);
    if(p.pluck("handler").include(n)){
        return false
        }
        var o=function(r){
        if(!Event||!Event.extend||(r.eventName&&r.eventName!=l)){
            return false
            }
            Event.extend(r);
        n.call(m,r)
        };

    o.handler=n;
    p.push(o);
    return o
    }
    function k(o,l,m){
    var n=g(o,l);
    return n.find(function(p){
        return p.handler==m
        })
    }
    function d(o,l,m){
    var n=a(o);
    if(!n[l]){
        return false
        }
        n[l]=n[l].without(k(o,l,m))
    }
    function f(){
    for(var m in b){
        for(var l in b[m]){
            b[m][l]=null
            }
        }
        }
    if(window.attachEvent){
    window.attachEvent("onunload",f)
    }
    if(Prototype.Browser.WebKit){
    window.addEventListener("unload",Prototype.emptyFunction,false)
    }
    return{
    observe:function(n,l,o){
        n=$(n);
        var m=h(l);
        var p=j(n,l,o);
        if(!p){
            return n
            }
            if(n.addEventListener){
            n.addEventListener(m,p,false)
            }else{
            n.attachEvent("on"+m,p)
            }
            return n
        },
    stopObserving:function(n,l,o){
        n=$(n);
        var q=c(n),m=h(l);
        if(!o&&l){
            g(q,l).each(function(r){
                n.stopObserving(l,r.handler)
                });
            return n
            }else{
            if(!l){
                Object.keys(a(q)).each(function(r){
                    n.stopObserving(r)
                    });
                return n
                }
            }
        var p=k(q,l,o);
    if(!p){
        return n
        }
        if(n.removeEventListener){
        n.removeEventListener(m,p,false)
        }else{
        n.detachEvent("on"+m,p)
        }
        d(q,l,o);
    return n
    },
fire:function(n,m,l){
    n=$(n);
    if(n==document&&document.createEvent&&!n.dispatchEvent){
        n=document.documentElement
        }
        var o;
    if(document.createEvent){
        o=document.createEvent("HTMLEvents");
        o.initEvent("dataavailable",true,true)
        }else{
        o=document.createEventObject();
        o.eventType="ondataavailable"
        }
        o.eventName=m;
    o.memo=l||{};

    if(document.createEvent){
        n.dispatchEvent(o)
        }else{
        n.fireEvent(o.eventType,o)
        }
        return Event.extend(o)
    }
}
})());
Object.extend(Event,Event.Methods);
Element.addMethods({
    fire:Event.fire,
    observe:Event.observe,
    stopObserving:Event.stopObserving
    });
Object.extend(document,{
    fire:Element.Methods.fire.methodize(),
    observe:Element.Methods.observe.methodize(),
    stopObserving:Element.Methods.stopObserving.methodize(),
    loaded:false
});
(function(){
    var b;
    function a(){
        if(document.loaded){
            return
        }
        if(b){
            window.clearInterval(b)
            }
            document.fire("dom:loaded");
        document.loaded=true
        }
        if(document.addEventListener){
        if(Prototype.Browser.WebKit){
            b=window.setInterval(function(){
                if(/loaded|complete/.test(document.readyState)){
                    a()
                    }
                },0);
        Event.observe(window,"load",a)
        }else{
        document.addEventListener("DOMContentLoaded",a,false)
        }
    }else{
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
    $("__onDOMContentLoaded").onreadystatechange=function(){
        if(this.readyState=="complete"){
            this.onreadystatechange=null;
            a()
            }
        }
}
})();
Hash.toQueryString=Object.toQueryString;
var Toggle={
    display:Element.toggle
    };

Element.Methods.childOf=Element.Methods.descendantOf;
var Insertion={
    Before:function(a,b){
        return Element.insert(a,{
            before:b
        })
        },
    Top:function(a,b){
        return Element.insert(a,{
            top:b
        })
        },
    Bottom:function(a,b){
        return Element.insert(a,{
            bottom:b
        })
        },
    After:function(a,b){
        return Element.insert(a,{
            after:b
        })
        }
    };

var $continue=new Error('"throw $continue" is deprecated, use "return" instead');
var Position={
    includeScrollOffsets:false,
    prepare:function(){
        this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;
        this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0
        },
    within:function(b,a,c){
        if(this.includeScrollOffsets){
            return this.withinIncludingScrolloffsets(b,a,c)
            }
            this.xcomp=a;
        this.ycomp=c;
        this.offset=Element.cumulativeOffset(b);
        return(c>=this.offset[1]&&c<this.offset[1]+b.offsetHeight&&a>=this.offset[0]&&a<this.offset[0]+b.offsetWidth)
        },
    withinIncludingScrolloffsets:function(b,a,d){
        var c=Element.cumulativeScrollOffset(b);
        this.xcomp=a+c[0]-this.deltaX;
        this.ycomp=d+c[1]-this.deltaY;
        this.offset=Element.cumulativeOffset(b);
        return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+b.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+b.offsetWidth)
        },
    overlap:function(b,a){
        if(!b){
            return 0
            }
            if(b=="vertical"){
            return((this.offset[1]+a.offsetHeight)-this.ycomp)/a.offsetHeight
            }
            if(b=="horizontal"){
            return((this.offset[0]+a.offsetWidth)-this.xcomp)/a.offsetWidth
            }
        },
cumulativeOffset:Element.Methods.cumulativeOffset,
positionedOffset:Element.Methods.positionedOffset,
absolutize:function(a){
    Position.prepare();
    return Element.absolutize(a)
    },
relativize:function(a){
    Position.prepare();
    return Element.relativize(a)
    },
realOffset:Element.Methods.cumulativeScrollOffset,
offsetParent:Element.Methods.getOffsetParent,
page:Element.Methods.viewportOffset,
clone:function(b,c,a){
    a=a||{};

    return Element.clonePosition(c,b,a)
    }
};

if(!document.getElementsByClassName){
    document.getElementsByClassName=function(b){
        function a(c){
            return c.blank()?null:"[contains(concat(' ', @class, ' '), ' "+c+" ')]"
            }
            b.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(c,f){
            f=f.toString().strip();
            var d=/\s/.test(f)?$w(f).map(a).join(""):a(f);
            return d?document._getElementsByXPath(".//*"+d,c):[]
            }:function(f,g){
            g=g.toString().strip();
            var h=[],j=(/\s/.test(g)?$w(g):null);
            if(!j&&!g){
                return h
                }
                var c=$(f).getElementsByTagName("*");
            g=" "+g+" ";
            for(var d=0,l,k;l=c[d];d++){
                if(l.className&&(k=" "+l.className+" ")&&(k.include(g)||(j&&j.all(function(m){
                    return !m.toString().blank()&&k.include(" "+m+" ")
                    })))){
                    h.push(Element.extend(l))
                    }
                }
            return h
        };

    return function(d,c){
        return $(c||document.body).getElementsByClassName(d)
        }
    }(Element.Methods)
}
Element.ClassNames=Class.create();
Element.ClassNames.prototype={
    initialize:function(a){
        this.element=$(a)
        },
    _each:function(a){
        this.element.className.split(/\s+/).select(function(b){
            return b.length>0
            })._each(a)
        },
    set:function(a){
        this.element.className=a
        },
    add:function(a){
        if(this.include(a)){
            return
        }
        this.set($A(this).concat(a).join(" "))
        },
    remove:function(a){
        if(!this.include(a)){
            return
        }
        this.set($A(this).without(a).join(" "))
        },
    toString:function(){
        return $A(this).join(" ")
        }
    };

Object.extend(Element.ClassNames.prototype,Enumerable);
Element.addMethods();
var Builder={
    NODEMAP:{
        AREA:"map",
        CAPTION:"table",
        COL:"table",
        COLGROUP:"table",
        LEGEND:"fieldset",
        OPTGROUP:"select",
        OPTION:"select",
        PARAM:"object",
        TBODY:"table",
        TD:"table",
        TFOOT:"table",
        TH:"table",
        THEAD:"table",
        TR:"table"
    },
    node:function(a){
        a=a.toUpperCase();
        var g=this.NODEMAP[a]||"div";
        var b=document.createElement(g);
        try{
            b.innerHTML="<"+a+"></"+a+">"
            }catch(f){}
        var d=b.firstChild||null;
        if(d&&(d.tagName.toUpperCase()!=a)){
            d=d.getElementsByTagName(a)[0]
            }
            if(!d){
            d=document.createElement(a)
            }
            if(!d){
            return
        }
        if(arguments[1]){
            if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)||arguments[1].tagName){
                this._children(d,arguments[1])
                }else{
                var c=this._attributes(arguments[1]);
                if(c.length){
                    try{
                        b.innerHTML="<"+a+" "+c+"></"+a+">"
                        }catch(f){}
                    d=b.firstChild||null;
                    if(!d){
                        d=document.createElement(a);
                        for(attr in arguments[1]){
                            d[attr=="class"?"className":attr]=arguments[1][attr]
                            }
                        }
                        if(d.tagName.toUpperCase()!=a){
                    d=b.getElementsByTagName(a)[0]
                    }
                }
        }
}
if(arguments[2]){
    this._children(d,arguments[2])
    }
    return $(d)
},
_text:function(a){
    return document.createTextNode(a)
    },
ATTR_MAP:{
    className:"class",
    htmlFor:"for"
},
_attributes:function(a){
    var b=[];
    for(attribute in a){
        b.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+'="'+a[attribute].toString().escapeHTML().gsub(/"/,"&quot;")+'"')
        }
        return b.join(" ")
    },
_children:function(b,a){
    if(a.tagName){
        b.appendChild(a);
        return
    }
    if(typeof a=="object"){
        a.flatten().each(function(c){
            if(typeof c=="object"){
                b.appendChild(c)
                }else{
                if(Builder._isStringOrNumber(c)){
                    b.appendChild(Builder._text(c))
                    }
                }
        })
}else{
    if(Builder._isStringOrNumber(a)){
        b.appendChild(Builder._text(a))
        }
    }
},
_isStringOrNumber:function(a){
    return(typeof a=="string"||typeof a=="number")
    },
build:function(b){
    var a=this.node("div");
    $(a).update(b.strip());
    return a.down()
    },
dump:function(b){
    if(typeof b!="object"&&typeof b!="function"){
        b=window
        }
        var a=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
    a.each(function(c){
        b[c]=function(){
            return Builder.node.apply(Builder,[c].concat($A(arguments)))
            }
        })
}
};

String.prototype.parseColor=function(){
    var a="#";
    if(this.slice(0,4)=="rgb("){
        var c=this.slice(4,this.length-1).split(",");
        var b=0;
        do{
            a+=parseInt(c[b]).toColorPart()
            }while(++b<3)
    }else{
        if(this.slice(0,1)=="#"){
            if(this.length==4){
                for(var b=1;b<4;b++){
                    a+=(this.charAt(b)+this.charAt(b)).toLowerCase()
                    }
                }
                if(this.length==7){
            a=this.toLowerCase()
            }
        }
}
return(a.length==7?a:(arguments[0]||this))
};

Element.collectTextNodes=function(a){
    return $A($(a).childNodes).collect(function(b){
        return(b.nodeType==3?b.nodeValue:(b.hasChildNodes()?Element.collectTextNodes(b):""))
        }).flatten().join("")
    };

Element.collectTextNodesIgnoreClass=function(a,b){
    return $A($(a).childNodes).collect(function(c){
        return(c.nodeType==3?c.nodeValue:((c.hasChildNodes()&&!Element.hasClassName(c,b))?Element.collectTextNodesIgnoreClass(c,b):""))
        }).flatten().join("")
    };

Element.setContentZoom=function(a,b){
    a=$(a);
    a.setStyle({
        fontSize:(b/100)+"em"
        });
    if(Prototype.Browser.WebKit){
        window.scrollBy(0,0)
        }
        return a
    };

Element.getInlineOpacity=function(a){
    return $(a).style.opacity||""
    };

Element.forceRerendering=function(a){
    try{
        a=$(a);
        var c=document.createTextNode(" ");
        a.appendChild(c);
        a.removeChild(c)
        }catch(b){}
};

var Effect={
    _elementDoesNotExistError:{
        name:"ElementDoesNotExistError",
        message:"The specified DOM element does not exist, but is required for this effect to operate"
    },
    Transitions:{
        linear:Prototype.K,
        sinoidal:function(a){
            return(-Math.cos(a*Math.PI)/2)+0.5
            },
        reverse:function(a){
            return 1-a
            },
        flicker:function(a){
            var a=((-Math.cos(a*Math.PI)/4)+0.75)+Math.random()/4;
            return a>1?1:a
            },
        wobble:function(a){
            return(-Math.cos(a*Math.PI*(9*a))/2)+0.5
            },
        pulse:function(b,a){
            return(-Math.cos((b*((a||5)-0.5)*2)*Math.PI)/2)+0.5
            },
        spring:function(a){
            return 1-(Math.cos(a*4.5*Math.PI)*Math.exp(-a*6))
            },
        none:function(a){
            return 0
            },
        full:function(a){
            return 1
            }
        },
DefaultOptions:{
    duration:1,
    fps:100,
    sync:false,
    from:0,
    to:1,
    delay:0,
    queue:"parallel"
},
tagifyText:function(a){
    var b="position:relative";
    if(Prototype.Browser.IE){
        b+=";zoom:1"
        }
        a=$(a);
    $A(a.childNodes).each(function(c){
        if(c.nodeType==3){
            c.nodeValue.toArray().each(function(d){
                a.insertBefore(new Element("span",{
                    style:b
                }).update(d==" "?String.fromCharCode(160):d),c)
                });
            Element.remove(c)
            }
        })
},
multiple:function(b,c){
    var f;
    if(((typeof b=="object")||Object.isFunction(b))&&(b.length)){
        f=b
        }else{
        f=$(b).childNodes
        }
        var a=Object.extend({
        speed:0.1,
        delay:0
    },arguments[2]||{});
    var d=a.delay;
    $A(f).each(function(h,g){
        new c(h,Object.extend(a,{
            delay:g*a.speed+d
            }))
        })
    },
PAIRS:{
    slide:["SlideDown","SlideUp"],
    blind:["BlindDown","BlindUp"],
    appear:["Appear","Fade"]
    },
toggle:function(b,c){
    b=$(b);
    c=(c||"appear").toLowerCase();
    var a=Object.extend({
        queue:{
            position:"end",
            scope:(b.id||"global"),
            limit:1
        }
    },arguments[2]||{});
Effect[b.visible()?Effect.PAIRS[c][1]:Effect.PAIRS[c][0]](b,a)
}
};

Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;
Effect.ScopedQueue=Class.create(Enumerable,{
    initialize:function(){
        this.effects=[];
        this.interval=null
        },
    _each:function(a){
        this.effects._each(a)
        },
    add:function(b){
        var c=new Date().getTime();
        var a=Object.isString(b.options.queue)?b.options.queue:b.options.queue.position;
        switch(a){
            case"front":
                this.effects.findAll(function(d){
                return d.state=="idle"
                }).each(function(d){
                d.startOn+=b.finishOn;
                d.finishOn+=b.finishOn
                });
            break;
            case"with-last":
                c=this.effects.pluck("startOn").max()||c;
                break;
            case"end":
                c=this.effects.pluck("finishOn").max()||c;
                break
                }
                b.startOn+=c;
        b.finishOn+=c;
        if(!b.options.queue.limit||(this.effects.length<b.options.queue.limit)){
            this.effects.push(b)
            }
            if(!this.interval){
            this.interval=setInterval(this.loop.bind(this),15)
            }
        },
remove:function(a){
    this.effects=this.effects.reject(function(b){
        return b==a
        });
    if(this.effects.length==0){
        clearInterval(this.interval);
        this.interval=null
        }
    },
loop:function(){
    var c=new Date().getTime();
    for(var b=0,a=this.effects.length;b<a;b++){
        this.effects[b]&&this.effects[b].loop(c)
        }
    }
});
Effect.Queues={
    instances:$H(),
    get:function(a){
        if(!Object.isString(a)){
            return a
            }
            return this.instances.get(a)||this.instances.set(a,new Effect.ScopedQueue())
        }
    };

Effect.Queue=Effect.Queues.get("global");
Effect.Base=Class.create({
    position:null,
    start:function(a){
        function b(d,c){
            return((d[c+"Internal"]?"this.options."+c+"Internal(this);":"")+(d[c]?"this.options."+c+"(this);":""))
            }
            if(a&&a.transition===false){
            a.transition=Effect.Transitions.linear
            }
            this.options=Object.extend(Object.extend({},Effect.DefaultOptions),a||{});
        this.currentFrame=0;
        this.state="idle";
        this.startOn=this.options.delay*1000;
        this.finishOn=this.startOn+(this.options.duration*1000);
        this.fromToDelta=this.options.to-this.options.from;
        this.totalTime=this.finishOn-this.startOn;
        this.totalFrames=this.options.fps*this.options.duration;
        this.render=(function(){
            function c(f,d){
                if(f.options[d+"Internal"]){
                    f.options[d+"Internal"](f)
                    }
                    if(f.options[d]){
                    f.options[d](f)
                    }
                }
            return function(d){
            if(this.state==="idle"){
                this.state="running";
                c(this,"beforeSetup");
                if(this.setup){
                    this.setup()
                    }
                    c(this,"afterSetup")
                }
                if(this.state==="running"){
                d=(this.options.transition(d)*this.fromToDelta)+this.options.from;
                this.position=d;
                c(this,"beforeUpdate");
                if(this.update){
                    this.update(d)
                    }
                    c(this,"afterUpdate")
                }
            }
        })();
    this.event("beforeStart");
    if(!this.options.sync){
    Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).add(this)
    }
},
loop:function(c){
    if(c>=this.startOn){
        if(c>=this.finishOn){
            this.render(1);
            this.cancel();
            this.event("beforeFinish");
            if(this.finish){
                this.finish()
                }
                this.event("afterFinish");
            return
        }
        var b=(c-this.startOn)/this.totalTime,a=(b*this.totalFrames).round();
        if(a>this.currentFrame){
            this.render(b);
            this.currentFrame=a
            }
        }
},
cancel:function(){
    if(!this.options.sync){
        Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).remove(this)
        }
        this.state="finished"
    },
event:function(a){
    if(this.options[a+"Internal"]){
        this.options[a+"Internal"](this)
        }
        if(this.options[a]){
        this.options[a](this)
        }
    },
inspect:function(){
    var a=$H();
    for(property in this){
        if(!Object.isFunction(this[property])){
            a.set(property,this[property])
            }
        }
    return"#<Effect:"+a.inspect()+",options:"+$H(this.options).inspect()+">"
}
});
Effect.Parallel=Class.create(Effect.Base,{
    initialize:function(a){
        this.effects=a||[];
        this.start(arguments[1])
        },
    update:function(a){
        this.effects.invoke("render",a)
        },
    finish:function(a){
        this.effects.each(function(b){
            b.render(1);
            b.cancel();
            b.event("beforeFinish");
            if(b.finish){
                b.finish(a)
                }
                b.event("afterFinish")
            })
        }
    });
Effect.Tween=Class.create(Effect.Base,{
    initialize:function(c,g,f){
        c=Object.isString(c)?$(c):c;
        var b=$A(arguments),d=b.last(),a=b.length==5?b[3]:null;
        this.method=Object.isFunction(d)?d.bind(c):Object.isFunction(c[d])?c[d].bind(c):function(h){
            c[d]=h
            };

        this.start(Object.extend({
            from:g,
            to:f
        },a||{}))
        },
    update:function(a){
        this.method(a)
        }
    });
Effect.Event=Class.create(Effect.Base,{
    initialize:function(){
        this.start(Object.extend({
            duration:0
        },arguments[0]||{}))
        },
    update:Prototype.emptyFunction
    });
Effect.Opacity=Class.create(Effect.Base,{
    initialize:function(b){
        this.element=$(b);
        if(!this.element){
            throw (Effect._elementDoesNotExistError)
            }
            if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){
            this.element.setStyle({
                zoom:1
            })
            }
            var a=Object.extend({
            from:this.element.getOpacity()||0,
            to:1
        },arguments[1]||{});
        this.start(a)
        },
    update:function(a){
        this.element.setOpacity(a)
        }
    });
Effect.Move=Class.create(Effect.Base,{
    initialize:function(b){
        this.element=$(b);
        if(!this.element){
            throw (Effect._elementDoesNotExistError)
            }
            var a=Object.extend({
            x:0,
            y:0,
            mode:"relative"
        },arguments[1]||{});
        this.start(a)
        },
    setup:function(){
        this.element.makePositioned();
        this.originalLeft=parseFloat(this.element.getStyle("left")||"0");
        this.originalTop=parseFloat(this.element.getStyle("top")||"0");
        if(this.options.mode=="absolute"){
            this.options.x=this.options.x-this.originalLeft;
            this.options.y=this.options.y-this.originalTop
            }
        },
update:function(a){
    this.element.setStyle({
        left:(this.options.x*a+this.originalLeft).round()+"px",
        top:(this.options.y*a+this.originalTop).round()+"px"
        })
    }
});
Effect.MoveBy=function(b,a,c){
    return new Effect.Move(b,Object.extend({
        x:c,
        y:a
    },arguments[3]||{}))
    };

Effect.Scale=Class.create(Effect.Base,{
    initialize:function(b,c){
        this.element=$(b);
        if(!this.element){
            throw (Effect._elementDoesNotExistError)
            }
            var a=Object.extend({
            scaleX:true,
            scaleY:true,
            scaleContent:true,
            scaleFromCenter:false,
            scaleMode:"box",
            scaleFrom:100,
            scaleTo:c
        },arguments[2]||{});
        this.start(a)
        },
    setup:function(){
        this.restoreAfterFinish=this.options.restoreAfterFinish||false;
        this.elementPositioning=this.element.getStyle("position");
        this.originalStyle={};

        ["top","left","width","height","fontSize"].each(function(b){
            this.originalStyle[b]=this.element.style[b]
            }.bind(this));
        this.originalTop=this.element.offsetTop;
        this.originalLeft=this.element.offsetLeft;
        var a=this.element.getStyle("font-size")||"100%";
        ["em","px","%","pt"].each(function(b){
            if(a.indexOf(b)>0){
                this.fontSize=parseFloat(a);
                this.fontSizeType=b
                }
            }.bind(this));
    this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;
    this.dims=null;
    if(this.options.scaleMode=="box"){
        this.dims=[this.element.offsetHeight,this.element.offsetWidth]
        }
        if(/^content/.test(this.options.scaleMode)){
        this.dims=[this.element.scrollHeight,this.element.scrollWidth]
        }
        if(!this.dims){
        this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]
        }
    },
update:function(a){
    var b=(this.options.scaleFrom/100)+(this.factor*a);
    if(this.options.scaleContent&&this.fontSize){
        this.element.setStyle({
            fontSize:this.fontSize*b+this.fontSizeType
            })
        }
        this.setDimensions(this.dims[0]*b,this.dims[1]*b)
    },
finish:function(a){
    if(this.restoreAfterFinish){
        this.element.setStyle(this.originalStyle)
        }
    },
setDimensions:function(a,f){
    var g={};

    if(this.options.scaleX){
        g.width=f.round()+"px"
        }
        if(this.options.scaleY){
        g.height=a.round()+"px"
        }
        if(this.options.scaleFromCenter){
        var c=(a-this.dims[0])/2;
        var b=(f-this.dims[1])/2;
        if(this.elementPositioning=="absolute"){
            if(this.options.scaleY){
                g.top=this.originalTop-c+"px"
                }
                if(this.options.scaleX){
                g.left=this.originalLeft-b+"px"
                }
            }else{
        if(this.options.scaleY){
            g.top=-c+"px"
            }
            if(this.options.scaleX){
            g.left=-b+"px"
            }
        }
}
this.element.setStyle(g)
}
});
Effect.Highlight=Class.create(Effect.Base,{
    initialize:function(b){
        this.element=$(b);
        if(!this.element){
            throw (Effect._elementDoesNotExistError)
            }
            var a=Object.extend({
            startcolor:"#ffff99"
        },arguments[1]||{});
        this.start(a)
        },
    setup:function(){
        if(this.element.getStyle("display")=="none"){
            this.cancel();
            return
        }
        this.oldStyle={};

        if(!this.options.keepBackgroundImage){
            this.oldStyle.backgroundImage=this.element.getStyle("background-image");
            this.element.setStyle({
                backgroundImage:"none"
            })
            }
            if(!this.options.endcolor){
            this.options.endcolor=this.element.getStyle("background-color").parseColor("#ffffff")
            }
            if(!this.options.restorecolor){
            this.options.restorecolor=this.element.getStyle("background-color")
            }
            this._base=$R(0,2).map(function(a){
            return parseInt(this.options.startcolor.slice(a*2+1,a*2+3),16)
            }.bind(this));
        this._delta=$R(0,2).map(function(a){
            return parseInt(this.options.endcolor.slice(a*2+1,a*2+3),16)-this._base[a]
            }.bind(this))
        },
    update:function(a){
        this.element.setStyle({
            backgroundColor:$R(0,2).inject("#",function(b,c,d){
                return b+((this._base[d]+(this._delta[d]*a)).round().toColorPart())
                }.bind(this))
            })
        },
    finish:function(){
        this.element.setStyle(Object.extend(this.oldStyle,{
            backgroundColor:this.options.restorecolor
            }))
        }
    });
Effect.ScrollTo=function(c){
    var b=arguments[1]||{},a=document.viewport.getScrollOffsets(),d=$(c).cumulativeOffset();
    if(b.offset){
        d[1]+=b.offset
        }
        return new Effect.Tween(null,a.top,d[1],b,function(f){
        scrollTo(a.left,f.round())
        })
    };

Effect.Fade=function(c){
    c=$(c);
    var a=c.getInlineOpacity();
    var b=Object.extend({
        from:c.getOpacity()||1,
        to:0,
        afterFinishInternal:function(d){
            if(d.options.to!=0){
                return
            }
            d.element.hide().setStyle({
                opacity:a
            })
            }
        },arguments[1]||{});
return new Effect.Opacity(c,b)
    };

Effect.Appear=function(b){
    b=$(b);
    var a=Object.extend({
        from:(b.getStyle("display")=="none"?0:b.getOpacity()||0),
        to:1,
        afterFinishInternal:function(c){
            c.element.forceRerendering()
            },
        beforeSetup:function(c){
            c.element.setOpacity(c.options.from).show()
            }
        },arguments[1]||{});
return new Effect.Opacity(b,a)
    };

Effect.Puff=function(b){
    b=$(b);
    var a={
        opacity:b.getInlineOpacity(),
        position:b.getStyle("position"),
        top:b.style.top,
        left:b.style.left,
        width:b.style.width,
        height:b.style.height
        };

    return new Effect.Parallel([new Effect.Scale(b,200,{
        sync:true,
        scaleFromCenter:true,
        scaleContent:true,
        restoreAfterFinish:true
    }),new Effect.Opacity(b,{
        sync:true,
        to:0
    })],Object.extend({
        duration:1,
        beforeSetupInternal:function(c){
            Position.absolutize(c.effects[0].element)
            },
        afterFinishInternal:function(c){
            c.effects[0].element.hide().setStyle(a)
            }
        },arguments[1]||{}))
};

Effect.BlindUp=function(a){
    a=$(a);
    a.makeClipping();
    return new Effect.Scale(a,0,Object.extend({
        scaleContent:false,
        scaleX:false,
        restoreAfterFinish:true,
        afterFinishInternal:function(b){
            b.element.hide().undoClipping()
            }
        },arguments[1]||{}))
};

Effect.BlindDown=function(b){
    b=$(b);
    var a=b.getDimensions();
    return new Effect.Scale(b,100,Object.extend({
        scaleContent:false,
        scaleX:false,
        scaleFrom:0,
        scaleMode:{
            originalHeight:a.height,
            originalWidth:a.width
            },
        restoreAfterFinish:true,
        afterSetup:function(c){
            c.element.makeClipping().setStyle({
                height:"0px"
            }).show()
            },
        afterFinishInternal:function(c){
            c.element.undoClipping()
            }
        },arguments[1]||{}))
};

Effect.SwitchOff=function(b){
    b=$(b);
    var a=b.getInlineOpacity();
    return new Effect.Appear(b,Object.extend({
        duration:0.4,
        from:0,
        transition:Effect.Transitions.flicker,
        afterFinishInternal:function(c){
            new Effect.Scale(c.element,1,{
                duration:0.3,
                scaleFromCenter:true,
                scaleX:false,
                scaleContent:false,
                restoreAfterFinish:true,
                beforeSetup:function(d){
                    d.element.makePositioned().makeClipping()
                    },
                afterFinishInternal:function(d){
                    d.element.hide().undoClipping().undoPositioned().setStyle({
                        opacity:a
                    })
                    }
                })
        }
    },arguments[1]||{}))
};

Effect.DropOut=function(b){
    b=$(b);
    var a={
        top:b.getStyle("top"),
        left:b.getStyle("left"),
        opacity:b.getInlineOpacity()
        };

    return new Effect.Parallel([new Effect.Move(b,{
        x:0,
        y:100,
        sync:true
    }),new Effect.Opacity(b,{
        sync:true,
        to:0
    })],Object.extend({
        duration:0.5,
        beforeSetup:function(c){
            c.effects[0].element.makePositioned()
            },
        afterFinishInternal:function(c){
            c.effects[0].element.hide().undoPositioned().setStyle(a)
            }
        },arguments[1]||{}))
};

Effect.Shake=function(d){
    d=$(d);
    var b=Object.extend({
        distance:20,
        duration:0.5
    },arguments[1]||{});
    var f=parseFloat(b.distance);
    var c=parseFloat(b.duration)/10;
    var a={
        top:d.getStyle("top"),
        left:d.getStyle("left")
        };

    return new Effect.Move(d,{
        x:f,
        y:0,
        duration:c,
        afterFinishInternal:function(g){
            new Effect.Move(g.element,{
                x:-f*2,
                y:0,
                duration:c*2,
                afterFinishInternal:function(h){
                    new Effect.Move(h.element,{
                        x:f*2,
                        y:0,
                        duration:c*2,
                        afterFinishInternal:function(j){
                            new Effect.Move(j.element,{
                                x:-f*2,
                                y:0,
                                duration:c*2,
                                afterFinishInternal:function(k){
                                    new Effect.Move(k.element,{
                                        x:f*2,
                                        y:0,
                                        duration:c*2,
                                        afterFinishInternal:function(l){
                                            new Effect.Move(l.element,{
                                                x:-f,
                                                y:0,
                                                duration:c,
                                                afterFinishInternal:function(m){
                                                    m.element.undoPositioned().setStyle(a)
                                                    }
                                                })
                                        }
                                    })
                            }
                            })
                    }
                })
        }
    })
}
})
};

Effect.SlideDown=function(c){
    c=$(c).cleanWhitespace();
    var a=c.down().getStyle("bottom");
    var b=c.getDimensions();
    return new Effect.Scale(c,100,Object.extend({
        scaleContent:false,
        scaleX:false,
        scaleFrom:window.opera?0:1,
        scaleMode:{
            originalHeight:b.height,
            originalWidth:b.width
            },
        restoreAfterFinish:true,
        afterSetup:function(d){
            d.element.makePositioned();
            d.element.down().makePositioned();
            if(window.opera){
                d.element.setStyle({
                    top:""
                })
                }
                d.element.makeClipping().setStyle({
                height:"0px"
            }).show()
            },
        afterUpdateInternal:function(d){
            d.element.down().setStyle({
                bottom:(d.dims[0]-d.element.clientHeight)+"px"
                })
            },
        afterFinishInternal:function(d){
            d.element.undoClipping().undoPositioned();
            d.element.down().undoPositioned().setStyle({
                bottom:a
            })
            }
        },arguments[1]||{}))
};

Effect.SlideUp=function(c){
    c=$(c).cleanWhitespace();
    var a=c.down().getStyle("bottom");
    var b=c.getDimensions();
    return new Effect.Scale(c,window.opera?0:1,Object.extend({
        scaleContent:false,
        scaleX:false,
        scaleMode:"box",
        scaleFrom:100,
        scaleMode:{
            originalHeight:b.height,
            originalWidth:b.width
            },
        restoreAfterFinish:true,
        afterSetup:function(d){
            d.element.makePositioned();
            d.element.down().makePositioned();
            if(window.opera){
                d.element.setStyle({
                    top:""
                })
                }
                d.element.makeClipping().show()
            },
        afterUpdateInternal:function(d){
            d.element.down().setStyle({
                bottom:(d.dims[0]-d.element.clientHeight)+"px"
                })
            },
        afterFinishInternal:function(d){
            d.element.hide().undoClipping().undoPositioned();
            d.element.down().undoPositioned().setStyle({
                bottom:a
            })
            }
        },arguments[1]||{}))
};

Effect.Squish=function(a){
    return new Effect.Scale(a,window.opera?1:0,{
        restoreAfterFinish:true,
        beforeSetup:function(b){
            b.element.makeClipping()
            },
        afterFinishInternal:function(b){
            b.element.hide().undoClipping()
            }
        })
};

Effect.Grow=function(c){
    c=$(c);
    var b=Object.extend({
        direction:"center",
        moveTransition:Effect.Transitions.sinoidal,
        scaleTransition:Effect.Transitions.sinoidal,
        opacityTransition:Effect.Transitions.full
        },arguments[1]||{});
    var a={
        top:c.style.top,
        left:c.style.left,
        height:c.style.height,
        width:c.style.width,
        opacity:c.getInlineOpacity()
        };

    var h=c.getDimensions();
    var j,g;
    var f,d;
    switch(b.direction){
        case"top-left":
            j=g=f=d=0;
            break;
        case"top-right":
            j=h.width;
            g=d=0;
            f=-h.width;
            break;
        case"bottom-left":
            j=f=0;
            g=h.height;
            d=-h.height;
            break;
        case"bottom-right":
            j=h.width;
            g=h.height;
            f=-h.width;
            d=-h.height;
            break;
        case"center":
            j=h.width/2;
            g=h.height/2;
            f=-h.width/2;
            d=-h.height/2;
            break
            }
            return new Effect.Move(c,{
        x:j,
        y:g,
        duration:0.01,
        beforeSetup:function(k){
            k.element.hide().makeClipping().makePositioned()
            },
        afterFinishInternal:function(k){
            new Effect.Parallel([new Effect.Opacity(k.element,{
                sync:true,
                to:1,
                from:0,
                transition:b.opacityTransition
                }),new Effect.Move(k.element,{
                x:f,
                y:d,
                sync:true,
                transition:b.moveTransition
                }),new Effect.Scale(k.element,100,{
                scaleMode:{
                    originalHeight:h.height,
                    originalWidth:h.width
                    },
                sync:true,
                scaleFrom:window.opera?1:0,
                transition:b.scaleTransition,
                restoreAfterFinish:true
            })],Object.extend({
                beforeSetup:function(l){
                    l.effects[0].element.setStyle({
                        height:"0px"
                    }).show()
                    },
                afterFinishInternal:function(l){
                    l.effects[0].element.undoClipping().undoPositioned().setStyle(a)
                    }
                },b))
        }
    })
};

Effect.Shrink=function(c){
    c=$(c);
    var b=Object.extend({
        direction:"center",
        moveTransition:Effect.Transitions.sinoidal,
        scaleTransition:Effect.Transitions.sinoidal,
        opacityTransition:Effect.Transitions.none
        },arguments[1]||{});
    var a={
        top:c.style.top,
        left:c.style.left,
        height:c.style.height,
        width:c.style.width,
        opacity:c.getInlineOpacity()
        };

    var g=c.getDimensions();
    var f,d;
    switch(b.direction){
        case"top-left":
            f=d=0;
            break;
        case"top-right":
            f=g.width;
            d=0;
            break;
        case"bottom-left":
            f=0;
            d=g.height;
            break;
        case"bottom-right":
            f=g.width;
            d=g.height;
            break;
        case"center":
            f=g.width/2;
            d=g.height/2;
            break
            }
            return new Effect.Parallel([new Effect.Opacity(c,{
        sync:true,
        to:0,
        from:1,
        transition:b.opacityTransition
        }),new Effect.Scale(c,window.opera?1:0,{
        sync:true,
        transition:b.scaleTransition,
        restoreAfterFinish:true
    }),new Effect.Move(c,{
        x:f,
        y:d,
        sync:true,
        transition:b.moveTransition
        })],Object.extend({
        beforeStartInternal:function(h){
            h.effects[0].element.makePositioned().makeClipping()
            },
        afterFinishInternal:function(h){
            h.effects[0].element.hide().undoClipping().undoPositioned().setStyle(a)
            }
        },b))
};

Effect.Pulsate=function(c){
    c=$(c);
    var b=arguments[1]||{},a=c.getInlineOpacity(),f=b.transition||Effect.Transitions.linear,d=function(g){
        return 1-f((-Math.cos((g*(b.pulses||5)*2)*Math.PI)/2)+0.5)
        };

    return new Effect.Opacity(c,Object.extend(Object.extend({
        duration:2,
        from:0,
        afterFinishInternal:function(g){
            g.element.setStyle({
                opacity:a
            })
            }
        },b),{
        transition:d
    }))
};

Effect.Fold=function(b){
    b=$(b);
    var a={
        top:b.style.top,
        left:b.style.left,
        width:b.style.width,
        height:b.style.height
        };

    b.makeClipping();
    return new Effect.Scale(b,5,Object.extend({
        scaleContent:false,
        scaleX:false,
        afterFinishInternal:function(c){
            new Effect.Scale(b,1,{
                scaleContent:false,
                scaleY:false,
                afterFinishInternal:function(d){
                    d.element.hide().undoClipping().setStyle(a)
                    }
                })
        }
    },arguments[1]||{}))
};

Effect.Morph=Class.create(Effect.Base,{
    initialize:function(c){
        this.element=$(c);
        if(!this.element){
            throw (Effect._elementDoesNotExistError)
            }
            var a=Object.extend({
            style:{}
        },arguments[1]||{});
    if(!Object.isString(a.style)){
        this.style=$H(a.style)
        }else{
        if(a.style.include(":")){
            this.style=a.style.parseStyle()
            }else{
            this.element.addClassName(a.style);
            this.style=$H(this.element.getStyles());
            this.element.removeClassName(a.style);
            var b=this.element.getStyles();
            this.style=this.style.reject(function(d){
                return d.value==b[d.key]
                });
            a.afterFinishInternal=function(d){
                d.element.addClassName(d.options.style);
                d.transforms.each(function(f){
                    d.element.style[f.style]=""
                    })
                }
            }
    }
this.start(a)
    },
setup:function(){
    function a(b){
        if(!b||["rgba(0, 0, 0, 0)","transparent"].include(b)){
            b="#ffffff"
            }
            b=b.parseColor();
        return $R(0,2).map(function(c){
            return parseInt(b.slice(c*2+1,c*2+3),16)
            })
        }
        this.transforms=this.style.map(function(h){
        var g=h[0],f=h[1],d=null;
        if(f.parseColor("#zzzzzz")!="#zzzzzz"){
            f=f.parseColor();
            d="color"
            }else{
            if(g=="opacity"){
                f=parseFloat(f);
                if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){
                    this.element.setStyle({
                        zoom:1
                    })
                    }
                }else{
            if(Element.CSS_LENGTH.test(f)){
                var c=f.match(/^([\+\-]?[0-9\.]+)(.*)$/);
                f=parseFloat(c[1]);
                d=(c.length==3)?c[2]:null
                }
            }
    }
    var b=this.element.getStyle(g);
return{
    style:g.camelize(),
    originalValue:d=="color"?a(b):parseFloat(b||0),
    targetValue:d=="color"?a(f):f,
    unit:d
}
}.bind(this)).reject(function(b){
    return((b.originalValue==b.targetValue)||(b.unit!="color"&&(isNaN(b.originalValue)||isNaN(b.targetValue))))
    })
},
update:function(a){
    var d={},b,c=this.transforms.length;
    while(c--){
        d[(b=this.transforms[c]).style]=b.unit=="color"?"#"+(Math.round(b.originalValue[0]+(b.targetValue[0]-b.originalValue[0])*a)).toColorPart()+(Math.round(b.originalValue[1]+(b.targetValue[1]-b.originalValue[1])*a)).toColorPart()+(Math.round(b.originalValue[2]+(b.targetValue[2]-b.originalValue[2])*a)).toColorPart():(b.originalValue+(b.targetValue-b.originalValue)*a).toFixed(3)+(b.unit===null?"":b.unit)
        }
        this.element.setStyle(d,true)
    }
});
Effect.Transform=Class.create({
    initialize:function(a){
        this.tracks=[];
        this.options=arguments[1]||{};

        this.addTracks(a)
        },
    addTracks:function(a){
        a.each(function(b){
            b=$H(b);
            var c=b.values().first();
            this.tracks.push($H({
                ids:b.keys().first(),
                effect:Effect.Morph,
                options:{
                    style:c
                }
            }))
        }.bind(this));
    return this
    },
play:function(){
    return new Effect.Parallel(this.tracks.map(function(a){
        var d=a.get("ids"),c=a.get("effect"),b=a.get("options");
        var f=[$(d)||$$(d)].flatten();
        return f.map(function(g){
            return new c(g,Object.extend({
                sync:true
            },b))
            })
        }).flatten(),this.options)
    }
});
Element.CSS_PROPERTIES=$w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex");
Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
String.__parseStyleElement=document.createElement("div");
String.prototype.parseStyle=function(){
    var b,a=$H();
    if(Prototype.Browser.WebKit){
        b=new Element("div",{
            style:this
        }).style
        }else{
        String.__parseStyleElement.innerHTML='<div style="'+this+'"></div>';
        b=String.__parseStyleElement.childNodes[0].style
        }
        Element.CSS_PROPERTIES.each(function(c){
        if(b[c]){
            a.set(c,b[c])
            }
        });
if(Prototype.Browser.IE&&this.include("opacity")){
    a.set("opacity",this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1])
    }
    return a
};

if(document.defaultView&&document.defaultView.getComputedStyle){
    Element.getStyles=function(b){
        var a=document.defaultView.getComputedStyle($(b),null);
        return Element.CSS_PROPERTIES.inject({},function(c,d){
            c[d]=a[d];
            return c
            })
        }
    }else{
    Element.getStyles=function(b){
        b=$(b);
        var a=b.currentStyle,c;
        c=Element.CSS_PROPERTIES.inject({},function(d,f){
            d[f]=a[f];
            return d
            });
        if(!c.opacity){
            c.opacity=b.getOpacity()
            }
            return c
        }
    }
    Effect.Methods={
    morph:function(a,b){
        a=$(a);
        new Effect.Morph(a,Object.extend({
            style:b
        },arguments[2]||{}));
        return a
        },
    visualEffect:function(c,f,b){
        c=$(c);
        var d=f.dasherize().camelize(),a=d.charAt(0).toUpperCase()+d.substring(1);
        new Effect[a](c,b);
        return c
        },
    highlight:function(b,a){
        b=$(b);
        new Effect.Highlight(b,a);
        return b
        }
    };

$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function(a){
    Effect.Methods[a]=function(c,b){
        c=$(c);
        Effect[a.charAt(0).toUpperCase()+a.substring(1)](c,b);
        return c
        }
    });
$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(a){
    Effect.Methods[a]=Element[a]
    });
Element.addMethods(Effect.Methods);
if(Object.isUndefined(Effect)){
    throw ("dragdrop.js requires including script.aculo.us' effects.js library")
    }
    var Droppables={
    drops:[],
    remove:function(a){
        this.drops=this.drops.reject(function(b){
            return b.element==$(a)
            })
        },
    add:function(b){
        b=$(b);
        var a=Object.extend({
            greedy:true,
            hoverclass:null,
            tree:false
        },arguments[1]||{});
        if(a.containment){
            a._containers=[];
            var c=a.containment;
            if(Object.isArray(c)){
                c.each(function(d){
                    a._containers.push($(d))
                    })
                }else{
                a._containers.push($(c))
                }
            }
        if(a.accept){
        a.accept=[a.accept].flatten()
        }
        Element.makePositioned(b);
    a.element=b;
    this.drops.push(a)
    },
findDeepestChild:function(a){
    deepest=a[0];
    for(i=1;i<a.length;++i){
        if(Element.isParent(a[i].element,deepest.element)){
            deepest=a[i]
            }
        }
    return deepest
},
isContained:function(b,a){
    var c;
    if(a.tree){
        c=b.treeNode
        }else{
        c=b.parentNode
        }
        return a._containers.detect(function(d){
        return c==d
        })
    },
isAffected:function(a,c,b){
    return((b.element!=c)&&((!b._containers)||this.isContained(c,b))&&((!b.accept)||(Element.classNames(c).detect(function(d){
        return b.accept.include(d)
        })))&&Position.within(b.element,a[0],a[1]))
    },
deactivate:function(a){
    if(a.hoverclass){
        Element.removeClassName(a.element,a.hoverclass)
        }
        this.last_active=null
    },
activate:function(a){
    if(a.hoverclass){
        Element.addClassName(a.element,a.hoverclass)
        }
        this.last_active=a
    },
show:function(a,c){
    if(!this.drops.length){
        return
    }
    var b,d=[];
    this.drops.each(function(f){
        if(Droppables.isAffected(a,c,f)){
            d.push(f)
            }
        });
if(d.length>0){
    b=Droppables.findDeepestChild(d)
    }
    if(this.last_active&&this.last_active!=b){
    this.deactivate(this.last_active)
    }
    if(b){
    Position.within(b.element,a[0],a[1]);
    if(b.onHover){
        b.onHover(c,b.element,Position.overlap(b.overlap,b.element))
        }
        if(b!=this.last_active){
        Droppables.activate(b)
        }
    }
},
fire:function(b,a){
    if(!this.last_active){
        return
    }
    Position.prepare();
    if(this.isAffected([Event.pointerX(b),Event.pointerY(b)],a,this.last_active)){
        if(this.last_active.onDrop){
            this.last_active.onDrop(a,this.last_active.element,b);
            return true
            }
        }
},
reset:function(){
    if(this.last_active){
        this.deactivate(this.last_active)
        }
    }
};

var Draggables={
    drags:[],
    observers:[],
    register:function(a){
        if(this.drags.length==0){
            this.eventMouseUp=this.endDrag.bindAsEventListener(this);
            this.eventMouseMove=this.updateDrag.bindAsEventListener(this);
            this.eventKeypress=this.keyPress.bindAsEventListener(this);
            Event.observe(document,"mouseup",this.eventMouseUp);
            Event.observe(document,"mousemove",this.eventMouseMove);
            Event.observe(document,"keypress",this.eventKeypress)
            }
            this.drags.push(a)
        },
    unregister:function(a){
        this.drags=this.drags.reject(function(b){
            return b==a
            });
        if(this.drags.length==0){
            Event.stopObserving(document,"mouseup",this.eventMouseUp);
            Event.stopObserving(document,"mousemove",this.eventMouseMove);
            Event.stopObserving(document,"keypress",this.eventKeypress)
            }
        },
activate:function(a){
    if(a.options.delay){
        this._timeout=setTimeout(function(){
            Draggables._timeout=null;
            window.focus();
            Draggables.activeDraggable=a
            }.bind(this),a.options.delay)
        }else{
        window.focus();
        this.activeDraggable=a
        }
    },
deactivate:function(){
    this.activeDraggable=null
    },
updateDrag:function(a){
    if(!this.activeDraggable){
        return
    }
    var b=[Event.pointerX(a),Event.pointerY(a)];
    if(this._lastPointer&&(this._lastPointer.inspect()==b.inspect())){
        return
    }
    this._lastPointer=b;
    this.activeDraggable.updateDrag(a,b)
    },
endDrag:function(a){
    if(this._timeout){
        clearTimeout(this._timeout);
        this._timeout=null
        }
        if(!this.activeDraggable){
        return
    }
    this._lastPointer=null;
    this.activeDraggable.endDrag(a);
    this.activeDraggable=null
    },
keyPress:function(a){
    if(this.activeDraggable){
        this.activeDraggable.keyPress(a)
        }
    },
addObserver:function(a){
    this.observers.push(a);
    this._cacheObserverCallbacks()
    },
removeObserver:function(a){
    this.observers=this.observers.reject(function(b){
        return b.element==a
        });
    this._cacheObserverCallbacks()
    },
notify:function(b,a,c){
    if(this[b+"Count"]>0){
        this.observers.each(function(d){
            if(d[b]){
                d[b](b,a,c)
                }
            })
    }
    if(a.options[b]){
    a.options[b](a,c)
    }
},
_cacheObserverCallbacks:function(){
    ["onStart","onEnd","onDrag"].each(function(a){
        Draggables[a+"Count"]=Draggables.observers.select(function(b){
            return b[a]
            }).length
        })
    }
};

var Draggable=Class.create({
    initialize:function(b){
        var c={
            handle:false,
            reverteffect:function(g,f,d){
                var h=Math.sqrt(Math.abs(f^2)+Math.abs(d^2))*0.02;
                new Effect.Move(g,{
                    x:-d,
                    y:-f,
                    duration:h,
                    queue:{
                        scope:"_draggable",
                        position:"end"
                    }
                })
            },
        endeffect:function(f){
            var d=Object.isNumber(f._opacity)?f._opacity:1;
            new Effect.Opacity(f,{
                duration:0.2,
                from:0.7,
                to:d,
                queue:{
                    scope:"_draggable",
                    position:"end"
                },
                afterFinish:function(){
                    Draggable._dragging[f]=false
                    }
                })
        },
    zindex:1000,
    revert:false,
    quiet:false,
    scroll:false,
    scrollSensitivity:20,
    scrollSpeed:15,
    snap:false,
    delay:0
};

if(!arguments[1]||Object.isUndefined(arguments[1].endeffect)){
    Object.extend(c,{
        starteffect:function(d){
            d._opacity=Element.getOpacity(d);
            Draggable._dragging[d]=true;
            new Effect.Opacity(d,{
                duration:0.2,
                from:d._opacity,
                to:0.7
            })
            }
        })
}
var a=Object.extend(c,arguments[1]||{});
this.element=$(b);
if(a.handle&&Object.isString(a.handle)){
    this.handle=this.element.down("."+a.handle,0)
    }
    if(!this.handle){
    this.handle=$(a.handle)
    }
    if(!this.handle){
    this.handle=this.element
    }
    if(a.scroll&&!a.scroll.scrollTo&&!a.scroll.outerHTML){
    a.scroll=$(a.scroll);
    this._isScrollChild=Element.childOf(this.element,a.scroll)
    }
    Element.makePositioned(this.element);
this.options=a;
this.dragging=false;
this.eventMouseDown=this.initDrag.bindAsEventListener(this);
Event.observe(this.handle,"mousedown",this.eventMouseDown);
Draggables.register(this)
},
destroy:function(){
    Event.stopObserving(this.handle,"mousedown",this.eventMouseDown);
    Draggables.unregister(this)
    },
currentDelta:function(){
    return([parseInt(Element.getStyle(this.element,"left")||"0"),parseInt(Element.getStyle(this.element,"top")||"0")])
    },
initDrag:function(a){
    if(!Object.isUndefined(Draggable._dragging[this.element])&&Draggable._dragging[this.element]){
        return
    }
    if(Event.isLeftClick(a)){
        var c=Event.element(a);
        if((tag_name=c.tagName.toUpperCase())&&(tag_name=="INPUT"||tag_name=="SELECT"||tag_name=="OPTION"||tag_name=="BUTTON"||tag_name=="TEXTAREA")){
            return
        }
        var b=[Event.pointerX(a),Event.pointerY(a)];
        var d=Position.cumulativeOffset(this.element);
        this.offset=[0,1].map(function(f){
            return(b[f]-d[f])
            });
        Draggables.activate(this);
        Event.stop(a)
        }
    },
startDrag:function(b){
    this.dragging=true;
    if(!this.delta){
        this.delta=this.currentDelta()
        }
        if(this.options.zindex){
        this.originalZ=parseInt(Element.getStyle(this.element,"z-index")||0);
        this.element.style.zIndex=this.options.zindex
        }
        if(this.options.ghosting){
        this._clone=this.element.cloneNode(true);
        this._originallyAbsolute=(this.element.getStyle("position")=="absolute");
        if(!this._originallyAbsolute){
            Position.absolutize(this.element)
            }
            this.element.parentNode.insertBefore(this._clone,this.element)
        }
        if(this.options.scroll){
        if(this.options.scroll==window){
            var a=this._getWindowScroll(this.options.scroll);
            this.originalScrollLeft=a.left;
            this.originalScrollTop=a.top
            }else{
            this.originalScrollLeft=this.options.scroll.scrollLeft;
            this.originalScrollTop=this.options.scroll.scrollTop
            }
        }
    Draggables.notify("onStart",this,b);
if(this.options.starteffect){
    this.options.starteffect(this.element)
    }
},
updateDrag:function(event,pointer){
    if(!this.dragging){
        this.startDrag(event)
        }
        if(!this.options.quiet){
        Position.prepare();
        Droppables.show(pointer,this.element)
        }
        Draggables.notify("onDrag",this,event);
    this.draw(pointer);
    if(this.options.change){
        this.options.change(this)
        }
        if(this.options.scroll){
        this.stopScrolling();
        var p;
        if(this.options.scroll==window){
            with(this._getWindowScroll(this.options.scroll)){
                p=[left,top,left+width,top+height]
                }
            }else{
        p=Position.page(this.options.scroll);
        p[0]+=this.options.scroll.scrollLeft+Position.deltaX;
        p[1]+=this.options.scroll.scrollTop+Position.deltaY;
        p.push(p[0]+this.options.scroll.offsetWidth);
        p.push(p[1]+this.options.scroll.offsetHeight)
        }
        var speed=[0,0];
    if(pointer[0]<(p[0]+this.options.scrollSensitivity)){
        speed[0]=pointer[0]-(p[0]+this.options.scrollSensitivity)
        }
        if(pointer[1]<(p[1]+this.options.scrollSensitivity)){
        speed[1]=pointer[1]-(p[1]+this.options.scrollSensitivity)
        }
        if(pointer[0]>(p[2]-this.options.scrollSensitivity)){
        speed[0]=pointer[0]-(p[2]-this.options.scrollSensitivity)
        }
        if(pointer[1]>(p[3]-this.options.scrollSensitivity)){
        speed[1]=pointer[1]-(p[3]-this.options.scrollSensitivity)
        }
        this.startScrolling(speed)
    }
    if(Prototype.Browser.WebKit){
    window.scrollBy(0,0)
    }
    Event.stop(event)
},
finishDrag:function(b,g){
    this.dragging=false;
    if(this.options.quiet){
        Position.prepare();
        var f=[Event.pointerX(b),Event.pointerY(b)];
        Droppables.show(f,this.element)
        }
        if(this.options.ghosting){
        if(!this._originallyAbsolute){
            Position.relativize(this.element)
            }
            delete this._originallyAbsolute;
        Element.remove(this._clone);
        this._clone=null
        }
        var h=false;
    if(g){
        h=Droppables.fire(b,this.element);
        if(!h){
            h=false
            }
        }
    if(h&&this.options.onDropped){
    this.options.onDropped(this.element)
    }
    Draggables.notify("onEnd",this,b);
var a=this.options.revert;
if(a&&Object.isFunction(a)){
    a=a(this.element)
    }
    var c=this.currentDelta();
if(a&&this.options.reverteffect){
    if(h==0||a!="failure"){
        this.options.reverteffect(this.element,c[1]-this.delta[1],c[0]-this.delta[0])
        }
    }else{
    this.delta=c
    }
    if(this.options.zindex){
    this.element.style.zIndex=this.originalZ
    }
    if(this.options.endeffect){
    this.options.endeffect(this.element)
    }
    Draggables.deactivate(this);
Droppables.reset()
},
keyPress:function(a){
    if(a.keyCode!=Event.KEY_ESC){
        return
    }
    this.finishDrag(a,false);
    Event.stop(a)
    },
endDrag:function(a){
    if(!this.dragging){
        return
    }
    this.stopScrolling();
    this.finishDrag(a,true);
    Event.stop(a)
    },
draw:function(a){
    var h=Position.cumulativeOffset(this.element);
    if(this.options.ghosting){
        var c=Position.realOffset(this.element);
        h[0]+=c[0]-Position.deltaX;
        h[1]+=c[1]-Position.deltaY
        }
        var g=this.currentDelta();
    h[0]-=g[0];
    h[1]-=g[1];
    if(this.options.scroll&&(this.options.scroll!=window&&this._isScrollChild)){
        h[0]-=this.options.scroll.scrollLeft-this.originalScrollLeft;
        h[1]-=this.options.scroll.scrollTop-this.originalScrollTop
        }
        var f=[0,1].map(function(d){
        return(a[d]-h[d]-this.offset[d])
        }.bind(this));
    if(this.options.snap){
        if(Object.isFunction(this.options.snap)){
            f=this.options.snap(f[0],f[1],this)
            }else{
            if(Object.isArray(this.options.snap)){
                f=f.map(function(d,j){
                    return(d/this.options.snap[j]).round()*this.options.snap[j]
                    }.bind(this))
                }else{
                f=f.map(function(d){
                    return(d/this.options.snap).round()*this.options.snap
                    }.bind(this))
                }
            }
    }
var b=this.element.style;
if((!this.options.constraint)||(this.options.constraint=="horizontal")){
    b.left=f[0]+"px"
    }
    if((!this.options.constraint)||(this.options.constraint=="vertical")){
    b.top=f[1]+"px"
    }
    if(b.visibility=="hidden"){
    b.visibility=""
    }
},
stopScrolling:function(){
    if(this.scrollInterval){
        clearInterval(this.scrollInterval);
        this.scrollInterval=null;
        Draggables._lastScrollPointer=null
        }
    },
startScrolling:function(a){
    if(!(a[0]||a[1])){
        return
    }
    this.scrollSpeed=[a[0]*this.options.scrollSpeed,a[1]*this.options.scrollSpeed];
    this.lastScrolled=new Date();
    this.scrollInterval=setInterval(this.scroll.bind(this),10)
    },
scroll:function(){
    var current=new Date();
    var delta=current-this.lastScrolled;
    this.lastScrolled=current;
    if(this.options.scroll==window){
        with(this._getWindowScroll(this.options.scroll)){
            if(this.scrollSpeed[0]||this.scrollSpeed[1]){
                var d=delta/1000;
                this.options.scroll.scrollTo(left+d*this.scrollSpeed[0],top+d*this.scrollSpeed[1])
                }
            }
    }else{
    this.options.scroll.scrollLeft+=this.scrollSpeed[0]*delta/1000;
    this.options.scroll.scrollTop+=this.scrollSpeed[1]*delta/1000
    }
    Position.prepare();
Droppables.show(Draggables._lastPointer,this.element);
Draggables.notify("onDrag",this);
if(this._isScrollChild){
    Draggables._lastScrollPointer=Draggables._lastScrollPointer||$A(Draggables._lastPointer);
    Draggables._lastScrollPointer[0]+=this.scrollSpeed[0]*delta/1000;
    Draggables._lastScrollPointer[1]+=this.scrollSpeed[1]*delta/1000;
    if(Draggables._lastScrollPointer[0]<0){
        Draggables._lastScrollPointer[0]=0
        }
        if(Draggables._lastScrollPointer[1]<0){
        Draggables._lastScrollPointer[1]=0
        }
        this.draw(Draggables._lastScrollPointer)
    }
    if(this.options.change){
    this.options.change(this)
    }
},
_getWindowScroll:function(w){
    var T,L,W,H;
    with(w.document){
        if(w.document.documentElement&&documentElement.scrollTop){
            T=documentElement.scrollTop;
            L=documentElement.scrollLeft
            }else{
            if(w.document.body){
                T=body.scrollTop;
                L=body.scrollLeft
                }
            }
        if(w.innerWidth){
        W=w.innerWidth;
        H=w.innerHeight
        }else{
        if(w.document.documentElement&&documentElement.clientWidth){
            W=documentElement.clientWidth;
            H=documentElement.clientHeight
            }else{
            W=body.offsetWidth;
            H=body.offsetHeight
            }
        }
}
return{
    top:T,
    left:L,
    width:W,
    height:H
}
}
});
Draggable._dragging={};

var SortableObserver=Class.create({
    initialize:function(b,a){
        this.element=$(b);
        this.observer=a;
        this.lastValue=Sortable.serialize(this.element)
        },
    onStart:function(){
        this.lastValue=Sortable.serialize(this.element)
        },
    onEnd:function(){
        Sortable.unmark();
        if(this.lastValue!=Sortable.serialize(this.element)){
            this.observer(this.element)
            }
        }
});
var Sortable={
    SERIALIZE_RULE:/^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
    sortables:{},
    _findRootElement:function(a){
        while(a.tagName.toUpperCase()!="BODY"){
            if(a.id&&Sortable.sortables[a.id]){
                return a
                }
                a=a.parentNode
            }
        },
options:function(a){
    a=Sortable._findRootElement($(a));
    if(!a){
        return
    }
    return Sortable.sortables[a.id]
    },
destroy:function(a){
    a=$(a);
    var b=Sortable.sortables[a.id];
    if(b){
        Draggables.removeObserver(b.element);
        b.droppables.each(function(c){
            Droppables.remove(c)
            });
        b.draggables.invoke("destroy");
        delete Sortable.sortables[b.element.id]
    }
},
create:function(c){
    c=$(c);
    var b=Object.extend({
        element:c,
        tag:"li",
        dropOnEmpty:false,
        tree:false,
        treeTag:"ul",
        overlap:"vertical",
        constraint:"vertical",
        containment:c,
        handle:false,
        only:false,
        delay:0,
        hoverclass:null,
        ghosting:false,
        quiet:false,
        scroll:false,
        scrollSensitivity:20,
        scrollSpeed:15,
        format:this.SERIALIZE_RULE,
        elements:false,
        handles:false,
        onChange:Prototype.emptyFunction,
        onUpdate:Prototype.emptyFunction
        },arguments[1]||{});
    this.destroy(c);
    var a={
        revert:true,
        quiet:b.quiet,
        scroll:b.scroll,
        scrollSpeed:b.scrollSpeed,
        scrollSensitivity:b.scrollSensitivity,
        delay:b.delay,
        ghosting:b.ghosting,
        constraint:b.constraint,
        handle:b.handle
        };

    if(b.starteffect){
        a.starteffect=b.starteffect
        }
        if(b.reverteffect){
        a.reverteffect=b.reverteffect
        }else{
        if(b.ghosting){
            a.reverteffect=function(g){
                g.style.top=0;
                g.style.left=0
                }
            }
    }
if(b.endeffect){
    a.endeffect=b.endeffect
    }
    if(b.zindex){
    a.zindex=b.zindex
    }
    var d={
    overlap:b.overlap,
    containment:b.containment,
    tree:b.tree,
    hoverclass:b.hoverclass,
    onHover:Sortable.onHover
    };

var f={
    onHover:Sortable.onEmptyHover,
    overlap:b.overlap,
    containment:b.containment,
    hoverclass:b.hoverclass
    };

Element.cleanWhitespace(c);
b.draggables=[];
b.droppables=[];
if(b.dropOnEmpty||b.tree){
    Droppables.add(c,f);
    b.droppables.push(c)
    }(b.elements||this.findElements(c,b)||[]).each(function(j,g){
    var h=b.handles?$(b.handles[g]):(b.handle?$(j).select("."+b.handle)[0]:j);
    b.draggables.push(new Draggable(j,Object.extend(a,{
        handle:h
    })));
    Droppables.add(j,d);
    if(b.tree){
        j.treeNode=c
        }
        b.droppables.push(j)
    });
if(b.tree){
    (Sortable.findTreeElements(c,b)||[]).each(function(g){
        Droppables.add(g,f);
        g.treeNode=c;
        b.droppables.push(g)
        })
    }
    this.sortables[c.id]=b;
Draggables.addObserver(new SortableObserver(c,b.onUpdate))
},
findElements:function(b,a){
    return Element.findChildren(b,a.only,a.tree?true:false,a.tag)
    },
findTreeElements:function(b,a){
    return Element.findChildren(b,a.only,a.tree?true:false,a.treeTag)
    },
onHover:function(f,d,a){
    if(Element.isParent(d,f)){
        return
    }
    if(a>0.33&&a<0.66&&Sortable.options(d).tree){
        return
    }else{
        if(a>0.5){
            Sortable.mark(d,"before");
            if(d.previousSibling!=f){
                var b=f.parentNode;
                f.style.visibility="hidden";
                d.parentNode.insertBefore(f,d);
                if(d.parentNode!=b){
                    Sortable.options(b).onChange(f)
                    }
                    Sortable.options(d.parentNode).onChange(f)
                }
            }else{
        Sortable.mark(d,"after");
        var c=d.nextSibling||null;
        if(c!=f){
            var b=f.parentNode;
            f.style.visibility="hidden";
            d.parentNode.insertBefore(f,c);
            if(d.parentNode!=b){
                Sortable.options(b).onChange(f)
                }
                Sortable.options(d.parentNode).onChange(f)
            }
        }
}
},
onEmptyHover:function(f,h,j){
    var k=f.parentNode;
    var a=Sortable.options(h);
    if(!Element.isParent(h,f)){
        var g;
        var c=Sortable.findElements(h,{
            tag:a.tag,
            only:a.only
            });
        var b=null;
        if(c){
            var d=Element.offsetSize(h,a.overlap)*(1-j);
            for(g=0;g<c.length;g+=1){
                if(d-Element.offsetSize(c[g],a.overlap)>=0){
                    d-=Element.offsetSize(c[g],a.overlap)
                    }else{
                    if(d-(Element.offsetSize(c[g],a.overlap)/2)>=0){
                        b=g+1<c.length?c[g+1]:null;
                        break
                    }else{
                        b=c[g];
                        break
                    }
                }
            }
        }
    h.insertBefore(f,b);
Sortable.options(k).onChange(f);
a.onChange(f)
}
},
unmark:function(){
    if(Sortable._marker){
        Sortable._marker.hide()
        }
    },
mark:function(b,a){
    var d=Sortable.options(b.parentNode);
    if(d&&!d.ghosting){
        return
    }
    if(!Sortable._marker){
        Sortable._marker=($("dropmarker")||Element.extend(document.createElement("DIV"))).hide().addClassName("dropmarker").setStyle({
            position:"absolute"
        });
        document.getElementsByTagName("body").item(0).appendChild(Sortable._marker)
        }
        var c=Position.cumulativeOffset(b);
    Sortable._marker.setStyle({
        left:c[0]+"px",
        top:c[1]+"px"
        });
    if(a=="after"){
        if(d.overlap=="horizontal"){
            Sortable._marker.setStyle({
                left:(c[0]+b.clientWidth)+"px"
                })
            }else{
            Sortable._marker.setStyle({
                top:(c[1]+b.clientHeight)+"px"
                })
            }
        }
    Sortable._marker.show()
},
_tree:function(f,b,g){
    var d=Sortable.findElements(f,b)||[];
    for(var c=0;c<d.length;++c){
        var a=d[c].id.match(b.format);
        if(!a){
            continue
        }
        var h={
            id:encodeURIComponent(a?a[1]:null),
            element:f,
            parent:g,
            children:[],
            position:g.children.length,
            container:$(d[c]).down(b.treeTag)
            };

        if(h.container){
            this._tree(h.container,b,h)
            }
            g.children.push(h)
        }
        return g
    },
tree:function(d){
    d=$(d);
    var c=this.options(d);
    var b=Object.extend({
        tag:c.tag,
        treeTag:c.treeTag,
        only:c.only,
        name:d.id,
        format:c.format
        },arguments[1]||{});
    var a={
        id:null,
        parent:null,
        children:[],
        container:d,
        position:0
    };

    return Sortable._tree(d,b,a)
    },
_constructIndex:function(b){
    var a="";
    do{
        if(b.id){
            a="["+b.position+"]"+a
            }
        }while((b=b.parent)!=null);
return a
},
sequence:function(b){
    b=$(b);
    var a=Object.extend(this.options(b),arguments[1]||{});
    return $(this.findElements(b,a)||[]).map(function(c){
        return c.id.match(a.format)?c.id.match(a.format)[1]:""
        })
    },
setSequence:function(b,c){
    b=$(b);
    var a=Object.extend(this.options(b),arguments[2]||{});
    var d={};

    this.findElements(b,a).each(function(f){
        if(f.id.match(a.format)){
            d[f.id.match(a.format)[1]]=[f,f.parentNode]
            }
            f.parentNode.removeChild(f)
        });
    c.each(function(f){
        var g=d[f];
        if(g){
            g[1].appendChild(g[0]);
            delete d[f]
        }
    })
},
serialize:function(c){
    c=$(c);
    var b=Object.extend(Sortable.options(c),arguments[1]||{});
    var a=encodeURIComponent((arguments[1]&&arguments[1].name)?arguments[1].name:c.id);
    if(b.tree){
        return Sortable.tree(c,arguments[1]).children.map(function(d){
            return[a+Sortable._constructIndex(d)+"[id]="+encodeURIComponent(d.id)].concat(d.children.map(arguments.callee))
            }).flatten().join("&")
        }else{
        return Sortable.sequence(c,arguments[1]).map(function(d){
            return a+"[]="+encodeURIComponent(d)
            }).join("&")
        }
    }
};

Element.isParent=function(b,a){
    if(!b.parentNode||b==a){
        return false
        }
        if(b.parentNode==a){
        return true
        }
        return Element.isParent(b.parentNode,a)
    };

Element.findChildren=function(d,b,a,c){
    if(!d.hasChildNodes()){
        return null
        }
        c=c.toUpperCase();
    if(b){
        b=[b].flatten()
        }
        var f=[];
    $A(d.childNodes).each(function(h){
        if(h.tagName&&h.tagName.toUpperCase()==c&&(!b||(Element.classNames(h).detect(function(j){
            return b.include(j)
            })))){
            f.push(h)
            }
            if(a){
            var g=Element.findChildren(h,b,a,c);
            if(g){
                f.push(g)
                }
            }
    });
return(f.length>0?f.flatten():[])
};

Element.offsetSize=function(a,b){
    return a["offset"+((b=="vertical"||b=="height")?"Height":"Width")]
    };

if(typeof Effect=="undefined"){
    throw ("controls.js requires including script.aculo.us' effects.js library")
    }
    var Autocompleter={};

Autocompleter.Base=Class.create({
    baseInitialize:function(b,c,a){
        b=$(b);
        this.element=b;
        this.update=$(c);
        this.hasFocus=false;
        this.changed=false;
        this.active=false;
        this.index=0;
        this.entryCount=0;
        this.oldElementValue=this.element.value;
        if(this.setOptions){
            this.setOptions(a)
            }else{
            this.options=a||{}
        }
        this.options.paramName=this.options.paramName||this.element.name;
    this.options.tokens=this.options.tokens||[];
    this.options.frequency=this.options.frequency||0.4;
    this.options.minChars=this.options.minChars||1;
    this.options.onShow=this.options.onShow||function(d,f){
        if(!f.style.position||f.style.position=="absolute"){
            f.style.position="absolute";
            Position.clone(d,f,{
                setHeight:false,
                offsetTop:d.offsetHeight
                })
            }
            Effect.Appear(f,{
            duration:0.15
        })
        };

    this.options.onHide=this.options.onHide||function(d,f){
        new Effect.Fade(f,{
            duration:0.15
        })
        };

    if(typeof(this.options.tokens)=="string"){
        this.options.tokens=new Array(this.options.tokens)
        }
        if(!this.options.tokens.include("\n")){
        this.options.tokens.push("\n")
        }
        this.observer=null;
    this.element.setAttribute("autocomplete","off");
    Element.hide(this.update);
    Event.observe(this.element,"blur",this.onBlur.bindAsEventListener(this));
    Event.observe(this.element,"keydown",this.onKeyPress.bindAsEventListener(this))
    },
show:function(){
    if(Element.getStyle(this.update,"display")=="none"){
        this.options.onShow(this.element,this.update)
        }
        if(!this.iefix&&(Prototype.Browser.IE)&&(Element.getStyle(this.update,"position")=="absolute")){
        new Insertion.After(this.update,'<iframe id="'+this.update.id+'_iefix" style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
        this.iefix=$(this.update.id+"_iefix")
        }
        if(this.iefix){
        setTimeout(this.fixIEOverlapping.bind(this),50)
        }
    },
fixIEOverlapping:function(){
    Position.clone(this.update,this.iefix,{
        setTop:(!this.update.style.height)
        });
    this.iefix.style.zIndex=1;
    this.update.style.zIndex=2;
    Element.show(this.iefix)
    },
hide:function(){
    this.stopIndicator();
    if(Element.getStyle(this.update,"display")!="none"){
        this.options.onHide(this.element,this.update)
        }
        if(this.iefix){
        Element.hide(this.iefix)
        }
    },
startIndicator:function(){
    if(this.options.indicator){
        Element.show(this.options.indicator)
        }
    },
stopIndicator:function(){
    if(this.options.indicator){
        Element.hide(this.options.indicator)
        }
    },
onKeyPress:function(a){
    if(this.active){
        switch(a.keyCode){
            case Event.KEY_TAB:case Event.KEY_RETURN:
                this.selectEntry();
                Event.stop(a);
            case Event.KEY_ESC:
                this.hide();
                this.active=false;
                Event.stop(a);
                return;
            case Event.KEY_LEFT:case Event.KEY_RIGHT:
                return;
            case Event.KEY_UP:
                this.markPrevious();
                this.render();
                Event.stop(a);
                return;
            case Event.KEY_DOWN:
                this.markNext();
                this.render();
                Event.stop(a);
                return
                }
            }else{
    if(a.keyCode==Event.KEY_TAB||a.keyCode==Event.KEY_RETURN||(Prototype.Browser.WebKit>0&&a.keyCode==0)){
        return
    }
}
this.changed=true;
this.hasFocus=true;
if(this.observer){
    clearTimeout(this.observer)
    }
    this.observer=setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000)
},
activate:function(){
    this.changed=false;
    this.hasFocus=true;
    this.getUpdatedChoices()
    },
onHover:function(b){
    var a=Event.findElement(b,"LI");
    if(this.index!=a.autocompleteIndex){
        this.index=a.autocompleteIndex;
        this.render()
        }
        Event.stop(b)
    },
onClick:function(b){
    var a=Event.findElement(b,"LI");
    this.index=a.autocompleteIndex;
    this.selectEntry();
    this.hide()
    },
onBlur:function(a){
    setTimeout(this.hide.bind(this),250);
    this.hasFocus=false;
    this.active=false
    },
render:function(){
    if(this.entryCount>0){
        for(var a=0;a<this.entryCount;a++){
            this.index==a?Element.addClassName(this.getEntry(a),"selected"):Element.removeClassName(this.getEntry(a),"selected")
            }
            if(this.hasFocus){
            this.show();
            this.active=true
            }
        }else{
    this.active=false;
    this.hide()
    }
},
markPrevious:function(){
    if(this.index>0){
        this.index--
    }else{
        this.index=this.entryCount-1
        }
        this.getEntry(this.index).scrollIntoView(true)
    },
markNext:function(){
    if(this.index<this.entryCount-1){
        this.index++
    }else{
        this.index=0
        }
        this.getEntry(this.index).scrollIntoView(false)
    },
getEntry:function(a){
    return this.update.firstChild.childNodes[a]
    },
getCurrentEntry:function(){
    return this.getEntry(this.index)
    },
selectEntry:function(){
    this.active=false;
    this.updateElement(this.getCurrentEntry())
    },
updateElement:function(g){
    if(this.options.updateElement){
        this.options.updateElement(g);
        return
    }
    var d="";
    if(this.options.select){
        var a=$(g).select("."+this.options.select)||[];
        if(a.length>0){
            d=Element.collectTextNodes(a[0],this.options.select)
            }
        }else{
    d=Element.collectTextNodesIgnoreClass(g,"informal")
    }
    var c=this.getTokenBounds();
if(c[0]!=-1){
    var f=this.element.value.substr(0,c[0]);
    var b=this.element.value.substr(c[0]).match(/^\s+/);
    if(b){
        f+=b[0]
        }
        this.element.value=f+d+this.element.value.substr(c[1])
    }else{
    this.element.value=d
    }
    this.oldElementValue=this.element.value;
this.element.focus();
if(this.options.afterUpdateElement){
    this.options.afterUpdateElement(this.element,g)
    }
},
updateChoices:function(c){
    if(!this.changed&&this.hasFocus){
        this.update.innerHTML=c;
        Element.cleanWhitespace(this.update);
        Element.cleanWhitespace(this.update.down());
        if(this.update.firstChild&&this.update.down().childNodes){
            this.entryCount=this.update.down().childNodes.length;
            for(var a=0;a<this.entryCount;a++){
                var b=this.getEntry(a);
                b.autocompleteIndex=a;
                this.addObservers(b)
                }
            }else{
        this.entryCount=0
        }
        this.stopIndicator();
    this.index=0;
    if(this.entryCount==1&&this.options.autoSelect){
        this.selectEntry();
        this.hide()
        }else{
        this.render()
        }
    }
},
addObservers:function(a){
    Event.observe(a,"mouseover",this.onHover.bindAsEventListener(this));
    Event.observe(a,"click",this.onClick.bindAsEventListener(this))
    },
onObserverEvent:function(){
    this.changed=false;
    this.tokenBounds=null;
    if(this.getToken().length>=this.options.minChars){
        this.getUpdatedChoices()
        }else{
        this.active=false;
        this.hide()
        }
        this.oldElementValue=this.element.value
    },
getToken:function(){
    var a=this.getTokenBounds();
    return this.element.value.substring(a[0],a[1]).strip()
    },
getTokenBounds:function(){
    if(null!=this.tokenBounds){
        return this.tokenBounds
        }
        var f=this.element.value;
    if(f.strip().empty()){
        return[-1,0]
        }
        var g=arguments.callee.getFirstDifferencePos(f,this.oldElementValue);
    var j=(g==this.oldElementValue.length?1:0);
    var d=-1,c=f.length;
    var h;
    for(var b=0,a=this.options.tokens.length;b<a;++b){
        h=f.lastIndexOf(this.options.tokens[b],g+j-1);
        if(h>d){
            d=h
            }
            h=f.indexOf(this.options.tokens[b],g+j);
        if(-1!=h&&h<c){
            c=h
            }
        }
    return(this.tokenBounds=[d+1,c])
}
});
Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos=function(c,a){
    var d=Math.min(c.length,a.length);
    for(var b=0;b<d;++b){
        if(c[b]!=a[b]){
            return b
            }
        }
    return d
};

Ajax.Autocompleter=Class.create(Autocompleter.Base,{
    initialize:function(c,d,b,a){
        this.baseInitialize(c,d,a);
        this.options.asynchronous=true;
        this.options.onComplete=this.onComplete.bind(this);
        this.options.defaultParams=this.options.parameters||null;
        this.url=b
        },
    getUpdatedChoices:function(){
        this.startIndicator();
        var a=encodeURIComponent(this.options.paramName)+"="+encodeURIComponent(this.getToken());
        this.options.parameters=this.options.callback?this.options.callback(this.element,a):a;
        if(this.options.defaultParams){
            this.options.parameters+="&"+this.options.defaultParams
            }
            new Ajax.Request(this.url,this.options)
        },
    onComplete:function(a){
        this.updateChoices(a.responseText)
        }
    });
Autocompleter.Local=Class.create(Autocompleter.Base,{
    initialize:function(b,d,c,a){
        this.baseInitialize(b,d,a);
        this.options.array=c
        },
    getUpdatedChoices:function(){
        this.updateChoices(this.options.selector(this))
        },
    setOptions:function(a){
        this.options=Object.extend({
            choices:10,
            partialSearch:true,
            partialChars:2,
            ignoreCase:true,
            fullSearch:false,
            selector:function(b){
                var d=[];
                var c=[];
                var j=b.getToken();
                var h=0;
                for(var f=0;f<b.options.array.length&&d.length<b.options.choices;f++){
                    var g=b.options.array[f];
                    var k=b.options.ignoreCase?g.toLowerCase().indexOf(j.toLowerCase()):g.indexOf(j);
                    while(k!=-1){
                        if(k==0&&g.length!=j.length){
                            d.push("<li><strong>"+g.substr(0,j.length)+"</strong>"+g.substr(j.length)+"</li>");
                            break
                        }else{
                            if(j.length>=b.options.partialChars&&b.options.partialSearch&&k!=-1){
                                if(b.options.fullSearch||/\s/.test(g.substr(k-1,1))){
                                    c.push("<li>"+g.substr(0,k)+"<strong>"+g.substr(k,j.length)+"</strong>"+g.substr(k+j.length)+"</li>");
                                    break
                                }
                            }
                        }
                    k=b.options.ignoreCase?g.toLowerCase().indexOf(j.toLowerCase(),k+1):g.indexOf(j,k+1)
                    }
                }
            if(c.length){
            d=d.concat(c.slice(0,b.options.choices-d.length))
            }
            return"<ul>"+d.join("")+"</ul>"
        }
    },a||{})
}
});
Field.scrollFreeActivate=function(a){
    setTimeout(function(){
        Field.activate(a)
        },1)
    };

Ajax.InPlaceEditor=Class.create({
    initialize:function(c,b,a){
        this.url=b;
        this.element=c=$(c);
        this.prepareOptions();
        this._controls={};

        arguments.callee.dealWithDeprecatedOptions(a);
        Object.extend(this.options,a||{});
        if(!this.options.formId&&this.element.id){
            this.options.formId=this.element.id+"-inplaceeditor";
            if($(this.options.formId)){
                this.options.formId=""
                }
            }
        if(this.options.externalControl){
        this.options.externalControl=$(this.options.externalControl)
        }
        if(!this.options.externalControl){
        this.options.externalControlOnly=false
        }
        this._originalBackground=this.element.getStyle("background-color")||"transparent";
    this.element.title=this.options.clickToEditText;
    this._boundCancelHandler=this.handleFormCancellation.bind(this);
    this._boundComplete=(this.options.onComplete||Prototype.emptyFunction).bind(this);
    this._boundFailureHandler=this.handleAJAXFailure.bind(this);
    this._boundSubmitHandler=this.handleFormSubmission.bind(this);
    this._boundWrapperHandler=this.wrapUp.bind(this);
    this.registerListeners()
    },
checkForEscapeOrReturn:function(a){
    if(!this._editing||a.ctrlKey||a.altKey||a.shiftKey){
        return
    }
    if(Event.KEY_ESC==a.keyCode){
        this.handleFormCancellation(a)
        }else{
        if(Event.KEY_RETURN==a.keyCode){
            this.handleFormSubmission(a)
            }
        }
},
createControl:function(h,c,b){
    var f=this.options[h+"Control"];
    var g=this.options[h+"Text"];
    if("button"==f){
        var a=document.createElement("input");
        a.type="submit";
        a.value=g;
        a.className="editor_"+h+"_button";
        if("cancel"==h){
            a.onclick=this._boundCancelHandler
            }
            this._form.appendChild(a);
        this._controls[h]=a
        }else{
        if("link"==f){
            var d=document.createElement("a");
            d.href="#";
            d.appendChild(document.createTextNode(g));
            d.onclick="cancel"==h?this._boundCancelHandler:this._boundSubmitHandler;
            d.className="editor_"+h+"_link";
            if(b){
                d.className+=" "+b
                }
                this._form.appendChild(d);
            this._controls[h]=d
            }
        }
},
createEditField:function(){
    var c=(this.options.loadTextURL?this.options.loadingText:this.getText());
    var b;
    if(1>=this.options.rows&&!/\r|\n/.test(this.getText())){
        b=document.createElement("input");
        b.type="text";
        var a=this.options.size||this.options.cols||0;
        if(0<a){
            b.size=a
            }
        }else{
    b=document.createElement("textarea");
    b.rows=(1>=this.options.rows?this.options.autoRows:this.options.rows);
    b.cols=this.options.cols||40
    }
    b.name=this.options.paramName;
b.value=c;
b.className="editor_field";
if(this.options.submitOnBlur){
    b.onblur=this._boundSubmitHandler
    }
    this._controls.editor=b;
if(this.options.loadTextURL){
    this.loadExternalText()
    }
    this._form.appendChild(this._controls.editor)
},
createForm:function(){
    var b=this;
    function a(d,f){
        var c=b.options["text"+d+"Controls"];
        if(!c||f===false){
            return
        }
        b._form.appendChild(document.createTextNode(c))
        }
        this._form=$(document.createElement("form"));
    this._form.id=this.options.formId;
    this._form.addClassName(this.options.formClassName);
    this._form.onsubmit=this._boundSubmitHandler;
    this.createEditField();
    if("textarea"==this._controls.editor.tagName.toLowerCase()){
        this._form.appendChild(document.createElement("br"))
        }
        if(this.options.onFormCustomization){
        this.options.onFormCustomization(this,this._form)
        }
        a("Before",this.options.okControl||this.options.cancelControl);
    this.createControl("ok",this._boundSubmitHandler);
    a("Between",this.options.okControl&&this.options.cancelControl);
    this.createControl("cancel",this._boundCancelHandler,"editor_cancel");
    a("After",this.options.okControl||this.options.cancelControl)
    },
destroy:function(){
    if(this._oldInnerHTML){
        this.element.innerHTML=this._oldInnerHTML
        }
        this.leaveEditMode();
    this.unregisterListeners()
    },
enterEditMode:function(a){
    if(this._saving||this._editing){
        return
    }
    this._editing=true;
    this.triggerCallback("onEnterEditMode");
    if(this.options.externalControl){
        this.options.externalControl.hide()
        }
        this.element.hide();
    this.createForm();
    this.element.parentNode.insertBefore(this._form,this.element);
    if(!this.options.loadTextURL){
        this.postProcessEditField()
        }
        if(a){
        Event.stop(a)
        }
    },
enterHover:function(a){
    if(this.options.hoverClassName){
        this.element.addClassName(this.options.hoverClassName)
        }
        if(this._saving){
        return
    }
    this.triggerCallback("onEnterHover")
    },
getText:function(){
    return this.element.innerHTML.unescapeHTML()
    },
handleAJAXFailure:function(a){
    this.triggerCallback("onFailure",a);
    if(this._oldInnerHTML){
        this.element.innerHTML=this._oldInnerHTML;
        this._oldInnerHTML=null
        }
    },
handleFormCancellation:function(a){
    this.wrapUp();
    if(a){
        Event.stop(a)
        }
    },
handleFormSubmission:function(d){
    var b=this._form;
    var c=$F(this._controls.editor);
    this.prepareSubmission();
    var f=this.options.callback(b,c)||"";
    if(Object.isString(f)){
        f=f.toQueryParams()
        }
        f.editorId=this.element.id;
    if(this.options.htmlResponse){
        var a=Object.extend({
            evalScripts:true
        },this.options.ajaxOptions);
        Object.extend(a,{
            parameters:f,
            onComplete:this._boundWrapperHandler,
            onFailure:this._boundFailureHandler
            });
        new Ajax.Updater({
            success:this.element
            },this.url,a)
        }else{
        var a=Object.extend({
            method:"get"
        },this.options.ajaxOptions);
        Object.extend(a,{
            parameters:f,
            onComplete:this._boundWrapperHandler,
            onFailure:this._boundFailureHandler
            });
        new Ajax.Request(this.url,a)
        }
        if(d){
        Event.stop(d)
        }
    },
leaveEditMode:function(){
    this.element.removeClassName(this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor=this._originalBackground;
    this.element.show();
    if(this.options.externalControl){
        this.options.externalControl.show()
        }
        this._saving=false;
    this._editing=false;
    this._oldInnerHTML=null;
    this.triggerCallback("onLeaveEditMode")
    },
leaveHover:function(a){
    if(this.options.hoverClassName){
        this.element.removeClassName(this.options.hoverClassName)
        }
        if(this._saving){
        return
    }
    this.triggerCallback("onLeaveHover")
    },
loadExternalText:function(){
    this._form.addClassName(this.options.loadingClassName);
    this._controls.editor.disabled=true;
    var a=Object.extend({
        method:"get"
    },this.options.ajaxOptions);
    Object.extend(a,{
        parameters:"editorId="+encodeURIComponent(this.element.id),
        onComplete:Prototype.emptyFunction,
        onSuccess:function(c){
            this._form.removeClassName(this.options.loadingClassName);
            var b=c.responseText;
            if(this.options.stripLoadedTextTags){
                b=b.stripTags()
                }
                this._controls.editor.value=b;
            this._controls.editor.disabled=false;
            this.postProcessEditField()
            }.bind(this),
        onFailure:this._boundFailureHandler
        });
    new Ajax.Request(this.options.loadTextURL,a)
    },
postProcessEditField:function(){
    var a=this.options.fieldPostCreation;
    if(a){
        $(this._controls.editor)["focus"==a?"focus":"activate"]()
        }
    },
prepareOptions:function(){
    this.options=Object.clone(Ajax.InPlaceEditor.DefaultOptions);
    Object.extend(this.options,Ajax.InPlaceEditor.DefaultCallbacks);
    [this._extraDefaultOptions].flatten().compact().each(function(a){
        Object.extend(this.options,a)
        }.bind(this))
    },
prepareSubmission:function(){
    this._saving=true;
    this.removeForm();
    this.leaveHover();
    this.showSaving()
    },
registerListeners:function(){
    this._listeners={};

    var a;
    $H(Ajax.InPlaceEditor.Listeners).each(function(b){
        a=this[b.value].bind(this);
        this._listeners[b.key]=a;
        if(!this.options.externalControlOnly){
            this.element.observe(b.key,a)
            }
            if(this.options.externalControl){
            this.options.externalControl.observe(b.key,a)
            }
        }.bind(this))
},
removeForm:function(){
    if(!this._form){
        return
    }
    this._form.remove();
    this._form=null;
    this._controls={}
},
showSaving:function(){
    this._oldInnerHTML=this.element.innerHTML;
    this.element.innerHTML=this.options.savingText;
    this.element.addClassName(this.options.savingClassName);
    this.element.style.backgroundColor=this._originalBackground;
    this.element.show()
    },
triggerCallback:function(b,a){
    if("function"==typeof this.options[b]){
        this.options[b](this,a)
        }
    },
unregisterListeners:function(){
    $H(this._listeners).each(function(a){
        if(!this.options.externalControlOnly){
            this.element.stopObserving(a.key,a.value)
            }
            if(this.options.externalControl){
            this.options.externalControl.stopObserving(a.key,a.value)
            }
        }.bind(this))
},
wrapUp:function(a){
    this.leaveEditMode();
    this._boundComplete(a,this.element)
    }
});
Object.extend(Ajax.InPlaceEditor.prototype,{
    dispose:Ajax.InPlaceEditor.prototype.destroy
    });
Ajax.InPlaceCollectionEditor=Class.create(Ajax.InPlaceEditor,{
    initialize:function($super,c,b,a){
        this._extraDefaultOptions=Ajax.InPlaceCollectionEditor.DefaultOptions;
        $super(c,b,a)
        },
    createEditField:function(){
        var a=document.createElement("select");
        a.name=this.options.paramName;
        a.size=1;
        this._controls.editor=a;
        this._collection=this.options.collection||[];
        if(this.options.loadCollectionURL){
            this.loadCollection()
            }else{
            this.checkForExternalText()
            }
            this._form.appendChild(this._controls.editor)
        },
    loadCollection:function(){
        this._form.addClassName(this.options.loadingClassName);
        this.showLoadingText(this.options.loadingCollectionText);
        var options=Object.extend({
            method:"get"
        },this.options.ajaxOptions);
        Object.extend(options,{
            parameters:"editorId="+encodeURIComponent(this.element.id),
            onComplete:Prototype.emptyFunction,
            onSuccess:function(transport){
                var js=transport.responseText.strip();
                if(!/^\[.*\]$/.test(js)){
                    throw ("Server returned an invalid collection representation.")
                    }
                    this._collection=eval(js);
                this.checkForExternalText()
                }.bind(this),
            onFailure:this.onFailure
            });
        new Ajax.Request(this.options.loadCollectionURL,options)
        },
    showLoadingText:function(b){
        this._controls.editor.disabled=true;
        var a=this._controls.editor.firstChild;
        if(!a){
            a=document.createElement("option");
            a.value="";
            this._controls.editor.appendChild(a);
            a.selected=true
            }
            a.update((b||"").stripScripts().stripTags())
        },
    checkForExternalText:function(){
        this._text=this.getText();
        if(this.options.loadTextURL){
            this.loadExternalText()
            }else{
            this.buildOptionList()
            }
        },
loadExternalText:function(){
    this.showLoadingText(this.options.loadingText);
    var a=Object.extend({
        method:"get"
    },this.options.ajaxOptions);
    Object.extend(a,{
        parameters:"editorId="+encodeURIComponent(this.element.id),
        onComplete:Prototype.emptyFunction,
        onSuccess:function(b){
            this._text=b.responseText.strip();
            this.buildOptionList()
            }.bind(this),
        onFailure:this.onFailure
        });
    new Ajax.Request(this.options.loadTextURL,a)
    },
buildOptionList:function(){
    this._form.removeClassName(this.options.loadingClassName);
    this._collection=this._collection.map(function(d){
        return 2===d.length?d:[d,d].flatten()
        });
    var b=("value" in this.options)?this.options.value:this._text;
    var a=this._collection.any(function(d){
        return d[0]==b
        }.bind(this));
    this._controls.editor.update("");
    var c;
    this._collection.each(function(f,d){
        c=document.createElement("option");
        c.value=f[0];
        c.selected=a?f[0]==b:0==d;
        c.appendChild(document.createTextNode(f[1]));
        this._controls.editor.appendChild(c)
        }.bind(this));
    this._controls.editor.disabled=false;
    Field.scrollFreeActivate(this._controls.editor)
    }
});
Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions=function(a){
    if(!a){
        return
    }
    function b(c,d){
        if(c in a||d===undefined){
            return
        }
        a[c]=d
        }
        b("cancelControl",(a.cancelLink?"link":(a.cancelButton?"button":a.cancelLink==a.cancelButton==false?false:undefined)));
    b("okControl",(a.okLink?"link":(a.okButton?"button":a.okLink==a.okButton==false?false:undefined)));
    b("highlightColor",a.highlightcolor);
    b("highlightEndColor",a.highlightendcolor)
    };

Object.extend(Ajax.InPlaceEditor,{
    DefaultOptions:{
        ajaxOptions:{},
        autoRows:3,
        cancelControl:"link",
        cancelText:"cancel",
        clickToEditText:"Click to edit",
        externalControl:null,
        externalControlOnly:false,
        fieldPostCreation:"activate",
        formClassName:"inplaceeditor-form",
        formId:null,
        highlightColor:"#ffff99",
        highlightEndColor:"#ffffff",
        hoverClassName:"",
        htmlResponse:true,
        loadingClassName:"inplaceeditor-loading",
        loadingText:"Loading...",
        okControl:"button",
        okText:"ok",
        paramName:"value",
        rows:1,
        savingClassName:"inplaceeditor-saving",
        savingText:"Saving...",
        size:0,
        stripLoadedTextTags:false,
        submitOnBlur:false,
        textAfterControls:"",
        textBeforeControls:"",
        textBetweenControls:""
    },
    DefaultCallbacks:{
        callback:function(a){
            return Form.serialize(a)
            },
        onComplete:function(b,a){
            new Effect.Highlight(a,{
                startcolor:this.options.highlightColor,
                keepBackgroundImage:true
            })
            },
        onEnterEditMode:null,
        onEnterHover:function(a){
            a.element.style.backgroundColor=a.options.highlightColor;
            if(a._effect){
                a._effect.cancel()
                }
            },
    onFailure:function(b,a){
        alert("Error communication with the server: "+b.responseText.stripTags())
        },
    onFormCustomization:null,
    onLeaveEditMode:null,
    onLeaveHover:function(a){
        a._effect=new Effect.Highlight(a.element,{
            startcolor:a.options.highlightColor,
            endcolor:a.options.highlightEndColor,
            restorecolor:a._originalBackground,
            keepBackgroundImage:true
        })
        }
    },
Listeners:{
    click:"enterEditMode",
    keydown:"checkForEscapeOrReturn",
    mouseover:"enterHover",
    mouseout:"leaveHover"
}
});
Ajax.InPlaceCollectionEditor.DefaultOptions={
    loadingCollectionText:"Loading options..."
};

Form.Element.DelayedObserver=Class.create({
    initialize:function(b,a,c){
        this.delay=a||0.5;
        this.element=$(b);
        this.callback=c;
        this.timer=null;
        this.lastValue=$F(this.element);
        Event.observe(this.element,"keyup",this.delayedListener.bindAsEventListener(this))
        },
    delayedListener:function(a){
        if(this.lastValue==$F(this.element)){
            return
        }
        if(this.timer){
            clearTimeout(this.timer)
            }
            this.timer=setTimeout(this.onTimerEvent.bind(this),this.delay*1000);
        this.lastValue=$F(this.element)
        },
    onTimerEvent:function(){
        this.timer=null;
        this.callback(this.element,$F(this.element))
        }
    });
if(!Control){
    var Control={}
}
Control.Slider=Class.create({
    initialize:function(d,a,b){
        var c=this;
        if(Object.isArray(d)){
            this.handles=d.collect(function(f){
                return $(f)
                })
            }else{
            this.handles=[$(d)]
            }
            this.track=$(a);
        this.options=b||{};

        this.axis=this.options.axis||"horizontal";
        this.increment=this.options.increment||1;
        this.step=parseInt(this.options.step||"1");
        this.range=this.options.range||$R(0,1);
        this.value=0;
        this.values=this.handles.map(function(){
            return 0
            });
        this.spans=this.options.spans?this.options.spans.map(function(f){
            return $(f)
            }):false;
        this.options.startSpan=$(this.options.startSpan||null);
        this.options.endSpan=$(this.options.endSpan||null);
        this.restricted=this.options.restricted||false;
        this.maximum=this.options.maximum||this.range.end;
        this.minimum=this.options.minimum||this.range.start;
        this.alignX=parseInt(this.options.alignX||"0");
        this.alignY=parseInt(this.options.alignY||"0");
        this.trackLength=this.maximumOffset()-this.minimumOffset();
        this.handleLength=this.isVertical()?(this.handles[0].offsetHeight!=0?this.handles[0].offsetHeight:this.handles[0].style.height.replace(/px$/,"")):(this.handles[0].offsetWidth!=0?this.handles[0].offsetWidth:this.handles[0].style.width.replace(/px$/,""));
        this.active=false;
        this.dragging=false;
        this.disabled=false;
        if(this.options.disabled){
            this.setDisabled()
            }
            this.allowedValues=this.options.values?this.options.values.sortBy(Prototype.K):false;
        if(this.allowedValues){
            this.minimum=this.allowedValues.min();
            this.maximum=this.allowedValues.max()
            }
            this.eventMouseDown=this.startDrag.bindAsEventListener(this);
        this.eventMouseUp=this.endDrag.bindAsEventListener(this);
        this.eventMouseMove=this.update.bindAsEventListener(this);
        this.handles.each(function(g,f){
            f=c.handles.length-1-f;
            c.setValue(parseFloat((Object.isArray(c.options.sliderValue)?c.options.sliderValue[f]:c.options.sliderValue)||c.range.start),f);
            g.makePositioned().observe("mousedown",c.eventMouseDown)
            });
        this.track.observe("mousedown",this.eventMouseDown);
        document.observe("mouseup",this.eventMouseUp);
        document.observe("mousemove",this.eventMouseMove);
        this.initialized=true
        },
    dispose:function(){
        var a=this;
        Event.stopObserving(this.track,"mousedown",this.eventMouseDown);
        Event.stopObserving(document,"mouseup",this.eventMouseUp);
        Event.stopObserving(document,"mousemove",this.eventMouseMove);
        this.handles.each(function(b){
            Event.stopObserving(b,"mousedown",a.eventMouseDown)
            })
        },
    setDisabled:function(){
        this.disabled=true
        },
    setEnabled:function(){
        this.disabled=false
        },
    getNearestValue:function(a){
        if(this.allowedValues){
            if(a>=this.allowedValues.max()){
                return(this.allowedValues.max())
                }
                if(a<=this.allowedValues.min()){
                return(this.allowedValues.min())
                }
                var c=Math.abs(this.allowedValues[0]-a);
            var b=this.allowedValues[0];
            this.allowedValues.each(function(d){
                var f=Math.abs(d-a);
                if(f<=c){
                    b=d;
                    c=f
                    }
                });
        return b
        }
        if(a>this.range.end){
        return this.range.end
        }
        if(a<this.range.start){
        return this.range.start
        }
        return a
    },
setValue:function(b,a){
    if(!this.active){
        this.activeHandleIdx=a||0;
        this.activeHandle=this.handles[this.activeHandleIdx];
        this.updateStyles()
        }
        a=a||this.activeHandleIdx||0;
    if(this.initialized&&this.restricted){
        if((a>0)&&(b<this.values[a-1])){
            b=this.values[a-1]
            }
            if((a<(this.handles.length-1))&&(b>this.values[a+1])){
            b=this.values[a+1]
            }
        }
    b=this.getNearestValue(b);
    this.values[a]=b;
    this.value=this.values[0];
    this.handles[a].style[this.isVertical()?"top":"left"]=this.translateToPx(b);
    this.drawSpans();
    if(!this.dragging||!this.event){
    this.updateFinished()
    }
},
setValueBy:function(b,a){
    this.setValue(this.values[a||this.activeHandleIdx||0]+b,a||this.activeHandleIdx||0)
    },
translateToPx:function(a){
    return Math.round(((this.trackLength-this.handleLength)/(this.range.end-this.range.start))*(a-this.range.start))+"px"
    },
translateToValue:function(a){
    return((a/(this.trackLength-this.handleLength)*(this.range.end-this.range.start))+this.range.start)
    },
getRange:function(b){
    var a=this.values.sortBy(Prototype.K);
    b=b||0;
    return $R(a[b],a[b+1])
    },
minimumOffset:function(){
    return(this.isVertical()?this.alignY:this.alignX)
    },
maximumOffset:function(){
    return(this.isVertical()?(this.track.offsetHeight!=0?this.track.offsetHeight:this.track.style.height.replace(/px$/,""))-this.alignY:(this.track.offsetWidth!=0?this.track.offsetWidth:this.track.style.width.replace(/px$/,""))-this.alignX)
    },
isVertical:function(){
    return(this.axis=="vertical")
    },
drawSpans:function(){
    var a=this;
    if(this.spans){
        $R(0,this.spans.length-1).each(function(b){
            a.setSpan(a.spans[b],a.getRange(b))
            })
        }
        if(this.options.startSpan){
        this.setSpan(this.options.startSpan,$R(0,this.values.length>1?this.getRange(0).min():this.value))
        }
        if(this.options.endSpan){
        this.setSpan(this.options.endSpan,$R(this.values.length>1?this.getRange(this.spans.length-1).max():this.value,this.maximum))
        }
    },
setSpan:function(b,a){
    if(this.isVertical()){
        b.style.top=this.translateToPx(a.start);
        b.style.height=this.translateToPx(a.end-a.start+this.range.start)
        }else{
        b.style.left=this.translateToPx(a.start);
        b.style.width=this.translateToPx(a.end-a.start+this.range.start)
        }
    },
updateStyles:function(){
    this.handles.each(function(a){
        Element.removeClassName(a,"selected")
        });
    Element.addClassName(this.activeHandle,"selected")
    },
startDrag:function(c){
    if(Event.isLeftClick(c)){
        if(!this.disabled){
            this.active=true;
            var d=Event.element(c);
            var f=[Event.pointerX(c),Event.pointerY(c)];
            var a=d;
            if(a==this.track){
                var b=Position.cumulativeOffset(this.track);
                this.event=c;
                this.setValue(this.translateToValue((this.isVertical()?f[1]-b[1]:f[0]-b[0])-(this.handleLength/2)));
                var b=Position.cumulativeOffset(this.activeHandle);
                this.offsetX=(f[0]-b[0]);
                this.offsetY=(f[1]-b[1])
                }else{
                while((this.handles.indexOf(d)==-1)&&d.parentNode){
                    d=d.parentNode
                    }
                    if(this.handles.indexOf(d)!=-1){
                    this.activeHandle=d;
                    this.activeHandleIdx=this.handles.indexOf(this.activeHandle);
                    this.updateStyles();
                    var b=Position.cumulativeOffset(this.activeHandle);
                    this.offsetX=(f[0]-b[0]);
                    this.offsetY=(f[1]-b[1])
                    }
                }
        }
    Event.stop(c)
}
},
update:function(a){
    if(this.active){
        if(!this.dragging){
            this.dragging=true
            }
            this.draw(a);
        if(Prototype.Browser.WebKit){
            window.scrollBy(0,0)
            }
            Event.stop(a)
        }
    },
draw:function(b){
    var c=[Event.pointerX(b),Event.pointerY(b)];
    var a=Position.cumulativeOffset(this.track);
    c[0]-=this.offsetX+a[0];
    c[1]-=this.offsetY+a[1];
    this.event=b;
    this.setValue(this.translateToValue(this.isVertical()?c[1]:c[0]));
    if(this.initialized&&this.options.onSlide){
        this.options.onSlide(this.values.length>1?this.values:this.value,this)
        }
    },
endDrag:function(a){
    if(this.active&&this.dragging){
        this.finishDrag(a,true);
        Event.stop(a)
        }
        this.active=false;
    this.dragging=false
    },
finishDrag:function(a,b){
    this.active=false;
    this.dragging=false;
    this.updateFinished()
    },
updateFinished:function(){
    if(this.initialized&&this.options.onChange){
        this.options.onChange(this.values.length>1?this.values:this.value,this)
        }
        this.event=null
    }
});
Sound={
    tracks:{},
    _enabled:true,
    template:new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
    enable:function(){
        Sound._enabled=true
        },
    disable:function(){
        Sound._enabled=false
        },
    play:function(b){
        if(!Sound._enabled){
            return
        }
        var a=Object.extend({
            track:"global",
            url:b,
            replace:false
        },arguments[1]||{});
        if(a.replace&&this.tracks[a.track]){
            $R(0,this.tracks[a.track].id).each(function(d){
                var c=$("sound_"+a.track+"_"+d);
                c.Stop&&c.Stop();
                c.remove()
                });
            this.tracks[a.track]=null
            }
            if(!this.tracks[a.track]){
            this.tracks[a.track]={
                id:0
            }
        }else{
        this.tracks[a.track].id++
    }
    a.id=this.tracks[a.track].id;
    $$("body")[0].insert(Prototype.Browser.IE?new Element("bgsound",{
        id:"sound_"+a.track+"_"+a.id,
        src:a.url,
        loop:1,
        autostart:true
    }):Sound.template.evaluate(a))
    }
};

if(Prototype.Browser.Gecko&&navigator.userAgent.indexOf("Win")>0){
    if(navigator.plugins&&$A(navigator.plugins).detect(function(a){
        return a.name.indexOf("QuickTime")!=-1
        })){
        Sound.template=new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>')
            }else{
        Sound.play=function(){}
        }
    }
function ImageResize(c,o,m,g,f,d,r,u,n){
    c=$(c);
    var h=c.getOffsetParent();
    o=(typeof o!="undefined")?o:400;
    m=(typeof m!="undefined")?m:400;
    imageX=(typeof g!="undefined")?$(g):$("imagex");
    imageY=(typeof f!="undefined")?$(f):$("imagey");
    imageSize=(typeof d!="undefined")?$(d):$("imagesize");
    u=(typeof u!="undefined")?$(u):$("scale-handle");
    n=(typeof n!="undefined")?$(slider):$("scale-track");
    r=(typeof r!="undefined")?r:true;
    var b,l;
    var s,q;
    var x,w;
    this.slider=null;
    slideValueX=0.5;
    slideValueY=0.5;
    this.init=function(){
        h.observe("mousedown",k);
        c.onmousedown=c.onmousemove=function(){
            return false
            };

        h.setStyle({
            width:o+"px",
            height:m+"px"
            });
        if(!r){
            return false
            }
            b={
            width:1000,
            height:600
        };

        var y=Math.min(b.width,b.height);
        var B=Math.min(o,m);
        var z=B/y;
        var A=y/B;
        l={
            width:Math.ceil(b.width*z),
            height:Math.ceil(b.height*z)
            };

        c.setStyle({
            width:l.width+"px",
            height:l.height+"px",
            left:"0px",
            top:"0px"
        });
        imageSize.writeAttribute("value",l.width+"x"+l.height);
        if(this.slider==null){
            this.slider=new Control.Slider(u,n,{
                range:$R(1,A),
                sliderValue:1,
                onChange:v,
                onSlide:a
            })
            }
        };

function k(y){
    s=y.pointerX();
    q=y.pointerY();
    $(document.body).observe("mousemove",p);
    $(document.body).observe("mouseup",t)
    }
    function t(z){
    var y=c.getDimensions();
    imageX.writeAttribute("value",x);
    imageY.writeAttribute("value",w);
    $(document.body).stopObserving("mousemove",p);
    $(document.body).stopObserving("mouseup",t);
    j()
    }
    function p(C){
    var B=c.getDimensions();
    var A=C.pointerX()-s;
    var E=C.pointerY()-q;
    var z=parseInt(imageX.readAttribute("value"),10)+A;
    var D=parseInt(imageY.readAttribute("value"),10)+E;
    z=x=(z>=0)?0:(z+B.width<o)?(-1*B.width+o):z;
    D=w=(D>=0)?0:(D+B.height<m)?(-1*B.height+m):D;
    c.setStyle({
        left:z+"px",
        top:D+"px"
        })
    }
    function v(z){
    a(z);
    var y=c.getDimensions();
    imageSize.writeAttribute("value",y.width+"x"+y.height);
    imageX.writeAttribute("value",parseInt(c.getStyle("left"),10));
    imageY.writeAttribute("value",parseInt(c.getStyle("top"),10));
    j()
    }
    function a(G){
    var y=c.getDimensions();
    var C=Math.ceil(l.width*G);
    var z=Math.ceil(l.height*G);
    var B=y.width;
    var H=y.height;
    var A=parseInt(c.getStyle("left"),10);
    var E=parseInt(c.getStyle("top"),10);
    var F=o/2-slideValueX*C;
    if(F>0){
        F=0
        }
        if(C+F<o){
        F=o-C
        }
        var D=m/2-slideValueY*z;
    if(D>0){
        D=0
        }
        if(z+D<m){
        D=m-z
        }
        c.setStyle({
        width:C+"px",
        height:z+"px",
        left:F+"px",
        top:D+"px"
        })
    }
    function j(){
    var y=c.getDimensions();
    var A=parseInt(c.getStyle("left"),10);
    var z=parseInt(c.getStyle("top"),10);
    slideValueX=(o/2-A)/y.width;
    slideValueY=(m/2-z)/y.height
    }
    this.resetScale=function(){
    this.slider.setValue(1);
    v(1);
    j()
    };

this.init()
}
var Tooltip=Class.create({
    initialize:function(c,b){
        var a=Object.extend({
            start_effect:function(d){},
            end_effect:function(d){},
            zindex:1000,
            offset:{
                x:0,
                y:0
            },
            hook:{
                target:"topRight",
                tip:"topLeft"
            },
            trigger:false,
            DOM_location:false,
            className:false,
            delay:{
                start:0.1,
                end:0.1
            }
        },arguments[2]||{});
    this.target=$(c);
    this.tooltip=$(b);
    if(this.tooltip==null){
        this.tooltip=$(document.createElement("div"));
        document.body.appendChild(this.tooltip);
        this.tooltip.addClassName("tooltip");
        this.tooltip.appendChild(document.createTextNode(b))
        }
        this.options=a;
    this.event_target=this.options.trigger?$(this.options.trigger):this.target;
    if(this.options.className){
        this.tooltip.addClassName(this.options.className)
        }
        this.tooltip.hide();
    this.display=false;
    if(this.event_target){
        this.mouse_over=this.displayTooltip.bindAsEventListener(this);
        this.mouse_out=this.removeTooltip.bindAsEventListener(this);
        this.event_target.observe("mouseover",this.mouse_over);
        this.event_target.observe("mouseout",this.mouse_out)
        }
    },
displayTooltip:function(b){
    b.stop();
    if(this.display){
        clearTimeout(this.tooltiptimeout);
        return
    }
    if(this.options.delay.start){
        var a=this;
        this.timer_id=setTimeout(function(){
            a.timer_id=false;
            a.showTooltip(b)
            },this.options.delay.start*1000)
        }else{
        this.showTooltip(b)
        }
    },
showTooltip:function(a){
    this.display=true;
    position=this.positionTooltip(a);
    this.clone=this.tooltip.cloneNode(true);
    if(typeof tracker_addclick=="function"){
        tracker_addclick(this.clone)
        }
        parentId=this.options.DOM_location?$(this.options.DOM_location.parentId):this.target.parentNode;
    successorId=this.options.DOM_location?$(this.options.DOM_location.successorId):this.target;
    parentId.insertBefore(this.clone,successorId);
    this.clone.observe("mouseover",this.mouse_over);
    this.clone.observe("mouseout",this.mouse_out);
    this.clone.setStyle({
        position:"absolute",
        top:position.top+"px",
        left:position.left+"px",
        display:"inline",
        zIndex:this.options.zindex
        });
    if(this.options.start_effect){
        this.options.start_effect(this.clone)
        }
    },
positionTooltip:function(a){
    target_position=this.target.cumulativeOffset();
    tooltip_dimensions=this.tooltip.getDimensions();
    target_dimensions=this.target.getDimensions();
    this.positionModify(target_position,target_dimensions,this.options.hook.target,1);
    this.positionModify(target_position,tooltip_dimensions,this.options.hook.tip,-1);
    target_position.top+=this.options.offset.y;
    target_position.left+=this.options.offset.x;
    return target_position
    },
positionModify:function(a,c,b,d){
    if(b=="topRight"){
        a.left+=c.width*d
        }else{
        if(b=="topLeft"){}else{
            if(b=="bottomLeft"){
                a.top+=c.height*d
                }else{
                if(b=="bottomRight"){
                    a.top+=c.height*d;
                    a.left+=c.width*d
                    }else{
                    if(b=="topMid"){
                        a.left+=(c.width/2)*d
                        }else{
                        if(b=="leftMid"){
                            a.top+=(c.height/2)*d
                            }else{
                            if(b=="bottomMid"){
                                a.top+=c.height*d;
                                a.left+=(c.width/2)*d
                                }else{
                                if(b=="rightMid"){
                                    a.top+=(c.height/2)*d;
                                    a.left+=c.width*d
                                    }
                                }
                        }
                }
        }
}
}
}
},
removeTooltip:function(b){
    if(this.timer_id){
        clearTimeout(this.timer_id);
        this.timer_id=false;
        return
    }
    if(this.options.end_effect){
        this.options.end_effect(this.clone)
        }
        if(this.options.delay.end){
        var a=this;
        this.tooltiptimeout=setTimeout(function(){
            a.clearTooltip()
            },this.options.delay.end*1000)
        }else{
        this.clearTooltip()
        }
    },
clearTooltip:function(){
    this.clone.remove();
    this.clone=null;
    this.display=false
    },
destroy:function(){
    this.event_target.stopObserving("mouseover",this.mouse_over);
    this.event_target.stopObserving("mouseout",this.mouse_out);
    this.clearTooltip()
    }
});
function Menu(k,o,x,l,h,j,n,f,a,b,s,v,w,d,q,p,g,c,t,r,m,u){
    this.version="020320 [Menu; mm_menu.js]";
    this.type="Menu";
    this.menuWidth=o;
    this.menuItemHeight=x;
    this.fontSize=h;
    this.fontWeight="plain";
    this.fontFamily=l;
    this.fontColor=j;
    this.fontColorHilite=n;
    this.bgColor="#555555";
    this.menuBorder=1;
    this.menuBgOpaque=c;
    this.menuItemBorder=1;
    this.menuItemIndent=r;
    this.menuItemBgColor=f;
    this.menuItemVAlign=s;
    this.menuItemHAlign=b;
    this.menuItemPadding=v;
    this.menuItemSpacing=w;
    this.menuLiteBgColor="#ffffff";
    this.menuBorderBgColor="#777777";
    this.menuHiliteBgColor=a;
    this.menuContainerBgColor="#cccccc";
    this.childMenuIcon="arrows.gif";
    this.submenuXOffset=q;
    this.submenuYOffset=p;
    this.submenuRelativeToItem=g;
    this.vertical=t;
    this.items=new Array();
    this.actions=new Array();
    this.childMenus=new Array();
    this.hideOnMouseOut=true;
    this.hideTimeout=d;
    this.addMenuItem=addMenuItem;
    this.writeMenus=writeMenus;
    this.MM_showMenu=MM_showMenu;
    this.onMenuItemOver=onMenuItemOver;
    this.onMenuItemAction=onMenuItemAction;
    this.hideMenu=hideMenu;
    this.hideChildMenu=hideChildMenu;
    if(!window.menus){
        window.menus=new Array()
        }
        this.label=" "+k;
    window.menus[this.label]=this;
    window.menus[window.menus.length]=this;
    if(!window.activeMenus){
        window.activeMenus=new Array()
        }
    }
function addMenuItem(a,b){
    this.items[this.items.length]=a;
    this.actions[this.actions.length]=b
    }
    function FIND(a){
    if(window.mmIsOpera){
        return(document.getElementById(a))
        }
        if(document.all){
        return(document.all[a])
        }
        if(document.getElementById){
        return(document.getElementById(a))
        }
        return(false)
    }
    function writeMenus(C){
    if(window.triedToWriteMenus){
        return
    }
    var R=navigator.userAgent.toLowerCase();
    window.mmIsOpera=R.indexOf("opera")!=-1;
    if(!C&&document.layers){
        window.delayWriteMenus=this.writeMenus;
        var z=setTimeout("delayWriteMenus()",500);
        C=new Layer(100);
        clearTimeout(z)
        }else{
        if(document.all||document.hasChildNodes||window.mmIsOpera){
            document.writeln('<span id="menuContainer"></span>');
            C=FIND("menuContainer")
            }
        }
    window.mmHideMenuTimer=null;
if(!C){
    return
}
window.triedToWriteMenus=true;
C.isContainer=true;
C.menus=new Array();
for(var P=0;P<window.menus.length;P++){
    C.menus[P]=window.menus[P]
    }
    window.menus.length=0;
var t=0;
var p=0;
var j=0;
var m="";
var c=false;
var d="";
var S=0;
if(document.layers){
    c=true
    }
    for(var P=0;P<C.menus.length;P++,t++){
    var Q=C.menus[P];
    if(Q.bgImageUp||!Q.menuBgOpaque){
        Q.menuBorder=0;
        Q.menuItemBorder=0
        }
        if(c){
        var O=new Layer(100,C);
        var o=new Layer(100,O);
        o.top=Q.menuBorder;
        o.left=Q.menuBorder;
        var u=new Layer(100,o);
        u.top=Q.menuBorder;
        u.left=Q.menuBorder
        }else{
        m+='<div id="menuLayer'+t+'" style="position:absolute;z-index:10;left:10px;top:'+(P*100)+"px;visibility:hide;color:"+Q.menuBorderBgColor+';">\n  <div id="menuLite'+t+'" style="position:absolute;z-index:10;left:'+Q.menuBorder+"px;top:"+Q.menuBorder+'px;visibility:hide;" onmouseout="mouseoutMenu();">\n	 <div id="menuFg'+t+'" style="position:absolute;left:'+Q.menuBorder+"px;top:"+Q.menuBorder+'px;visibility:hide;">\n'
        }
        var F=P;
    for(var P=0;P<Q.items.length;P++){
        var w=Q.items[P];
        var E=false;
        var q=Q.fontSize+2*Q.menuItemPadding;
        if(w.label){
            w=w.label;
            E=true
            }
            Q.menuItemHeight=Q.menuItemHeight||q;
        var B="";
        if(Q.fontFamily!=""){
            B+="font-family:"+Q.fontFamily+";"
            }
            B+="font-weight:"+Q.fontWeight+";fontSize:"+Q.fontSize+"px;";
        if(Q.fontStyle){
            B+="font-style:"+Q.fontStyle+";"
            }
            if(document.all||window.mmIsOpera){
            B+="font-size:"+Q.fontSize+'px;" onmouseover="onMenuItemOver(null,this);" onclick="onMenuItemAction(null,this);'
            }else{
            if(!document.layers){
                B+="font-size:"+Q.fontSize+"px;"
                }
            }
        var N;
    if(c){
        var v=Q.menuWidth;
        if(Q.menuItemHAlign=="right"){
            v-=Q.menuItemPadding
            }
            N=new Layer(v,u)
        }
        var K=0;
    var f=P*Q.menuItemHeight;
    if(!Q.vertical){
        K=P*Q.menuWidth;
        f=0
        }
        var A='<div id="menuItem'+p+'" style="position:absolute;left:'+K+"px;top:"+f+"px;"+B+'">';
    var k="</div>";
    if(Q.bgImageUp){
        A='<div id="menuItem'+p+'" style="background:url('+Q.bgImageUp+");position:absolute;left:"+K+"px;top:"+f+"px;"+B+'">'
        }
        var h=0,j=0,L=0,a=0;
    h=1+Q.menuItemPadding+Q.menuItemIndent;
    L=h+Q.menuWidth-2*Q.menuItemPadding-Q.menuItemIndent;
    if(Q.menuItemVAlign=="top"){
        j=Q.menuItemPadding
        }
        if(Q.menuItemVAlign=="bottom"){
        j=Q.menuItemHeight-Q.fontSize-1-Q.menuItemPadding
        }
        if(Q.menuItemVAlign=="middle"){
        j=((Q.menuItemHeight/2)-(Q.fontSize/2)-1)
        }
        a=Q.menuItemHeight-2*Q.menuItemPadding;
    var J="position:absolute;left:"+h+"px;top:"+j+"px;";
    if(c){
        J+=B+"right:"+L+";bottom:"+a+";";
        A="";
        k=""
        }
        if(document.all&&!window.mmIsOpera){
        w='<div align="'+Q.menuItemHAlign+'">'+w+"</div>"
        }else{
        if(c){
            w='<div style="text-align:'+Q.menuItemHAlign+';">'+w+"</div>"
            }else{
            var g=null;
            if(Q.menuItemHAlign!="left"){
                if(window.mmIsOpera){
                    var H=Q.menuItemHAlign=="center"?-(Q.menuWidth-2*Q.menuItemPadding):(Q.menuWidth-6*Q.menuItemPadding);
                    g='<div id="menuItemHilite'+p+'Shim" style="position:absolute;top:1px;left:'+Q.menuItemPadding+"px;width:"+H+"px;text-align:"+Q.menuItemHAlign+';visibility:visible;">'+w+"</div>";
                    w='<div id="menuItemText'+p+'Shim" style="position:absolute;top:1px;left:'+Q.menuItemPadding+"px;width:"+H+"px;text-align:"+Q.menuItemHAlign+';visibility:visible;">'+w+"</div>"
                    }else{
                    g='<div id="menuItemHilite'+p+'Shim" style="position:absolute;top:1px;left:1px;right:-'+(h+Q.menuWidth-3*Q.menuItemPadding)+"px;text-align:"+Q.menuItemHAlign+';visibility:visible;">'+w+"</div>";
                    w='<div id="menuItemText'+p+'Shim" style="position:absolute;top:1px;left:1px;right:-'+(h+Q.menuWidth-3*Q.menuItemPadding)+"px;text-align:"+Q.menuItemHAlign+';visibility:visible;">'+w+"</div>"
                    }
                }else{
            g=null
            }
        }
    }
if(document.all&&!window.mmIsOpera){
    w='<div id="menuItemShim'+p+'" style="position:absolute;left:0px;top:0px;">'+w+"</div>"
    }
    var b='<div id="menuItemText'+p+'" style="'+J+"color:"+Q.fontColor+';">'+w+'&nbsp</div>\n<div id="menuItemHilite'+p+'" style="'+J+"color:"+Q.fontColorHilite+';visibility:hidden;">'+(g||w)+"&nbsp</div>";
if(E){
    m+=(A+b+'<div id="childMenu'+p+'" style="position:absolute;left:0px;top:3px;"><img src="'+Q.childMenuIcon+'"></div>\n'+k)
    }else{
    m+=(A+b+k)
    }
    if(c){
    N.document.open("text/html");
    N.document.writeln(m);
    N.document.close();
    m="";
    d+="-";
    S++;
    if(S>50){
        S=0;
        d=""
        }
        status=d
    }
    p++
}
if(c){
    var D=new Layer(100,u);
    D.visiblity="hidden";
    D.document.open("text/html");
    D.document.writeln("&nbsp;");
    D.document.close()
    }else{
    m+='	  <div id="focusItem'+t+'" style="position:absolute;left:0px;top:0px;visibility:hide;" onclick="onMenuItemAction(null,this);">&nbsp;</div>\n';
    m+="   </div>\n  </div>\n</div>\n"
    }
    P=F
}
if(document.layers){
    C.clip.width=window.innerWidth;
    C.clip.height=window.innerHeight;
    C.onmouseout=mouseoutMenu;
    C.menuContainerBgColor=this.menuContainerBgColor;
    for(var P=0;P<C.document.layers.length;P++){
        proto=C.menus[P];
        var Q=C.document.layers[P];
        C.menus[P].menuLayer=Q;
        C.menus[P].menuLayer.Menu=C.menus[P];
        C.menus[P].menuLayer.Menu.container=C;
        var u=Q.document.layers[0].document.layers[0];
        u.clip.width=proto.menuWidth||u.clip.width;
        u.clip.height=proto.menuHeight||u.clip.height;
        for(var M=0;M<u.document.layers.length-1;M++){
            var N=u.document.layers[M];
            N.Menu=C.menus[P];
            N.menuHiliteBgColor=proto.menuHiliteBgColor;
            N.document.bgColor=proto.menuItemBgColor;
            N.saveColor=proto.menuItemBgColor;
            N.onmouseover=proto.onMenuItemOver;
            N.onclick=proto.onMenuItemAction;
            N.mmaction=C.menus[P].actions[M];
            N.focusItem=u.document.layers[u.document.layers.length-1];
            N.clip.width=proto.menuWidth||u.clip.width;
            N.clip.height=proto.menuItemHeight||N.clip.height;
            if(M>0){
                if(N.Menu.vertical){
                    N.top=u.document.layers[M-1].top+u.document.layers[M-1].clip.height+proto.menuItemBorder+proto.menuItemSpacing
                    }else{
                    N.left=u.document.layers[M-1].left+u.document.layers[M-1].clip.width+proto.menuItemBorder+proto.menuItemSpacing
                    }
                }
            N.hilite=N.document.layers[1];
        if(proto.bgImageUp){
            N.background.src=proto.bgImageUp
            }
            N.document.layers[1].isHilite=true;
        if(N.document.layers.length>2){
            N.childMenu=C.menus[P].items[M].menuLayer;
            N.document.layers[2].left=N.clip.width-13;
            N.document.layers[2].top=(N.clip.height/2)-4;
            N.document.layers[2].clip.left+=3;
            N.Menu.childMenus[N.Menu.childMenus.length]=N.childMenu
            }
        }
        if(proto.menuBgOpaque){
        u.document.bgColor=proto.bgColor
        }
        if(proto.vertical){
        u.clip.width=N.clip.width+proto.menuBorder;
        u.clip.height=N.top+N.clip.height+proto.menuBorder
        }else{
        u.clip.height=N.clip.height+proto.menuBorder;
        u.clip.width=N.left+N.clip.width+proto.menuBorder;
        if(u.clip.width>window.innerWidth){
            u.clip.width=window.innerWidth
            }
        }
    var D=u.document.layers[M];
D.clip.width=u.clip.width;
D.Menu=N.Menu;
D.top=-30;
D.captureEvents(Event.MOUSEDOWN);
D.onmousedown=onMenuItemDown;
if(proto.menuBgOpaque){
    Q.document.bgColor=proto.menuBorderBgColor
    }
    var o=Q.document.layers[0];
if(proto.menuBgOpaque){
    o.document.bgColor=proto.menuLiteBgColor
    }
    o.clip.width=u.clip.width+1;
o.clip.height=u.clip.height+1;
Q.clip.width=u.clip.width+(proto.menuBorder*3);
Q.clip.height=u.clip.height+(proto.menuBorder*3)
}
}else{
    if((!document.all)&&(C.hasChildNodes)&&!window.mmIsOpera){
        C.innerHTML=m
        }else{
        C.document.open("text/html");
        C.document.writeln(m);
        C.document.close()
        }
        if(!FIND("menuLayer0")){
        return
    }
    var y=0;
    for(var F=0;F<C.menus.length;F++){
        var O=FIND("menuLayer"+F);
        C.menus[F].menuLayer="menuLayer"+F;
        O.Menu=C.menus[F];
        O.Menu.container="menuLayer"+F;
        O.style.zindex=10;
        var I=O.style;
        I.pixeltop=-3000;
        I.pixelleft=-3000;
        I.top="-3000px";
        I.left="-3000px";
        var Q=C.menus[F];
        Q.menuItemWidth=Q.menuWidth||Q.menuIEWidth||140;
        if(Q.menuBgOpaque){
            O.style.backgroundColor=Q.menuBorderBgColor
            }
            var j=0;
        var h=0;
        Q.menuItemLayers=new Array();
        for(var P=0;P<C.menus[F].items.length;P++){
            var N=FIND("menuItem"+y);
            N.Menu=C.menus[F];
            N.Menu.menuItemLayers[N.Menu.menuItemLayers.length]="menuItem"+y;
            if(N.addEventListener||window.mmIsOpera){
                N.style.width=Q.menuItemWidth+"px";
                N.style.height=Q.menuItemHeight+"px";
                N.style.pixelWidth=Q.menuItemWidth;
                N.style.pixelHeight=Q.menuItemHeight;
                N.style.top=j+"px";
                N.style.left=h+"px";
                if(N.addEventListener){
                    N.addEventListener("mouseover",onMenuItemOver,false);
                    N.addEventListener("click",onMenuItemAction,false);
                    N.addEventListener("mouseout",mouseoutMenu,false)
                    }
                    if(Q.menuItemHAlign!="left"){
                    N.hiliteShim=FIND("menuItemHilite"+y+"Shim");
                    N.hiliteShim.style.visibility="inherit";
                    N.textShim=FIND("menuItemText"+y+"Shim");
                    N.hiliteShim.style.pixelWidth=Q.menuItemWidth-2*Q.menuItemPadding-Q.menuItemIndent;
                    N.hiliteShim.style.width=N.hiliteShim.style.pixelWidth;
                    N.textShim.style.pixelWidth=Q.menuItemWidth-2*Q.menuItemPadding-Q.menuItemIndent;
                    N.textShim.style.width=N.textShim.style.pixelWidth
                    }
                }else{
            N.style.pixelWidth=Q.menuItemWidth;
            N.style.pixelHeight=Q.menuItemHeight;
            N.style.pixelTop=j;
            N.style.pixelLeft=h;
            if(Q.menuItemHAlign!="left"){
                var G=FIND("menuItemShim"+y);
                G[0].style.pixelWidth=Q.menuItemWidth-2*Q.menuItemPadding-Q.menuItemIndent;
                G[1].style.pixelWidth=Q.menuItemWidth-2*Q.menuItemPadding-Q.menuItemIndent;
                G[0].style.width=G[0].style.pixelWidth+"px";
                G[1].style.width=G[1].style.pixelWidth+"px"
                }
            }
        if(Q.vertical){
            j=j+Q.menuItemHeight+Q.menuItemBorder+Q.menuItemSpacing
            }else{
            h=h+Q.menuItemWidth+Q.menuItemBorder+Q.menuItemSpacing
            }
            N.style.fontSize=Q.fontSize+"px";
        N.style.backgroundColor=Q.menuItemBgColor;
        N.style.visibility="inherit";
        N.saveColor=Q.menuItemBgColor;
        N.menuHiliteBgColor=Q.menuHiliteBgColor;
        N.mmaction=C.menus[F].actions[P];
        N.hilite=FIND("menuItemHilite"+y);
        N.focusItem=FIND("focusItem"+F);
        N.focusItem.style.pixelTop=-30;
        N.focusItem.style.top="-30px";
        var r=FIND("childMenu"+y);
        if(r){
            N.childMenu=C.menus[F].items[P].menuLayer;
            r.style.pixelLeft=Q.menuItemWidth-11;
            r.style.left=r.style.pixelLeft+"px";
            r.style.pixelTop=(Q.menuItemHeight/2)-4;
            r.style.top=r.style.pixelTop+"px";
            N.Menu.childMenus[N.Menu.childMenus.length]=N.childMenu
            }
            N.style.cursor="hand";
        N.style.cursor="pointer";
        y++
    }
    if(Q.vertical){
        Q.menuHeight=j-1-Q.menuItemSpacing;
        Q.menuWidth=Q.menuItemWidth
        }else{
        Q.menuHeight=Q.menuItemHeight;
        Q.menuWidth=h-1-Q.menuItemSpacing
        }
        var o=FIND("menuLite"+F);
    var I=o.style;
    I.pixelHeight=Q.menuHeight+(Q.menuBorder*2);
    I.height=I.pixelHeight+"px";
    I.pixelWidth=Q.menuWidth+(Q.menuBorder*2);
    I.width=I.pixelWidth+"px";
    if(Q.menuBgOpaque){
        I.backgroundColor=Q.menuLiteBgColor
        }
        var u=FIND("menuFg"+F);
    I=u.style;
    I.pixelHeight=Q.menuHeight+Q.menuBorder;
    I.height=I.pixelHeight+"px";
    I.pixelWidth=Q.menuWidth+Q.menuBorder;
    I.width=I.pixelWidth+"px";
    if(Q.menuBgOpaque){
        I.backgroundColor=Q.bgColor
        }
        I=O.style;
    I.pixelWidth=Q.menuWidth+(Q.menuBorder*4);
    I.width=I.pixelWidth+"px";
    I.pixelHeight=Q.menuHeight+(Q.menuBorder*4);
    I.height=I.pixelHeight+"px"
    }
}
if(document.captureEvents){
    document.captureEvents(Event.MOUSEUP)
    }
    if(document.addEventListener){
    document.addEventListener("mouseup",onMenuItemOver,false)
    }
    if(document.layers&&window.innerWidth){
    window.onresize=NS4resize;
    window.NS4sIW=window.innerWidth;
    window.NS4sIH=window.innerHeight;
    setTimeout("NS4resize()",500)
    }
    document.onmouseup=mouseupMenu;
window.mmWroteMenu=true;
status=""
}
function NS4resize(){
    if(NS4sIW!=window.innerWidth||NS4sIH!=window.innerHeight){
        window.location.reload()
        }
    }
function onMenuItemOver(d,c){
    MM_clearTimeout();
    c=c||this;
    var b=window.ActiveMenuItem;
    if(document.layers){
        if(b){
            b.document.bgColor=b.saveColor;
            if(b.hilite){
                b.hilite.visibility="hidden"
                }
                if(b.Menu.bgImageOver){
                b.background.src=b.Menu.bgImageUp
                }
                b.focusItem.top=-100;
            b.clicked=false
            }
            if(c.hilite){
            c.document.bgColor=c.menuHiliteBgColor;
            c.zIndex=10;
            c.hilite.visibility="inherit";
            c.hilite.zIndex=20;
            c.document.layers[1].zIndex=10;
            c.focusItem.zIndex=this.zIndex+2
            }
            if(c.Menu.bgImageOver){
            c.background.src=c.Menu.bgImageOver
            }
            c.focusItem.top=this.top;
        c.focusItem.left=this.left;
        c.focusItem.clip.width=c.clip.width;
        c.focusItem.clip.height=c.clip.height;
        c.Menu.hideChildMenu(c)
        }else{
        if(c.style&&c.Menu){
            if(b){
                b.style.backgroundColor=b.saveColor;
                if(b.hilite){
                    b.hilite.style.visibility="hidden"
                    }
                    if(b.hiliteShim){
                    b.hiliteShim.style.visibility="inherit"
                    }
                    if(b.Menu.bgImageUp){
                    b.style.background="url("+b.Menu.bgImageUp+")"
                    }
                }
            c.style.backgroundColor=c.menuHiliteBgColor;
        c.zIndex=10;
        if(c.Menu.bgImageOver){
            c.style.background="url("+c.Menu.bgImageOver+")"
            }
            if(c.hilite){
            c.hilite.style.visibility="inherit";
            if(c.hiliteShim){
                c.hiliteShim.style.visibility="visible"
                }
            }
        c.focusItem.style.pixelTop=c.style.pixelTop;
    c.focusItem.style.top=c.focusItem.style.pixelTop+"px";
    c.focusItem.style.pixelLeft=c.style.pixelLeft;
    c.focusItem.style.left=c.focusItem.style.pixelLeft+"px";
    c.focusItem.style.zIndex=c.zIndex+1;
    c.Menu.hideChildMenu(c)
    }else{
    return
}
}
window.ActiveMenuItem=c
}
function onMenuItemAction(e,l){
    l=window.ActiveMenuItem;
    if(!l){
        return
    }
    hideActiveMenus();
    if(l.mmaction){
        eval(""+l.mmaction)
        }
        window.ActiveMenuItem=0
    }
    function MM_clearTimeout(){
    if(mmHideMenuTimer){
        clearTimeout(mmHideMenuTimer)
        }
        mmHideMenuTimer=null;
    mmDHFlag=false
    }
    function MM_startTimeout(){
    if(window.ActiveMenu){
        mmStart=new Date();
        mmDHFlag=true;
        mmHideMenuTimer=setTimeout("mmDoHide()",window.ActiveMenu.Menu.hideTimeout)
        }
    }
function mmDoHide(){
    if(!mmDHFlag||!window.ActiveMenu){
        return
    }
    var a=new Date()-mmStart;
    var b=window.ActiveMenu.Menu.hideTimeout;
    if(a<b){
        mmHideMenuTimer=setTimeout("mmDoHide()",b+100-a);
        return
    }
    mmDHFlag=false;
    hideActiveMenus();
    window.ActiveMenuItem=0
    }
    function MM_showMenu(b,j,h,a,f){
    if(!window.mmWroteMenu){
        return
    }
    MM_clearTimeout();
    if(b){
        var d=FIND(f)||document.images[f]||document.links[f]||document.anchors[f];
        j=moveXbySlicePos(j,d);
        h=moveYbySlicePos(h,d)
        }
        if(document.layers){
        if(b){
            var c=b.menuLayer||b;
            c.top=c.left=1;
            hideActiveMenus();
            if(this.visibility){
                c=this
                }
                window.ActiveMenu=c
            }else{
            var c=a
            }
            if(!c){
            return
        }
        for(var g=0;g<c.layers.length;g++){
            if(!c.layers[g].isHilite){
                c.layers[g].visibility="inherit"
                }
                if(c.layers[g].document.layers.length>0){
                MM_showMenu(null,"relative","relative",c.layers[g])
                }
            }
        if(c.parentLayer){
        if(j!="relative"){
            c.parentLayer.left=j||window.pageX||0
            }
            if(c.parentLayer.left+c.clip.width>window.innerWidth){
            c.parentLayer.left-=(c.parentLayer.left+c.clip.width-window.innerWidth)
            }
            if(h!="relative"){
            c.parentLayer.top=h||window.pageY||0
            }
            if(c.parentLayer.isContainer){
            c.Menu.xOffset=window.pageXOffset;
            c.Menu.yOffset=window.pageYOffset;
            c.parentLayer.clip.width=window.ActiveMenu.clip.width+2;
            c.parentLayer.clip.height=window.ActiveMenu.clip.height+2;
            if(c.parentLayer.menuContainerBgColor&&c.Menu.menuBgOpaque){
                c.parentLayer.document.bgColor=c.parentLayer.menuContainerBgColor
                }
            }
    }
c.visibility="inherit";
if(c.Menu){
    c.Menu.container.visibility="inherit"
    }
}else{
    if(FIND("menuItem0")){
        var c=b.menuLayer||b;
        hideActiveMenus();
        if(typeof(c)=="string"){
            c=FIND(c)
            }
            window.ActiveMenu=c;
        var k=c.style;
        k.visibility="inherit";
        if(j!="relative"){
            k.pixelLeft=j||(window.pageX+document.body.scrollLeft)||0;
            k.left=k.pixelLeft+"px"
            }
            if(h!="relative"){
            k.pixelTop=h||(window.pageY+document.body.scrollTop)||0;
            k.top=k.pixelTop+"px"
            }
            c.Menu.xOffset=document.body.scrollLeft;
        c.Menu.yOffset=document.body.scrollTop;
        writeShim(c.id,h,j,k.pixelWidth,k.posHeight)
        }
    }
if(b){
    window.activeMenus[window.activeMenus.length]=c
    }
    MM_clearTimeout()
}
function onMenuItemDown(d,c){
    var b=window.ActiveMenuItem;
    if(document.layers&&b){
        b.eX=d.pageX;
        b.eY=d.pageY;
        b.clicked=true
        }
    }
function mouseupMenu(a){
    hideMenu(true,a);
    hideActiveMenus();
    return true
    }
    function getExplorerVersion(){
    var c=parseFloat(navigator.appVersion);
    if(navigator.appName!="Microsoft Internet Explorer"){
        return c
        }
        var b=navigator.appVersion;
    var a=b.indexOf("MSIE ");
    if(a>=0){
        b=b.substring(a+5);
        c=parseFloat(b)
        }
        return c
    }
    function mouseoutMenu(){
    if((navigator.appName=="Microsoft Internet Explorer")&&(getExplorerVersion()<4.5)){
        return true
        }
        hideMenu(false,false);
    return true
    }
    function hideMenu(d,c){
    var b=window.ActiveMenuItem;
    if(b&&document.layers){
        b.document.bgColor=b.saveColor;
        b.focusItem.top=-30;
        if(b.hilite){
            b.hilite.visibility="hidden"
            }
            if(d&&b.mmaction&&b.clicked&&window.ActiveMenu){
            if(b.eX<=c.pageX+15&&b.eX>=c.pageX-15&&b.eY<=c.pageY+10&&b.eY>=c.pageY-10){
                setTimeout("window.ActiveMenu.Menu.onMenuItemAction();",500)
                }
            }
        b.clicked=false;
    if(b.Menu.bgImageOver){
        b.background.src=b.Menu.bgImageUp
        }
    }else{
    if(window.ActiveMenu&&FIND("menuItem0")){
        if(b){
            b.style.backgroundColor=b.saveColor;
            if(b.hilite){
                b.hilite.style.visibility="hidden"
                }
                if(b.hiliteShim){
                b.hiliteShim.style.visibility="inherit"
                }
                if(b.Menu.bgImageUp){
                b.style.background="url("+b.Menu.bgImageUp+")"
                }
            }
    }
}
if(!d&&window.ActiveMenu){
    if(window.ActiveMenu.Menu){
        if(window.ActiveMenu.Menu.hideOnMouseOut){
            MM_startTimeout()
            }
            return(true)
        }
    }
return(true)
}
function hideChildMenu(g){
    MM_clearTimeout();
    var b=g;
    for(var d=0;d<b.Menu.childMenus.length;d++){
        var n=b.Menu.childMenus[d];
        if(document.layers){
            n.visibility="hidden"
            }else{
            n=FIND(n);
            n.style.visibility="hidden";
            if(n.Menu.menuItemHAlign!="left"){
                for(var c=0;c<n.Menu.menuItemLayers.length;c++){
                    var r=FIND(n.Menu.menuItemLayers[c]);
                    if(r.textShim){
                        r.textShim.style.visibility="inherit"
                        }
                    }
                }
        }
    n.Menu.hideChildMenu(n);
hideShim(n.id)
}
if(b.childMenu){
    var p=b.childMenu;
    if(document.layers){
        b.Menu.MM_showMenu(null,null,null,p.layers[0]);
        p.zIndex=b.parentLayer.zIndex+1;
        p.top=b.Menu.menuLayer.top+b.Menu.submenuYOffset;
        if(b.Menu.vertical){
            if(b.Menu.submenuRelativeToItem){
                p.top+=b.top+b.parentLayer.top
                }
                p.left=b.parentLayer.left+b.parentLayer.clip.width-(2*b.Menu.menuBorder)+b.Menu.menuLayer.left+b.Menu.submenuXOffset
            }else{
            p.top+=b.top+b.parentLayer.top;
            if(b.Menu.submenuRelativeToItem){
                p.left=b.Menu.menuLayer.left+b.left+b.clip.width+(2*b.Menu.menuBorder)+b.Menu.submenuXOffset
                }else{
                p.left=b.parentLayer.left+b.parentLayer.clip.width-(2*b.Menu.menuBorder)+b.Menu.menuLayer.left+b.Menu.submenuXOffset
                }
            }
        if(p.left<b.Menu.container.clip.left){
        b.Menu.container.clip.left=p.left
        }
        var m=p.clip.width+p.left-b.Menu.container.clip.left;
    if(m>b.Menu.container.clip.width){
        b.Menu.container.clip.width=m
        }
        var f=p.clip.height+p.top-b.Menu.container.clip.top;
    if(f>b.Menu.container.clip.height){
        b.Menu.container.clip.height=f
        }
        b.document.layers[1].zIndex=0;
    p.visibility="inherit"
    }else{
    if(FIND("menuItem0")){
        p=FIND(b.childMenu);
        var o=FIND(b.Menu.menuLayer);
        var q=p.style;
        q.zIndex=o.style.zIndex+1;
        if(document.all||window.mmIsOpera){
            q.pixelTop=o.style.pixelTop+b.Menu.submenuYOffset;
            if(b.Menu.vertical){
                if(b.Menu.submenuRelativeToItem){
                    q.pixelTop+=b.style.pixelTop
                    }
                    q.pixelLeft=b.style.pixelWidth+o.style.pixelLeft+b.Menu.submenuXOffset;
                q.left=q.pixelLeft+"px"
                }else{
                q.pixelTop+=b.style.pixelTop;
                if(b.Menu.submenuRelativeToItem){
                    q.pixelLeft=o.style.pixelLeft+b.style.pixelLeft+b.style.pixelWidth+(2*b.Menu.menuBorder)+b.Menu.submenuXOffset
                    }else{
                    q.pixelLeft=(o.style.pixelWidth-4*b.Menu.menuBorder)+o.style.pixelLeft+b.Menu.submenuXOffset
                    }
                    q.left=q.pixelLeft+"px"
                }
                writeShim(p.id,q.pixelTop,q.pixelLeft,q.pixelWidth,q.posHeight)
            }else{
            var k=parseInt(o.style.top)+b.Menu.submenuYOffset;
            var a=0;
            if(b.Menu.vertical){
                if(b.Menu.submenuRelativeToItem){
                    k+=parseInt(b.style.top)
                    }
                    a=(parseInt(o.style.width)-4*b.Menu.menuBorder)+parseInt(o.style.left)+b.Menu.submenuXOffset
                }else{
                k+=parseInt(b.style.top);
                if(b.Menu.submenuRelativeToItem){
                    a=parseInt(o.style.left)+parseInt(b.style.left)+parseInt(b.style.width)+(2*b.Menu.menuBorder)+b.Menu.submenuXOffset
                    }else{
                    a=(parseInt(o.style.width)-4*b.Menu.menuBorder)+parseInt(o.style.left)+b.Menu.submenuXOffset
                    }
                }
            q.top=k+"px";
        q.left=a+"px"
        }
        p.style.visibility="inherit"
    }else{
    return
}
}
window.activeMenus[window.activeMenus.length]=p
}
}
function hideActiveMenus(){
    if(!window.activeMenus){
        return
    }
    for(var a=0;a<window.activeMenus.length;a++){
        if(!activeMenus[a]){
            continue
        }
        hideShim(activeMenus[a].id);
        if(activeMenus[a].visibility&&activeMenus[a].Menu&&!window.mmIsOpera){
            activeMenus[a].visibility="hidden";
            activeMenus[a].Menu.container.visibility="hidden";
            activeMenus[a].Menu.container.clip.left=0
            }else{
            if(activeMenus[a].style){
                var b=activeMenus[a].style;
                b.visibility="hidden";
                b.left="-200px";
                b.top="-200px"
                }
            }
    }
    if(window.ActiveMenuItem){
    hideMenu(false,false)
    }
    window.activeMenus.length=0
}
function moveXbySlicePos(a,b){
    if(!document.layers){
        var f=navigator.platform?navigator.platform=="Win32":false;
        var g=document.all&&!f&&getExplorerVersion()==4.5;
        var d=b;
        var c=0;
        while(d){
            if(d.leftMargin&&!f){
                a+=parseInt(d.leftMargin)
                }
                if((d.offsetLeft!=c)&&d.offsetLeft){
                a+=parseInt(d.offsetLeft)
                }
                if(d.offsetLeft!=0){
                c=d.offsetLeft
                }
                d=g?d.parentElement:d.offsetParent
            }
        }else{
    if(b.x){
        a+=b.x
        }
    }
return a
}
function moveYbySlicePos(g,a){
    if(!document.layers){
        var d=navigator.platform?navigator.platform=="Win32":false;
        var f=document.all&&!d&&getExplorerVersion()==4.5;
        var c=a;
        var b=0;
        while(c){
            if(c.topMargin&&!d){
                g+=parseInt(c.topMargin)
                }
                if((c.offsetTop!=b)&&c.offsetTop){
                g+=parseInt(c.offsetTop)
                }
                if(c.offsetTop!=0){
                b=c.offsetTop
                }
                c=f?c.parentElement:c.offsetParent
            }
        }else{
    if(a.y>=0){
        g+=a.y
        }
    }
return g
}
function checkIE(){
    var a=navigator.userAgent;
    if(a.indexOf("MSIE")>-1){
        return true
        }else{
        return false
        }
    }
function writeShim(b,f,a,c,g){
    if(!checkIE()){
        return
    }
    var d="iframeshim_"+b;
    if(document.getElementById(d)){
        document.getElementById(d).style.display="block";
        document.getElementById(d).style.width=c;
        document.getElementById(d).style.height=g;
        document.getElementById(d).style.top=f;
        document.getElementById(d).style.left=a;
        return
    }
    var h=document.createElement("<iframe src='about:blank' id='"+d+"' scrolling='no' frameborder='0'style='position:absolute;top:"+f+"px;left:"+a+"px;z-index:5;' width="+c+" height="+g+"></iframe>");
    window.document.body.appendChild(h)
    }
    function hideShim(a){
    if(!checkIE()){
        return
    }
    var b="iframeshim_"+a;
    if(document.getElementById(b)){
        document.getElementById(b).style.display="none"
        }
    }
function showShim(a){
    if(!checkIE()){
        return
    }
    var b="iframeshim_"+a;
    if(document.getElementById(b)){
        document.getElementById(b).style.display="block"
        }
    }
function MM_findObj(g,f){
    var c,b,a;
    if(!f){
        f=document
        }
        if((c=g.indexOf("?"))>0&&parent.frames.length){
        f=parent.frames[g.substring(c+1)].document;
        g=g.substring(0,c)
        }
        if(!(a=f[g])&&f.all){
        a=f.all[g]
        }
        for(b=0;!a&&b<f.forms.length;b++){
        a=f.forms[b][g]
        }
        for(b=0;!a&&f.layers&&b<f.layers.length;b++){
        a=MM_findObj(g,f.layers[b].document)
        }
        if(!a&&f.getElementById){
        a=f.getElementById(g)
        }
        return a
    }
    function MM_swapImage(){
    var f,d=0,b,c=MM_swapImage.arguments;
    document.MM_sr=new Array;
    for(f=0;f<(c.length-2);f+=3){
        if((b=MM_findObj(c[f]))!=null){
            document.MM_sr[d++]=b;
            if(!b.oSrc){
                b.oSrc=b.src
                }
                b.src=c[f+2]
            }
        }
    }
function MM_swapImgRestore(){
    var d,b,c=document.MM_sr;
    for(d=0;c&&d<c.length&&(b=c[d])&&b.oSrc;d++){
        b.src=b.oSrc
        }
    }
    function MM_preloadImages(){
    var g=document;
    if(g.images){
        if(!g.MM_p){
            g.MM_p=new Array()
            }
            var f,c=g.MM_p.length,b=MM_preloadImages.arguments;
        for(f=0;f<b.length;f++){
            if(b[f].indexOf("#")!=0){
                g.MM_p[c]=new Image;
                g.MM_p[c++].src=b[f]
                }
            }
        }
}
function tabberObj(b){
    var a;
    this.div=null;
    this.classMain="tabber";
    this.classMainLive="tabberlive";
    this.classTab="tabbertab";
    this.classTabDefault="tabbertabdefault";
    this.classNav="tabbernav";
    this.classTabHide="tabbertabhide";
    this.classNavActive="tabberactive";
    this.titleElements=["h2","h3","h4","h5","h6"];
    this.titleElementsStripHTML=true;
    this.removeTitle=true;
    this.addLinkId=false;
    this.linkIdFormat="<tabberid>nav<tabnumberone>";
    for(a in b){
        this[a]=b[a]
        }
        this.REclassMain=new RegExp("\\b"+this.classMain+"\\b","gi");
    this.REclassMainLive=new RegExp("\\b"+this.classMainLive+"\\b","gi");
    this.REclassTab=new RegExp("\\b"+this.classTab+"\\b","gi");
    this.REclassTabDefault=new RegExp("\\b"+this.classTabDefault+"\\b","gi");
    this.REclassTabHide=new RegExp("\\b"+this.classTabHide+"\\b","gi");
    this.tabs=new Array();
    if(this.div){
        this.init(this.div);
        this.div=null
        }
    }
tabberObj.prototype.init=function(f){
    var j,d,b,l,g=0,m,a,k,c,h;
    if(!document.getElementsByTagName){
        return false
        }
        if(f.id){
        this.id=f.id
        }
        this.tabs.length=0;
    j=f.childNodes;
    for(d=0;d<j.length;d++){
        if(j[d].className&&j[d].className.match(this.REclassTab)){
            l=new Object();
            l.div=j[d];
            this.tabs[this.tabs.length]=l;
            if(j[d].className.match(this.REclassTabDefault)){
                g=this.tabs.length-1
                }
            }
    }
    m=document.createElement("ul");
m.className=this.classNav;
for(d=0;d<this.tabs.length;d++){
    l=this.tabs[d];
    l.headingText=l.div.title;
    if(this.removeTitle){
        l.div.title=""
        }
        if(!l.headingText){
        for(b=0;b<this.titleElements.length;b++){
            h=l.div.getElementsByTagName(this.titleElements[b])[0];
            if(h){
                l.headingText=h.innerHTML;
                if(this.titleElementsStripHTML){
                    l.headingText.replace(/<br>/gi," ");
                    l.headingText=l.headingText.replace(/<[^>]+>/g,"")
                    }
                    break
            }
        }
        }
    if(!l.headingText){
    l.headingText=d+1
    }
    a=document.createElement("li");
l.li=a;
k=document.createElement("a");
k.appendChild(document.createTextNode(l.headingText));
k.href="javascript:void(null);";
k.title=l.headingText;
k.onclick=this.navClick;
k.tabber=this;
k.tabberIndex=d;
if(this.addLinkId&&this.linkIdFormat){
    c=this.linkIdFormat;
    c=c.replace(/<tabberid>/gi,this.id);
    c=c.replace(/<tabnumberzero>/gi,d);
    c=c.replace(/<tabnumberone>/gi,d+1);
    c=c.replace(/<tabtitle>/gi,l.headingText.replace(/[^a-zA-Z0-9\-]/gi,""));
    k.id=c
    }
    a.appendChild(k);
m.appendChild(a)
}
f.insertBefore(m,f.firstChild);
f.className=f.className.replace(this.REclassMain,this.classMainLive);
this.tabShow(g);
if(typeof this.onLoad=="function"){
    this.onLoad({
        tabber:this
    })
    }
    return this
};

tabberObj.prototype.navClick=function(h){
    var d,b,c,g,f;
    b=this;
    if(!b.tabber){
        return false
        }
        c=b.tabber;
    g=b.tabberIndex;
    b.blur();
    if(typeof c.onClick=="function"){
        f={
            tabber:c,
            index:g,
            event:h
        };

        if(!h){
            f.event=window.event
            }
            d=c.onClick(f);
        if(d===false){
            return false
            }
        }
    c.tabShow(g);
    return false
    };

tabberObj.prototype.tabHideAll=function(){
    var a;
    for(a=0;a<this.tabs.length;a++){
        this.tabHide(a)
        }
    };

tabberObj.prototype.tabHide=function(a){
    var b;
    if(!this.tabs[a]){
        return false
        }
        b=this.tabs[a].div;
    if(!b.className.match(this.REclassTabHide)){
        b.className+=" "+this.classTabHide
        }
        this.navClearActive(a);
    return this
    };

tabberObj.prototype.tabShow=function(a){
    var b;
    if(!this.tabs[a]){
        return false
        }
        this.tabHideAll();
    b=this.tabs[a].div;
    b.className=b.className.replace(this.REclassTabHide,"");
    this.navSetActive(a);
    if(typeof this.onTabDisplay=="function"){
        this.onTabDisplay({
            tabber:this,
            index:a
        })
        }
        return this
    };

tabberObj.prototype.navSetActive=function(a){
    this.tabs[a].li.className=this.classNavActive;
    return this
    };

tabberObj.prototype.navClearActive=function(a){
    this.tabs[a].li.className="";
    return this
    };

function tabberAutomatic(d){
    var a,c,b;
    if(!d){
        d={}
    }
    a=new tabberObj(d);
c=document.getElementsByTagName("div");
for(b=0;b<c.length;b++){
    if(c[b].className&&c[b].className.match(a.REclassMain)){
        d.div=c[b];
        c[b].tabber=new tabberObj(d)
        }
    }
return this
}
function tabberAutomaticOnLoad(b){
    var a;
    if(!b){
        b={}
    }
    a=window.onload;
if(typeof window.onload!="function"){
    window.onload=function(){
        tabberAutomatic(b)
        }
    }else{
    window.onload=function(){
        a();
        tabberAutomatic(b)
        }
    }
}
if(typeof tabberOptions=="undefined"){
    tabberAutomaticOnLoad()
        }else{
    if(!tabberOptions.manualStartup){
        tabberAutomaticOnLoad(tabberOptions)
            }
        }
var popupdialogue;
var growHeight=true;
var image_resize=null;
function loadPopup(a){
    //growHeight=true;
    growHeight=false;
    popupdialogue=a;
    grayOut(true,{
        zindex:"50",
        bgcolor:"#000000",
        opacity:"30"
    });
    new Effect.Appear(a,{
        delay:0,
        duration:0.5
    });
    document.body.style.overflow="";
    return false
    }
    function loadPopup2(a){
    growHeight=false;
    popupdialogue=a;
    grayOut(true,{
        zindex:"50",
        bgcolor:"#000000",
        opacity:"30"
    });
    new Effect.Appear(a,{
        delay:0,
        duration:0.5
    });
    document.body.style.overflow="";
    setTimeout("ri()",500);
    return false
    }
    function ri(){
    image_resize=new ImageResize("zoom-image",500,300)
    }
    function chgzimg(a){
    $("zoom-image").src=a;
    image_resize.resetScale();
    return false
    }
    function closeDialogue(){
    Effect.Fade(popupdialogue,{
        delay:0,
        duration:0.5
    });
    Effect.Fade("darkenScreenObject",{
        delay:0,
        duration:0.5
    });
    document.body.style.overflow="auto";
    return false
    }
    var gotGrayOut=false;
function grayOut(a,j){
    var j=j||{};

    var h=j.zindex||50;
    var f=j.opacity||70;
    var d=(f/100);
    var k=j.bgcolor||"#000000";
    var g=document.getElementById("darkenScreenObject");
    if(!g){
        var c=document.getElementsByTagName("body")[0];
        var b=document.createElement("div");
        b.style.position="absolute";
        b.style.top="0px";
        b.style.marginLeft="auto";
        b.style.marginRight="auto";
        b.style.cursor="wait";
        b.style.overflow="";
        b.style.display="none";
        b.id="darkenScreenObject";
        c.appendChild(b);
        g=document.getElementById("darkenScreenObject")
        }
        if(a){
        pageWidth=document.viewport.getWidth()+"px";
        pageHeight=document.viewport.getHeight()+"px";
        xy=document.viewport.getScrollOffsets();
		
        g.style.opacity=d;
        g.style.MozOpacity=d;
        g.style.filter="alpha(opacity="+f+")";
        g.style.zIndex=h;
        g.style.backgroundColor=k;
        g.style.width=pageWidth;
        g.style.height=pageHeight;
        g.style.top=xy[1]+"px";
        g.style.left=xy[0]+"px";
        g.style.display="block";
        gotGrayOut=true;
        setTimeout("grayOutTimer()",100)
        }else{
        gotGrayOut=false;
        g.style.display="none"
        }
    }
function grayOutTimer(){
    if(gotGrayOut){
        pageWidth=document.viewport.getWidth();
        pageHeight=document.viewport.getHeight();
        xy=document.viewport.getScrollOffsets();
        dark=document.getElementById("darkenScreenObject");
        dark.style.width=pageWidth+"px";
        dark.style.height=pageHeight+"px";
        dark.style.top=xy[1]+"px";
        dark.style.left=xy[0]+"px";
        try{
            $(popupdialogue).style.top=20+"px";
            if(growHeight){
                $(popupdialogue).style.height=(pageHeight-40)+"px";
                getCSSObject($(popupdialogue),"dialogueData").style.height=(pageHeight-70)+"px"
                }
            }catch(a){}
    setTimeout("grayOutTimer()",100)
    }
}
function getCSSObject(c,b){
    e=c.getElementsByTagName("div");
    for(var a=0;a<e.length;a++){
        if(e[a].className==b){
            return e[a]
            }
        }
    return null
}
function tracker_init(){
    tracker_addclick(document)
    }
    function tracker_addclick(o){
    var l=document.location.toString().replace(/^[^\/]*\/+([^\/]*)(\/.*)?/,"$1");
    if(l.indexOf("stage")!=-1){
        return
    }
    var els=o.getElementsByTagName("a");
    for(var i=0;i<els.length;i++){
        var href=els[i].href;
        if(href.match(eval("/^http(s)?:\\/\\/"+l+"/"))){
            continue
        }
        if(href.match(/^http(s)?:\/\/support-.*\.canon.*/)){
            continue
        }
        if(href.match(/^http(s)?:\/\/www\.canon.*/)){
            continue
        }
        if(href.match(/^http(s)?:\/\/media\.canon-asia\..*/)){
            continue
        }
        if(href.match(/^javascript:.*/)){
            continue
        }
        Event.observe(els[i],"click",tracker_ajax)
        }
    }
    function tracker_ajax(a){
    new Ajax.Request("/track",{
        method:"post",
        parameters:{
            r:document.location.toString(),
            d:this.href,
            ajax:1
        }
    })
}
Event.observe(window,"load",tracker_init);
