
/*
 Copyright (c) 2007, Yahoo! Inc. All rights reserved.
 Code licensed under the BSD License:
 http://developer.yahoo.net/yui/license.txt
 version: 2.2.2
 */
if (typeof YAHOO == "undefined") {
    var YAHOO = {};
}
YAHOO.namespace = function(){
    var a = arguments, o = null, i, j, d;
    for (i = 0; i < a.length; i = i + 1) {
        d = a[i].split(".");
        o = YAHOO;
        for (j = (d[0] == "YAHOO") ? 1 : 0; j < d.length; j = j + 1) {
            o[d[j]] = o[d[j]] ||
            {};
            o = o[d[j]];
        }
    }
    return o;
};
YAHOO.log = function(msg, cat, src){
    var l = YAHOO.widget.Logger;
    if (l && l.log) {
        return l.log(msg, cat, src);
    }
    else {
        return false;
    }
};
YAHOO.init = function(){
    this.namespace("util", "widget", "example");
    if (typeof YAHOO_config != "undefined") {
        var l = YAHOO_config.listener, ls = YAHOO.env.listeners, unique = true, i;
        if (l) {
            for (i = 0; i < ls.length; i = i + 1) {
                if (ls[i] == l) {
                    unique = false;
                    break;
                }
            }
            if (unique) {
                ls.push(l);
            }
        }
    }
};
YAHOO.register = function(name, mainClass, data){
    var mods = YAHOO.env.modules;
    if (!mods[name]) {
        mods[name] = {
            versions: [],
            builds: []
        };
    }
    var m = mods[name], v = data.version, b = data.build, ls = YAHOO.env.listeners;
    m.name = name;
    m.version = v;
    m.build = b;
    m.versions.push(v);
    m.builds.push(b);
    m.mainClass = mainClass;
    for (var i = 0; i < ls.length; i = i + 1) {
        ls[i](m);
    }
    if (mainClass) {
        mainClass.VERSION = v;
        mainClass.BUILD = b;
    }
    else {
        YAHOO.log("mainClass is undefined for module " + name, "warn");
    }
};
YAHOO.env = YAHOO.env ||
{
    modules: [],
    listeners: [],
    getVersion: function(name){
        return YAHOO.env.modules[name] || null;
    }
};
YAHOO.lang = {
    isArray: function(obj){
        if (obj && obj.constructor && obj.constructor.toString().indexOf('Array') > -1) {
            return true;
        }
        else {
            return YAHOO.lang.isObject(obj) && obj.constructor == Array;
        }
    },
    isBoolean: function(obj){
        return typeof obj == 'boolean';
    },
    isFunction: function(obj){
        return typeof obj == 'function';
    },
    isNull: function(obj){
        return obj === null;
    },
    isNumber: function(obj){
        return typeof obj == 'number' && isFinite(obj);
    },
    isObject: function(obj){
        return obj && (typeof obj == 'object' || YAHOO.lang.isFunction(obj));
    },
    isString: function(obj){
        return typeof obj == 'string';
    },
    isUndefined: function(obj){
        return typeof obj == 'undefined';
    },
    hasOwnProperty: function(obj, prop){
        if (Object.prototype.hasOwnProperty) {
            return obj.hasOwnProperty(prop);
        }
        return !YAHOO.lang.isUndefined(obj[prop]) && obj.constructor.prototype[prop] !== obj[prop];
    },
    extend: function(subc, superc, overrides){
        if (!superc || !subc) {
            throw new Error("YAHOO.lang.extend failed, please check that " + "all dependencies are included.");
        }
        var F = function(){
        };
        F.prototype = superc.prototype;
        subc.prototype = new F();
        subc.prototype.constructor = subc;
        subc.superclass = superc.prototype;
        if (superc.prototype.constructor == Object.prototype.constructor) {
            superc.prototype.constructor = superc;
        }
        if (overrides) {
            for (var i in overrides) {
                subc.prototype[i] = overrides[i];
            }
        }
    },
    augment: function(r, s){
        if (!s || !r) {
            throw new Error("YAHOO.lang.augment failed, please check that " + "all dependencies are included.");
        }
        var rp = r.prototype, sp = s.prototype, a = arguments, i, p;
        if (a[2]) {
            for (i = 2; i < a.length; i = i + 1) {
                rp[a[i]] = sp[a[i]];
            }
        }
        else {
            for (p in sp) {
                if (!rp[p]) {
                    rp[p] = sp[p];
                }
            }
        }
    }
};
YAHOO.init();
YAHOO.util.Lang = YAHOO.lang;
YAHOO.augment = YAHOO.lang.augment;
YAHOO.extend = YAHOO.lang.extend;
YAHOO.register("yahoo", YAHOO, {
    version: "2.2.2",
    build: "204"
});
(function(){
    var Y = YAHOO.util, getStyle, setStyle, id_counter = 0, propertyCache = {};
    var ua = navigator.userAgent.toLowerCase(), isOpera = (ua.indexOf('opera') > -1), isSafari = (ua.indexOf('safari') > -1), isGecko = (!isOpera && !isSafari && ua.indexOf('gecko') > -1), isIE = (!isOpera && ua.indexOf('msie') > -1);
    var patterns = {
        HYPHEN: /(-[a-z])/i,
        ROOT_TAG: /body|html/i
    };
    var toCamel = function(property){
        if (!patterns.HYPHEN.test(property)) {
            return property;
        }
        if (propertyCache[property]) {
            return propertyCache[property];
        }
        var converted = property;
        while (patterns.HYPHEN.exec(converted)) {
            converted = converted.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase());
        }
        propertyCache[property] = converted;
        return converted;
    };
    if (document.defaultView && document.defaultView.getComputedStyle) {
        getStyle = function(el, property){
            var value = null;
            if (property == 'float') {
                property = 'cssFloat';
            }
            var computed = document.defaultView.getComputedStyle(el, '');
            if (computed) {
                value = computed[toCamel(property)];
            }
            return el.style[property] || value;
        };
    }
    else 
        if (document.documentElement.currentStyle && isIE) {
            getStyle = function(el, property){
                switch (toCamel(property)) {
                    case 'opacity':
                        var val = 100;
                        try {
                            val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
                        } 
                        catch (e) {
                            try {
                                val = el.filters('alpha').opacity;
                            } 
                            catch (e) {
                            }
                        }
                        return val / 100;
                        break;
                    case 'float':
                        property = 'styleFloat';
                    default:
                        var value = el.currentStyle ? el.currentStyle[property] : null;
                        return (el.style[property] || value);
                }
            };
        }
        else {
            getStyle = function(el, property){
                return el.style[property];
            };
        }
    if (isIE) {
        setStyle = function(el, property, val){
            switch (property) {
                case 'opacity':
                    if (YAHOO.lang.isString(el.style.filter)) {
                        el.style.filter = 'alpha(opacity=' + val * 100 + ')';
                        if (!el.currentStyle || !el.currentStyle.hasLayout) {
                            el.style.zoom = 1;
                        }
                    }
                    break;
                case 'float':
                    property = 'styleFloat';
                default:
                    el.style[property] = val;
            }
        };
    }
    else {
        setStyle = function(el, property, val){
            if (property == 'float') {
                property = 'cssFloat';
            }
            el.style[property] = val;
        };
    }
    YAHOO.util.Dom = {
        get: function(el){
            if (YAHOO.lang.isString(el)) {
                return document.getElementById(el);
            }
            if (YAHOO.lang.isArray(el)) {
                var c = [];
                for (var i = 0, len = el.length; i < len; ++i) {
                    c[c.length] = Y.Dom.get(el[i]);
                }
                return c;
            }
            if (el) {
                return el;
            }
            return null;
        },
        getStyle: function(el, property){
            property = toCamel(property);
            var f = function(element){
                return getStyle(element, property);
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        setStyle: function(el, property, val){
            property = toCamel(property);
            var f = function(element){
                setStyle(element, property, val);
            };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        getXY: function(el){
            var f = function(el){
                if ((el.parentNode === null || el.offsetParent === null || this.getStyle(el, 'display') == 'none') && el != document.body) {
                    return false;
                }
                var parentNode = null;
                var pos = [];
                var box;
                if (el.getBoundingClientRect) {
                    box = el.getBoundingClientRect();
                    var doc = document;
                    if (!this.inDocument(el) && parent.document != document) {
                        doc = parent.document;
                        if (!this.isAncestor(doc.documentElement, el)) {
                            return false;
                        }
                    }
                    var scrollTop = Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);
                    var scrollLeft = Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);
                    return [box.left + scrollLeft, box.top + scrollTop];
                }
                else {
                    pos = [el.offsetLeft, el.offsetTop];
                    parentNode = el.offsetParent;
                    var hasAbs = this.getStyle(el, 'position') == 'absolute';
                    if (parentNode != el) {
                        while (parentNode) {
                            pos[0] += parentNode.offsetLeft;
                            pos[1] += parentNode.offsetTop;
                            if (isSafari && !hasAbs && this.getStyle(parentNode, 'position') == 'absolute') {
                                hasAbs = true;
                            }
                            parentNode = parentNode.offsetParent;
                        }
                    }
                    if (isSafari && hasAbs) {
                        pos[0] -= document.body.offsetLeft;
                        pos[1] -= document.body.offsetTop;
                    }
                }
                parentNode = el.parentNode;
                while (parentNode.tagName && !patterns.ROOT_TAG.test(parentNode.tagName)) {
                    if (Y.Dom.getStyle(parentNode, 'display') != 'inline') {
                        pos[0] -= parentNode.scrollLeft;
                        pos[1] -= parentNode.scrollTop;
                    }
                    parentNode = parentNode.parentNode;
                }
                return pos;
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getX: function(el){
            var f = function(el){
                return Y.Dom.getXY(el)[0];
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getY: function(el){
            var f = function(el){
                return Y.Dom.getXY(el)[1];
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        setXY: function(el, pos, noRetry){
            var f = function(el){
                var style_pos = this.getStyle(el, 'position');
                if (style_pos == 'static') {
                    this.setStyle(el, 'position', 'relative');
                    style_pos = 'relative';
                }
                var pageXY = this.getXY(el);
                if (pageXY === false) {
                    return false;
                }
                var delta = [parseInt(this.getStyle(el, 'left'), 10), parseInt(this.getStyle(el, 'top'), 10)];
                if (isNaN(delta[0])) {
                    delta[0] = (style_pos == 'relative') ? 0 : el.offsetLeft;
                }
                if (isNaN(delta[1])) {
                    delta[1] = (style_pos == 'relative') ? 0 : el.offsetTop;
                }
                if (pos[0] !== null) {
                    el.style.left = pos[0] - pageXY[0] + delta[0] + 'px';
                }
                if (pos[1] !== null) {
                    el.style.top = pos[1] - pageXY[1] + delta[1] + 'px';
                }
                if (!noRetry) {
                    var newXY = this.getXY(el);
                    if ((pos[0] !== null && newXY[0] != pos[0]) || (pos[1] !== null && newXY[1] != pos[1])) {
                        this.setXY(el, pos, true);
                    }
                }
            };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        setX: function(el, x){
            Y.Dom.setXY(el, [x, null]);
        },
        setY: function(el, y){
            Y.Dom.setXY(el, [null, y]);
        },
        getRegion: function(el){
            var f = function(el){
                var region = new Y.Region.getRegion(el);
                return region;
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getClientWidth: function(){
            return Y.Dom.getViewportWidth();
        },
        getClientHeight: function(){
            return Y.Dom.getViewportHeight();
        },
        getElementsByClassName: function(className, tag, root){
            var method = function(el){
                return Y.Dom.hasClass(el, className);
            };
            return Y.Dom.getElementsBy(method, tag, root);
        },
        hasClass: function(el, className){
            var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
            var f = function(el){
                return re.test(el.className);
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        addClass: function(el, className){
            var f = function(el){
                if (this.hasClass(el, className)) {
                    return;
                }
                el.className = [el.className, className].join(' ');
            };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        removeClass: function(el, className){
            var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', 'g');
            var f = function(el){
                if (!this.hasClass(el, className)) {
                    return;
                }
                var c = el.className;
                el.className = c.replace(re, ' ');
                if (this.hasClass(el, className)) {
                    this.removeClass(el, className);
                }
            };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        replaceClass: function(el, oldClassName, newClassName){
            if (oldClassName === newClassName) {
                return false;
            }
            var re = new RegExp('(?:^|\\s+)' + oldClassName + '(?:\\s+|$)', 'g');
            var f = function(el){
                if (!this.hasClass(el, oldClassName)) {
                    this.addClass(el, newClassName);
                    return;
                }
                el.className = el.className.replace(re, ' ' + newClassName + ' ');
                if (this.hasClass(el, oldClassName)) {
                    this.replaceClass(el, oldClassName, newClassName);
                }
            };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        generateId: function(el, prefix){
            prefix = prefix || 'yui-gen';
            el = el ||
            {};
            var f = function(el){
                if (el) {
                    el = Y.Dom.get(el);
                }
                else {
                    el = {};
                }
                if (!el.id) {
                    el.id = prefix + id_counter++;
                }
                return el.id;
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        isAncestor: function(haystack, needle){
            haystack = Y.Dom.get(haystack);
            if (!haystack || !needle) {
                return false;
            }
            var f = function(needle){
                if (haystack.contains && !isSafari) {
                    return haystack.contains(needle);
                }
                else 
                    if (haystack.compareDocumentPosition) {
                        return !!(haystack.compareDocumentPosition(needle) & 16);
                    }
                    else {
                        var parent = needle.parentNode;
                        while (parent) {
                            if (parent == haystack) {
                                return true;
                            }
                            else 
                                if (!parent.tagName || parent.tagName.toUpperCase() == 'HTML') {
                                    return false;
                                }
                            parent = parent.parentNode;
                        }
                        return false;
                    }
            };
            return Y.Dom.batch(needle, f, Y.Dom, true);
        },
        inDocument: function(el){
            var f = function(el){
                return this.isAncestor(document.documentElement, el);
            };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getElementsBy: function(method, tag, root){
            tag = tag || '*';
            var nodes = [];
            if (root) {
                root = Y.Dom.get(root);
                if (!root) {
                    return nodes;
                }
            }
            else {
                root = document;
            }
            var elements = root.getElementsByTagName(tag);
            if (!elements.length && (tag == '*' && root.all)) {
                elements = root.all;
            }
            for (var i = 0, len = elements.length; i < len; ++i) {
                if (method(elements[i])) {
                    nodes[nodes.length] = elements[i];
                }
            }
            return nodes;
        },
        batch: function(el, method, o, override){
            var id = el;
            el = Y.Dom.get(el);
            var scope = (override) ? o : window;
            if (!el || el.tagName || !el.length) {
                if (!el) {
                    return false;
                }
                return method.call(scope, el, o);
            }
            var collection = [];
            for (var i = 0, len = el.length; i < len; ++i) {
                if (!el[i]) {
                    id = el[i];
                }
                collection[collection.length] = method.call(scope, el[i], o);
            }
            return collection;
        },
        getDocumentHeight: function(){
            var scrollHeight = (document.compatMode != 'CSS1Compat') ? document.body.scrollHeight : document.documentElement.scrollHeight;
            var h = Math.max(scrollHeight, Y.Dom.getViewportHeight());
            return h;
        },
        getDocumentWidth: function(){
            var scrollWidth = (document.compatMode != 'CSS1Compat') ? document.body.scrollWidth : document.documentElement.scrollWidth;
            var w = Math.max(scrollWidth, Y.Dom.getViewportWidth());
            return w;
        },
        getViewportHeight: function(){
            var height = self.innerHeight;
            var mode = document.compatMode;
            if ((mode || isIE) && !isOpera) {
                height = (mode == 'CSS1Compat') ? document.documentElement.clientHeight : document.body.clientHeight;
            }
            return height;
        },
        getViewportWidth: function(){
            var width = self.innerWidth;
            var mode = document.compatMode;
            if (mode || isIE) {
                width = (mode == 'CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth;
            }
            return width;
        }
    };
})();
YAHOO.util.Region = function(t, r, b, l){
    this.top = t;
    this[1] = t;
    this.right = r;
    this.bottom = b;
    this.left = l;
    this[0] = l;
};
YAHOO.util.Region.prototype.contains = function(region){
    return (region.left >= this.left && region.right <= this.right && region.top >= this.top && region.bottom <= this.bottom);
};
YAHOO.util.Region.prototype.getArea = function(){
    return ((this.bottom - this.top) * (this.right - this.left));
};
YAHOO.util.Region.prototype.intersect = function(region){
    var t = Math.max(this.top, region.top);
    var r = Math.min(this.right, region.right);
    var b = Math.min(this.bottom, region.bottom);
    var l = Math.max(this.left, region.left);
    if (b >= t && r >= l) {
        return new YAHOO.util.Region(t, r, b, l);
    }
    else {
        return null;
    }
};
YAHOO.util.Region.prototype.union = function(region){
    var t = Math.min(this.top, region.top);
    var r = Math.max(this.right, region.right);
    var b = Math.max(this.bottom, region.bottom);
    var l = Math.min(this.left, region.left);
    return new YAHOO.util.Region(t, r, b, l);
};
YAHOO.util.Region.prototype.toString = function(){
    return ("Region {" + "top: " + this.top + ", right: " + this.right + ", bottom: " + this.bottom + ", left: " + this.left + "}");
};
YAHOO.util.Region.getRegion = function(el){
    var p = YAHOO.util.Dom.getXY(el);
    var t = p[1];
    var r = p[0] + el.offsetWidth;
    var b = p[1] + el.offsetHeight;
    var l = p[0];
    return new YAHOO.util.Region(t, r, b, l);
};
YAHOO.util.Point = function(x, y){
    if (x instanceof Array) {
        y = x[1];
        x = x[0];
    }
    this.x = this.right = this.left = this[0] = x;
    this.y = this.top = this.bottom = this[1] = y;
};
YAHOO.util.Point.prototype = new YAHOO.util.Region();
YAHOO.register("dom", YAHOO.util.Dom, {
    version: "2.2.2",
    build: "204"
});
YAHOO.util.CustomEvent = function(type, oScope, silent, signature){
    this.type = type;
    this.scope = oScope || window;
    this.silent = silent;
    this.signature = signature || YAHOO.util.CustomEvent.LIST;
    this.subscribers = [];
    if (!this.silent) {
    }
    var onsubscribeType = "_YUICEOnSubscribe";
    if (type !== onsubscribeType) {
        this.subscribeEvent = new YAHOO.util.CustomEvent(onsubscribeType, this, true);
    }
};
YAHOO.util.CustomEvent.LIST = 0;
YAHOO.util.CustomEvent.FLAT = 1;
YAHOO.util.CustomEvent.prototype = {
    subscribe: function(fn, obj, override){
        if (!fn) {
            throw new Error("Invalid callback for subscriber to '" + this.type + "'");
        }
        if (this.subscribeEvent) {
            this.subscribeEvent.fire(fn, obj, override);
        }
        this.subscribers.push(new YAHOO.util.Subscriber(fn, obj, override));
    },
    unsubscribe: function(fn, obj){
        if (!fn) {
            return this.unsubscribeAll();
        }
        var found = false;
        for (var i = 0, len = this.subscribers.length; i < len; ++i) {
            var s = this.subscribers[i];
            if (s && s.contains(fn, obj)) {
                this._delete(i);
                found = true;
            }
        }
        return found;
    },
    fire: function(){
        var len = this.subscribers.length;
        if (!len && this.silent) {
            return true;
        }
        var args = [], ret = true, i;
        for (i = 0; i < arguments.length; ++i) {
            args.push(arguments[i]);
        }
        var argslength = args.length;
        if (!this.silent) {
        }
        for (i = 0; i < len; ++i) {
            var s = this.subscribers[i];
            if (s) {
                if (!this.silent) {
                }
                var scope = s.getScope(this.scope);
                if (this.signature == YAHOO.util.CustomEvent.FLAT) {
                    var param = null;
                    if (args.length > 0) {
                        param = args[0];
                    }
                    ret = s.fn.call(scope, param, s.obj);
                }
                else {
                    ret = s.fn.call(scope, this.type, args, s.obj);
                }
                if (false === ret) {
                    if (!this.silent) {
                    }
                    return false;
                }
            }
        }
        return true;
    },
    unsubscribeAll: function(){
        for (var i = 0, len = this.subscribers.length; i < len; ++i) {
            this._delete(len - 1 - i);
        }
        return i;
    },
    _delete: function(index){
        var s = this.subscribers[index];
        if (s) {
            delete s.fn;
            delete s.obj;
        }
        this.subscribers.splice(index, 1);
    },
    toString: function(){
        return "CustomEvent: " + "'" + this.type + "', " + "scope: " + this.scope;
    }
};
YAHOO.util.Subscriber = function(fn, obj, override){
    this.fn = fn;
    this.obj = obj || null;
    this.override = override;
};
YAHOO.util.Subscriber.prototype.getScope = function(defaultScope){
    if (this.override) {
        if (this.override === true) {
            return this.obj;
        }
        else {
            return this.override;
        }
    }
    return defaultScope;
};
YAHOO.util.Subscriber.prototype.contains = function(fn, obj){
    if (obj) {
        return (this.fn == fn && this.obj == obj);
    }
    else {
        return (this.fn == fn);
    }
};
YAHOO.util.Subscriber.prototype.toString = function(){
    return "Subscriber { obj: " + (this.obj || "") + ", override: " + (this.override || "no") + " }";
};
if (!YAHOO.util.Event) {
    YAHOO.util.Event = function(){
        var loadComplete = false;
        var DOMReady = false;
        var listeners = [];
        var unloadListeners = [];
        var legacyEvents = [];
        var legacyHandlers = [];
        var retryCount = 0;
        var onAvailStack = [];
        var legacyMap = [];
        var counter = 0;
        var lastError = null;
        return {
            POLL_RETRYS: 200,
            POLL_INTERVAL: 10,
            EL: 0,
            TYPE: 1,
            FN: 2,
            WFN: 3,
            OBJ: 3,
            ADJ_SCOPE: 4,
            isSafari: (/KHTML/gi).test(navigator.userAgent),
            webkit: function(){
                var v = navigator.userAgent.match(/AppleWebKit\/([^ ]*)/);
                if (v && v[1]) {
                    return v[1];
                }
                return null;
            }(),
            isIE: (!this.webkit && !navigator.userAgent.match(/opera/gi) && navigator.userAgent.match(/msie/gi)),
            _interval: null,
            startInterval: function(){
                if (!this._interval) {
                    var self = this;
                    var callback = function(){
                        self._tryPreloadAttach();
                    };
                    this._interval = setInterval(callback, this.POLL_INTERVAL);
                }
            },
            onAvailable: function(p_id, p_fn, p_obj, p_override){
                onAvailStack.push({
                    id: p_id,
                    fn: p_fn,
                    obj: p_obj,
                    override: p_override,
                    checkReady: false
                });
                retryCount = this.POLL_RETRYS;
                this.startInterval();
            },
            onDOMReady: function(p_fn, p_obj, p_override){
                this.DOMReadyEvent.subscribe(p_fn, p_obj, p_override);
            },
            onContentReady: function(p_id, p_fn, p_obj, p_override){
                onAvailStack.push({
                    id: p_id,
                    fn: p_fn,
                    obj: p_obj,
                    override: p_override,
                    checkReady: true
                });
                retryCount = this.POLL_RETRYS;
                this.startInterval();
            },
            addListener: function(el, sType, fn, obj, override){
                if (!fn || !fn.call) {
                    return false;
                }
                if (this._isValidCollection(el)) {
                    var ok = true;
                    for (var i = 0, len = el.length; i < len; ++i) {
                        ok = this.on(el[i], sType, fn, obj, override) && ok;
                    }
                    return ok;
                }
                else 
                    if (typeof el == "string") {
                        var oEl = this.getEl(el);
                        if (oEl) {
                            el = oEl;
                        }
                        else {
                            this.onAvailable(el, function(){
                                YAHOO.util.Event.on(el, sType, fn, obj, override);
                            });
                            return true;
                        }
                    }
                if (!el) {
                    return false;
                }
                if ("unload" == sType && obj !== this) {
                    unloadListeners[unloadListeners.length] = [el, sType, fn, obj, override];
                    return true;
                }
                var scope = el;
                if (override) {
                    if (override === true) {
                        scope = obj;
                    }
                    else {
                        scope = override;
                    }
                }
                var wrappedFn = function(e){
                    return fn.call(scope, YAHOO.util.Event.getEvent(e), obj);
                };
                var li = [el, sType, fn, wrappedFn, scope];
                var index = listeners.length;
                listeners[index] = li;
                if (this.useLegacyEvent(el, sType)) {
                    var legacyIndex = this.getLegacyIndex(el, sType);
                    if (legacyIndex == -1 || el != legacyEvents[legacyIndex][0]) {
                        legacyIndex = legacyEvents.length;
                        legacyMap[el.id + sType] = legacyIndex;
                        legacyEvents[legacyIndex] = [el, sType, el["on" + sType]];
                        legacyHandlers[legacyIndex] = [];
                        el["on" + sType] = function(e){
                            YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(e), legacyIndex);
                        };
                    }
                    legacyHandlers[legacyIndex].push(li);
                }
                else {
                    try {
                        this._simpleAdd(el, sType, wrappedFn, false);
                    } 
                    catch (ex) {
                        this.lastError = ex;
                        this.removeListener(el, sType, fn);
                        return false;
                    }
                }
                return true;
            },
            fireLegacyEvent: function(e, legacyIndex){
                var ok = true, le, lh, li, scope, ret;
                lh = legacyHandlers[legacyIndex];
                for (var i = 0, len = lh.length; i < len; ++i) {
                    li = lh[i];
                    if (li && li[this.WFN]) {
                        scope = li[this.ADJ_SCOPE];
                        ret = li[this.WFN].call(scope, e);
                        ok = (ok && ret);
                    }
                }
                le = legacyEvents[legacyIndex];
                if (le && le[2]) {
                    le[2](e);
                }
                return ok;
            },
            getLegacyIndex: function(el, sType){
                var key = this.generateId(el) + sType;
                if (typeof legacyMap[key] == "undefined") {
                    return -1;
                }
                else {
                    return legacyMap[key];
                }
            },
            useLegacyEvent: function(el, sType){
                if (this.webkit && ("click" == sType || "dblclick" == sType)) {
                    var v = parseInt(this.webkit, 10);
                    if (!isNaN(v) && v < 418) {
                        return true;
                    }
                }
                return false;
            },
            removeListener: function(el, sType, fn){
                var i, len;
                if (typeof el == "string") {
                    el = this.getEl(el);
                }
                else 
                    if (this._isValidCollection(el)) {
                        var ok = true;
                        for (i = 0, len = el.length; i < len; ++i) {
                            ok = (this.removeListener(el[i], sType, fn) && ok);
                        }
                        return ok;
                    }
                if (!fn || !fn.call) {
                    return this.purgeElement(el, false, sType);
                }
                if ("unload" == sType) {
                    for (i = 0, len = unloadListeners.length; i < len; i++) {
                        var li = unloadListeners[i];
                        if (li && li[0] == el && li[1] == sType && li[2] == fn) {
                            unloadListeners.splice(i, 1);
                            return true;
                        }
                    }
                    return false;
                }
                var cacheItem = null;
                var index = arguments[3];
                if ("undefined" == typeof index) {
                    index = this._getCacheIndex(el, sType, fn);
                }
                if (index >= 0) {
                    cacheItem = listeners[index];
                }
                if (!el || !cacheItem) {
                    return false;
                }
                if (this.useLegacyEvent(el, sType)) {
                    var legacyIndex = this.getLegacyIndex(el, sType);
                    var llist = legacyHandlers[legacyIndex];
                    if (llist) {
                        for (i = 0, len = llist.length; i < len; ++i) {
                            li = llist[i];
                            if (li && li[this.EL] == el && li[this.TYPE] == sType && li[this.FN] == fn) {
                                llist.splice(i, 1);
                                break;
                            }
                        }
                    }
                }
                else {
                    try {
                        this._simpleRemove(el, sType, cacheItem[this.WFN], false);
                    } 
                    catch (ex) {
                        this.lastError = ex;
                        return false;
                    }
                }
                delete listeners[index][this.WFN];
                delete listeners[index][this.FN];
                listeners.splice(index, 1);
                return true;
            },
            getTarget: function(ev, resolveTextNode){
                var t = ev.target || ev.srcElement;
                return this.resolveTextNode(t);
            },
            resolveTextNode: function(node){
                if (node && 3 == node.nodeType) {
                    return node.parentNode;
                }
                else {
                    return node;
                }
            },
            getPageX: function(ev){
                var x = ev.pageX;
                if (!x && 0 !== x) {
                    x = ev.clientX || 0;
                    if (this.isIE) {
                        x += this._getScrollLeft();
                    }
                }
                return x;
            },
            getPageY: function(ev){
                var y = ev.pageY;
                if (!y && 0 !== y) {
                    y = ev.clientY || 0;
                    if (this.isIE) {
                        y += this._getScrollTop();
                    }
                }
                return y;
            },
            getXY: function(ev){
                return [this.getPageX(ev), this.getPageY(ev)];
            },
            getRelatedTarget: function(ev){
                var t = ev.relatedTarget;
                if (!t) {
                    if (ev.type == "mouseout") {
                        t = ev.toElement;
                    }
                    else 
                        if (ev.type == "mouseover") {
                            t = ev.fromElement;
                        }
                }
                return this.resolveTextNode(t);
            },
            getTime: function(ev){
                if (!ev.time) {
                    var t = new Date().getTime();
                    try {
                        ev.time = t;
                    } 
                    catch (ex) {
                        this.lastError = ex;
                        return t;
                    }
                }
                return ev.time;
            },
            stopEvent: function(ev){
                this.stopPropagation(ev);
                this.preventDefault(ev);
            },
            stopPropagation: function(ev){
                if (ev.stopPropagation) {
                    ev.stopPropagation();
                }
                else {
                    ev.cancelBubble = true;
                }
            },
            preventDefault: function(ev){
                if (ev.preventDefault) {
                    ev.preventDefault();
                }
                else {
                    ev.returnValue = false;
                }
            },
            getEvent: function(e){
                var ev = e || window.event;
                if (!ev) {
                    var c = this.getEvent.caller;
                    while (c) {
                        ev = c.arguments[0];
                        if (ev && Event == ev.constructor) {
                            break;
                        }
                        c = c.caller;
                    }
                }
                return ev;
            },
            getCharCode: function(ev){
                return ev.charCode || ev.keyCode || 0;
            },
            _getCacheIndex: function(el, sType, fn){
                for (var i = 0, len = listeners.length; i < len; ++i) {
                    var li = listeners[i];
                    if (li && li[this.FN] == fn && li[this.EL] == el && li[this.TYPE] == sType) {
                        return i;
                    }
                }
                return -1;
            },
            generateId: function(el){
                var id = el.id;
                if (!id) {
                    id = "yuievtautoid-" + counter;
                    ++counter;
                    el.id = id;
                }
                return id;
            },
            _isValidCollection: function(o){
                return (o && o.length && typeof o != "string" && !o.tagName && !o.alert && typeof o[0] != "undefined");
            },
            elCache: {},
            getEl: function(id){
                return document.getElementById(id);
            },
            clearCache: function(){
            },
            DOMReadyEvent: new YAHOO.util.CustomEvent("DOMReady", this),
            _load: function(e){
                if (!loadComplete) {
                    loadComplete = true;
                    var EU = YAHOO.util.Event;
                    EU._ready();
                    if (this.isIE) {
                        EU._simpleRemove(window, "load", EU._load);
                    }
                }
            },
            _ready: function(e){
                if (!DOMReady) {
                    DOMReady = true;
                    var EU = YAHOO.util.Event;
                    EU.DOMReadyEvent.fire();
                    EU._simpleRemove(document, "DOMContentLoaded", EU._ready);
                }
            },
            _tryPreloadAttach: function(){
                if (this.locked) {
                    return false;
                }
                if (this.isIE && !DOMReady) {
                    return false;
                }
                this.locked = true;
                var tryAgain = !loadComplete;
                if (!tryAgain) {
                    tryAgain = (retryCount > 0);
                }
                var notAvail = [];
                var executeItem = function(el, item){
                    var scope = el;
                    if (item.override) {
                        if (item.override === true) {
                            scope = item.obj;
                        }
                        else {
                            scope = item.override;
                        }
                    }
                    item.fn.call(scope, item.obj);
                };
                var i, len, item, el;
                for (i = 0, len = onAvailStack.length; i < len; ++i) {
                    item = onAvailStack[i];
                    if (item && !item.checkReady) {
                        el = this.getEl(item.id);
                        if (el) {
                            executeItem(el, item);
                            onAvailStack[i] = null;
                        }
                        else {
                            notAvail.push(item);
                        }
                    }
                }
                for (i = 0, len = onAvailStack.length; i < len; ++i) {
                    item = onAvailStack[i];
                    if (item && item.checkReady) {
                        el = this.getEl(item.id);
                        if (el) {
                            if (loadComplete || el.nextSibling) {
                                executeItem(el, item);
                                onAvailStack[i] = null;
                            }
                        }
                        else {
                            notAvail.push(item);
                        }
                    }
                }
                retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
                if (tryAgain) {
                    this.startInterval();
                }
                else {
                    clearInterval(this._interval);
                    this._interval = null;
                }
                this.locked = false;
                return true;
            },
            purgeElement: function(el, recurse, sType){
                var elListeners = this.getListeners(el, sType);
                if (elListeners) {
                    for (var i = 0, len = elListeners.length; i < len; ++i) {
                        var l = elListeners[i];
                        this.removeListener(el, l.type, l.fn);
                    }
                }
                if (recurse && el && el.childNodes) {
                    for (i = 0, len = el.childNodes.length; i < len; ++i) {
                        this.purgeElement(el.childNodes[i], recurse, sType);
                    }
                }
            },
            getListeners: function(el, sType){
                var results = [], searchLists;
                if (!sType) {
                    searchLists = [listeners, unloadListeners];
                }
                else 
                    if (sType == "unload") {
                        searchLists = [unloadListeners];
                    }
                    else {
                        searchLists = [listeners];
                    }
                for (var j = 0; j < searchLists.length; ++j) {
                    var searchList = searchLists[j];
                    if (searchList && searchList.length > 0) {
                        for (var i = 0, len = searchList.length; i < len; ++i) {
                            var l = searchList[i];
                            if (l && l[this.EL] === el && (!sType || sType === l[this.TYPE])) {
                                results.push({
                                    type: l[this.TYPE],
                                    fn: l[this.FN],
                                    obj: l[this.OBJ],
                                    adjust: l[this.ADJ_SCOPE],
                                    index: i
                                });
                            }
                        }
                    }
                }
                return (results.length) ? results : null;
            },
            _unload: function(e){
                var EU = YAHOO.util.Event, i, j, l, len, index;
                for (i = 0, len = unloadListeners.length; i < len; ++i) {
                    l = unloadListeners[i];
                    if (l) {
                        var scope = window;
                        if (l[EU.ADJ_SCOPE]) {
                            if (l[EU.ADJ_SCOPE] === true) {
                                scope = l[EU.OBJ];
                            }
                            else {
                                scope = l[EU.ADJ_SCOPE];
                            }
                        }
                        l[EU.FN].call(scope, EU.getEvent(e), l[EU.OBJ]);
                        unloadListeners[i] = null;
                        l = null;
                        scope = null;
                    }
                }
                unloadListeners = null;
                if (listeners && listeners.length > 0) {
                    j = listeners.length;
                    while (j) {
                        index = j - 1;
                        l = listeners[index];
                        if (l) {
                            EU.removeListener(l[EU.EL], l[EU.TYPE], l[EU.FN], index);
                        }
                        j = j - 1;
                    }
                    l = null;
                    EU.clearCache();
                }
                for (i = 0, len = legacyEvents.length; i < len; ++i) {
                    legacyEvents[i][0] = null;
                    legacyEvents[i] = null;
                }
                legacyEvents = null;
                EU._simpleRemove(window, "unload", EU._unload);
            },
            _getScrollLeft: function(){
                return this._getScroll()[1];
            },
            _getScrollTop: function(){
                return this._getScroll()[0];
            },
            _getScroll: function(){
                var dd = document.documentElement, db = document.body;
                if (dd && (dd.scrollTop || dd.scrollLeft)) {
                    return [dd.scrollTop, dd.scrollLeft];
                }
                else 
                    if (db) {
                        return [db.scrollTop, db.scrollLeft];
                    }
                    else {
                        return [0, 0];
                    }
            },
            regCE: function(){
            },
            _simpleAdd: function(){
                if (window.addEventListener) {
                    return function(el, sType, fn, capture){
                        el.addEventListener(sType, fn, (capture));
                    };
                }
                else 
                    if (window.attachEvent) {
                        return function(el, sType, fn, capture){
                            el.attachEvent("on" + sType, fn);
                        };
                    }
                    else {
                        return function(){
                        };
                    }
            }(),
            _simpleRemove: function(){
                if (window.removeEventListener) {
                    return function(el, sType, fn, capture){
                        el.removeEventListener(sType, fn, (capture));
                    };
                }
                else 
                    if (window.detachEvent) {
                        return function(el, sType, fn){
                            el.detachEvent("on" + sType, fn);
                        };
                    }
                    else {
                        return function(){
                        };
                    }
            }()
        };
    }();
    (function(){
        var EU = YAHOO.util.Event;
        EU.on = EU.addListener;
        if (EU.isIE) {
            document.write('<scr' + 'ipt id="_yui_eu_dr" defer="true" src="//:"></script>');
            var el = document.getElementById("_yui_eu_dr");
            el.onreadystatechange = function(){
                if ("complete" == this.readyState) {
                    this.parentNode.removeChild(this);
                    YAHOO.util.Event._ready();
                }
            };
            el = null;
            YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach, YAHOO.util.Event, true);
        }
        else 
            if (EU.webkit) {
                EU._drwatch = setInterval(function(){
                    var rs = document.readyState;
                    if ("loaded" == rs || "complete" == rs) {
                        clearInterval(EU._drwatch);
                        EU._drwatch = null;
                        EU._ready();
                    }
                }, EU.POLL_INTERVAL);
            }
            else {
                EU._simpleAdd(document, "DOMContentLoaded", EU._ready);
            }
        EU._simpleAdd(window, "load", EU._load);
        EU._simpleAdd(window, "unload", EU._unload);
        EU._tryPreloadAttach();
    })();
}
YAHOO.util.EventProvider = function(){
};
YAHOO.util.EventProvider.prototype = {
    __yui_events: null,
    __yui_subscribers: null,
    subscribe: function(p_type, p_fn, p_obj, p_override){
        this.__yui_events = this.__yui_events ||
        {};
        var ce = this.__yui_events[p_type];
        if (ce) {
            ce.subscribe(p_fn, p_obj, p_override);
        }
        else {
            this.__yui_subscribers = this.__yui_subscribers ||
            {};
            var subs = this.__yui_subscribers;
            if (!subs[p_type]) {
                subs[p_type] = [];
            }
            subs[p_type].push({
                fn: p_fn,
                obj: p_obj,
                override: p_override
            });
        }
    },
    unsubscribe: function(p_type, p_fn, p_obj){
        this.__yui_events = this.__yui_events ||
        {};
        var ce = this.__yui_events[p_type];
        if (ce) {
            return ce.unsubscribe(p_fn, p_obj);
        }
        else {
            return false;
        }
    },
    unsubscribeAll: function(p_type){
        return this.unsubscribe(p_type);
    },
    createEvent: function(p_type, p_config){
        this.__yui_events = this.__yui_events ||
        {};
        var opts = p_config ||
        {};
        var events = this.__yui_events;
        if (events[p_type]) {
        }
        else {
            var scope = opts.scope || this;
            var silent = opts.silent || null;
            var ce = new YAHOO.util.CustomEvent(p_type, scope, silent, YAHOO.util.CustomEvent.FLAT);
            events[p_type] = ce;
            if (opts.onSubscribeCallback) {
                ce.subscribeEvent.subscribe(opts.onSubscribeCallback);
            }
            this.__yui_subscribers = this.__yui_subscribers ||
            {};
            var qs = this.__yui_subscribers[p_type];
            if (qs) {
                for (var i = 0; i < qs.length; ++i) {
                    ce.subscribe(qs[i].fn, qs[i].obj, qs[i].override);
                }
            }
        }
        return events[p_type];
    },
    fireEvent: function(p_type, arg1, arg2, etc){
        this.__yui_events = this.__yui_events ||
        {};
        var ce = this.__yui_events[p_type];
        if (ce) {
            var args = [];
            for (var i = 1; i < arguments.length; ++i) {
                args.push(arguments[i]);
            }
            return ce.fire.apply(ce, args);
        }
        else {
            return null;
        }
    },
    hasEvent: function(type){
        if (this.__yui_events) {
            if (this.__yui_events[type]) {
                return true;
            }
        }
        return false;
    }
};
YAHOO.util.KeyListener = function(attachTo, keyData, handler, event){
    if (!attachTo) {
    }
    else 
        if (!keyData) {
        }
        else 
            if (!handler) {
            }
    if (!event) {
        event = YAHOO.util.KeyListener.KEYDOWN;
    }
    var keyEvent = new YAHOO.util.CustomEvent("keyPressed");
    this.enabledEvent = new YAHOO.util.CustomEvent("enabled");
    this.disabledEvent = new YAHOO.util.CustomEvent("disabled");
    if (typeof attachTo == 'string') {
        attachTo = document.getElementById(attachTo);
    }
    if (typeof handler == 'function') {
        keyEvent.subscribe(handler);
    }
    else {
        keyEvent.subscribe(handler.fn, handler.scope, handler.correctScope);
    }
    function handleKeyPress(e, obj){
        if (!keyData.shift) {
            keyData.shift = false;
        }
        if (!keyData.alt) {
            keyData.alt = false;
        }
        if (!keyData.ctrl) {
            keyData.ctrl = false;
        }
        if (e.shiftKey == keyData.shift && e.altKey == keyData.alt && e.ctrlKey == keyData.ctrl) {
            var dataItem;
            var keyPressed;
            if (keyData.keys instanceof Array) {
                for (var i = 0; i < keyData.keys.length; i++) {
                    dataItem = keyData.keys[i];
                    if (dataItem == e.charCode) {
                        keyEvent.fire(e.charCode, e);
                        break;
                    }
                    else 
                        if (dataItem == e.keyCode) {
                            keyEvent.fire(e.keyCode, e);
                            break;
                        }
                }
            }
            else {
                dataItem = keyData.keys;
                if (dataItem == e.charCode) {
                    keyEvent.fire(e.charCode, e);
                }
                else 
                    if (dataItem == e.keyCode) {
                        keyEvent.fire(e.keyCode, e);
                    }
            }
        }
    }
    this.enable = function(){
        if (!this.enabled) {
            YAHOO.util.Event.addListener(attachTo, event, handleKeyPress);
            this.enabledEvent.fire(keyData);
        }
        this.enabled = true;
    };
    this.disable = function(){
        if (this.enabled) {
            YAHOO.util.Event.removeListener(attachTo, event, handleKeyPress);
            this.disabledEvent.fire(keyData);
        }
        this.enabled = false;
    };
    this.toString = function(){
        return "KeyListener [" + keyData.keys + "] " + attachTo.tagName +
        (attachTo.id ? "[" + attachTo.id + "]" : "");
    };
};
YAHOO.util.KeyListener.KEYDOWN = "keydown";
YAHOO.util.KeyListener.KEYUP = "keyup";
YAHOO.register("event", YAHOO.util.Event, {
    version: "2.2.2",
    build: "204"
});
