if (typeof YAHOO == "undefined" || !YAHOO) {
    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.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: []
};
YAHOO.env.getVersion = function (name) {
    return YAHOO.env.modules[name] || null
};
YAHOO.env.ua = function () {
    var o = {
        ie: 0,
        opera: 0,
        gecko: 0,
        webkit: 0,
        mobile: null,
        air: 0
    };
    var ua = navigator.userAgent,
        m;
    if ((/KHTML/).test(ua)) {
        o.webkit = 1
    }
    m = ua.match(/AppleWebKit\/([^\s]*)/);
    if (m && m[1]) {
        o.webkit = parseFloat(m[1]);
        if (/ Mobile\//.test(ua)) {
            o.mobile = "Apple"
        } else {
            m = ua.match(/NokiaN[^\/]*/);
            if (m) {
                o.mobile = m[0]
            }
        }
        m = ua.match(/AdobeAIR\/([^\s]*)/);
        if (m) {
            o.air = m[0]
        }
    }
    if (!o.webkit) {
        m = ua.match(/Opera[\s\/]([^\s]*)/);
        if (m && m[1]) {
            o.opera = parseFloat(m[1]);
            m = ua.match(/Opera Mini[^;]*/);
            if (m) {
                o.mobile = m[0]
            }
        } else {
            m = ua.match(/MSIE\s([^;]*)/);
            if (m && m[1]) {
                o.ie = parseFloat(m[1])
            } else {
                m = ua.match(/Gecko\/([^\s]*)/);
                if (m) {
                    o.gecko = 1;
                    m = ua.match(/rv:([^\s\)]*)/);
                    if (m && m[1]) {
                        o.gecko = parseFloat(m[1])
                    }
                }
            }
        }
    }
    return o
}();
(function () {
    YAHOO.namespace("util", "widget", "example");
    if ("undefined" !== typeof YAHOO_config) {
        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.lang = YAHOO.lang || {};
(function () {
    var L = YAHOO.lang,
        ADD = ["toString", "valueOf"],
        OB = {
        isArray: function (o) {
            if (o) {
                return L.isNumber(o.length) && L.isFunction(o.splice)
            }
            return false
        },
        isBoolean: function (o) {
            return typeof o === "boolean"
        },
        isFunction: function (o) {
            return typeof o === "function"
        },
        isNull: function (o) {
            return o === null
        },
        isNumber: function (o) {
            return typeof o === "number" && isFinite(o)
        },
        isObject: function (o) {
            return (o && (typeof o === "object" || L.isFunction(o))) || false
        },
        isString: function (o) {
            return typeof o === "string"
        },
        isUndefined: function (o) {
            return typeof o === "undefined"
        },
        _IEEnumFix: (YAHOO.env.ua.ie) ?
        function (r, s) {
            for (var i = 0;
            i < ADD.length; i = i + 1) {
                var fname = ADD[i],
                    f = s[fname];
                if (L.isFunction(f) && f != Object.prototype[fname]) {
                    r[fname] = f
                }
            }
        } : function () {},
        extend: function (subc, superc, overrides) {
            if (!superc || !subc) {
                throw new Error("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) {
                    if (L.hasOwnProperty(overrides, i)) {
                        subc.prototype[i] = overrides[i]
                    }
                }
                L._IEEnumFix(subc.prototype, overrides)
            }
        },
        augmentObject: function (r, s) {
            if (!s || !r) {
                throw new Error("Absorb failed, verify dependencies.")
            }
            var a = arguments,
                i, p, override = a[2];
            if (override && override !== true) {
                for (i = 2; i < a.length; i = i + 1) {
                    r[a[i]] = s[a[i]]
                }
            } else {
                for (p in s) {
                    if (override || !(p in r)) {
                        r[p] = s[p]
                    }
                }
                L._IEEnumFix(r, s)
            }
        },
        augmentProto: function (r, s) {
            if (!s || !r) {
                throw new Error("Augment failed, verify dependencies.")
            }
            var a = [r.prototype, s.prototype];
            for (var i = 2; i < arguments.length; i = i + 1) {
                a.push(arguments[i])
            }
            L.augmentObject.apply(this, a)
        },
        dump: function (o, d) {
            var i, len, s = [],
                OBJ = "{...}",
                FUN = "f(){...}",
                COMMA = ", ",
                ARROW = " => ";
            if (!L.isObject(o)) {
                return o + ""
            } else {
                if (o instanceof Date || ("nodeType" in o && "tagName" in o)) {
                    return o
                } else {
                    if (L.isFunction(o)) {
                        return FUN
                    }
                }
            }
            d = (L.isNumber(d)) ? d : 3;
            if (L.isArray(o)) {
                s.push("[");
                for (i = 0, len = o.length;
                i < len; i = i + 1) {
                    if (L.isObject(o[i])) {
                        s.push((d > 0) ? L.dump(o[i], d - 1) : OBJ)
                    } else {
                        s.push(o[i])
                    }
                    s.push(COMMA)
                }
                if (s.length > 1) {
                    s.pop()
                }
                s.push("]")
            } else {
                s.push("{");
                for (i in o) {
                    if (L.hasOwnProperty(o, i)) {
                        s.push(i + ARROW);
                        if (L.isObject(o[i])) {
                            s.push((d > 0) ? L.dump(o[i], d - 1) : OBJ)
                        } else {
                            s.push(o[i])
                        }
                        s.push(COMMA)
                    }
                }
                if (s.length > 1) {
                    s.pop()
                }
                s.push("}")
            }
            return s.join("")
        },
        substitute: function (s, o, f) {
            var i, j, k, key, v, meta, saved = [],
                token, DUMP = "dump",
                SPACE = " ",
                LBRACE = "{",
                RBRACE = "}";
            for (;;) {
                i = s.lastIndexOf(LBRACE);
                if (i < 0) {
                    break
                }
                j = s.indexOf(RBRACE, i);
                if (i + 1 >= j) {
                    break
                }
                token = s.substring(i + 1, j);
                key = token;
                meta = null;
                k = key.indexOf(SPACE);
                if (k > -1) {
                    meta = key.substring(k + 1);
                    key = key.substring(0, k)
                }
                v = o[key];
                if (f) {
                    v = f(key, v, meta)
                }
                if (L.isObject(v)) {
                    if (L.isArray(v)) {
                        v = L.dump(v, parseInt(meta, 10))
                    } else {
                        meta = meta || "";
                        var dump = meta.indexOf(DUMP);
                        if (dump > -1) {
                            meta = meta.substring(4)
                        }
                        if (v.toString === Object.prototype.toString || dump > -1) {
                            v = L.dump(v, parseInt(meta, 10))
                        } else {
                            v = v.toString()
                        }
                    }
                } else {
                    if (!L.isString(v) && !L.isNumber(v)) {
                        v = "~-" + saved.length + "-~";
                        saved[saved.length] = token
                    }
                }
                s = s.substring(0, i) + v + s.substring(j + 1)
            }
            for (i = saved.length - 1; i >= 0; i = i - 1) {
                s = s.replace(new RegExp("~-" + i + "-~"), "{" + saved[i] + "}", "g")
            }
            return s
        },
        trim: function (s) {
            try {
                return s.replace(/^\s+|\s+$/g, "")
            } catch(e) {
                return s
            }
        },
        merge: function () {
            var o = {},
                a = arguments;
            for (var i = 0, l = a.length; i < l; i = i + 1) {
                L.augmentObject(o, a[i], true)
            }
            return o
        },
        later: function (when, o, fn, data, periodic) {
            when = when || 0;
            o = o || {};
            var m = fn,
                d = data,
                f, r;
            if (L.isString(fn)) {
                m = o[fn]
            }
            if (!m) {
                throw new TypeError("method undefined")
            }
            if (!L.isArray(d)) {
                d = [data]
            }
            f = function () {
                m.apply(o, d)
            };
            r = (periodic) ? setInterval(f, when) : setTimeout(f, when);
            return {
                interval: periodic,
                cancel: function () {
                    if (this.interval) {
                        clearInterval(r)
                    } else {
                        clearTimeout(r)
                    }
                }
            }
        },
        isValue: function (o) {
            return (L.isObject(o) || L.isString(o) || L.isNumber(o) || L.isBoolean(o))
        }
    };
    L.hasOwnProperty = (Object.prototype.hasOwnProperty) ?
    function (o, prop) {
        return o && o.hasOwnProperty(prop)
    } : function (o, prop) {
        return !L.isUndefined(o[prop]) && o.constructor.prototype[prop] !== o[prop]
    };
    OB.augmentObject(L, OB, true);
    YAHOO.util.Lang = L;
    L.augment = L.augmentProto;
    YAHOO.augment = L.augmentProto;
    YAHOO.extend = L.extend
})();
YAHOO.register("yahoo", YAHOO, {
    version: "2.5.2",
    build: "1076"
});

(function () {
    var Y = YAHOO.util,
        getStyle, setStyle, propertyCache = {},
        reClassNameCache = {},
        document = window.document;
    YAHOO.env._id_counter = YAHOO.env._id_counter || 0;
    var isOpera = YAHOO.env.ua.opera,
        isSafari = YAHOO.env.ua.webkit,
        isGecko = YAHOO.env.ua.gecko,
        isIE = YAHOO.env.ua.ie;
    var patterns = {
        HYPHEN: /(-[a-z])/i,
        ROOT_TAG: /^body|html$/i,
        OP_SCROLL: /^(?:inline|table-row)$/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
    };
    var getClassRegEx = function (className) {
        var re = reClassNameCache[className];
        if (!re) {
            re = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)");
            reClassNameCache[className] = re
        }
        return re
    };
    if (document.defaultView && document.defaultView.getComputedStyle) {
        getStyle = function (el, property) {
            var value = null;
            if (property == "float") {
                property = "cssFloat"
            }
            var computed = el.ownerDocument.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;
                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
        }
    }
    var testElement = function (node, method) {
        return node && node.nodeType == 1 && (!method || method(node))
    };
    YAHOO.util.Dom = {
        get: function (el) {
            if (el && (el.nodeType || el.item)) {
                return el
            }
            if (YAHOO.lang.isString(el) || !el) {
                return document.getElementById(el)
            }
            if (el.length !== undefined) {
                var c = [];
                for (var i = 0, len = el.length; i < len; ++i) {
                    c[c.length] = Y.Dom.get(el[i])
                }
                return c
            }
            return el
        },
        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 != el.ownerDocument.body) {
                    return false
                }
                return getXY(el)
            };
            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) {
                if ((el.parentNode === null || el.offsetParent === null || this.getStyle(el, "display") == "none") && el != el.ownerDocument.body) {
                    return false
                }
                var region = 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()
        },
        getElementsByClassName2: function (className, tag, root, apply) {
            tag = tag || "*";
            root = (root) ? Y.Dom.get(root) : null || document;
            if (!root) {
                return []
            }
            var nodes = [],
                elements = root.getElementsByTagName(tag),
                re = getClassRegEx(className);
            for (var i = 0, len = elements.length; i < len; ++i) {
                if (re.test(elements[i].className)) {
                    nodes[nodes.length] = elements[i];
                    if (apply) {
                        apply.call(elements[i], elements[i])
                    }
                }
            }
            return nodes
        },
        hasClass: function (el, className) {
            var re = getClassRegEx(className);
            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 false
                }
                el.className = YAHOO.lang.trim([el.className, className].join(" "));
                return true
            };
            return Y.Dom.batch(el, f, Y.Dom, true)
        },
        removeClass: function (el, className) {
            var re = getClassRegEx(className);
            var f = function (el) {
                if (!className || !this.hasClass(el, className)) {
                    return false
                }
                var c = el.className;
                el.className = c.replace(re, " ");
                if (this.hasClass(el, className)) {
                    this.removeClass(el, className)
                }
                el.className = YAHOO.lang.trim(el.className);
                return true
            };
            return Y.Dom.batch(el, f, Y.Dom, true)
        },
        replaceClass: function (el, oldClassName, newClassName) {
            if (!newClassName || oldClassName === newClassName) {
                return false
            }
            var re = getClassRegEx(oldClassName);
            var f = function (el) {
                if (!this.hasClass(el, oldClassName)) {
                    this.addClass(el, newClassName);
                    return true
                }
                el.className = el.className.replace(re, " " + newClassName + " ");
                if (this.hasClass(el, oldClassName)) {
                    this.replaceClass(el, oldClassName, newClassName)
                }
                el.className = YAHOO.lang.trim(el.className);
                return true
            };
            return Y.Dom.batch(el, f, Y.Dom, true)
        },
        generateId: function (el, prefix) {
            prefix = prefix || "yui-gen";
            var f = function (el) {
                if (el && el.id) {
                    return el.id
                }
                var id = prefix + YAHOO.env._id_counter++;
                if (el) {
                    el.id = id
                }
                return id
            };
            return Y.Dom.batch(el, f, Y.Dom, true) || f.apply(Y.Dom, arguments)
        },
        isAncestor: function (haystack, needle) {
            haystack = Y.Dom.get(haystack);
            needle = Y.Dom.get(needle);
            if (!haystack || !needle) {
                return false
            }
            if (haystack.contains && needle.nodeType && !isSafari) {
                return haystack.contains(needle)
            } else {
                if (haystack.compareDocumentPosition && needle.nodeType) {
                    return !! (haystack.compareDocumentPosition(needle) & 16)
                } else {
                    if (needle.nodeType) {
                        return !!this.getAncestorBy(needle, function (el) {
                            return el == haystack
                        })
                    }
                }
            }
            return false
        },
        inDocument: function (el) {
            return this.isAncestor(document.documentElement, el)
        },
        getElementsBy: function (method, tag, root, apply) {
            tag = tag || "*";
            root = (root) ? Y.Dom.get(root) : null || document;
            if (!root) {
                return []
            }
            var nodes = [],
                elements = root.getElementsByTagName(tag);
            for (var i = 0, len = elements.length; i < len; ++i) {
                if (method(elements[i])) {
                    nodes[nodes.length] = elements[i];
                    if (apply) {
                        apply(elements[i])
                    }
                }
            }
            return nodes
        },
        batch: function (el, method, o, override) {
            el = (el && (el.tagName || el.item)) ? el : Y.Dom.get(el);
            if (!el || !method) {
                return false
            }
            var scope = (override) ? o : window;
            if (el.tagName || el.length === undefined) {
                return method.call(scope, el, o)
            }
            var collection = [];
            for (var i = 0, len = el.length; i < len; ++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
        },
        getAncestorBy: function (node, method) {
            while (node = node.parentNode) {
                if (testElement(node, method)) {
                    return node
                }
            }
            return null
        },
        getAncestorByClassName: function (node, className) {
            node = Y.Dom.get(node);
            if (!node) {
                return null
            }
            var method = function (el) {
                return Y.Dom.hasClass(el, className)
            };
            return Y.Dom.getAncestorBy(node, method)
        },
        getAncestorByTagName: function (node, tagName) {
            node = Y.Dom.get(node);
            if (!node) {
                return null
            }
            var method = function (el) {
                return el.tagName && el.tagName.toUpperCase() == tagName.toUpperCase()
            };
            return Y.Dom.getAncestorBy(node, method)
        },
        getPreviousSiblingBy: function (node, method) {
            while (node) {
                node = node.previousSibling;
                if (testElement(node, method)) {
                    return node
                }
            }
            return null
        },
        getPreviousSibling: function (node) {
            node = Y.Dom.get(node);
            if (!node) {
                return null
            }
            return Y.Dom.getPreviousSiblingBy(node)
        },
        getNextSiblingBy: function (node, method) {
            while (node) {
                node = node.nextSibling;
                if (testElement(node, method)) {
                    return node
                }
            }
            return null
        },
        getNextSibling: function (node) {
            node = Y.Dom.get(node);
            if (!node) {
                return null
            }
            return Y.Dom.getNextSiblingBy(node)
        },
        getFirstChildBy: function (node, method) {
            var child = (testElement(node.firstChild, method)) ? node.firstChild : null;
            return child || Y.Dom.getNextSiblingBy(node.firstChild, method)
        },
        getFirstChild: function (node, method) {
            node = Y.Dom.get(node);
            if (!node) {
                return null
            }
            return Y.Dom.getFirstChildBy(node)
        },
        getLastChildBy: function (node, method) {
            if (!node) {
                return null
            }
            var child = (testElement(node.lastChild, method)) ? node.lastChild : null;
            return child || Y.Dom.getPreviousSiblingBy(node.lastChild, method)
        },
        getLastChild: function (node) {
            node = Y.Dom.get(node);
            return Y.Dom.getLastChildBy(node)
        },
        getChildrenBy: function (node, method) {
            var child = Y.Dom.getFirstChildBy(node, method);
            var children = child ? [child] : [];
            Y.Dom.getNextSiblingBy(child, function (node) {
                if (!method || method(node)) {
                    children[children.length] = node
                }
                return false
            });
            return children
        },
        getChildren: function (node) {
            node = Y.Dom.get(node);
            if (!node) {}
            return Y.Dom.getChildrenBy(node)
        },
        getDocumentScrollLeft: function (doc) {
            doc = doc || document;
            return Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft)
        },
        getDocumentScrollTop: function (doc) {
            doc = doc || document;
            return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)
        },
        insertBefore: function (newNode, referenceNode) {
            newNode = Y.Dom.get(newNode);
            referenceNode = Y.Dom.get(referenceNode);
            if (!newNode || !referenceNode || !referenceNode.parentNode) {
                return null
            }
            return referenceNode.parentNode.insertBefore(newNode, referenceNode)
        },
        insertAfter: function (newNode, referenceNode) {
            newNode = Y.Dom.get(newNode);
            referenceNode = Y.Dom.get(referenceNode);
            if (!newNode || !referenceNode || !referenceNode.parentNode) {
                return null
            }
            if (referenceNode.nextSibling) {
                return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling)
            } else {
                return referenceNode.parentNode.appendChild(newNode)
            }
        },
        getClientRegion: function () {
            var t = Y.Dom.getDocumentScrollTop(),
                l = Y.Dom.getDocumentScrollLeft(),
                r = Y.Dom.getViewportWidth() + l,
                b = Y.Dom.getViewportHeight() + t;
            return new Y.Region(t, r, b, l)
        }
    };
    var getXY = function () {
        if (document.documentElement.getBoundingClientRect) {
            return function (el) {
                var box = el.getBoundingClientRect();
                var rootNode = el.ownerDocument;
                return [box.left + Y.Dom.getDocumentScrollLeft(rootNode), box.top + Y.Dom.getDocumentScrollTop(rootNode)]
            }
        } else {
            return function (el) {
                var pos = [el.offsetLeft, el.offsetTop];
                var parentNode = el.offsetParent;
                var accountForBody = (isSafari && Y.Dom.getStyle(el, "position") == "absolute" && el.offsetParent == el.ownerDocument.body);
                if (parentNode != el) {
                    while (parentNode) {
                        pos[0] += parentNode.offsetLeft;
                        pos[1] += parentNode.offsetTop;
                        if (!accountForBody && isSafari && Y.Dom.getStyle(parentNode, "position") == "absolute") {
                            accountForBody = true
                        }
                        parentNode = parentNode.offsetParent
                    }
                }
                if (accountForBody) {
                    pos[0] -= el.ownerDocument.body.offsetLeft;
                    pos[1] -= el.ownerDocument.body.offsetTop
                }
                parentNode = el.parentNode;
                while (parentNode.tagName && !patterns.ROOT_TAG.test(parentNode.tagName)) {
                    if (parentNode.scrollTop || parentNode.scrollLeft) {
                        if (!patterns.OP_SCROLL.test(Y.Dom.getStyle(parentNode, "display"))) {
                            if (!isOpera || Y.Dom.getStyle(parentNode, "overflow") !== "visible") {
                                pos[0] -= parentNode.scrollLeft;
                                pos[1] -= parentNode.scrollTop
                            }
                        }
                    }
                    parentNode = parentNode.parentNode
                }
                return pos
            }
        }
    }()
})();
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 (YAHOO.lang.isArray(x)) {
        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.5.2",
    build: "1076"
});

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)
    }
    this.lastError = null
};
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 () {
        this.lastError = null;
        var errors = [],
            len = this.subscribers.length;
        if (!len && this.silent) {
            return true
        }
        var args = [].slice.call(arguments, 0),
            ret = true,
            i, rebuild = false;
        if (!this.silent) {}
        var subs = this.subscribers.slice(),
            throwErrors = YAHOO.util.Event.throwErrors;
        for (i = 0; i < len; ++i) {
            var s = subs[i];
            if (!s) {
                rebuild = true
            } else {
                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]
                    }
                    try {
                        ret = s.fn.call(scope, param, s.obj)
                    } catch(e) {
                        this.lastError = e;
                        if (throwErrors) {
                            throw e
                        }
                    }
                } else {
                    try {
                        ret = s.fn.call(scope, this.type, args, s.obj)
                    } catch(ex) {
                        this.lastError = ex;
                        if (throwErrors) {
                            throw ex
                        }
                    }
                }
                if (false === ret) {
                    if (!this.silent) {}
                    break
                }
            }
        }
        return (ret !== false)
    },
    unsubscribeAll: function () {
        for (var i = this.subscribers.length - 1; i > -1; i--) {
            this._delete(i)
        }
        this.subscribers = [];
        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 = YAHOO.lang.isUndefined(obj) ? null : obj;
    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 listeners = [];
        var unloadListeners = [];
        var legacyEvents = [];
        var legacyHandlers = [];
        var retryCount = 0;
        var onAvailStack = [];
        var legacyMap = [];
        var counter = 0;
        var webkitKeymap = {
            63232: 38,
            63233: 40,
            63234: 37,
            63235: 39,
            63276: 33,
            63277: 34,
            25: 9
        };
        return {
            POLL_RETRYS: 2000,
            POLL_INTERVAL: 20,
            EL: 0,
            TYPE: 1,
            FN: 2,
            WFN: 3,
            UNLOAD_OBJ: 3,
            ADJ_SCOPE: 4,
            OBJ: 5,
            OVERRIDE: 6,
            lastError: null,
            isSafari: YAHOO.env.ua.webkit,
            webkit: YAHOO.env.ua.webkit,
            isIE: YAHOO.env.ua.ie,
            _interval: null,
            _dri: null,
            DOMReady: false,
            throwErrors: false,
            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, checkContent) {
                var a = (YAHOO.lang.isString(p_id)) ? [p_id] : p_id;
                for (var i = 0; i < a.length; i = i + 1) {
                    onAvailStack.push({
                        id: a[i],
                        fn: p_fn,
                        obj: p_obj,
                        override: p_override,
                        checkReady: checkContent
                    })
                }
                retryCount = this.POLL_RETRYS;
                this.startInterval()
            },
            onContentReady: function (p_id, p_fn, p_obj, p_override) {
                this.onAvailable(p_id, p_fn, p_obj, p_override, true)
            },
            onDOMReady: function (p_fn, p_obj, p_override) {
                if (this.DOMReady) {
                    setTimeout(function () {
                        var s = window;
                        if (p_override) {
                            if (p_override === true) {
                                s = p_obj
                            } else {
                                s = p_override
                            }
                        }
                        p_fn.call(s, "DOMReady", [], p_obj)
                    },
                    0)
                } else {
                    this.DOMReadyEvent.subscribe(p_fn, p_obj, p_override)
                }
            },
            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 (YAHOO.lang.isString(el)) {
                        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, el), obj)
                };
                var li = [el, sType, fn, wrappedFn, scope, obj, override];
                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].slice();
                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, li;
                if (typeof el == "string") {
                    el = this.getEl(el)
                } else {
                    if (this._isValidCollection(el)) {
                        var ok = true;
                        for (i = el.length - 1;
                        i > -1; 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 = unloadListeners.length - 1; i > -1; i--) {
                        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 (n) {
                try {
                    if (n && 3 == n.nodeType) {
                        return n.parentNode
                    }
                } catch(e) {}
                return n
            },
            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, boundEl) {
                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) {
                var code = ev.keyCode || ev.charCode || 0;
                if (YAHOO.env.ua.webkit && (code in webkitKeymap)) {
                    code = webkitKeymap[code]
                }
                return code
            },
            _getCacheIndex: function (el, sType, fn) {
                for (var i = 0, l = listeners.length; i < l; i = i + 1) {
                    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) {
                try {
                    return (o && typeof o !== "string" && o.length && !o.tagName && !o.alert && typeof o[0] !== "undefined")
                } catch(ex) {
                    return false
                }
            },
            elCache: {},
            getEl: function (id) {
                return (typeof id === "string") ? document.getElementById(id) : id
            },
            clearCache: function () {},
            DOMReadyEvent: new YAHOO.util.CustomEvent("DOMReady", this),
            _load: function (e) {
                if (!loadComplete) {
                    loadComplete = true;
                    var EU = YAHOO.util.Event;
                    EU._ready();
                    EU._tryPreloadAttach()
                }
            },
            _ready: function (e) {
                var EU = YAHOO.util.Event;
                if (!EU.DOMReady) {
                    EU.DOMReady = true;
                    EU.DOMReadyEvent.fire();
                    EU._simpleRemove(document, "DOMContentLoaded", EU._ready)
                }
            },
            _tryPreloadAttach: function () {
                if (onAvailStack.length === 0) {
                    retryCount = 0;
                    clearInterval(this._interval);
                    this._interval = null;
                    return
                }
                if (this.locked) {
                    return
                }
                if (this.isIE) {
                    if (!this.DOMReady) {
                        this.startInterval();
                        return
                    }
                }
                this.locked = true;
                var tryAgain = !loadComplete;
                if (!tryAgain) {
                    tryAgain = (retryCount > 0 && onAvailStack.length > 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, ready = [];
                for (i = 0, len = onAvailStack.length; i < len; i = i + 1) {
                    item = onAvailStack[i];
                    if (item) {
                        el = this.getEl(item.id);
                        if (el) {
                            if (item.checkReady) {
                                if (loadComplete || el.nextSibling || !tryAgain) {
                                    ready.push(item);
                                    onAvailStack[i] = null
                                }
                            } else {
                                executeItem(el, item);
                                onAvailStack[i] = null
                            }
                        } else {
                            notAvail.push(item)
                        }
                    }
                }
                for (i = 0, len = ready.length; i < len; i = i + 1) {
                    item = ready[i];
                    executeItem(this.getEl(item.id), item)
                }
                retryCount--;
                if (tryAgain) {
                    for (i = onAvailStack.length - 1;
                    i > -1; i--) {
                        item = onAvailStack[i];
                        if (!item || !item.id) {
                            onAvailStack.splice(i, 1)
                        }
                    }
                    this.startInterval()
                } else {
                    clearInterval(this._interval);
                    this._interval = null
                }
                this.locked = false
            },
            purgeElement: function (el, recurse, sType) {
                var oEl = (YAHOO.lang.isString(el)) ? this.getEl(el) : el;
                var elListeners = this.getListeners(oEl, sType),
                    i, len;
                if (elListeners) {
                    for (i = elListeners.length - 1; i > -1; i--) {
                        var l = elListeners[i];
                        this.removeListener(oEl, l.type, l.fn)
                    }
                }
                if (recurse && oEl && oEl.childNodes) {
                    for (i = 0, len = oEl.childNodes.length;
                    i < len; ++i) {
                        this.purgeElement(oEl.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]
                    }
                }
                var oEl = (YAHOO.lang.isString(el)) ? this.getEl(el) : el;
                for (var j = 0; j < searchLists.length; j = j + 1) {
                    var searchList = searchLists[j];
                    if (searchList) {
                        for (var i = 0, len = searchList.length;
                        i < len; ++i) {
                            var l = searchList[i];
                            if (l && l[this.EL] === oEl && (!sType || sType === l[this.TYPE])) {
                                results.push({
                                    type: l[this.TYPE],
                                    fn: l[this.FN],
                                    obj: l[this.OBJ],
                                    adjust: l[this.OVERRIDE],
                                    scope: l[this.ADJ_SCOPE],
                                    index: i
                                })
                            }
                        }
                    }
                }
                return (results.length) ? results : null
            },
            _unload: function (e) {
                var EU = YAHOO.util.Event,
                    i, j, l, len, index, ul = unloadListeners.slice();
                for (i = 0, len = unloadListeners.length; i < len; ++i) {
                    l = ul[i];
                    if (l) {
                        var scope = window;
                        if (l[EU.ADJ_SCOPE]) {
                            if (l[EU.ADJ_SCOPE] === true) {
                                scope = l[EU.UNLOAD_OBJ]
                            } else {
                                scope = l[EU.ADJ_SCOPE]
                            }
                        }
                        l[EU.FN].call(scope, EU.getEvent(e, l[EU.EL]), l[EU.UNLOAD_OBJ]);
                        ul[i] = null;
                        l = null;
                        scope = null
                    }
                }
                unloadListeners = null;
                if (listeners) {
                    for (j = listeners.length - 1; j > -1; j--) {
                        l = listeners[j];
                        if (l) {
                            EU.removeListener(l[EU.EL], l[EU.TYPE], l[EU.FN], j)
                        }
                    }
                    l = 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;
        /* DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
        if (EU.isIE) {
            YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach, YAHOO.util.Event, true);
            var n = document.createElement("p");
            EU._dri = setInterval(function () {
                try {
                    n.doScroll("left");
                    clearInterval(EU._dri);
                    EU._dri = null;
                    EU._ready();
                    n = null
                } catch(ex) {}
            },
            EU.POLL_INTERVAL)
        } else {
            if (EU.webkit && EU.webkit < 525) {
                EU._dri = setInterval(function () {
                    var rs = document.readyState;
                    if ("loaded" == rs || "complete" == rs) {
                        clearInterval(EU._dri);
                        EU._dri = 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 evts = this.__yui_events;
        if (p_type) {
            var ce = evts[p_type];
            if (ce) {
                return ce.unsubscribe(p_fn, p_obj)
            }
        } else {
            var ret = true;
            for (var i in evts) {
                if (YAHOO.lang.hasOwnProperty(evts, i)) {
                    ret = ret && evts[i].unsubscribe(p_fn, p_obj)
                }
            }
            return ret
        }
        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);
            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) {
            return null
        }
        var args = [];
        for (var i = 1; i < arguments.length; ++i) {
            args.push(arguments[i])
        }
        return ce.fire.apply(ce, args)
    },
    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;
            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.util.KeyListener.KEY = {
    ALT: 18,
    BACK_SPACE: 8,
    CAPS_LOCK: 20,
    CONTROL: 17,
    DELETE: 46,
    DOWN: 40,
    END: 35,
    ENTER: 13,
    ESCAPE: 27,
    HOME: 36,
    LEFT: 37,
    META: 224,
    NUM_LOCK: 144,
    PAGE_DOWN: 34,
    PAGE_UP: 33,
    PAUSE: 19,
    PRINTSCREEN: 44,
    RIGHT: 39,
    SCROLL_LOCK: 145,
    SHIFT: 16,
    SPACE: 32,
    TAB: 9,
    UP: 38
};
YAHOO.register("event", YAHOO.util.Event, {
    version: "2.5.2",
    build: "1076"
});

YAHOO.util.Get = function () {
    var queues = {},
        qidx = 0,
        nidx = 0,
        purging = false,
        ua = YAHOO.env.ua,
        lang = YAHOO.lang;
    var _node = function (type, attr, win) {
        var w = win || window,
            d = w.document,
            n = d.createElement(type);
        for (var i in attr) {
            if (attr[i] && YAHOO.lang.hasOwnProperty(attr, i)) {
                n.setAttribute(i, attr[i])
            }
        }
        return n
    };
    var _linkNode = function (url, win, charset) {
        var c = charset || "utf-8";
        return _node("link", {
            id: "yui__dyn_" + (nidx++),
            type: "text/css",
            charset: c,
            rel: "stylesheet",
            href: url
        },
        win)
    };
    var _scriptNode = function (url, win, charset) {
        var c = charset || "utf-8";
        return _node("script", {
            id: "yui__dyn_" + (nidx++),
            type: "text/javascript",
            charset: c,
            src: url
        },
        win)
    };
    var _returnData = function (q, msg) {
        return {
            tId: q.tId,
            win: q.win,
            data: q.data,
            nodes: q.nodes,
            msg: msg,
            purge: function () {
                _purge(this.tId)
            }
        }
    };
    var _get = function (nId, tId) {
        var q = queues[tId],
            n = (lang.isString(nId)) ? q.win.document.getElementById(nId) : nId;
        if (!n) {
            _fail(tId, "target node not found: " + nId)
        }
        return n
    };
    var _fail = function (id, msg) {
        var q = queues[id];
        if (q.onFailure) {
            var sc = q.scope || q.win;
            q.onFailure.call(sc, _returnData(q, msg))
        }
    };
    var _finish = function (id) {
        var q = queues[id];
        q.finished = true;
        if (q.aborted) {
            var msg = "transaction " + id + " was aborted";
            _fail(id, msg);
            return
        }
        if (q.onSuccess) {
            var sc = q.scope || q.win;
            q.onSuccess.call(sc, _returnData(q))
        }
    };
    var _next = function (id, loaded) {
        var q = queues[id];
        if (q.aborted) {
            var msg = "transaction " + id + " was aborted";
            _fail(id, msg);
            return
        }
        if (loaded) {
            q.url.shift();
            if (q.varName) {
                q.varName.shift()
            }
        } else {
            q.url = (lang.isString(q.url)) ? [q.url] : q.url;
            if (q.varName) {
                q.varName = (lang.isString(q.varName)) ? [q.varName] : q.varName
            }
        }
        var w = q.win,
            d = w.document,
            h = d.getElementsByTagName("head")[0],
            n;
        if (q.url.length === 0) {
            if (q.type === "script" && ua.webkit && ua.webkit < 420 && !q.finalpass && !q.varName) {
                var extra = _scriptNode(null, q.win, q.charset);
                extra.innerHTML = 'YAHOO.util.Get._finalize("' + id + '");';
                q.nodes.push(extra);
                h.appendChild(extra)
            } else {
                _finish(id)
            }
            return
        }
        var url = q.url[0];
        if (q.type === "script") {
            n = _scriptNode(url, w, q.charset)
        } else {
            n = _linkNode(url, w, q.charset)
        }
        _track(q.type, n, id, url, w, q.url.length);
        q.nodes.push(n);
        if (q.insertBefore) {
            var s = _get(q.insertBefore, id);
            if (s) {
                s.parentNode.insertBefore(n, s)
            }
        } else {
            h.appendChild(n)
        }
        if ((ua.webkit || ua.gecko) && q.type === "css") {
            _next(id, url)
        }
    };
    var _autoPurge = function () {
        if (purging) {
            return
        }
        purging = true;
        for (var i in queues) {
            var q = queues[i];
            if (q.autopurge && q.finished) {
                _purge(q.tId);
                delete queues[i]
            }
        }
        purging = false
    };
    var _purge = function (tId) {
        var q = queues[tId];
        if (q) {
            var n = q.nodes,
                l = n.length,
                d = q.win.document,
                h = d.getElementsByTagName("head")[0];
            if (q.insertBefore) {
                var s = _get(q.insertBefore, tId);
                if (s) {
                    h = s.parentNode
                }
            }
            for (var i = 0; i < l; i = i + 1) {
                h.removeChild(n[i])
            }
        }
        q.nodes = []
    };
    var _queue = function (type, url, opts) {
        var id = "q" + (qidx++);
        opts = opts || {};
        if (qidx % YAHOO.util.Get.PURGE_THRESH === 0) {
            _autoPurge()
        }
        queues[id] = lang.merge(opts, {
            tId: id,
            type: type,
            url: url,
            finished: false,
            nodes: []
        });
        var q = queues[id];
        q.win = q.win || window;
        q.scope = q.scope || q.win;
        q.autopurge = ("autopurge" in q) ? q.autopurge : (type === "script") ? true : false;
        lang.later(0, q, _next, id);
        return {
            tId: id
        }
    };
    var _track = function (type, n, id, url, win, qlength, trackfn) {
        var f = trackfn || _next;
        if (ua.ie) {
            n.onreadystatechange = function () {
                var rs = this.readyState;
                if ("loaded" === rs || "complete" === rs) {
                    f(id, url)
                }
            }
        } else {
            if (ua.webkit) {
                if (type === "script") {
                    if (ua.webkit >= 420) {
                        n.addEventListener("load", function () {
                            f(id, url)
                        })
                    } else {
                        var q = queues[id];
                        if (q.varName) {
                            var freq = YAHOO.util.Get.POLL_FREQ;
                            q.maxattempts = YAHOO.util.Get.TIMEOUT / freq;
                            q.attempts = 0;
                            q._cache = q.varName[0].split(".");
                            q.timer = lang.later(freq, q, function (o) {
                                var a = this._cache,
                                    l = a.length,
                                    w = this.win,
                                    i;
                                for (i = 0; i < l; i = i + 1) {
                                    w = w[a[i]];
                                    if (!w) {
                                        this.attempts++;
                                        if (this.attempts++>this.maxattempts) {
                                            var msg = "Over retry limit, giving up";
                                            q.timer.cancel();
                                            _fail(id, msg)
                                        } else {}
                                        return
                                    }
                                }
                                q.timer.cancel();
                                f(id, url)
                            },
                            null, true)
                        } else {
                            lang.later(YAHOO.util.Get.POLL_FREQ, null, f, [id, url])
                        }
                    }
                }
            } else {
                n.onload = function () {
                    f(id, url)
                }
            }
        }
    };
    return {
        POLL_FREQ: 10,
        PURGE_THRESH: 20,
        TIMEOUT: 2000,
        _finalize: function (id) {
            lang.later(0, null, _finish, id)
        },
        abort: function (o) {
            var id = (lang.isString(o)) ? o : o.tId;
            var q = queues[id];
            if (q) {
                q.aborted = true
            }
        },
        script: function (url, opts) {
            return _queue("script", url, opts)
        },
        css: function (url, opts) {
            return _queue("css", url, opts)
        }
    }
}();
YAHOO.register("get", YAHOO.util.Get, {
    version: "2.5.2",
    build: "1076"
});

(function () {
    var Y = YAHOO.util;
    var Anim = function (el, attributes, duration, method) {
        if (!el) {}
        this.init(el, attributes, duration, method)
    };
    Anim.NAME = "Anim";
    Anim.prototype = {
        toString: function () {
            var el = this.getEl() || {};
            var id = el.id || el.tagName;
            return (this.constructor.NAME + ": " + id)
        },
        patterns: {
            noNegatives: /width|height|opacity|padding/i,
            offsetAttribute: /^((width|height)|(top|left))$/,
            defaultUnit: /width|height|top$|bottom$|left$|right$/i,
            offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i
        },
        doMethod: function (attr, start, end) {
            return this.method(this.currentFrame, start, end - start, this.totalFrames)
        },
        setAttribute: function (attr, val, unit) {
            if (this.patterns.noNegatives.test(attr)) {
                val = (val > 0) ? val : 0
            }
            Y.Dom.setStyle(this.getEl(), attr, val + unit)
        },
        getAttribute: function (attr) {
            var el = this.getEl();
            var val = Y.Dom.getStyle(el, attr);
            if (val !== "auto" && !this.patterns.offsetUnit.test(val)) {
                return parseFloat(val)
            }
            var a = this.patterns.offsetAttribute.exec(attr) || [];
            var pos = !!(a[3]);
            var box = !!(a[2]);
            if (box || (Y.Dom.getStyle(el, "position") == "absolute" && pos)) {
                val = el["offset" + a[0].charAt(0).toUpperCase() + a[0].substr(1)]
            } else {
                val = 0
            }
            return val
        },
        getDefaultUnit: function (attr) {
            if (this.patterns.defaultUnit.test(attr)) {
                return "px"
            }
            return ""
        },
        setRuntimeAttribute: function (attr) {
            var start;
            var end;
            var attributes = this.attributes;
            this.runtimeAttributes[attr] = {};
            var isset = function (prop) {
                return (typeof prop !== "undefined")
            };
            if (!isset(attributes[attr]["to"]) && !isset(attributes[attr]["by"])) {
                return false
            }
            start = (isset(attributes[attr]["from"])) ? attributes[attr]["from"] : this.getAttribute(attr);
            if (isset(attributes[attr]["to"])) {
                end = attributes[attr]["to"]
            } else {
                if (isset(attributes[attr]["by"])) {
                    if (start.constructor == Array) {
                        end = [];
                        for (var i = 0, len = start.length; i < len; ++i) {
                            end[i] = start[i] + attributes[attr]["by"][i] * 1
                        }
                    } else {
                        end = start + attributes[attr]["by"] * 1
                    }
                }
            }
            this.runtimeAttributes[attr].start = start;
            this.runtimeAttributes[attr].end = end;
            this.runtimeAttributes[attr].unit = (isset(attributes[attr].unit)) ? attributes[attr]["unit"] : this.getDefaultUnit(attr);
            return true
        },
        init: function (el, attributes, duration, method) {
            var isAnimated = false;
            var startTime = null;
            var actualFrames = 0;
            el = Y.Dom.get(el);
            this.attributes = attributes || {};
            this.duration = !YAHOO.lang.isUndefined(duration) ? duration : 1;
            this.method = method || Y.Easing.easeNone;
            this.useSeconds = true;
            this.currentFrame = 0;
            this.totalFrames = Y.AnimMgr.fps;
            this.setEl = function (element) {
                el = Y.Dom.get(element)
            };
            this.getEl = function () {
                return el
            };
            this.isAnimated = function () {
                return isAnimated
            };
            this.getStartTime = function () {
                return startTime
            };
            this.runtimeAttributes = {};
            this.animate = function () {
                if (this.isAnimated()) {
                    return false
                }
                this.currentFrame = 0;
                this.totalFrames = (this.useSeconds) ? Math.ceil(Y.AnimMgr.fps * this.duration) : this.duration;
                if (this.duration === 0 && this.useSeconds) {
                    this.totalFrames = 1
                }
                Y.AnimMgr.registerElement(this);
                return true
            };
            this.stop = function (finish) {
                if (!this.isAnimated()) {
                    return false
                }
                if (finish) {
                    this.currentFrame = this.totalFrames;
                    this._onTween.fire()
                }
                Y.AnimMgr.stop(this)
            };
            var onStart = function () {
                this.onStart.fire();
                this.runtimeAttributes = {};
                for (var attr in this.attributes) {
                    this.setRuntimeAttribute(attr)
                }
                isAnimated = true;
                actualFrames = 0;
                startTime = new Date()
            };
            var onTween = function () {
                var data = {
                    duration: new Date() - this.getStartTime(),
                    currentFrame: this.currentFrame
                };
                data.toString = function () {
                    return ("duration: " + data.duration + ", currentFrame: " + data.currentFrame)
                };
                this.onTween.fire(data);
                var runtimeAttributes = this.runtimeAttributes;
                for (var attr in runtimeAttributes) {
                    this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit)
                }
                actualFrames += 1
            };
            var onComplete = function () {
                var actual_duration = (new Date() - startTime) / 1000;
                var data = {
                    duration: actual_duration,
                    frames: actualFrames,
                    fps: actualFrames / actual_duration
                };
                data.toString = function () {
                    return ("duration: " + data.duration + ", frames: " + data.frames + ", fps: " + data.fps)
                };
                isAnimated = false;
                actualFrames = 0;
                this.onComplete.fire(data)
            };
            this._onStart = new Y.CustomEvent("_start", this, true);
            this.onStart = new Y.CustomEvent("start", this);
            this.onTween = new Y.CustomEvent("tween", this);
            this._onTween = new Y.CustomEvent("_tween", this, true);
            this.onComplete = new Y.CustomEvent("complete", this);
            this._onComplete = new Y.CustomEvent("_complete", this, true);
            this._onStart.subscribe(onStart);
            this._onTween.subscribe(onTween);
            this._onComplete.subscribe(onComplete)
        }
    };
    Y.Anim = Anim
})();
YAHOO.util.AnimMgr = new
function () {
    var thread = null;
    var queue = [];
    var tweenCount = 0;
    this.fps = 1000;
    this.delay = 1;
    this.registerElement = function (tween) {
        queue[queue.length] = tween;
        tweenCount += 1;
        tween._onStart.fire();
        this.start()
    };
    this.unRegister = function (tween, index) {
        index = index || getIndex(tween);
        if (!tween.isAnimated() || index == -1) {
            return false
        }
        tween._onComplete.fire();
        queue.splice(index, 1);
        tweenCount -= 1;
        if (tweenCount <= 0) {
            this.stop()
        }
        return true
    };
    this.start = function () {
        if (thread === null) {
            thread = setInterval(this.run, this.delay)
        }
    };
    this.stop = function (tween) {
        if (!tween) {
            clearInterval(thread);
            for (var i = 0, len = queue.length;
            i < len; ++i) {
                this.unRegister(queue[0], 0)
            }
            queue = [];
            thread = null;
            tweenCount = 0
        } else {
            this.unRegister(tween)
        }
    };
    this.run = function () {
        for (var i = 0, len = queue.length; i < len; ++i) {
            var tween = queue[i];
            if (!tween || !tween.isAnimated()) {
                continue
            }
            if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) {
                tween.currentFrame += 1;
                if (tween.useSeconds) {
                    correctFrame(tween)
                }
                tween._onTween.fire()
            } else {
                YAHOO.util.AnimMgr.stop(tween, i)
            }
        }
    };
    var getIndex = function (anim) {
        for (var i = 0, len = queue.length;
        i < len; ++i) {
            if (queue[i] == anim) {
                return i
            }
        }
        return -1
    };
    var correctFrame = function (tween) {
        var frames = tween.totalFrames;
        var frame = tween.currentFrame;
        var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames);
        var elapsed = (new Date() - tween.getStartTime());
        var tweak = 0;
        if (elapsed < tween.duration * 1000) {
            tweak = Math.round((elapsed / expected - 1) * tween.currentFrame)
        } else {
            tweak = frames - (frame + 1)
        }
        if (tweak > 0 && isFinite(tweak)) {
            if (tween.currentFrame + tweak >= frames) {
                tweak = frames - (frame + 1)
            }
            tween.currentFrame += tweak
        }
    }
};
YAHOO.util.Bezier = new
function () {
    this.getPosition = function (points, t) {
        var n = points.length;
        var tmp = [];
        for (var i = 0; i < n; ++i) {
            tmp[i] = [points[i][0], points[i][1]]
        }
        for (var j = 1; j < n; ++j) {
            for (i = 0; i < n - j; ++i) {
                tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
                tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]
            }
        }
        return [tmp[0][0], tmp[0][1]]
    }
};
(function () {
    var ColorAnim = function (el, attributes, duration, method) {
        ColorAnim.superclass.constructor.call(this, el, attributes, duration, method)
    };
    ColorAnim.NAME = "ColorAnim";
    var Y = YAHOO.util;
    YAHOO.extend(ColorAnim, Y.Anim);
    var superclass = ColorAnim.superclass;
    var proto = ColorAnim.prototype;
    proto.patterns.color = /color$/i;
    proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;
    proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
    proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;
    proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/;
    proto.parseColor = function (s) {
        if (s.length == 3) {
            return s
        }
        var c = this.patterns.hex.exec(s);
        if (c && c.length == 4) {
            return [parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16)]
        }
        c = this.patterns.rgb.exec(s);
        if (c && c.length == 4) {
            return [parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10)]
        }
        c = this.patterns.hex3.exec(s);
        if (c && c.length == 4) {
            return [parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16)]
        }
        return null
    };
    proto.getAttribute = function (attr) {
        var el = this.getEl();
        if (this.patterns.color.test(attr)) {
            var val = YAHOO.util.Dom.getStyle(el, attr);
            if (this.patterns.transparent.test(val)) {
                var parent = el.parentNode;
                val = Y.Dom.getStyle(parent, attr);
                while (parent && this.patterns.transparent.test(val)) {
                    parent = parent.parentNode;
                    val = Y.Dom.getStyle(parent, attr);
                    if (parent.tagName.toUpperCase() == "HTML") {
                        val = "#fff"
                    }
                }
            }
        } else {
            val = superclass.getAttribute.call(this, attr)
        }
        return val
    };
    proto.doMethod = function (attr, start, end) {
        var val;
        if (this.patterns.color.test(attr)) {
            val = [];
            for (var i = 0, len = start.length; i < len; ++i) {
                val[i] = superclass.doMethod.call(this, attr, start[i], end[i])
            }
            val = "rgb(" + Math.floor(val[0]) + "," + Math.floor(val[1]) + "," + Math.floor(val[2]) + ")"
        } else {
            val = superclass.doMethod.call(this, attr, start, end)
        }
        return val
    };
    proto.setRuntimeAttribute = function (attr) {
        superclass.setRuntimeAttribute.call(this, attr);
        if (this.patterns.color.test(attr)) {
            var attributes = this.attributes;
            var start = this.parseColor(this.runtimeAttributes[attr].start);
            var end = this.parseColor(this.runtimeAttributes[attr].end);
            if (typeof attributes[attr]["to"] === "undefined" && typeof attributes[attr]["by"] !== "undefined") {
                end = this.parseColor(attributes[attr].by);
                for (var i = 0, len = start.length;
                i < len; ++i) {
                    end[i] = start[i] + end[i]
                }
            }
            this.runtimeAttributes[attr].start = start;
            this.runtimeAttributes[attr].end = end
        }
    };
    Y.ColorAnim = ColorAnim
})();
/*
TERMS OF USE - EASING EQUATIONS
Open source under the BSD License.
Copyright 2001 Robert Penner All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
 * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
YAHOO.util.Easing = {
    easeNone: function (t, b, c, d) {
        return c * t / d + b
    },
    easeIn: function (t, b, c, d) {
        return c * (t /= d) * t + b
    },
    easeOut: function (t, b, c, d) {
        return -c * (t /= d) * (t - 2) + b
    },
    easeBoth: function (t, b, c, d) {
        if ((t /= d / 2) < 1) {
            return c / 2 * t * t + b
        }
        return -c / 2 * ((--t) * (t - 2) - 1) + b
    },
    easeInStrong: function (t, b, c, d) {
        return c * (t /= d) * t * t * t + b
    },
    easeOutStrong: function (t, b, c, d) {
        return -c * ((t = t / d - 1) * t * t * t - 1) + b
    },
    easeBothStrong: function (t, b, c, d) {
        if ((t /= d / 2) < 1) {
            return c / 2 * t * t * t * t + b
        }
        return -c / 2 * ((t -= 2) * t * t * t - 2) + b
    },
    elasticIn: function (t, b, c, d, a, p) {
        if (t == 0) {
            return b
        }
        if ((t /= d) == 1) {
            return b + c
        }
        if (!p) {
            p = d * 0.3
        }
        if (!a || a < Math.abs(c)) {
            a = c;
            var s = p / 4
        } else {
            var s = p / (2 * Math.PI) * Math.asin(c / a)
        }
        return - (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b
    },
    elasticOut: function (t, b, c, d, a, p) {
        if (t == 0) {
            return b
        }
        if ((t /= d) == 1) {
            return b + c
        }
        if (!p) {
            p = d * 0.3
        }
        if (!a || a < Math.abs(c)) {
            a = c;
            var s = p / 4
        } else {
            var s = p / (2 * Math.PI) * Math.asin(c / a)
        }
        return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b
    },
    elasticBoth: function (t, b, c, d, a, p) {
        if (t == 0) {
            return b
        }
        if ((t /= d / 2) == 2) {
            return b + c
        }
        if (!p) {
            p = d * (0.3 * 1.5)
        }
        if (!a || a < Math.abs(c)) {
            a = c;
            var s = p / 4
        } else {
            var s = p / (2 * Math.PI) * Math.asin(c / a)
        }
        if (t < 1) {
            return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b
        }
        return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b
    },
    backIn: function (t, b, c, d, s) {
        if (typeof s == "undefined") {
            s = 1.70158
        }
        return c * (t /= d) * t * ((s + 1) * t - s) + b
    },
    backOut: function (t, b, c, d, s) {
        if (typeof s == "undefined") {
            s = 1.70158
        }
        return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b
    },
    backBoth: function (t, b, c, d, s) {
        if (typeof s == "undefined") {
            s = 1.70158
        }
        if ((t /= d / 2) < 1) {
            return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b
        }
        return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b
    },
    bounceIn: function (t, b, c, d) {
        return c - YAHOO.util.Easing.bounceOut(d - t, 0, c, d) + b
    },
    bounceOut: function (t, b, c, d) {
        if ((t /= d) < (1 / 2.75)) {
            return c * (7.5625 * t * t) + b
        } else {
            if (t < (2 / 2.75)) {
                return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b
            } else {
                if (t < (2.5 / 2.75)) {
                    return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b
                }
            }
        }
        return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b
    },
    bounceBoth: function (t, b, c, d) {
        if (t < d / 2) {
            return YAHOO.util.Easing.bounceIn(t * 2, 0, c, d) * 0.5 + b
        }
        return YAHOO.util.Easing.bounceOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b
    }
};
(function () {
    var Motion = function (el, attributes, duration, method) {
        if (el) {
            Motion.superclass.constructor.call(this, el, attributes, duration, method)
        }
    };
    Motion.NAME = "Motion";
    var Y = YAHOO.util;
    YAHOO.extend(Motion, Y.ColorAnim);
    var superclass = Motion.superclass;
    var proto = Motion.prototype;
    proto.patterns.points = /^points$/i;
    proto.setAttribute = function (attr, val, unit) {
        if (this.patterns.points.test(attr)) {
            unit = unit || "px";
            superclass.setAttribute.call(this, "left", val[0], unit);
            superclass.setAttribute.call(this, "top", val[1], unit)
        } else {
            superclass.setAttribute.call(this, attr, val, unit)
        }
    };
    proto.getAttribute = function (attr) {
        if (this.patterns.points.test(attr)) {
            var val = [superclass.getAttribute.call(this, "left"), superclass.getAttribute.call(this, "top")]
        } else {
            val = superclass.getAttribute.call(this, attr)
        }
        return val
    };
    proto.doMethod = function (attr, start, end) {
        var val = null;
        if (this.patterns.points.test(attr)) {
            var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;
            val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t)
        } else {
            val = superclass.doMethod.call(this, attr, start, end)
        }
        return val
    };
    proto.setRuntimeAttribute = function (attr) {
        if (this.patterns.points.test(attr)) {
            var el = this.getEl();
            var attributes = this.attributes;
            var start;
            var control = attributes.points["control"] || [];
            var end;
            var i, len;
            if (control.length > 0 && !(control[0] instanceof Array)) {
                control = [control]
            } else {
                var tmp = [];
                for (i = 0, len = control.length;
                i < len; ++i) {
                    tmp[i] = control[i]
                }
                control = tmp
            }
            if (Y.Dom.getStyle(el, "position") == "static") {
                Y.Dom.setStyle(el, "position", "relative")
            }
            if (isset(attributes.points["from"])) {
                Y.Dom.setXY(el, attributes.points["from"])
            } else {
                Y.Dom.setXY(el, Y.Dom.getXY(el))
            }
            start = this.getAttribute("points");
            if (isset(attributes.points["to"])) {
                end = translateValues.call(this, attributes.points["to"], start);
                var pageXY = Y.Dom.getXY(this.getEl());
                for (i = 0, len = control.length; i < len; ++i) {
                    control[i] = translateValues.call(this, control[i], start)
                }
            } else {
                if (isset(attributes.points["by"])) {
                    end = [start[0] + attributes.points["by"][0], start[1] + attributes.points["by"][1]];
                    for (i = 0, len = control.length; i < len; ++i) {
                        control[i] = [start[0] + control[i][0], start[1] + control[i][1]]
                    }
                }
            }
            this.runtimeAttributes[attr] = [start];
            if (control.length > 0) {
                this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control)
            }
            this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end
        } else {
            superclass.setRuntimeAttribute.call(this, attr)
        }
    };
    var translateValues = function (val, start) {
        var pageXY = Y.Dom.getXY(this.getEl());
        val = [val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1]];
        return val
    };
    var isset = function (prop) {
        return (typeof prop !== "undefined")
    };
    Y.Motion = Motion
})();
(function () {
    var Scroll = function (el, attributes, duration, method) {
        if (el) {
            Scroll.superclass.constructor.call(this, el, attributes, duration, method)
        }
    };
    Scroll.NAME = "Scroll";
    var Y = YAHOO.util;
    YAHOO.extend(Scroll, Y.ColorAnim);
    var superclass = Scroll.superclass;
    var proto = Scroll.prototype;
    proto.doMethod = function (attr, start, end) {
        var val = null;
        if (attr == "scroll") {
            val = [this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)]
        } else {
            val = superclass.doMethod.call(this, attr, start, end)
        }
        return val
    };
    proto.getAttribute = function (attr) {
        var val = null;
        var el = this.getEl();
        if (attr == "scroll") {
            val = [el.scrollLeft, el.scrollTop]
        } else {
            val = superclass.getAttribute.call(this, attr)
        }
        return val
    };
    proto.setAttribute = function (attr, val, unit) {
        var el = this.getEl();
        if (attr == "scroll") {
            el.scrollLeft = val[0];
            el.scrollTop = val[1]
        } else {
            superclass.setAttribute.call(this, attr, val, unit)
        }
    };
    Y.Scroll = Scroll
})();
YAHOO.register("animation", YAHOO.util.Anim, {
    version: "2.5.2",
    build: "1076"
});

(function () {
    YAHOO.util.Config = function (owner) {
        if (owner) {
            this.init(owner)
        }
    };
    var Lang = YAHOO.lang,
        CustomEvent = YAHOO.util.CustomEvent,
        Config = YAHOO.util.Config;
    Config.CONFIG_CHANGED_EVENT = "configChanged";
    Config.BOOLEAN_TYPE = "boolean";
    Config.prototype = {
        owner: null,
        queueInProgress: false,
        config: null,
        initialConfig: null,
        eventQueue: null,
        configChangedEvent: null,
        init: function (owner) {
            this.owner = owner;
            this.configChangedEvent = this.createEvent(Config.CONFIG_CHANGED_EVENT);
            this.configChangedEvent.signature = CustomEvent.LIST;
            this.queueInProgress = false;
            this.config = {};
            this.initialConfig = {};
            this.eventQueue = []
        },
        checkBoolean: function (val) {
            return (typeof val == Config.BOOLEAN_TYPE)
        },
        checkNumber: function (val) {
            return (!isNaN(val))
        },
        fireEvent: function (key, value) {
            var property = this.config[key];
            if (property && property.event) {
                property.event.fire(value)
            }
        },
        addProperty: function (key, propertyObject) {
            key = key.toLowerCase();
            this.config[key] = propertyObject;
            propertyObject.event = this.createEvent(key, {
                scope: this.owner
            });
            propertyObject.event.signature = CustomEvent.LIST;
            propertyObject.key = key;
            if (propertyObject.handler) {
                propertyObject.event.subscribe(propertyObject.handler, this.owner)
            }
            this.setProperty(key, propertyObject.value, true);
            if (!propertyObject.suppressEvent) {
                this.queueProperty(key, propertyObject.value)
            }
        },
        getConfig: function () {
            var cfg = {},
                prop, property;
            for (prop in this.config) {
                property = this.config[prop];
                if (property && property.event) {
                    cfg[prop] = property.value
                }
            }
            return cfg
        },
        getProperty: function (key) {
            var property = this.config[key.toLowerCase()];
            if (property && property.event) {
                return property.value
            } else {
                return undefined
            }
        },
        resetProperty: function (key) {
            key = key.toLowerCase();
            var property = this.config[key];
            if (property && property.event) {
                if (this.initialConfig[key] && !Lang.isUndefined(this.initialConfig[key])) {
                    this.setProperty(key, this.initialConfig[key]);
                    return true
                }
            } else {
                return false
            }
        },
        setProperty: function (key, value, silent) {
            var property;
            key = key.toLowerCase();
            if (this.queueInProgress && !silent) {
                this.queueProperty(key, value);
                return true
            } else {
                property = this.config[key];
                if (property && property.event) {
                    if (property.validator && !property.validator(value)) {
                        return false
                    } else {
                        property.value = value;
                        if (!silent) {
                            this.fireEvent(key, value);
                            this.configChangedEvent.fire([key, value])
                        }
                        return true
                    }
                } else {
                    return false
                }
            }
        },
        queueProperty: function (key, value) {
            key = key.toLowerCase();
            var property = this.config[key],
                foundDuplicate = false,
                iLen, queueItem, queueItemKey, queueItemValue, sLen, supercedesCheck, qLen, queueItemCheck, queueItemCheckKey, queueItemCheckValue, i, s, q;
            if (property && property.event) {
                if (!Lang.isUndefined(value) && property.validator && !property.validator(value)) {
                    return false
                } else {
                    if (!Lang.isUndefined(value)) {
                        property.value = value
                    } else {
                        value = property.value
                    }
                    foundDuplicate = false;
                    iLen = this.eventQueue.length;
                    for (i = 0; i < iLen; i++) {
                        queueItem = this.eventQueue[i];
                        if (queueItem) {
                            queueItemKey = queueItem[0];
                            queueItemValue = queueItem[1];
                            if (queueItemKey == key) {
                                this.eventQueue[i] = null;
                                this.eventQueue.push([key, (!Lang.isUndefined(value) ? value : queueItemValue)]);
                                foundDuplicate = true;
                                break
                            }
                        }
                    }
                    if (!foundDuplicate && !Lang.isUndefined(value)) {
                        this.eventQueue.push([key, value])
                    }
                }
                if (property.supercedes) {
                    sLen = property.supercedes.length;
                    for (s = 0; s < sLen; s++) {
                        supercedesCheck = property.supercedes[s];
                        qLen = this.eventQueue.length;
                        for (q = 0; q < qLen; q++) {
                            queueItemCheck = this.eventQueue[q];
                            if (queueItemCheck) {
                                queueItemCheckKey = queueItemCheck[0];
                                queueItemCheckValue = queueItemCheck[1];
                                if (queueItemCheckKey == supercedesCheck.toLowerCase()) {
                                    this.eventQueue.push([queueItemCheckKey, queueItemCheckValue]);
                                    this.eventQueue[q] = null;
                                    break
                                }
                            }
                        }
                    }
                }
                return true
            } else {
                return false
            }
        },
        refireEvent: function (key) {
            key = key.toLowerCase();
            var property = this.config[key];
            if (property && property.event && !Lang.isUndefined(property.value)) {
                if (this.queueInProgress) {
                    this.queueProperty(key)
                } else {
                    this.fireEvent(key, property.value)
                }
            }
        },
        applyConfig: function (userConfig, init) {
            var sKey, oConfig;
            if (init) {
                oConfig = {};
                for (sKey in userConfig) {
                    if (Lang.hasOwnProperty(userConfig, sKey)) {
                        oConfig[sKey.toLowerCase()] = userConfig[sKey]
                    }
                }
                this.initialConfig = oConfig
            }
            for (sKey in userConfig) {
                if (Lang.hasOwnProperty(userConfig, sKey)) {
                    this.queueProperty(sKey, userConfig[sKey])
                }
            }
        },
        refresh: function () {
            var prop;
            for (prop in this.config) {
                this.refireEvent(prop)
            }
        },
        fireQueue: function () {
            var i, queueItem, key, value, property;
            this.queueInProgress = true;
            for (i = 0; i < this.eventQueue.length; i++) {
                queueItem = this.eventQueue[i];
                if (queueItem) {
                    key = queueItem[0];
                    value = queueItem[1];
                    property = this.config[key];
                    property.value = value;
                    this.fireEvent(key, value)
                }
            }
            this.queueInProgress = false;
            this.eventQueue = []
        },
        subscribeToConfigEvent: function (key, handler, obj, override) {
            var property = this.config[key.toLowerCase()];
            if (property && property.event) {
                if (!Config.alreadySubscribed(property.event, handler, obj)) {
                    property.event.subscribe(handler, obj, override)
                }
                return true
            } else {
                return false
            }
        },
        unsubscribeFromConfigEvent: function (key, handler, obj) {
            var property = this.config[key.toLowerCase()];
            if (property && property.event) {
                return property.event.unsubscribe(handler, obj)
            } else {
                return false
            }
        },
        toString: function () {
            var output = "Config";
            if (this.owner) {
                output += " [" + this.owner.toString() + "]"
            }
            return output
        },
        outputEventQueue: function () {
            var output = "",
                queueItem, q, nQueue = this.eventQueue.length;
            for (q = 0; q < nQueue; q++) {
                queueItem = this.eventQueue[q];
                if (queueItem) {
                    output += queueItem[0] + "=" + queueItem[1] + ", "
                }
            }
            return output
        },
        destroy: function () {
            var oConfig = this.config,
                sProperty, oProperty;
            for (sProperty in oConfig) {
                if (Lang.hasOwnProperty(oConfig, sProperty)) {
                    oProperty = oConfig[sProperty];
                    oProperty.event.unsubscribeAll();
                    oProperty.event = null
                }
            }
            this.configChangedEvent.unsubscribeAll();
            this.configChangedEvent = null;
            this.owner = null;
            this.config = null;
            this.initialConfig = null;
            this.eventQueue = null
        }
    };
    Config.alreadySubscribed = function (evt, fn, obj) {
        var nSubscribers = evt.subscribers.length,
            subsc, i;
        if (nSubscribers > 0) {
            i = nSubscribers - 1;
            do {
                subsc = evt.subscribers[i];
                if (subsc && subsc.obj == obj && subsc.fn == fn) {
                    return true
                }
            } while (i--)
        }
        return false
    };
    YAHOO.lang.augmentProto(Config, YAHOO.util.EventProvider)
}());
(function () {
    YAHOO.widget.Module = function (el, userConfig) {
        if (el) {
            this.init(el, userConfig)
        } else {}
    };
    var Dom = YAHOO.util.Dom,
        Config = YAHOO.util.Config,
        Event = YAHOO.util.Event,
        CustomEvent = YAHOO.util.CustomEvent,
        Module = YAHOO.widget.Module,
        m_oModuleTemplate, m_oHeaderTemplate, m_oBodyTemplate, m_oFooterTemplate, EVENT_TYPES = {
        BEFORE_INIT: "beforeInit",
        INIT: "init",
        APPEND: "append",
        BEFORE_RENDER: "beforeRender",
        RENDER: "render",
        CHANGE_HEADER: "changeHeader",
        CHANGE_BODY: "changeBody",
        CHANGE_FOOTER: "changeFooter",
        CHANGE_CONTENT: "changeContent",
        DESTORY: "destroy",
        BEFORE_SHOW: "beforeShow",
        SHOW: "show",
        BEFORE_HIDE: "beforeHide",
        HIDE: "hide"
    },
        DEFAULT_CONFIG = {
        VISIBLE: {
            key: "visible",
            value: true,
            validator: YAHOO.lang.isBoolean
        },
        EFFECT: {
            key: "effect",
            suppressEvent: true,
            supercedes: ["visible"]
        },
        MONITOR_RESIZE: {
            key: "monitorresize",
            value: true
        },
        APPEND_TO_DOCUMENT_BODY: {
            key: "appendtodocumentbody",
            value: false
        }
    };
    Module.IMG_ROOT = null;
    Module.IMG_ROOT_SSL = null;
    Module.CSS_MODULE = "yui-module";
    Module.CSS_HEADER = "hd";
    Module.CSS_BODY = "bd";
    Module.CSS_FOOTER = "ft";
    Module.RESIZE_MONITOR_SECURE_URL = "javascript:false;";
    Module.textResizeEvent = new CustomEvent("textResize");

    function createModuleTemplate() {
        if (!m_oModuleTemplate) {
            m_oModuleTemplate = document.createElement("div");
            m_oModuleTemplate.innerHTML = ('<div class="' + Module.CSS_HEADER + '"></div><div class="' + Module.CSS_BODY + '"></div><div class="' + Module.CSS_FOOTER + '"></div>');
            m_oHeaderTemplate = m_oModuleTemplate.firstChild;
            m_oBodyTemplate = m_oHeaderTemplate.nextSibling;
            m_oFooterTemplate = m_oBodyTemplate.nextSibling
        }
        return m_oModuleTemplate
    }
    function createHeader() {
        if (!m_oHeaderTemplate) {
            createModuleTemplate()
        }
        return (m_oHeaderTemplate.cloneNode(false))
    }
    function createBody() {
        if (!m_oBodyTemplate) {
            createModuleTemplate()
        }
        return (m_oBodyTemplate.cloneNode(false))
    }
    function createFooter() {
        if (!m_oFooterTemplate) {
            createModuleTemplate()
        }
        return (m_oFooterTemplate.cloneNode(false))
    }
    Module.prototype = {
        constructor: Module,
        element: null,
        header: null,
        body: null,
        footer: null,
        id: null,
        imageRoot: Module.IMG_ROOT,
        initEvents: function () {
            var SIGNATURE = CustomEvent.LIST;
            this.beforeInitEvent = this.createEvent(EVENT_TYPES.BEFORE_INIT);
            this.beforeInitEvent.signature = SIGNATURE;
            this.initEvent = this.createEvent(EVENT_TYPES.INIT);
            this.initEvent.signature = SIGNATURE;
            this.appendEvent = this.createEvent(EVENT_TYPES.APPEND);
            this.appendEvent.signature = SIGNATURE;
            this.beforeRenderEvent = this.createEvent(EVENT_TYPES.BEFORE_RENDER);
            this.beforeRenderEvent.signature = SIGNATURE;
            this.renderEvent = this.createEvent(EVENT_TYPES.RENDER);
            this.renderEvent.signature = SIGNATURE;
            this.changeHeaderEvent = this.createEvent(EVENT_TYPES.CHANGE_HEADER);
            this.changeHeaderEvent.signature = SIGNATURE;
            this.changeBodyEvent = this.createEvent(EVENT_TYPES.CHANGE_BODY);
            this.changeBodyEvent.signature = SIGNATURE;
            this.changeFooterEvent = this.createEvent(EVENT_TYPES.CHANGE_FOOTER);
            this.changeFooterEvent.signature = SIGNATURE;
            this.changeContentEvent = this.createEvent(EVENT_TYPES.CHANGE_CONTENT);
            this.changeContentEvent.signature = SIGNATURE;
            this.destroyEvent = this.createEvent(EVENT_TYPES.DESTORY);
            this.destroyEvent.signature = SIGNATURE;
            this.beforeShowEvent = this.createEvent(EVENT_TYPES.BEFORE_SHOW);
            this.beforeShowEvent.signature = SIGNATURE;
            this.showEvent = this.createEvent(EVENT_TYPES.SHOW);
            this.showEvent.signature = SIGNATURE;
            this.beforeHideEvent = this.createEvent(EVENT_TYPES.BEFORE_HIDE);
            this.beforeHideEvent.signature = SIGNATURE;
            this.hideEvent = this.createEvent(EVENT_TYPES.HIDE);
            this.hideEvent.signature = SIGNATURE
        },
        platform: function () {
            var ua = navigator.userAgent.toLowerCase();
            if (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1) {
                return "windows"
            } else {
                if (ua.indexOf("macintosh") != -1) {
                    return "mac"
                } else {
                    return false
                }
            }
        }(),
        browser: function () {
            var ua = navigator.userAgent.toLowerCase();
            if (ua.indexOf("opera") != -1) {
                return "opera"
            } else {
                if (ua.indexOf("msie 7") != -1) {
                    return "ie7"
                } else {
                    if (ua.indexOf("msie") != -1) {
                        return "ie"
                    } else {
                        if (ua.indexOf("safari") != -1) {
                            return "safari"
                        } else {
                            if (ua.indexOf("gecko") != -1) {
                                return "gecko"
                            } else {
                                return false
                            }
                        }
                    }
                }
            }
        }(),
        isSecure: function () {
            if (window.location.href.toLowerCase().indexOf("https") === 0) {
                return true
            } else {
                return false
            }
        }(),
        initDefaultConfig: function () {
            this.cfg.addProperty(DEFAULT_CONFIG.VISIBLE.key, {
                handler: this.configVisible,
                value: DEFAULT_CONFIG.VISIBLE.value,
                validator: DEFAULT_CONFIG.VISIBLE.validator
            });
            this.cfg.addProperty(DEFAULT_CONFIG.EFFECT.key, {
                suppressEvent: DEFAULT_CONFIG.EFFECT.suppressEvent,
                supercedes: DEFAULT_CONFIG.EFFECT.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.MONITOR_RESIZE.key, {
                handler: this.configMonitorResize,
                value: DEFAULT_CONFIG.MONITOR_RESIZE.value
            });
            this.cfg.addProperty(DEFAULT_CONFIG.APPEND_TO_DOCUMENT_BODY.key, {
                value: DEFAULT_CONFIG.APPEND_TO_DOCUMENT_BODY.value
            })
        },
        init: function (el, userConfig) {
            var elId, child;
            this.initEvents();
            this.beforeInitEvent.fire(Module);
            this.cfg = new Config(this);
            if (this.isSecure) {
                this.imageRoot = Module.IMG_ROOT_SSL
            }
            if (typeof el == "string") {
                elId = el;
                el = document.getElementById(el);
                if (!el) {
                    el = (createModuleTemplate()).cloneNode(false);
                    el.id = elId
                }
            }
            this.element = el;
            if (el.id) {
                this.id = el.id
            }
            child = this.element.firstChild;
            if (child) {
                var fndHd = false,
                    fndBd = false,
                    fndFt = false;
                do {
                    if (1 == child.nodeType) {
                        if (!fndHd && Dom.hasClass(child, Module.CSS_HEADER)) {
                            this.header = child;
                            fndHd = true
                        } else {
                            if (!fndBd && Dom.hasClass(child, Module.CSS_BODY)) {
                                this.body = child;
                                fndBd = true
                            } else {
                                if (!fndFt && Dom.hasClass(child, Module.CSS_FOOTER)) {
                                    this.footer = child;
                                    fndFt = true
                                }
                            }
                        }
                    }
                } while ((child = child.nextSibling))
            }
            this.initDefaultConfig();
            Dom.addClass(this.element, Module.CSS_MODULE);
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            if (!Config.alreadySubscribed(this.renderEvent, this.cfg.fireQueue, this.cfg)) {
                this.renderEvent.subscribe(this.cfg.fireQueue, this.cfg, true)
            }
            this.initEvent.fire(Module)
        },
        initResizeMonitor: function () {
            var isGeckoWin = (YAHOO.env.ua.gecko && this.platform == "windows");
            if (isGeckoWin) {
                var self = this;
                setTimeout(function () {
                    self._initResizeMonitor()
                },
                0)
            } else {
                this._initResizeMonitor()
            }
        },
        _initResizeMonitor: function () {
            var oDoc, oIFrame, sHTML;

            function fireTextResize() {
                Module.textResizeEvent.fire()
            }
            if (!YAHOO.env.ua.opera) {
                oIFrame = Dom.get("_yuiResizeMonitor");
                var supportsCWResize = this._supportsCWResize();
                if (!oIFrame) {
                    oIFrame = document.createElement("iframe");
                    if (this.isSecure && Module.RESIZE_MONITOR_SECURE_URL && YAHOO.env.ua.ie) {
                        oIFrame.src = Module.RESIZE_MONITOR_SECURE_URL
                    }
                    if (!supportsCWResize) {
                        sHTML = ["<html><head><script ", 'type="text/javascript">', "window.onresize=function(){window.parent.", "YAHOO.widget.Module.textResizeEvent.", "fire();};<", "/script></head>", "<body></body></html>"].join("");
                        oIFrame.src = "data:text/html;charset=utf-8," + encodeURIComponent(sHTML)
                    }
                    oIFrame.id = "_yuiResizeMonitor";
                    oIFrame.style.position = "absolute";
                    oIFrame.style.visibility = "hidden";
                    var db = document.body,
                        fc = db.firstChild;
                    if (fc) {
                        db.insertBefore(oIFrame, fc)
                    } else {
                        db.appendChild(oIFrame)
                    }
                    oIFrame.style.width = "10em";
                    oIFrame.style.height = "10em";
                    oIFrame.style.top = (-1 * oIFrame.offsetHeight) + "px";
                    oIFrame.style.left = (-1 * oIFrame.offsetWidth) + "px";
                    oIFrame.style.borderWidth = "0";
                    oIFrame.style.visibility = "visible";
                    if (YAHOO.env.ua.webkit) {
                        oDoc = oIFrame.contentWindow.document;
                        oDoc.open();
                        oDoc.close()
                    }
                }
                if (oIFrame && oIFrame.contentWindow) {
                    Module.textResizeEvent.subscribe(this.onDomResize, this, true);
                    if (!Module.textResizeInitialized) {
                        if (supportsCWResize) {
                            if (!Event.on(oIFrame.contentWindow, "resize", fireTextResize)) {
                                Event.on(oIFrame, "resize", fireTextResize)
                            }
                        }
                        Module.textResizeInitialized = true
                    }
                    this.resizeMonitor = oIFrame
                }
            }
        },
        _supportsCWResize: function () {
            var bSupported = true;
            if (YAHOO.env.ua.gecko && YAHOO.env.ua.gecko <= 1.8) {
                bSupported = false
            }
            return bSupported
        },
        onDomResize: function (e, obj) {
            var nLeft = -1 * this.resizeMonitor.offsetWidth,
                nTop = -1 * this.resizeMonitor.offsetHeight;
            this.resizeMonitor.style.top = nTop + "px";
            this.resizeMonitor.style.left = nLeft + "px"
        },
        setHeader: function (headerContent) {
            var oHeader = this.header || (this.header = createHeader());
            if (headerContent.nodeName) {
                oHeader.innerHTML = "";
                oHeader.appendChild(headerContent)
            } else {
                oHeader.innerHTML = headerContent
            }
            this.changeHeaderEvent.fire(headerContent);
            this.changeContentEvent.fire()
        },
        appendToHeader: function (element) {
            var oHeader = this.header || (this.header = createHeader());
            oHeader.appendChild(element);
            this.changeHeaderEvent.fire(element);
            this.changeContentEvent.fire()
        },
        setBody: function (bodyContent) {
            var oBody = this.body || (this.body = createBody());
            if (bodyContent.nodeName) {
                oBody.innerHTML = "";
                oBody.appendChild(bodyContent)
            } else {
                oBody.innerHTML = bodyContent
            }
            this.changeBodyEvent.fire(bodyContent);
            this.changeContentEvent.fire()
        },
        appendToBody: function (element) {
            var oBody = this.body || (this.body = createBody());
            oBody.appendChild(element);
            this.changeBodyEvent.fire(element);
            this.changeContentEvent.fire()
        },
        setFooter: function (footerContent) {
            var oFooter = this.footer || (this.footer = createFooter());
            if (footerContent.nodeName) {
                oFooter.innerHTML = "";
                oFooter.appendChild(footerContent)
            } else {
                oFooter.innerHTML = footerContent
            }
            this.changeFooterEvent.fire(footerContent);
            this.changeContentEvent.fire()
        },
        appendToFooter: function (element) {
            var oFooter = this.footer || (this.footer = createFooter());
            oFooter.appendChild(element);
            this.changeFooterEvent.fire(element);
            this.changeContentEvent.fire()
        },
        render: function (appendToNode, moduleElement) {
            var me = this,
                firstChild;

            function appendTo(parentNode) {
                if (typeof parentNode == "string") {
                    parentNode = document.getElementById(parentNode)
                }
                if (parentNode) {
                    me._addToParent(parentNode, me.element);
                    me.appendEvent.fire()
                }
            }
            this.beforeRenderEvent.fire();
            if (!moduleElement) {
                moduleElement = this.element
            }
            if (appendToNode) {
                appendTo(appendToNode)
            } else {
                if (!Dom.inDocument(this.element)) {
                    return false
                }
            }
            if (this.header && !Dom.inDocument(this.header)) {
                firstChild = moduleElement.firstChild;
                if (firstChild) {
                    moduleElement.insertBefore(this.header, firstChild)
                } else {
                    moduleElement.appendChild(this.header)
                }
            }
            if (this.body && !Dom.inDocument(this.body)) {
                if (this.footer && Dom.isAncestor(this.moduleElement, this.footer)) {
                    moduleElement.insertBefore(this.body, this.footer)
                } else {
                    moduleElement.appendChild(this.body)
                }
            }
            if (this.footer && !Dom.inDocument(this.footer)) {
                moduleElement.appendChild(this.footer)
            }
            this.renderEvent.fire();
            return true
        },
        destroy: function () {
            var parent, e;
            if (this.element) {
                Event.purgeElement(this.element, true);
                parent = this.element.parentNode
            }
            if (parent) {
                parent.removeChild(this.element)
            }
            this.element = null;
            this.header = null;
            this.body = null;
            this.footer = null;
            Module.textResizeEvent.unsubscribe(this.onDomResize, this);
            this.cfg.destroy();
            this.cfg = null;
            this.destroyEvent.fire();
            for (e in this) {
                if (e instanceof CustomEvent) {
                    e.unsubscribeAll()
                }
            }
        },
        show: function () {
            this.cfg.setProperty("visible", true)
        },
        hide: function () {
            this.cfg.setProperty("visible", false)
        },
        configVisible: function (type, args, obj) {
            var visible = args[0];
            if (visible) {
                this.beforeShowEvent.fire();
                Dom.setStyle(this.element, "display", "block");
                this.showEvent.fire()
            } else {
                this.beforeHideEvent.fire();
                Dom.setStyle(this.element, "display", "none");
                this.hideEvent.fire()
            }
        },
        configMonitorResize: function (type, args, obj) {
            var monitor = args[0];
            if (monitor) {
                this.initResizeMonitor()
            } else {
                Module.textResizeEvent.unsubscribe(this.onDomResize, this, true);
                this.resizeMonitor = null
            }
        },
        _addToParent: function (parentNode, element) {
            if (!this.cfg.getProperty("appendtodocumentbody") && parentNode === document.body && parentNode.firstChild) {
                parentNode.insertBefore(element, parentNode.firstChild)
            } else {
                parentNode.appendChild(element)
            }
        },
        toString: function () {
            return "Module " + this.id
        }
    };
    YAHOO.lang.augmentProto(Module, YAHOO.util.EventProvider)
}());
(function () {
    YAHOO.widget.Overlay = function (el, userConfig) {
        YAHOO.widget.Overlay.superclass.constructor.call(this, el, userConfig)
    };
    var Lang = YAHOO.lang,
        CustomEvent = YAHOO.util.CustomEvent,
        Module = YAHOO.widget.Module,
        Event = YAHOO.util.Event,
        Dom = YAHOO.util.Dom,
        Config = YAHOO.util.Config,
        Overlay = YAHOO.widget.Overlay,
        m_oIFrameTemplate, EVENT_TYPES = {
        BEFORE_MOVE: "beforeMove",
        MOVE: "move"
    },
        DEFAULT_CONFIG = {
        X: {
            key: "x",
            validator: Lang.isNumber,
            suppressEvent: true,
            supercedes: ["iframe"]
        },
        Y: {
            key: "y",
            validator: Lang.isNumber,
            suppressEvent: true,
            supercedes: ["iframe"]
        },
        XY: {
            key: "xy",
            suppressEvent: true,
            supercedes: ["iframe"]
        },
        CONTEXT: {
            key: "context",
            suppressEvent: true,
            supercedes: ["iframe"]
        },
        FIXED_CENTER: {
            key: "fixedcenter",
            value: false,
            validator: Lang.isBoolean,
            supercedes: ["iframe", "visible"]
        },
        WIDTH: {
            key: "width",
            suppressEvent: true,
            supercedes: ["context", "fixedcenter", "iframe"]
        },
        HEIGHT: {
            key: "height",
            suppressEvent: true,
            supercedes: ["context", "fixedcenter", "iframe"]
        },
        ZINDEX: {
            key: "zindex",
            value: null
        },
        CONSTRAIN_TO_VIEWPORT: {
            key: "constraintoviewport",
            value: false,
            validator: Lang.isBoolean,
            supercedes: ["iframe", "x", "y", "xy"]
        },
        IFRAME: {
            key: "iframe",
            value: (YAHOO.env.ua.ie == 6 ? true : false),
            validator: Lang.isBoolean,
            supercedes: ["zindex"]
        }
    };
    Overlay.IFRAME_SRC = "javascript:false;";
    Overlay.IFRAME_OFFSET = 3;
    Overlay.VIEWPORT_OFFSET = 10;
    Overlay.TOP_LEFT = "tl";
    Overlay.TOP_RIGHT = "tr";
    Overlay.BOTTOM_LEFT = "bl";
    Overlay.BOTTOM_RIGHT = "br";
    Overlay.CSS_OVERLAY = "yui-overlay";
    Overlay.windowScrollEvent = new CustomEvent("windowScroll");
    Overlay.windowResizeEvent = new CustomEvent("windowResize");
    Overlay.windowScrollHandler = function (e) {
        if (YAHOO.env.ua.ie) {
            if (!window.scrollEnd) {
                window.scrollEnd = -1
            }
            clearTimeout(window.scrollEnd);
            window.scrollEnd = setTimeout(function () {
                Overlay.windowScrollEvent.fire()
            },
            1)
        } else {
            Overlay.windowScrollEvent.fire()
        }
    };
    Overlay.windowResizeHandler = function (e) {
        if (YAHOO.env.ua.ie) {
            if (!window.resizeEnd) {
                window.resizeEnd = -1
            }
            clearTimeout(window.resizeEnd);
            window.resizeEnd = setTimeout(function () {
                Overlay.windowResizeEvent.fire()
            },
            100)
        } else {
            Overlay.windowResizeEvent.fire()
        }
    };
    Overlay._initialized = null;
    if (Overlay._initialized === null) {
        Event.on(window, "scroll", Overlay.windowScrollHandler);
        Event.on(window, "resize", Overlay.windowResizeHandler);
        Overlay._initialized = true
    }
    YAHOO.extend(Overlay, Module, {
        init: function (el, userConfig) {
            Overlay.superclass.init.call(this, el);
            this.beforeInitEvent.fire(Overlay);
            Dom.addClass(this.element, Overlay.CSS_OVERLAY);
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            if (this.platform == "mac" && YAHOO.env.ua.gecko) {
                if (!Config.alreadySubscribed(this.showEvent, this.showMacGeckoScrollbars, this)) {
                    this.showEvent.subscribe(this.showMacGeckoScrollbars, this, true)
                }
                if (!Config.alreadySubscribed(this.hideEvent, this.hideMacGeckoScrollbars, this)) {
                    this.hideEvent.subscribe(this.hideMacGeckoScrollbars, this, true)
                }
            }
            this.initEvent.fire(Overlay)
        },
        initEvents: function () {
            Overlay.superclass.initEvents.call(this);
            var SIGNATURE = CustomEvent.LIST;
            this.beforeMoveEvent = this.createEvent(EVENT_TYPES.BEFORE_MOVE);
            this.beforeMoveEvent.signature = SIGNATURE;
            this.moveEvent = this.createEvent(EVENT_TYPES.MOVE);
            this.moveEvent.signature = SIGNATURE
        },
        initDefaultConfig: function () {
            Overlay.superclass.initDefaultConfig.call(this);
            this.cfg.addProperty(DEFAULT_CONFIG.X.key, {
                handler: this.configX,
                validator: DEFAULT_CONFIG.X.validator,
                suppressEvent: DEFAULT_CONFIG.X.suppressEvent,
                supercedes: DEFAULT_CONFIG.X.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.Y.key, {
                handler: this.configY,
                validator: DEFAULT_CONFIG.Y.validator,
                suppressEvent: DEFAULT_CONFIG.Y.suppressEvent,
                supercedes: DEFAULT_CONFIG.Y.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.XY.key, {
                handler: this.configXY,
                suppressEvent: DEFAULT_CONFIG.XY.suppressEvent,
                supercedes: DEFAULT_CONFIG.XY.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.CONTEXT.key, {
                handler: this.configContext,
                suppressEvent: DEFAULT_CONFIG.CONTEXT.suppressEvent,
                supercedes: DEFAULT_CONFIG.CONTEXT.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.FIXED_CENTER.key, {
                handler: this.configFixedCenter,
                value: DEFAULT_CONFIG.FIXED_CENTER.value,
                validator: DEFAULT_CONFIG.FIXED_CENTER.validator,
                supercedes: DEFAULT_CONFIG.FIXED_CENTER.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.WIDTH.key, {
                handler: this.configWidth,
                suppressEvent: DEFAULT_CONFIG.WIDTH.suppressEvent,
                supercedes: DEFAULT_CONFIG.WIDTH.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.HEIGHT.key, {
                handler: this.configHeight,
                suppressEvent: DEFAULT_CONFIG.HEIGHT.suppressEvent,
                supercedes: DEFAULT_CONFIG.HEIGHT.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.ZINDEX.key, {
                handler: this.configzIndex,
                value: DEFAULT_CONFIG.ZINDEX.value
            });
            this.cfg.addProperty(DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, {
                handler: this.configConstrainToViewport,
                value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value,
                validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator,
                supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.IFRAME.key, {
                handler: this.configIframe,
                value: DEFAULT_CONFIG.IFRAME.value,
                validator: DEFAULT_CONFIG.IFRAME.validator,
                supercedes: DEFAULT_CONFIG.IFRAME.supercedes
            })
        },
        moveTo: function (x, y) {
            this.cfg.setProperty("xy", [x, y])
        },
        hideMacGeckoScrollbars: function () {
            Dom.removeClass(this.element, "show-scrollbars");
            Dom.addClass(this.element, "hide-scrollbars")
        },
        showMacGeckoScrollbars: function () {
            Dom.removeClass(this.element, "hide-scrollbars");
            Dom.addClass(this.element, "show-scrollbars")
        },
        configVisible: function (type, args, obj) {
            var visible = args[0],
                currentVis = Dom.getStyle(this.element, "visibility"),
                effect = this.cfg.getProperty("effect"),
                effectInstances = [],
                isMacGecko = (this.platform == "mac" && YAHOO.env.ua.gecko),
                alreadySubscribed = Config.alreadySubscribed,
                eff, ei, e, i, j, k, h, nEffects, nEffectInstances;
            if (currentVis == "inherit") {
                e = this.element.parentNode;
                while (e.nodeType != 9 && e.nodeType != 11) {
                    currentVis = Dom.getStyle(e, "visibility");
                    if (currentVis != "inherit") {
                        break
                    }
                    e = e.parentNode
                }
                if (currentVis == "inherit") {
                    currentVis = "visible"
                }
            }
            if (effect) {
                if (effect instanceof Array) {
                    nEffects = effect.length;
                    for (i = 0; i < nEffects; i++) {
                        eff = effect[i];
                        effectInstances[effectInstances.length] = eff.effect(this, eff.duration)
                    }
                } else {
                    effectInstances[effectInstances.length] = effect.effect(this, effect.duration)
                }
            }
            if (visible) {
                if (isMacGecko) {
                    this.showMacGeckoScrollbars()
                }
                if (effect) {
                    if (visible) {
                        if (currentVis != "visible" || currentVis === "") {
                            this.beforeShowEvent.fire();
                            nEffectInstances = effectInstances.length;
                            for (j = 0;
                            j < nEffectInstances; j++) {
                                ei = effectInstances[j];
                                if (j === 0 && !alreadySubscribed(ei.animateInCompleteEvent, this.showEvent.fire, this.showEvent)) {
                                    ei.animateInCompleteEvent.subscribe(this.showEvent.fire, this.showEvent, true)
                                }
                                ei.animateIn()
                            }
                        }
                    }
                } else {
                    if (currentVis != "visible" || currentVis === "") {
                        this.beforeShowEvent.fire();
                        Dom.setStyle(this.element, "visibility", "visible");
                        this.cfg.refireEvent("iframe");
                        this.showEvent.fire()
                    }
                }
            } else {
                if (isMacGecko) {
                    this.hideMacGeckoScrollbars()
                }
                if (effect) {
                    if (currentVis == "visible") {
                        this.beforeHideEvent.fire();
                        nEffectInstances = effectInstances.length;
                        for (k = 0; k < nEffectInstances; k++) {
                            h = effectInstances[k];
                            if (k === 0 && !alreadySubscribed(h.animateOutCompleteEvent, this.hideEvent.fire, this.hideEvent)) {
                                h.animateOutCompleteEvent.subscribe(this.hideEvent.fire, this.hideEvent, true)
                            }
                            h.animateOut()
                        }
                    } else {
                        if (currentVis === "") {
                            Dom.setStyle(this.element, "visibility", "hidden")
                        }
                    }
                } else {
                    if (currentVis == "visible" || currentVis === "") {
                        this.beforeHideEvent.fire();
                        Dom.setStyle(this.element, "visibility", "hidden");
                        this.hideEvent.fire()
                    }
                }
            }
        },
        doCenterOnDOMEvent: function () {
            if (this.cfg.getProperty("visible")) {
                this.center()
            }
        },
        configFixedCenter: function (type, args, obj) {
            var val = args[0],
                alreadySubscribed = Config.alreadySubscribed,
                windowResizeEvent = Overlay.windowResizeEvent,
                windowScrollEvent = Overlay.windowScrollEvent;
            if (val) {
                this.center();
                if (!alreadySubscribed(this.beforeShowEvent, this.center, this)) {
                    this.beforeShowEvent.subscribe(this.center)
                }
                if (!alreadySubscribed(windowResizeEvent, this.doCenterOnDOMEvent, this)) {
                    windowResizeEvent.subscribe(this.doCenterOnDOMEvent, this, true)
                }
                if (!alreadySubscribed(windowScrollEvent, this.doCenterOnDOMEvent, this)) {
                    windowScrollEvent.subscribe(this.doCenterOnDOMEvent, this, true)
                }
            } else {
                this.beforeShowEvent.unsubscribe(this.center);
                windowResizeEvent.unsubscribe(this.doCenterOnDOMEvent, this);
                windowScrollEvent.unsubscribe(this.doCenterOnDOMEvent, this)
            }
        },
        configHeight: function (type, args, obj) {
            var height = args[0],
                el = this.element;
            Dom.setStyle(el, "height", height);
            this.cfg.refireEvent("iframe")
        },
        configWidth: function (type, args, obj) {
            var width = args[0],
                el = this.element;
            Dom.setStyle(el, "width", width);
            this.cfg.refireEvent("iframe")
        },
        configzIndex: function (type, args, obj) {
            var zIndex = args[0],
                el = this.element;
            if (!zIndex) {
                zIndex = Dom.getStyle(el, "zIndex");
                if (!zIndex || isNaN(zIndex)) {
                    zIndex = 0
                }
            }
            if (this.iframe || this.cfg.getProperty("iframe") === true) {
                if (zIndex <= 0) {
                    zIndex = 1
                }
            }
            Dom.setStyle(el, "zIndex", zIndex);
            this.cfg.setProperty("zIndex", zIndex, true);
            if (this.iframe) {
                this.stackIframe()
            }
        },
        configXY: function (type, args, obj) {
            var pos = args[0],
                x = pos[0],
                y = pos[1];
            this.cfg.setProperty("x", x);
            this.cfg.setProperty("y", y);
            this.beforeMoveEvent.fire([x, y]);
            x = this.cfg.getProperty("x");
            y = this.cfg.getProperty("y");
            this.cfg.refireEvent("iframe");
            this.moveEvent.fire([x, y])
        },
        configX: function (type, args, obj) {
            var x = args[0],
                y = this.cfg.getProperty("y");
            this.cfg.setProperty("x", x, true);
            this.cfg.setProperty("y", y, true);
            this.beforeMoveEvent.fire([x, y]);
            x = this.cfg.getProperty("x");
            y = this.cfg.getProperty("y");
            Dom.setX(this.element, x, true);
            this.cfg.setProperty("xy", [x, y], true);
            this.cfg.refireEvent("iframe");
            this.moveEvent.fire([x, y])
        },
        configY: function (type, args, obj) {
            var x = this.cfg.getProperty("x"),
                y = args[0];
            this.cfg.setProperty("x", x, true);
            this.cfg.setProperty("y", y, true);
            this.beforeMoveEvent.fire([x, y]);
            x = this.cfg.getProperty("x");
            y = this.cfg.getProperty("y");
            Dom.setY(this.element, y, true);
            this.cfg.setProperty("xy", [x, y], true);
            this.cfg.refireEvent("iframe");
            this.moveEvent.fire([x, y])
        },
        showIframe: function () {
            var oIFrame = this.iframe,
                oParentNode;
            if (oIFrame) {
                oParentNode = this.element.parentNode;
                if (oParentNode != oIFrame.parentNode) {
                    this._addToParent(oParentNode, oIFrame)
                }
                oIFrame.style.display = "block"
            }
        },
        hideIframe: function () {
            if (this.iframe) {
                this.iframe.style.display = "none"
            }
        },
        syncIframe: function () {
            var oIFrame = this.iframe,
                oElement = this.element,
                nOffset = Overlay.IFRAME_OFFSET,
                nDimensionOffset = (nOffset * 2),
                aXY;
            if (oIFrame) {
                oIFrame.style.width = (oElement.offsetWidth + nDimensionOffset + "px");
                oIFrame.style.height = (oElement.offsetHeight + nDimensionOffset + "px");
                aXY = this.cfg.getProperty("xy");
                if (!Lang.isArray(aXY) || (isNaN(aXY[0]) || isNaN(aXY[1]))) {
                    this.syncPosition();
                    aXY = this.cfg.getProperty("xy")
                }
                Dom.setXY(oIFrame, [(aXY[0] - nOffset), (aXY[1] - nOffset)])
            }
        },
        stackIframe: function () {
            if (this.iframe) {
                var overlayZ = Dom.getStyle(this.element, "zIndex");
                if (!YAHOO.lang.isUndefined(overlayZ) && !isNaN(overlayZ)) {
                    Dom.setStyle(this.iframe, "zIndex", (overlayZ - 1))
                }
            }
        },
        configIframe: function (type, args, obj) {
            var bIFrame = args[0];

            function createIFrame() {
                var oIFrame = this.iframe,
                    oElement = this.element,
                    oParent;
                if (!oIFrame) {
                    if (!m_oIFrameTemplate) {
                        m_oIFrameTemplate = document.createElement("iframe");
                        if (this.isSecure) {
                            m_oIFrameTemplate.src = Overlay.IFRAME_SRC
                        }
                        if (YAHOO.env.ua.ie) {
                            m_oIFrameTemplate.style.filter = "alpha(opacity=0)";
                            m_oIFrameTemplate.frameBorder = 0
                        } else {
                            m_oIFrameTemplate.style.opacity = "0"
                        }
                        m_oIFrameTemplate.style.position = "absolute";
                        m_oIFrameTemplate.style.border = "none";
                        m_oIFrameTemplate.style.margin = "0";
                        m_oIFrameTemplate.style.padding = "0";
                        m_oIFrameTemplate.style.display = "none"
                    }
                    oIFrame = m_oIFrameTemplate.cloneNode(false);
                    oParent = oElement.parentNode;
                    var parentNode = oParent || document.body;
                    this._addToParent(parentNode, oIFrame);
                    this.iframe = oIFrame
                }
                this.showIframe();
                this.syncIframe();
                this.stackIframe();
                if (!this._hasIframeEventListeners) {
                    this.showEvent.subscribe(this.showIframe);
                    this.hideEvent.subscribe(this.hideIframe);
                    this.changeContentEvent.subscribe(this.syncIframe);
                    this._hasIframeEventListeners = true
                }
            }
            function onBeforeShow() {
                createIFrame.call(this);
                this.beforeShowEvent.unsubscribe(onBeforeShow);
                this._iframeDeferred = false
            }
            if (bIFrame) {
                if (this.cfg.getProperty("visible")) {
                    createIFrame.call(this)
                } else {
                    if (!this._iframeDeferred) {
                        this.beforeShowEvent.subscribe(onBeforeShow);
                        this._iframeDeferred = true
                    }
                }
            } else {
                this.hideIframe();
                if (this._hasIframeEventListeners) {
                    this.showEvent.unsubscribe(this.showIframe);
                    this.hideEvent.unsubscribe(this.hideIframe);
                    this.changeContentEvent.unsubscribe(this.syncIframe);
                    this._hasIframeEventListeners = false
                }
            }
        },
        _primeXYFromDOM: function () {
            if (YAHOO.lang.isUndefined(this.cfg.getProperty("xy"))) {
                this.syncPosition();
                this.cfg.refireEvent("xy");
                this.beforeShowEvent.unsubscribe(this._primeXYFromDOM)
            }
        },
        configConstrainToViewport: function (type, args, obj) {
            var val = args[0];
            if (val) {
                if (!Config.alreadySubscribed(this.beforeMoveEvent, this.enforceConstraints, this)) {
                    this.beforeMoveEvent.subscribe(this.enforceConstraints, this, true)
                }
                if (!Config.alreadySubscribed(this.beforeShowEvent, this._primeXYFromDOM)) {
                    this.beforeShowEvent.subscribe(this._primeXYFromDOM)
                }
            } else {
                this.beforeShowEvent.unsubscribe(this._primeXYFromDOM);
                this.beforeMoveEvent.unsubscribe(this.enforceConstraints, this)
            }
        },
        configContext: function (type, args, obj) {
            var contextArgs = args[0],
                contextEl, elementMagnetCorner, contextMagnetCorner;
            if (contextArgs) {
                contextEl = contextArgs[0];
                elementMagnetCorner = contextArgs[1];
                contextMagnetCorner = contextArgs[2];
                if (contextEl) {
                    if (typeof contextEl == "string") {
                        this.cfg.setProperty("context", [document.getElementById(contextEl), elementMagnetCorner, contextMagnetCorner], true)
                    }
                    if (elementMagnetCorner && contextMagnetCorner) {
                        this.align(elementMagnetCorner, contextMagnetCorner)
                    }
                }
            }
        },
        align: function (elementAlign, contextAlign) {
            var contextArgs = this.cfg.getProperty("context"),
                me = this,
                context, element, contextRegion;

            function doAlign(v, h) {
                switch (elementAlign) {
                case Overlay.TOP_LEFT:
                    me.moveTo(h, v);
                    break;
                case Overlay.TOP_RIGHT:
                    me.moveTo((h - element.offsetWidth), v);
                    break;
                case Overlay.BOTTOM_LEFT:
                    me.moveTo(h, (v - element.offsetHeight));
                    break;
                case Overlay.BOTTOM_RIGHT:
                    me.moveTo((h - element.offsetWidth), (v - element.offsetHeight));
                    break
                }
            }
            if (contextArgs) {
                context = contextArgs[0];
                element = this.element;
                me = this;
                if (!elementAlign) {
                    elementAlign = contextArgs[1]
                }
                if (!contextAlign) {
                    contextAlign = contextArgs[2]
                }
                if (element && context) {
                    contextRegion = Dom.getRegion(context);
                    switch (contextAlign) {
                    case Overlay.TOP_LEFT:
                        doAlign(contextRegion.top, contextRegion.left);
                        break;
                    case Overlay.TOP_RIGHT:
                        doAlign(contextRegion.top, contextRegion.right);
                        break;
                    case Overlay.BOTTOM_LEFT:
                        doAlign(contextRegion.bottom, contextRegion.left);
                        break;
                    case Overlay.BOTTOM_RIGHT:
                        doAlign(contextRegion.bottom, contextRegion.right);
                        break
                    }
                }
            }
        },
        enforceConstraints: function (type, args, obj) {
            var pos = args[0];
            var cXY = this.getConstrainedXY(pos[0], pos[1]);
            this.cfg.setProperty("x", cXY[0], true);
            this.cfg.setProperty("y", cXY[1], true);
            this.cfg.setProperty("xy", cXY, true)
        },
        getConstrainedXY: function (x, y) {
            var nViewportOffset = Overlay.VIEWPORT_OFFSET,
                viewPortWidth = Dom.getViewportWidth(),
                viewPortHeight = Dom.getViewportHeight(),
                offsetHeight = this.element.offsetHeight,
                offsetWidth = this.element.offsetWidth,
                scrollX = Dom.getDocumentScrollLeft(),
                scrollY = Dom.getDocumentScrollTop();
            var xNew = x;
            var yNew = y;
            if (offsetWidth + nViewportOffset < viewPortWidth) {
                var leftConstraint = scrollX + nViewportOffset;
                var rightConstraint = scrollX + viewPortWidth - offsetWidth - nViewportOffset;
                if (x < leftConstraint) {
                    xNew = leftConstraint
                } else {
                    if (x > rightConstraint) {
                        xNew = rightConstraint
                    }
                }
            } else {
                xNew = nViewportOffset + scrollX
            }
            if (offsetHeight + nViewportOffset < viewPortHeight) {
                var topConstraint = scrollY + nViewportOffset;
                var bottomConstraint = scrollY + viewPortHeight - offsetHeight - nViewportOffset;
                if (y < topConstraint) {
                    yNew = topConstraint
                } else {
                    if (y > bottomConstraint) {
                        yNew = bottomConstraint
                    }
                }
            } else {
                yNew = nViewportOffset + scrollY
            }
            return [xNew, yNew]
        },
        center: function () {
            var nViewportOffset = Overlay.VIEWPORT_OFFSET,
                elementWidth = this.element.offsetWidth,
                elementHeight = this.element.offsetHeight,
                viewPortWidth = Dom.getViewportWidth(),
                viewPortHeight = Dom.getViewportHeight(),
                x, y;
            if (elementWidth < viewPortWidth) {
                x = (viewPortWidth / 2) - (elementWidth / 2) + Dom.getDocumentScrollLeft()
            } else {
                x = nViewportOffset + Dom.getDocumentScrollLeft()
            }
            if (elementHeight < viewPortHeight) {
                y = (viewPortHeight / 2) - (elementHeight / 2) + Dom.getDocumentScrollTop()
            } else {
                y = nViewportOffset + Dom.getDocumentScrollTop()
            }
            this.cfg.setProperty("xy", [parseInt(x, 10), parseInt(y, 10)]);
            this.cfg.refireEvent("iframe")
        },
        syncPosition: function () {
            var pos = Dom.getXY(this.element);
            this.cfg.setProperty("x", pos[0], true);
            this.cfg.setProperty("y", pos[1], true);
            this.cfg.setProperty("xy", pos, true)
        },
        onDomResize: function (e, obj) {
            var me = this;
            Overlay.superclass.onDomResize.call(this, e, obj);
            setTimeout(function () {
                me.syncPosition();
                me.cfg.refireEvent("iframe");
                me.cfg.refireEvent("context")
            },
            0)
        },
        bringToTop: function () {
            var aOverlays = [],
                oElement = this.element;

            function compareZIndexDesc(p_oOverlay1, p_oOverlay2) {
                var sZIndex1 = Dom.getStyle(p_oOverlay1, "zIndex"),
                    sZIndex2 = Dom.getStyle(p_oOverlay2, "zIndex"),
                    nZIndex1 = (!sZIndex1 || isNaN(sZIndex1)) ? 0 : parseInt(sZIndex1, 10),
                nZIndex2 = (!sZIndex2 || isNaN(sZIndex2)) ? 0 : parseInt(sZIndex2, 10);
                if (nZIndex1 > nZIndex2) {
                    return -1
                } else {
                    if (nZIndex1 < nZIndex2) {
                        return 1
                    } else {
                        return 0
                    }
                }
            }
            function isOverlayElement(p_oElement) {
                var oOverlay = Dom.hasClass(p_oElement, Overlay.CSS_OVERLAY),
                    Panel = YAHOO.widget.Panel;
                if (oOverlay && !Dom.isAncestor(oElement, oOverlay)) {
                    if (Panel && Dom.hasClass(p_oElement, Panel.CSS_PANEL)) {
                        aOverlays[aOverlays.length] = p_oElement.parentNode
                    } else {
                        aOverlays[aOverlays.length] = p_oElement
                    }
                }
            }
            Dom.getElementsBy(isOverlayElement, "DIV", document.body);
            aOverlays.sort(compareZIndexDesc);
            var oTopOverlay = aOverlays[0],
                nTopZIndex;
            if (oTopOverlay) {
                nTopZIndex = Dom.getStyle(oTopOverlay, "zIndex");
                if (!isNaN(nTopZIndex)) {
                    var bRequiresBump = false;
                    if (oTopOverlay != oElement) {
                        bRequiresBump = true
                    } else {
                        if (aOverlays.length > 1) {
                            var nNextZIndex = Dom.getStyle(aOverlays[1], "zIndex");
                            if (!isNaN(nNextZIndex) && (nTopZIndex == nNextZIndex)) {
                                bRequiresBump = true
                            }
                        }
                    }
                    if (bRequiresBump) {
                        this.cfg.setProperty("zindex", (parseInt(nTopZIndex, 10) + 2))
                    }
                }
            }
        },
        destroy: function () {
            if (this.iframe) {
                this.iframe.parentNode.removeChild(this.iframe)
            }
            this.iframe = null;
            Overlay.windowResizeEvent.unsubscribe(this.doCenterOnDOMEvent, this);
            Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEvent, this);
            Overlay.superclass.destroy.call(this)
        },
        toString: function () {
            return "Overlay " + this.id
        }
    })
}());
(function () {
    YAHOO.widget.OverlayManager = function (userConfig) {
        this.init(userConfig)
    };
    var Overlay = YAHOO.widget.Overlay,
        Event = YAHOO.util.Event,
        Dom = YAHOO.util.Dom,
        Config = YAHOO.util.Config,
        CustomEvent = YAHOO.util.CustomEvent,
        OverlayManager = YAHOO.widget.OverlayManager;
    OverlayManager.CSS_FOCUSED = "focused";
    OverlayManager.prototype = {
        constructor: OverlayManager,
        overlays: null,
        initDefaultConfig: function () {
            this.cfg.addProperty("overlays", {
                suppressEvent: true
            });
            this.cfg.addProperty("focusevent", {
                value: "mousedown"
            })
        },
        init: function (userConfig) {
            this.cfg = new Config(this);
            this.initDefaultConfig();
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            this.cfg.fireQueue();
            var activeOverlay = null;
            this.getActive = function () {
                return activeOverlay
            };
            this.focus = function (overlay) {
                var o = this.find(overlay);
                if (o) {
                    if (activeOverlay != o) {
                        if (activeOverlay) {
                            activeOverlay.blur()
                        }
                        this.bringToTop(o);
                        activeOverlay = o;
                        Dom.addClass(activeOverlay.element, OverlayManager.CSS_FOCUSED);
                        o.focusEvent.fire()
                    }
                }
            };
            this.remove = function (overlay) {
                var o = this.find(overlay),
                    originalZ;
                if (o) {
                    if (activeOverlay == o) {
                        activeOverlay = null
                    }
                    var bDestroyed = (o.element === null && o.cfg === null) ? true : false;
                    if (!bDestroyed) {
                        originalZ = Dom.getStyle(o.element, "zIndex");
                        o.cfg.setProperty("zIndex", -1000, true)
                    }
                    this.overlays.sort(this.compareZIndexDesc);
                    this.overlays = this.overlays.slice(0, (this.overlays.length - 1));
                    o.hideEvent.unsubscribe(o.blur);
                    o.destroyEvent.unsubscribe(this._onOverlayDestroy, o);
                    if (!bDestroyed) {
                        Event.removeListener(o.element, this.cfg.getProperty("focusevent"), this._onOverlayElementFocus);
                        o.cfg.setProperty("zIndex", originalZ, true);
                        o.cfg.setProperty("manager", null)
                    }
                    o.focusEvent.unsubscribeAll();
                    o.blurEvent.unsubscribeAll();
                    o.focusEvent = null;
                    o.blurEvent = null;
                    o.focus = null;
                    o.blur = null
                }
            };
            this.blurAll = function () {
                var nOverlays = this.overlays.length,
                    i;
                if (nOverlays > 0) {
                    i = nOverlays - 1;
                    do {
                        this.overlays[i].blur()
                    } while (i--)
                }
            };
            this._onOverlayBlur = function (p_sType, p_aArgs) {
                activeOverlay = null
            };
            var overlays = this.cfg.getProperty("overlays");
            if (!this.overlays) {
                this.overlays = []
            }
            if (overlays) {
                this.register(overlays);
                this.overlays.sort(this.compareZIndexDesc)
            }
        },
        _onOverlayElementFocus: function (p_oEvent) {
            var oTarget = Event.getTarget(p_oEvent),
                oClose = this.close;
            if (oClose && (oTarget == oClose || Dom.isAncestor(oClose, oTarget))) {
                this.blur()
            } else {
                this.focus()
            }
        },
        _onOverlayDestroy: function (p_sType, p_aArgs, p_oOverlay) {
            this.remove(p_oOverlay)
        },
        register: function (overlay) {
            var mgr = this,
                zIndex, regcount, i, nOverlays;
            if (overlay instanceof Overlay) {
                overlay.cfg.addProperty("manager", {
                    value: this
                });
                overlay.focusEvent = overlay.createEvent("focus");
                overlay.focusEvent.signature = CustomEvent.LIST;
                overlay.blurEvent = overlay.createEvent("blur");
                overlay.blurEvent.signature = CustomEvent.LIST;
                overlay.focus = function () {
                    mgr.focus(this)
                };
                overlay.blur = function () {
                    if (mgr.getActive() == this) {
                        Dom.removeClass(this.element, OverlayManager.CSS_FOCUSED);
                        this.blurEvent.fire()
                    }
                };
                overlay.blurEvent.subscribe(mgr._onOverlayBlur);
                overlay.hideEvent.subscribe(overlay.blur);
                overlay.destroyEvent.subscribe(this._onOverlayDestroy, overlay, this);
                Event.on(overlay.element, this.cfg.getProperty("focusevent"), this._onOverlayElementFocus, null, overlay);
                zIndex = Dom.getStyle(overlay.element, "zIndex");
                if (!isNaN(zIndex)) {
                    overlay.cfg.setProperty("zIndex", parseInt(zIndex, 10))
                } else {
                    overlay.cfg.setProperty("zIndex", 0)
                }
                this.overlays.push(overlay);
                this.bringToTop(overlay);
                return true
            } else {
                if (overlay instanceof Array) {
                    regcount = 0;
                    nOverlays = overlay.length;
                    for (i = 0; i < nOverlays; i++) {
                        if (this.register(overlay[i])) {
                            regcount++
                        }
                    }
                    if (regcount > 0) {
                        return true
                    }
                } else {
                    return false
                }
            }
        },
        bringToTop: function (p_oOverlay) {
            var oOverlay = this.find(p_oOverlay),
                nTopZIndex, oTopOverlay, aOverlays;
            if (oOverlay) {
                aOverlays = this.overlays;
                aOverlays.sort(this.compareZIndexDesc);
                oTopOverlay = aOverlays[0];
                if (oTopOverlay) {
                    nTopZIndex = Dom.getStyle(oTopOverlay.element, "zIndex");
                    if (!isNaN(nTopZIndex)) {
                        var bRequiresBump = false;
                        if (oTopOverlay !== oOverlay) {
                            bRequiresBump = true
                        } else {
                            if (aOverlays.length > 1) {
                                var nNextZIndex = Dom.getStyle(aOverlays[1].element, "zIndex");
                                if (!isNaN(nNextZIndex) && (nTopZIndex == nNextZIndex)) {
                                    bRequiresBump = true
                                }
                            }
                        }
                        if (bRequiresBump) {
                            oOverlay.cfg.setProperty("zindex", (parseInt(nTopZIndex, 10) + 2))
                        }
                    }
                    aOverlays.sort(this.compareZIndexDesc)
                }
            }
        },
        find: function (overlay) {
            var aOverlays = this.overlays,
                nOverlays = aOverlays.length,
                i;
            if (nOverlays > 0) {
                i = nOverlays - 1;
                if (overlay instanceof Overlay) {
                    do {
                        if (aOverlays[i] == overlay) {
                            return aOverlays[i]
                        }
                    } while (i--)
                } else {
                    if (typeof overlay == "string") {
                        do {
                            if (aOverlays[i].id == overlay) {
                                return aOverlays[i]
                            }
                        } while (i--)
                    }
                }
                return null
            }
        },
        compareZIndexDesc: function (o1, o2) {
            var zIndex1 = (o1.cfg) ? o1.cfg.getProperty("zIndex") : null,
            zIndex2 = (o2.cfg) ? o2.cfg.getProperty("zIndex") : null;
            if (zIndex1 === null && zIndex2 === null) {
                return 0
            } else {
                if (zIndex1 === null) {
                    return 1
                } else {
                    if (zIndex2 === null) {
                        return -1
                    } else {
                        if (zIndex1 > zIndex2) {
                            return -1
                        } else {
                            if (zIndex1 < zIndex2) {
                                return 1
                            } else {
                                return 0
                            }
                        }
                    }
                }
            }
        },
        showAll: function () {
            var aOverlays = this.overlays,
                nOverlays = aOverlays.length,
                i;
            if (nOverlays > 0) {
                i = nOverlays - 1;
                do {
                    aOverlays[i].show()
                } while (i--)
            }
        },
        hideAll: function () {
            var aOverlays = this.overlays,
                nOverlays = aOverlays.length,
                i;
            if (nOverlays > 0) {
                i = nOverlays - 1;
                do {
                    aOverlays[i].hide()
                } while (i--)
            }
        },
        toString: function () {
            return "OverlayManager"
        }
    }
}());
(function () {
    YAHOO.widget.Tooltip = function (el, userConfig) {
        YAHOO.widget.Tooltip.superclass.constructor.call(this, el, userConfig)
    };
    var Lang = YAHOO.lang,
        Event = YAHOO.util.Event,
        CustomEvent = YAHOO.util.CustomEvent,
        Dom = YAHOO.util.Dom,
        Tooltip = YAHOO.widget.Tooltip,
        m_oShadowTemplate, DEFAULT_CONFIG = {
        PREVENT_OVERLAP: {
            key: "preventoverlap",
            value: true,
            validator: Lang.isBoolean,
            supercedes: ["x", "y", "xy"]
        },
        SHOW_DELAY: {
            key: "showdelay",
            value: 200,
            validator: Lang.isNumber
        },
        AUTO_DISMISS_DELAY: {
            key: "autodismissdelay",
            value: 5000,
            validator: Lang.isNumber
        },
        HIDE_DELAY: {
            key: "hidedelay",
            value: 250,
            validator: Lang.isNumber
        },
        TEXT: {
            key: "text",
            suppressEvent: true
        },
        CONTAINER: {
            key: "container"
        },
        DISABLED: {
            key: "disabled",
            value: false,
            suppressEvent: true
        }
    },
        EVENT_TYPES = {
        CONTEXT_MOUSE_OVER: "contextMouseOver",
        CONTEXT_MOUSE_OUT: "contextMouseOut",
        CONTEXT_TRIGGER: "contextTrigger"
    };
    Tooltip.CSS_TOOLTIP = "yui-tt";

    function restoreOriginalWidth(p_sType, p_aArgs, p_oObject) {
        var sOriginalWidth = p_oObject[0],
            sNewWidth = p_oObject[1],
            oConfig = this.cfg,
            sCurrentWidth = oConfig.getProperty("width");
        if (sCurrentWidth == sNewWidth) {
            oConfig.setProperty("width", sOriginalWidth)
        }
        this.unsubscribe("hide", this._onHide, p_oObject)
    }
    function setWidthToOffsetWidth(p_sType, p_aArgs) {
        var oBody = document.body,
            oConfig = this.cfg,
            sOriginalWidth = oConfig.getProperty("width"),
            sNewWidth, oClone;
        if ((!sOriginalWidth || sOriginalWidth == "auto") && (oConfig.getProperty("container") != oBody || oConfig.getProperty("x") >= Dom.getViewportWidth() || oConfig.getProperty("y") >= Dom.getViewportHeight())) {
            oClone = this.element.cloneNode(true);
            oClone.style.visibility = "hidden";
            oClone.style.top = "0px";
            oClone.style.left = "0px";
            oBody.appendChild(oClone);
            sNewWidth = (oClone.offsetWidth + "px");
            oBody.removeChild(oClone);
            oClone = null;
            oConfig.setProperty("width", sNewWidth);
            oConfig.refireEvent("xy");
            this.subscribe("hide", restoreOriginalWidth, [(sOriginalWidth || ""), sNewWidth])
        }
    }
    function onDOMReady(p_sType, p_aArgs, p_oObject) {
        this.render(p_oObject)
    }
    function onInit() {
        Event.onDOMReady(onDOMReady, this.cfg.getProperty("container"), this)
    }
    YAHOO.extend(Tooltip, YAHOO.widget.Overlay, {
        init: function (el, userConfig) {
            Tooltip.superclass.init.call(this, el);
            this.beforeInitEvent.fire(Tooltip);
            Dom.addClass(this.element, Tooltip.CSS_TOOLTIP);
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            this.cfg.queueProperty("visible", false);
            this.cfg.queueProperty("constraintoviewport", true);
            this.setBody("");
            this.subscribe("beforeShow", setWidthToOffsetWidth);
            this.subscribe("init", onInit);
            this.subscribe("render", this.onRender);
            this.initEvent.fire(Tooltip)
        },
        initEvents: function () {
            Tooltip.superclass.initEvents.call(this);
            var SIGNATURE = CustomEvent.LIST;
            this.contextMouseOverEvent = this.createEvent(EVENT_TYPES.CONTEXT_MOUSE_OVER);
            this.contextMouseOverEvent.signature = SIGNATURE;
            this.contextMouseOutEvent = this.createEvent(EVENT_TYPES.CONTEXT_MOUSE_OUT);
            this.contextMouseOutEvent.signature = SIGNATURE;
            this.contextTriggerEvent = this.createEvent(EVENT_TYPES.CONTEXT_TRIGGER);
            this.contextTriggerEvent.signature = SIGNATURE
        },
        initDefaultConfig: function () {
            Tooltip.superclass.initDefaultConfig.call(this);
            this.cfg.addProperty(DEFAULT_CONFIG.PREVENT_OVERLAP.key, {
                value: DEFAULT_CONFIG.PREVENT_OVERLAP.value,
                validator: DEFAULT_CONFIG.PREVENT_OVERLAP.validator,
                supercedes: DEFAULT_CONFIG.PREVENT_OVERLAP.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.SHOW_DELAY.key, {
                handler: this.configShowDelay,
                value: 200,
                validator: DEFAULT_CONFIG.SHOW_DELAY.validator
            });
            this.cfg.addProperty(DEFAULT_CONFIG.AUTO_DISMISS_DELAY.key, {
                handler: this.configAutoDismissDelay,
                value: DEFAULT_CONFIG.AUTO_DISMISS_DELAY.value,
                validator: DEFAULT_CONFIG.AUTO_DISMISS_DELAY.validator
            });
            this.cfg.addProperty(DEFAULT_CONFIG.HIDE_DELAY.key, {
                handler: this.configHideDelay,
                value: DEFAULT_CONFIG.HIDE_DELAY.value,
                validator: DEFAULT_CONFIG.HIDE_DELAY.validator
            });
            this.cfg.addProperty(DEFAULT_CONFIG.TEXT.key, {
                handler: this.configText,
                suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent
            });
            this.cfg.addProperty(DEFAULT_CONFIG.CONTAINER.key, {
                handler: this.configContainer,
                value: document.body
            });
            this.cfg.addProperty(DEFAULT_CONFIG.DISABLED.key, {
                handler: this.configContainer,
                value: DEFAULT_CONFIG.DISABLED.value,
                supressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent
            })
        },
        configText: function (type, args, obj) {
            var text = args[0];
            if (text) {
                this.setBody(text)
            }
        },
        configContainer: function (type, args, obj) {
            var container = args[0];
            if (typeof container == "string") {
                this.cfg.setProperty("container", document.getElementById(container), true)
            }
        },
        _removeEventListeners: function () {
            var aElements = this._context,
                nElements, oElement, i;
            if (aElements) {
                nElements = aElements.length;
                if (nElements > 0) {
                    i = nElements - 1;
                    do {
                        oElement = aElements[i];
                        Event.removeListener(oElement, "mouseover", this.onContextMouseOver);
                        Event.removeListener(oElement, "mousemove", this.onContextMouseMove);
                        Event.removeListener(oElement, "mouseout", this.onContextMouseOut)
                    } while (i--)
                }
            }
        },
        configContext: function (type, args, obj) {
            var context = args[0],
                aElements, nElements, oElement, i;
            if (context) {
                if (! (context instanceof Array)) {
                    if (typeof context == "string") {
                        this.cfg.setProperty("context", [document.getElementById(context)], true)
                    } else {
                        this.cfg.setProperty("context", [context], true)
                    }
                    context = this.cfg.getProperty("context")
                }
                this._removeEventListeners();
                this._context = context;
                aElements = this._context;
                if (aElements) {
                    nElements = aElements.length;
                    if (nElements > 0) {
                        i = nElements - 1;
                        do {
                            oElement = aElements[i];
                            Event.on(oElement, "mouseover", this.onContextMouseOver, this);
                            Event.on(oElement, "mousemove", this.onContextMouseMove, this);
                            Event.on(oElement, "mouseout", this.onContextMouseOut, this)
                        } while (i--)
                    }
                }
            }
        },
        onContextMouseMove: function (e, obj) {
            obj.pageX = Event.getPageX(e);
            obj.pageY = Event.getPageY(e)
        },
        onContextMouseOver: function (e, obj) {
            var context = this;
            if (context.title) {
                obj._tempTitle = context.title;
                context.title = ""
            }
            if (obj.fireEvent("contextMouseOver", context, e) !== false && !obj.cfg.getProperty("disabled")) {
                if (obj.hideProcId) {
                    clearTimeout(obj.hideProcId);
                    obj.hideProcId = null
                }
                Event.on(context, "mousemove", obj.onContextMouseMove, obj);
                obj.showProcId = obj.doShow(e, context)
            }
        },
        onContextMouseOut: function (e, obj) {
            var el = this;
            if (obj._tempTitle) {
                el.title = obj._tempTitle;
                obj._tempTitle = null
            }
            if (obj.showProcId) {
                clearTimeout(obj.showProcId);
                obj.showProcId = null
            }
            if (obj.hideProcId) {
                clearTimeout(obj.hideProcId);
                obj.hideProcId = null
            }
            obj.fireEvent("contextMouseOut", el, e);
            obj.hideProcId = setTimeout(function () {
                obj.hide()
            },
            obj.cfg.getProperty("hidedelay"))
        },
        doShow: function (e, context) {
            var yOffset = 25,
                me = this;
            if (YAHOO.env.ua.opera && context.tagName && context.tagName.toUpperCase() == "A") {
                yOffset += 12
            }
            return setTimeout(function () {
                var txt = me.cfg.getProperty("text");
                if (me._tempTitle && (txt === "" || YAHOO.lang.isUndefined(txt) || YAHOO.lang.isNull(txt))) {
                    me.setBody(me._tempTitle)
                } else {
                    me.cfg.refireEvent("text")
                }
                me.moveTo(me.pageX, me.pageY + yOffset);
                if (me.cfg.getProperty("preventoverlap")) {
                    me.preventOverlap(me.pageX, me.pageY)
                }
                Event.removeListener(context, "mousemove", me.onContextMouseMove);
                me.contextTriggerEvent.fire(context);
                me.show();
                me.hideProcId = me.doHide()
            },
            this.cfg.getProperty("showdelay"))
        },
        doHide: function () {
            var me = this;
            return setTimeout(function () {
                me.hide()
            },
            this.cfg.getProperty("autodismissdelay"))
        },
        preventOverlap: function (pageX, pageY) {
            var height = this.element.offsetHeight,
                mousePoint = new YAHOO.util.Point(pageX, pageY),
                elementRegion = Dom.getRegion(this.element);
            elementRegion.top -= 5;
            elementRegion.left -= 5;
            elementRegion.right += 5;
            elementRegion.bottom += 5;
            if (elementRegion.contains(mousePoint)) {
                this.cfg.setProperty("y", (pageY - height - 5))
            }
        },
        onRender: function (p_sType, p_aArgs) {
            function sizeShadow() {
                var oElement = this.element,
                    oShadow = this._shadow;
                if (oShadow) {
                    oShadow.style.width = (oElement.offsetWidth + 6) + "px";
                    oShadow.style.height = (oElement.offsetHeight + 1) + "px"
                }
            }
            function addShadowVisibleClass() {
                Dom.addClass(this._shadow, "yui-tt-shadow-visible")
            }
            function removeShadowVisibleClass() {
                Dom.removeClass(this._shadow, "yui-tt-shadow-visible")
            }
            function createShadow() {
                var oShadow = this._shadow,
                    oElement, Module, nIE, me;
                if (!oShadow) {
                    oElement = this.element;
                    Module = YAHOO.widget.Module;
                    nIE = YAHOO.env.ua.ie;
                    me = this;
                    if (!m_oShadowTemplate) {
                        m_oShadowTemplate = document.createElement("div");
                        m_oShadowTemplate.className = "yui-tt-shadow"
                    }
                    oShadow = m_oShadowTemplate.cloneNode(false);
                    oElement.appendChild(oShadow);
                    this._shadow = oShadow;
                    addShadowVisibleClass.call(this);
                    this.subscribe("beforeShow", addShadowVisibleClass);
                    this.subscribe("beforeHide", removeShadowVisibleClass);
                    if (nIE == 6 || (nIE == 7 && document.compatMode == "BackCompat")) {
                        window.setTimeout(function () {
                            sizeShadow.call(me)
                        },
                        0);
                        this.cfg.subscribeToConfigEvent("width", sizeShadow);
                        this.cfg.subscribeToConfigEvent("height", sizeShadow);
                        this.subscribe("changeContent", sizeShadow);
                        Module.textResizeEvent.subscribe(sizeShadow, this, true);
                        this.subscribe("destroy", function () {
                            Module.textResizeEvent.unsubscribe(sizeShadow, this)
                        })
                    }
                }
            }
            function onBeforeShow() {
                createShadow.call(this);
                this.unsubscribe("beforeShow", onBeforeShow)
            }
            if (this.cfg.getProperty("visible")) {
                createShadow.call(this)
            } else {
                this.subscribe("beforeShow", onBeforeShow)
            }
        },
        destroy: function () {
            this._removeEventListeners();
            Tooltip.superclass.destroy.call(this)
        },
        toString: function () {
            return "Tooltip " + this.id
        }
    })
}());
(function () {
    YAHOO.widget.Panel = function (el, userConfig) {
        YAHOO.widget.Panel.superclass.constructor.call(this, el, userConfig)
    };
    var Lang = YAHOO.lang,
        DD = YAHOO.util.DD,
        Dom = YAHOO.util.Dom,
        Event = YAHOO.util.Event,
        Overlay = YAHOO.widget.Overlay,
        CustomEvent = YAHOO.util.CustomEvent,
        Config = YAHOO.util.Config,
        Panel = YAHOO.widget.Panel,
        m_oMaskTemplate, m_oUnderlayTemplate, m_oCloseIconTemplate, EVENT_TYPES = {
        SHOW_MASK: "showMask",
        HIDE_MASK: "hideMask",
        DRAG: "drag"
    },
        DEFAULT_CONFIG = {
        CLOSE: {
            key: "close",
            value: true,
            validator: Lang.isBoolean,
            supercedes: ["visible"]
        },
        DRAGGABLE: {
            key: "draggable",
            value: (DD ? true : false),
            validator: Lang.isBoolean,
            supercedes: ["visible"]
        },
        DRAG_ONLY: {
            key: "dragonly",
            value: false,
            validator: Lang.isBoolean,
            supercedes: ["draggable"]
        },
        UNDERLAY: {
            key: "underlay",
            value: "shadow",
            supercedes: ["visible"]
        },
        MODAL: {
            key: "modal",
            value: false,
            validator: Lang.isBoolean,
            supercedes: ["visible", "zindex"]
        },
        KEY_LISTENERS: {
            key: "keylisteners",
            suppressEvent: true,
            supercedes: ["visible"]
        }
    };
    Panel.CSS_PANEL = "yui-panel";
    Panel.CSS_PANEL_CONTAINER = "yui-panel-container";
    Panel.FOCUSABLE = ["a", "button", "select", "textarea", "input"];

    function createHeader(p_sType, p_aArgs) {
        if (!this.header && this.cfg.getProperty("draggable")) {
            this.setHeader("&#160;")
        }
    }
    function restoreOriginalWidth(p_sType, p_aArgs, p_oObject) {
        var sOriginalWidth = p_oObject[0],
            sNewWidth = p_oObject[1],
            oConfig = this.cfg,
            sCurrentWidth = oConfig.getProperty("width");
        if (sCurrentWidth == sNewWidth) {
            oConfig.setProperty("width", sOriginalWidth)
        }
        this.unsubscribe("hide", restoreOriginalWidth, p_oObject)
    }
    function setWidthToOffsetWidth(p_sType, p_aArgs) {
        var nIE = YAHOO.env.ua.ie,
            oConfig, sOriginalWidth, sNewWidth;
        if (nIE == 6 || (nIE == 7 && document.compatMode == "BackCompat")) {
            oConfig = this.cfg;
            sOriginalWidth = oConfig.getProperty("width");
            if (!sOriginalWidth || sOriginalWidth == "auto") {
                sNewWidth = (this.element.offsetWidth + "px");
                oConfig.setProperty("width", sNewWidth);
                this.subscribe("hide", restoreOriginalWidth, [(sOriginalWidth || ""), sNewWidth])
            }
        }
    }
    YAHOO.extend(Panel, Overlay, {
        init: function (el, userConfig) {
            Panel.superclass.init.call(this, el);
            this.beforeInitEvent.fire(Panel);
            Dom.addClass(this.element, Panel.CSS_PANEL);
            this.buildWrapper();
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            this.subscribe("showMask", this._addFocusHandlers);
            this.subscribe("hideMask", this._removeFocusHandlers);
            this.subscribe("beforeRender", createHeader);
            this.initEvent.fire(Panel)
        },
        _onElementFocus: function (e) {
            this.blur()
        },
        _addFocusHandlers: function (p_sType, p_aArgs) {
            var me = this,
                focus = "focus",
                hidden = "hidden";

            function isFocusable(el) {
                if (el.type !== hidden && !Dom.isAncestor(me.element, el)) {
                    Event.on(el, focus, me._onElementFocus);
                    return true
                }
                return false
            }
            var focusable = Panel.FOCUSABLE,
                l = focusable.length,
                arr = [];
            for (var i = 0; i < l; i++) {
                arr = arr.concat(Dom.getElementsBy(isFocusable, focusable[i]))
            }
            this.focusableElements = arr
        },
        _removeFocusHandlers: function (p_sType, p_aArgs) {
            var aElements = this.focusableElements,
                nElements = aElements.length,
                focus = "focus";
            if (aElements) {
                for (var i = 0; i < nElements; i++) {
                    Event.removeListener(aElements[i], focus, this._onElementFocus)
                }
            }
        },
        initEvents: function () {
            Panel.superclass.initEvents.call(this);
            var SIGNATURE = CustomEvent.LIST;
            this.showMaskEvent = this.createEvent(EVENT_TYPES.SHOW_MASK);
            this.showMaskEvent.signature = SIGNATURE;
            this.hideMaskEvent = this.createEvent(EVENT_TYPES.HIDE_MASK);
            this.hideMaskEvent.signature = SIGNATURE;
            this.dragEvent = this.createEvent(EVENT_TYPES.DRAG);
            this.dragEvent.signature = SIGNATURE
        },
        initDefaultConfig: function () {
            Panel.superclass.initDefaultConfig.call(this);
            this.cfg.addProperty(DEFAULT_CONFIG.CLOSE.key, {
                handler: this.configClose,
                value: DEFAULT_CONFIG.CLOSE.value,
                validator: DEFAULT_CONFIG.CLOSE.validator,
                supercedes: DEFAULT_CONFIG.CLOSE.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.DRAGGABLE.key, {
                handler: this.configDraggable,
                value: DEFAULT_CONFIG.DRAGGABLE.value,
                validator: DEFAULT_CONFIG.DRAGGABLE.validator,
                supercedes: DEFAULT_CONFIG.DRAGGABLE.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.DRAG_ONLY.key, {
                value: DEFAULT_CONFIG.DRAG_ONLY.value,
                validator: DEFAULT_CONFIG.DRAG_ONLY.validator,
                supercedes: DEFAULT_CONFIG.DRAG_ONLY.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.UNDERLAY.key, {
                handler: this.configUnderlay,
                value: DEFAULT_CONFIG.UNDERLAY.value,
                supercedes: DEFAULT_CONFIG.UNDERLAY.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.MODAL.key, {
                handler: this.configModal,
                value: DEFAULT_CONFIG.MODAL.value,
                validator: DEFAULT_CONFIG.MODAL.validator,
                supercedes: DEFAULT_CONFIG.MODAL.supercedes
            });
            this.cfg.addProperty(DEFAULT_CONFIG.KEY_LISTENERS.key, {
                handler: this.configKeyListeners,
                suppressEvent: DEFAULT_CONFIG.KEY_LISTENERS.suppressEvent,
                supercedes: DEFAULT_CONFIG.KEY_LISTENERS.supercedes
            })
        },
        configClose: function (type, args, obj) {
            var val = args[0],
                oClose = this.close;

            function doHide(e, obj) {
                obj.hide()
            }
            if (val) {
                if (!oClose) {
                    if (!m_oCloseIconTemplate) {
                        m_oCloseIconTemplate = document.createElement("span");
                        m_oCloseIconTemplate.innerHTML = "&#160;";
                        m_oCloseIconTemplate.className = "container-close"
                    }
                    oClose = m_oCloseIconTemplate.cloneNode(true);
                    this.innerElement.appendChild(oClose);
                    Event.on(oClose, "click", doHide, this);
                    this.close = oClose
                } else {
                    oClose.style.display = "block"
                }
            } else {
                if (oClose) {
                    oClose.style.display = "none"
                }
            }
        },
        configDraggable: function (type, args, obj) {
            var val = args[0];
            if (val) {
                if (!DD) {
                    this.cfg.setProperty("draggable", false);
                    return
                }
                if (this.header) {
                    Dom.setStyle(this.header, "cursor", "move");
                    this.registerDragDrop()
                }
                this.subscribe("beforeShow", setWidthToOffsetWidth)
            } else {
                if (this.dd) {
                    this.dd.unreg()
                }
                if (this.header) {
                    Dom.setStyle(this.header, "cursor", "auto")
                }
                this.unsubscribe("beforeShow", setWidthToOffsetWidth)
            }
        },
        configUnderlay: function (type, args, obj) {
            var UA = YAHOO.env.ua,
                bMacGecko = (this.platform == "mac" && UA.gecko),
                bIEQuirks = (UA.ie == 6 || (UA.ie == 7 && document.compatMode == "BackCompat")),
                sUnderlay = args[0].toLowerCase(),
                oUnderlay = this.underlay,
                oElement = this.element;

            function fixWebkitUnderlay() {
                var u = this.underlay;
                Dom.addClass(u, "yui-force-redraw");
                window.setTimeout(function () {
                    Dom.removeClass(u, "yui-force-redraw")
                },
                0)
            }
            function createUnderlay() {
                var bNew = false;
                if (!oUnderlay) {
                    if (!m_oUnderlayTemplate) {
                        m_oUnderlayTemplate = document.createElement("div");
                        m_oUnderlayTemplate.className = "underlay"
                    }
                    oUnderlay = m_oUnderlayTemplate.cloneNode(false);
                    this.element.appendChild(oUnderlay);
                    this.underlay = oUnderlay;
                    if (bIEQuirks) {
                        this.sizeUnderlay();
                        this.cfg.subscribeToConfigEvent("width", this.sizeUnderlay);
                        this.cfg.subscribeToConfigEvent("height", this.sizeUnderlay);
                        this.changeContentEvent.subscribe(this.sizeUnderlay);
                        YAHOO.widget.Module.textResizeEvent.subscribe(this.sizeUnderlay, this, true)
                    }
                    if (UA.webkit && UA.webkit < 420) {
                        this.changeContentEvent.subscribe(fixWebkitUnderlay)
                    }
                    bNew = true
                }
            }
            function onBeforeShow() {
                var bNew = createUnderlay.call(this);
                if (!bNew && bIEQuirks) {
                    this.sizeUnderlay()
                }
                this._underlayDeferred = false;
                this.beforeShowEvent.unsubscribe(onBeforeShow)
            }
            function destroyUnderlay() {
                if (this._underlayDeferred) {
                    this.beforeShowEvent.unsubscribe(onBeforeShow);
                    this._underlayDeferred = false
                }
                if (oUnderlay) {
                    this.cfg.unsubscribeFromConfigEvent("width", this.sizeUnderlay);
                    this.cfg.unsubscribeFromConfigEvent("height", this.sizeUnderlay);
                    this.changeContentEvent.unsubscribe(this.sizeUnderlay);
                    this.changeContentEvent.unsubscribe(fixWebkitUnderlay);
                    YAHOO.widget.Module.textResizeEvent.unsubscribe(this.sizeUnderlay, this, true);
                    this.element.removeChild(oUnderlay);
                    this.underlay = null
                }
            }
            switch (sUnderlay) {
            case "shadow":
                Dom.removeClass(oElement, "matte");
                Dom.addClass(oElement, "shadow");
                break;
            case "matte":
                if (!bMacGecko) {
                    destroyUnderlay.call(this)
                }
                Dom.removeClass(oElement, "shadow");
                Dom.addClass(oElement, "matte");
                break;
            default:
                if (!bMacGecko) {
                    destroyUnderlay.call(this)
                }
                Dom.removeClass(oElement, "shadow");
                Dom.removeClass(oElement, "matte");
                break
            }
            if ((sUnderlay == "shadow") || (bMacGecko && !oUnderlay)) {
                if (this.cfg.getProperty("visible")) {
                    var bNew = createUnderlay.call(this);
                    if (!bNew && bIEQuirks) {
                        this.sizeUnderlay()
                    }
                } else {
                    if (!this._underlayDeferred) {
                        this.beforeShowEvent.subscribe(onBeforeShow);
                        this._underlayDeferred = true
                    }
                }
            }
        },
        configModal: function (type, args, obj) {
            var modal = args[0];
            if (modal) {
                if (!this._hasModalityEventListeners) {
                    this.subscribe("beforeShow", this.buildMask);
                    this.subscribe("beforeShow", this.bringToTop);
                    this.subscribe("beforeShow", this.showMask);
                    this.subscribe("hide", this.hideMask);
                    Overlay.windowResizeEvent.subscribe(this.sizeMask, this, true);
                    this._hasModalityEventListeners = true
                }
            } else {
                if (this._hasModalityEventListeners) {
                    if (this.cfg.getProperty("visible")) {
                        this.hideMask();
                        this.removeMask()
                    }
                    this.unsubscribe("beforeShow", this.buildMask);
                    this.unsubscribe("beforeShow", this.bringToTop);
                    this.unsubscribe("beforeShow", this.showMask);
                    this.unsubscribe("hide", this.hideMask);
                    Overlay.windowResizeEvent.unsubscribe(this.sizeMask, this);
                    this._hasModalityEventListeners = false
                }
            }
        },
        removeMask: function () {
            var oMask = this.mask,
                oParentNode;
            if (oMask) {
                this.hideMask();
                oParentNode = oMask.parentNode;
                if (oParentNode) {
                    oParentNode.removeChild(oMask)
                }
                this.mask = null
            }
        },
        configKeyListeners: function (type, args, obj) {
            var listeners = args[0],
                listener, nListeners, i;
            if (listeners) {
                if (listeners instanceof Array) {
                    nListeners = listeners.length;
                    for (i = 0; i < nListeners; i++) {
                        listener = listeners[i];
                        if (!Config.alreadySubscribed(this.showEvent, listener.enable, listener)) {
                            this.showEvent.subscribe(listener.enable, listener, true)
                        }
                        if (!Config.alreadySubscribed(this.hideEvent, listener.disable, listener)) {
                            this.hideEvent.subscribe(listener.disable, listener, true);
                            this.destroyEvent.subscribe(listener.disable, listener, true)
                        }
                    }
                } else {
                    if (!Config.alreadySubscribed(this.showEvent, listeners.enable, listeners)) {
                        this.showEvent.subscribe(listeners.enable, listeners, true)
                    }
                    if (!Config.alreadySubscribed(this.hideEvent, listeners.disable, listeners)) {
                        this.hideEvent.subscribe(listeners.disable, listeners, true);
                        this.destroyEvent.subscribe(listeners.disable, listeners, true)
                    }
                }
            }
        },
        configHeight: function (type, args, obj) {
            var height = args[0],
                el = this.innerElement;
            Dom.setStyle(el, "height", height);
            this.cfg.refireEvent("iframe")
        },
        configWidth: function (type, args, obj) {
            var width = args[0],
                el = this.innerElement;
            Dom.setStyle(el, "width", width);
            this.cfg.refireEvent("iframe")
        },
        configzIndex: function (type, args, obj) {
            Panel.superclass.configzIndex.call(this, type, args, obj);
            if (this.mask || this.cfg.getProperty("modal") === true) {
                var panelZ = Dom.getStyle(this.element, "zIndex");
                if (!panelZ || isNaN(panelZ)) {
                    panelZ = 0
                }
                if (panelZ === 0) {
                    this.cfg.setProperty("zIndex", 1)
                } else {
                    this.stackMask()
                }
            }
        },
        buildWrapper: function () {
            var elementParent = this.element.parentNode,
                originalElement = this.element,
                wrapper = document.createElement("div");
            wrapper.className = Panel.CSS_PANEL_CONTAINER;
            wrapper.id = originalElement.id + "_c";
            if (elementParent) {
                elementParent.insertBefore(wrapper, originalElement)
            }
            wrapper.appendChild(originalElement);
            this.element = wrapper;
            this.innerElement = originalElement;
            Dom.setStyle(this.innerElement, "visibility", "inherit")
        },
        sizeUnderlay: function () {
            var oUnderlay = this.underlay,
                oElement;
            if (oUnderlay) {
                oElement = this.element;
                oUnderlay.style.width = oElement.offsetWidth + "px";
                oUnderlay.style.height = oElement.offsetHeight + "px"
            }
        },
        registerDragDrop: function () {
            var me = this;
            if (this.header) {
                if (!DD) {
                    return
                }
                var bDragOnly = (this.cfg.getProperty("dragonly") === true);
                this.dd = new DD(this.element.id, this.id, {
                    dragOnly: bDragOnly
                });
                if (!this.header.id) {
                    this.header.id = this.id + "_h"
                }
                this.dd.startDrag = function () {
                    var offsetHeight, offsetWidth, viewPortWidth, viewPortHeight, scrollX, scrollY;
                    if (YAHOO.env.ua.ie == 6) {
                        Dom.addClass(me.element, "drag")
                    }
                    if (me.cfg.getProperty("constraintoviewport")) {
                        var nViewportOffset = Overlay.VIEWPORT_OFFSET;
                        offsetHeight = me.element.offsetHeight;
                        offsetWidth = me.element.offsetWidth;
                        viewPortWidth = Dom.getViewportWidth();
                        viewPortHeight = Dom.getViewportHeight();
                        scrollX = Dom.getDocumentScrollLeft();
                        scrollY = Dom.getDocumentScrollTop();
                        if (offsetHeight + nViewportOffset < viewPortHeight) {
                            this.minY = scrollY + nViewportOffset;
                            this.maxY = scrollY + viewPortHeight - offsetHeight - nViewportOffset
                        } else {
                            this.minY = scrollY + nViewportOffset;
                            this.maxY = scrollY + nViewportOffset
                        }
                        if (offsetWidth + nViewportOffset < viewPortWidth) {
                            this.minX = scrollX + nViewportOffset;
                            this.maxX = scrollX + viewPortWidth - offsetWidth - nViewportOffset
                        } else {
                            this.minX = scrollX + nViewportOffset;
                            this.maxX = scrollX + nViewportOffset
                        }
                        this.constrainX = true;
                        this.constrainY = true
                    } else {
                        this.constrainX = false;
                        this.constrainY = false
                    }
                    me.dragEvent.fire("startDrag", arguments)
                };
                this.dd.onDrag = function () {
                    me.syncPosition();
                    me.cfg.refireEvent("iframe");
                    if (this.platform == "mac" && YAHOO.env.ua.gecko) {
                        this.showMacGeckoScrollbars()
                    }
                    me.dragEvent.fire("onDrag", arguments)
                };
                this.dd.endDrag = function () {
                    if (YAHOO.env.ua.ie == 6) {
                        Dom.removeClass(me.element, "drag")
                    }
                    me.dragEvent.fire("endDrag", arguments);
                    me.moveEvent.fire(me.cfg.getProperty("xy"))
                };
                this.dd.setHandleElId(this.header.id);
                this.dd.addInvalidHandleType("INPUT");
                this.dd.addInvalidHandleType("SELECT");
                this.dd.addInvalidHandleType("TEXTAREA")
            }
        },
        buildMask: function () {
            var oMask = this.mask;
            if (!oMask) {
                if (!m_oMaskTemplate) {
                    m_oMaskTemplate = document.createElement("div");
                    m_oMaskTemplate.className = "mask";
                    m_oMaskTemplate.innerHTML = "&#160;"
                }
                oMask = m_oMaskTemplate.cloneNode(true);
                oMask.id = this.id + "_mask";
                document.body.insertBefore(oMask, document.body.firstChild);
                this.mask = oMask;
                if (YAHOO.env.ua.gecko && this.platform == "mac") {
                    Dom.addClass(this.mask, "block-scrollbars")
                }
                this.stackMask()
            }
        },
        hideMask: function () {
            if (this.cfg.getProperty("modal") && this.mask) {
                this.mask.style.display = "none";
                this.hideMaskEvent.fire();
                Dom.removeClass(document.body, "masked")
            }
        },
        showMask: function () {
            if (this.cfg.getProperty("modal") && this.mask) {
                Dom.addClass(document.body, "masked");
                this.sizeMask();
                this.mask.style.display = "block";
                this.showMaskEvent.fire()
            }
        },
        sizeMask: function () {
            if (this.mask) {
                this.mask.style.height = Dom.getDocumentHeight() + "px";
                this.mask.style.width = Dom.getDocumentWidth() + "px"
            }
        },
        stackMask: function () {
            if (this.mask) {
                var panelZ = Dom.getStyle(this.element, "zIndex");
                if (!YAHOO.lang.isUndefined(panelZ) && !isNaN(panelZ)) {
                    Dom.setStyle(this.mask, "zIndex", panelZ - 1)
                }
            }
        },
        render: function (appendToNode) {
            return Panel.superclass.render.call(this, appendToNode, this.innerElement)
        },
        destroy: function () {
            Overlay.windowResizeEvent.unsubscribe(this.sizeMask, this);
            this.removeMask();
            if (this.close) {
                Event.purgeElement(this.close)
            }
            Panel.superclass.destroy.call(this)
        },
        toString: function () {
            return "Panel " + this.id
        }
    })
}());
(function () {
    YAHOO.widget.Dialog = function (el, userConfig) {
        YAHOO.widget.Dialog.superclass.constructor.call(this, el, userConfig)
    };
    var Event = YAHOO.util.Event,
        CustomEvent = YAHOO.util.CustomEvent,
        Dom = YAHOO.util.Dom,
        KeyListener = YAHOO.util.KeyListener,
        Connect = YAHOO.util.Connect,
        Dialog = YAHOO.widget.Dialog,
        Lang = YAHOO.lang,
        EVENT_TYPES = {
        BEFORE_SUBMIT: "beforeSubmit",
        SUBMIT: "submit",
        MANUAL_SUBMIT: "manualSubmit",
        ASYNC_SUBMIT: "asyncSubmit",
        FORM_SUBMIT: "formSubmit",
        CANCEL: "cancel"
    },
        DEFAULT_CONFIG = {
        POST_METHOD: {
            key: "postmethod",
            value: "async"
        },
        BUTTONS: {
            key: "buttons",
            value: "none"
        },
        HIDEAFTERSUBMIT: {
            key: "hideaftersubmit",
            value: true
        }
    };
    Dialog.CSS_DIALOG = "yui-dialog";

    function removeButtonEventHandlers() {
        var aButtons = this._aButtons,
            nButtons, oButton, i;
        if (Lang.isArray(aButtons)) {
            nButtons = aButtons.length;
            if (nButtons > 0) {
                i = nButtons - 1;
                do {
                    oButton = aButtons[i];
                    if (YAHOO.widget.Button && oButton instanceof YAHOO.widget.Button) {
                        oButton.destroy()
                    } else {
                        if (oButton.tagName.toUpperCase() == "BUTTON") {
                            Event.purgeElement(oButton);
                            Event.purgeElement(oButton, false)
                        }
                    }
                } while (i--)
            }
        }
    }
    YAHOO.extend(Dialog, YAHOO.widget.Panel, {
        form: null,
        initDefaultConfig: function () {
            Dialog.superclass.initDefaultConfig.call(this);
            this.callback = {
                success: null,
                failure: null,
                argument: null
            };
            this.cfg.addProperty(DEFAULT_CONFIG.POST_METHOD.key, {
                handler: this.configPostMethod,
                value: DEFAULT_CONFIG.POST_METHOD.value,
                validator: function (val) {
                    if (val != "form" && val != "async" && val != "none" && val != "manual") {
                        return false
                    } else {
                        return true
                    }
                }
            });
            this.cfg.addProperty(DEFAULT_CONFIG.HIDEAFTERSUBMIT.key, {
                value: DEFAULT_CONFIG.HIDEAFTERSUBMIT.value
            });
            this.cfg.addProperty(DEFAULT_CONFIG.BUTTONS.key, {
                handler: this.configButtons,
                value: DEFAULT_CONFIG.BUTTONS.value
            })
        },
        initEvents: function () {
            Dialog.superclass.initEvents.call(this);
            var SIGNATURE = CustomEvent.LIST;
            this.beforeSubmitEvent = this.createEvent(EVENT_TYPES.BEFORE_SUBMIT);
            this.beforeSubmitEvent.signature = SIGNATURE;
            this.submitEvent = this.createEvent(EVENT_TYPES.SUBMIT);
            this.submitEvent.signature = SIGNATURE;
            this.manualSubmitEvent = this.createEvent(EVENT_TYPES.MANUAL_SUBMIT);
            this.manualSubmitEvent.signature = SIGNATURE;
            this.asyncSubmitEvent = this.createEvent(EVENT_TYPES.ASYNC_SUBMIT);
            this.asyncSubmitEvent.signature = SIGNATURE;
            this.formSubmitEvent = this.createEvent(EVENT_TYPES.FORM_SUBMIT);
            this.formSubmitEvent.signature = SIGNATURE;
            this.cancelEvent = this.createEvent(EVENT_TYPES.CANCEL);
            this.cancelEvent.signature = SIGNATURE
        },
        init: function (el, userConfig) {
            Dialog.superclass.init.call(this, el);
            this.beforeInitEvent.fire(Dialog);
            Dom.addClass(this.element, Dialog.CSS_DIALOG);
            this.cfg.setProperty("visible", false);
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            this.showEvent.subscribe(this.focusFirst, this, true);
            this.beforeHideEvent.subscribe(this.blurButtons, this, true);
            this.subscribe("changeBody", this.registerForm);
            this.initEvent.fire(Dialog)
        },
        doSubmit: function () {
            var oForm = this.form,
                bUseFileUpload = false,
                bUseSecureFileUpload = false,
                aElements, nElements, i, sMethod;
            switch (this.cfg.getProperty("postmethod")) {
            case "async":
                aElements = oForm.elements;
                nElements = aElements.length;
                if (nElements > 0) {
                    i = nElements - 1;
                    do {
                        if (aElements[i].type == "file") {
                            bUseFileUpload = true;
                            break
                        }
                    } while (i--)
                }
                if (bUseFileUpload && YAHOO.env.ua.ie && this.isSecure) {
                    bUseSecureFileUpload = true
                }
                sMethod = (oForm.getAttribute("method") || "POST").toUpperCase();
                Connect.setForm(oForm, bUseFileUpload, bUseSecureFileUpload);
                Connect.asyncRequest(sMethod, oForm.getAttribute("action"), this.callback);
                this.asyncSubmitEvent.fire();
                break;
            case "form":
                oForm.submit();
                this.formSubmitEvent.fire();
                break;
            case "none":
            case "manual":
                this.manualSubmitEvent.fire();
                break
            }
        },
        registerForm: function () {
            var form = this.element.getElementsByTagName("form")[0],
                me = this,
                firstElement, lastElement;
            if (this.form) {
                if (this.form == form && Dom.isAncestor(this.element, this.form)) {
                    return
                } else {
                    Event.purgeElement(this.form);
                    this.form = null
                }
            }
            if (!form) {
                form = document.createElement("form");
                form.name = "frm_" + this.id;
                this.body.appendChild(form)
            }
            if (form) {
                this.form = form;
                Event.on(form, "submit", function (e) {
                    Event.stopEvent(e);
                    this.submit();
                    this.form.blur()
                },
                this, true);
                this.firstFormElement = function () {
                    var f, el, nElements = form.elements.length;
                    for (f = 0; f < nElements; f++) {
                        el = form.elements[f];
                        if (el.focus && !el.disabled && el.type != "hidden") {
                            return el
                        }
                    }
                    return null
                }();
                this.lastFormElement = function () {
                    var f, el, nElements = form.elements.length;
                    for (f = nElements - 1;
                    f >= 0; f--) {
                        el = form.elements[f];
                        if (el.focus && !el.disabled && el.type != "hidden") {
                            return el
                        }
                    }
                    return null
                }();
                if (this.cfg.getProperty("modal")) {
                    firstElement = this.firstFormElement || this.firstButton;
                    if (firstElement) {
                        this.preventBackTab = new KeyListener(firstElement, {
                            shift: true,
                            keys: 9
                        },
                        {
                            fn: me.focusLast,
                            scope: me,
                            correctScope: true
                        });
                        this.showEvent.subscribe(this.preventBackTab.enable, this.preventBackTab, true);
                        this.hideEvent.subscribe(this.preventBackTab.disable, this.preventBackTab, true)
                    }
                    lastElement = this.lastButton || this.lastFormElement;
                    if (lastElement) {
                        this.preventTabOut = new KeyListener(lastElement, {
                            shift: false,
                            keys: 9
                        },
                        {
                            fn: me.focusFirst,
                            scope: me,
                            correctScope: true
                        });
                        this.showEvent.subscribe(this.preventTabOut.enable, this.preventTabOut, true);
                        this.hideEvent.subscribe(this.preventTabOut.disable, this.preventTabOut, true)
                    }
                }
            }
        },
        configClose: function (type, args, obj) {
            var val = args[0];

            function doCancel(e, obj) {
                obj.cancel()
            }
            if (val) {
                if (!this.close) {
                    this.close = document.createElement("div");
                    Dom.addClass(this.close, "container-close");
                    this.close.innerHTML = "&#160;";
                    this.innerElement.appendChild(this.close);
                    Event.on(this.close, "click", doCancel, this)
                } else {
                    this.close.style.display = "block"
                }
            } else {
                if (this.close) {
                    this.close.style.display = "none"
                }
            }
        },
        configButtons: function (type, args, obj) {
            var Button = YAHOO.widget.Button,
                aButtons = args[0],
                oInnerElement = this.innerElement,
                oButton, oButtonEl, oYUIButton, nButtons, oSpan, oFooter, i;
            removeButtonEventHandlers.call(this);
            this._aButtons = null;
            if (Lang.isArray(aButtons)) {
                oSpan = document.createElement("span");
                oSpan.className = "button-group";
                nButtons = aButtons.length;
                this._aButtons = [];
                for (i = 0; i < nButtons; i++) {
                    oButton = aButtons[i];
                    if (Button) {
                        oYUIButton = new Button({
                            label: oButton.text,
                            container: oSpan
                        });
                        oButtonEl = oYUIButton.get("element");
                        if (oButton.isDefault) {
                            oYUIButton.addClass("default");
                            this.defaultHtmlButton = oButtonEl
                        }
                        if (Lang.isFunction(oButton.handler)) {
                            oYUIButton.set("onclick", {
                                fn: oButton.handler,
                                obj: this,
                                scope: this
                            })
                        } else {
                            if (Lang.isObject(oButton.handler) && Lang.isFunction(oButton.handler.fn)) {
                                oYUIButton.set("onclick", {
                                    fn: oButton.handler.fn,
                                    obj: ((!Lang.isUndefined(oButton.handler.obj)) ? oButton.handler.obj : this),
                                    scope: (oButton.handler.scope || this)
                                })
                            }
                        }
                        this._aButtons[this._aButtons.length] = oYUIButton
                    } else {
                        oButtonEl = document.createElement("button");
                        oButtonEl.setAttribute("type", "button");
                        if (oButton.isDefault) {
                            oButtonEl.className = "default";
                            this.defaultHtmlButton = oButtonEl
                        }
                        oButtonEl.innerHTML = oButton.text;
                        if (Lang.isFunction(oButton.handler)) {
                            Event.on(oButtonEl, "click", oButton.handler, this, true)
                        } else {
                            if (Lang.isObject(oButton.handler) && Lang.isFunction(oButton.handler.fn)) {
                                Event.on(oButtonEl, "click", oButton.handler.fn, ((!Lang.isUndefined(oButton.handler.obj)) ? oButton.handler.obj : this), (oButton.handler.scope || this))
                            }
                        }
                        oSpan.appendChild(oButtonEl);
                        this._aButtons[this._aButtons.length] = oButtonEl
                    }
                    oButton.htmlButton = oButtonEl;
                    if (i === 0) {
                        this.firstButton = oButtonEl
                    }
                    if (i == (nButtons - 1)) {
                        this.lastButton = oButtonEl
                    }
                }
                this.setFooter(oSpan);
                oFooter = this.footer;
                if (Dom.inDocument(this.element) && !Dom.isAncestor(oInnerElement, oFooter)) {
                    oInnerElement.appendChild(oFooter)
                }
                this.buttonSpan = oSpan
            } else {
                oSpan = this.buttonSpan;
                oFooter = this.footer;
                if (oSpan && oFooter) {
                    oFooter.removeChild(oSpan);
                    this.buttonSpan = null;
                    this.firstButton = null;
                    this.lastButton = null;
                    this.defaultHtmlButton = null
                }
            }
            this.cfg.refireEvent("iframe");
            this.cfg.refireEvent("underlay")
        },
        getButtons: function () {
            var aButtons = this._aButtons;
            if (aButtons) {
                return aButtons
            }
        },
        focusFirst: function (type, args, obj) {
            var oElement = this.firstFormElement,
                oEvent;
            if (args) {
                oEvent = args[1];
                if (oEvent) {
                    Event.stopEvent(oEvent)
                }
            }
            if (oElement) {
                try {
                    oElement.focus()
                } catch(oException) {}
            } else {
                this.focusDefaultButton()
            }
        },
        focusLast: function (type, args, obj) {
            var aButtons = this.cfg.getProperty("buttons"),
                oElement = this.lastFormElement,
                oEvent;
            if (args) {
                oEvent = args[1];
                if (oEvent) {
                    Event.stopEvent(oEvent)
                }
            }
            if (aButtons && Lang.isArray(aButtons)) {
                this.focusLastButton()
            } else {
                if (oElement) {
                    try {
                        oElement.focus()
                    } catch(oException) {}
                }
            }
        },
        focusDefaultButton: function () {
            var oElement = this.defaultHtmlButton;
            if (oElement) {
                try {
                    oElement.focus()
                } catch(oException) {}
            }
        },
        blurButtons: function () {
            var aButtons = this.cfg.getProperty("buttons"),
                nButtons, oButton, oElement, i;
            if (aButtons && Lang.isArray(aButtons)) {
                nButtons = aButtons.length;
                if (nButtons > 0) {
                    i = (nButtons - 1);
                    do {
                        oButton = aButtons[i];
                        if (oButton) {
                            oElement = oButton.htmlButton;
                            if (oElement) {
                                try {
                                    oElement.blur()
                                } catch(oException) {}
                            }
                        }
                    } while (i--)
                }
            }
        },
        focusFirstButton: function () {
            var aButtons = this.cfg.getProperty("buttons"),
                oButton, oElement;
            if (aButtons && Lang.isArray(aButtons)) {
                oButton = aButtons[0];
                if (oButton) {
                    oElement = oButton.htmlButton;
                    if (oElement) {
                        try {
                            oElement.focus()
                        } catch(oException) {}
                    }
                }
            }
        },
        focusLastButton: function () {
            var aButtons = this.cfg.getProperty("buttons"),
                nButtons, oButton, oElement;
            if (aButtons && Lang.isArray(aButtons)) {
                nButtons = aButtons.length;
                if (nButtons > 0) {
                    oButton = aButtons[(nButtons - 1)];
                    if (oButton) {
                        oElement = oButton.htmlButton;
                        if (oElement) {
                            try {
                                oElement.focus()
                            } catch(oException) {}
                        }
                    }
                }
            }
        },
        configPostMethod: function (type, args, obj) {
            this.registerForm()
        },
        validate: function () {
            return true
        },
        submit: function () {
            if (this.validate()) {
                this.beforeSubmitEvent.fire();
                this.doSubmit();
                this.submitEvent.fire();
                if (this.cfg.getProperty("hideaftersubmit")) {
                    this.hide()
                }
                return true
            } else {
                return false
            }
        },
        cancel: function () {
            this.cancelEvent.fire();
            this.hide()
        },
        getData: function () {
            var oForm = this.form,
                aElements, nTotalElements, oData, sName, oElement, nElements, sType, sTagName, aOptions, nOptions, aValues, oOption, sValue, oRadio, oCheckbox, i, n;

            function isFormElement(p_oElement) {
                var sTag = p_oElement.tagName.toUpperCase();
                return ((sTag == "INPUT" || sTag == "TEXTAREA" || sTag == "SELECT") && p_oElement.name == sName)
            }
            if (oForm) {
                aElements = oForm.elements;
                nTotalElements = aElements.length;
                oData = {};
                for (i = 0; i < nTotalElements; i++) {
                    sName = aElements[i].name;
                    oElement = Dom.getElementsBy(isFormElement, "*", oForm);
                    nElements = oElement.length;
                    if (nElements > 0) {
                        if (nElements == 1) {
                            oElement = oElement[0];
                            sType = oElement.type;
                            sTagName = oElement.tagName.toUpperCase();
                            switch (sTagName) {
                            case "INPUT":
                                if (sType == "checkbox") {
                                    oData[sName] = oElement.checked
                                } else {
                                    if (sType != "radio") {
                                        oData[sName] = oElement.value
                                    }
                                }
                                break;
                            case "TEXTAREA":
                                oData[sName] = oElement.value;
                                break;
                            case "SELECT":
                                aOptions = oElement.options;
                                nOptions = aOptions.length;
                                aValues = [];
                                for (n = 0; n < nOptions; n++) {
                                    oOption = aOptions[n];
                                    if (oOption.selected) {
                                        sValue = oOption.value;
                                        if (!sValue || sValue === "") {
                                            sValue = oOption.text
                                        }
                                        aValues[aValues.length] = sValue
                                    }
                                }
                                oData[sName] = aValues;
                                break
                            }
                        } else {
                            sType = oElement[0].type;
                            switch (sType) {
                            case "radio":
                                for (n = 0; n < nElements; n++) {
                                    oRadio = oElement[n];
                                    if (oRadio.checked) {
                                        oData[sName] = oRadio.value;
                                        break
                                    }
                                }
                                break;
                            case "checkbox":
                                aValues = [];
                                for (n = 0; n < nElements; n++) {
                                    oCheckbox = oElement[n];
                                    if (oCheckbox.checked) {
                                        aValues[aValues.length] = oCheckbox.value
                                    }
                                }
                                oData[sName] = aValues;
                                break
                            }
                        }
                    }
                }
            }
            return oData
        },
        destroy: function () {
            removeButtonEventHandlers.call(this);
            this._aButtons = null;
            var aForms = this.element.getElementsByTagName("form"),
                oForm;
            if (aForms.length > 0) {
                oForm = aForms[0];
                if (oForm) {
                    Event.purgeElement(oForm);
                    if (oForm.parentNode) {
                        oForm.parentNode.removeChild(oForm)
                    }
                    this.form = null
                }
            }
            Dialog.superclass.destroy.call(this)
        },
        toString: function () {
            return "Dialog " + this.id
        }
    })
}());
(function () {
    YAHOO.widget.SimpleDialog = function (el, userConfig) {
        YAHOO.widget.SimpleDialog.superclass.constructor.call(this, el, userConfig)
    };
    var Dom = YAHOO.util.Dom,
        SimpleDialog = YAHOO.widget.SimpleDialog,
        DEFAULT_CONFIG = {
        ICON: {
            key: "icon",
            value: "none",
            suppressEvent: true
        },
        TEXT: {
            key: "text",
            value: "",
            suppressEvent: true,
            supercedes: ["icon"]
        }
    };
    SimpleDialog.ICON_BLOCK = "blckicon";
    SimpleDialog.ICON_ALARM = "alrticon";
    SimpleDialog.ICON_HELP = "hlpicon";
    SimpleDialog.ICON_INFO = "infoicon";
    SimpleDialog.ICON_WARN = "warnicon";
    SimpleDialog.ICON_TIP = "tipicon";
    SimpleDialog.ICON_CSS_CLASSNAME = "yui-icon";
    SimpleDialog.CSS_SIMPLEDIALOG = "yui-simple-dialog";
    YAHOO.extend(SimpleDialog, YAHOO.widget.Dialog, {
        initDefaultConfig: function () {
            SimpleDialog.superclass.initDefaultConfig.call(this);
            this.cfg.addProperty(DEFAULT_CONFIG.ICON.key, {
                handler: this.configIcon,
                value: DEFAULT_CONFIG.ICON.value,
                suppressEvent: DEFAULT_CONFIG.ICON.suppressEvent
            });
            this.cfg.addProperty(DEFAULT_CONFIG.TEXT.key, {
                handler: this.configText,
                value: DEFAULT_CONFIG.TEXT.value,
                suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent,
                supercedes: DEFAULT_CONFIG.TEXT.supercedes
            })
        },
        init: function (el, userConfig) {
            SimpleDialog.superclass.init.call(this, el);
            this.beforeInitEvent.fire(SimpleDialog);
            Dom.addClass(this.element, SimpleDialog.CSS_SIMPLEDIALOG);
            this.cfg.queueProperty("postmethod", "manual");
            if (userConfig) {
                this.cfg.applyConfig(userConfig, true)
            }
            this.beforeRenderEvent.subscribe(function () {
                if (!this.body) {
                    this.setBody("")
                }
            },
            this, true);
            this.initEvent.fire(SimpleDialog)
        },
        registerForm: function () {
            SimpleDialog.superclass.registerForm.call(this);
            this.form.innerHTML += '<input type="hidden" name="' + this.id + '" value=""/>'
        },
        configIcon: function (type, args, obj) {
            var sIcon = args[0],
                oBody = this.body,
                sCSSClass = SimpleDialog.ICON_CSS_CLASSNAME,
                oIcon, oIconParent;
            if (sIcon && sIcon != "none") {
                oIcon = Dom.getElementsByClassName(sCSSClass, "*", oBody);
                if (oIcon) {
                    oIconParent = oIcon.parentNode;
                    if (oIconParent) {
                        oIconParent.removeChild(oIcon);
                        oIcon = null
                    }
                }
                if (sIcon.indexOf(".") == -1) {
                    oIcon = document.createElement("span");
                    oIcon.className = (sCSSClass + " " + sIcon);
                    oIcon.innerHTML = "&#160;"
                } else {
                    oIcon = document.createElement("img");
                    oIcon.src = (this.imageRoot + sIcon);
                    oIcon.className = sCSSClass
                }
                if (oIcon) {
                    oBody.insertBefore(oIcon, oBody.firstChild)
                }
            }
        },
        configText: function (type, args, obj) {
            var text = args[0];
            if (text) {
                this.setBody(text);
                this.cfg.refireEvent("icon")
            }
        },
        toString: function () {
            return "SimpleDialog " + this.id
        }
    })
}());
(function () {
    YAHOO.widget.ContainerEffect = function (overlay, attrIn, attrOut, targetElement, animClass) {
        if (!animClass) {
            animClass = YAHOO.util.Anim
        }
        this.overlay = overlay;
        this.attrIn = attrIn;
        this.attrOut = attrOut;
        this.targetElement = targetElement || overlay.element;
        this.animClass = animClass
    };
    var Dom = YAHOO.util.Dom,
        CustomEvent = YAHOO.util.CustomEvent,
        Easing = YAHOO.util.Easing,
        ContainerEffect = YAHOO.widget.ContainerEffect;
    ContainerEffect.FADE = function (overlay, dur) {
        var fin = {
            attributes: {
                opacity: {
                    from: 0,
                    to: 1
                }
            },
            duration: dur,
            method: Easing.easeIn
        };
        var fout = {
            attributes: {
                opacity: {
                    to: 0
                }
            },
            duration: dur,
            method: Easing.easeOut
        };
        var fade = new ContainerEffect(overlay, fin, fout, overlay.element);
        fade.handleUnderlayStart = function () {
            var underlay = this.overlay.underlay;
            if (underlay && YAHOO.env.ua.ie) {
                var hasFilters = (underlay.filters && underlay.filters.length > 0);
                if (hasFilters) {
                    Dom.addClass(overlay.element, "yui-effect-fade")
                }
            }
        };
        fade.handleUnderlayComplete = function () {
            var underlay = this.overlay.underlay;
            if (underlay && YAHOO.env.ua.ie) {
                Dom.removeClass(overlay.element, "yui-effect-fade")
            }
        };
        fade.handleStartAnimateIn = function (type, args, obj) {
            Dom.addClass(obj.overlay.element, "hide-select");
            if (!obj.overlay.underlay) {
                obj.overlay.cfg.refireEvent("underlay")
            }
            obj.handleUnderlayStart();
            Dom.setStyle(obj.overlay.element, "visibility", "visible");
            Dom.setStyle(obj.overlay.element, "opacity", 0)
        };
        fade.handleCompleteAnimateIn = function (type, args, obj) {
            Dom.removeClass(obj.overlay.element, "hide-select");
            if (obj.overlay.element.style.filter) {
                obj.overlay.element.style.filter = null
            }
            obj.handleUnderlayComplete();
            obj.overlay.cfg.refireEvent("iframe");
            obj.animateInCompleteEvent.fire()
        };
        fade.handleStartAnimateOut = function (type, args, obj) {
            Dom.addClass(obj.overlay.element, "hide-select");
            obj.handleUnderlayStart()
        };
        fade.handleCompleteAnimateOut = function (type, args, obj) {
            Dom.removeClass(obj.overlay.element, "hide-select");
            if (obj.overlay.element.style.filter) {
                obj.overlay.element.style.filter = null
            }
            Dom.setStyle(obj.overlay.element, "visibility", "hidden");
            Dom.setStyle(obj.overlay.element, "opacity", 1);
            obj.handleUnderlayComplete();
            obj.overlay.cfg.refireEvent("iframe");
            obj.animateOutCompleteEvent.fire()
        };
        fade.init();
        return fade
    };
    ContainerEffect.SLIDE = function (overlay, dur) {
        var x = overlay.cfg.getProperty("x") || Dom.getX(overlay.element),
            y = overlay.cfg.getProperty("y") || Dom.getY(overlay.element),
            clientWidth = Dom.getClientWidth(),
            offsetWidth = overlay.element.offsetWidth,
            slide = new ContainerEffect(overlay, {
            attributes: {
                points: {
                    to: [x, y]
                }
            },
            duration: dur,
            method: Easing.easeIn
        },
        {
            attributes: {
                points: {
                    to: [(clientWidth + 25), y]
                }
            },
            duration: dur,
            method: Easing.easeOut
        },
        overlay.element, YAHOO.util.Motion);
        slide.handleStartAnimateIn = function (type, args, obj) {
            obj.overlay.element.style.left = ((-25) - offsetWidth) + "px";
            obj.overlay.element.style.top = y + "px"
        };
        slide.handleTweenAnimateIn = function (type, args, obj) {
            var pos = Dom.getXY(obj.overlay.element),
                currentX = pos[0],
                currentY = pos[1];
            if (Dom.getStyle(obj.overlay.element, "visibility") == "hidden" && currentX < x) {
                Dom.setStyle(obj.overlay.element, "visibility", "visible")
            }
            obj.overlay.cfg.setProperty("xy", [currentX, currentY], true);
            obj.overlay.cfg.refireEvent("iframe")
        };
        slide.handleCompleteAnimateIn = function (type, args, obj) {
            obj.overlay.cfg.setProperty("xy", [x, y], true);
            obj.startX = x;
            obj.startY = y;
            obj.overlay.cfg.refireEvent("iframe");
            obj.animateInCompleteEvent.fire()
        };
        slide.handleStartAnimateOut = function (type, args, obj) {
            var vw = Dom.getViewportWidth(),
                pos = Dom.getXY(obj.overlay.element),
                yso = pos[1];
            obj.animOut.attributes.points.to = [(vw + 25), yso]
        };
        slide.handleTweenAnimateOut = function (type, args, obj) {
            var pos = Dom.getXY(obj.overlay.element),
                xto = pos[0],
                yto = pos[1];
            obj.overlay.cfg.setProperty("xy", [xto, yto], true);
            obj.overlay.cfg.refireEvent("iframe")
        };
        slide.handleCompleteAnimateOut = function (type, args, obj) {
            Dom.setStyle(obj.overlay.element, "visibility", "hidden");
            obj.overlay.cfg.setProperty("xy", [x, y]);
            obj.animateOutCompleteEvent.fire()
        };
        slide.init();
        return slide
    };
    ContainerEffect.prototype = {
        init: function () {
            this.beforeAnimateInEvent = this.createEvent("beforeAnimateIn");
            this.beforeAnimateInEvent.signature = CustomEvent.LIST;
            this.beforeAnimateOutEvent = this.createEvent("beforeAnimateOut");
            this.beforeAnimateOutEvent.signature = CustomEvent.LIST;
            this.animateInCompleteEvent = this.createEvent("animateInComplete");
            this.animateInCompleteEvent.signature = CustomEvent.LIST;
            this.animateOutCompleteEvent = this.createEvent("animateOutComplete");
            this.animateOutCompleteEvent.signature = CustomEvent.LIST;
            this.animIn = new this.animClass(this.targetElement, this.attrIn.attributes, this.attrIn.duration, this.attrIn.method);
            this.animIn.onStart.subscribe(this.handleStartAnimateIn, this);
            this.animIn.onTween.subscribe(this.handleTweenAnimateIn, this);
            this.animIn.onComplete.subscribe(this.handleCompleteAnimateIn, this);
            this.animOut = new this.animClass(this.targetElement, this.attrOut.attributes, this.attrOut.duration, this.attrOut.method);
            this.animOut.onStart.subscribe(this.handleStartAnimateOut, this);
            this.animOut.onTween.subscribe(this.handleTweenAnimateOut, this);
            this.animOut.onComplete.subscribe(this.handleCompleteAnimateOut, this)
        },
        animateIn: function () {
            this.beforeAnimateInEvent.fire();
            this.animIn.animate()
        },
        animateOut: function () {
            this.beforeAnimateOutEvent.fire();
            this.animOut.animate()
        },
        handleStartAnimateIn: function (type, args, obj) {},
        handleTweenAnimateIn: function (type, args, obj) {},
        handleCompleteAnimateIn: function (type, args, obj) {},
        handleStartAnimateOut: function (type, args, obj) {},
        handleTweenAnimateOut: function (type, args, obj) {},
        handleCompleteAnimateOut: function (type, args, obj) {},
        toString: function () {
            var output = "ContainerEffect";
            if (this.overlay) {
                output += " [" + this.overlay.toString() + "]"
            }
            return output
        }
    };
    YAHOO.lang.augmentProto(ContainerEffect, YAHOO.util.EventProvider)
})();
YAHOO.register("container", YAHOO.widget.Module, {
    version: "2.5.2",
    build: "1076"
});

YAHOO.util.Connect = {
    _msxml_progid: ["Microsoft.XMLHTTP", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP"],
    _http_headers: {},
    _has_http_headers: false,
    _use_default_post_header: true,
    _default_post_header: "application/x-www-form-urlencoded; charset=UTF-8",
    _default_form_header: "application/x-www-form-urlencoded",
    _use_default_xhr_header: true,
    _default_xhr_header: "XMLHttpRequest",
    _has_default_headers: true,
    _default_headers: {},
    _isFormSubmit: false,
    _isFileUpload: false,
    _formNode: null,
    _sFormData: null,
    _poll: {},
    _timeOut: {},
    _polling_interval: 50,
    _transaction_id: 0,
    _submitElementValue: null,
    _hasSubmitListener: (function () {
        if (YAHOO.util.Event) {
            YAHOO.util.Event.addListener(document, "click", function (e) {
                var obj = YAHOO.util.Event.getTarget(e);
                if (obj.nodeName.toLowerCase() == "input" && (obj.type && obj.type.toLowerCase() == "submit")) {
                    YAHOO.util.Connect._submitElementValue = encodeURIComponent(obj.name) + "=" + encodeURIComponent(obj.value)
                }
            });
            return true
        }
        return false
    })(),
    startEvent: new YAHOO.util.CustomEvent("start"),
    completeEvent: new YAHOO.util.CustomEvent("complete"),
    successEvent: new YAHOO.util.CustomEvent("success"),
    failureEvent: new YAHOO.util.CustomEvent("failure"),
    uploadEvent: new YAHOO.util.CustomEvent("upload"),
    abortEvent: new YAHOO.util.CustomEvent("abort"),
    _customEvents: {
        onStart: ["startEvent", "start"],
        onComplete: ["completeEvent", "complete"],
        onSuccess: ["successEvent", "success"],
        onFailure: ["failureEvent", "failure"],
        onUpload: ["uploadEvent", "upload"],
        onAbort: ["abortEvent", "abort"]
    },
    setProgId: function (id) {
        this._msxml_progid.unshift(id)
    },
    setDefaultPostHeader: function (b) {
        if (typeof b == "string") {
            this._default_post_header = b
        } else {
            if (typeof b == "boolean") {
                this._use_default_post_header = b
            }
        }
    },
    setDefaultXhrHeader: function (b) {
        if (typeof b == "string") {
            this._default_xhr_header = b
        } else {
            this._use_default_xhr_header = b
        }
    },
    setPollingInterval: function (i) {
        if (typeof i == "number" && isFinite(i)) {
            this._polling_interval = i
        }
    },
    createXhrObject: function (transactionId) {
        var obj, http;
        try {
            http = new XMLHttpRequest();
            obj = {
                conn: http,
                tId: transactionId
            }
        } catch(e) {
            for (var i = 0; i < this._msxml_progid.length; ++i) {
                try {
                    http = new ActiveXObject(this._msxml_progid[i]);
                    obj = {
                        conn: http,
                        tId: transactionId
                    };
                    break
                } catch(e) {}
            }
        } finally {
            return obj
        }
    },
    getConnectionObject: function (isFileUpload) {
        var o;
        var tId = this._transaction_id;
        try {
            if (!isFileUpload) {
                o = this.createXhrObject(tId)
            } else {
                o = {};
                o.tId = tId;
                o.isUpload = true
            }
            if (o) {
                this._transaction_id++
            }
        } catch(e) {} finally {
            return o
        }
    },
    asyncRequest: function (method, uri, callback, postData) {
        var o = (this._isFileUpload) ? this.getConnectionObject(true) : this.getConnectionObject();
        var args = (callback && callback.argument) ? callback.argument : null;
        if (!o) {
            return null
        } else {
            if (callback && callback.customevents) {
                this.initCustomEvents(o, callback)
            }
            if (this._isFormSubmit) {
                if (this._isFileUpload) {
                    this.uploadFile(o, callback, uri, postData);
                    return o
                }
                if (method.toUpperCase() == "GET") {
                    if (this._sFormData.length !== 0) {
                        uri += ((uri.indexOf("?") == -1) ? "?" : "&") + this._sFormData
                    }
                } else {
                    if (method.toUpperCase() == "POST") {
                        postData = postData ? this._sFormData + "&" + postData : this._sFormData
                    }
                }
            }
            if (method.toUpperCase() == "GET" && (callback && callback.cache === false)) {
                uri += ((uri.indexOf("?") == -1) ? "?" : "&") + "rnd=" + new Date().valueOf().toString()
            }
            o.conn.open(method, uri, true);
            if (this._use_default_xhr_header) {
                if (!this._default_headers["X-Requested-With"]) {
                    this.initHeader("X-Requested-With", this._default_xhr_header, true)
                }
            }
            if ((method.toUpperCase() == "POST" && this._use_default_post_header) && this._isFormSubmit === false) {
                this.initHeader("Content-Type", this._default_post_header)
            }
            if (this._has_default_headers || this._has_http_headers) {
                this.setHeader(o)
            }
            this.handleReadyState(o, callback);
            o.conn.send(postData || "");
            if (this._isFormSubmit === true) {
                this.resetFormState()
            }
            this.startEvent.fire(o, args);
            if (o.startEvent) {
                o.startEvent.fire(o, args)
            }
            return o
        }
    },
    initCustomEvents: function (o, callback) {
        for (var prop in callback.customevents) {
            if (this._customEvents[prop][0]) {
                o[this._customEvents[prop][0]] = new YAHOO.util.CustomEvent(this._customEvents[prop][1], (callback.scope) ? callback.scope : null);
                o[this._customEvents[prop][0]].subscribe(callback.customevents[prop])
            }
        }
    },
    handleReadyState: function (o, callback) {
        var oConn = this;
        var args = (callback && callback.argument) ? callback.argument : null;
        if (callback && callback.timeout) {
            this._timeOut[o.tId] = window.setTimeout(function () {
                oConn.abort(o, callback, true)
            },
            callback.timeout)
        }
        this._poll[o.tId] = window.setInterval(function () {
            if (o.conn && o.conn.readyState === 4) {
                window.clearInterval(oConn._poll[o.tId]);
                delete oConn._poll[o.tId];
                if (callback && callback.timeout) {
                    window.clearTimeout(oConn._timeOut[o.tId]);
                    delete oConn._timeOut[o.tId]
                }
                oConn.completeEvent.fire(o, args);
                if (o.completeEvent) {
                    o.completeEvent.fire(o, args)
                }
                oConn.handleTransactionResponse(o, callback)
            }
        },
        this._polling_interval)
    },
    handleTransactionResponse: function (o, callback, isAbort) {
        var httpStatus, responseObject;
        var args = (callback && callback.argument) ? callback.argument : null;
        try {
            if (o.conn.status !== undefined && o.conn.status !== 0) {
                httpStatus = o.conn.status
            } else {
                httpStatus = 13030
            }
        } catch(e) {
            httpStatus = 13030
        }
        if (httpStatus >= 200 && httpStatus < 300 || httpStatus === 1223) {
            responseObject = this.createResponseObject(o, args);
            if (callback && callback.success) {
                if (!callback.scope) {
                    callback.success(responseObject)
                } else {
                    callback.success.apply(callback.scope, [responseObject])
                }
            }
            this.successEvent.fire(responseObject);
            if (o.successEvent) {
                o.successEvent.fire(responseObject)
            }
        } else {
            switch (httpStatus) {
            case 12002:
            case 12029:
            case 12030:
            case 12031:
            case 12152:
            case 13030:
                responseObject = this.createExceptionObject(o.tId, args, (isAbort ? isAbort : false));
                if (callback && callback.failure) {
                    if (!callback.scope) {
                        callback.failure(responseObject)
                    } else {
                        callback.failure.apply(callback.scope, [responseObject])
                    }
                }
                break;
            default:
                responseObject = this.createResponseObject(o, args);
                if (callback && callback.failure) {
                    if (!callback.scope) {
                        callback.failure(responseObject)
                    } else {
                        callback.failure.apply(callback.scope, [responseObject])
                    }
                }
            }
            this.failureEvent.fire(responseObject);
            if (o.failureEvent) {
                o.failureEvent.fire(responseObject)
            }
        }
        this.releaseObject(o);
        responseObject = null
    },
    createResponseObject: function (o, callbackArg) {
        var obj = {};
        var headerObj = {};
        try {
            var headerStr = o.conn.getAllResponseHeaders();
            var header = headerStr.split("\n");
            for (var i = 0; i < header.length; i++) {
                var delimitPos = header[i].indexOf(":");
                if (delimitPos != -1) {
                    headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2)
                }
            }
        } catch(e) {}
        obj.tId = o.tId;
        obj.status = (o.conn.status == 1223) ? 204 : o.conn.status;
        obj.statusText = (o.conn.status == 1223) ? "No Content" : o.conn.statusText;
        obj.getResponseHeader = headerObj;
        obj.getAllResponseHeaders = headerStr;
        obj.responseText = o.conn.responseText;
        obj.responseXML = o.conn.responseXML;
        if (callbackArg) {
            obj.argument = callbackArg
        }
        return obj
    },
    createExceptionObject: function (tId, callbackArg, isAbort) {
        var COMM_CODE = 0;
        var COMM_ERROR = "communication failure";
        var ABORT_CODE = -1;
        var ABORT_ERROR = "transaction aborted";
        var obj = {};
        obj.tId = tId;
        if (isAbort) {
            obj.status = ABORT_CODE;
            obj.statusText = ABORT_ERROR
        } else {
            obj.status = COMM_CODE;
            obj.statusText = COMM_ERROR
        }
        if (callbackArg) {
            obj.argument = callbackArg
        }
        return obj
    },
    initHeader: function (label, value, isDefault) {
        var headerObj = (isDefault) ? this._default_headers : this._http_headers;
        headerObj[label] = value;
        if (isDefault) {
            this._has_default_headers = true
        } else {
            this._has_http_headers = true
        }
    },
    setHeader: function (o) {
        if (this._has_default_headers) {
            for (var prop in this._default_headers) {
                if (YAHOO.lang.hasOwnProperty(this._default_headers, prop)) {
                    o.conn.setRequestHeader(prop, this._default_headers[prop])
                }
            }
        }
        if (this._has_http_headers) {
            for (var prop in this._http_headers) {
                if (YAHOO.lang.hasOwnProperty(this._http_headers, prop)) {
                    o.conn.setRequestHeader(prop, this._http_headers[prop])
                }
            }
            delete this._http_headers;
            this._http_headers = {};
            this._has_http_headers = false
        }
    },
    resetDefaultHeaders: function () {
        delete this._default_headers;
        this._default_headers = {};
        this._has_default_headers = false
    },
    setForm: function (formId, isUpload, secureUri) {
        this.resetFormState();
        var oForm;
        if (typeof formId == "string") {
            oForm = (document.getElementById(formId) || document.forms[formId])
        } else {
            if (typeof formId == "object") {
                oForm = formId
            } else {
                return
            }
        }
        if (isUpload) {
            var io = this.createFrame((window.location.href.toLowerCase().indexOf("https") === 0 || secureUri) ? true : false);
            this._isFormSubmit = true;
            this._isFileUpload = true;
            this._formNode = oForm;
            return
        }
        var oElement, oName, oValue, oDisabled;
        var hasSubmit = false;
        for (var i = 0; i < oForm.elements.length; i++) {
            oElement = oForm.elements[i];
            oDisabled = oElement.disabled;
            oName = oElement.name;
            oValue = oElement.value;
            if (!oDisabled && oName) {
                switch (oElement.type) {
                case "select-one":
                case "select-multiple":
                    for (var j = 0; j < oElement.options.length; j++) {
                        if (oElement.options[j].selected) {
                            if (window.ActiveXObject) {
                                this._sFormData += encodeURIComponent(oName) + "=" + encodeURIComponent(oElement.options[j].attributes.value.specified ? oElement.options[j].value : oElement.options[j].text) + "&"
                            } else {
                                this._sFormData += encodeURIComponent(oName) + "=" + encodeURIComponent(oElement.options[j].hasAttribute("value") ? oElement.options[j].value : oElement.options[j].text) + "&"
                            }
                        }
                    }
                    break;
                case "radio":
                case "checkbox":
                    if (oElement.checked) {
                        this._sFormData += encodeURIComponent(oName) + "=" + encodeURIComponent(oValue) + "&"
                    }
                    break;
                case "file":
                case undefined:
                case "reset":
                case "button":
                    break;
                case "submit":
                    if (hasSubmit === false) {
                        if (this._hasSubmitListener && this._submitElementValue) {
                            this._sFormData += this._submitElementValue + "&"
                        } else {
                            this._sFormData += encodeURIComponent(oName) + "=" + encodeURIComponent(oValue) + "&"
                        }
                        hasSubmit = true
                    }
                    break;
                default:
                    this._sFormData += encodeURIComponent(oName) + "=" + encodeURIComponent(oValue) + "&"
                }
            }
        }
        this._isFormSubmit = true;
        this._sFormData = this._sFormData.substr(0, this._sFormData.length - 1);
        this.initHeader("Content-Type", this._default_form_header);
        return this._sFormData
    },
    resetFormState: function () {
        this._isFormSubmit = false;
        this._isFileUpload = false;
        this._formNode = null;
        this._sFormData = ""
    },
    createFrame: function (secureUri) {
        var frameId = "yuiIO" + this._transaction_id;
        var io;
        if (window.ActiveXObject) {
            io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
            if (typeof secureUri == "boolean") {
                io.src = "javascript:false"
            }
        } else {
            io = document.createElement("iframe");
            io.id = frameId;
            io.name = frameId
        }
        io.style.position = "absolute";
        io.style.top = "-1000px";
        io.style.left = "-1000px";
        document.body.appendChild(io)
    },
    appendPostData: function (postData) {
        var formElements = [];
        var postMessage = postData.split("&");
        for (var i = 0; i < postMessage.length; i++) {
            var delimitPos = postMessage[i].indexOf("=");
            if (delimitPos != -1) {
                formElements[i] = document.createElement("input");
                formElements[i].type = "hidden";
                formElements[i].name = postMessage[i].substring(0, delimitPos);
                formElements[i].value = postMessage[i].substring(delimitPos + 1);
                this._formNode.appendChild(formElements[i])
            }
        }
        return formElements
    },
    uploadFile: function (o, callback, uri, postData) {
        var oConn = this;
        var frameId = "yuiIO" + o.tId;
        var uploadEncoding = "multipart/form-data";
        var io = document.getElementById(frameId);
        var args = (callback && callback.argument) ? callback.argument : null;
        var rawFormAttributes = {
            action: this._formNode.getAttribute("action"),
            method: this._formNode.getAttribute("method"),
            target: this._formNode.getAttribute("target")
        };
        this._formNode.setAttribute("action", uri);
        this._formNode.setAttribute("method", "POST");
        this._formNode.setAttribute("target", frameId);
        if (YAHOO.env.ua.ie) {
            this._formNode.setAttribute("encoding", uploadEncoding)
        } else {
            this._formNode.setAttribute("enctype", uploadEncoding)
        }
        if (postData) {
            var oElements = this.appendPostData(postData)
        }
        this._formNode.submit();
        this.startEvent.fire(o, args);
        if (o.startEvent) {
            o.startEvent.fire(o, args)
        }
        if (callback && callback.timeout) {
            this._timeOut[o.tId] = window.setTimeout(function () {
                oConn.abort(o, callback, true)
            },
            callback.timeout)
        }
        if (oElements && oElements.length > 0) {
            for (var i = 0; i < oElements.length; i++) {
                this._formNode.removeChild(oElements[i])
            }
        }
        for (var prop in rawFormAttributes) {
            if (YAHOO.lang.hasOwnProperty(rawFormAttributes, prop)) {
                if (rawFormAttributes[prop]) {
                    this._formNode.setAttribute(prop, rawFormAttributes[prop])
                } else {
                    this._formNode.removeAttribute(prop)
                }
            }
        }
        this.resetFormState();
        var uploadCallback = function () {
            if (callback && callback.timeout) {
                window.clearTimeout(oConn._timeOut[o.tId]);
                delete oConn._timeOut[o.tId]
            }
            oConn.completeEvent.fire(o, args);
            if (o.completeEvent) {
                o.completeEvent.fire(o, args)
            }
            var obj = {};
            obj.tId = o.tId;
            obj.argument = callback.argument;
            try {
                obj.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : io.contentWindow.document.documentElement.textContent;
                obj.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document
            } catch(e) {}
            if (callback && callback.upload) {
                if (!callback.scope) {
                    callback.upload(obj)
                } else {
                    callback.upload.apply(callback.scope, [obj])
                }
            }
            oConn.uploadEvent.fire(obj);
            if (o.uploadEvent) {
                o.uploadEvent.fire(obj)
            }
            YAHOO.util.Event.removeListener(io, "load", uploadCallback);
            setTimeout(function () {
                document.body.removeChild(io);
                oConn.releaseObject(o)
            },
            100)
        };
        YAHOO.util.Event.addListener(io, "load", uploadCallback)
    },
    abort: function (o, callback, isTimeout) {
        var abortStatus;
        var args = (callback && callback.argument) ? callback.argument : null;
        if (o && o.conn) {
            if (this.isCallInProgress(o)) {
                o.conn.abort();
                window.clearInterval(this._poll[o.tId]);
                delete this._poll[o.tId];
                if (isTimeout) {
                    window.clearTimeout(this._timeOut[o.tId]);
                    delete this._timeOut[o.tId]
                }
                abortStatus = true
            }
        } else {
            if (o && o.isUpload === true) {
                var frameId = "yuiIO" + o.tId;
                var io = document.getElementById(frameId);
                if (io) {
                    YAHOO.util.Event.removeListener(io, "load");
                    document.body.removeChild(io);
                    if (isTimeout) {
                        window.clearTimeout(this._timeOut[o.tId]);
                        delete this._timeOut[o.tId]
                    }
                    abortStatus = true
                }
            } else {
                abortStatus = false
            }
        }
        if (abortStatus === true) {
            this.abortEvent.fire(o, args);
            if (o.abortEvent) {
                o.abortEvent.fire(o, args)
            }
            this.handleTransactionResponse(o, callback, true)
        }
        return abortStatus
    },
    isCallInProgress: function (o) {
        if (o && o.conn) {
            return o.conn.readyState !== 4 && o.conn.readyState !== 0
        } else {
            if (o && o.isUpload === true) {
                var frameId = "yuiIO" + o.tId;
                return document.getElementById(frameId) ? true : false
            } else {
                return false
            }
        }
    },
    releaseObject: function (o) {
        if (o && o.conn) {
            o.conn = null;
            o = null
        }
    }
};
YAHOO.register("connection", YAHOO.util.Connect, {
    version: "2.5.2",
    build: "1076"
});

YAHOO.util.History = (function () {
    var _histFrame = null;
    var _stateField = null;
    var _initialized = false;
    var _modules = [];
    var _fqstates = [];

    function _getHash() {
        var i, href;
        href = top.location.href;
        i = href.indexOf("#");
        return i >= 0 ? href.substr(i + 1) : null
    }
    function _storeStates() {
        var moduleName, moduleObj, initialStates = [],
            currentStates = [];
        for (moduleName in _modules) {
            if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                moduleObj = _modules[moduleName];
                initialStates.push(moduleName + "=" + moduleObj.initialState);
                currentStates.push(moduleName + "=" + moduleObj.currentState)
            }
        }
        _stateField.value = initialStates.join("&") + "|" + currentStates.join("&");
        if (YAHOO.env.ua.webkit) {
            _stateField.value += "|" + _fqstates.join(",")
        }
    }
    function _handleFQStateChange(fqstate) {
        var i, len, moduleName, moduleObj, modules, states, tokens, currentState;
        if (!fqstate) {
            for (moduleName in _modules) {
                if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                    moduleObj = _modules[moduleName];
                    moduleObj.currentState = moduleObj.initialState;
                    moduleObj.onStateChange(unescape(moduleObj.currentState))
                }
            }
            return
        }
        modules = [];
        states = fqstate.split("&");
        for (i = 0, len = states.length; i < len; i++) {
            tokens = states[i].split("=");
            if (tokens.length === 2) {
                moduleName = tokens[0];
                currentState = tokens[1];
                modules[moduleName] = currentState
            }
        }
        for (moduleName in _modules) {
            if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                moduleObj = _modules[moduleName];
                currentState = modules[moduleName];
                if (!currentState || moduleObj.currentState !== currentState) {
                    moduleObj.currentState = currentState || moduleObj.initialState;
                    moduleObj.onStateChange(unescape(moduleObj.currentState))
                }
            }
        }
    }
    function _updateIFrame(fqstate) {
        var html, doc;
        html = '<html><body><div id="state">' + fqstate + "</div></body></html>";
        try {
            doc = _histFrame.contentWindow.document;
            doc.open();
            doc.write(html);
            doc.close();
            return true
        } catch(e) {
            return false
        }
    }
    function _checkIframeLoaded() {
        var doc, elem, fqstate, hash;
        if (!_histFrame.contentWindow || !_histFrame.contentWindow.document) {
            setTimeout(_checkIframeLoaded, 10);
            return
        }
        doc = _histFrame.contentWindow.document;
        elem = doc.getElementById("state");
        fqstate = elem ? elem.innerText : null;
        hash = _getHash();
        setInterval(function () {
            var newfqstate, states, moduleName, moduleObj, newHash, historyLength;
            doc = _histFrame.contentWindow.document;
            elem = doc.getElementById("state");
            newfqstate = elem ? elem.innerText : null;
            newHash = _getHash();
            if (newfqstate !== fqstate) {
                fqstate = newfqstate;
                _handleFQStateChange(fqstate);
                if (!fqstate) {
                    states = [];
                    for (moduleName in _modules) {
                        if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                            moduleObj = _modules[moduleName];
                            states.push(moduleName + "=" + moduleObj.initialState)
                        }
                    }
                    newHash = states.join("&")
                } else {
                    newHash = fqstate
                }
                top.location.hash = newHash;
                hash = newHash;
                _storeStates()
            } else {
                if (newHash !== hash) {
                    hash = newHash;
                    _updateIFrame(newHash)
                }
            }
        },
        50);
        _initialized = true;
        YAHOO.util.History.onLoadEvent.fire()
    }
    function _initialize() {
        var i, len, parts, tokens, moduleName, moduleObj, initialStates, initialState, currentStates, currentState, counter, hash;
        parts = _stateField.value.split("|");
        if (parts.length > 1) {
            initialStates = parts[0].split("&");
            for (i = 0, len = initialStates.length; i < len; i++) {
                tokens = initialStates[i].split("=");
                if (tokens.length === 2) {
                    moduleName = tokens[0];
                    initialState = tokens[1];
                    moduleObj = _modules[moduleName];
                    if (moduleObj) {
                        moduleObj.initialState = initialState
                    }
                }
            }
            currentStates = parts[1].split("&");
            for (i = 0, len = currentStates.length; i < len; i++) {
                tokens = currentStates[i].split("=");
                if (tokens.length >= 2) {
                    moduleName = tokens[0];
                    currentState = tokens[1];
                    moduleObj = _modules[moduleName];
                    if (moduleObj) {
                        moduleObj.currentState = currentState
                    }
                }
            }
        }
        if (parts.length > 2) {
            _fqstates = parts[2].split(",")
        }
        if (YAHOO.env.ua.ie) {
            _checkIframeLoaded()
        } else {
            counter = history.length;
            hash = _getHash();
            setInterval(function () {
                var state, newHash, newCounter;
                newHash = _getHash();
                newCounter = history.length;
                if (newHash !== hash) {
                    hash = newHash;
                    counter = newCounter;
                    _handleFQStateChange(hash);
                    _storeStates()
                } else {
                    if (newCounter !== counter && YAHOO.env.ua.webkit) {
                        hash = newHash;
                        counter = newCounter;
                        state = _fqstates[counter - 1];
                        _handleFQStateChange(state);
                        _storeStates()
                    }
                }
            },
            50);
            _initialized = true;
            YAHOO.util.History.onLoadEvent.fire()
        }
    }
    return {
        onLoadEvent: new YAHOO.util.CustomEvent("onLoad"),
        onReady: function (fn, obj, override) {
            if (_initialized) {
                setTimeout(function () {
                    var ctx = window;
                    if (override) {
                        if (override === true) {
                            ctx = obj
                        } else {
                            ctx = override
                        }
                    }
                    fn.call(ctx, "onLoad", [], obj)
                },
                0)
            } else {
                YAHOO.util.History.onLoadEvent.subscribe(fn, obj, override)
            }
        },
        register: function (module, initialState, onStateChange, obj, override) {
            var scope, wrappedFn;
            if (typeof module !== "string" || YAHOO.lang.trim(module) === "" || typeof initialState !== "string" || typeof onStateChange !== "function") {
                throw new Error("Missing or invalid argument")
            }
            if (_modules[module]) {
                return
            }
            if (_initialized) {
                throw new Error("All modules must be registered before calling YAHOO.util.History.initialize")
            }
            module = escape(module);
            initialState = escape(initialState);
            scope = null;
            if (override === true) {
                scope = obj
            } else {
                scope = override
            }
            wrappedFn = function (state) {
                return onStateChange.call(scope, state, obj)
            };
            _modules[module] = {
                name: module,
                initialState: initialState,
                currentState: initialState,
                onStateChange: wrappedFn
            }
        },
        initialize: function (stateField, histFrame) {
            if (_initialized) {
                return
            }
            if (YAHOO.env.ua.opera) {}
            if (typeof stateField === "string") {
                stateField = document.getElementById(stateField)
            }
            if (!stateField || stateField.tagName.toUpperCase() !== "TEXTAREA" && (stateField.tagName.toUpperCase() !== "INPUT" || stateField.type !== "hidden" && stateField.type !== "text")) {
                throw new Error("Missing or invalid argument")
            }
            _stateField = stateField;
            if (YAHOO.env.ua.ie) {
                if (typeof histFrame === "string") {
                    histFrame = document.getElementById(histFrame)
                }
                if (!histFrame || histFrame.tagName.toUpperCase() !== "IFRAME") {
                    throw new Error("Missing or invalid argument")
                }
                _histFrame = histFrame
            }
            YAHOO.util.Event.onDOMReady(_initialize)
        },
        navigate: function (module, state) {
            var states;
            if (typeof module !== "string" || typeof state !== "string") {
                throw new Error("Missing or invalid argument")
            }
            states = {};
            states[module] = state;
            return YAHOO.util.History.multiNavigate(states)
        },
        multiNavigate: function (states) {
            var currentStates, moduleName, moduleObj, currentState, fqstate;
            if (typeof states !== "object") {
                throw new Error("Missing or invalid argument")
            }
            if (!_initialized) {
                throw new Error("The Browser History Manager is not initialized")
            }
            for (moduleName in states) {
                if (!_modules[moduleName]) {
                    throw new Error("The following module has not been registered: " + moduleName)
                }
            }
            currentStates = [];
            for (moduleName in _modules) {
                if (YAHOO.lang.hasOwnProperty(_modules, moduleName)) {
                    moduleObj = _modules[moduleName];
                    if (YAHOO.lang.hasOwnProperty(states, moduleName)) {
                        currentState = states[unescape(moduleName)]
                    } else {
                        currentState = unescape(moduleObj.currentState)
                    }
                    moduleName = escape(moduleName);
                    currentState = escape(currentState);
                    currentStates.push(moduleName + "=" + currentState)
                }
            }
            fqstate = currentStates.join("&");
            if (YAHOO.env.ua.ie) {
                return _updateIFrame(fqstate)
            } else {
                top.location.hash = fqstate;
                if (YAHOO.env.ua.webkit) {
                    _fqstates[history.length] = fqstate;
                    _storeStates()
                }
                return true
            }
        },
        getCurrentState: function (module) {
            var moduleObj;
            if (typeof module !== "string") {
                throw new Error("Missing or invalid argument")
            }
            if (!_initialized) {
                throw new Error("The Browser History Manager is not initialized")
            }
            moduleObj = _modules[module];
            if (!moduleObj) {
                throw new Error("No such registered module: " + module)
            }
            return unescape(moduleObj.currentState)
        },
        getBookmarkedState: function (module) {
            var i, len, idx, hash, states, tokens, moduleName;
            if (typeof module !== "string") {
                throw new Error("Missing or invalid argument")
            }
            idx = top.location.href.indexOf("#");
            hash = idx >= 0 ? top.location.href.substr(idx + 1) : top.location.href;
            states = hash.split("&");
            for (i = 0, len = states.length; i < len; i++) {
                tokens = states[i].split("=");
                if (tokens.length === 2) {
                    moduleName = tokens[0];
                    if (moduleName === module) {
                        return unescape(tokens[1])
                    }
                }
            }
            return null
        },
        getQueryStringParameter: function (paramName, url) {
            var i, len, idx, queryString, params, tokens;
            url = url || top.location.href;
            idx = url.indexOf("?");
            queryString = idx >= 0 ? url.substr(idx + 1) : url;
            idx = queryString.lastIndexOf("#");
            queryString = idx >= 0 ? queryString.substr(0, idx) : queryString;
            params = queryString.split("&");
            for (i = 0, len = params.length; i < len; i++) {
                tokens = params[i].split("=");
                if (tokens.length >= 2) {
                    if (tokens[0] === paramName) {
                        return unescape(tokens[1])
                    }
                }
            }
            return null
        }
    }
})();
YAHOO.register("history", YAHOO.util.History, {
    version: "2.5.2",
    build: "1076"
});

YAHOO.widget.AutoComplete = function (elInput, elContainer, oDataSource, oConfigs) {
    if (elInput && elContainer && oDataSource) {
        if (oDataSource instanceof YAHOO.widget.DataSource) {
            this.dataSource = oDataSource
        } else {
            return
        }
        if (YAHOO.util.Dom.inDocument(elInput)) {
            if (YAHOO.lang.isString(elInput)) {
                this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput;
                this._elTextbox = document.getElementById(elInput)
            } else {
                this._sName = (elInput.id) ? "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id : "instance" + YAHOO.widget.AutoComplete._nIndex;
                this._elTextbox = elInput
            }
            YAHOO.util.Dom.addClass(this._elTextbox, "yui-ac-input")
        } else {
            return
        }
        if (YAHOO.util.Dom.inDocument(elContainer)) {
            if (YAHOO.lang.isString(elContainer)) {
                this._elContainer = document.getElementById(elContainer)
            } else {
                this._elContainer = elContainer
            }
            if (this._elContainer.style.display == "none") {}
            var elParent = this._elContainer.parentNode;
            var elTag = elParent.tagName.toLowerCase();
            if (elTag == "div") {
                YAHOO.util.Dom.addClass(elParent, "yui-ac")
            } else {}
        } else {
            return
        }
        if (oConfigs && (oConfigs.constructor == Object)) {
            for (var sConfig in oConfigs) {
                if (sConfig) {
                    this[sConfig] = oConfigs[sConfig]
                }
            }
        }
        this._initContainer();
        this._initProps();
        this._initList();
        this._initContainerHelpers();
        var oSelf = this;
        var elTextbox = this._elTextbox;
        var elContent = this._elContent;
        YAHOO.util.Event.addListener(elTextbox, "keyup", oSelf._onTextboxKeyUp, oSelf);
        YAHOO.util.Event.addListener(elTextbox, "keydown", oSelf._onTextboxKeyDown, oSelf);
        YAHOO.util.Event.addListener(elTextbox, "focus", oSelf._onTextboxFocus, oSelf);
        YAHOO.util.Event.addListener(elTextbox, "blur", oSelf._onTextboxBlur, oSelf);
        YAHOO.util.Event.addListener(elContent, "mouseover", oSelf._onContainerMouseover, oSelf);
        YAHOO.util.Event.addListener(elContent, "mouseout", oSelf._onContainerMouseout, oSelf);
        YAHOO.util.Event.addListener(elContent, "scroll", oSelf._onContainerScroll, oSelf);
        YAHOO.util.Event.addListener(elContent, "resize", oSelf._onContainerResize, oSelf);
        YAHOO.util.Event.addListener(elTextbox, "keypress", oSelf._onTextboxKeyPress, oSelf);
        YAHOO.util.Event.addListener(window, "unload", oSelf._onWindowUnload, oSelf);
        this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this);
        this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this);
        this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this);
        this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this);
        this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this);
        this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this);
        this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this);
        this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this);
        this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this);
        this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this);
        this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this);
        this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this);
        this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this);
        this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this);
        this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this);
        this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this);
        elTextbox.setAttribute("autocomplete", "off");
        YAHOO.widget.AutoComplete._nIndex++
    } else {}
};
YAHOO.widget.AutoComplete.prototype.dataSource = null;
YAHOO.widget.AutoComplete.prototype.minQueryLength = 1;
YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10;
YAHOO.widget.AutoComplete.prototype.queryDelay = 0.2;
YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight";
YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null;
YAHOO.widget.AutoComplete.prototype.delimChar = null;
YAHOO.widget.AutoComplete.prototype.autoHighlight = true;
YAHOO.widget.AutoComplete.prototype.typeAhead = false;
YAHOO.widget.AutoComplete.prototype.animHoriz = false;
YAHOO.widget.AutoComplete.prototype.animVert = true;
YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3;
YAHOO.widget.AutoComplete.prototype.forceSelection = false;
YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true;
YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false;
YAHOO.widget.AutoComplete.prototype.useIFrame = false;
YAHOO.widget.AutoComplete.prototype.useShadow = false;
YAHOO.widget.AutoComplete.prototype.toString = function () {
    return "AutoComplete " + this._sName
};
YAHOO.widget.AutoComplete.prototype.isContainerOpen = function () {
    return this._bContainerOpen
};
YAHOO.widget.AutoComplete.prototype.getListItems = function () {
    return this._aListItems
};
YAHOO.widget.AutoComplete.prototype.getListItemData = function (oListItem) {
    if (oListItem._oResultData) {
        return oListItem._oResultData
    } else {
        return false
    }
};
YAHOO.widget.AutoComplete.prototype.setHeader = function (sHeader) {
    if (this._elHeader) {
        var elHeader = this._elHeader;
        if (sHeader) {
            elHeader.innerHTML = sHeader;
            elHeader.style.display = "block"
        } else {
            elHeader.innerHTML = "";
            elHeader.style.display = "none"
        }
    }
};
YAHOO.widget.AutoComplete.prototype.setFooter = function (sFooter) {
    if (this._elFooter) {
        var elFooter = this._elFooter;
        if (sFooter) {
            elFooter.innerHTML = sFooter;
            elFooter.style.display = "block"
        } else {
            elFooter.innerHTML = "";
            elFooter.style.display = "none"
        }
    }
};
YAHOO.widget.AutoComplete.prototype.setBody = function (sBody) {
    if (this._elBody) {
        var elBody = this._elBody;
        if (sBody) {
            elBody.innerHTML = sBody;
            elBody.style.display = "block";
            elBody.style.display = "block"
        } else {
            elBody.innerHTML = "";
            elBody.style.display = "none"
        }
        this._maxResultsDisplayed = 0
    }
};
YAHOO.widget.AutoComplete.prototype.formatResult = function (oResultItem, sQuery) {
    var sResult = oResultItem[0];
    if (sResult) {
        return sResult
    } else {
        return ""
    }
};
YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function (elTextbox, elContainer, sQuery, aResults) {
    return true
};
YAHOO.widget.AutoComplete.prototype.sendQuery = function (sQuery) {
    this._sendQuery(sQuery)
};
YAHOO.widget.AutoComplete.prototype.doBeforeSendQuery = function (sQuery) {
    return sQuery
};
YAHOO.widget.AutoComplete.prototype.destroy = function () {
    var instanceName = this.toString();
    var elInput = this._elTextbox;
    var elContainer = this._elContainer;
    this.textboxFocusEvent.unsubscribeAll();
    this.textboxKeyEvent.unsubscribeAll();
    this.dataRequestEvent.unsubscribeAll();
    this.dataReturnEvent.unsubscribeAll();
    this.dataErrorEvent.unsubscribeAll();
    this.containerExpandEvent.unsubscribeAll();
    this.typeAheadEvent.unsubscribeAll();
    this.itemMouseOverEvent.unsubscribeAll();
    this.itemMouseOutEvent.unsubscribeAll();
    this.itemArrowToEvent.unsubscribeAll();
    this.itemArrowFromEvent.unsubscribeAll();
    this.itemSelectEvent.unsubscribeAll();
    this.unmatchedItemSelectEvent.unsubscribeAll();
    this.selectionEnforceEvent.unsubscribeAll();
    this.containerCollapseEvent.unsubscribeAll();
    this.textboxBlurEvent.unsubscribeAll();
    YAHOO.util.Event.purgeElement(elInput, true);
    YAHOO.util.Event.purgeElement(elContainer, true);
    elContainer.innerHTML = "";
    for (var key in this) {
        if (YAHOO.lang.hasOwnProperty(this, key)) {
            this[key] = null
        }
    }
};
YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null;
YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null;
YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null;
YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null;
YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null;
YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null;
YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null;
YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null;
YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null;
YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null;
YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null;
YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null;
YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null;
YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null;
YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null;
YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null;
YAHOO.widget.AutoComplete._nIndex = 0;
YAHOO.widget.AutoComplete.prototype._sName = null;
YAHOO.widget.AutoComplete.prototype._elTextbox = null;
YAHOO.widget.AutoComplete.prototype._elContainer = null;
YAHOO.widget.AutoComplete.prototype._elContent = null;
YAHOO.widget.AutoComplete.prototype._elHeader = null;
YAHOO.widget.AutoComplete.prototype._elBody = null;
YAHOO.widget.AutoComplete.prototype._elFooter = null;
YAHOO.widget.AutoComplete.prototype._elShadow = null;
YAHOO.widget.AutoComplete.prototype._elIFrame = null;
YAHOO.widget.AutoComplete.prototype._bFocused = true;
YAHOO.widget.AutoComplete.prototype._oAnim = null;
YAHOO.widget.AutoComplete.prototype._bContainerOpen = false;
YAHOO.widget.AutoComplete.prototype._bOverContainer = false;
YAHOO.widget.AutoComplete.prototype._aListItems = null;
YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0;
YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0;
YAHOO.widget.AutoComplete.prototype._sCurQuery = null;
YAHOO.widget.AutoComplete.prototype._sSavedQuery = null;
YAHOO.widget.AutoComplete.prototype._oCurItem = null;
YAHOO.widget.AutoComplete.prototype._bItemSelected = false;
YAHOO.widget.AutoComplete.prototype._nKeyCode = null;
YAHOO.widget.AutoComplete.prototype._nDelayID = -1;
YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;";
YAHOO.widget.AutoComplete.prototype._queryInterval = null;
YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null;
YAHOO.widget.AutoComplete.prototype._initProps = function () {
    var minQueryLength = this.minQueryLength;
    if (!YAHOO.lang.isNumber(minQueryLength)) {
        this.minQueryLength = 1
    }
    var maxResultsDisplayed = this.maxResultsDisplayed;
    if (!YAHOO.lang.isNumber(maxResultsDisplayed) || (maxResultsDisplayed < 1)) {
        this.maxResultsDisplayed = 10
    }
    var queryDelay = this.queryDelay;
    if (!YAHOO.lang.isNumber(queryDelay) || (queryDelay < 0)) {
        this.queryDelay = 0.2
    }
    var delimChar = this.delimChar;
    if (YAHOO.lang.isString(delimChar) && (delimChar.length > 0)) {
        this.delimChar = [delimChar]
    } else {
        if (!YAHOO.lang.isArray(delimChar)) {
            this.delimChar = null
        }
    }
    var animSpeed = this.animSpeed;
    if ((this.animHoriz || this.animVert) && YAHOO.util.Anim) {
        if (!YAHOO.lang.isNumber(animSpeed) || (animSpeed < 0)) {
            this.animSpeed = 0.3
        }
        if (!this._oAnim) {
            this._oAnim = new YAHOO.util.Anim(this._elContent, {},
            this.animSpeed)
        } else {
            this._oAnim.duration = this.animSpeed
        }
    }
    if (this.forceSelection && delimChar) {}
};
YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function () {
    if (this.useShadow && !this._elShadow) {
        var elShadow = document.createElement("div");
        elShadow.className = "yui-ac-shadow";
        this._elShadow = this._elContainer.appendChild(elShadow)
    }
    if (this.useIFrame && !this._elIFrame) {
        var elIFrame = document.createElement("iframe");
        elIFrame.src = this._iFrameSrc;
        elIFrame.frameBorder = 0;
        elIFrame.scrolling = "no";
        elIFrame.style.position = "absolute";
        elIFrame.style.width = "100%";
        elIFrame.style.height = "100%";
        elIFrame.tabIndex = -1;
        this._elIFrame = this._elContainer.appendChild(elIFrame)
    }
};
YAHOO.widget.AutoComplete.prototype._initContainer = function () {
    YAHOO.util.Dom.addClass(this._elContainer, "yui-ac-container");
    if (!this._elContent) {
        var elContent = document.createElement("div");
        elContent.className = "yui-ac-content";
        elContent.style.display = "none";
        this._elContent = this._elContainer.appendChild(elContent);
        var elHeader = document.createElement("div");
        elHeader.className = "yui-ac-hd";
        elHeader.style.display = "none";
        this._elHeader = this._elContent.appendChild(elHeader);
        var elBody = document.createElement("div");
        elBody.className = "yui-ac-bd";
        this._elBody = this._elContent.appendChild(elBody);
        var elFooter = document.createElement("div");
        elFooter.className = "yui-ac-ft";
        elFooter.style.display = "none";
        this._elFooter = this._elContent.appendChild(elFooter)
    } else {}
};
YAHOO.widget.AutoComplete.prototype._initList = function () {
    this._aListItems = [];
    while (this._elBody.hasChildNodes()) {
        var oldListItems = this.getListItems();
        if (oldListItems) {
            for (var oldi = oldListItems.length - 1; oldi >= 0; oldi--) {
                oldListItems[oldi] = null
            }
        }
        this._elBody.innerHTML = ""
    }
    var oList = document.createElement("ul");
    oList = this._elBody.appendChild(oList);
    for (var i = 0;
    i < this.maxResultsDisplayed; i++) {
        var oItem = document.createElement("li");
        oItem = oList.appendChild(oItem);
        this._aListItems[i] = oItem;
        this._initListItem(oItem, i)
    }
    this._maxResultsDisplayed = this.maxResultsDisplayed
};
YAHOO.widget.AutoComplete.prototype._initListItem = function (oItem, nItemIndex) {
    var oSelf = this;
    oItem.style.display = "none";
    oItem._nItemIndex = nItemIndex;
    oItem.mouseover = oItem.mouseout = oItem.onclick = null;
    YAHOO.util.Event.addListener(oItem, "mouseover", oSelf._onItemMouseover, oSelf);
    YAHOO.util.Event.addListener(oItem, "mouseout", oSelf._onItemMouseout, oSelf);
    YAHOO.util.Event.addListener(oItem, "click", oSelf._onItemMouseclick, oSelf)
};
YAHOO.widget.AutoComplete.prototype._onIMEDetected = function (oSelf) {
    oSelf._enableIntervalDetection()
};
YAHOO.widget.AutoComplete.prototype._enableIntervalDetection = function () {
    var currValue = this._elTextbox.value;
    var lastValue = this._sLastTextboxValue;
    if (currValue != lastValue) {
        this._sLastTextboxValue = currValue;
        this._sendQuery(currValue)
    }
};
YAHOO.widget.AutoComplete.prototype._cancelIntervalDetection = function (oSelf) {
    if (oSelf._queryInterval) {
        clearInterval(oSelf._queryInterval)
    }
};
YAHOO.widget.AutoComplete.prototype._isIgnoreKey = function (nKeyCode) {
    if ((nKeyCode == 9) || (nKeyCode == 13) || (nKeyCode == 16) || (nKeyCode == 17) || (nKeyCode >= 18 && nKeyCode <= 20) || (nKeyCode == 27) || (nKeyCode >= 33 && nKeyCode <= 35) || (nKeyCode >= 36 && nKeyCode <= 40) || (nKeyCode >= 44 && nKeyCode <= 45)) {
        return true
    }
    return false
};
YAHOO.widget.AutoComplete.prototype._sendQuery = function (sQuery) {
    if (this.minQueryLength == -1) {
        this._toggleContainer(false);
        return
    }
    var aDelimChar = (this.delimChar) ? this.delimChar : null;
    if (aDelimChar) {
        var nDelimIndex = -1;
        for (var i = aDelimChar.length - 1; i >= 0; i--) {
            var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]);
            if (nNewIndex > nDelimIndex) {
                nDelimIndex = nNewIndex
            }
        }
        if (aDelimChar[i] == " ") {
            for (var j = aDelimChar.length - 1; j >= 0; j--) {
                if (sQuery[nDelimIndex - 1] == aDelimChar[j]) {
                    nDelimIndex--;
                    break
                }
            }
        }
        if (nDelimIndex > -1) {
            var nQueryStart = nDelimIndex + 1;
            while (sQuery.charAt(nQueryStart) == " ") {
                nQueryStart += 1
            }
            this._sSavedQuery = sQuery.substring(0, nQueryStart);
            sQuery = sQuery.substr(nQueryStart)
        } else {
            if (sQuery.indexOf(this._sSavedQuery) < 0) {
                this._sSavedQuery = null
            }
        }
    }
    if ((sQuery && (sQuery.length < this.minQueryLength)) || (!sQuery && this.minQueryLength > 0)) {
        if (this._nDelayID != -1) {
            clearTimeout(this._nDelayID)
        }
        this._toggleContainer(false);
        return
    }
    sQuery = encodeURIComponent(sQuery);
    this._nDelayID = -1;
    sQuery = this.doBeforeSendQuery(sQuery);
    this.dataRequestEvent.fire(this, sQuery);
    this.dataSource.getResults(this._populateList, sQuery, this)
};
YAHOO.widget.AutoComplete.prototype._populateList = function (sQuery, aResults, oSelf) {
    if (aResults === null) {
        oSelf.dataErrorEvent.fire(oSelf, sQuery)
    }
    if (!oSelf._bFocused || !aResults) {
        return
    }
    var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
    var contentStyle = oSelf._elContent.style;
    contentStyle.width = (!isOpera) ? null : "";
    contentStyle.height = (!isOpera) ? null : "";
    var sCurQuery = decodeURIComponent(sQuery);
    oSelf._sCurQuery = sCurQuery;
    oSelf._bItemSelected = false;
    if (oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) {
        oSelf._initList()
    }
    var nItems = Math.min(aResults.length, oSelf.maxResultsDisplayed);
    oSelf._nDisplayedItems = nItems;
    if (nItems > 0) {
        oSelf._initContainerHelpers();
        var aItems = oSelf._aListItems;
        for (var i = nItems - 1; i >= 0; i--) {
            var oItemi = aItems[i];
            var oResultItemi = aResults[i];
            oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery);
            oItemi.style.display = "list-item";
            oItemi._sResultKey = oResultItemi[0];
            oItemi._oResultData = oResultItemi
        }
        for (var j = aItems.length - 1; j >= nItems; j--) {
            var oItemj = aItems[j];
            oItemj.innerHTML = null;
            oItemj.style.display = "none";
            oItemj._sResultKey = null;
            oItemj._oResultData = null
        }
        var ok = oSelf.doBeforeExpandContainer(oSelf._elTextbox, oSelf._elContainer, sQuery, aResults);
        oSelf._toggleContainer(ok);
        if (oSelf.autoHighlight) {
            var oFirstItem = aItems[0];
            oSelf._toggleHighlight(oFirstItem, "to");
            oSelf.itemArrowToEvent.fire(oSelf, oFirstItem);
            oSelf._typeAhead(oFirstItem, sQuery)
        } else {
            oSelf._oCurItem = null
        }
    } else {
        oSelf._toggleContainer(false)
    }
    oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults)
};
YAHOO.widget.AutoComplete.prototype._clearSelection = function () {
    var sValue = this._elTextbox.value;
    var sChar = (this.delimChar) ? this.delimChar[0] : null;
    var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length - 2) : -1;
    if (nIndex > -1) {
        this._elTextbox.value = sValue.substring(0, nIndex)
    } else {
        this._elTextbox.value = ""
    }
    this._sSavedQuery = this._elTextbox.value;
    this.selectionEnforceEvent.fire(this)
};
YAHOO.widget.AutoComplete.prototype._textMatchesOption = function () {
    var foundMatch = null;
    for (var i = this._nDisplayedItems - 1; i >= 0; i--) {
        var oItem = this._aListItems[i];
        var sMatch = oItem._sResultKey.toLowerCase();
        if (sMatch == this._sCurQuery.toLowerCase()) {
            foundMatch = oItem;
            break
        }
    }
    return (foundMatch)
};
YAHOO.widget.AutoComplete.prototype._typeAhead = function (oItem, sQuery) {
    if (!this.typeAhead || (this._nKeyCode == 8)) {
        return
    }
    var elTextbox = this._elTextbox;
    var sValue = this._elTextbox.value;
    if (!elTextbox.setSelectionRange && !elTextbox.createTextRange) {
        return
    }
    var nStart = sValue.length;
    this._updateValue(oItem);
    var nEnd = elTextbox.value.length;
    this._selectText(elTextbox, nStart, nEnd);
    var sPrefill = elTextbox.value.substr(nStart, nEnd);
    this.typeAheadEvent.fire(this, sQuery, sPrefill)
};
YAHOO.widget.AutoComplete.prototype._selectText = function (elTextbox, nStart, nEnd) {
    if (elTextbox.setSelectionRange) {
        elTextbox.setSelectionRange(nStart, nEnd)
    } else {
        if (elTextbox.createTextRange) {
            var oTextRange = elTextbox.createTextRange();
            oTextRange.moveStart("character", nStart);
            oTextRange.moveEnd("character", nEnd - elTextbox.value.length);
            oTextRange.select()
        } else {
            elTextbox.select()
        }
    }
};
YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function (bShow) {
    var bFireEvent = false;
    var width = this._elContent.offsetWidth + "px";
    var height = this._elContent.offsetHeight + "px";
    if (this.useIFrame && this._elIFrame) {
        bFireEvent = true;
        if (bShow) {
            this._elIFrame.style.width = width;
            this._elIFrame.style.height = height
        } else {
            this._elIFrame.style.width = 0;
            this._elIFrame.style.height = 0
        }
    }
    if (this.useShadow && this._elShadow) {
        bFireEvent = true;
        if (bShow) {
            this._elShadow.style.width = width;
            this._elShadow.style.height = height
        } else {
            this._elShadow.style.width = 0;
            this._elShadow.style.height = 0
        }
    }
};
YAHOO.widget.AutoComplete.prototype._toggleContainer = function (bShow) {
    var elContainer = this._elContainer;
    if (this.alwaysShowContainer && this._bContainerOpen) {
        return
    }
    if (!bShow) {
        this._elContent.scrollTop = 0;
        var aItems = this._aListItems;
        if (aItems && (aItems.length > 0)) {
            for (var i = aItems.length - 1; i >= 0; i--) {
                aItems[i].style.display = "none"
            }
        }
        if (this._oCurItem) {
            this._toggleHighlight(this._oCurItem, "from")
        }
        this._oCurItem = null;
        this._nDisplayedItems = 0;
        this._sCurQuery = null
    }
    if (!bShow && !this._bContainerOpen) {
        this._elContent.style.display = "none";
        return
    }
    var oAnim = this._oAnim;
    if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) {
        if (!bShow) {
            this._toggleContainerHelpers(bShow)
        }
        if (oAnim.isAnimated()) {
            oAnim.stop()
        }
        var oClone = this._elContent.cloneNode(true);
        elContainer.appendChild(oClone);
        oClone.style.top = "-9000px";
        oClone.style.display = "block";
        var wExp = oClone.offsetWidth;
        var hExp = oClone.offsetHeight;
        var wColl = (this.animHoriz) ? 0 : wExp;
        var hColl = (this.animVert) ? 0 : hExp;
        oAnim.attributes = (bShow) ? {
            width: {
                to: wExp
            },
            height: {
                to: hExp
            }
        } : {
            width: {
                to: wColl
            },
            height: {
                to: hColl
            }
        };
        if (bShow && !this._bContainerOpen) {
            this._elContent.style.width = wColl + "px";
            this._elContent.style.height = hColl + "px"
        } else {
            this._elContent.style.width = wExp + "px";
            this._elContent.style.height = hExp + "px"
        }
        elContainer.removeChild(oClone);
        oClone = null;
        var oSelf = this;
        var onAnimComplete = function () {
            oAnim.onComplete.unsubscribeAll();
            if (bShow) {
                oSelf.containerExpandEvent.fire(oSelf)
            } else {
                oSelf._elContent.style.display = "none";
                oSelf.containerCollapseEvent.fire(oSelf)
            }
            oSelf._toggleContainerHelpers(bShow)
        };
        this._elContent.style.display = "block";
        oAnim.onComplete.subscribe(onAnimComplete);
        oAnim.animate();
        this._bContainerOpen = bShow
    } else {
        if (bShow) {
            this._elContent.style.display = "block";
            this.containerExpandEvent.fire(this)
        } else {
            this._elContent.style.display = "none";
            this.containerCollapseEvent.fire(this)
        }
        this._toggleContainerHelpers(bShow);
        this._bContainerOpen = bShow
    }
};
YAHOO.widget.AutoComplete.prototype._toggleHighlight = function (oNewItem, sType) {
    var sHighlight = this.highlightClassName;
    if (this._oCurItem) {
        YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight)
    }
    if ((sType == "to") && sHighlight) {
        YAHOO.util.Dom.addClass(oNewItem, sHighlight);
        this._oCurItem = oNewItem
    }
};
YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function (oNewItem, sType) {
    if (oNewItem == this._oCurItem) {
        return
    }
    var sPrehighlight = this.prehighlightClassName;
    if ((sType == "mouseover") && sPrehighlight) {
        YAHOO.util.Dom.addClass(oNewItem, sPrehighlight)
    } else {
        YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight)
    }
};
YAHOO.widget.AutoComplete.prototype._updateValue = function (oItem) {
    var elTextbox = this._elTextbox;
    var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null;
    var sSavedQuery = this._sSavedQuery;
    var sResultKey = oItem._sResultKey;
    elTextbox.focus();
    elTextbox.value = "";
    if (sDelimChar) {
        if (sSavedQuery) {
            elTextbox.value = sSavedQuery
        }
        elTextbox.value += sResultKey + sDelimChar;
        if (sDelimChar != " ") {
            elTextbox.value += " "
        }
    } else {
        elTextbox.value = sResultKey
    }
    if (elTextbox.type == "textarea") {
        elTextbox.scrollTop = elTextbox.scrollHeight
    }
    var end = elTextbox.value.length;
    this._selectText(elTextbox, end, end);
    this._oCurItem = oItem
};
YAHOO.widget.AutoComplete.prototype._selectItem = function (oItem) {
    this._bItemSelected = true;
    this._updateValue(oItem);
    this._cancelIntervalDetection(this);
    this.itemSelectEvent.fire(this, oItem, oItem._oResultData);
    this._toggleContainer(false)
};
YAHOO.widget.AutoComplete.prototype._jumpSelection = function () {
    if (this._oCurItem) {
        this._selectItem(this._oCurItem)
    } else {
        this._toggleContainer(false)
    }
};
YAHOO.widget.AutoComplete.prototype._moveSelection = function (nKeyCode) {
    if (this._bContainerOpen) {
        var oCurItem = this._oCurItem;
        var nCurItemIndex = -1;
        if (oCurItem) {
            nCurItemIndex = oCurItem._nItemIndex
        }
        var nNewItemIndex = (nKeyCode == 40) ? (nCurItemIndex + 1) : (nCurItemIndex - 1);
        if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) {
            return
        }
        if (oCurItem) {
            this._toggleHighlight(oCurItem, "from");
            this.itemArrowFromEvent.fire(this, oCurItem)
        }
        if (nNewItemIndex == -1) {
            if (this.delimChar && this._sSavedQuery) {
                if (!this._textMatchesOption()) {
                    this._elTextbox.value = this._sSavedQuery
                } else {
                    this._elTextbox.value = this._sSavedQuery + this._sCurQuery
                }
            } else {
                this._elTextbox.value = this._sCurQuery
            }
            this._oCurItem = null;
            return
        }
        if (nNewItemIndex == -2) {
            this._toggleContainer(false);
            return
        }
        var oNewItem = this._aListItems[nNewItemIndex];
        var elContent = this._elContent;
        var scrollOn = ((YAHOO.util.Dom.getStyle(elContent, "overflow") == "auto") || (YAHOO.util.Dom.getStyle(elContent, "overflowY") == "auto"));
        if (scrollOn && (nNewItemIndex > -1) && (nNewItemIndex < this._nDisplayedItems)) {
            if (nKeyCode == 40) {
                if ((oNewItem.offsetTop + oNewItem.offsetHeight) > (elContent.scrollTop + elContent.offsetHeight)) {
                    elContent.scrollTop = (oNewItem.offsetTop + oNewItem.offsetHeight) - elContent.offsetHeight
                } else {
                    if ((oNewItem.offsetTop + oNewItem.offsetHeight) < elContent.scrollTop) {
                        elContent.scrollTop = oNewItem.offsetTop
                    }
                }
            } else {
                if (oNewItem.offsetTop < elContent.scrollTop) {
                    this._elContent.scrollTop = oNewItem.offsetTop
                } else {
                    if (oNewItem.offsetTop > (elContent.scrollTop + elContent.offsetHeight)) {
                        this._elContent.scrollTop = (oNewItem.offsetTop + oNewItem.offsetHeight) - elContent.offsetHeight
                    }
                }
            }
        }
        this._toggleHighlight(oNewItem, "to");
        this.itemArrowToEvent.fire(this, oNewItem);
        if (this.typeAhead) {
            this._updateValue(oNewItem)
        }
    }
};
YAHOO.widget.AutoComplete.prototype._onItemMouseover = function (v, oSelf) {
    if (oSelf.prehighlightClassName) {
        oSelf._togglePrehighlight(this, "mouseover")
    } else {
        oSelf._toggleHighlight(this, "to")
    }
    oSelf.itemMouseOverEvent.fire(oSelf, this)
};
YAHOO.widget.AutoComplete.prototype._onItemMouseout = function (v, oSelf) {
    if (oSelf.prehighlightClassName) {
        oSelf._togglePrehighlight(this, "mouseout")
    } else {
        oSelf._toggleHighlight(this, "from")
    }
    oSelf.itemMouseOutEvent.fire(oSelf, this)
};
YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function (v, oSelf) {
    oSelf._toggleHighlight(this, "to");
    oSelf._selectItem(this)
};
YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function (v, oSelf) {
    oSelf._bOverContainer = true
};
YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function (v, oSelf) {
    oSelf._bOverContainer = false;
    if (oSelf._oCurItem) {
        oSelf._toggleHighlight(oSelf._oCurItem, "to")
    }
};
YAHOO.widget.AutoComplete.prototype._onContainerScroll = function (v, oSelf) {
    oSelf._elTextbox.focus()
};
YAHOO.widget.AutoComplete.prototype._onContainerResize = function (v, oSelf) {
    oSelf._toggleContainerHelpers(oSelf._bContainerOpen)
};
YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function (v, oSelf) {
    var nKeyCode = v.keyCode;
    switch (nKeyCode) {
    case 9:
        if ((navigator.userAgent.toLowerCase().indexOf("mac") == -1)) {
            if (oSelf._oCurItem) {
                if (oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) {
                    if (oSelf._bContainerOpen) {
                        YAHOO.util.Event.stopEvent(v)
                    }
                }
                oSelf._selectItem(oSelf._oCurItem)
            } else {
                oSelf._toggleContainer(false)
            }
        }
        break;
    case 13:
        if ((navigator.userAgent.toLowerCase().indexOf("mac") == -1)) {
            if (oSelf._oCurItem) {
                if (oSelf._nKeyCode != nKeyCode) {
                    if (oSelf._bContainerOpen) {
                        YAHOO.util.Event.stopEvent(v)
                    }
                }
                oSelf._selectItem(oSelf._oCurItem)
            } else {
                oSelf._toggleContainer(false)
            }
        }
        break;
    case 27:
        oSelf._toggleContainer(false);
        return;
    case 39:
        oSelf._jumpSelection();
        break;
    case 38:
        YAHOO.util.Event.stopEvent(v);
        oSelf._moveSelection(nKeyCode);
        break;
    case 40:
        YAHOO.util.Event.stopEvent(v);
        oSelf._moveSelection(nKeyCode);
        break;
    default:
        break
    }
};
YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function (v, oSelf) {
    var nKeyCode = v.keyCode;
    if ((navigator.userAgent.toLowerCase().indexOf("mac") != -1)) {
        switch (nKeyCode) {
        case 9:
            if (oSelf._oCurItem) {
                if (oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) {
                    if (oSelf._bContainerOpen) {
                        YAHOO.util.Event.stopEvent(v)
                    }
                }
                oSelf._selectItem(oSelf._oCurItem)
            } else {
                oSelf._toggleContainer(false)
            }
            break;
        case 13:
            if (oSelf._oCurItem) {
                if (oSelf._nKeyCode != nKeyCode) {
                    if (oSelf._bContainerOpen) {
                        YAHOO.util.Event.stopEvent(v)
                    }
                }
                oSelf._selectItem(oSelf._oCurItem)
            } else {
                oSelf._toggleContainer(false)
            }
            break;
        default:
            break
        }
    } else {
        if (nKeyCode == 229) {
            oSelf._queryInterval = setInterval(function () {
                oSelf._onIMEDetected(oSelf)
            },
            500)
        }
    }
};
YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function (v, oSelf) {
    oSelf._initProps();
    var nKeyCode = v.keyCode;
    oSelf._nKeyCode = nKeyCode;
    var sText = this.value;
    if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) {
        return
    } else {
        oSelf._bItemSelected = false;
        YAHOO.util.Dom.removeClass(oSelf._oCurItem, oSelf.highlightClassName);
        oSelf._oCurItem = null;
        oSelf.textboxKeyEvent.fire(oSelf, nKeyCode)
    }
    if (oSelf.queryDelay > 0) {
        var nDelayID = setTimeout(function () {
            oSelf._sendQuery(sText)
        },
        (oSelf.queryDelay * 1000));
        if (oSelf._nDelayID != -1) {
            clearTimeout(oSelf._nDelayID)
        }
        oSelf._nDelayID = nDelayID
    } else {
        oSelf._sendQuery(sText)
    }
};
YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v, oSelf) {
    oSelf._elTextbox.setAttribute("autocomplete", "off");
    oSelf._bFocused = true;
    if (!oSelf._bItemSelected) {
        oSelf.textboxFocusEvent.fire(oSelf)
    }
};
YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v, oSelf) {
    if (!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) {
        if (!oSelf._bItemSelected) {
            var oMatch = oSelf._textMatchesOption();
            if (!oSelf._bContainerOpen || (oSelf._bContainerOpen && (oMatch === null))) {
                if (oSelf.forceSelection) {
                    oSelf._clearSelection()
                } else {
                    oSelf.unmatchedItemSelectEvent.fire(oSelf)
                }
            } else {
                if (oSelf.forceSelection) {
                    oSelf._selectItem(oMatch)
                }
            }
        }
        if (oSelf._bContainerOpen) {
            oSelf._toggleContainer(false)
        }
        oSelf._cancelIntervalDetection(oSelf);
        oSelf._bFocused = false;
        oSelf.textboxBlurEvent.fire(oSelf)
    }
};
YAHOO.widget.AutoComplete.prototype._onWindowUnload = function (v, oSelf) {
    if (oSelf && oSelf._elTextbox && oSelf.allowBrowserAutocomplete) {
        oSelf._elTextbox.setAttribute("autocomplete", "on")
    }
};
YAHOO.widget.DataSource = function () {};
YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null";
YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed";
YAHOO.widget.DataSource.prototype.maxCacheEntries = 15;
YAHOO.widget.DataSource.prototype.queryMatchContains = false;
YAHOO.widget.DataSource.prototype.queryMatchSubset = false;
YAHOO.widget.DataSource.prototype.queryMatchCase = false;
YAHOO.widget.DataSource.prototype.toString = function () {
    return "DataSource " + this._sName
};
YAHOO.widget.DataSource.prototype.getResults = function (oCallbackFn, sQuery, oParent) {
    var aResults = this._doQueryCache(oCallbackFn, sQuery, oParent);
    if (aResults.length === 0) {
        this.queryEvent.fire(this, oParent, sQuery);
        this.doQuery(oCallbackFn, sQuery, oParent)
    }
};
YAHOO.widget.DataSource.prototype.doQuery = function (oCallbackFn, sQuery, oParent) {};
YAHOO.widget.DataSource.prototype.flushCache = function () {
    if (this._aCache) {
        this._aCache = []
    }
    if (this._aCacheHelper) {
        this._aCacheHelper = []
    }
    this.cacheFlushEvent.fire(this)
};
YAHOO.widget.DataSource.prototype.queryEvent = null;
YAHOO.widget.DataSource.prototype.cacheQueryEvent = null;
YAHOO.widget.DataSource.prototype.getResultsEvent = null;
YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null;
YAHOO.widget.DataSource.prototype.dataErrorEvent = null;
YAHOO.widget.DataSource.prototype.cacheFlushEvent = null;
YAHOO.widget.DataSource._nIndex = 0;
YAHOO.widget.DataSource.prototype._sName = null;
YAHOO.widget.DataSource.prototype._aCache = null;
YAHOO.widget.DataSource.prototype._init = function () {
    var maxCacheEntries = this.maxCacheEntries;
    if (!YAHOO.lang.isNumber(maxCacheEntries) || (maxCacheEntries < 0)) {
        maxCacheEntries = 0
    }
    if (maxCacheEntries > 0 && !this._aCache) {
        this._aCache = []
    }
    this._sName = "instance" + YAHOO.widget.DataSource._nIndex;
    YAHOO.widget.DataSource._nIndex++;
    this.queryEvent = new YAHOO.util.CustomEvent("query", this);
    this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this);
    this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this);
    this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this);
    this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this);
    this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this)
};
YAHOO.widget.DataSource.prototype._addCacheElem = function (oResult) {
    var aCache = this._aCache;
    if (!aCache || !oResult || !oResult.query || !oResult.results) {
        return
    }
    if (aCache.length >= this.maxCacheEntries) {
        aCache.shift()
    }
    aCache.push(oResult)
};
YAHOO.widget.DataSource.prototype._doQueryCache = function (oCallbackFn, sQuery, oParent) {
    var aResults = [];
    var bMatchFound = false;
    var aCache = this._aCache;
    var nCacheLength = (aCache) ? aCache.length : 0;
    var bMatchContains = this.queryMatchContains;
    var sOrigQuery;
    if ((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) {
        this.cacheQueryEvent.fire(this, oParent, sQuery);
        if (!this.queryMatchCase) {
            sOrigQuery = sQuery;
            sQuery = sQuery.toLowerCase()
        }
        for (var i = nCacheLength - 1; i >= 0; i--) {
            var resultObj = aCache[i];
            var aAllResultItems = resultObj.results;
            var matchKey = (!this.queryMatchCase) ? encodeURIComponent(resultObj.query).toLowerCase() : encodeURIComponent(resultObj.query);
            if (matchKey == sQuery) {
                bMatchFound = true;
                aResults = aAllResultItems;
                if (i != nCacheLength - 1) {
                    aCache.splice(i, 1);
                    this._addCacheElem(resultObj)
                }
                break
            } else {
                if (this.queryMatchSubset) {
                    for (var j = sQuery.length - 1; j >= 0;
                    j--) {
                        var subQuery = sQuery.substr(0, j);
                        if (matchKey == subQuery) {
                            bMatchFound = true;
                            for (var k = aAllResultItems.length - 1; k >= 0; k--) {
                                var aRecord = aAllResultItems[k];
                                var sKeyIndex = (this.queryMatchCase) ? encodeURIComponent(aRecord[0]).indexOf(sQuery) : encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery);
                                if ((!bMatchContains && (sKeyIndex === 0)) || (bMatchContains && (sKeyIndex > -1))) {
                                    aResults.unshift(aRecord)
                                }
                            }
                            resultObj = {};
                            resultObj.query = sQuery;
                            resultObj.results = aResults;
                            this._addCacheElem(resultObj);
                            break
                        }
                    }
                    if (bMatchFound) {
                        break
                    }
                }
            }
        }
        if (bMatchFound) {
            this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults);
            oCallbackFn(sOrigQuery, aResults, oParent)
        }
    }
    return aResults
};
YAHOO.widget.DS_XHR = function (sScriptURI, aSchema, oConfigs) {
    if (oConfigs && (oConfigs.constructor == Object)) {
        for (var sConfig in oConfigs) {
            this[sConfig] = oConfigs[sConfig]
        }
    }
    if (!YAHOO.lang.isArray(aSchema) || !YAHOO.lang.isString(sScriptURI)) {
        return
    }
    this.schema = aSchema;
    this.scriptURI = sScriptURI;
    this._init()
};
YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource();
YAHOO.widget.DS_XHR.TYPE_JSON = 0;
YAHOO.widget.DS_XHR.TYPE_XML = 1;
YAHOO.widget.DS_XHR.TYPE_FLAT = 2;
YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed";
YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect;
YAHOO.widget.DS_XHR.prototype.connTimeout = 0;
YAHOO.widget.DS_XHR.prototype.scriptURI = null;
YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query";
YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = "";
YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON;
YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n<!-";
YAHOO.widget.DS_XHR.prototype.doQuery = function (oCallbackFn, sQuery, oParent) {
    var isXML = (this.responseType == YAHOO.widget.DS_XHR.TYPE_XML);
    var sUri = this.scriptURI + "?" + this.scriptQueryParam + "=" + sQuery;
    if (this.scriptQueryAppend.length > 0) {
        sUri += "&" + this.scriptQueryAppend
    }
    var oResponse = null;
    var oSelf = this;
    var responseSuccess = function (oResp) {
        if (!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) {
            oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL);
            return
        }
        for (var foo in oResp) {}
        if (!isXML) {
            oResp = oResp.responseText
        } else {
            oResp = oResp.responseXML
        }
        if (oResp === null) {
            oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL);
            return
        }
        var aResults = oSelf.parseResponse(sQuery, oResp, oParent);
        var resultObj = {};
        resultObj.query = decodeURIComponent(sQuery);
        resultObj.results = aResults;
        if (aResults === null) {
            oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE);
            aResults = []
        } else {
            oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults);
            oSelf._addCacheElem(resultObj)
        }
        oCallbackFn(sQuery, aResults, oParent)
    };
    var responseFailure = function (oResp) {
        oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR);
        return
    };
    var oCallback = {
        success: responseSuccess,
        failure: responseFailure
    };
    if (YAHOO.lang.isNumber(this.connTimeout) && (this.connTimeout > 0)) {
        oCallback.timeout = this.connTimeout
    }
    if (this._oConn) {
        this.connMgr.abort(this._oConn)
    }
    oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null)
};
YAHOO.widget.DS_XHR.prototype.parseResponse = function (sQuery, oResponse, oParent) {
    var aSchema = this.schema;
    var aResults = [];
    var bError = false;
    var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? oResponse.indexOf(this.responseStripAfter) : -1;
    if (nEnd != -1) {
        oResponse = oResponse.substring(0, nEnd)
    }
    switch (this.responseType) {
    case YAHOO.widget.DS_XHR.TYPE_JSON:
        var jsonList, jsonObjParsed;
        if (YAHOO.lang.JSON) {
            jsonObjParsed = YAHOO.lang.JSON.parse(oResponse);
            if (!jsonObjParsed) {
                bError = true;
                break
            } else {
                try {
                    jsonList = eval("jsonObjParsed." + aSchema[0])
                } catch(e) {
                    bError = true;
                    break
                }
            }
        } else {
            if (oResponse.parseJSON) {
                jsonObjParsed = oResponse.parseJSON();
                if (!jsonObjParsed) {
                    bError = true
                } else {
                    try {
                        jsonList = eval("jsonObjParsed." + aSchema[0])
                    } catch(e) {
                        bError = true;
                        break
                    }
                }
            } else {
                if (window.JSON) {
                    jsonObjParsed = JSON.parse(oResponse);
                    if (!jsonObjParsed) {
                        bError = true;
                        break
                    } else {
                        try {
                            jsonList = eval("jsonObjParsed." + aSchema[0])
                        } catch(e) {
                            bError = true;
                            break
                        }
                    }
                } else {
                    try {
                        while (oResponse.substring(0, 1) == " ") {
                            oResponse = oResponse.substring(1, oResponse.length)
                        }
                        if (oResponse.indexOf("{") < 0) {
                            bError = true;
                            break
                        }
                        if (oResponse.indexOf("{}") === 0) {
                            break
                        }
                        var jsonObjRaw = eval("(" + oResponse + ")");
                        if (!jsonObjRaw) {
                            bError = true;
                            break
                        }
                        jsonList = eval("(jsonObjRaw." + aSchema[0] + ")")
                    } catch(e) {
                        bError = true;
                        break
                    }
                }
            }
        }
        if (!jsonList) {
            bError = true;
            break
        }
        if (!YAHOO.lang.isArray(jsonList)) {
            jsonList = [jsonList]
        }
        for (var i = jsonList.length - 1; i >= 0; i--) {
            var aResultItem = [];
            var jsonResult = jsonList[i];
            for (var j = aSchema.length - 1; j >= 1; j--) {
                var dataFieldValue = jsonResult[aSchema[j]];
                if (!dataFieldValue) {
                    dataFieldValue = ""
                }
                aResultItem.unshift(dataFieldValue)
            }
            if (aResultItem.length == 1) {
                aResultItem.push(jsonResult)
            }
            aResults.unshift(aResultItem)
        }
        break;
    case YAHOO.widget.DS_XHR.TYPE_XML:
        var xmlList = oResponse.getElementsByTagName(aSchema[0]);
        if (!xmlList) {
            bError = true;
            break
        }
        for (var k = xmlList.length - 1; k >= 0; k--) {
            var result = xmlList.item(k);
            var aFieldSet = [];
            for (var m = aSchema.length - 1; m >= 1; m--) {
                var sValue = null;
                var xmlAttr = result.attributes.getNamedItem(aSchema[m]);
                if (xmlAttr) {
                    sValue = xmlAttr.value
                } else {
                    var xmlNode = result.getElementsByTagName(aSchema[m]);
                    if (xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) {
                        sValue = xmlNode.item(0).firstChild.nodeValue
                    } else {
                        sValue = ""
                    }
                }
                aFieldSet.unshift(sValue)
            }
            aResults.unshift(aFieldSet)
        }
        break;
    case YAHOO.widget.DS_XHR.TYPE_FLAT:
        if (oResponse.length > 0) {
            var newLength = oResponse.length - aSchema[0].length;
            if (oResponse.substr(newLength) == aSchema[0]) {
                oResponse = oResponse.substr(0, newLength)
            }
            if (oResponse.length > 0) {
                var aRecords = oResponse.split(aSchema[0]);
                for (var n = aRecords.length - 1; n >= 0; n--) {
                    if (aRecords[n].length > 0) {
                        aResults[n] = aRecords[n].split(aSchema[1])
                    }
                }
            }
        }
        break;
    default:
        break
    }
    sQuery = null;
    oResponse = null;
    oParent = null;
    if (bError) {
        return null
    } else {
        return aResults
    }
};
YAHOO.widget.DS_XHR.prototype._oConn = null;
YAHOO.widget.DS_ScriptNode = function (sUri, aSchema, oConfigs) {
    if (oConfigs && (oConfigs.constructor == Object)) {
        for (var sConfig in oConfigs) {
            this[sConfig] = oConfigs[sConfig]
        }
    }
    if (!YAHOO.lang.isArray(aSchema) || !YAHOO.lang.isString(sUri)) {
        return
    }
    this.schema = aSchema;
    this.scriptURI = sUri;
    this._init()
};
YAHOO.widget.DS_ScriptNode.prototype = new YAHOO.widget.DataSource();
YAHOO.widget.DS_ScriptNode.prototype.getUtility = YAHOO.util.Get;
YAHOO.widget.DS_ScriptNode.prototype.scriptURI = null;
YAHOO.widget.DS_ScriptNode.prototype.scriptQueryParam = "query";
YAHOO.widget.DS_ScriptNode.prototype.asyncMode = "allowAll";
YAHOO.widget.DS_ScriptNode.prototype.scriptCallbackParam = "callback";
YAHOO.widget.DS_ScriptNode.callbacks = [];
YAHOO.widget.DS_ScriptNode._nId = 0;
YAHOO.widget.DS_ScriptNode._nPending = 0;
YAHOO.widget.DS_ScriptNode.prototype.doQuery = function (oCallbackFn, sQuery, oParent) {
    var oSelf = this;
    if (YAHOO.widget.DS_ScriptNode._nPending === 0) {
        YAHOO.widget.DS_ScriptNode.callbacks = [];
        YAHOO.widget.DS_ScriptNode._nId = 0
    }
    var id = YAHOO.widget.DS_ScriptNode._nId;
    YAHOO.widget.DS_ScriptNode._nId++;
    YAHOO.widget.DS_ScriptNode.callbacks[id] = function (oResponse) {
        if ((oSelf.asyncMode !== "ignoreStaleResponses") || (id === YAHOO.widget.DS_ScriptNode.callbacks.length - 1)) {
            oSelf.handleResponse(oResponse, oCallbackFn, sQuery, oParent)
        } else {}
        delete YAHOO.widget.DS_ScriptNode.callbacks[id]
    };
    YAHOO.widget.DS_ScriptNode._nPending++;
    var sUri = this.scriptURI + "&" + this.scriptQueryParam + "=" + sQuery + "&" + this.scriptCallbackParam + "=YAHOO.widget.DS_ScriptNode.callbacks[" + id + "]";
    this.getUtility.script(sUri, {
        autopurge: true,
        onsuccess: YAHOO.widget.DS_ScriptNode._bumpPendingDown,
        onfail: YAHOO.widget.DS_ScriptNode._bumpPendingDown
    })
};
YAHOO.widget.DS_ScriptNode.prototype.handleResponse = function (oResponse, oCallbackFn, sQuery, oParent) {
    var aSchema = this.schema;
    var aResults = [];
    var bError = false;
    var jsonList, jsonObjParsed;
    try {
        jsonList = eval("(oResponse." + aSchema[0] + ")")
    } catch(e) {
        bError = true
    }
    if (!jsonList) {
        bError = true;
        jsonList = []
    } else {
        if (!YAHOO.lang.isArray(jsonList)) {
            jsonList = [jsonList]
        }
    }
    for (var i = jsonList.length - 1; i >= 0; i--) {
        var aResultItem = [];
        var jsonResult = jsonList[i];
        for (var j = aSchema.length - 1; j >= 1; j--) {
            var dataFieldValue = jsonResult[aSchema[j]];
            if (!dataFieldValue) {
                dataFieldValue = ""
            }
            aResultItem.unshift(dataFieldValue)
        }
        if (aResultItem.length == 1) {
            aResultItem.push(jsonResult)
        }
        aResults.unshift(aResultItem)
    }
    if (bError) {
        aResults = null
    }
    if (aResults === null) {
        this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE);
        aResults = []
    } else {
        var resultObj = {};
        resultObj.query = decodeURIComponent(sQuery);
        resultObj.results = aResults;
        this._addCacheElem(resultObj);
        this.getResultsEvent.fire(this, oParent, sQuery, aResults)
    }
    oCallbackFn(sQuery, aResults, oParent)
};
YAHOO.widget.DS_ScriptNode._bumpPendingDown = function () {
    YAHOO.widget.DS_ScriptNode._nPending--
};
YAHOO.widget.DS_JSFunction = function (oFunction, oConfigs) {
    if (oConfigs && (oConfigs.constructor == Object)) {
        for (var sConfig in oConfigs) {
            this[sConfig] = oConfigs[sConfig]
        }
    }
    if (!YAHOO.lang.isFunction(oFunction)) {
        return
    } else {
        this.dataFunction = oFunction;
        this._init()
    }
};
YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource();
YAHOO.widget.DS_JSFunction.prototype.dataFunction = null;
YAHOO.widget.DS_JSFunction.prototype.doQuery = function (oCallbackFn, sQuery, oParent) {
    var oFunction = this.dataFunction;
    var aResults = [];
    aResults = oFunction(sQuery);
    if (aResults === null) {
        this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL);
        return
    }
    var resultObj = {};
    resultObj.query = decodeURIComponent(sQuery);
    resultObj.results = aResults;
    this._addCacheElem(resultObj);
    this.getResultsEvent.fire(this, oParent, sQuery, aResults);
    oCallbackFn(sQuery, aResults, oParent);
    return
};
YAHOO.widget.DS_JSArray = function (aData, oConfigs) {
    if (oConfigs && (oConfigs.constructor == Object)) {
        for (var sConfig in oConfigs) {
            this[sConfig] = oConfigs[sConfig]
        }
    }
    if (!YAHOO.lang.isArray(aData)) {
        return
    } else {
        this.data = aData;
        this._init()
    }
};
YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource();
YAHOO.widget.DS_JSArray.prototype.data = null;
YAHOO.widget.DS_JSArray.prototype.doQuery = function (oCallbackFn, sQuery, oParent) {
    var i;
    var aData = this.data;
    var aResults = [];
    var bMatchFound = false;
    var bMatchContains = this.queryMatchContains;
    if (sQuery) {
        if (!this.queryMatchCase) {
            sQuery = sQuery.toLowerCase()
        }
        for (i = aData.length - 1; i >= 0; i--) {
            var aDataset = [];
            if (YAHOO.lang.isString(aData[i])) {
                aDataset[0] = aData[i]
            } else {
                if (YAHOO.lang.isArray(aData[i])) {
                    aDataset = aData[i]
                }
            }
            if (YAHOO.lang.isString(aDataset[0])) {
                var sKeyIndex = (this.queryMatchCase) ? encodeURIComponent(aDataset[0]).indexOf(sQuery) : encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery);
                if ((!bMatchContains && (sKeyIndex === 0)) || (bMatchContains && (sKeyIndex > -1))) {
                    aResults.unshift(aDataset)
                }
            }
        }
    } else {
        for (i = aData.length - 1; i >= 0; i--) {
            if (YAHOO.lang.isString(aData[i])) {
                aResults.unshift([aData[i]])
            } else {
                if (YAHOO.lang.isArray(aData[i])) {
                    aResults.unshift(aData[i])
                }
            }
        }
    }
    this.getResultsEvent.fire(this, oParent, sQuery, aResults);
    oCallbackFn(sQuery, aResults, oParent)
};
YAHOO.register("autocomplete", YAHOO.widget.AutoComplete, {
    version: "2.5.2",
    build: "1076"
});

(function () {
    YAHOO.namespace("YAHOO.EU.Shopping");
    var doc = document;
    var isIE = /(?!.*?opera.*?)msie(?!.*?opera.*?)/i.test(navigator.userAgent);
    var isWebKit = /webkit/i.test(navigator.userAgent);
    var cache = {};
    var cacheOn = !isIE && !isWebKit;
    var persistCache = {};
    var _uid = 0;
    var reg = {
        trim: /^\s+|\s+$/g,
        quickTest: /^[^:\[>+~ ,]+$/,
        typeSelector: /(^[^\[:]+?)(?:\[|\:|$)/,
        tag: /^(\w+|\*)/,
        id: /^(\w*|\*)#/,
        classRE: /^(\w*|\*)\./,
        attributeName: /(\w+)(?:[!+~*\^$|=])|\w+/,
        attributeValue: /(?:[!+~*\^$|=]=*)(.+)(?:\])/,
        pseudoName: /(\:[^\(]+)/,
        pseudoArgs: /(?:\()(.+)(?:\))/,
        nthParts: /([+-]?\d)*(n)([+-]\d+)*/i,
        combinatorTest: /[+>~ ](?![^\(]+\)|[^\[]+\])/,
        combinator: /\s*[>~]\s*(?![=])|\s*\+\s*(?![0-9)])|\s+/g,
        recursive: /:(not|has)\((\w+|\*)?([#.](\w|\d)+)*(\:(\w|-)+(\([^\)]+\))?|\[[^\}]+\])*(\s*,\s*(\w+|\*)?([#.](\w|\d)+)*(\:(\w|-)+(\([^\)]+\))?|\[[^\}]+\])*)*\)/gi
    };
    var arrayIt = function (a) {
        if ( !! (window.attachEvent && !window.opera)) {
            return function (a) {
                if (a instanceof Array) {
                    return a
                }
                for (var i = 0, result = [], m; m = a[i++];) {
                    result[result.length] = m
                }
                return result
            }
        } else {
            return function (a) {
                return Array.prototype.slice.call(a)
            }
        }
    }();

    function filter(a, tag) {
        var r = [],
            uids = {};
        if (tag) {
            tag = new RegExp("^" + tag + "$", "i")
        }
        for (var i = 0, ae; ae = a[i++];) {
            ae.uid = ae.uid || _uid++;
            if (!uids[ae.uid] && (!tag || ae.nodeName.search(tag) !== -1)) {
                r[r.length] = uids[ae.uid] = ae
            }
        }
        return r
    }
    function getAttribute(e, a) {
        if (!e) {
            return null
        }
        if (a === "class" || a === "className") {
            return e.className
        }
        if (a === "for") {
            return e.htmlFor
        }
        return e.getAttribute(a) || e[a]
    }
    function getByClass(selector, selectorRE, root, includeRoot, cacheKey, tag, flat) {
        var result = [];
        if ( !! flat) {
            return selectorRE.test(root.className) ? [root] : []
        }
        if (root.getElementsByClassName) {
            result = arrayIt(root.getElementsByClassName(selector));
            if ( !! includeRoot) {
                if (selectorRE.test(root.className)) {
                    result[result.length] = root
                }
            }
            if (tag != "*") {
                result = filter(result, tag)
            }
            cache[cacheKey] = result.slice(0);
            return result
        } else {
            if (doc.getElementsByClassName) {
                result = arrayIt(doc.getElementsByClassName(selector));
                if (tag != "*") {
                    result = filter(result, tag)
                }
                cache[cacheKey] = result.slice(0);
                return result
            }
        }
        var es = (tag == "*" && root.all) ? root.all : root.getElementsByTagName(tag);
        if ( !! includeRoot) {
            es[es.length] = root
        }
        for (var index = 0, e; e = es[index++];) {
            if (selectorRE.test(e.className)) {
                result[result.length] = e
            }
        }
        return result
    }
    function getById(selector, root, includeRoot, cacheKey, tag, flat) {
        var rs, result = [];
        if ( !! flat) {
            return getAttribute(root, "id") === selector ? [root] : []
        }
        if (root.getElementById) {
            rs = root.getElementById(selector)
        } else {
            rs = doc.getElementById(selector)
        }
        if (rs && getAttribute(rs, "id") === selector) {
            result[result.length] = rs;
            cache[cacheKey] = result.slice(0);
            return result
        }
        var es = root.getElementsByTagName(tag);
        if ( !! includeRoot) {
            es[es.length] = root
        }
        for (var index = 0, e; e = es[index++];) {
            if (getAttribute(e, "id") === selector) {
                result[result.length] = e;
                break
            }
        }
        return result
    }
    function getContextFromSequenceSelector(selector, roots, includeRoot, flat) {
        var context, tag, contextType = "",
            result = [],
            tResult = [],
            root, rootCount, rootsLength;
        reg.id.lastIndex = reg.typeSelector.lastIndex = reg.classRE.lastIndex = 0;
        if (!reg.tag.test(selector)) {
            selector = "*" + selector
        }
        context = reg.typeSelector.exec(selector)[1];
        roots = roots instanceof Array ? roots.slice(0) : [roots];
        rootsLength = roots.length;
        rootCount = rootsLength - 1;
        if (reg.id.test(context)) {
            contextType = "id";
            tag = (tag = context.match(/^\w+/)) ? tag[0] : "*";
            context = context.replace(reg.id, "")
        } else {
            if (reg.classRE.test(context)) {
                contextType = "class";
                tag = (tag = context.match(reg.tag)) ? tag[0] : "*";
                context = context.replace(reg.tag, "");
                contextRE = persistCache[context + "RegExp"] || (persistCache[context + "RegExp"] = new RegExp("(?:^|\\s)" + context.replace(/\./g, "\\s*") + "(?:\\s|$)"));
                context = context.replace(/\./g, " ")
            }
        }
        while (rootCount > -1) {
            root = roots[rootCount--];
            root.uid = root.uid || _uid++;
            var cacheKey = selector + root.uid;
            if (cacheOn && cache[cacheKey]) {
                result = result.concat(cache[cacheKey]);
                continue
            }
            if (contextType === "id") {
                tResult = getById(context, root, includeRoot, cacheKey, tag, flat)
            } else {
                if (contextType === "class") {
                    tResult = getByClass(context, contextRE, root, includeRoot, cacheKey, tag, flat)
                } else {
                    tResult = arrayIt(root.getElementsByTagName(context));
                    if ( !! includeRoot && (root.nodeName.toUpperCase() === context.toUpperCase() || context === "*")) {
                        tResult[tResult.length] = root
                    }
                }
            }
            result = rootsLength > 1 ? result.concat(tResult) : tResult;
            cache[cacheKey] = result.slice(0)
        }
        return result
    }
    peppy = {
        query: function (selectorGroups, root, oConf, includeRoot, recursed, flat) {
            if (oConf) {
                cacheOn = oConf.cache
            }
            var elements = [];
            if (!recursed) {
                selectorGroups = selectorGroups.replace(reg.trim, "").replace(/(\[)\s+/g, "$1").replace(/\s+(\])/g, "$1").replace(/(\[[^\] ]+)\s+/g, "$1").replace(/\s+([^ \[]+\])/g, "$1").replace(/(\()\s+/g, "$1").replace(/(\+)([^0-9])/g, "$1 $2").replace(/['"]/g, "").replace(/\(\s*even\s*\)/gi, "(2n)").replace(/\(\s*odd\s*\)/gi, "(2n+1)")
            }
            if (typeof root === "string") {
                root = (root = getContextFromSequenceSelector(root, doc)).length > 0 ? root : undefined
            }
            root = root || doc;
            root.uid = root.uid || _uid++;
            var cacheKey = selectorGroups + root.uid;
            if (cacheOn && cache[cacheKey]) {
                return cache[cacheKey]
            }
            reg.quickTest.lastIndex = 0;
            if (reg.quickTest.test(selectorGroups)) {
                elements = getContextFromSequenceSelector(selectorGroups, root, includeRoot, flat);
                return (cache[cacheKey] = elements.slice(0))
            }
            var groupsWorker, groups, selector, parts = [],
                part;
            groupsWorker = selectorGroups.split(/\s*,\s*/g);
            groups = groupsWorker.length > 1 ? [""] : groupsWorker;
            for (var gwi = 0, tc = 0, gi = 0, g; groupsWorker.length > 1 && (g = groupsWorker[gwi++]) !== undefined;) {
                tc += (((l = g.match(/\(/g)) ? l.length : 0) - ((r = g.match(/\)/g)) ? r.length : 0));
                groups[gi] = groups[gi] || "";
                groups[gi] += (groups[gi] === "" ? g : "," + g);
                if (tc === 0) {
                    gi++
                }
            }
            var gCount = 0;
            while ((selector = groups[gCount++]) !== undefined) {
                reg.quickTest.lastIndex = 0;
                if (reg.quickTest.test(selector)) {
                    result = getContextFromSequenceSelector(selector, root, includeRoot, flat);
                    elements = groups.length > 1 ? elements.concat(result) : result;
                    continue
                }
                reg.combinatorTest.lastIndex = 0;
                if (reg.combinatorTest.test(selector)) {
                    var parts, pLength, pCount = 0,
                        combinators, cLength, cCount = 0,
                        result;
                    parts = selector.split(reg.combinator);
                    pLength = parts.length;
                    combinators = selector.match(reg.combinator) || [""];
                    cLength = combinators.length;
                    while (pCount < pLength) {
                        var c, part1, part2;
                        c = combinators[cCount++].replace(reg.trim, "");
                        part1 = result || peppy.query(parts[pCount++], root, includeRoot, true, flat);
                        part2 = peppy.query(parts[pCount++], c == "" || c == ">" ? part1 : root, c == "" || c == ">", true, flat);
                        result = peppy.queryCombinator(part1, part2, c)
                    }
                    elements = groups.length > 1 ? elements.concat(result) : result;
                    result = undefined
                } else {
                    result = peppy.querySelector(selector, root, includeRoot, flat);
                    elements = groups.length > 1 ? elements.concat(result) : result
                }
            }
            if (groups.length > 1) {
                elements = filter(elements)
            }
            return (cache[cacheKey] = elements.slice(0))
        },
        queryCombinator: function (l, r, c) {
            var result = [],
                uids = {},
                proc = {},
                succ = {},
                fail = {},
                combinatorCheck = peppy.simpleSelector.combinator[c];
            for (var li = 0, le; le = l[li++];) {
                le.uid = le.uid || _uid++;
                uids[le.uid] = le
            }
            for (var ri = 0, re; re = r[ri++];) {
                re.uid = re.uid || _uid++;
                if (!proc[re.uid] && combinatorCheck(re, uids, fail, succ)) {
                    result[result.length] = re
                }
                proc[re.uid] = re
            }
            return result
        },
        querySelector: function (selector, root, includeRoot, flat) {
            var context, passed = [],
                count, totalCount, e, first = true,
                localCache = {};
            context = getContextFromSequenceSelector(selector, root, includeRoot, flat);
            count = context.length;
            totalCount = count - 1;
            var tests, recursive;
            if (/:(not|has)/i.test(selector)) {
                recursive = selector.match(reg.recursive);
                selector = selector.replace(reg.recursive, "")
            }
            if (! (tests = selector.match(/:(\w|-)+(\([^\(]+\))*|\[[^\[]+\]/g))) {
                tests = []
            }
            if (recursive) {
                tests = tests.concat(recursive)
            }
            var aTest;
            while ((aTest = tests.pop()) !== undefined) {
                var pc = persistCache[aTest],
                    testFuncScope, testFunc, testFuncKey, testFuncArgs = [],
                    isTypeTest = false,
                    isCountTest = false;
                passed = [];
                if (pc) {
                    testFuncKey = pc[0];
                    testFuncScope = pc[1];
                    testFuncArgs = pc.slice(2);
                    testFunc = testFuncScope[testFuncKey]
                } else {
                    if (! (/^:/.test(aTest))) {
                        var n = aTest.match(reg.attributeName);
                        var v = aTest.match(reg.attributeValue);
                        testFuncArgs[1] = n[1] || n[0];
                        testFuncArgs[2] = v ? v[1] : "";
                        testFuncKey = "" + aTest.match(/[~!+*\^$|=]/);
                        testFuncScope = peppy.simpleSelector.attribute;
                        testFunc = testFuncScope[testFuncKey];
                        persistCache[aTest] = [testFuncKey, testFuncScope].concat(testFuncArgs)
                    } else {
                        var pa = aTest.match(reg.pseudoArgs);
                        testFuncArgs[1] = pa ? pa[1] : "";
                        testFuncKey = aTest.match(reg.pseudoName)[1];
                        testFuncScope = peppy.simpleSelector.pseudos;
                        if (/nth-(?!.+only)/i.test(aTest)) {
                            var a, b, nArg = testFuncArgs[1],
                                nArgPC = persistCache[nArg];
                            if (nArgPC) {
                                a = nArgPC[0];
                                b = nArgPC[1]
                            } else {
                                var nParts = nArg.match(reg.nthParts);
                                if (nParts) {
                                    a = parseInt(nParts[1], 10) || 0;
                                    b = parseInt(nParts[3], 10) || 0;
                                    if (/^\+n|^n/i.test(nArg)) {
                                        a = 1
                                    } else {
                                        if (/^-n/i.test(nArg)) {
                                            a = -1
                                        }
                                    }
                                    testFuncArgs[2] = a;
                                    testFuncArgs[3] = b;
                                    persistCache[nArg] = [a, b]
                                }
                            }
                        } else {
                            if (/^:contains/.test(aTest)) {
                                var cArg = testFuncArgs[1];
                                var cArgPC = persistCache[cArg];
                                if (cArgPC) {
                                    testFuncArgs[1] = cArgPC
                                } else {
                                    testFuncArgs[1] = persistCache[cArg] = new RegExp(cArg)
                                }
                            }
                        }
                        testFunc = testFuncScope[testFuncKey];
                        persistCache[aTest] = [testFuncKey, testFuncScope].concat(testFuncArgs)
                    }
                }
                isTypeTest = /:(\w|-)+type/i.test(aTest);
                isCountTest = /^:(nth[^-]|eq|gt|lt|first|last)/i.test(aTest);
                if (isCountTest) {
                    testFuncArgs[3] = totalCount
                }
                var cLength = context.length,
                    cCount = cLength - 1;
                while (cCount > -1) {
                    e = context[cCount--];
                    if (first) {
                        e.peppyCount = cCount + 1
                    }
                    var pass = true;
                    testFuncArgs[0] = e;
                    if (isCountTest) {
                        testFuncArgs[2] = e.peppyCount
                    }
                    if (!testFunc.apply(testFuncScope, testFuncArgs)) {
                        pass = false
                    }
                    if (pass) {
                        passed.push(e)
                    }
                }
                context = passed;
                first = false
            }
            return passed
        },
        simpleSelector: {
            attribute: {
                "null": function (e, a, v) {
                    return !!getAttribute(e, a)
                },
                "=": function (e, a, v) {
                    return getAttribute(e, a) == v
                },
                "~": function (e, a, v) {
                    return getAttribute(e, a).match(new RegExp("\\b" + v + "\\b"))
                },
                "^": function (e, a, v) {
                    return getAttribute(e, a).indexOf(v) === 0
                },
                "$": function (e, a, v) {
                    var attr = getAttribute(e, a);
                    return attr.lastIndexOf(v) === attr.length - v.length
                },
                "*": function (e, a, v) {
                    return getAttribute(e, a).indexOf(v) != -1
                },
                "|": function (e, a, v) {
                    return getAttribute(e, a).match("^" + v + "-?((" + v + "-)*(" + v + "$))*")
                },
                "!": function (e, a, v) {
                    return getAttribute(e, a) !== v
                }
            },
            pseudos: {
                ":root": function (e) {
                    return e === doc.getElementsByTagName("html")[0] ? true : false
                },
                ":nth-child": function (e, n, a, b, t) {
                    if (!e.nodeIndex) {
                        var node = e.parentNode.firstChild,
                            count = 0,
                            last;
                        for (; node; node = node.nextSibling) {
                            if (node.nodeType == 1) {
                                last = node;
                                node.nodeIndex = ++count
                            }
                        }
                        last.IsLastNode = true;
                        if (count == 1) {
                            last.IsOnlyChild = true
                        }
                    }
                    var position = e.nodeIndex;
                    if (n == "first") {
                        return position == 1
                    }
                    if (n == "last") {
                        return !!e.IsLastNode
                    }
                    if (n == "only") {
                        return !!e.IsOnlyChild
                    }
                    return (!a && !b && position == n) || ((a == 0 ? position == b : a > 0 ? position >= b && (position - b) % a == 0 : position <= b && (position + b) % a == 0))
                },
                ":nth-last-child": function (e, n) {
                    return this[":nth-child"](e, n, a, b)
                },
                ":nth-of-type": function (e, n, t) {
                    return this[":nth-child"](e, n, a, b, t)
                },
                ":nth-last-of-type": function (e, n, t) {
                    return this[":nth-child"](e, n, a, b, t)
                },
                ":first-child": function (e) {
                    return this[":nth-child"](e, "first")
                },
                ":last-child": function (e) {
                    return this[":nth-child"](e, "last")
                },
                ":first-of-type": function (e, n, t) {
                    return this[":nth-child"](e, "first", null, null, t)
                },
                ":last-of-type": function (e, n, t) {
                    return this[":nth-child"](e, "last", null, null, t)
                },
                ":only-child": function (e) {
                    return this[":nth-child"](e, "only")
                },
                ":only-of-type": function (e, n, t) {
                    return this[":nth-child"](e, "only", null, null, t)
                },
                ":empty": function (e) {
                    for (var node = e.firstChild, count = 0; node !== null; node = node.nextSibling) {
                        if (node.nodeType === 1 || node.nodeType === 3) {
                            return false
                        }
                    }
                    return true
                },
                ":not": function (e, s) {
                    return peppy.query(s, e, true, true, true).length === 0
                },
                ":has": function (e, s) {
                    return peppy.query(s, e, true, true, true).length > 0
                },
                ":selected": function (e) {
                    return e.selected
                },
                ":hidden": function (e) {
                    return e.type === "hidden" || e.style.display === "none"
                },
                ":visible": function (e) {
                    return e.type !== "hidden" && e.style.display !== "none"
                },
                ":input": function (e) {
                    return e.nodeName.search(/input|select|textarea|button/i) !== -1
                },
                ":radio": function (e) {
                    return e.type === "radio"
                },
                ":checkbox": function (e) {
                    return e.type === "checkbox"
                },
                ":text": function (e) {
                    return e.type === "text"
                },
                ":header": function (e) {
                    return e.nodeName.search(/h\d/i) !== -1
                },
                ":enabled": function (e) {
                    return !e.disabled && e.type !== "hidden"
                },
                ":disabled": function (e) {
                    return e.disabled
                },
                ":checked": function (e) {
                    return e.checked
                },
                ":contains": function (e, s) {
                    return s.test((e.textContent || e.innerText || ""))
                },
                ":parent": function (e) {
                    return !!e.firstChild
                },
                ":odd": function (e) {
                    return this[":nth-child"](e, "2n+2", 2, 2)
                },
                ":even": function (e) {
                    return this[":nth-child"](e, "2n+1", 2, 1)
                },
                ":nth": function (e, s, i) {
                    return s == i
                },
                ":eq": function (e, s, i) {
                    return s == i
                },
                ":gt": function (e, s, i) {
                    return i > s
                },
                ":lt": function (e, s, i) {
                    return i < s
                },
                ":first": function (e, s, i) {
                    return i == 0
                },
                ":last": function (e, s, i, end) {
                    return i == end
                }
            },
            combinator: {
                "": function (r, u, f, s) {
                    var rUID = r.uid;
                    while ((r = r.parentNode) !== null && !f[r.uid]) {
                        if ( !! u[r.uid] || !!s[r.uid]) {
                            return (s[rUID] = true)
                        }
                    }
                    return (f[rUID] = false)
                },
                ">": function (r, u, f, s) {
                    return r.parentNode && u[r.parentNode.uid]
                },
                "+": function (r, u, f, s) {
                    while ((r = r.previousSibling) !== null && !f[r.uid]) {
                        if (r.nodeType === 1) {
                            return r.uid in u
                        }
                    }
                    return false
                },
                "~": function (r, u, f, s) {
                    var rUID = r.uid;
                    while ((r = r.previousSibling) !== null && !f[r.uid]) {
                        if ( !! u[r.uid] || !!s[r.uid]) {
                            return (s[rUID] = true)
                        }
                    }
                    return (f[rUID] = false)
                }
            }
        }
    };
    YAHOO.EU.Shopping.peppy = peppy;
    if (doc.querySelectorAll) {
        (function () {
            var oldpeppy = peppy.query;
            peppy.query = function (sel, context) {
                context = context || doc;
                if (context === doc) {
                    try {
                        return context.querySelectorAll(sel)
                    } catch(e) {}
                }
                return oldpeppy.apply(oldpeppy, arrayIt(arguments))
            }
        })()
    } else {
        var aEvent = doc.addEventListener || doc.attachEvent;

        function clearCache() {
            cache = {}
        }
        aEvent("DOMAttrModified", clearCache, false);
        aEvent("DOMNodeInserted", clearCache, false);
        aEvent("DOMNodeRemoved", clearCache, false)
    }
})();

YAHOO.namespace("YAHOO.EU.Shopping");
YAHOO.EU.Shopping.selectors = {
    defaultConf: null,
    Peppy: function (className, tag, root, apply, oConf) {
        if ((tag != null) || (tag != undefined)) {
            var selector = tag + "." + className
        } else {
            var selector = "." + className
        }
        var aResults = YAHOO.EU.Shopping.peppy.query(selector, root, oConf);
        if (apply) {
            for (var i = aResults.length - 1; i >= 0; i--) {
                apply.call(aResults[i], aResults[i])
            }
        }
        return aResults
    },
    YUI: function (className, tag, root, apply, oConf) {
        if (!apply) {
            return YAHOO.util.Dom.getElementsByClassName2(className, tag, root, apply)
        } else {
            YAHOO.util.Dom.getElementsByClassName2(className, tag, root, apply)
        }
    },
    autoConf: function () {
        if (YAHOO.env.ua.ie == 6) {
            return {
                fn: YAHOO.EU.Shopping.selectors.Peppy,
                cache: false,
                Prio: 0,
                event: undefined
            }
        } else {
            return {
                fn: YAHOO.EU.Shopping.selectors.Peppy,
                cache: true,
                Prio: 0,
                event: undefined
            }
        }
    }
};
YAHOO.EU.Shopping.selectors.defaultConf = YAHOO.EU.Shopping.selectors.autoConf();
YAHOO.util.Dom.getElementsByClassName = function (className, tag, root, apply, oConf) {
    return (YAHOO.EU.Shopping.selectors.defaultConf).fn(className, tag, root, apply)
};

function uxViewLink(sBase64, bOpenInPopup) {
    var sUrl = uxDecode64(sBase64);
    uxViewDecodedLink(sUrl, bOpenInPopup)
}
function uxViewDecodedLink(sUrl, bOpenInPopup) {
    if (bOpenInPopup) {
        var op = "scrollbars=yes,toolbar=yes,location=yes,directories=yes,menubar=yes,resizable=yes,status=yes,width=800,height=500";
        window.open(sUrl, "", op)
    } else {
        window.location.href = sUrl
    }
}
function uxDecode64(sBase64) {
    var kk_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    var output = "";
    var i = 0;
    sBase64 = sBase64.replace(/-/g, "+").replace(/_/g, "=").replace(/\./g, "/");
    if (sBase64.match("/[^A-Za-z0-9+\\/=]/")) {
        return ""
    }
    do {
        enc1 = kk_keyStr.indexOf(sBase64.charAt(i++));
        enc2 = kk_keyStr.indexOf(sBase64.charAt(i++));
        enc3 = kk_keyStr.indexOf(sBase64.charAt(i++));
        enc4 = kk_keyStr.indexOf(sBase64.charAt(i++));
        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;
        output += String.fromCharCode(chr1);
        if (enc3 != 64) {
            output += String.fromCharCode(chr2)
        }
        if (enc4 != 64) {
            output += String.fromCharCode(chr3)
        }
        chr1 = chr2 = chr3 = enc1 = enc2 = enc3 = enc4 = ""
    } while (i < sBase64.length);
    return output
}
function uxStoreRefererCookie() {
    var sUrl = unescape(document.location.href);
    YAHOO.EU.Shopping.cookie.set("Referer", sUrl, 1)
}
function uxTrvVisit(sProductId) {
    var form = YAHOO.util.Dom.get("lvl-form-" + sProductId);
    if (YAHOO.lang.isObject(form)) {
        if (YAHOO.lang.isObject(form.mode)) {
            form.mode.value = "buy"
        }
        if ((arguments.length > 1) && arguments[1]) {
            form.target = "_blank"
        }
        YAHOO.EU.Shopping.Results.validateDateForm(null, form)
    }
}
function kk_link(sUrl) {
    uxViewLink(sUrl)
}
function kk_link3(sUrl) {
    uxViewLink(sUrl)
}
function kk_afficheCommande3(sUrl) {
    uxViewLink(sUrl, true)
}
function kk_afficheCommande(sUrl) {
    uxViewDecodedLink(sUrl, true)
}
function kk_go3(sUrl) {
    uxViewLink(sUrl)
}
function kk_viewMerchant3(sUrl) {
    uxViewLink(sUrl, true)
}
function addBookmark() {
    var bookmarkURL = window.document.URL;
    var bookmarkTitle = window.document.title;
    if (window.ActiveXObject) {
        window.external.AddFavorite(bookmarkURL, bookmarkTitle)
    } else {
        if (navigator.userAgent.indexOf("Opera") != -1) {
            alert(YAHOO.EU.Shopping.locale.bookmarkMsg.replace(/\{0\}/, "CTRL + T"))
        } else {
            alert(YAHOO.EU.Shopping.locale.bookmarkMsg.replace(/\{0\}/, "CTRL + D"))
        }
    }
};

YAHOO.namespace("YAHOO.EU.Shopping");
YAHOO.EU.Shopping.linkTracking = {
    getTrackerLink: function (h, strModuleId) {
        return YAHOO.EU.Shopping.config.tracking.baseUrl + "/" + strModuleId + "/*" + h
    },
    addLinkTracking: function () {
        var rg = new RegExp(YAHOO.EU.Shopping.config.tracking.uastring);
        if (!rg.exec(navigator.userAgent)) {
            var strModuleId = this.id;
            if (strModuleId) {
                var mod = document.getElementById(strModuleId);
                var arrLinks = mod.getElementsByTagName("a");
                var sHost = window.location.host;
                for (var i = 0, j = arrLinks.length;
                i < j; i++) {
                    var sHref = arrLinks[i].getAttribute("href");
                    if (!sHref || sHref.indexOf("javascript:") > -1 || sHref.substring(0, 1) == "#") {
                        continue
                    }
                    var sHref = (sHref.indexOf("http") == -1) ? "http://" + sHost + sHref : sHref;
                    var newhref = YAHOO.EU.Shopping.linkTracking.getTrackerLink(sHref, strModuleId);
                    arrLinks[i].setAttribute("href", newhref)
                }
            }
        }
    },
    trackUxActions: function (url) {
        var objTransaction = YAHOO.util.Get.script(url, {
            onSuccess: function () {},
            onFailure: function () {}
        })
    },
    addTracking: function (aElmId) {
        for (var i = 0, j = aElmId.length;
        i < j; i++) {
            YAHOO.util.Event.onContentReady(aElmId[i], YAHOO.EU.Shopping.linkTracking.addLinkTracking)
        }
    },
    formToData: function (formId) {
        function urlencode(url) {
            url = escape(url);
            url = url.replace(/\+/g, "%2B");
            url = url.replace(/%20/g, "+");
            return url
        }
        var strData = "";
        var srcform = (typeof(formId) != "object") ? document.forms[formId] : formId;
        for (var i = 0, j = srcform.elements.length; i < j; i++) {
            var obj = srcform.elements[i];
            if (obj && !obj.disabled && obj.name) {
                if (obj.type == "select-one" || obj.type == "select-multi") {
                    for (var k = 0, l = obj.options.length;
                    k < l; k++) {
                        var opts = obj.options[k];
                        if (obj.options[k].selected) {
                            strData += obj.name + "=" + urlencode((obj.options[k].value || obj.options[k].text)) + "&"
                        }
                    }
                } else {
                    if (obj.type == "radio" || obj.type == "checkbox") {
                        if (obj.checked === true) {
                            strData += obj.name + "=" + urlencode(obj.value) + "&"
                        }
                    } else {
                        strData += obj.name + "=" + urlencode(obj.value) + "&"
                    }
                }
            }
        }
        return strData.slice(0, -1)
    },
    searchTracking: function (e) {
        var f = document.getElementById("search");
        var sHost = window.location.host;
        var sFormAction = f.getAttribute("action");
        if (sFormAction.indexOf("http") == -1) {
            sFormAction = "http://" + sHost + sFormAction
        }
        var oSearchInput = document.getElementById("s");
        YAHOO.util.Event.stopEvent(e);
        if (oSearchInput.value != "") {
            var q = YAHOO.EU.Shopping.linkTracking.formToData(f);
            var qstr = sFormAction + "?" + q;
            var tlink = YAHOO.EU.Shopping.linkTracking.getTrackerLink(qstr, YAHOO.EU.Shopping.config.tracking.productsearchId);
            window.location = tlink
        } else {
            oSearchInput.focus()
        }
    }
};
if (window.location.pathname == "/" && YAHOO.EU.Shopping.config.tracking.bEnabled === true && YAHOO.EU.Shopping.config.tracking.baseUrl != "") {
    YAHOO.EU.Shopping.linkTracking.addTracking(YAHOO.EU.Shopping.config.tracking.aModuleIds);
    YAHOO.util.Event.onContentReady("search", function () {
        YAHOO.util.Event.addListener("search", "submit", YAHOO.EU.Shopping.linkTracking.searchTracking)
    })
};

(function () {
    YAHOO.namespace("YAHOO.EU.Shopping.Flags")
})();

YAHOO.namespace("YAHOO.Kelkoo");
YAHOO.Kelkoo.Tabs = function (oConf) {
    var oDefaultConf = {
        contentsTabs: {
            c: {
                id: "tab-c",
                modules: ["c-cont"]
            },
            e: {
                id: "tab-e",
                modules: ["e-cont"]
            },
            u: {
                id: "tab-u",
                modules: ["u-cont"]
            },
            specs: {
                id: "tab-specs",
                modules: ["specs-cont"]
            }
        },
        defaultSelected: "c",
        queryString: "tab",
        sTabHistoryName: "selectedTab",
        sLinksClassName: "mini-links",
        self: this,
        hashSelection: null,
        initSection: null,
        bookmarkedSection: null,
        currentParam: null,
        sCustomClassName: ""
    };
    var self = this;
    var aAnchors = [];
    this.init = function (oConf) {
        this.createEvent("tabChange");
        if (oConf) {
            oDefaultConf.queryString = oConf.queryString;
            oDefaultConf.currentParam = YAHOO.util.History.getQueryStringParameter(oDefaultConf.queryString);
            oDefaultConf.contentsTabs = oConf.contentsTabs;
            oDefaultConf.defaultSelected = oConf.defaultSelected;
            oDefaultConf.sTabHistoryName = (oConf.sTabHistoryName) ? oConf.sTabHistoryName : oDefaultConf.sTabHistoryName;
            oDefaultConf.sCustomClassName = (oConf.sCustomClassName) ? oConf.sCustomClassName : "";
            oDefaultConf.sLinksClassName = (oConf.sLinksClassName) ? oConf.sLinksClassName : oDefaultConf.sLinksClassName
        }
        this.updateTabsLinks(oDefaultConf.queryString);
        oDefaultConf.bookmarkedSection = YAHOO.util.History.getBookmarkedState(oDefaultConf.sTabHistoryName);
        oDefaultConf.hashSelection = window.location.hash.substr(1);
        oDefaultConf.initSection = oDefaultConf.bookmarkedSection || oDefaultConf.currentParam || oDefaultConf.hashSelection || oDefaultConf.defaultSelected;
        YAHOO.util.History.register(oDefaultConf.sTabHistoryName, oDefaultConf.initSection, function (state) {
            self.changeTab(state)
        });
        YAHOO.util.History.onReady(function () {
            self.attachEvents()
        });
        try {
            YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
            this.changeTab(oDefaultConf.initSection)
        } catch(e) {
            this.changeTab(oDefaultConf.initSection)
        }
        self.fireEvent("tabChange", {
            tabName: oDefaultConf.initSection
        })
    };
    this.updateTabsLinks = function (queryString) {
        for (anchor in oDefaultConf.contentsTabs) {
            aAnchors.push(document.getElementById(oDefaultConf.contentsTabs[anchor]["id"]))
        }
        var aLinks = YAHOO.util.Dom.getElementsByClassName(oDefaultConf.sLinksClassName, "a");
        for (var i = 0; i < aLinks.length; i++) {
            aAnchors.push(aLinks[i])
        }
        var productsContainer = document.getElementById("pop-products");
        if (productsContainer) {
            var aInfoSite = YAHOO.util.Dom.getElementsByClassName("uid", "a", "pop-products");
            for (var i = 0; i < aInfoSite.length; i++) {
                aAnchors.push(aInfoSite[i])
            }
            var aReviews = YAHOO.util.Dom.getElementsByClassName("reviews", "span", "pop-products");
            for (var i = aReviews.length - 1; i >= 0; i--) {
                aAnchors.push(aReviews[i].getElementsByTagName("a")[0])
            }
        }
        for (var i = aAnchors.length - 1; i >= 0; i--) {
            if (aAnchors[i]) {
                aAnchors[i].href = "?" + queryString + "=" + aAnchors[i].hash.replace("#", "")
            }
        }
    };
    this.changeTab = function (selectedTab) {
        for (var sTabKey in oDefaultConf.contentsTabs) {
            var sTab = oDefaultConf.contentsTabs[sTabKey];
            var sCustomClassName = (oDefaultConf.sCustomClassName) ? oDefaultConf.sCustomClassName : "";
            var sClassName = (sTabKey == selectedTab) ? "active " + sCustomClassName : "";
            var tabChild = document.getElementById(sTab.id);
            var tab = (tabChild) ? tabChild.parentNode : null;
            if (tab) {
                tab.className = sClassName
            }
            var aContentsIds = sTab.modules;
            for (var i = aContentsIds.length - 1; i >= 0; i--) {
                if (sTabKey != selectedTab) {
                    YAHOO.util.Dom.addClass(aContentsIds[i], "hide")
                } else {
                    YAHOO.util.Dom.removeClass(aContentsIds[i], "hide")
                }
            }
            aTabModules = YAHOO.util.Dom.getElementsByClassName("mod-" + sTab.id);
            if (aTabModules.length > 0) {
                for (var i = 0; i <= aAnchors.length; i++) {
                    if (sTabKey != selectedTab) {
                        YAHOO.util.Dom.addClass(aTabModules[i], "hide")
                    } else {
                        YAHOO.util.Dom.removeClass(aTabModules[i], "hide")
                    }
                }
            }
        }
    };
    this.attachEvents = function () {
        var i, len, anchor, href, selectedTab, currentSection;
        for (var i = aAnchors.length - 1; i >= 0; i--) {
            var el = aAnchors[i];
            YAHOO.util.Event.addListener(el, "click", function (event) {
                YAHOO.util.Event.preventDefault(event);
                var selectedTab = this.href.split("=")[1];
                try {
                    YAHOO.util.History.navigate(oDefaultConf.sTabHistoryName, selectedTab)
                } catch(e) {
                    self.changeTab(selectedTab)
                }
                self.fireEvent("tabChange", {
                    tabName: selectedTab
                })
            })
        }
        currentSection = YAHOO.util.History.getCurrentState(oDefaultConf.sTabHistoryName);
        this.changeTab(currentSection)
    };
    YAHOO.lang.augmentProto(YAHOO.Kelkoo.Tabs, YAHOO.util.EventProvider);
    this.init(oConf)
};
YAHOO.EU.Shopping.Autotab = {
    config: {
        sMainContainer: "hot-products",
        sTabContainerElType: "div",
        sHeaderElType: "h2",
        sTabbedExtraClass: ""
    },
    init: function () {
        if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
            var jsperfid = YAHOO.YUIKK.JSPT.mark("YAHOO.EU.Shopping.Autotab.init");
            var jsperfused = -1
        }
        var oCnf = YAHOO.EU.Shopping.Autotab.config;
        var oMainContainer = document.getElementById(oCnf.sMainContainer);
        if (oCnf.sTabbedExtraClass && oCnf.sTabbedExtraClass != "") {
            YAHOO.util.Dom.addClass(oMainContainer, oCnf.sTabbedExtraClass)
        }
        var aTabContents = YAHOO.util.Dom.getElementsByClassName("tab-cont", oCnf.sTabContainerElType, oMainContainer);
        var oTabsContainer = document.createElement("div");
        oTabsContainer.className = "tabs";
        var oTabs = document.createElement("ul");
        oTabsContainer.appendChild(oTabs);
        oMainContainer.insertBefore(oTabsContainer, oMainContainer.firstChild);
        var aHeaders = oMainContainer.getElementsByTagName(oCnf.sHeaderElType);
        YAHOO.util.Dom.addClass(aHeaders, "acchide");
        if (aTabContents.length > 0) {
            jsperfused = 1
        }
        for (var i = 0, j = aTabContents.length; i < j; i++) {
            var oTabLi = document.createElement("li");
            if (i == 0) {
                YAHOO.util.Dom.addClass(oTabLi, "active");
                YAHOO.util.Dom.addClass(oTabLi, "first")
            }
            if (i == (j - 1)) {
                YAHOO.util.Dom.addClass(oTabLi, "last")
            }
            var oTabLiLnk = document.createElement("span");
            oTabLiLnk.style.cursor = "pointer";
            var oTabLiLnkTxt = document.createTextNode(aHeaders[i].innerHTML);
            oTabLiLnk.appendChild(oTabLiLnkTxt);
            oTabLi.appendChild(oTabLiLnk);
            oTabs.appendChild(oTabLi);
            var oParams = {
                oTargetCont: aTabContents[i],
                aTabConts: aTabContents,
                aHeaders: aHeaders,
                oHeader: aHeaders[i],
                oTabList: oTabs.getElementsByTagName("li")
            };
            YAHOO.util.Event.addListener(oTabLiLnk, "click", YAHOO.EU.Shopping.Autotab.switchClass, oParams);
            YAHOO.util.Event.addListener(oTabLiLnk, "mouseup", YAHOO.EU.Shopping.Autotab.switchClass, oParams);
            YAHOO.util.Event.addListener(oTabLiLnk, "click", YAHOO.EU.Shopping.Autotab.switchClass, oParams);
            if (i != 0) {
                YAHOO.util.Dom.addClass(aTabContents[i], "hide")
            }
        }
        if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
            YAHOO.YUIKK.JSPT.unmark(jsperfid, jsperfused)
        }
    },
    switchClass: function (e, myParams) {
        YAHOO.util.Event.stopEvent(e);
        if (YAHOO.util.Dom.hasClass(this.parentNode, "active")) {
            if (!YAHOO.util.Event.isIE) {
                myParams.oHeader.focus()
            }
            return true
        } else {
            for (var i = 0; i < myParams.oTabList.length; i++) {
                YAHOO.util.Dom.removeClass(myParams.oTabList[i], "active");
                YAHOO.util.Dom.addClass(myParams.aTabConts[i], "hide")
            }
            YAHOO.util.Dom.addClass(this.parentNode, "active");
            YAHOO.util.Dom.removeClass(myParams.oTargetCont, "hide");
            if (!YAHOO.util.Event.isIE) {
                myParams.oHeader.focus()
            }
        }
    },
    compatHasAttribute: function (objEl, attr) {
        if (objEl.hasAttribute) {
            return objEl.hasAttribute(attr)
        } else {
            var attributes = objEl.attributes;
            for (i = 0, j = attributes.length; i < j; i++) {
                if (objEl.attributes[i].nodeName == attr) {
                    return true
                }
            }
        }
        return false
    }
};

YAHOO.namespace("YAHOO.EU.widget.Carousel");
YAHOO.namespace("YAHOO.EU.Shopping");
YAHOO.EU.widget.Carousel = function (oConfig) {
    this.oContainer = (typeof oConfig.vContainer == "string") ? document.getElementById(oConfig.vContainer) : oConfig.vContainer;
    this.oCarousel = YAHOO.util.Dom.getElementsByClassName("carousel", "ul", this.oContainer)[0];
    this.sLoopMode = oConfig.sLoopMode || null;
    this.iNumSlidesVisible = oConfig.iNumSlidesVisible || 1;
    this.iSlideAdvance = oConfig.iSlideAdvance || 1;
    this.aSlides = this.getSlides(this.oCarousel);
    this.iNumSlides = this.aSlides.length;
    this.bRandomStart = oConfig.bRandomStart || false;
    this.iCurrentSlide = (this.bRandomStart) ? this.getRandomStart() : 0;
    this.sJsEnabledClass = oConfig.sJsEnabledClass || "js";
    this.sAspect = oConfig.sAspect || "horizontal";
    this.nAnimDuration = oConfig.nAnimDuration || 0.5;
    this.oAnimation = new YAHOO.util.Anim(this.oCarousel);
    this.bAutoPlay = oConfig.bAutoPlay || false;
    this.iAutoPlayCount = oConfig.iAutoPlayCount || -1;
    this.iAutoPlayInterval = oConfig.iAutoPlayInterval || 2000;
    this.oPagination = oConfig.oPagination || false;
    this.oControls = oConfig.oControls || false;
    this.vElmNextSlide = oConfig.vElmNextSlide || null;
    this.vElmPrevSlide = oConfig.vElmPrevSlide || null;
    this.createCarousel();
    return this
};
YAHOO.EU.widget.Carousel.prototype = {
    getRandomStart: function () {
        return (((Math.floor(Math.random() * (this.iNumSlides / this.iSlideAdvance) + 1)) - 1) * this.iSlideAdvance)
    },
    createCarousel: function () {
        if (this.oContainer) {
            YAHOO.util.Dom.setStyle(this.oContainer, "position", "relative");
            YAHOO.util.Dom.setStyle(this.oContainer, "overflow", "hidden");
            this.oCarouselRegion = YAHOO.util.Dom.getRegion(this.oContainer);
            YAHOO.util.Dom.addClass(this.oContainer, this.sJsEnabledClass);
            if (this.sLoopMode == "continuous") {
                var firstSlide = this.aSlides[0];
                for (var i = 0; i < this.iNumSlidesVisible; i++) {
                    var j = this.aSlides[i].cloneNode(true);
                    var k = this.aSlides[(this.iNumSlides - 1) - i].cloneNode(true);
                    this.oCarousel.appendChild(j);
                    this.oCarousel.insertBefore(k, firstSlide);
                    firstSlide = k
                }
            }
            switch (this.sAspect) {
            case "horizontal":
                var horizPadding = parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "paddingLeft")) + parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "paddingRight")) + parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "borderLeftWidth")) + parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "borderRightWidth"));
                this.iCarouselWidth = this.oCarouselRegion.right - this.oCarouselRegion.left - horizPadding;
                this.nMovement = (this.iCarouselWidth / this.iNumSlidesVisible);
                break;
            case "vertical":
                var vertPadding = parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "paddingTop")) + parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "paddingBottom")) + parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "borderTopWidth")) + parseInt(YAHOO.util.Dom.getStyle(this.oContainer, "borderBottomWidth"));
                this.iCarouselHeight = this.oCarouselRegion.top - this.oCarouselRegion.bottom - vertPadding;
                this.nMovement = (this.iCarouselHeight / this.iNumSlidesVisible);
                break
            }
            if (this.sLoopMode == "continuous" && !this.bRandomStart) {
                this.toSlide(0, 0)
            }
            if (this.bRandomStart) {
                this.toSlide(this.iCurrentSlide, 0)
            }
            if (this.bAutoPlay) {
                var that = this;
                this.autoPlayTimer = setInterval(function () {
                    if (that.iAutoPlayCount > -1 && that.iAutoPlayCount > 0) {
                        that.iAutoPlayCount--;
                        that.next()
                    } else {
                        if (that.iAutoPlayCount == -1) {
                            that.next()
                        } else {
                            clearInterval(that.autoPlayTimer)
                        }
                    }
                },
                this.iAutoPlayInterval)
            }
        }
        if (this.vElmPrevSlide) {
            YAHOO.util.Event.onAvailable(this.vElmPrevSlide, function (e) {
                YAHOO.util.Event.addListener(this.vElmPrevSlide, "click", this.previous, this, true)
            },
            this, true)
        }
        if (this.vElmNextSlide) {
            YAHOO.util.Event.onAvailable(this.vElmNextSlide, function (e) {
                YAHOO.util.Event.addListener(this.vElmNextSlide, "click", this.next, this, true)
            },
            this, true)
        }
        this.onFarEnd = new YAHOO.util.CustomEvent("onFarEnd");
        this.onNearEnd = new YAHOO.util.CustomEvent("onNearEnd");
        if (this.oPagination || this.oControls) {
            this.buildControls()
        }
        if (this.oPagination) {
            this.updatePagination()
        }
    },
    buildControls: function () {
        var insertControls = function (oElm, vRef, sInsertionMethod, o) {
            var vRef = document.getElementById(vRef);
            switch (sInsertionMethod) {
            case "before":
                if (vRef) {
                    var oParent = document.getElementById(vRef).parentNode
                }
                if (oParent && vRef) {
                    oParent.insertBefore(oElm, vRef)
                }
                break;
            case "after":
                if (vRef) {
                    YAHOO.util.Dom.insertAfter(oElm, vRef)
                }
                break;
            case "append":
            default:
                if (vRef) {
                    vRef.appendChild(oElm)
                }
                break
            }
        };
        if (this.oControls) {
            var ul = document.createElement("ul");
            if (this.oControls.sId) {
                ul.id = this.oControls.sId
            }
            YAHOO.util.Dom.addClass(ul, this.oControls.sClassName);
            var next = document.createElement("a");
            var prev = document.createElement("a");
            next.href = "#";
            prev.href = "#";
            next.className = "next";
            prev.className = "prev";
            next.appendChild(document.createTextNode(this.oControls.sNextTxt));
            prev.appendChild(document.createTextNode(this.oControls.sPrevTxt));
            var li = document.createElement("li");
            var li2 = document.createElement("li");
            li.appendChild(prev);
            li2.appendChild(next);
            YAHOO.util.Event.addListener(next, "click", function (e) {
                this.next(e)
            },
            this, true);
            YAHOO.util.Event.addListener(prev, "click", function (e) {
                this.previous(e)
            },
            this, true);
            ul.appendChild(li);
            ul.appendChild(li2);
            insertControls(ul, this.oControls.vRef, this.oControls.sInsertion, this)
        }
        if (this.oPagination) {
            this.nPageItems = Math.ceil(this.iNumSlides / this.iSlideAdvance);
            var sPageText = this.oPagination.sPageText || "Page";
            var ol = document.createElement("ol");
            this.oAnimation.onComplete.subscribe(this.updatePagination, this, true);
            if (this.oPagination.sId) {
                ol.id = this.oPagination.sId
            }
            if (this.oPagination.sClassName) {
                ol.className = this.oPagination.sClassName
            }
            for (var i = 0, j = this.nPageItems; i < j; i++) {
                var li = document.createElement("li");
                var a = document.createElement("a");
                var sp = document.createElement("span");
                a.href = "#";
                var txt = document.createTextNode(sPageText + (i + 1));
                a.appendChild(txt);
                a.className = "_" + (i * this.iSlideAdvance);
                li.appendChild(a);
                ol.appendChild(li)
            }
            YAHOO.util.Event.addListener(ol, "click", function (e) {
                var target = YAHOO.util.Event.getTarget(e);
                if (this.oAnimation.isAnimated()) {
                    return
                }
                if (target.nodeName.toLowerCase() == "a") {
                    this.toSlide(target.className.substring(1))
                }
                YAHOO.util.Event.preventDefault(e)
            },
            this, true);
            insertControls(ol, this.oPagination.vRef, this.oPagination.sInsertion, this);
            this.oControlsOl = ol
        }
    },
    updatePagination: function () {
        if (this.oPagination && this.oControlsOl) {
            this.aLis = this.oControlsOl.getElementsByTagName("li");
            for (var i = 0, j = this.aLis.length; i < j; i++) {
                if ((i == 0) ? i == this.iCurrentSlide : i * this.iSlideAdvance == this.iCurrentSlide) {
                    YAHOO.util.Dom.addClass(this.aLis[i], "active")
                } else {
                    YAHOO.util.Dom.removeClass(this.aLis[i], "active")
                }
            }
        }
    },
    getSlides: function (oCarousel) {
        var aSlides = [];
        if (oCarousel.hasChildNodes()) {
            for (var i = 0, j = oCarousel.childNodes.length; i < j; i++) {
                if (oCarousel.childNodes[i].nodeName.toLowerCase() == "li") {
                    aSlides.push(oCarousel.childNodes[i])
                }
            }
            return aSlides
        } else {
            return false
        }
    },
    advanceRelative: function (nSlide) {
        this.iToAdvance = (+this.iCurrentSlide + (nSlide * this.iSlideAdvance));
        this.flip = function () {
            if (this.iToAdvance > (this.iNumSlides - this.iSlideAdvance)) {
                this.toSlide(this.iToAdvance - this.iNumSlides, 0);
                this.oAnimation.onComplete.unsubscribe(this.flip)
            } else {
                if (this.iToAdvance < 0) {
                    this.toSlide(this.iToAdvance + this.iNumSlides, 0);
                    this.oAnimation.onComplete.unsubscribe(this.flip)
                }
            }
            if (this.oPagination) {
                this.updatePagination()
            }
        };
        switch (this.sLoopMode) {
        case "continuous":
            this.toSlide(this.iToAdvance);
            if (this.iToAdvance > (this.iNumSlides - this.iSlideAdvance) || this.iToAdvance < 0) {
                this.oAnimation.onComplete.subscribe(this.flip, this, true)
            }
            break;
        case "rewind":
            if (this.iToAdvance > (this.iNumSlides - this.iNumSlidesVisible)) {
                this.toSlide(0)
            } else {
                if (this.iToAdvance < 0) {
                    return
                } else {
                    this.toSlide(this.iToAdvance)
                }
            }
            break;
        default:
            if (this.iToAdvance <= (this.iNumSlides - this.iNumSlidesVisible) && this.iToAdvance >= 0) {
                this.toSlide(this.iToAdvance)
            }
            break
        }
    },
    goToSlide: function (e, nSlideIndex) {
        if (e) {
            YAHOO.util.Event.stopEvent(e)
        }
        if (e && this.autoPlayTimer) {
            clearInterval(this.autoPlayTimer)
        }
        this.toSlide(nSlideIndex)
    },
    toSlide: function (nSlideIndex, nDuration, funcEasing) {
        var iAmount, nDistance, sDirection;
        this.oAnimation.duration = (nDuration === 0) ? 0 : nDuration || 0.5;
        this.oAnimation.easing = funcEasing || YAHOO.util.Easing.easeBoth;
        switch (this.sLoopMode) {
        case "continuous":
            if (nSlideIndex === 0) {
                nDistance = -(this.nMovement * this.iSlideAdvance)
            } else {
                nDistance = -(this.nMovement * (+nSlideIndex)) - (this.nMovement * this.iSlideAdvance)
            }
            break;
        case "rewind":
        default:
            nDistance = (nSlideIndex === 0) ? 0 : -(this.nMovement * (nSlideIndex));
            break
        }
        if (nDuration === 0) {
            YAHOO.util.Dom.setStyle(this.oCarousel, (this.sAspect == "horizontal" ? "left" : "top"), nDistance + "px");
            if (this.oPagination) {
                this.updatePagination()
            }
        } else {
            switch (this.sAspect) {
            case "horizontal":
                this.oAnimation.attributes = {
                    left: {
                        to: nDistance
                    }
                };
                break;
            case "vertical":
                this.oAnimation.attributes = {
                    top: {
                        to: nDistance
                    }
                };
                break
            }
            this.oAnimation.onComplete.subscribe(function () {
                this.iCurrentSlide = nSlideIndex
            },
            this, true);
            this.oAnimation.animate()
        }
        this.iCurrentSlide = nSlideIndex
    },
    previous: function (e) {
        if (e) {
            YAHOO.util.Event.preventDefault(e)
        }
        if (e && this.autoPlayTimer) {
            clearInterval(this.autoPlayTimer)
        }
        if (this.oAnimation.isAnimated()) {
            return
        }
        this.advanceRelative(-1)
    },
    next: function (e) {
        if (e) {
            YAHOO.util.Event.preventDefault(e)
        }
        if (e && this.autoPlayTimer) {
            clearInterval(this.autoPlayTimer)
        }
        if (this.oAnimation.isAnimated()) {
            return
        }
        this.advanceRelative(1)
    }
};

YAHOO.namespace("YAHOO.EU.Shopping.Homepage");
YAHOO.EU.Shopping.Homepage.initEditorialCarousel = function () {
    if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
        var jsperfid = YAHOO.YUIKK.JSPT.mark("YAHOO.EU.Shopping.Homepage.initEditorialCarousel");
        var jsperfused = -1
    }
    YAHOO.util.Dom.addClass(document.getElementById("home-promo"), "js");
    YAHOO.EU.Shopping.editorial = new YAHOO.EU.widget.Carousel(YAHOO.EU.Shopping.config.caroEditorial);
    if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
        if (document.getElementById("home-promo")) {
            jsperfused = 1
        }
        YAHOO.YUIKK.JSPT.unmark(jsperfid, jsperfused)
    }
};
YAHOO.EU.Shopping.Homepage.initPopularCategoryCarousel = function () {
    if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
        var jsperfid = YAHOO.YUIKK.JSPT.mark("YAHOO.EU.Shopping.Homepage.initPopularCategoryCarousel");
        var jsperfused = -1
    }
    YAHOO.util.Dom.addClass(document.getElementById("home-topcat"), "js");
    YAHOO.EU.Shopping.popcats = new YAHOO.EU.widget.Carousel(YAHOO.EU.Shopping.config.caroPopcats);
    if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
        if (document.getElementById("home-topcat")) {
            jsperfused = 1
        }
        YAHOO.YUIKK.JSPT.unmark(jsperfid, jsperfused)
    }
};
if (navigator.userAgent.toLowerCase().indexOf("safari") > -1) {
    YAHOO.util.Event.onDOMReady(function () {
        var aNext = YAHOO.util.Dom.getElementsByClassName("next", "a", "sec");
        var aPrev = YAHOO.util.Dom.getElementsByClassName("prev", "a", "sec");
        var aControls = aNext.concat(aPrev);
        for (var i = 0, j = aControls.length; i < j; i++) {
            YAHOO.util.Dom.addClass(aControls[i], "safari")
        }
    })
};

YAHOO.namespace("YAHOO.Kelkoo");
YAHOO.Kelkoo.sponsoredLinks = {
    sModuleTemplate: '<h2><div><%if (arguments[0].aboutUrl) {%><a target="_blank" href="<%=aboutUrl%>"> <%}%> <%=title%> <%if (arguments[0].aboutUrl) {%></a> <%}%></div></h2><ul><%=ads%></ul>',
    sLineTemplate: '<li class="<% if (arguments[0].type != undefined){%>googleAds<% } else { %> yahooAds <%} %>"> <h3><a href="<%=url%>" target="_blank" <%if (arguments[0].tracking != undefined) {%> onclick="<%=tracking%>"  <%}%> rel="nofollow"><%=line1%></a></h3><p><%=line2%><% if (arguments[0].line3 != undefined){%> <span><%=line3%></span><% } %></p><a class="url" href="<%=url%>" target="_blank" <%if (arguments[0].tracking != undefined) {%> onclick="<%=tracking%>"  <%}%> rel="nofollow"><%=visible_url%></a></li>',
    nbAdsSRP: 0,
    google_isActive: false,
    init: function (googleAds) {
        var googleScript = document.getElementById("googleLinksCall");
        var ysmScript = document.getElementById("ysmLinksCall");
        this.renderSponsoredLinks(googleScript, ysmScript, googleAds)
    },
    tracking: function (trackingUrl) {
        setTimeout(function () {
            var head, script;
            head = document.getElementsByTagName("head")[0];
            script = document.createElement("script");
            script.type = "text/javascript";
            script.src = trackingUrl;
            head.appendChild(script)
        },
        0);
        return true
    },
    renderSponsoredLinks: function (googleScript, ysmScript, googleAds) {
        var ysm_ads = [];
        var elSRP = document.getElementById("srp-links");
        var SRP_ads = [];
        var google_ads_idx = ((elSRP !== undefined) && (this.nbAdsSRP > 0) && (this.google_isActive)) ? this.nbAdsSRP - 1 : 0;
        var ysm_ads_idx = ((elSRP !== undefined) && (this.nbAdsSRP > 0) && (!this.google_isActive)) ? this.nbAdsSRP - 1 : 0;
        if (ysmScript !== null) {
            if (zSr !== undefined && zSr.length > 6 && ysm_data) {
                for (k = 6;
                (k < zSr.length); k += 6) {
                    var aLinks = {
                        url: "/ctl/go/modulesGo?merchantId=" + ysm_data.merchantId + "&frameset=no&from=content&catId=" + ysm_data.catId + "&url=" + escape(zSr[k + 2]),
                        line1: zSr[k + 3],
                        line2: zSr[k],
                        visible_url: zSr[k + 4]
                    };
                    ysm_ads.push(aLinks)
                }
            }
        }
        var google_ads_html = "";
        var google_ads_html_rhs = "";
        var google_ads_count = 0;
        var ysm_ads_html = "";
        var ysm_ads_count = (ysm_ads) ? ysm_ads.length : 0;
        if ((google_ads === undefined) && (googleAds !== undefined)) {
            var google_ads = googleAds
        }
        if (googleScript !== null && google_ads !== undefined) {
            if (google_data && google_data.active) {
                for (var i = google_ads.length - 1; i >= 0; i--) {
                    google_ads[i].tracking = "return YAHOO.Kelkoo.sponsoredLinks.tracking('/ctl/go/modulesGo?merchantId=" + google_data.merchantId + "&frameset=no&redirect=false&from=content&catId=" + google_data.catId + "');"
                }
            }
            google_ads_count = google_ads.length;
            if (document.getElementById("sponsored-links-rhs") == null) {
                for (var i = google_ads_idx; i < google_ads_count; i++) {
                    google_ads_html += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, google_ads[i])
                }
            } else {
                var google_ads_split = (google_call_num_ads / 2);
                if (google_ads_count < google_ads_split) {
                    google_ads_split = google_ads_count
                }
                if (YAHOO.util.Dom.hasClass("sponsored-links-rhs", "first")) {
                    for (var i = google_ads_idx;
                    i < google_ads_split; i++) {
                        google_ads_html_rhs += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, google_ads[i])
                    }
                    for (i = google_ads_split; i < google_ads_count; i++) {
                        google_ads_html += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, google_ads[i])
                    }
                } else {
                    for (var i = google_ads_idx; i < google_ads_split; i++) {
                        google_ads_html += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, google_ads[i])
                    }
                    for (i = google_ads_split; i < google_ads_count; i++) {
                        google_ads_html_rhs += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, google_ads[i])
                    }
                }
            }
        }
        if ((ysmScript !== undefined) && (ysm_ads_count > 0)) {
            for (var i = ysm_ads_idx; i < ysm_ads_count; i++) {
                ysm_ads_html += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, ysm_ads[i])
            }
        }
        if ((elSRP !== undefined) && (this.nbAdsSRP > 0)) {
            if (this.google_isActive) {
                var length = (google_ads_count > this.nbAdsSRP) ? this.nbAdsSRP : google_ads_count;
                if (length > 0) {
                    for (var i = 0; i < length; i++) {
                        SRP_ads.push(google_ads[i])
                    }
                }
            } else {
                var length = (ysm_ads_count > this.nbAdsSRP) ? this.nbAdsSRP : ysm_ads_count;
                if (length > 0) {
                    for (var i = 0; i < length; i++) {
                        SRP_ads.push(ysm_ads[i])
                    }
                }
            }
            var SRP_html = "";
            for (var i = 0; i < SRP_ads.length; i++) {
                SRP_html += YAHOO.EU.Shopping.templating.render(this.sLineTemplate, SRP_ads[i])
            }
            elSRP.innerHTML = YAHOO.EU.Shopping.templating.render(this.sModuleTemplate, {
                ads: SRP_html,
                title: YAHOO.EU.Shopping.locale.sponsoredLinksTitle,
                aboutUrl: google_data.aboutUrl
            })
        }
        if ((elSRP === undefined && google_ads_count > 0) || (google_ads_count - this.nbAdsSRP > 0)) {
            var html = YAHOO.EU.Shopping.templating.render(this.sModuleTemplate, {
                ads: google_ads_html,
                title: YAHOO.EU.Shopping.locale.sponsoredLinksTitle,
                aboutUrl: google_data.aboutUrl
            });
            var elContainer = undefined;
            var elContainerArray = YAHOO.util.Dom.getElementsByClassName("id-sponsored-links");
            if (elContainerArray && elContainerArray.length > 0) {
                elContainer = elContainerArray[0]
            }
            if (elContainer) {
                var tmpElement = elContainer;
                while (tmpElement && !YAHOO.util.Dom.hasClass(tmpElement, "results") && tmpElement.parentNode) {
                    tmpElement = tmpElement.parentNode
                }
                if (tmpElement && !YAHOO.util.Dom.hasClass(tmpElement, "results")) {
                    if ((elContainer) && (elContainer.parentNode) && (elContainer.parentNode.id != undefined) && (elContainer.parentNode.id == "pri" || elContainer.parentNode.id == "sec" || elContainer.parentNode.id == "ter")) {
                        YAHOO.util.Dom.addClass(elContainer, "gen-" + elContainer.parentNode.id + "-mod")
                    } else {
                        YAHOO.util.Dom.addClass(elContainer, "gen-pri-mod")
                    }
                }
                if (YAHOO.util.Dom.hasClass(elContainer, "hide")) {
                    YAHOO.util.Dom.removeClass(elContainer, "hide")
                }
                elContainer.innerHTML = html
            }
            if (google_ads_html_rhs != "") {
                var html = YAHOO.EU.Shopping.templating.render(this.sModuleTemplate, {
                    ads: google_ads_html_rhs,
                    title: YAHOO.EU.Shopping.locale.sponsoredLinksTitle,
                    aboutUrl: google_data.aboutUrl
                });
                var elContainer = document.getElementById("sponsored-links-rhs");
                if (elContainer) {
                    if ((elContainer) && (elContainer.parentNode) && (elContainer.parentNode.id != undefined) && (elContainer.parentNode.id == "pri" || elContainer.parentNode.id == "sec" || elContainer.parentNode.id == "ter")) {
                        YAHOO.util.Dom.addClass(elContainer, "gen-" + elContainer.parentNode.id + "-mod")
                    } else {
                        YAHOO.util.Dom.addClass(elContainer, "gen-pri-mod")
                    }
                    elContainer.innerHTML = html
                }
            }
        }
        if ((ysm_ads_count - this.nbAdsSRP > 0)) {
            var html = YAHOO.EU.Shopping.templating.render(this.sModuleTemplate, {
                ads: ysm_ads_html,
                title: ysm_data.title
            });
            var elContainer = document.getElementById("sponsored-links-ysm");
            if (elContainer) {
                if ((elContainer) && (elContainer.parentNode) && (elContainer.parentNode.id != undefined) && (elContainer.parentNode.id == "pri" || elContainer.parentNode.id == "sec" || elContainer.parentNode.id == "ter")) {
                    YAHOO.util.Dom.addClass(elContainer, "gen-" + elContainer.parentNode.id + "-mod")
                } else {
                    YAHOO.util.Dom.addClass(elContainer, "gen-pri-mod")
                }
                elContainer.innerHTML = html
            }
        }
    }
};

function google_ad_request_done(google_ads) {
    YAHOO.Kelkoo.sponsoredLinks.init(google_ads);
    return true
}
function google_afs_request_done(google_ads) {
    YAHOO.Kelkoo.sponsoredLinks.init(google_ads);
    return true
};

YAHOO.namespace("YAHOO.EU.Shopping");
YAHOO.EU.Shopping.templating = new
function () {
    var cache = {};
    this.init = function (el, userConfig) {
        this.cache = {}
    };
    this.render = function (str, data) {
        var fn = !/\W/.test(str) ? this.cache[str] = this.cache[str] || this.render(document.getElementById(str).innerHTML) : new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('" + str.replace(/[\r\t\n]/g, " ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g, "$1\r").replace(/\t=(.*?)%>/g, "',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'") + "');}return p.join('');");
        return data ? fn(data) : fn
    }
}();

YAHOO.namespace("YAHOO.EU.Shopping.Utils");
YAHOO.EU.Shopping.Utils.SuggestAsYouType = {
    currentValue: 0,
    startsFrom: YAHOO.EU.Shopping.config.suggestAsYouType.startsFrom,
    minimumFrom: YAHOO.EU.Shopping.config.suggestAsYouType.minimumFrom,
    init: function (sInputName, sContainerName) {
        if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
            var jsperfid = YAHOO.YUIKK.JSPT.mark("YAHOO.EU.Shopping.Utils.SuggestAsYouType.init");
            var jsperfused = -1
        }
        if (YAHOO.util.Dom.get(sContainerName) === null && document.getElementById("product-overlay") !== null) {
            var elSuggestContainer = document.createElement("div");
            elSuggestContainer.id = sContainerName;
            document.getElementById("product-overlay").appendChild(elSuggestContainer);
            YAHOO.util.Dom.addClass(elSuggestContainer, "sContainer");
            YAHOO.util.Dom.addClass(elSuggestContainer, "hide")
        }
        if (YAHOO.EU.Shopping.config.suggestAsYouType.isActivated && YAHOO.util.Dom.get(sInputName) && YAHOO.util.Dom.get(sContainerName)) {
            jsperfused = 1;
            try {
                YAHOO.util.Event.purgeElement(sInputName);
                this.oACDS = new YAHOO.widget.DS_XHR("/ctl/do/asyncCall/suggest-as-you-type", ["searchResult.result", "label"]);
                this.oACDS.queryMatchContains = true;
                this.oACDS.scriptQueryAppend = "output=json";
                this.oAutoComp = new YAHOO.widget.AutoComplete(sInputName, sContainerName, this.oACDS);
                this.oAutoComp.autoHighlight = false;
                this.oAutoComp.maxResultsDisplayed = 20;
                this.oAutoComp.queryDelay = 0.3;
                if (!isNaN(parseFloat(YAHOO.EU.Shopping.config.suggestAsYouType.sendDelay))) {
                    this.oAutoComp.queryDelay = YAHOO.EU.Shopping.config.suggestAsYouType.sendDelay
                }
                this.oAutoComp.minQueryLength = YAHOO.EU.Shopping.Utils.SuggestAsYouType.minimumFrom;
                this.oAutoComp.sInputName = sInputName;
                this.oAutoComp.sContainerName = sContainerName;
                this.oAutoComp.setHeader('<span id="sClose" class="sClose">' + YAHOO.EU.Shopping.locale.suggestClose + "</span>");
                this.oAutoComp.setFooter('<span class="sSuggestions">' + YAHOO.EU.Shopping.locale.suggestSuggestion + "</span>");
                this.oAutoComp.formatResult = function (oResultItem, sQuery) {
                    if (sQuery) {
                        var lowerQuery = removeAccents(sQuery.toLowerCase());
                        var lowerQuerySplitted = lowerQuery.split(" ");
                        var resultItem = removeAccents(oResultItem[1].label.toLowerCase());
                        var resultItemSplitted = resultItem.split(" ");
                        var finalResult = "";
                        for (var i = 0; i < lowerQuerySplitted.length;
                        i++) {
                            for (var j = 0; j < resultItemSplitted.length; j++) {
                                var reg = new RegExp("^" + lowerQuerySplitted[i]);
                                if (reg.test(resultItemSplitted[j])) {
                                    resultItemSplitted[j] = resultItemSplitted[j].replace(lowerQuerySplitted[i], '<SPAN class="sHighlighted">' + lowerQuerySplitted[i] + "</SPAN>")
                                }
                            }
                        }
                        for (var j = 0; j < resultItemSplitted.length; j++) {
                            finalResult += resultItemSplitted[j] + " "
                        }
                        return finalResult
                    } else {
                        return oResultItem[1].label
                    }
                };
                this.oAutoComp.doBeforeExpandContainer = function (oTextbox, oContainer, sQuery, aResults) {
                    containerShow(null, null, {
                        sContainerName: oContainer
                    });
                    var pos = YAHOO.util.Dom.getXY(oTextbox);
                    if (navigator.appName.toLowerCase().indexOf("netscape") !== -1) {
                        pos[0] = pos[0] + 1
                    }
                    pos[1] += YAHOO.util.Dom.get(oTextbox).offsetHeight + 2;
                    YAHOO.util.Dom.setXY(oContainer, pos);
                    return true
                };
                var updateQueryInput = function (e, query, o) {
                    if (YAHOO.util.Dom.get(o.sInputName) !== null) {
                        YAHOO.util.Dom.get(o.sInputName).value = removeAccents(YAHOO.util.Dom.get(o.sInputName).value)
                    }
                };
                var removeAccents = function (str) {
                    if (str !== null) {
                        str = str.replace(/[??????????????????????????????]/gi, "a");
                        str = str.replace(/[????????????????????????]/gi, "e");
                        str = str.replace(/[??????????????????]/gi, "i");
                        str = str.replace(/[??????????????????????????????]/gi, "o");
                        str = str.replace(/[????????????????????????]/gi, "u");
                        str = str.replace(/[??????]/gi, "n");
                        str = str.replace(/[??????]/gi, "c");
                        str = str.replace(/[???]/gi, "y");
                        str = str.replace(/[??????]/gi, "ae")
                    }
                    return str
                };
                var containerHide = function (e, a, o) {
                    YAHOO.util.Dom.addClass(o.sContainerName, "hide")
                };
                var containerShow = function (e, a, o) {
                    YAHOO.util.Dom.removeClass(o.sContainerName, "hide")
                };
                var containerForceHide = function (e, o) {
                    if (o.oAutoComp.containerCollapseEvent) {
                        o.oAutoComp.containerCollapseEvent.fire()
                    }
                };
                var containerClose = function (e, oAutoComp) {
                    var sInputName = oAutoComp.sInputName;
                    var sContainerName = oAutoComp.sContainerName;
                    if (oAutoComp.containerCollapseEvent) {
                        oAutoComp.containerCollapseEvent.fire()
                    }
                    oAutoComp.destroy();
                    YAHOO.util.Event.addListener(sInputName, "keyup", YAHOO.EU.Shopping.Utils.SuggestAsYouType.resetSuggest, {
                        sInputName: sInputName,
                        sContainerName: sContainerName
                    });
                    YAHOO.util.Dom.get(sInputName).focus()
                };
                var setSuggestFlag = function (e, a, o) {
                    if (o.oAutoComp.containerCollapseEvent) {
                        o.oAutoComp.containerCollapseEvent.fire()
                    }
                    if ((searchForm = YAHOO.util.Dom.get("search")) !== null && YAHOO.util.Dom.get("suggest") === null) {
                        var elSuggestFlag = document.createElement("input");
                        elSuggestFlag.type = "hidden";
                        elSuggestFlag.id = "suggest";
                        elSuggestFlag.name = "suggest";
                        elSuggestFlag.value = "true";
                        searchForm.appendChild(elSuggestFlag)
                    }
                    YAHOO.util.Dom.get("search").submit()
                };
                this.oAutoComp.containerCollapseEvent.subscribe(containerHide, {
                    sContainerName: this.oAutoComp.sContainerName
                });
                this.oAutoComp.containerExpandEvent.subscribe(containerShow, {
                    sContainerName: this.oAutoComp.sContainerName
                });
                this.oAutoComp.containerCollapseEvent.subscribe(YAHOO.EU.Shopping.Utils.SuggestAsYouType.resetSuggestFlag);
                this.oAutoComp.itemSelectEvent.subscribe(setSuggestFlag, {
                    sContainerName: this.oAutoComp.sContainerName,
                    oAutoComp: this.oAutoComp
                });
                YAHOO.util.Event.removeListener(this.oAutoComp.sInputName, "keyup");
                YAHOO.util.Event.addListener(this.oAutoComp.sInputName, "keyup", YAHOO.EU.Shopping.Utils.SuggestAsYouType.updateAutocomplete, {
                    sInputName: this.oAutoComp.sInputName,
                    oAutoComp: this.oAutoComp
                });
                YAHOO.util.Event.addListener(this.oAutoComp.sInputName, "keyup", YAHOO.EU.Shopping.Utils.SuggestAsYouType.reset, {
                    sInputName: this.oAutoComp.sInputName,
                    oAutoComp: this.oAutoComp
                });
                YAHOO.util.Event.addListener(this.oAutoComp.sContainerName, "blur", containerForceHide, {
                    sContainerName: this.oAutoComp.sContainerName,
                    oAutoComp: this.oAutoComp
                });
                if ((searchForm = YAHOO.util.Dom.get("search")) !== null) {
                    YAHOO.util.Event.addListener("search", "submit", containerForceHide, {
                        sContainerName: this.oAutoComp.sContainerName,
                        oAutoComp: this.oAutoComp
                    })
                }
                YAHOO.util.Event.addListener("sClose", "click", containerClose, this.oAutoComp)
            } catch(exception) {
                YAHOO.log("Exception :" + exception)
            }
        }
        if (YAHOO.YUIKK && YAHOO.YUIKK.JSPT) {
            YAHOO.YUIKK.JSPT.unmark(jsperfid, jsperfused)
        }
    },
    updateAutocomplete: function (e, o) {
        var sInput = YAHOO.util.Dom.get(o.sInputName);
        var sInputPreviousLength = 0,
            sInputNextLength = 0;
        if (sInput !== null && sInput.value !== "") {
            sInputPreviousLength = YAHOO.EU.Shopping.Utils.SuggestAsYouType.currentValue;
            YAHOO.EU.Shopping.Utils.SuggestAsYouType.currentValue = sInputNextLength = sInput.value.length;
            if (((sInputPreviousLength < sInputNextLength && sInputNextLength >= (YAHOO.EU.Shopping.Utils.SuggestAsYouType.startsFrom))) || ((navigator.appName.toLowerCase().indexOf("netscape") == -1)) && ((sInputPreviousLength < sInputNextLength && sInputNextLength >= (YAHOO.EU.Shopping.Utils.SuggestAsYouType.startsFrom - 1)))) {
                YAHOO.util.Event.removeListener(o.sInputName, "keyup");
                YAHOO.util.Event.addListener(o.sInputName, "keyup", YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp, o.oAutoComp);
                YAHOO.util.Event.addListener(o.sInputName, "keyup", YAHOO.EU.Shopping.Utils.SuggestAsYouType.reset, {
                    sInputName: o.sInputName,
                    oAutoComp: o.oAutoComp
                });
                o.oAutoComp.textboxKeyEvent.fire(o.oAutoComp, "keyup")
            }
        }
    },
    reset: function (e, o) {
        if (YAHOO.util.Dom.get(o.sInputName).value === "") {
            YAHOO.EU.Shopping.Utils.SuggestAsYouType.currentValue = 0;
            YAHOO.util.Event.removeListener(o.sInputName, "keyup");
            YAHOO.util.Event.addListener(o.sInputName, "keyup", YAHOO.EU.Shopping.Utils.SuggestAsYouType.updateAutocomplete, {
                sInputName: o.sInputName,
                oAutoComp: o.oAutoComp
            });
            YAHOO.util.Event.addListener(o.sInputName, "keyup", YAHOO.EU.Shopping.Utils.SuggestAsYouType.reset, {
                sInputName: o.sInputName,
                oAutoComp: o.oAutoComp
            })
        }
    },
    resetSuggest: function (e, o) {
        if (YAHOO.util.Dom.get(o.sInputName).value === "") {
            YAHOO.EU.Shopping.Utils.SuggestAsYouType.resetSuggestFlag();
            YAHOO.EU.Shopping.Utils.SuggestAsYouType.currentValue = 0;
            YAHOO.EU.Shopping.Utils.SuggestAsYouType.init(o.sInputName, o.sContainerName)
        }
    },
    resetSuggestFlag: function () {
        if ((searchForm = YAHOO.util.Dom.get("search")) !== null && (suggestFlag = YAHOO.util.Dom.get("suggest")) !== null) {
            searchForm.removeChild(suggestFlag)
        }
    }
};