/*
Copyright (c) 2006, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 0.12.2
*/
if (typeof YAHOO == "undefined") {
    var YAHOO = {};
}
YAHOO.namespace = function () {
    var a = arguments,
        o = null,
        i, j, d;
    for (i = 0; i < a.length; ++i) {
        d = a[i].split(".");
        o = YAHOO;
        for (j = (d[0] == "YAHOO") ? 1 : 0; j < d.length; ++j) {
            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.extend = function (subc, superc, overrides) {
    var F = function () {};
    F.prototype = superc.prototype;
    subc.prototype = new F();
    subc.prototype.constructor = subc;
    subc.superclass = superc.prototype;
    if (superc.prototype.constructor == Object.prototype.constructor) {
        superc.prototype.constructor = superc;
    }
    if (overrides) {
        for (var i in overrides) {
            subc.prototype[i] = overrides[i];
        }
    }
};
YAHOO.augment = function (r, s) {
    var rp = r.prototype,
        sp = s.prototype,
        a = arguments,
        i, p;
    if (a[2]) {
        for (i = 2; i < a.length; ++i) {
            rp[a[i]] = sp[a[i]];
        }
    } else {
        for (p in sp) {
            if (!rp[p]) {
                rp[p] = sp[p];
            }
        }
    }
};
YAHOO.namespace("util", "widget", "example");
/*
Copyright (c) 2006, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 0.12.2
*/


YAHOO.util.CustomEvent = function (type, oScope, silent, signature) {
    this.type = type;
    this.scope = oScope || window;
    this.silent = silent;
    this.signature = signature || YAHOO.util.CustomEvent.LIST;
    this.subscribers = [];
    if (!this.silent) {}
    var onsubscribeType = "_YUICEOnSubscribe";
    if (type !== onsubscribeType) {
        this.subscribeEvent = new YAHOO.util.CustomEvent(onsubscribeType, this, true);
    }
};
YAHOO.util.CustomEvent.LIST = 0;
YAHOO.util.CustomEvent.FLAT = 1;
YAHOO.util.CustomEvent.prototype = {
    subscribe: function (fn, obj, override) {
        if (this.subscribeEvent) {
            this.subscribeEvent.fire(fn, obj, override);
        }
        this.subscribers.push(new YAHOO.util.Subscriber(fn, obj, override));
    },
    unsubscribe: function (fn, obj) {
        var found = false;
        for (var i = 0, len = this.subscribers.length; i < len; ++i) {
            var s = this.subscribers[i];
            if (s && s.contains(fn, obj)) {
                this._delete(i);
                found = true;
            }
        }
        return found;
    },
    fire: function () {
        var len = this.subscribers.length;
        if (!len && this.silent) {
            return true;
        }
        var args = [],
            ret = true,
            i;
        for (i = 0; i < arguments.length; ++i) {
            args.push(arguments[i]);
        }
        var argslength = args.length;
        if (!this.silent) {}
        for (i = 0; i < len; ++i) {
            var s = this.subscribers[i];
            if (s) {
                if (!this.silent) {}
                var scope = s.getScope(this.scope);
                if (this.signature == YAHOO.util.CustomEvent.FLAT) {
                    var param = null;
                    if (args.length > 0) {
                        param = args[0];
                    }
                    ret = s.fn.call(scope, param, s.obj);
                } else {
                    ret = s.fn.call(scope, this.type, args, s.obj);
                }
                if (false === ret) {
                    if (!this.silent) {}
                    return false;
                }
            }
        }
        return true;
    },
    unsubscribeAll: function () {
        for (var i = 0, len = this.subscribers.length; i < len; ++i) {
            this._delete(len - 1 - i);
        }
    },
    _delete: function (index) {
        var s = this.subscribers[index];
        if (s) {
            delete s.fn;
            delete s.obj;
        }
        this.subscribers.splice(index, 1);
    },
    toString: function () {
        return "CustomEvent: " + "'" + this.type + "', " + "scope: " + this.scope;
    }
};
YAHOO.util.Subscriber = function (fn, obj, override) {
    this.fn = fn;
    this.obj = obj || null;
    this.override = override;
};
YAHOO.util.Subscriber.prototype.getScope = function (defaultScope) {
    if (this.override) {
        if (this.override === true) {
            return this.obj;
        } else {
            return this.override;
        }
    }
    return defaultScope;
};
YAHOO.util.Subscriber.prototype.contains = function (fn, obj) {
    if (obj) {
        return (this.fn == fn && this.obj == obj);
    } else {
        return (this.fn == fn);
    }
};
YAHOO.util.Subscriber.prototype.toString = function () {
    return "Subscriber { obj: " + (this.obj || "") + ", override: " + (this.override || "no") + " }";
};
if (!YAHOO.util.Event) {
    YAHOO.util.Event = function () {
        var loadComplete = false;
        var listeners = [];
        var unloadListeners = [];
        var legacyEvents = [];
        var legacyHandlers = [];
        var retryCount = 0;
        var onAvailStack = [];
        var legacyMap = [];
        var counter = 0;
        return {
            POLL_RETRYS: 200,
            POLL_INTERVAL: 20,
            EL: 0,
            TYPE: 1,
            FN: 2,
            WFN: 3,
            OBJ: 3,
            ADJ_SCOPE: 4,
            isSafari: (/Safari|Konqueror|KHTML/gi).test(navigator.userAgent),
            isIE: (!this.isSafari && !navigator.userAgent.match(/opera/gi) && navigator.userAgent.match(/msie/gi)),
            _interval: null,
            startInterval: function () {
                if (!this._interval) {
                    var self = this;
                    var callback = function () {
                            self._tryPreloadAttach();
                        };
                    this._interval = setInterval(callback, this.POLL_INTERVAL);
                }
            },
            onAvailable: function (p_id, p_fn, p_obj, p_override) {
                onAvailStack.push({
                    id: p_id,
                    fn: p_fn,
                    obj: p_obj,
                    override: p_override,
                    checkReady: false
                });
                retryCount = this.POLL_RETRYS;
                this.startInterval();
            },
            onContentReady: function (p_id, p_fn, p_obj, p_override) {
                onAvailStack.push({
                    id: p_id,
                    fn: p_fn,
                    obj: p_obj,
                    override: p_override,
                    checkReady: true
                });
                retryCount = this.POLL_RETRYS;
                this.startInterval();
            },
            addListener: function (el, sType, fn, obj, override) {
                if (!fn || !fn.call) {
                    return false;
                }
                if (this._isValidCollection(el)) {
                    var ok = true;
                    for (var i = 0, len = el.length; i < len; ++i) {
                        ok = this.on(el[i], sType, fn, obj, override) && ok;
                    }
                    return ok;
                } else if (typeof el == "string") {
                    var oEl = this.getEl(el);
                    if (oEl) {
                        el = oEl;
                    } else {
                        this.onAvailable(el, function () {
                            YAHOO.util.Event.on(el, sType, fn, obj, override);
                        });
                        return true;
                    }
                }
                if (!el) {
                    return false;
                }
                if ("unload" == sType && obj !== this) {
                    unloadListeners[unloadListeners.length] = [el, sType, fn, obj, override];
                    return true;
                }
                var scope = el;
                if (override) {
                    if (override === true) {
                        scope = obj;
                    } else {
                        scope = override;
                    }
                }
                var wrappedFn = function (e) {
                        return fn.call(scope, YAHOO.util.Event.getEvent(e), obj);
                    };
                var li = [el, sType, fn, wrappedFn, scope];
                var index = listeners.length;
                listeners[index] = li;
                if (this.useLegacyEvent(el, sType)) {
                    var legacyIndex = this.getLegacyIndex(el, sType);
                    if (legacyIndex == -1 || el != legacyEvents[legacyIndex][0]) {
                        legacyIndex = legacyEvents.length;
                        legacyMap[el.id + sType] = legacyIndex;
                        legacyEvents[legacyIndex] = [el, sType, el["on" + sType]];
                        legacyHandlers[legacyIndex] = [];
                        el["on" + sType] = function (e) {
                            YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(e), legacyIndex);
                        };
                    }
                    legacyHandlers[legacyIndex].push(li);
                } else {
                    try {
                        this._simpleAdd(el, sType, wrappedFn, false);
                    } catch (e) {
                        this.removeListener(el, sType, fn);
                        return false;
                    }
                }
                return true;
            },
            fireLegacyEvent: function (e, legacyIndex) {
                var ok = true;
                var le = legacyHandlers[legacyIndex];
                for (var i = 0, len = le.length; i < len; ++i) {
                    var li = le[i];
                    if (li && li[this.WFN]) {
                        var scope = li[this.ADJ_SCOPE];
                        var ret = li[this.WFN].call(scope, e);
                        ok = (ok && ret);
                    }
                }
                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 (!el.addEventListener && !el.attachEvent) {
                    return true;
                } else if (this.isSafari) {
                    if ("click" == sType || "dblclick" == sType) {
                        return true;
                    }
                }
                return false;
            },
            removeListener: function (el, sType, fn) {
                var i, len;
                if (typeof el == "string") {
                    el = this.getEl(el);
                } else if (this._isValidCollection(el)) {
                    var ok = true;
                    for (i = 0, len = el.length; i < len; ++i) {
                        ok = (this.removeListener(el[i], sType, fn) && ok);
                    }
                    return ok;
                }
                if (!fn || !fn.call) {
                    return this.purgeElement(el, false, sType);
                }
                if ("unload" == sType) {
                    for (i = 0, len = unloadListeners.length; i < len; i++) {
                        var li = unloadListeners[i];
                        if (li && li[0] == el && li[1] == sType && li[2] == fn) {
                            unloadListeners.splice(i, 1);
                            return true;
                        }
                    }
                    return false;
                }
                var cacheItem = null;
                var index = arguments[3];
                if ("undefined" == typeof index) {
                    index = this._getCacheIndex(el, sType, fn);
                }
                if (index >= 0) {
                    cacheItem = listeners[index];
                }
                if (!el || !cacheItem) {
                    return false;
                }
                if (this.useLegacyEvent(el, sType)) {
                    var legacyIndex = this.getLegacyIndex(el, sType);
                    var llist = legacyHandlers[legacyIndex];
                    if (llist) {
                        for (i = 0, len = llist.length; i < len; ++i) {
                            li = llist[i];
                            if (li && li[this.EL] == el && li[this.TYPE] == sType && li[this.FN] == fn) {
                                llist.splice(i, 1);
                                break;
                            }
                        }
                    }
                } else {
                    try {
                        this._simpleRemove(el, sType, cacheItem[this.WFN], false);
                    } catch (e) {
                        return false;
                    }
                }
                delete listeners[index][this.WFN];
                delete listeners[index][this.FN];
                listeners.splice(index, 1);
                return true;
            },
            getTarget: function (ev, resolveTextNode) {
                var t = ev.target || ev.srcElement;
                return this.resolveTextNode(t);
            },
            resolveTextNode: function (node) {
                if (node && 3 == node.nodeType) {
                    return node.parentNode;
                } else {
                    return node;
                }
            },
            getPageX: function (ev) {
                var x = ev.pageX;
                if (!x && 0 !== x) {
                    x = ev.clientX || 0;
                    if (this.isIE) {
                        x += this._getScrollLeft();
                    }
                }
                return x;
            },
            getPageY: function (ev) {
                var y = ev.pageY;
                if (!y && 0 !== y) {
                    y = ev.clientY || 0;
                    if (this.isIE) {
                        y += this._getScrollTop();
                    }
                }
                return y;
            },
            getXY: function (ev) {
                return [this.getPageX(ev), this.getPageY(ev)];
            },
            getRelatedTarget: function (ev) {
                var t = ev.relatedTarget;
                if (!t) {
                    if (ev.type == "mouseout") {
                        t = ev.toElement;
                    } else if (ev.type == "mouseover") {
                        t = ev.fromElement;
                    }
                }
                return this.resolveTextNode(t);
            },
            getTime: function (ev) {
                if (!ev.time) {
                    var t = new Date().getTime();
                    try {
                        ev.time = t;
                    } catch (e) {
                        return t;
                    }
                }
                return ev.time;
            },
            stopEvent: function (ev) {
                this.stopPropagation(ev);
                this.preventDefault(ev);
            },
            stopPropagation: function (ev) {
                if (ev.stopPropagation) {
                    ev.stopPropagation();
                } else {
                    ev.cancelBubble = true;
                }
            },
            preventDefault: function (ev) {
                if (ev.preventDefault) {
                    ev.preventDefault();
                } else {
                    ev.returnValue = false;
                }
            },
            getEvent: function (e) {
                var ev = e || window.event;
                if (!ev) {
                    var c = this.getEvent.caller;
                    while (c) {
                        ev = c.arguments[0];
                        if (ev && Event == ev.constructor) {
                            break;
                        }
                        c = c.caller;
                    }
                }
                return ev;
            },
            getCharCode: function (ev) {
                return ev.charCode || ev.keyCode || 0;
            },
            _getCacheIndex: function (el, sType, fn) {
                for (var i = 0, len = listeners.length; i < len; ++i) {
                    var li = listeners[i];
                    if (li && li[this.FN] == fn && li[this.EL] == el && li[this.TYPE] == sType) {
                        return i;
                    }
                }
                return -1;
            },
            generateId: function (el) {
                var id = el.id;
                if (!id) {
                    id = "yuievtautoid-" + counter;
                    ++counter;
                    el.id = id;
                }
                return id;
            },
            _isValidCollection: function (o) {
                return (o && o.length && typeof o != "string" && !o.tagName && !o.alert && typeof o[0] != "undefined");
            },
            elCache: {},
            getEl: function (id) {
                return document.getElementById(id);
            },
            clearCache: function () {},
            _load: function (e) {
                loadComplete = true;
                var EU = YAHOO.util.Event;
                if (this.isIE) {
                    EU._simpleRemove(window, "load", EU._load);
                }
            },
            _tryPreloadAttach: function () {
                if (this.locked) {
                    return false;
                }
                this.locked = true;
                var tryAgain = !loadComplete;
                if (!tryAgain) {
                    tryAgain = (retryCount > 0);
                }
                var notAvail = [];
                for (var i = 0, len = onAvailStack.length; i < len; ++i) {
                    var item = onAvailStack[i];
                    if (item) {
                        var el = this.getEl(item.id);
                        if (el) {
                            if (!item.checkReady || loadComplete || el.nextSibling || (document && document.body)) {
                                var scope = el;
                                if (item.override) {
                                    if (item.override === true) {
                                        scope = item.obj;
                                    } else {
                                        scope = item.override;
                                    }
                                }
                                item.fn.call(scope, item.obj);
                                onAvailStack[i] = null;
                            }
                        } else {
                            notAvail.push(item);
                        }
                    }
                }
                retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
                if (tryAgain) {
                    this.startInterval();
                } else {
                    clearInterval(this._interval);
                    this._interval = null;
                }
                this.locked = false;
                return true;
            },
            purgeElement: function (el, recurse, sType) {
                var elListeners = this.getListeners(el, sType);
                if (elListeners) {
                    for (var i = 0, len = elListeners.length; i < len; ++i) {
                        var l = elListeners[i];
                        this.removeListener(el, l.type, l.fn);
                    }
                }
                if (recurse && el && el.childNodes) {
                    for (i = 0, len = el.childNodes.length; i < len; ++i) {
                        this.purgeElement(el.childNodes[i], recurse, sType);
                    }
                }
            },
            getListeners: function (el, sType) {
                var elListeners = [];
                if (listeners && listeners.length > 0) {
                    for (var i = 0, len = listeners.length; i < len; ++i) {
                        var l = listeners[i];
                        if (l && l[this.EL] === el && (!sType || sType === l[this.TYPE])) {
                            elListeners.push({
                                type: l[this.TYPE],
                                fn: l[this.FN],
                                obj: l[this.OBJ],
                                adjust: l[this.ADJ_SCOPE],
                                index: i
                            });
                        }
                    }
                }
                return (elListeners.length) ? elListeners : null;
            },
            _unload: function (e) {
                var EU = YAHOO.util.Event,
                    i, j, l, len, index;
                for (i = 0, len = unloadListeners.length; i < len; ++i) {
                    l = unloadListeners[i];
                    if (l) {
                        var scope = window;
                        if (l[EU.ADJ_SCOPE]) {
                            if (l[EU.ADJ_SCOPE] === true) {
                                scope = l[EU.OBJ];
                            } else {
                                scope = l[EU.ADJ_SCOPE];
                            }
                        }
                        l[EU.FN].call(scope, EU.getEvent(e), l[EU.OBJ]);
                        unloadListeners[i] = null;
                        l = null;
                        scope = null;
                    }
                }
                unloadListeners = null;
                if (listeners && listeners.length > 0) {
                    j = listeners.length;
                    while (j) {
                        index = j - 1;
                        l = listeners[index];
                        if (l) {
                            EU.removeListener(l[EU.EL], l[EU.TYPE], l[EU.FN], index);
                        }
                        j = j - 1;
                    }
                    l = null;
                    EU.clearCache();
                }
                for (i = 0, len = legacyEvents.length; i < len; ++i) {
                    legacyEvents[i][0] = null;
                    legacyEvents[i] = null;
                }
                legacyEvents = null;
                EU._simpleRemove(window, "unload", EU._unload);
            },
            _getScrollLeft: function () {
                return this._getScroll()[1];
            },
            _getScrollTop: function () {
                return this._getScroll()[0];
            },
            _getScroll: function () {
                var dd = document.documentElement,
                    db = document.body;
                if (dd && (dd.scrollTop || dd.scrollLeft)) {
                    return [dd.scrollTop, dd.scrollLeft];
                } else if (db) {
                    return [db.scrollTop, db.scrollLeft];
                } else {
                    return [0, 0];
                }
            },
            _simpleAdd: function () {
                if (window.addEventListener) {
                    return function (el, sType, fn, capture) {
                        el.addEventListener(sType, fn, (capture));
                    };
                } else if (window.attachEvent) {
                    return function (el, sType, fn, capture) {
                        el.attachEvent("on" + sType, fn);
                    };
                } else {
                    return function () {};
                }
            }(),
            _simpleRemove: function () {
                if (window.removeEventListener) {
                    return function (el, sType, fn, capture) {
                        el.removeEventListener(sType, fn, (capture));
                    };
                } else if (window.detachEvent) {
                    return function (el, sType, fn) {
                        el.detachEvent("on" + sType, fn);
                    };
                } else {
                    return function () {};
                }
            }()
        };
    }();
    (function () {
        var EU = YAHOO.util.Event;
        EU.on = EU.addListener;
        if (document && document.body) {
            EU._load();
        } else {
            EU._simpleAdd(window, "load", EU._load);
        }
        EU._simpleAdd(window, "unload", EU._unload);
        EU._tryPreloadAttach();
    })();
}
YAHOO.util.EventProvider = function () {};
YAHOO.util.EventProvider.prototype = {
    __yui_events: null,
    __yui_subscribers: null,
    subscribe: function (p_type, p_fn, p_obj, p_override) {
        this.__yui_events = this.__yui_events || {};
        var ce = this.__yui_events[p_type];
        if (ce) {
            ce.subscribe(p_fn, p_obj, p_override);
        } else {
            this.__yui_subscribers = this.__yui_subscribers || {};
            var subs = this.__yui_subscribers;
            if (!subs[p_type]) {
                subs[p_type] = [];
            }
            subs[p_type].push({
                fn: p_fn,
                obj: p_obj,
                override: p_override
            });
        }
    },
    unsubscribe: function (p_type, p_fn, p_obj) {
        this.__yui_events = this.__yui_events || {};
        var ce = this.__yui_events[p_type];
        if (ce) {
            return ce.unsubscribe(p_fn, p_obj);
        } else {
            return false;
        }
    },
    createEvent: function (p_type, p_config) {
        this.__yui_events = this.__yui_events || {};
        var opts = p_config || {};
        var events = this.__yui_events;
        if (events[p_type]) {} else {
            var scope = opts.scope || this;
            var silent = opts.silent || null;
            var ce = new YAHOO.util.CustomEvent(p_type, scope, silent, YAHOO.util.CustomEvent.FLAT);
            events[p_type] = ce;
            if (opts.onSubscribeCallback) {
                ce.subscribeEvent.subscribe(opts.onSubscribeCallback);
            }
            this.__yui_subscribers = this.__yui_subscribers || {};
            var qs = this.__yui_subscribers[p_type];
            if (qs) {
                for (var i = 0; i < qs.length; ++i) {
                    ce.subscribe(qs[i].fn, qs[i].obj, qs[i].override);
                }
            }
        }
        return events[p_type];
    },
    fireEvent: function (p_type, arg1, arg2, etc) {
        this.__yui_events = this.__yui_events || {};
        var ce = this.__yui_events[p_type];
        if (ce) {
            var args = [];
            for (var i = 1; i < arguments.length; ++i) {
                args.push(arguments[i]);
            }
            return ce.fire.apply(ce, args);
        } else {
            return null;
        }
    },
    hasEvent: function (type) {
        if (this.__yui_events) {
            if (this.__yui_events[type]) {
                return true;
            }
        }
        return false;
    }
};
/*
Copyright (c) 2006, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 0.12.2
*/

(function () {
    var Y = YAHOO.util,
        getStyle, setStyle, id_counter = 0,
        propertyCache = {};
    var ua = navigator.userAgent.toLowerCase(),
        isOpera = (ua.indexOf('opera') > -1),
        isSafari = (ua.indexOf('safari') > -1),
        isGecko = (!isOpera && !isSafari && ua.indexOf('gecko') > -1),
        isIE = (!isOpera && ua.indexOf('msie') > -1);
    var patterns = {
        HYPHEN: /(-[a-z])/i
    };
    var toCamel = function (property) {
            if (!patterns.HYPHEN.test(property)) {
                return property;
            }
            if (propertyCache[property]) {
                return propertyCache[property];
            }
            while (patterns.HYPHEN.exec(property)) {
                property = property.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase());
            }
            propertyCache[property] = property;
            return property;
        };
    if (document.defaultView && document.defaultView.getComputedStyle) {
        getStyle = function (el, property) {
            var value = null;
            var computed = document.defaultView.getComputedStyle(el, '');
            if (computed) {
                value = computed[toCamel(property)];
            }
            return el.style[property] || value;
        };
    } else if (document.documentElement.currentStyle && isIE) {
        getStyle = function (el, property) {
            switch (toCamel(property)) {
            case 'opacity':
                var val = 100;
                try {
                    val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
                } catch (e) {
                    try {
                        val = el.filters('alpha').opacity;
                    } catch (e) {}
                }
                return val / 100;
                break;
            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 (typeof el.style.filter == 'string') {
                    el.style.filter = 'alpha(opacity=' + val * 100 + ')';
                    if (!el.currentStyle || !el.currentStyle.hasLayout) {
                        el.style.zoom = 1;
                    }
                }
                break;
            default:
                el.style[property] = val;
            }
        };
    } else {
        setStyle = function (el, property, val) {
            el.style[property] = val;
        };
    }
    YAHOO.util.Dom = {
        get: function (el) {
            if (!el) {
                return null;
            }
            if (typeof el != 'string' && !(el instanceof Array)) {
                return el;
            }
            if (typeof el == 'string') {
                return document.getElementById(el);
            } else {
                var collection = [];
                for (var i = 0, len = el.length; i < len; ++i) {
                    collection[collection.length] = Y.Dom.get(el[i]);
                }
                return collection;
            }
            return null;
        },
        getStyle: function (el, property) {
            property = toCamel(property);
            var f = function (element) {
                    return getStyle(element, property);
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        setStyle: function (el, property, val) {
            property = toCamel(property);
            var f = function (element) {
                    setStyle(element, property, val);
                };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        getXY: function (el) {
            var f = function (el) {
                    if (el.parentNode === null || el.offsetParent === null || this.getStyle(el, 'display') == 'none') {
                        return false;
                    }
                    var parentNode = null;
                    var pos = [];
                    var box;
                    if (el.getBoundingClientRect) {
                        box = el.getBoundingClientRect();
                        var doc = document;
                        if (!this.inDocument(el) && parent.document != document) {
                            doc = parent.document;
                            if (!this.isAncestor(doc.documentElement, el)) {
                                return false;
                            }
                        }
                        var scrollTop = Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);
                        var scrollLeft = Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);
                        return [box.left + scrollLeft, box.top + scrollTop];
                    } else {
                        pos = [el.offsetLeft, el.offsetTop];
                        parentNode = el.offsetParent;
                        if (parentNode != el) {
                            while (parentNode) {
                                pos[0] += parentNode.offsetLeft;
                                pos[1] += parentNode.offsetTop; /* BEGIN MODIFICATION */
                                if (YAHOO.util.Dom.__patch_getXY) YAHOO.util.Dom.__patch_getXY(isSafari, isOpera, pos, parentNode); /* END MODIFICATION */
                                parentNode = parentNode.offsetParent;
                            }
                        }
                        if (isSafari && this.getStyle(el, 'position') == 'absolute') {
                            pos[0] -= document.body.offsetLeft;
                            pos[1] -= document.body.offsetTop;
                        }
                    }
                    if (el.parentNode) {
                        parentNode = el.parentNode;
                    } else {
                        parentNode = null;
                    }
                    while (parentNode && parentNode.tagName.toUpperCase() != 'BODY' && parentNode.tagName.toUpperCase() != 'HTML') {
                        if (Y.Dom.getStyle(parentNode, 'display') != 'inline') {
                            pos[0] -= parentNode.scrollLeft;
                            pos[1] -= parentNode.scrollTop;
                        }
                        if (parentNode.parentNode) {
                            parentNode = parentNode.parentNode;
                        } else {
                            parentNode = null;
                        }
                    }
                    return pos;
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getX: function (el) {
            var f = function (el) {
                    return Y.Dom.getXY(el)[0];
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getY: function (el) {
            var f = function (el) {
                    return Y.Dom.getXY(el)[1];
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        setXY: function (el, pos, noRetry) {
            var f = function (el) {
                    var style_pos = this.getStyle(el, 'position');
                    if (style_pos == 'static') {
                        this.setStyle(el, 'position', 'relative');
                        style_pos = 'relative';
                    }
                    var pageXY = this.getXY(el);
                    if (pageXY === false) {
                        return false;
                    }
                    var delta = [parseInt(this.getStyle(el, 'left'), 10), parseInt(this.getStyle(el, 'top'), 10)];
                    if (isNaN(delta[0])) {
                        delta[0] = (style_pos == 'relative') ? 0 : el.offsetLeft;
                    }
                    if (isNaN(delta[1])) {
                        delta[1] = (style_pos == 'relative') ? 0 : el.offsetTop;
                    }
                    if (pos[0] !== null) {
                        el.style.left = pos[0] - pageXY[0] + delta[0] + 'px';
                    }
                    if (pos[1] !== null) {
                        el.style.top = pos[1] - pageXY[1] + delta[1] + 'px';
                    }
                    if (!noRetry) {
                        var newXY = this.getXY(el);
                        if ((pos[0] !== null && newXY[0] != pos[0]) || (pos[1] !== null && newXY[1] != pos[1])) {
                            this.setXY(el, pos, true);
                        }
                    }
                };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        setX: function (el, x) {
            Y.Dom.setXY(el, [x, null]);
        },
        setY: function (el, y) {
            Y.Dom.setXY(el, [null, y]);
        },
        getRegion: function (el) {
            var f = function (el) {
                    var region = /*new */
                    Y.Region.getRegion(el);
                    return region;
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getClientWidth: function () {
            return Y.Dom.getViewportWidth();
        },
        getClientHeight: function () {
            return Y.Dom.getViewportHeight();
        },
        getElementsByClassName: function (className, tag, root) {
            var method = function (el) {
                    return Y.Dom.hasClass(el, className);
                };
            return Y.Dom.getElementsBy(method, tag, root);
        },
        hasClass: function (el, className) {
            var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
            var f = function (el) {
                    return re.test(el['className']);
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        addClass: function (el, className) {
            var f = function (el) {
                    if (this.hasClass(el, className)) {
                        return;
                    }
                    el['className'] = [el['className'], className].join(' ');
                };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        removeClass: function (el, className) {
            var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', 'g');
            var f = function (el) {
                    if (!this.hasClass(el, className)) {
                        return;
                    }
                    var c = el['className'];
                    el['className'] = c.replace(re, ' ');
                    if (this.hasClass(el, className)) {
                        this.removeClass(el, className);
                    }
                };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        replaceClass: function (el, oldClassName, newClassName) {
            if (oldClassName === newClassName) {
                return false;
            }
            var re = new RegExp('(?:^|\\s+)' + oldClassName + '(?:\\s+|$)', 'g');
            var f = function (el) {
                    if (!this.hasClass(el, oldClassName)) {
                        this.addClass(el, newClassName);
                        return;
                    }
                    el['className'] = el['className'].replace(re, ' ' + newClassName + ' ');
                    if (this.hasClass(el, oldClassName)) {
                        this.replaceClass(el, oldClassName, newClassName);
                    }
                };
            Y.Dom.batch(el, f, Y.Dom, true);
        },
        generateId: function (el, prefix) {
            prefix = prefix || 'yui-gen';
            el = el || {};
            var f = function (el) {
                    if (el) {
                        el = Y.Dom.get(el);
                    } else {
                        el = {};
                    }
                    if (!el.id) {
                        el.id = prefix + id_counter++;
                    }
                    return el.id;
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        isAncestor: function (haystack, needle) {
            haystack = Y.Dom.get(haystack);
            if (!haystack || !needle) {
                return false;
            }
            var f = function (needle) {
                    if (haystack.contains && !isSafari) {
                        return haystack.contains(needle);
                    } else if (haystack.compareDocumentPosition) {
                        return !!(haystack.compareDocumentPosition(needle) & 16);
                    } else {
                        var parent = needle.parentNode;
                        while (parent) {
                            if (parent == haystack) {
                                return true;
                            } else if (!parent.tagName || parent.tagName.toUpperCase() == 'HTML') {
                                return false;
                            }
                            parent = parent.parentNode;
                        }
                        return false;
                    }
                };
            return Y.Dom.batch(needle, f, Y.Dom, true);
        },
        inDocument: function (el) {
            var f = function (el) {
                    return this.isAncestor(document.documentElement, el);
                };
            return Y.Dom.batch(el, f, Y.Dom, true);
        },
        getElementsBy: function (method, tag, root) {
            tag = tag || '*';
            var nodes = [];
            if (root) {
                root = Y.Dom.get(root);
                if (!root) {
                    return nodes;
                }
            } else {
                root = document;
            }
            var elements = root.getElementsByTagName(tag);
            if (!elements.length && (tag == '*' && root.all)) {
                elements = root.all;
            }
            for (var i = 0, len = elements.length; i < len; ++i) {
                if (method(elements[i])) {
                    nodes[nodes.length] = elements[i];
                }
            }
            return nodes;
        },
        batch: function (el, method, o, override) {
            var id = el;
            el = Y.Dom.get(el);
            var scope = (override) ? o : window;
            if (!el || el.tagName || !el.length) {
                if (!el) {
                    return false;
                }
                return method.call(scope, el, o);
            }
            var collection = [];
            for (var i = 0, len = el.length; i < len; ++i) {
                if (!el[i]) {
                    id = el[i];
                }
                collection[collection.length] = method.call(scope, el[i], o);
            }
            return collection;
        },
        getDocumentHeight: function () {
            var scrollHeight = (document.compatMode != 'CSS1Compat') ? document.body.scrollHeight : document.documentElement.scrollHeight;
            var h = Math.max(scrollHeight, Y.Dom.getViewportHeight());
            return h;
        },
        getDocumentWidth: function () {
            var scrollWidth = (document.compatMode != 'CSS1Compat') ? document.body.scrollWidth : document.documentElement.scrollWidth;
            var w = Math.max(scrollWidth, Y.Dom.getViewportWidth());
            return w;
        },
        getViewportHeight: function () {
            var height = self.innerHeight;
            var mode = document.compatMode;
            if ((mode || isIE) && !isOpera) {
                height = (mode == 'CSS1Compat') ? document.documentElement.clientHeight : document.body.clientHeight;
            }
            return height;
        },
        getViewportWidth: function () {
            var width = self.innerWidth;
            var mode = document.compatMode;
            if (mode || isIE) {
                width = (mode == 'CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth;
            }
            return width;
        }
    };
})();
YAHOO.util.Region = function (t, r, b, l) {
    this.top = t;
    this[1] = t;
    this.right = r;
    this.bottom = b;
    this.left = l;
    this[0] = l;
};
YAHOO.util.Region.prototype.contains = function (region) {
    return (region.left >= this.left && region.right <= this.right && region.top >= this.top && region.bottom <= this.bottom);
};
YAHOO.util.Region.prototype.getArea = function () {
    return ((this.bottom - this.top) * (this.right - this.left));
};
YAHOO.util.Region.prototype.intersect = function (region) {
    var t = Math.max(this.top, region.top);
    var r = Math.min(this.right, region.right);
    var b = Math.min(this.bottom, region.bottom);
    var l = Math.max(this.left, region.left);
    if (b >= t && r >= l) {
        return new YAHOO.util.Region(t, r, b, l);
    } else {
        return null;
    }
};
YAHOO.util.Region.prototype.union = function (region) {
    var t = Math.min(this.top, region.top);
    var r = Math.max(this.right, region.right);
    var b = Math.max(this.bottom, region.bottom);
    var l = Math.min(this.left, region.left);
    return new YAHOO.util.Region(t, r, b, l);
};
YAHOO.util.Region.prototype.toString = function () {
    return ("Region {" + "top: " + this.top + ", right: " + this.right + ", bottom: " + this.bottom + ", left: " + this.left + "}");
};
YAHOO.util.Region.getRegion = function (el) {
    var p = YAHOO.util.Dom.getXY(el);
    var t = p[1];
    var r = p[0] + el.offsetWidth;
    var b = p[1] + el.offsetHeight;
    var l = p[0];
    return new YAHOO.util.Region(t, r, b, l);
};
YAHOO.util.Point = function (x, y) {
    if (x instanceof Array) {
        y = x[1];
        x = x[0];
    }
    this.x = this.right = this.left = this[0] = x;
    this.y = this.top = this.bottom = this[1] = y;
};
YAHOO.util.Point.prototype = new YAHOO.util.Region();

function $boolean(value) {
    return value ? true : false;
}
function $Array(value) {
    if (value.constructor == Array) {
        return value;
    } else {
        if (value === null || typeof (value) == "undefined") {
            return [];
        } else {
            if (typeof (value) != "string" && typeof (value.length) == "number") {
                var a = [],
                    i, n;
                for (i = 0, n = value.length; i < n; i++) {
                    a.push(value[i]);
                }
                return a;
            } else {
                return [value];
            }
        }
    }
}
function $int(value, defaultValue) {
    switch (typeof (value)) {
    case "number":
        return value;
    case "boolean":
        return value ? 1 : 0;
    default:
        value = value.toString();
    case "string":
        value = parseInt(value, 10);
        if (isNaN(value) && !isNaN(defaultValue)) {
            value = defaultValue;
        }
        return value;
    }
}
function $String(value, format) {
    switch (typeof (value)) {
    case "undefined":
    case "object":
        if (!value) {
            return "";
        }
        break;
    case "string":
    case "number":
        return value;
    }
    if (!format) {
        return "" + value;
    }
    format.prefix = format.prefix || "{ ";
    format.separator = format.separator || ", ";
    format.joiner = format.joiner || ": ";
    format.suffix = format.suffix || " }";
    format.maxDepth = format.maxDepth || 0;
    format.ignore = format.ignore || {};
    format.ignore.keys = format.ignore.keys || [];
    format.ignore.types = format.ignore.types || ["function", "undefined"];
    var keys = [];
    if (value.constructor == Array) {
        for (var i = 0; i < value.length; i++) {
            keys.push(i);
        }
    } else {
        keys = Object.getAllKeys(value);
    }
    var str = "";
    for (var i = 0; i < keys.length; i++) {
        var key = keys[i];
        var ignored = (format.ignore.keys.indexOf(key) != -1);
        if (!ignored) {
            var aValue;
            try {
                aValue = value[key];
            } catch (e) {
                ignored = true;
            }
            ignored = ignored || (format.ignore.types.indexOf(typeof (aValue)) != -1);
            ignored = ignored || (format.ignore.emptyStrings && aValue == "");
            if (!ignored) {
                if (typeof (aValue) == "object" && format.maxDepth > 0) {
                    format.maxDepth--;
                    aValue = ($String)(aValue, format);
                    format.maxDepth++;
                }
                if (str.length) {
                    str += format.separator;
                }
                str += key + format.joiner + aValue;
            }
        }
    }
    return format.prefix + str + format.suffix;
}
function $Nodes(descriptor, parentNode) {
    var nodes;
    if (typeof (descriptor) == "string") {
        nodes = (document.getElementById(descriptor) || new site9.CssSelector(descriptor).selectAll(parentNode));
    } else {
        nodes = descriptor;
    }
    return ($Array)(nodes);
}
function $Node(descriptor, parentNode) {
    var nodes = ($Nodes)(descriptor, parentNode);
    return (nodes.length ? nodes[0] : null);
}
function isNaO(obj) {
    return (obj === null || typeof (obj) !== "object");
}
function _(descriptor) {
    if (typeof (descriptor) == "string" || (descriptor && descriptor.constructor == String)) {
        return document.getElementById(descriptor);
    }
    return descriptor;
}
function __(descriptor, startingAt) {
    return ___(descriptor, startingAt)[0];
}
function ___(descriptor, startingAt) {
    if (typeof (descriptor) == "string" || (descriptor && descriptor.constructor == String)) {
        return new site9.CssSelector(descriptor).selectAll(startingAt);
    }
    return [descriptor];
}(function () {
    Object.___getThis = function (_arg, _this, _disallow) {
        if (_arg) {
            return _arg;
        } else {
            if (_this != _disallow) {
                return _this;
            } else {
                return null;
            }
        }
    };
    Object.overlay = function (properties, _this) {
        _this = Object.___getThis(_this, this, Object);
        for (var key in properties) {
            var oldValue = _this[key];
            var newValue = properties[key];
            if (!isNaO(oldValue) && !isNaO(newValue)) {
                newValue = Object.overlay(newValue, oldValue);
            }
            _this[key] = newValue;
        }
        return _this;
    };
    Object.overlay({
        create: function (prototype) {
            function Ctor() {}
            Ctor.prototype = prototype || Object.prototype;
            return new Ctor();
        },
        copyTo: function (object, _this) {
            _this = Object.___getThis(_this, this, Object);
            object = object || {};
            for (var aKey in _this) {
                var value = _this[aKey];
                if (object[aKey] != value) {
                    object[aKey] = value;
                }
            }
            return object;
        },
        swap: function (object, keys, _this) {
            _this = Object.___getThis(_this, this, Object);
            for (var i = 0; i < keys.length; i++) {
                var aKey = keys[i];
                var swap = object[aKey];
                object[aKey] = _this[aKey];
                _this[aKey] = swap;
            }
        },
        getAllKeys: function (_this) {
            _this = Object.___getThis(_this, this, Object);
            var allKeys = [];
            for (var aKey in _this) {
                allKeys.push(aKey);
            }
            return allKeys;
        },
        hasKey: function (key, _this) {
            _this = Object.___getThis(_this, this, Object);
            return (key in _this);
        },
        respondsTo: function (key, _this) {
            _this = Object.___getThis(_this, this, Object);
            return typeof (_this[key]) == "function";
        }
    }, Object);
    Object.overlay({
        _TRIMMER: /(^\s+)?(\s+$)?/g
    }, String);
    Object.overlay({
        trim: function () {
            return this.replace(String._TRIMMER, "");
        },
        startsWith: function (theString) {
            return (this.length >= theString.length && this.substring(0, theString.length) == theString);
        },
        endsWith: function (theString) {
            return (this.length >= theString.length && this.substring(this.length - theString.length) == theString);
        },
        toTitleCase: function () {
            return this.length ? this.substring(0, 1).toUpperCase() + this.substring(1) : this;
        },
        spliced: function (start, len, toInsert) {
            if (!toInsert) {
                toInsert = "";
            }
            if (!start) {
                start = 0;
            }
            if (!len) {
                len = 0;
            }
            return this.replace(new RegExp("(.{" + start + "})(.{" + len + "})(.*)"), "$1" + toInsert + "$3");
        }
    }, String.prototype);
    Object.overlay({
        indexOf: function (theObject) {
            for (var i = 0; i < this.length; i++) {
                if (theObject === this[i]) {
                    return i;
                }
            }
            return -1;
        },
        lastObject: function () {
            return this[this.length - 1];
        },
        objectEnumerator: function () {
            var enumerator = {};
            for (var i = 0; i < this.length; i++) {
                enumerator[this[i]] = this[i];
            }
            return enumerator;
        },
        uniqueCopy: function () {
            var theUniqArray = this.copy();
            theUniqArray.removeDuplicates();
            return theUniqArray;
        },
        copy: function () {
            return [].concat(this);
        },
        removeObject: function (anObj) {
            var removed = null;
            for (var i = this.length - 1; i >= 0; i--) {
                if (anObj == this[i]) {
                    this.splice(i, 1);
                    removed = anObj;
                }
            }
            return removed;
        },
        removeDuplicates: function () {
            var removed = [];
            for (var i = 0, n = this.length; i < n; i++) {
                var obj = this[i];
                for (var j = 0; j < i; j++) {
                    if (this[j] == this[i]) {
                        removed.push(this[i]);
                        this.splice(i, 1);
                        j = i;
                        i--;
                    }
                }
            }
            return removed;
        },
        replace: function (oldObject, newObject) {
            for (var i = 0; i < this.length; i++) {
                if (this[i] == oldObject) {
                    this[i] = newObject;
                }
            }
        },
        pushAll: function (array) {
            this.push.apply(this, array);
            return this;
        },
        unshiftAll: function (array) {
            for (var i = 0; i < array.length; i++) {
                this.unshift(array[i]);
            }
            return this;
        },
        where: function (fn, args) {
            args = args || [];
            var results = [];
            for (var i = 0; i < this.length; i++) {
                if (fn.apply(this[i] || window, args)) {
                    results.push(this[i]);
                }
            }
            return results;
        },
        and: function (array) {
            var result = [];
            for (var i = 0; i < this.length; i++) {
                var obj = this[i];
                if (array.indexOf(obj) != -1) {
                    result.push(obj);
                }
            }
            return result;
        },
        not: function () {
            var inv = {
                length: 0,
                indexOf: function (theObject) {
                    return (this._inverse.indexOf(theObject) == -1) ? 0 : -1;
                },
                not: function () {
                    return this._inverse;
                },
                and: function (array) {
                    return array.and(this);
                },
                or: function (array) {
                    return array.or(this);
                },
                xor: function (array) {
                    return array.xor(this);
                }
            };
            inv._inverse = this;
            return inv;
        },
        or: function (array) {
            var result = this.concat(array);
            result.removeDuplicates();
            return result;
        },
        xor: function (array) {
            return this.or(array).and(this.and(array).not());
        }
    }, Array.prototype);
    Object.overlay({
        escape: function (str) {
            return str ? str.replace(/([()\[\]{}^$*+?|.\\])/g, "\\$1") : str;
        },
        reset: function () {
            if ("lastIndex" in RegExp) {
                RegExp.lastIndex = 0;
            }
            if ("lastIndex" in this) {
                this.lastIndex = 0;
            }
            return this;
        }
    }, RegExp);
    site9 = {
        windowHasLoaded: false
    };
    site9.Objects = Object.copyTo(null, Object);
    Object.overlay({
        toString: function (obj, prefix, separator, joiner, suffix, ignoreEmpties, ignoredKeys, ignoreFunctions) {
            var format = {
                prefix: prefix,
                separator: separator,
                joiner: joiner,
                suffix: suffix,
                ignore: {
                    keys: ignoredKeys,
                    types: []
                },
                maxDepth: 0
            };
            if (ignoreEmpties) {
                format.ignore.types.push("undefined");
                format.ignore.emptyStrings = true;
            }
            if (ignoreFunctions) {
                format.ignore.types.push("function");
            }
            return ($String)(obj, format);
        },
        overlayOn: Object.overlay,
        swap: function (object1, object2, attributes) {
            return Object.swap(object1, attributes, object2);
        }
    }, site9.Objects);
    site9.Arrays = {
        copy: function (theArray) {
            return Array.prototype.copy.call(theArray);
        },
        indexOf: function (theArray, theObject) {
            return Array.prototype.indexOf.call(theArray, theObject);
        },
        uniqueCopy: function (theArray) {
            return Array.prototype.uniqueCopy.call(theArray);
        }
    };
    site9.locate = function (identifier) {
        try {
            return eval(identifier);
        } catch (e) {
            return null;
        }
    };
    site9.execJS = function (node) {
        var bSaf = (navigator.userAgent.indexOf("Safari") != -1);
        var bOpera = (navigator.userAgent.indexOf("Opera") != -1);
        var bMoz = (navigator.appName == "Netscape");
        if (!node) {
            return;
        }
        var st = node.getElementsByTagName("SCRIPT");
        var strExec;
        for (var i = 0; i < st.length; i++) {
            if (bSaf) {
                strExec = st[i].innerHTML;
                st[i].innerHTML = "";
            } else {
                if (bOpera) {
                    strExec = st[i].text;
                    st[i].text = "";
                } else {
                    if (bMoz) {
                        strExec = st[i].textContent;
                        st[i].textContent = "";
                    } else {
                        strExec = st[i].text;
                        st[i].text = "";
                    }
                }
            }
            try {
                var x = document.createElement("script");
                x.type = "text/javascript";
                if ((bSaf) || (bOpera) || (bMoz)) {
                    x.innerHTML = strExec;
                } else {
                    x.text = strExec;
                }
                document.getElementsByTagName("head")[0].appendChild(x);
            } catch (e) {
                alert("execJS Error: " + e);
            }
        }
    };
    site9.debug = function () {
        var consoleName = "out";
        if (window.console && console.firebug) {
            console.log.apply(console, arguments);
        } else {
            var _console = site9.DebugConsole.withName(consoleName, true);
            for (var i = 0; i < arguments.length; i++) {
                _console.append(arguments[i]);
            }
            _console.appendln("");
        }
        return site9;
    };
    site9.debug.getStackTrace = function (e) {
        var skip = 0;
        try {
            if (!e) {
                site9.debug.currentStackTrace.generateException();
            }
        } catch (_exception) {
            e = _exception;
            skip = 1;
        }
        var lines = e.stack.split(/[\r\n]+/);
        var sb = [];
        for (var i = skip; i < lines.length; i++) {
            var line = lines[i];
            sb.push(line);
        }
        return sb.join("\r\n");
    };
    site9.clearDebug = function (consoleName) {
        if (!consoleName) {
            consoleName = "out";
        }
        var console = site9.DebugConsole.withName(consoleName);
        if (console) {
            console.clear();
        }
    };
    site9.DebugConsole = function (name) {
        this.name = name;
        site9.DebugConsole._namedConsoles[name] = this;
    };
    Object.overlay({
        _buffer: null,
        _window: null,
        _popupWarinings: false,
        enabled: true,
        _indent: "",
        _isStartOfLine: true,
        append: function (theText) {
            if (this.enabled) {
                if (this._isStartOfLine) {
                    theText = this.prefix() + theText;
                }
                this._appendText(theText);
            }
            return this;
        },
        appendln: function (theText) {
            this.append(theText + "\r\n");
            this._isStartOfLine = true;
            return this;
        },
        clear: function () {
            if (this._hasWindow()) {
                this._window.document.getElementById("main").value = this.header();
            } else {
                if (this._buffer) {
                    delete this._buffer;
                }
            }
            this._isStartOfLine = true;
        },
        increaseIndent: function () {
            this._indent += "\t";
        },
        decreaseIndent: function () {
            this._indent = this._indent.replace(/\t$/, "");
        },
        prefix: function () {
            return this._indent;
        },
        header: function () {
            var str = 'This window acts as a console for your JavaScript.\r\nSimply call site9.debug("sometext"';
            if (this.name == "out") {
                str += "[";
            }
            str += ', "' + this.name + '"';
            if (this.name == "out") {
                str += "]";
            }
            str += "); to have it appear here.\r\n--\r\n\r\n";
            return str;
        },
        title: function () {
            return "Site 9 JavaScript Debug Console [" + this.name + "]";
        },
        _appendText: function (theText) {
            if (!this._hasWindow()) {
                this._window = this._createWindow();
                if (!this._window) {
                    if (!this._buffer) {
                        if (this._popupWarnings) {
                            alert("S9 Debug Console (" + this.name + ") was not opened (pop-ups blocked?). Debug output will be silently buffered until it can be opened.");
                        }
                        this._buffer = [];
                    }
                    this._buffer.push(theText);
                    return this;
                } else {
                    if (this._buffer) {
                        theText = (this._buffer.join("") + theText);
                    }
                    this.clear();
                }
            }
            this._window.document.getElementById("main").value += theText;
        },
        _hasWindow: function () {
            return (this._window && !this._window.closed);
        },
        _createWindow: function () {
            if (!site9.windowHasLoaded) {
                return false;
            }
            var winName = "s9_debug_" + this.name;
            var win = window.open("", winName, "resizable,scrollbars=NO,width=500,height=500");
            if (!win) {
                return false;
            }
            window.focus();
            win.name = winName;
            win.document.open();
            //win.document.write("<html><head><title>" + this.title() + "</title><style>body{margin:0;text-align:right}*{font-family:Monaco;font-size:9px;}textarea{width:99%;height:99.5%;margin:0;padding:0;border:none}div{position:absolute;bottom:0px;right:16px;padding:3px;background:#eee;border:1px solid #ccc;border-bottom:none}</style><meta charset="UTF - 8 "></head><body><div><a href=\"javascript:void(window.opener.site9.clearDebug('" + this.name + '\'))">Clear Console</a></div><textarea id="main"></textarea></body></html>'));
			win.document.write("<html><head><title>" + this.title() + "</title><style>body{margin:0;text-align:right}*{font-family:Monaco;font-size:9px;}textarea{width:99%;height:99.5%;margin:0;padding:0;border:none}div{position:absolute;bottom:0px;right:16px;padding:3px;background:#eee;border:1px solid #ccc;border-bottom:none}</style><meta charset=\"UTF - 8 \"></head><body><div><a href=\"javascript:void(window.opener.site9.clearDebug('" + this.name + '\'))">Clear Console</a></div><textarea id="main"></textarea></body></html>');
            win.document.close();
            return win;
        },
        toString: function () {
            return "[" + this.title() + "]";
        }
    }, site9.DebugConsole.prototype);
    site9.DebugConsole._namedConsoles = {};
    site9.DebugConsole.withName = function (consoleName, create) {
        if (!consoleName) {
            consoleName = "out";
        }
        var console = this._namedConsoles[consoleName];
        if (!console && create) {
            console = new site9.DebugConsole(consoleName);
        }
        return console;
    };
    if ((/[?&]site9.debug.enabled=(yes|true|1)\b/i).test(window.location.search) || window.location.hostname.lastIndexOf(".") < window.location.hostname.length - 4) {
        var aConsole = site9.DebugConsole.withName("out", true);
        aConsole.super_prefix = aConsole.prefix;
        aConsole.prefix = function () {
            return "[" + new Date().getTime() + "] " + this.super_prefix();
        };
        aConsole = site9.DebugConsole.withName("alert", true);
        aConsole._createWindow = function () {
            return null;
        };
        aConsole._popupWarinings = false;
        aConsole.super_appendln = aConsole.appendln;
        aConsole.appendln = function (theText) {
            this.super_appendln(theText);
            window.alert(this._buffer.join(""));
            this.clear();
            return this;
        };
        aConsole = site9.DebugConsole.withName("defer", true);
        aConsole._clientConsole = site9.DebugConsole.withName("out");
        aConsole.prefix = function () {
            return this._clientConsole.prefix();
        };
        aConsole.increaseIndent = function () {
            this._clientConsole.increaseIndent();
            return this;
        };
        aConsole.decreaseIndent = function () {
            this._clientConsole.decreaseIndent();
            return this;
        };
        aConsole._createWindow = function () {
            site9.debug("initiating defer.flush() interval.");
            setInterval('site9.DebugConsole.withName("defer").flush()', 2000);
            return {
                document: {
                    value: "",
                    getElementById: function () {
                        return this;
                    }
                },
                closed: false
            };
        };
        aConsole.header = function () {
            return "";
        };
        aConsole.flush = function () {
            if (this._window.document.value.length > 0) {
                site9.debug(this._window.document.value);
                this._window.document.value = "";
            }
        };
    } else {
        site9.debug = site9.clearDebug = function () {};
    }
    try {
        site9.debug("Using built-in Node constants (ELEMENT_NODE: " + Node.ELEMENT_NODE + ")");
        site9._NodeConstants = Node;
    } catch (e) {
        site9._NodeConstants = {
            ELEMENT_NODE: 1,
            TEXT_NODE: 3,
            COMMENT_NODE: 8,
            DOCUMENT_NODE: 9,
            DOCUMENT_FRAGMENT_NODE: 11
        };
    }
    site9.isStructuralNode = function (theNode) {
        var ntype = theNode.nodeType;
        return (ntype == site9._NodeConstants.ELEMENT_NODE || ntype == site9._NodeConstants.DOCUMENT_NODE || ntype == site9._NodeConstants.DOCUMENT_FRAGMENT_NODE);
    };
    site9.nodeAncestry = function (theNode, stoppingBefore) {
        var list = [];
        if (theNode) {
            while ((theNode = theNode.parentNode) && (theNode != stoppingBefore)) {
                list.push(theNode);
            }
        }
        return list;
    };
    site9.nodePath = function (theNode, stoppingBefore) {
        var path = site9.nodeAncestry(theNode, stoppingBefore);
        path.reverse();
        path.push(theNode);
        return path;
    };
    site9.nodePathString = function (theNode, stoppingBefore) {
        if (typeof (theNode) == "string") {
            return theNode;
        }
        return path = site9.nodePath(theNode, stoppingBefore).forEach(function () {
            return site9.nodeDescription(this);
        }).join("/");
    };
    site9.nodeTreeString = function (theNode, depth) {
        var buffer = "";
        if (!depth) {
            depth = "";
            buffer += site9.nodePathString(theNode);
        } else {
            buffer += depth;
            buffer += site9.nodeDescription(theNode);
        }
        buffer += "\r\n";
        depth += "\t";
        for (var i = 0; i < theNode.childNodes.length; i++) {
            buffer += site9.nodeTreeString(theNode.childNodes[i], depth);
        }
        return buffer;
    };
    site9.nodeDescription = function (theNode, excluding) {
        var desc;
        if (!theNode) {
            return "";
        } else {
            if (theNode == window) {
                return "window";
            } else {
                if (theNode == document) {
                    return "document";
                } else {
                    if (typeof (theNode) == "string") {
                        return theNode;
                    } else {
                        if (theNode.nodeType != site9._NodeConstants.ELEMENT_NODE) {
                            desc = theNode.nodeValue;
                            if (desc) {
                                desc = " (" + desc.trim().replace(/^(......).*(......)$/, "$1...$2") + ")";
                            }
                            return theNode.nodeName + desc;
                        }
                    }
                }
            }
        }
        excluding = excluding || {};
        desc = theNode.tagName;
        if (theNode.id && !excluding.id) {
            desc += "#" + theNode.id;
        }
        if (theNode.className && !excluding.className) {
            desc += "." + theNode.className.replace(/\s+/g, ".");
        }
        if (theNode.parentNode && !excluding.index) {
            var sibs = theNode.parentNode.childNodes;
            for (var i = 0, nth = 0; i < sibs.length; i++) {
                if (site9.isStructuralNode(sibs[i])) {
                    nth++;
                }
                if (theNode == sibs[i]) {
                    desc += ":nth-child(" + nth + ")";
                }
            }
        }
        return desc;
    };
    site9.modifyClassNames = function (theNodes, regex, replacements) {
        for (var i = 0; i < theNodes.length; i++) {
            theNodes[i].className = theNodes[i].className.replace(regex, replacements);
        }
    };
    site9.alterClassNames = function (theNodes, classToAdd, classToRemove) {
        if (classToAdd) {
            site9.modifyClassNames(theNodes, /^(.*)\s*$/, "$1 " + classToAdd);
        }
        if (classToRemove) {
            site9.modifyClassNames(theNodes, new RegExp("\\b" + classToRemove + "\\b", "g"), "");
        }
    };
    site9.getElementByTagName = function (theTag, theNode) {
        return new site9._BasicCssSelector(theTag).selectFirst(theNode);
    };
    site9.getElementBySelector = function (theSelector, theNode) {
        return site9.getElementsBySelector(theSelector, theNode)[0];
    };
    site9.getElementsBySelector = function (theSelector, theNode) {
        return new site9.CssSelector(theSelector).selectAll(theNode);
    };
    site9.getParentByTagName = function (theTag, theNode) {
        return site9.deprecated("site9.getParentByTagName", site9.getParentBySelector);
    };
    site9.getParentsByTagName = function (theTag, theNode) {
        return site9.deprecated("site9.getParentsByTagName", site9.getParentsBySelector);
    };
    site9.getParentBySelector = function (theSelector, theNode) {
        return new site9.CssSelector(theSelector).selectedNodes(site9.nodeAncestry(theNode))[0];
    };
    site9.getParentsBySelector = function (theSelector, theNode) {
        return new site9.CssSelector(theSelector).selectedNodes(site9.nodeAncestry(theNode));
    };
    site9.getChildOfParent = function (childSelector, parentSelector, theNode) {
        theNode = site9.getParentBySelector(parentSelector, theNode);
        if (!theNode) {
            return null;
        }
        return site9.getElementBySelector(childSelector, theNode);
    };
    site9.getChildrenOfParent = function (childSelector, parentSelector, theNode) {
        theNode = site9.getParentBySelector(parentSelector, theNode);
        if (!theNode) {
            return [];
        }
        return site9.getElementsBySelector(childSelector, theNode);
    };
    site9.getChildrenOfParents = function (childSelector, parentSelector, theNode) {
        var theNodes = site9.getParentsBySelector(parentSelector, theNode);
        var selected = [];
        for (var i = 0; i < theNodes.length; i++) {
            selected = selected.concat(site9.getElementsBySelector(childSelector, theNode));
        }
        selected.removeDuplicates();
        return selected;
    };
    site9.parseHTML = function (html) {
        var el = document.createElement("div");
        el.innerHTML = html;
        switch (el.childNodes.length) {
        case 0:
            return null;
        case 1:
            return el.childNodes[0];
        default:
            var frag = document.createDocumentFragment();
            while (el.childNodes.length) {
                frag.appendChild(el.childNodes[0]);
            }
            return frag;
        }
    };
    site9.navigateNodes = function (instructions, theNode) {
        if (!theNode) {
            theNode = document;
        }
        instructions = unescape(instructions).replace(/\s+/g, "");
        for (var i = 0; i < instructions.length; i++) {
            var instr = instructions.substring(i, i + 1);
            do {
                if (instr == "^") {
                    theNode = theNode.parentNode;
                } else {
                    if (instr == ">") {
                        theNode = theNode.nextSibling;
                    } else {
                        if (instr == "v") {
                            theNode = theNode.childNodes[0];
                        } else {
                            if (instr == "<") {
                                theNode = theNode.previousSibling;
                            } else {
                                site9.debug("site9.navigateNodes: Unknown instruction '" + instr + "'");
                            }
                        }
                    }
                }
                if (!theNode) {
                    return null;
                }
            } while (!site9.isStructuralNode(theNode));
        }
        return theNode;
    };
    site9.navigateNodesCss = function (instructions, theNode) {
        instructions = unescape(instructions);
        instructions = instuctions.replace(/</g, "^").replace(/>/g, "v");
        instructions = instuctions.replace(/-/g, "<").replace(/\+/g, ">");
        return site9.navigateNodes(instructions, theNode);
    };
    site9.CssSelector = function (params) {
        if (site9.CssSelector.DEBUG) {
            site9.debug("Creating CssSelector from: ", params);
        }
        this.simpleSels = [];
        params = site9.CssSelector._prepareParams(params);
        while (site9.CssSelector._peek(params) != "") {
            this.simpleSels.push(new site9._SimpleCssSelector(params));
            site9.CssSelector._skip(params, site9.CssSelector.SEPARATOR);
        }
        if (site9.CssSelector.DEBUG) {
            site9.debug("CssSelector: ", this);
        }
    };
    Object.overlay({
        SEPARATOR: /[,\s]/,
        SPACE: /\s/,
        _prepareParams: function (params) {
            if (!params._pos) {
                if (typeof (params) == "string") {
                    params = {
                        format: params
                    };
                } else {
                    if (!params) {
                        params = {
                            format: ""
                        };
                    } else {
                        if (params.selecting) {
                            var path = site9.nodePath(params.selecting, params.relativeTo || document);
                            delete params.selecting;
                            path.forEach(function () {
                                return site9.nodeDescription(this, {
                                    id: true,
                                    className: true
                                });
                            });
                            params.format = "> " + path.join(" > ");
                        }
                    }
                }
                params.format = this._preproc(params.format);
                params._pos = {
                    i: 0,
                    n: params.format.length
                };
                site9.CssSelector._skip(params, site9.CssSelector.SPACE);
            }
            return params;
        },
        _preproc: function (text) {
            var b = [],
                bn = 0,
                x = /\\/,
                q = /["']/,
                w = /\w/,
                esc = null,
                pesc = null,
                quote = null;
            for (var i = 0, n = text.length; i < n; i++) {
                var c = text.charAt(i);
                if (esc) {
                    esc = null;
                } else {
                    if (x.test(c)) {
                        esc = c;
                        c = "";
                    } else {
                        if (quote) {
                            if (quote == c) {
                                quote = null;
                                c = "";
                            }
                        } else {
                            if (q.test(c)) {
                                quote = c;
                                c = "";
                            }
                        }
                    }
                }
                if (c.length) {
                    if ((pesc || quote) && !w.test(c)) {
                        b[bn++] = "\\";
                    }
                    b[bn++] = c;
                }
                pesc = esc;
            }
            return b.join("");
        },
        _skip: function (params, while_) {
            var old_i = params._pos.i;
            for (; params._pos.i < params._pos.n && while_.test(params.format.charAt(params._pos.i)); params._pos.i++) {}
            return params._pos.i - old_i;
        },
        _peek: function (params) {
            return ((params._pos.i < params._pos.n) ? params.format.charAt(params._pos.i) : "");
        },
        _read: function (params, until) {
            var x = /\\/,
                esc = null,
                b = [],
                bn = 0;
            var n = params._pos.n;
            if (typeof (until) == "number") {
                n = params._pos.i + until;
                until = /^$/;
            }
            for (var match = false; !match && params._pos.i < n;) {
                var c = params.format.charAt(params._pos.i);
                if (esc) {
                    esc = null;
                } else {
                    if (x.test(c)) {
                        esc = c;
                    } else {
                        match = until.test(c);
                    }
                }
                if (!match) {
                    params._pos.i++;
                    if (!esc) {
                        b[bn++] = c;
                    }
                }
            }
            return b.join("");
        },
        _unread: function (params, c) {
            params._pos.i -= c.length;
        },
        DEBUG: false
    }, site9.CssSelector);
    Object.overlay({
        selectAll: function (theNode) {
            if (!theNode) {
                theNode = document;
            }
            if (site9.CssSelector.DEBUG) {
                site9.debug(this, ".selectAll(): ", theNode);
            }
            var possible = [];
            for (var i = 0; i < this.simpleSels.length; i++) {
                possible = possible.concat(this.simpleSels[i].selectAll(theNode));
            }
            possible.removeDuplicates();
            if (site9.CssSelector.DEBUG) {
                site9.debug(this, ".selectAll(): selected ", possible.length, " nodes");
            }
            return possible;
        },
        selectReverse: function (theNode) {
            if (!theNode) {
                theNode = document;
            }
            if (site9.CssSelector.DEBUG) {
                site9.debug(this, ".selectReverse(): ", theNode);
            }
            var possible = [];
            for (var i = 0; i < this.simpleSels.length; i++) {
                possible = possible.concat(this.simpleSels[i].selectReverse(theNode));
            }
            possible.removeDuplicates();
            if (site9.CssSelector.DEBUG) {
                site9.debug(this, ".selectReverse(): selected ", possible.length, " nodes");
            }
            return possible;
        },
        selectFirst: function (theNode) {
            return this.selectAll(theNode)[0];
        },
        selectLast: function (theNode) {
            return this.selectAll(theNode).reverse()[0];
        },
        selectsNode: function (theNode, fromNode) {
            if (site9.CssSelector.DEBUG) {
                site9.debug(this, ".selectsNode(): ", theNode);
            }
            var selectsFrom = this.selectReverse(theNode);
            if (!fromNode) {
                return selectsFrom.length > 0;
            }
            for (var i = 0; i < selectsFrom.length; i++) {
                if (selectsFrom[i] == fromNode) {
                    return true;
                }
            }
            return false;
        },
        selectedNodes: function (possible, fromNode) {
            if (site9.CssSelector.DEBUG) {
                site9.debug(this, ".selectedNodes(): ", theNode);
            }
            var selected = [];
            for (var i = 0; i < possible.length; i++) {
                if (this.selectsNode(possible[i], fromNode)) {
                    selected.push(possible[i]);
                }
            }
            return selected;
        },
        toString: function () {
            return this.simpleSels.join(", ");
        },
        copy: function () {
            var theCopy = new site9.CssSelector();
            for (var i = 0; i < this.simpleSels.length; i++) {
                theCopy.simpleSels[i] = this.simpleSels[i].copy();
            }
            return theCopy;
        }
    }, site9.CssSelector.prototype);
    site9._SimpleCssSelector = function (params) {
        if (site9._SimpleCssSelector.DEBUG) {
            site9.debug("Creating _SimpleCssSelector from: ", params);
        }
        this.basicSels = [];
        params = site9.CssSelector._prepareParams(params);
        while (!site9._SimpleCssSelector.EoSEL.test(site9.CssSelector._peek(params))) {
            this.basicSels.push(new site9._BasicCssSelector(params));
            site9.CssSelector._skip(params, site9.CssSelector.SPACE);
        }
        if (site9._SimpleCssSelector.DEBUG) {
            site9.debug("_SimpleCssSelector: ", this);
        }
    };
    Object.overlay({
        EoSEL: /^,?$/,
        DEBUG: site9.CssSelector.DEBUG
    }, site9._SimpleCssSelector);
    Object.overlay({
        selectAll: function (theNode) {
            if (site9._SimpleCssSelector.DEBUG) {
                site9.debug(this, ".selectAll(): ", theNode);
            }
            var selected = [theNode];
            for (var i1 = 0; i1 < this.basicSels.length; i1++) {
                var possible = [];
                for (var i2 = 0; i2 < selected.length; i2++) {
                    possible = possible.concat(this.basicSels[i1].selectAll(selected[i2]));
                }
                possible.removeDuplicates();
                selected = possible;
            }
            if (site9._SimpleCssSelector.DEBUG) {
                site9.debug(this, ".selectAll(): selected ", selected.length, " nodes");
            }
            return selected;
        },
        selectReverse: function (theNode) {
            if (site9._SimpleCssSelector.DEBUG) {
                site9.debug(this, ".selectReverse(): ", theNode);
            }
            var selected = [theNode];
            for (var i1 = this.basicSels.length - 1; i1 >= 0; i1--) {
                var possible = [];
                for (var i2 = 0; i2 < selected.length; i2++) {
                    possible = possible.concat(this.basicSels[i1].selectReverse(selected[i2]));
                }
                possible.removeDuplicates();
                selected = possible;
            }
            if (site9._SimpleCssSelector.DEBUG) {
                site9.debug(this, ".selectReverse(): selected ", selected.length, " nodes");
            }
            return selected;
        },
        selectFirst: site9.CssSelector.prototype.selectFirst,
        selectLast: site9.CssSelector.prototype.selectLast,
        selectsNode: site9.CssSelector.prototype.selectsNode,
        selectedNodes: site9.CssSelector.prototype.selectedNodes,
        toString: function () {
            return this.basicSels.join(" ");
        },
        copy: function () {
            var theCopy = new site9._SimpleCssSelector();
            for (var i = 0; i < this.basicSels.length; i++) {
                theCopy.basicSels[i] = this.basicSels[i].copy();
            }
            return theCopy;
        }
    }, site9._SimpleCssSelector.prototype);
    site9._BasicCssSelector = function (params) {
        if (site9._BasicCssSelector.DEBUG) {
            site9.debug("Creating _BasicCssSelector from: ", params);
        }
        this.cssMatchers = [];
        params = site9.CssSelector._prepareParams(params);
        if (site9._BasicCssSelector.JOINER.test(site9.CssSelector._peek(params))) {
            this._joiner = site9.CssSelector._read(params, 1);
            site9.CssSelector._skip(params, site9.CssSelector.SPACE);
        }
        var aMatcher;
        while (!site9._BasicCssSelector.EoSEL.test(site9.CssSelector._peek(params))) {
            this.cssMatchers.push(aMatcher = new site9._CssMatcher(params));
            switch (aMatcher._property) {
            case "tagName":
                this._tagName = aMatcher._value;
                break;
            case "id":
                this._id = aMatcher._value;
                break;
            }
        }
        if (site9._BasicCssSelector.DEBUG) {
            site9.debug("_BasicCssSelector: ", this);
        }
    };
    Object.overlay({
        JOINER: /[<>^\s\-+`~]/,
        EoSEL: /^[,<>^\s\-+`~]?$/,
        DEBUG: site9._SimpleCssSelector.DEBUG
    }, site9._BasicCssSelector);
    Object.overlay({
        _tagName: "*",
        _joiner: " ",
        selectAll: function (theNode) {
            if (site9._BasicCssSelector.DEBUG) {
                site9.debug(this, ".selectAll(): ", theNode);
            }
            var possible = this._join(theNode, this._joiner);
            var selected = [];
            for (var i = 0; i < possible.length; i++) {
                if (this._matchesNode(possible[i])) {
                    selected.push(possible[i]);
                }
            }
            if (site9._BasicCssSelector.DEBUG) {
                site9.debug(this, ".selectAll(): selected ", selected.length, " nodes");
            }
            return selected;
        },
        selectReverse: function (theNode) {
            if (site9._BasicCssSelector.DEBUG) {
                site9.debug(this, ".selectReverse(): ", theNode);
            }
            var selected = [];
            if (this._matchesNode(theNode)) {
                selected = this._join(theNode, this._inverseJoiner());
            }
            if (site9._BasicCssSelector.DEBUG) {
                site9.debug(this, ".selectReverse(): selected ", selected.length, " nodes");
            }
            return selected;
        },
        selectFirst: site9.CssSelector.prototype.selectFirst,
        selectLast: site9.CssSelector.prototype.selectLast,
        selectsNode: site9.CssSelector.prototype.selectsNode,
        selectedNodes: site9.CssSelector.prototype.selectedNodes,
        _matchesNode: function (theNode) {
            if (site9._BasicCssSelector.DEBUG) {
                site9.debug(this, "._matchesNode(): ", theNode);
            }
            var noTagName = (!this._tagName);
            var isDocument = (theNode == document);
            if (noTagName || isDocument) {
                return (noTagName && isDocument);
            }
            if (!site9.isStructuralNode(theNode)) {
                return false;
            }
            for (var i = 0; i < this.cssMatchers.length; i++) {
                if (!this.cssMatchers[i].matchesNode(theNode)) {
                    return false;
                }
            }
            return true;
        },
        _join: function (theNode, theJoiner) {
            switch (theJoiner) {
            case ".":
                return [theNode];
            case " ":
                if (this._id) {
                    var node = document.getElementById(this._id);
                    return (node && site9.nodeAncestry(node, theNode.parentNode).lastObject() == theNode) ? [node] : [];
                } else {
                    return theNode.getElementsByTagName(this._tagName);
                }
            case "^":
                return site9.nodeAncestry(theNode);
            case ">":
                return theNode.childNodes;
            case "<":
                return [theNode.parentNode];
            case "+":
                do {
                    theNode = theNode.nextSibling;
                } while (theNode && !site9.isStructuralNode(theNode));
                return (theNode ? [theNode] : []);
            case "-":
                do {
                    theNode = theNode.previousSibling;
                } while (theNode && !site9.isStructuralNode(theNode));
                return (theNode ? [theNode] : []);
            case "~":
                if (!theNode.parentNode) {
                    return [];
                }
                var sibs = [].concat(theNode.parentNode.childNodes);
                var index = sibs.indexOf(theNode) + 1;
                sibs = (index < sibs.length) ? sibs.slice(index) : [];
                return sibs;
            case "`":
                var sibs = Array.prototype.copy.apply(theNode.parentNode.childNodes);
                var index = sibs.indexOf(theNode);
                return (index > 0) ? sibs.slice(0, index) : [];
            default:
                site9.debug("********** WARNING: ", this, ": Unsupported joiner: ", theJoiner, " **********");
                return [];
            }
        },
        _inverseJoiner: function () {
            switch (this._joiner) {
            case ".":
                return ".";
            case " ":
                return "^";
            case "^":
                return " ";
            case ">":
                return "<";
            case "<":
                return ">";
            case "+":
                return "-";
            case "-":
                return "+";
            case "~":
                return "`";
            case "`":
                return "~";
            }
            site9.debug("********** WARNING: ", this, ": Unsupported joiner: ", theJoiner, " **********");
            return null;
        },
        toString: function () {
            if (this._joiner == ".") {
                return "";
            }
            var str = "";
            if (this._joiner && this._joiner != " ") {
                str += this._joiner + " ";
            }
            return str + this.cssMatchers.join("");
        },
        copy: function () {
            var theCopy = new site9._BasicCssSelector();
            theCopy._joiner = this._joiner;
            for (var i = 0; i < this.cssMatchers.length; i++) {
                theCopy.cssMatchers[i] = this.cssMatchers[i].copy();
            }
            return theCopy;
        }
    }, site9._BasicCssSelector.prototype);
    site9._CssMatcher = function (params) {
        if (site9._CssMatcher.DEBUG) {
            site9.debug("Creating _CssMatcher from: ", params, {
                i: params._pos.i
            });
        }
        params = site9.CssSelector._prepareParams(params);
        var ts, c = site9.CssSelector._peek(params);
        params._pos.i++;
        switch (c) {
        case "[":
            ts = [];
            var pos = params._pos,
                subPos = {
                    i: pos.i
                };
            site9.CssSelector._read(params, site9._CssMatcher.EoATTR_SEL);
            site9.CssSelector._skip(params, site9._CssMatcher.EoATTR_SEL);
            subPos.n = pos.i;
            params._pos = subPos;
            site9.CssSelector._skip(params, site9.CssSelector.SPACE);
            ts[0] = site9.CssSelector._read(params, site9._CssMatcher.EoWORD);
            site9.CssSelector._skip(params, site9.CssSelector.SPACE);
            ts[1] = site9.CssSelector._read(params, site9._CssMatcher.EoOPERATOR);
            site9.CssSelector._skip(params, site9.CssSelector.SPACE);
            ts[2] = site9.CssSelector._read(params, site9._CssMatcher.EoWORD);
            params._pos = pos;
            break;
        case ":":
            var pseudo = site9.CssSelector._read(params, site9._CssMatcher.EoWORD);
            switch (pseudo) {
            case "first-child":
                this._nthChild = 1;
                break;
            case "last-child":
                this._nthChild = -1;
                break;
            case "nth-child":
            case "nth-last-child":
                if (site9.CssSelector._peek(params) == "(") {
                    var eqn = site9.CssSelector._read(params, site9._CssMatcher.EoPAREN);
                    site9.CssSelector._skip(params, site9._CssMatcher.EoPAREN);
                    eqn = eqn.substring(1).replace(/\s+/g, "").replace(/n\+?/, ",").split(",");
                    if (eqn.length == 1) {
                        this._nthChild = ($int)(eqn[0], 0);
                    } else {
                        throw "site9.CssSelector: Nth-child pseudo-class selection does not support 'an + b' equations where a is non-zero";
                    }
                } else {
                    throw "site9.CssSelector: Syntax Error: No equation found for " + pseudo + " selector";
                }
                break;
            default:
                if (site9._CssMatcher.NUMBER.test(pseudo)) {
                    site9.debug("********** WARNING: site9._CssMatcher: Pseudo-nth-child syntax ':", pseudo, "' is deprecated. Use :nth[-last]-child(b) pseudo-classes instead **********");
                    b = ($int)(pseudo);
                    if (b >= 0) {
                        this._nthChild = (b + 1);
                    } else {
                        this._nthChild = (0 - b);
                    }
                } else {
                    throw "site9.CssSelector: The pseudo-class '" + pseudo + "' in not supported";
                }
                break;
            }
            break;
        case "#":
            ts = ["id", "=", site9.CssSelector._read(params, site9._CssMatcher.EoMATCHER)];
            break;
        case ".":
            ts = ["class", "~=", site9.CssSelector._read(params, site9._CssMatcher.EoMATCHER)];
            break;
        default:
            site9.CssSelector._unread(params, c);
            ts = ["tagName", (c == "*" ? "" : "="), site9.CssSelector._read(params, site9._CssMatcher.EoMATCHER)];
            break;
        }
        if (ts) {
            this._attribute = ts[0];
            this._matchType = ts[1];
            this._value = ts[2];
            this._property = this._attribute.toLowerCase();
            this._property = site9._CssMatcher.ATTR_2_PROP[this._property] || this._property;
            switch (this._matchType) {
            case "":
                this._condition = {
                    test: function (val) {
                        return val != "";
                    }
                };
                break;
            case "~=":
                this._condition = new RegExp("(^|\\s)" + RegExp.escape(this._value) + "(\\s|$)");
                break;
            case "|=":
                this._condition = new RegExp("^" + RegExp.escape(this._value) + "(-|$)");
                break;
            case "=":
                this._condition = {
                    _val: this._value,
                    test: function (val, consideringCase) {
                        return (consideringCase ? (val == this._val) : (val && (val.toUpperCase() == this._val.toUpperCase())));
                    }
                };
                break;
            default:
                throw "site9.CssSelector: The attribute matching operator '" + this._matchType + "' is not supported";
                break;
            }
        }
        if (site9._CssMatcher.DEBUG) {
            site9.debug("_CssMatcher: ", this);
        }
    };
    Object.overlay({
        EoWORD: /[^\w\-]/,
        EoOPERATOR: /[^~\|=]/,
        EoMATCHER: /^[,<>^\s+`~\[.:#]?$/,
        EoATTR_SEL: /\]/,
        EoPAREN: /\)/,
        NUMBER: /^-?\d+$/,
        ATTR_2_PROP: {
            "class": "className",
            "tagname": "tagName",
            "for": "htmlFor",
            "alink": "aLink",
            "vlink": "vLink",
            "bgcolor": "bgColor"
        },
        DEBUG: site9._BasicCssSelector.DEBUG
    }, site9._CssMatcher);
    Object.overlay({
        matchesNode: function (theNode) {
            if (site9._CssMatcher.DEBUG) {
                site9.debug(this, "._matchesNode(): ", theNode);
            }
            if (this._nthChild) {
                var sibs = theNode.parentNode.childNodes;
                var nth = this._nthChild;
                var start, delta;
                if (nth > 0) {
                    start = 0;
                    delta = 1;
                } else {
                    start = sibs.length - 1;
                    delta = -1;
                    nth = -nth;
                }
                for (var i = start; 0 <= i && i < sibs.length; i += delta) {
                    var aSib = sibs[i];
                    if (site9.isStructuralNode(aSib)) {
                        nth--;
                        if (nth == 0) {
                            return (theNode == aSib);
                        }
                    }
                }
                return false;
            }
            if (this._property) {
                var consideringCase = (this._property == "tagName" && theNode.ownerDocument.xmlVersion);
                var value = theNode[this._property];
                return ((typeof (value) == "string") && value && this._condition.test(value, consideringCase));
            }
            return false;
        },
        toString: function () {
            if (this._nthChild > 0) {
                return ":nth-child(" + this._nthChild + ")";
            }
            if (this._nthChild < 0) {
                return ":nth-last-child(" + (-this._nthChild) + ")";
            }
            switch (this._attribute) {
            case "tagName":
                if (this._matchType == "=") {
                    return site9.CssSelector._preproc('"' + this._value + '"');
                } else {
                    if (this._matchType == "") {
                        return "*";
                    }
                }
                break;
            case "id":
                if (this._matchType == "=") {
                    return "#" + site9.CssSelector._preproc('"' + this._value + '"');
                }
                break;
            case "class":
                if (this._matchType == "~=") {
                    return "." + site9.CssSelector._preproc('"' + this._value + '"');
                }
                break;
            }
            if (this._attribute) {
                return "[" + site9.CssSelector._preproc('"' + this._attribute + '"') + this._matchType + site9.CssSelector._preproc('"' + this._value + '"') + "]";
            }
            return "";
        },
        copy: function () {
            var theCopy = new site9._CssMatcher();
            theCopy._attribute = this._attribute;
            theCopy._condition = this._condition;
            theCopy._nthChild = this._nthChild;
            theCopy._matchType = this._matchType;
            theCopy._value = this._value;
            return theCopy;
        }
    }, site9._CssMatcher.prototype);
    site9.css = {
        SEL: site9.CssSelector,
        selectAll: function (format, theNode) {
            return new site9.css.SEL(format).selectAll(theNode);
        },
        selectFirst: function (format, theNode) {
            return new site9.css.SEL(format).selectFirst(theNode);
        },
        className: {
            swap: function (el, class1, class2) {
                var cn = el.className;
                var swap = "#=_";
                while (cn.indexOf(swap) != -1) {
                    swap = (swap + swap);
                }
                if (class1) {
                    cn = cn.replace(new RegExp("(^|\\s)" + RegExp.escape(class1) + "(\\s|$)", "g"), "$1" + swap + "$2");
                }
                if (class2) {
                    cn = cn.replace(new RegExp("(^|\\s)" + RegExp.escape(class2) + "(\\s|$)", "g"), "$1" + (class1 || "") + "$2");
                }
                cn = cn.replace(new RegExp(swap, "g"), (class2 || ""));
                el.className = cn;
            },
            contains: function (el, aClass) {
                return new RegExp("(^|\\s)" + RegExp.escape(aClass) + "(\\s|$)").test(el.className);
            },
            add: function (el, aClass) {
                el.className += (" " + aClass);
            },
            remove: function (el, aClass) {
                this.swap(el, aClass, null);
            }
        }
    };
    site9.validEmail = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    site9.validURL = /^https?:\/\/[a-zA-Z0-9.\-]+\/[a-zA-Z0-9._\/\?\&;=#\-]*$/;
    site9.verifyEmail = function (emailAddress) {
        site9.deprecated("site9.verifyEmail", null, "Use site9.validEmail.test(...) instead");
        return site9.validEmail.test(emailAddress);
    };
    site9.verifyEmailWithAlert = function (emailAddress) {
        if (site9.validEmail.test(emailAddress)) {
            return true;
        }
        alert("'" + emailAddress + "' does not appear to be a valid e-mail address. Please double-check it.\r\n\r\nE-mail addresses are usually something like 'name@example.com'");
        return false;
    };
    site9.verifyURL = function (theURL) {
        site9.deprecated("site9.verifyURL", null, "Use site9.validURL.test(...) instead");
        return site9.validURL.test(emailAddress);
    };
    site9.verifyURLWithAlert = function (theURL) {
        if (site9.validURL.test(theURL)) {
            return true;
        }
        alert("'" + theURL + "' does not appear to be a valid URL. Please double-check it.\r\n\r\nComplete URLs must start with 'http://' or 'https://' and have at least a forward-slash after the host name, like 'http://www.example.com/'.");
        return false;
    };
    site9.verifyText = function (theText, maxLength) {
        return (theText.length <= maxLength);
    };
    site9.verifyTextWithAlert = function (theText, maxLength) {
        if (verifyText(theText, maxLength)) {
            return true;
        }
        theText = theText.substring(maxLength - 20, maxLength);
        alert("The text you provided is too long. Everything after '..." + theText + "' will be cut off.");
        return false;
    };
    site9.paginatedConfirm = function (pageHeader, text, linesPP) {
        var lines = text.split("\r\n").join("\n").split("\r").join("\n").split("\n");
        if (lines.length < linesPP) {
            return confirm(pageHeader + text);
        }
        var page;
        var pi = 1;
        var pn = parseInt("" + (lines.length / linesPP)) + 1;
        for (var i = 0; i < lines.length; i++) {
            page = pageHeader;
            var eop = i + linesPP;
            for (var j = i; j < eop; j++) {
                if (j < lines.length) {
                    page += lines[j];
                }
                page += "\r\n";
            }
            page += "\r\nPage " + pi + " of " + pn + ".\r\nClick OK to contiue, or Cancel to exit.";
            if (!confirm(page)) {
                return false;
            }
            i = j;
            pi++;
        }
        return true;
    };
    site9.replaceHash = function (theUrl, newHash) {
        if (!/^(#.*)?$/.test(newHash)) {
            newHash = "#" + newHash;
        }
        return theUrl.replace(/(#.*)?$/, newHash);
    };
    site9.els = {
        getAttr: function (el, attrName) {
            var attr = null;
            if (el && attrName) {
                attr = el.attributes.getNamedItem(attrName);
            }
            return (attr ? attr.nodeValue : null);
        },
        setAttr: function (el, attrName, attrValue) {
            if (!el || !attrName) {
                return;
            }
            if (typeof (attrValue) == "boolean") {
                attrValue = (attrValue ? attrName : null);
            }
            var attr = el.attributes.getNamedItem(attrName);
            if (attrValue) {
                if (!attr) {
                    el.attributes.setNamedItem(attr = document.createAttribute(attrName));
                }
                attr.nodeValue = attrValue;
            } else {
                if (attr) {
                    el.attributes.removeNamedItem(attrName);
                }
            }
        },
        create: function (el) {
            el = el || {};
            if (typeof (el) == "string") {
                return document.createTextNode(el);
            } else {
                if (typeof (el) == "object" && el && el.ownerDocument) {
                    return el;
                }
            }
            var newEl, list, i, n, key, attrVal;
            el.tagName = (el.tagName || "div");
            el.previousSibling = (el.previousSibling || null);
            el.nextSibling = (el.nextSibling || (el.previousSibling && el.previousSibling.nextSibling) || null);
            el.parentNode = (el.parentNode || (el.previousSibling && el.previousSibling.parentNode) || (el.nextSibling && el.nextSibling.parentNode));
            newEl = document.createElement(el.tagName);
            if (el.parentNode) {
                el.parentNode.insertBefore(newEl, el.nextSibling);
            }
            delete el.parentNode;
            delete el.nextSibling;
            delete el.previousSibling;
            delete el.tagName;
            if ("innerText" in el) {
                el.childNodes = (el.childNodes || []);
                el.childNodes.unshift(el.innerText);
                delete el.innerText;
            }
            if (el.childNodes) {
                el.childNodes = ($Array)(el.childNodes);
                for (list = el.childNodes, i = 0, n = list.length; i < n; i++) {
                    newEl.appendChild(this.create(list[i]));
                }
                delete el.childNodes;
            }
            if (el.styles) {
                if (window.YAHOO) {
                    YAHOO.util.Dom.setStyles(newEl, el.styles);
                } else {
                    el.style = (el.style || "");
                    if (el.style.length) {
                        el.style += ";";
                    }
                    for (key in el.styles) {
                        el.style += key + ":" + el.styles[key] + ";";
                    }
                }
                delete el.styles;
            }
            if ("className" in el) {
                el["class"] = el.className;
                delete el.className;
            }
            if ("htmlFor" in el) {
                el["for"] = el.htmlFor;
                delete el.htmlFor;
            }
            for (key in el) {
                attrVal = el[key];
                if (typeof (attrVal) == "boolean") {
                    newEl[key] = attrVal;
                    attrVal = (attrVal ? key : null);
                }
                this.setAttr(newEl, key, attrVal);
            }
            return newEl;
        },
        trigger: function (el, action, event) {
            var onaction = "on" + action;
            var returnValue;
            if (onaction in el) {
                returnValue = el[onaction](event);
            }
            if (returnValue !== false) {
                returnValue = el[action]();
            }
            return returnValue;
        }
    };
    site9.forms = {
        ensureHiddenFieldValue: function (f, fieldName, fieldValue) {
            var field = f[fieldName];
            if (!field) {
                field = document.createElement("input");
                field.setAttribute("type", "hidden");
                field.setAttribute("name", fieldName);
                f.appendChild(field);
            }
            field.value = fieldValue;
        },
        replaceUrlField: function (theUrl, fieldName, fieldValue) {
            fieldName = escape(fieldName, 1);
            if (typeof (fieldValue) == "undefined") {
                fieldValue = null;
            } else {
                if (typeof (fieldValue) == "number" && fieldValue == 0) {
                    fieldValue = "0px";
                } else {
                    if (typeof (fieldValue) == "boolean" && fieldValue == false) {
                        fieldValue = "false";
                    } else {
                        if (typeof (fieldValue) == "string" && fieldValue == "") {
                            fieldValue = null;
                        }
                    }
                }
            }
            var hash = theUrl.split("#");
            if (hash.length > 1) {
                theUrl = hash[0];
                hash = "#" + hash[1];
            } else {
                hash = "";
            }
            var a = theUrl.search(new RegExp("[?&]" + fieldName + "([=&].*)?$")) + 1;
            if (a > 0) {
                var b = theUrl.indexOf("&", a);
                if (b == -1) {
                    b = theUrl.length - 1;
                    a--;
                }
                theUrl = theUrl.substring(0, a) + theUrl.substring(b + 1);
            }
            if (fieldValue) {
                theUrl += (theUrl.indexOf("?") >= 0 ? "&" : "?") + fieldName + "=" + escape(fieldValue, 1);
            }
            return theUrl + hash;
        },
        getUrlField: function (theUrl, fieldName) {
            theUrl = theUrl.replace(/^[^?]*\?/, "");
            fieldName = escape(fieldName, 1);
            if (theUrl.length > 0) {
                var pairs = theUrl.split("&");
                for (var i = 0; i < pairs.length; i++) {
                    var pair = pairs[i];
                    if (pair == fieldName || pair.indexOf(fieldName + "=") == 0) {
                        return pair.substring(pair.indexOf("=") + 1);
                    }
                }
            }
            return null;
        },
        addCurrentDateTime: function (theFormOrUrl, fieldName, scale) {
            fieldName = (fieldName || "z");
            scale = (scale || 1);
            var fieldValue = Math.round(new Date().getTime() / scale) * scale;
            if (theFormOrUrl.tagName == "form") {
                return this.ensureHiddenFieldValue(theFormOrUrl, fieldName, fieldValue);
            } else {
                return this.replaceUrlField(theFormOrUrl, fieldName, fieldValue);
            }
        },
        urlEncode: function (f) {
            var data = "";
            for (var i = 0; i < f.elements.length; i++) {
                var e = f.elements[i];
                var eName = e.name;
                var eValue = e.value;
                switch (e.type) {
                case "select-multiple":
                    for (var j = 0; j < e.options.length; j++) {
                        if (e.options[j].selected) {
                            data += encodeURIComponent(eName) + "=" + encodeURIComponent(e.options[j].value) + "&";
                        }
                    }
                    break;
                case "radio":
                case "checkbox":
                    if (e.checked) {
                        data += encodeURIComponent(eName) + "=" + encodeURIComponent(eValue) + "&";
                    }
                    break;
                case "file":
                    alert("Cannot submit a file via AJAX!");
                    break;
                case undefined:
                    break;
                default:
                    data += encodeURIComponent(eName) + "=" + encodeURIComponent(eValue) + "&";
                    break;
                }
            }
            data = data.substr(0, data.length - 1);
            return data;
        },
        trapTabKey: function (textarea, event) {
            return false;
        },
        focus: function (el) {
            el = (el || document.body);
            if (!el.tagName || el.style.display == "none") {
                return false;
            }
            switch (el.tagName.toLowerCase()) {
            default:
                for (var list = el.childNodes, i = 0, n = list.length; i < n; i++) {
                    if (this.focus(list[i])) {
                        return true;
                    }
                }
                return false;
            case "input":
                if (el.type.toLowerCase() == "hidden") {
                    return false;
                }
            case "select":
            case "textarea":
            }
            return (site9.els.trigger(el, "focus") !== false);
        },
        getElValue: function (el) {
            switch (el.type) {
            case "select-multiple":
                var values = [];
                for (var list = el.options, i = 0, n = list.length; i < n; i++) {
                    if (list[i].selected) {
                        values.push(list[i].value);
                    }
                }
                return values;
            case "select-one":
                el = el.options[el.selectedIndex];
                break;
            }
            return el.value;
        },
        setElValue: function (el, value) {
            if (typeof (value) == "undefined") {
                value = null;
            }
            switch (el.type) {
            default:
                if ("value" in el) {
                    if (value === null) {
                        value = "";
                    }
                    el.value = value.toString();
                }
                break;
            case "select-multiple":
            case "select-one":
                value = ($Array)(value);
                el.selectedIndex = -1;
                for (var list = el.options, i = 0, n = list.length; i < n; i++) {
                    list[i].selected = (value.indexOf(list[i].value) != -1);
                }
                break;
            }
        },
        change: function (el, value) {
            if (this.getElValue(el) !== value) {
                this.setElValue(el, value);
                if (el.onchange) {
                    el.onchange();
                }
            }
        },
        updateDefaults: function (el) {
            var els = ((el.tagName == "FORM") ? el.elements : [el]),
                i, n, opts, i2, n2, opt, didChange;
            for (i = 0, n = els.length; i < n; i++) {
                el = els[i];
                didChange = false;
                switch (el.type) {
                default:
                    if (el.defaultValue != el.value) {
                        site9.els.setAttr(el, "value", el.value);
                        didChange = true;
                    }
                    break;
                case "textarea":
                    if (el.defaultValue != el.value) {
                        el.defaultValue = el.value;
                        didChange = true;
                    }
                    break;
                case undefined:
                case "submit":
                case "reset":
                case "button":
                case "image":
                    break;
                case "checkbox":
                case "radio":
                    if (el.defaultChecked != el.checked) {
                        site9.els.setAttr(el, "checked", el.checked);
                        didChange = true;
                    }
                    break;
                case "select-one":
                case "select-multiple":
                    opts = el.options;
                    for (i2 = 0; i2 < opts.length; i2++) {
                        opt = opts[i2];
                        if (opt.defaultSelected != opt.selected) {
                            site9.els.setAttr(opt, "selected", opt.selected);
                        }
                        didChange = true;
                    }
                    break;
                }
                if (el.type == "hidden") {
                    el[site9.forms.Tracker.FxHFDV] = el.value;
                    didChange = true;
                }
                if (didChange && el.onchange) {
                    el.onchange();
                }
            }
        },
        submit: function (f) {
            return site9.els.trigger(f, "submit");
        },
        reset: function (f) {
            return site9.els.trigger(f, "reset");
        }
    };
    site9.forms.Tracker = function ($) {
        $ = ($ || {});
        if ($.nodeName == "FORM") {
            $ = {
                form: $
            };
        }
        if ($.unloadMessage !== false) {
            this.unloadMessage = $.unloadMessage || "The changes you have made on this page will be lost";
            site9.events.attach(window, "beforeunload", this.pageWillUnload, null, null, this);
        }
        this.resetMessage = $.resetMessage;
        this.autoEnablesButtons = ($.autoEnablesButtons !== false);
        this._fckInstances = [];
        this.setForm($.form);
    };
    Object.overlay({
        _atts: [],
        _changedEls: null,
        _formWasSubmitted: 0,
        hasChanges: function (elName) {
            return (elName ? this._changedEls[elName] : this._changedEls.length);
        },
        getForm: function () {
            return this._form;
        },
        setForm: function (newForm) {
            newForm = (newForm && (newForm.tagName === "FORM") ? newForm : null);
            if (newForm) {
                function updateDefSel(select) {
                    var opts = select.options;
                    if (opts.length && opts[0].value === "WONoSelectionString") {
                        for (var i = 0; i < opts.length; i++) {
                            if (opts[i].defaultSelected) {
                                return;
                            }
                        }
                        site9.els.setAttr(opts[0], "selected", true);
                    }
                }
                var els = newForm.elements;
                for (var i = 0; i < els.length; i++) {
                    if (els[i].type === "select-one") {
                        updateDefSel(els[i]);
                    }
                }
            }
            this._form = newForm;
            this.formDidChange();
        },
        formDidChange: function () {
            var E = site9.events;
            var A = this._atts;
            for (var i = 0; i < A.length; i++) {
                E.dettach(A[i]);
            }
            A = this._atts = [];
            this._clear();
            if (!this._form) {
                return;
            }
            A.push(E.attach(this._form, "submit", this.formWillSubmit, 1000, null, this));
            A.push(E.attach(this._form, "reset", this.formWillReset, 1000, null, this));
            var els = this._form.elements;
            var eventNames;
            for (var els_i = 0; els_i < els.length; els_i++) {
                var el = els[els_i];
                switch (el.type) {
                case "submit":
                case "reset":
                case "button":
                case "image":
                case undefined:
                    eventNames = [];
                    break;
                case "select-one":
                case "select-multiple":
                    eventNames = ["change"];
                    break;
                case "checkbox":
                case "radio":
                    eventNames = ["click"];
                    break;
                case "hidden":
                    if (!(site9.forms.Tracker.FxHFDV in el)) {
                        el[site9.forms.Tracker.FxHFDV] = el.defaultValue;
                    }
                    eventNames = ["change"];
                    break;
                default:
                    site9.debug("********** WARNING: Don't know what this type is: " + el.type);
                case "text":
                case "textarea":
                case "search":
                case "password":
                    eventNames = ["change", "keyup"];
                    break;
                }
                for (var en_i = 0; en_i < eventNames.length; en_i++) {
                    A.push(E.attach(el, eventNames[en_i], this.elementDidChange, null, null, this, [el]));
                }
                this.elementDidChange(el);
            }
            this._update();
        },
        elementsDidChange: function () {
            var els = this._form.elements;
            for (var i = 0; i < els.length; i++) {
                this._elementDidChange(els[i]);
            }
            this._update();
        },
        elementDidChange: function (el) {
            this._elementDidChange(el);
            this._update();
        },
        updateDefaults: function () {
            site9.forms.updateDefaults(this.getForm());
            this.elementsDidChange();
        },
        _elementDidChange: function (el) {
            if (el.disabled) {
                return;
            }
            var elName = el.name,
                hadChanges = (elName in this._changedEls),
                hasChanges = false;
            switch (el.type) {
            case "submit":
            case "reset":
            case "button":
            case "image":
            case undefined:
                break;
            case "select-one":
            case "select-multiple":
                for (var i = 0; i < el.options.length; i++) {
                    if (el.options[i].selected != el.options[i].defaultSelected) {
                        hasChanges = true;
                    }
                }
                break;
            case "checkbox":
            case "radio":
                if (el.checked != el.defaultChecked) {
                    hasChanges = true;
                }
                break;
            case "password":
                if (hadChanges || el.value != el.defaultValue) {
                    hasChanges = true;
                }
                break;
            case "hidden":
                if (el.value != el.defaultValue || ((site9.forms.Tracker.FxHFDV in el) && (el.value != el[site9.forms.Tracker.FxHFDV]))) {
                    hasChanges = true;
                }
                break;
            default:
                if (el.value != el.defaultValue) {
                    hasChanges = true;
                }
                break;
            }
            if (hasChanges != hadChanges) {
                if (hasChanges) {
                    this._changedEls[elName] = true;
                    this._changedEls.length++;
                } else {
                    delete this._changedEls[elName];
                    this._changedEls.length--;
                }
            }
        },
        _clear: function () {
            this._changedEls = {
                length: 0
            };
        },
        _update: function () {
            if (!this.autoEnablesButtons) {
                return;
            }
            var lacksAnyChanges = !this.hasChanges();
            for (var i = 0; i < this._form.elements.length; i++) {
                var el = this._form.elements[i];
                switch (el.type) {
                case "submit":
                case "reset":
                    el.disabled = lacksAnyChanges;
                    break;
                case "button":
                    if (el.parentNode.tagName === "A") {
                        el.disabled = !lacksAnyChanges;
                    }
                    break;
                }
            }
        },
        formWillReset: function (event) {
            if (this.hasChanges() && this.resetMessage && !confirm(this.resetMessage)) {
                return false;
            }
            var _this = this;
            setTimeout(function () {
                _this._clear();
                _this.elementsDidChange();
                _this._resetAllFCKInstances();
            }, 0);
        },
        formWillSubmit: function (event) {
            this._formWasSubmitted = (new Date().getTime() + site9.forms.Tracker.SUBMIT_TIMEOUT);
            return true;
        },
        pageWillUnload: function (event) {
            if (!this._form) {
                site9.debug(this, ".pageWillUnload: No form...");
            } else {
                if (!this._changedEls.length) {
                    site9.debug(this, ".pageWillUnload: No changes...");
                } else {
                    if (this._formWasSubmitted >= new Date().getTime()) {
                        site9.debug(this, ".pageWillUnload: Form was submitted: ", this._formWasSubmitted);
                    } else {
                        if (site9.nodeAncestry(this._form).indexOf(document) == -1) {
                            site9.debug(this, ".pageWillUnload: Form is an orphan: ", site9.nodeAncestry(this._form));
                        } else {
                            return ((event || window.event).returnValue = this.unloadMessage);
                        }
                    }
                }
            }
        },
        addFCKInstance: function (fckInstance) {
            this._fckInstances.push(fckInstance);
            fckInstance.Events.AttachEvent("OnSelectionChange", this._fckChanged);
        },
        _fckChanged: function (fckInstance) {
            if (fckInstance.IsDirty()) {
                fckInstance.UpdateLinkedField();
                fckInstance.LinkedField.onchange();
            }
        },
        _resetAllFCKInstances: function () {
            for (var i = 0; i < this._fckInstances.length; i++) {
                this._fckInstances[i].SetHTML(this._fckInstances[i].StartupValue);
            }
        }
    }, site9.forms.Tracker.prototype);
    site9.forms.Tracker.FxHFDV = "** Firefox Hidden-Field Default-Value **";
    site9.forms.Tracker.SUBMIT_TIMEOUT = 2000;
    site9.formUtil = site9.forms;
    site9.events = {
        _pending: [],
        attach: function (node, eventName, handler, opts) {
            if (node == window) {
                var match = eventName.match(/^(on)?(focus|blur)$/i);
                if (match) {
                    this._patchWindowFocus();
                    eventName = ((match[1] || "") + "_" + match[2]);
                }
            }
            if (arguments.length > 4 || typeof (opts) == "number") {
                opts = {
                    priority: arguments[3],
                    condition: arguments[4],
                    thisArg: arguments[5],
                    args: arguments[6]
                };
            } else {
                opts = opts || {};
            }
            var attachment = new site9.events._Attachment(node, eventName, handler, opts.priority, opts.condition, opts.thisArg, opts.args);
            if (typeof (node) == "string" && this._pending) {
                this._pending.push(attachment);
            } else {
                this._attach(attachment);
            }
            return attachment;
        },
        dettach: function (attachment) {
            var node = attachment.node;
            var eventName = attachment.eventName;
            var attachments;
            if (typeof (node) == "string") {
                attachments = this._pending;
                for (var i = 0; i < attachments.length; i++) {
                    if (attachments[i] === attachment) {
                        attachments.splice(i, 1);
                        return true;
                    }
                }
            } else {
                attachments = node[eventName];
                if (attachments) {
                    attachments = attachments.__attachments;
                }
                if (attachments) {
                    for (var i = 0; i < attachments.length; i++) {
                        if (attachments[i] === attachment) {
                            if (attachments.length > 1) {
                                attachments.splice(i, 1);
                            } else {
                                delete node[eventName];
                            }
                            return true;
                        }
                    }
                }
            }
            site9.debug("***** WARNING: Could not dettach the attachment: ", attachment, ", perhaps it was already dettached? ... attachments: ", attachments);
            return false;
        },
        _patchWindowFocus: function () {
            this._patchWindowFocus = function () {};
            var attachment = new site9.events._Attachment(window, "focus", function (event) {
                if (!site9.events._windowHasFocus) {
                    site9.events._windowHasFocus = true;
                    if (window.on_focus) {
                        return window.on_focus(event);
                    }
                }
            }, -1000);
            attachment.eventName = "onfocus";
            this._attach(attachment);
            var attachment = new site9.events._Attachment(window, "blur", function (event) {
                if (site9.events._windowHasFocus) {
                    site9.events._windowHasFocus = false;
                    if (window.on_blur) {
                        return window.on_blur(event);
                    }
                }
            }, -1000);
            attachment.eventName = "onblur";
            this._attach(attachment);
        },
        _attach: function (attachment) {
            var node = attachment.node;
            var eventName = attachment.eventName;
            if (typeof (node) == "string") {
                attachment.node = node = site9.getElementBySelector(node);
            }
            var attachable = node[eventName];
            if (!attachable || !attachable.__attachments) {
                var defaultHandler = attachable;
                attachable = this._createHandlerFn(eventName);
                attachable.__attachments = [];
                if (typeof (defaultHandler) == "function") {
                    attachable.__attachments.push(new site9.events._Attachment(node, eventName, defaultHandler, 0));
                }
                node[eventName] = attachable;
            }
            for (var i = 0; i < attachable.__attachments.length; i++) {
                if (attachable.__attachments[i].priority > attachment.priority) {
                    attachable.__attachments.splice(i, 0, attachment);
                    return;
                }
            }
            attachable.__attachments.push(attachment);
        },
        _createHandlerFn: function (eventName) {
            return function () {
                return site9.events._dispatch(this, eventName, arguments);
            };
        },
        _loadPending: function () {
            var attachments = this._pending;
            delete this._pending;
            for (var i = 0; i < attachments.length; i++) {
                this._attach(attachments[i]);
            }
        },
        _dispatch: function (node, eventName, args) {
            var attachable = node[eventName];
            var attachments = (attachable && attachable.__attachments);
            if (!attachments) {
                return;
            }
            attachments = attachments.copy();
            var results = [],
                i, n, anAttachment;
            for (i = 0, n = attachments.length; i < n; i++) {
                anAttachment = attachments[i];
                try {
                    if (!anAttachment.condition || anAttachment.condition(results)) {
                        results.unshift(anAttachment.trigger.apply(anAttachment, args));
                    }
                } catch (e) {
                    if (window.console) {
                        console.error("Exception while executing event: ", node, "[", eventName, "][", i, "]:", e);
                        console.error(e.stack.replace(/\@/g, "\n\t").replace(/^\(/g, "anonymous("));
                    } else {
                        site9.debug("\r\n\r\n\r\nException while executing event: ", node, "[", eventName, "][", i, "]: " + ($String)(e, {}));
                    }
                }
            }
            return results[0];
        },
        conditionals: {
            isTrue: function (results) {
                return results[0] === true;
            },
            isFalse: function (results) {
                return results[0] === false;
            },
            isNotTrue: function (results) {
                return results[0] !== true;
            },
            isNotFalse: function (results) {
                return results[0] !== false;
            }
        },
        currentEvent: function (pEvent) {
            if (pEvent) {
                return pEvent;
            }
            if (window.event) {
                return window.event;
            }
            var obj;
            if (obj = site9.events.currentEvent.caller) {
                if (obj = site9.events.currentEvent.caller.arguments) {
                    if (obj.length > 0) {
                        return obj[0];
                    }
                }
            }
            return null;
        }
    };
    site9.events._Attachment = function (node, eventName, handler, priority, condition, thisArg, args) {
        this.node = node;
        this.setEventName(eventName);
        this.setHandler(handler);
        this.priority = priority || 0;
        if (condition) {
            this.setCondition(condition);
        }
        this.thisArg = thisArg;
        this.args = args;
    };
    Object.overlay({
        toString: function (attachment) {
            attachment = attachment || this;
            return (attachment.node + "." + attachment.eventName + "+=" + attachment.handler + "(" + attachment.priority + ")");
        },
        setEventName: function (newEventName) {
            newEventName = newEventName.toLowerCase();
            if (!newEventName.startsWith("on")) {
                newEventName = ("on" + newEventName);
            }
            this.eventName = newEventName;
        },
        setHandler: function (newHandler) {
            if (typeof (newHandler) == "string") {
                newHandler = new Function("event", newHandler);
            }
            this.handler = newHandler;
        },
        setCondition: function (newCondition) {
            if (typeof (newCondition) == "string") {
                newCondition = new Function("results", newCondition);
            }
            this.condition = newCondition;
        },
        trigger: function () {
            return this.handler.apply(this.thisArg || this.node, this.args || arguments);
        }
    }, site9.events._Attachment.prototype);
    site9.events.SimpleEventListener = function (target, action) {
        this._target = target;
        if (typeof (action) == "string") {
            if (/^\w+$/.test(action) && (action in target) && ("apply" in target[action])) {
                action = target[action];
            } else {
                action = new Function("event", action);
            }
        }
        this._action = action;
    };
    Object.overlay({
        handleEvent: function (event) {
            this._action.apply(this._target, arguments);
        }
    }, site9.events.SimpleEventListener.prototype);
    var nextTimerId = 1;
    site9.events.Timer = function (params) {
        params = params || {};
        this.interval = params.interval || 0.1;
        this.repeatCount = params.repeatCount;
        this._id = nextTimerId++;
    };
    Object.overlay({
        __map: {}
    }, site9.events.Timer);
    Object.overlay({
        _thread: null,
        _expectedFiring: null,
        toString: function () {
            return "site9.events.Timer:" + this._id;
        },
        run: function (repeatCount) {
            this.stop();
            this.setRepeatCount(repeatCount);
            var ms = this.getInterval() * 1000;
            var now = new Date().getTime();
            if (!this._expectedFiring) {
                this._expectedFiring = now;
            } else {
                if (this._expectedFiring < now) {
                    ms -= (now - this._expectedFiring);
                }
            }
            if (ms > 0) {
                site9.events.Timer.__map[this._id] = this;
                this._expectedFiring = now + ms;
                this._thread = window.setTimeout("site9.events.Timer.__map[" + this._id + "]._tick()", this.interval * 1000);
            } else {
                if (this.getInterval() != 0 || !this.isRepeating()) {
                    this._expectedFiring = now;
                    this._tick();
                } else {
                    site9.debug(this + ": BAD CONFIGURATION -- not firing");
                }
            }
        },
        stop: function () {
            if (this._thread) {
                window.clearTimeout(this._thread);
                delete this._expectedFiring;
                this._clear();
            }
        },
        isRunning: function () {
            return ($boolean)(this._thread);
        },
        isRepeating: function () {
            return this.getRepeatCount() != 0;
        },
        getRepeatCount: function () {
            return this.repeatCount;
        },
        setRepeatCount: function (newRepeatCount) {
            this.repeatCount = Math.max(newRepeatCount || 0, -1);
        },
        getInterval: function () {
            return this.interval;
        },
        setInterval: function (newInterval) {
            var wasRunning = this.isRunning();
            if (wasRunning) {
                this.stop();
            }
            this.interval = newInterval;
            if (wasRunning) {
                this.run(this.getRepeatCount());
            }
        },
        _clear: function () {
            delete this._thread;
            delete site9.events.Timer.__map[this._id];
        },
        _tick: function () {
            this._clear();
            if (this.ontick) {
                this.ontick();
            } else {
                site9.debug(this + " ticked, but no one was listening!");
            }
            if (this.isRepeating()) {
                this.run(this.getRepeatCount() - 1);
            }
            if (!this.isRunning()) {
                delete this._expectedFiring;
            }
        }
    }, site9.events.Timer.prototype);
    if (window.jQuery) {
        jQuery(function () {
            if (document.onready) {
                document.onready();
            }
        });
    } else {
        site9.events.attach(window, "load", function () {
            if (document.onready) {
                document.onready();
            }
        }, {
            priority: -1
        });
    }
    site9.events.attach(document, "ready", site9.events._loadPending, {
        thisArg: site9.events,
        priority: -1
    });
    site9.HttpConnection = function (async, allowsQueuing, onload, onerror) {
        this._id = "id:" + site9.HttpConnection.nextId++;
        this._async = async;
        this._usesQ = allowsQueuing;
        this._q = [];
        this._reusable = 0;
        if (onload) {
            this.onload = onload;
        } else {
            if (async) {
                this.onload = function () {
                    site9.debug("site9.HttpConnection taking no action onload!");
                };
            }
        }
        if (onerror) {
            this.onerror = onerror;
        } else {
            if (async) {
                this.onerror = function () {
                    site9.debug("site9.HttpConnection taking no action onerror.");
                };
            }
        }
    };
    Object.overlay({
        get: function (url) {
            this.push(this.queuedGET(url));
            return this;
        },
        post: function (url, data) {
            this.push(this.queuedPOST(url, data));
            return this;
        },
        submit: function (form) {
            return post(form.action, site9.forms.urlEncode(form));
        },
        onload: function () {},
        onerror: function () {},
        succeeded: function () {
            return (200 <= this.xmlHttp.status && this.xmlHttp.status < 300);
        },
        getCurrentRequest: function () {
            return this._current;
        },
        createGET: function (url) {
            return {
                method: "GET",
                url: url,
                data: null
            };
        },
        createPOST: function (url, data) {
            return {
                method: "POST",
                url: url,
                data: data
            };
        },
        push: function (request) {
            if (!this._usesQ) {
                this.stop(true);
            }
            this._q.push(request);
            if (!this._current) {
                this._resume();
            }
        },
        unshift: function (request) {
            if (!this._usesQ) {
                this.stop(true);
            }
            this._q.unshift(request);
            if (!this._current) {
                this._resume();
            }
        },
        stop: function (all) {
            if (this.xmlHttp) {
                this.xmlHttp.abort();
            }
            if (all) {
                this._q = [];
            }
            this._resume();
            return this;
        },
        _resume: function () {
            this._checkAttachmentTo("load");
            this._checkAttachmentTo("error");
            delete this._current;
            if (this._q.length > 0) {
                var request = this._q.shift();
                this._current = request;
                switch (this._reusable) {
                case 0:
                    try {
                        this.xmlHttp = new XMLHttpRequest();
                        this._reusable = 1;
                    } catch (e1) {
                        try {
                            this.xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                            this._reusable = 0;
                        } catch (e2) {
                            try {
                                this.xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                                this._reusable = 0;
                            } catch (e3) {
                                site9.debug("No XML HTTP found.");
                                return;
                            }
                        }
                    }
                case 1:
                    this.xmlHttp.onreadystatechange = new Function("site9.HttpConnection.onreadystatechange('" + this._id + "');");
                case 2:
                    site9.HttpConnection.active[this._id] = this;
                }
                this.xmlHttp.open(request.method, request.url, this._async);
                this.xmlHttp.send(request.data);
                if (!this._async) {
                    site9.HttpConnection.onreadystatechange(this._id);
                }
            }
        },
        _checkAttachmentTo: function (eventName) {
            var checkName = "_" + eventName + "Attachment";
            var fnName = "on" + eventName;
            if (this[checkName] != this[fnName]) {
                site9.events.attach(this, eventName, "this._resume();", 10);
                this[checkName] = this[fnName];
            }
        },
        toString: function () {
            return "[site9.HttpConnection (" + this._id + ")]";
        }
    }, site9.HttpConnection.prototype);
    Object.overlay({
        nextId: 0,
        active: {},
        onreadystatechange: function (id) {
            var context = site9.HttpConnection.active[id];
            if (!context) {
                return;
            }
            if (context.xmlHttp.readyState == 4) {
                if (context.succeeded()) {
                    context.onload(context, 1, 2, 3, 4, 5);
                } else {
                    context.onerror(context, 1, 2, 3, 4, 5);
                }
                delete site9.HttpConnection.active[id];
            }
        }
    }, site9.HttpConnection);
    site9.pseudoHover = function () {
        var ieVersion = -1;
        if (navigator.appName == "Microsoft Internet Explorer") {
            var ua = navigator.userAgent;
            var re = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");
            if (re.exec(ua) != null) {
                ieVersion = parseFloat(RegExp.$1);
            }
        }
        if (ieVersion > -1 && ieVersion <= 6) {
            var navComponents = new site9.CssSelector(".s9_hover_container").selectAll(document);
            for (var n = 0; n < navComponents.length; n++) {
                var sfEls = navComponents[n].getElementsByTagName("LI");
                for (var i = 0; i < sfEls.length; i++) {
                    sfEls[i].onmouseover = function () {
                        this.className += " s9hover";
                    };
                    sfEls[i].onmouseout = function () {
                        this.className = this.className.replace(new RegExp(" s9hover\\b"), "");
                    };
                }
            }
            var hvElements = new site9.CssSelector(".s9_hover_element").selectAll(document);
            for (var i = 0; i < hvElements.length; i++) {
                hvElements[i].onmouseover = function () {
                    this.className += " s9hover";
                };
                hvElements[i].onmouseout = function () {
                    this.className = this.className.replace(new RegExp(" s9hover\\b"), "");
                };
            }
        }
    };
    site9.events.attach(window, "load", "site9.pseudoHover();", -1);
    site9.deprecated = function (theName, replacedBy, message) {
        var theCaller = site9.deprecated.caller;
        if (!theCaller) {
            theCaller = eval(theName);
        }
        var theCallerCaller = theCaller.caller;
        if (!theCallerCaller) {
            theCallerCaller = theCaller.arguments.caller;
        }
        var theCallerArgs = theCaller.arguments;
        var args = "";
        for (var i = 0; i < theCallerArgs.length; i++) {
            if (i > 0) {
                args += ", ";
            }
            args += typeof (theCallerArgs[i]);
        }
        site9.debug("\r\n\r\n---\r\nWarning: Deprecated function: " + theName + "( " + args + " ) called from " + (theCallerCaller ? theCallerCaller : "?") + (message ? "\r\n" + message : "") + "\r\n---\r\n\r\n");
        if (typeof (replacedBy) == "function") {
            return replacedBy.apply(this, theCaller.arguments);
        }
    };
    site9._firstInList = function (theList) {
        site9.deprecated("site9._firstInList", null, "Use theList[0] instead");
        return theList[0];
    };
    site9._getElementsByAttributes = function (theNode, isDirect, theTag, theIds, theClasses) {
        site9.deprecated("site9._getElementsByAttributes", null, "Use new site9.CssSelector( selectorText ).selectAll( theNode ) instead");
        var selectorText = theTag;
        if (isDirect) {
            selectorText = ">" + selectorText;
        }
        for (var i = 0; i < theIds.length; i++) {
            selectorText += "#" + theIds[i];
        }
        for (var i = 0; i < theClasses.length; i++) {
            selectorText += "." + theClasses[i];
        }
        return new site9._BasicCssSelector(selectorText).selectAll(theNode);
    };
    site9._isChildOf = function (node, parent) {
        site9.deprecated("site9._isChildOf", null, "Use site9.indexOfObjectInArray( parent, site9.nodeAncestry(node) ) != -1 instead");
        return site9.indexOfObjectInArray(parent, site9.nodeAncestry(node)) != -1;
    };
    site9.trim = function (theString) {
        site9.deprecated("site9.trim", null, "Use theString.trim() instead");
        return theString.trim();
    };
    site9._unique = function (theArray) {
        site9.deprecated("site9._unique", null, "Use site9.Arrays.uniqueCopy( theArray ) or theArray.uniqueCopy() instead. Also, you may want to use theArray.removeDuplicates()");
        return theArray.uniqueCopy();
    };
    site9.indexOfObjectInArray = function (theObject, theArray) {
        site9.deprecated("site9.indexOfObjectInArray", null, "Use site9.Arrays.indexOf( theArray, theObject ) or theArray.indexOf( theObject ) instead");
        return theArray.indexOf(theObject);
    };

    function S9debug(theText) {
        return site9.deprecated("S9debug", site9.debug);
    }
    function S9Feature(theFeatureName) {
        site9.deprecated("S9Feature", null, "Use new Object() or {} instead");
        return Object();
    }
    function S9modifyClassNames(theNodes, regex, replacements) {
        return site9.deprecated("S9modifyClassNames", site9.modifyClassNames);
    }
    function S9getElementsBySelector(theSelector, theNode) {
        return site9.deprecated("S9getElementsBySelector", site9.getElementsBySelector);
    }
    function S9getElementsByAttributes(theNode, isDirect, theTag, theIds, theClasses) {
        return site9.deprecated("S9getElementsByAttributes", site9._getElementsByAttributes);
    }
    function S9isChildOf(node, parent) {
        return site9.deprecated("S9isChildOf", site9._isChildOf);
    }
    function S9unique(theArray) {
        return site9.deprecated("S9unique", site9._unique);
    }
    function trim(theString) {
        return site9.deprecated("trim", site9.trim);
    }
    function verifyEmail(emailAddress) {
        return site9.deprecated("verifyEmail", site9.verifyEmail);
    }
    function verifyEmailWithAlert(emailAddress) {
        return site9.deprecated("verifyEmailWithAlert", site9.verifyEmailWithAlert);
    }
    function verifyURL(theURL) {
        return site9.deprecated("verifyURL", site9.verifyURL);
    }
    function verifyURLWithAlert(theURL) {
        return site9.deprecated("verifyURLWithAlert", site9.verifyURLWithAlert);
    }
    function verifyText(theText, maxLength) {
        return site9.deprecated("verifyText", site9.verifyText);
    }
    function verifyTextWithAlert(theText, maxLength) {
        return site9.deprecated("verifyTextWithAlert", site9.verifyTextWithAlert);
    }
    function S9startOfElementWithId(theHTML, theID) {
        return site9.deprecated("S9startOfElementWithId", site9.htmlParser.startOfElementWithId);
    }
    function S9endOfElementWithId(theHTML, theID, start) {
        return site9.deprecated("S9endOfElementWithId", site9.htmlParser.endOfElementWithId);
    }
    function S9getInnerHTML(theHTML) {
        return site9.deprecated("S9getInnerHTML", site9.htmlParser.getInnerHTML);
    }
    function S9splitAroundElementWithId(theHTML, theID) {
        return site9.deprecated("S9splitAroundElementWithId", site9.htmlParser.splitAroundElementWithId);
    }
    site9.Collection = function (collectionName, min, defaultState, max) {
        this.name = collectionName;
        this._activateActions = [];
        this._deactivateActions = [];
        this._offscreenImages = [];
        this.min = (min || 1);
        this.max = (max || 0);
        this.defaultState = defaultState;
        if (collectionName) {
            site9.Collections[collectionName] = this;
            this._locator = new RegExp("^#" + this.name + "=(.+)$");
            if (this._locator.test(window.location.hash)) {
                this.changeTo(window.location.hash);
            }
        }
        if (!this.activeState && this.defaultState) {
            this.changeTo(this.defaultState);
        }
    };
    site9.Collections = {};
    Object.overlay({
        activeState: null,
        _locator: null,
        timeout: null,
        wrap: true,
        cachesNodes: true,
        recordStateInHash: function (ofObjectWithHash) {
            if (this.name && site9.windowHasLoaded) {
                if (!ofObjectWithHash) {
                    ofObjectWithHash = window.location;
                }
                ofObjectWithHash.hash = this.name + "=" + this.activeState;
                return true;
            } else {
                return false;
            }
        },
        changeTo: function (newState) {
            if (this.timeout) {
                clearTimeout(this.timeout);
                delete this.timeout;
            }
            if (!newState) {
                newState = this.defaultState;
            } else {
                if (typeof (newState) == "string" && this._locator && this._locator.test(newState)) {
                    newState = newState.match(this._locator)[1];
                }
                var newStateNum = parseInt(newState);
                if (!isNaN(newStateNum)) {
                    newState = newStateNum;
                    if (this.max && newState > this.max) {
                        newState = (this.wrap ? this.min : this.max);
                    }
                    if (newState < this.min) {
                        newState = (this.wrap ? this.max : this.min);
                    }
                }
            }
            if (this.activeState != newState) {
                this.ondeactivate(this.activeState);
                this.activeState = newState;
                this.onactivate(this.activeState);
            }
            return true;
        },
        changeToRelative: function (delta) {
            this.changeTo((this.activeState || this.min) + delta);
        },
        changeToNext: function () {
            this.changeToRelative(1);
        },
        changeToPrevious: function () {
            this.changeToRelative(-1);
        },
        onactivate: function (state) {
            if (this.onWillActivate) {
                this.onWillActivate(state);
            }
            this._notifyListeners(state, this._activateActions);
            if (this.onDidActivate) {
                this.onDidActivate(state);
            }
        },
        ondeactivate: function (state) {
            if (this.onWillDectivate) {
                this.onWillDectivate(state);
            }
            this._notifyListeners(state, this._deactivateActions);
            if (this.onDidDectivate) {
                this.onDidDectivate(state);
            }
        },
        _notifyListeners: function (state, listeners) {
            for (var i = 0; i < listeners.length; i++) {
                listeners[i].invoke(state);
            }
        },
        display: function (selectorText, display, trigger) {
            return this._addAction(new site9._CollectionAction(selectorText, null, display), trigger);
        },
        swap: function (selectorText, attr, list, trigger) {
            return this._addAction(new site9._CollectionAction(selectorText, attr, list, null, true), trigger);
        },
        replace: function (selectorText, attr, regexp, replacements, trigger) {
            return this._addAction(new site9._CollectionAction(selectorText, attr, regexp, replacements), trigger);
        },
        replaceSrc: function (selectorText, regexp, replacements, trigger) {
            return this.replace(selectorText, "src", regexp, replacements, trigger);
        },
        invalidate: function () {
            for (var i = 0; i < this._activateActions.length; i++) {
                this._activateActions[i].invalidate();
            }
            for (var i = 0; i < this._deactivateActions.length; i++) {
                this._deactivateActions[i].invalidate();
            }
        },
        _addAction: function (theAction, trigger) {
            if (trigger == "activate") {
                trigger = true;
            } else {
                if (trigger == "deactivate") {
                    trigger = false;
                } else {
                    site9.debug("unknown trigger: " + trigger);
                    return;
                }
            }(trigger ? this._activateActions : this._deactivateActions).push(theAction);
            if (this.activeState) {
                if (trigger) {
                    theAction.invoke(this.activeState);
                } else {
                    if (this.max) {
                        for (var i = this.min; i <= this.max; i++) {}
                    }
                }
            }
            return theAction;
        },
        _retainImage: function (src) {
            var img = new Image();
            img.src = src;
            this._offscreenImages.push(img);
        }
    }, site9.Collection.prototype);
    site9._CollectionAction = function (selectorText, attr, options, replacements, stateless) {
        this._selector = new site9.CssSelector(selectorText);
        this._attr = attr;
        this._options = options;
        this._replacements = replacements;
        this._stateless = stateless;
    };
    Object.overlay({
        invoke: function (state) {
            var list = this.nodes();
            var node = this._stateless ? list[0] : list[state - 1];
            if (!node) {
                site9.debug("Ignoring missing node!");
            } else {
                if (this._replacements) {
                    node[this._attr] = node[this._attr].replace(this._options, this._replacements);
                } else {
                    if (this._attr) {
                        node[this._attr] = this._options[state];
                    } else {
                        if (node.style.display != this._options) {
                            node.style.display = this._options;
                        }
                    }
                }
            }
        },
        invalidate: function () {
            delete this._nodes;
        },
        nodes: function () {
            var list = this._nodes;
            if (!list) {
                list = this._selector.selectAll();
                if (this.cachesNodes) {
                    this._nodes = list;
                }
            }
            return list;
        }
    }, site9._CollectionAction.prototype);
    site9.modify = {
        _active: null,
        _params: {},
        send: function (params) {
            if (this._active) {
                return false;
            }
            this._params = params;
            delete this._active;
            setTimeout("site9.modify._send()", 500);
            return true;
        },
        _send: function () {
            var params = this._params;
            params.sender = __(params.sender, params.under);
            params.under = __(params.under, params.sender);
            params.sender = params.sender || params.under;
            if (params.hiding) {
                params.hiding = ___(params.hiding, params.sender);
                if (params.sender) {
                    params.hiding = params.hiding.and(site9.nodeAncestry(params.sender, params.under).not());
                }
                params.hiding.forEach(function (props) {
                    site9.Objects.overlayOn(props, this);
                    return this;
                }, [{
                    style: {
                        display: "none"
                    }
                }]);
            }
            if (params.showing) {
                params.showing = ___(params.showing, params.sender);
                params.showing.forEach(function (props) {
                    site9.Objects.overlayOn(props, this);
                    return this;
                }, [{
                    style: {
                        display: "auto"
                    }
                }]);
            }
            params.data = params.data || null;
            params.method = params.method || (params.data ? "POST" : "GET");
            params.contentType = params.contentType || (params.data ? "application/x-www-form-urlencoded" : null);
            try {
                this._active = new XMLHttpRequest();
            } catch (e1) {
                try {
                    this._active = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e2) {
                    try {
                        this._active = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e3) {
                        site9.debug("No XML HTTP found.");
                        return false;
                    }
                }
            }
            this._active.onreadystatechange = function () {
                site9.modify.recv();
            };
            if (!params.action && !params.link && params.sender.tagName == "A") {
                params.link = params.sender;
            }
            if (params.link) {
                params.action = params.link.href = site9.forms.addCurrentDateTime(params.link.href);
            }
            if (!params.dryRun) {
                this._active.open(params.method, params.action, true);
                if (params.contentType) {
                    this._active.setRequestHeader("content-type", params.contentType);
                }
                this._active.setRequestHeader("x-site9-ajax", "true");
                this._active.send(params.data);
            }
        },
        recv: function () {
            if (this._active.readyState != 4) {
                return;
            }
            var params = this._params;
            if (params.showing) {
                params.showing.forEach(function (props) {
                    site9.Objects.overlayOn(props, this);
                    return this;
                }, [{
                    style: {
                        display: "none"
                    }
                }]);
            }
            if (params.hiding) {
                params.hiding.forEach(function (props) {
                    site9.Objects.overlayOn(props, this);
                    return this;
                }, [{
                    style: {
                        display: "auto"
                    }
                }]);
            }
            var parser = document.createElement("div");
            parser.innerHTML = this._active.responseText;
            if (this._active.responseText.length > 0) {
                if (typeof (params.updating) != "undefined") {
                    params.updating = ___(params.updating, params.sender);
                    for (var i = 0; i < params.updating.length; i++) {
                        var node = params.updating[i];
                        this._applyChange(parser, {
                            replacing: [node],
                            selecting: new site9.CssSelector({
                                selecting: node,
                                relativeTo: document.body
                            }),
                            under: node.parentNode
                        });
                    }
                } else {
                    if (params.replacing) {
                        params.replacing = ___(params.replacing, params.sender);
                    } else {
                        params.replacing = [];
                    }
                    params.selecting = new site9.CssSelector({
                        format: params.selecting || "> *"
                    });
                    this._applyChange(parser, params);
                }
            }
            delete this._active;
        },
        _applyChange: function (parser, params) {
            if (params.selecting) {
                params.inserting = params.selecting.selectAll(parser);
            } else {
                params.inserting = [];
            }
            if (params.after) {
                params.before = __(params.after, params.sender).nextSibling || null;
            }
            if (params.before) {
                params.before = __(params.before, params.sender) || null;
            }
            params.under = params.under || params.before.parentNode;
            params.replacing = params.replacing.where(function (parent) {
                return site9.nodeAncestry(this).indexOf(parent) + 1;
            }, [params.under]);
            if (!params.before && !params.after && params.replacing.length) {
                params.before = params.replacing.lastObject().nextSibling || null;
            }
            params.replacing.forEach(function () {
                this.parentNode.removeChild(this);
                return null;
            });
            params.inserting.forEach(function (parent, nextSibling) {
                parent.insertBefore(this, nextSibling);
                return null;
            }, [params.under, params.before]);
        }
    };
    site9.Notifications = {
        _div: null,
        _wrapper: null,
        _outer: null,
        _timeouts: [],
        _timer: null,
        post: function (notification) {
            if (!this._checkpoint()) {
                window.alert(notification.userLevelDecription);
            } else {
                if (typeof (notification) === "string") {
                    notification = {
                        name: notification
                    };
                }
                var newMsgDiv = document.createElement("div");
                newMsgDiv.className = this._cssClassNames(notification.level);
                newMsgDiv.appendChild(document.createTextNode(notification.userLevelDescription || notification.name));
                this._div.appendChild(newMsgDiv);
                if (notification.timeout) {
                    this._timeouts.push({
                        message: newMsgDiv,
                        at: new Date().getTime() + (notification.timeout * 1000)
                    });
                }
                this._checkpoint();
            }
        },
        clear: function (theMsg) {
            if (!theMsg) {
                this._timeouts = [];
                while (this._checkpoint() && this._div.childNodes.length) {
                    this._div.removeChild(this._div.childNodes[0]);
                }
            } else {
                try {
                    this._div.removeChild(theMsg);
                    this._checkpoint();
                } catch (e) {}
            }
        },
        _checkpoint: function () {
            if (!this._wrapper) {
                this._wrapper = __("#s9_notifications");
                if (!this._wrapper) {
                    return false;
                }
                var node = this._wrapper;
                node = document.createElement("div");
                this._wrapper.parentNode.appendChild(node);
                node.appendChild(this._wrapper);
                node.className += "x_dynamic";
                if (node && node.parentNode != document.body) {
                    document.body.appendChild(node);
                }
            }
            if (!this._div) {
                this._div = __(".s9_notifications", this._wrapper);
                if (!this._div) {
                    return false;
                }
            }
            if (this._timeouts.length) {
                var now = new Date().getTime();
                var timeouts = this._timeouts;
                this._timeouts = [];
                var remainingTimeouts = [];
                for (var i = 0; i < timeouts.length; i++) {
                    var to = timeouts[i];
                    if (to.at <= now) {
                        this.clear(to.message);
                    } else {
                        remainingTimeouts.push(to);
                    }
                }
                this._timeouts = remainingTimeouts;
            }
            if (this._timeouts.length) {
                if (!this._timer) {
                    this._timer = window.setInterval("site9.Notifications._checkpoint()", 500);
                }
            } else {
                if (this._timer) {
                    window.clearInterval(this._timer);
                    delete this._timer;
                }
            }
            if (this._div.childNodes.length) {
                this._wrapper.className = "";
                this._wrapper.getElementsByTagName("button")[0].focus();
            } else {
                this._wrapper.className = "x_empty";
            }
            return true;
        },
        _cssClassNames: function (aLevel) {
            var levelClass;
            switch (aLevel) {
            case site9.Notifications.ConfirmationLevel:
                levelClass = "s9_confirm";
                break;
            default:
            case site9.Notifications.NoticeLevel:
                levelClass = "s9_notice";
                break;
            case site9.Notifications.WarningLevel:
                levelClass = "s9_warning";
                break;
            case site9.Notifications.ErrorLevel:
                levelClass = "s9_error";
                break;
            }
            return "s9_ctrl pseudo_pre_wrap" + levelClass;
        }
    };
    site9.Notifications.ConfirmationLevel = 100;
    site9.Notifications.NoticeLevel = 200;
    site9.Notifications.WarningLevel = 300;
    site9.Notifications.ErrorLevel = 400;
    site9.events.attach(document, "ready", function () {
        site9.Notifications._checkpoint();
    });
    site9.linkTBA = function () {
        alert("The page or service to which this link refers is unfinished. Please check back later");
        return false;
    };
    site9.events.attach(document, "ready", function () {
        site9.windowHasLoaded = true;
        site9.debug("Window has loaded...");
    });
    site9.LiveSearchMgr = function (params) {
        this._setInputField(params.inputField);
        this.selector = new site9.CssSelector(params.selector || "*");
        this.selectionNode = params.selectionNode;
        this.matchClassName = params.matchClassName || params.className;
        this.nonMatchClassName = params.nonMatchClassName;
        if (typeof (this.matchClassName) == "undefined") {
            this.matchClassName = "s9_search_result";
        }
        this.statusWrap = params.statusWrap || params.statusNode;
        this.statusNode = params.statusNode || params.statusWrap;
        this._timer = new site9.events.Timer();
        site9.events.attach(this._timer, "tick", this.search, null, null, this);
        this._scheduleSearch(0.5);
    };
    Object.overlay({
        search: function () {
            var q = this.inputField.value.toLowerCase();
            this._displayStatusText("...");
            var nodes = this.selector.selectAll(this.selectionNode);
            var matchCount = 0;
            for (var i = 0; i < nodes.length; i++) {
                var aNode = nodes[i];
                if (this._timer.isRunning()) {
                    return;
                }
                if (!q) {
                    site9.alterClassNames([aNode], null, this.matchClassName);
                    site9.alterClassNames([aNode], null, this.nonMatchClassName);
                } else {
                    if (this._nodeContainsString(aNode, q)) {
                        site9.alterClassNames([aNode], this.matchClassName, this.nonMatchClassName);
                        matchCount++;
                    } else {
                        site9.alterClassNames([aNode], this.nonMatchClassName, this.matchClassName);
                    }
                }
            }
            this._displayStatusText(q ? (matchCount + " Match" + (matchCount == 1 ? "" : "es")) : "");
        },
        _scheduleSearch: function (interval) {
            this._timer.stop();
            this._timer.setInterval(interval);
            this._displayStatusText("...");
            this._timer.run();
        },
        _setInputField: function (aField) {
            if (this.inputField) {
                site9.events.dettach(this._inputFieldOnKeyPressAttachment);
                site9.events.dettach(this._inputFieldOnChangeAttachment);
            }
            this.inputField = aField;
            if (this.inputField) {
                this._inputFieldOnKeyPressAttachment = site9.events.attach(this.inputField, "keypress", this._scheduleSearch, null, null, this, [0.5]);
                this._inputFieldOnChangeAttachment = site9.events.attach(this.inputField, "change", this._scheduleSearch, null, null, this, [0]);
            }
        },
        _displayStatusText: function (statusText) {
            if (this.statusNode) {
                this.statusNode.childNodes[0].nodeValue = statusText;
            }
            if (this.statusWrap) {
                this.statusWrap.style.visibility = ((statusText && statusText.length) ? "visible" : "hidden");
            }
        },
        _nodeContainsString: function (node, str) {
            if (node.nodeType == site9._NodeConstants.TEXT_NODE && node.nodeValue.toLowerCase().indexOf(str) != -1) {
                return true;
            }
            for (var i = 0; i < node.childNodes.length; i++) {
                if (this._nodeContainsString(node.childNodes[i], str)) {
                    return true;
                }
            }
            return false;
        }
    }, site9.LiveSearchMgr.prototype);
})();
/**
 * SWFObject v1.4.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
 *   legal reasons.
 */
if (typeof deconcept == "undefined") {
    var deconcept = new Object();
}
if (typeof deconcept.util == "undefined") {
    deconcept.util = new Object();
}
if (typeof deconcept.SWFObjectUtil == "undefined") {
    deconcept.SWFObjectUtil = new Object();
}
deconcept.SWFObject = function (_1, id, w, h, _5, c, _7, _8, _9, _a, _b) {
    if (!document.getElementById) {
        return;
    }
    this.DETECT_KEY = _b ? _b : "detectflash";
    this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY);
    this.params = new Object();
    this.variables = new Object();
    this.attributes = new Array();
    if (_1) {
        this.setAttribute("swf", _1);
    }
    if (id) {
        this.setAttribute("id", id);
    }
    if (w) {
        this.setAttribute("width", w);
    }
    if (h) {
        this.setAttribute("height", h);
    }
    if (_5) {
        this.setAttribute("version", new deconcept.PlayerVersion(_5.toString().split(".")));
    }
    this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion();
    if (c) {
        this.addParam("bgcolor", c);
    }
    var q = _8 ? _8 : "high";
    this.addParam("quality", q);
    this.setAttribute("useExpressInstall", _7);
    this.setAttribute("doExpressInstall", false);
    var _d = (_9) ? _9 : window.location;
    this.setAttribute("xiRedirectUrl", _d);
    this.setAttribute("redirectUrl", "");
    if (_a) {
        this.setAttribute("redirectUrl", _a);
    }
};
deconcept.SWFObject.prototype = {
    setAttribute: function (_e, _f) {
        this.attributes[_e] = _f;
    },
    getAttribute: function (_10) {
        return this.attributes[_10];
    },
    addParam: function (_11, _12) {
        this.params[_11] = _12;
    },
    getParams: function () {
        return this.params;
    },
    addVariable: function (_13, _14) {
        this.variables[_13] = _14;
    },
    getVariable: function (_15) {
        return this.variables[_15];
    },
    getVariables: function () {
        return this.variables;
    },
    getVariablePairs: function () {
        var _16 = new Array();
        var key;
        var _18 = this.getVariables();
        for (key in _18) {
            _16.push(key + "=" + _18[key]);
        }
        return _16;
    },
    getSWFHTML: function () {
        var _19 = "";
        if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
            if (this.getAttribute("doExpressInstall")) {
                this.addVariable("MMplayerType", "PlugIn");
            }
            _19 = "<embed type=\"application/x-shockwave-flash\" src=\"" + this.getAttribute("swf") + "\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\"";
            _19 += " id=\"" + this.getAttribute("id") + "\" name=\"" + this.getAttribute("id") + "\" ";
            var _1a = this.getParams();
            for (var key in _1a) {
                _19 += [key] + "=\"" + _1a[key] + "\" ";
            }
            var _1c = this.getVariablePairs().join("&");
            if (_1c.length > 0) {
                _19 += "flashvars=\"" + _1c + "\"";
            }
            _19 += "/>";
        } else {
            if (this.getAttribute("doExpressInstall")) {
                this.addVariable("MMplayerType", "ActiveX");
            }
            _19 = "<object id=\"" + this.getAttribute("id") + "\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\">";
            _19 += "<param name=\"movie\" value=\"" + this.getAttribute("swf") + "\" />";
            var _1d = this.getParams();
            for (var key in _1d) {
                _19 += "<param name=\"" + key + "\" value=\"" + _1d[key] + "\" />";
            }
            var _1f = this.getVariablePairs().join("&");
            if (_1f.length > 0) {
                _19 += "<param name=\"flashvars\" value=\"" + _1f + "\" />";
            }
            _19 += "</object>";
        }
        return _19;
    },
    write: function (_20) {
        if (this.getAttribute("useExpressInstall")) {
            var _21 = new deconcept.PlayerVersion([6, 0, 65]);
            if (this.installedVer.versionIsValid(_21) && !this.installedVer.versionIsValid(this.getAttribute("version"))) {
                this.setAttribute("doExpressInstall", true);
                this.addVariable("MMredirectURL", escape(this.getAttribute("xiRedirectUrl")));
                document.title = document.title.slice(0, 47) + " - Flash Player Installation";
                this.addVariable("MMdoctitle", document.title);
            }
        }
        if (this.skipDetect || this.getAttribute("doExpressInstall") || this.installedVer.versionIsValid(this.getAttribute("version"))) {
            var n = (typeof _20 == "string") ? document.getElementById(_20) : _20;
            n.innerHTML = this.getSWFHTML();
            return true;
        } else {
            if (this.getAttribute("redirectUrl") != "") {
                document.location.replace(this.getAttribute("redirectUrl"));
            }
        }
        return false;
    }
};
deconcept.SWFObjectUtil.getPlayerVersion = function () {
    var _23 = new deconcept.PlayerVersion([0, 0, 0]);
    if (navigator.plugins && navigator.mimeTypes.length) {
        var x = navigator.plugins["Shockwave Flash"];
        if (x && x.description) {
            _23 = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
        }
    } else {
        try {
            var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
        } catch (e) {
            try {
                var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
                _23 = new deconcept.PlayerVersion([6, 0, 21]);
                axo.AllowScriptAccess = "always";
            } catch (e) {
                if (_23.major == 6) {
                    return _23;
                }
            }
            try {
                axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
            } catch (e) {}
        }
        if (axo != null) {
            _23 = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
        }
    }
    return _23;
};
deconcept.PlayerVersion = function (_27) {
    this.major = _27[0] != null ? parseInt(_27[0]) : 0;
    this.minor = _27[1] != null ? parseInt(_27[1]) : 0;
    this.rev = _27[2] != null ? parseInt(_27[2]) : 0;
};
deconcept.PlayerVersion.prototype.versionIsValid = function (fv) {
    if (this.major < fv.major) {
        return false;
    }
    if (this.major > fv.major) {
        return true;
    }
    if (this.minor < fv.minor) {
        return false;
    }
    if (this.minor > fv.minor) {
        return true;
    }
    if (this.rev < fv.rev) {
        return false;
    }
    return true;
};
deconcept.util = {
    getRequestParameter: function (_29) {
        var q = document.location.search || document.location.hash;
        if (q) {
            var _2b = q.substring(1).split("&");
            for (var i = 0; i < _2b.length; i++) {
                if (_2b[i].substring(0, _2b[i].indexOf("=")) == _29) {
                    return _2b[i].substring((_2b[i].indexOf("=") + 1));
                }
            }
        }
        return "";
    }
};
deconcept.SWFObjectUtil.cleanupSWFs = function () {
    if (window.opera || !document.all) {
        return;
    }
    var _2d = document.getElementsByTagName("OBJECT");
    for (var i = 0; i < _2d.length; i++) {
        _2d[i].style.display = "none";
        for (var x in _2d[i]) {
            if (typeof _2d[i][x] == "function") {
                _2d[i][x] = function () {};
            }
        }
    }
};
deconcept.SWFObjectUtil.prepUnload = function () {
    __flash_unloadHandler = function () {};
    __flash_savedUnloadHandler = function () {};
    if (typeof window.onunload == "function") {
        var _30 = window.onunload;
        window.onunload = function () {
            deconcept.SWFObjectUtil.cleanupSWFs();
            _30();
        };
    } else {
        window.onunload = deconcept.SWFObjectUtil.cleanupSWFs;
    }
};
if (typeof window.onbeforeunload == "function") {
    var oldBeforeUnload = window.onbeforeunload;
    window.onbeforeunload = function () {
        deconcept.SWFObjectUtil.prepUnload();
        oldBeforeUnload();
    };
} else {
    window.onbeforeunload = deconcept.SWFObjectUtil.prepUnload;
}
if (Array.prototype.push == null) {
    Array.prototype.push = function (_31) {
        this[this.length] = _31;
        return this.length;
    };
}
var getQueryParamValue = deconcept.util.getRequestParameter;
var FlashObject = deconcept.SWFObject;
var SWFObject = deconcept.SWFObject;

function ix_random_background_image_init(elementId, imageSrc) {
    var element = document.getElementById(elementId);
    if (element) {
        element.style.backgroundImage = "url(" + imageSrc + ")";
    } else {
        site9.debug("ix_random_background_image_init: Sorry, could not find element '" + elementId + "'");
    }
}
function ix_rover_toggle(pair_id, state) {
    if (state == "out") {
        document.getElementById("ix_rover_active_" + pair_id).style.visibility = "visible";
        document.getElementById("ix_rover_over_" + pair_id).style.visibility = "hidden";
        document.getElementById("ix_rover_active_" + pair_id).style.display = "inline";
        document.getElementById("ix_rover_over_" + pair_id).style.display = "none";
    } else {
        if (state == "over") {
            document.getElementById("ix_rover_active_" + pair_id).style.visibility = "hidden";
            document.getElementById("ix_rover_over_" + pair_id).style.visibility = "visible";
            document.getElementById("ix_rover_active_" + pair_id).style.display = "none";
            document.getElementById("ix_rover_over_" + pair_id).style.display = "inline";
        }
    }
}
var ix_slideshow_random = true;
var ix_slideshow_transition = 0;
var ix_slideshow_bundle_index = -1;

function ix_slideshow_init(interval, random, multiple, transition) {
    ix_slideshow_random = random;
    ix_slideshow_transition = transition;
    if (typeof (ix_sliddeshow_sources) == "undefined" || !ix_sliddeshow_sources || ix_sliddeshow_sources.length == 0 || (ix_sliddeshow_sources.length == 1 && ix_sliddeshow_sources[0].length == 0)) {
        multiple = false;
    }
    ix_slideshow_main();
    if (multiple == true) {
        setInterval(ix_slideshow_main, (interval * 1000));
    }
}
function ix_slideshow_main() {
    var ix_slideshow_div = document.getElementById("ix_slideshow_div");
    if (ix_slideshow_div != null) {
        if (ix_slideshow_random == true && ix_sliddeshow_sources && ix_sliddeshow_sources.length > 1) {
            var temp = ix_slideshow_bundle_index;
            while (temp == ix_slideshow_bundle_index) {
                temp = Math.floor(Math.random() * ix_sliddeshow_sources.length);
            }
            ix_slideshow_bundle_index = temp;
        } else {
            ix_slideshow_bundle_index = ((ix_slideshow_bundle_index + 1) % ix_sliddeshow_sources.length);
        }
        var wrapping_element = ix_slideshow_div;
        if (ix_sliddeshow_hrefs.length > 0) {
            wrapping_element = ix_slideshow_div.getElementsByTagName("a")[0];
            wrapping_element.href = ix_sliddeshow_hrefs[ix_slideshow_bundle_index];
        }
        var images = wrapping_element.getElementsByTagName("img");
        images[0].src = ix_sliddeshow_sources[ix_slideshow_bundle_index];
        images[0].alt = ix_sliddeshow_alts[ix_slideshow_bundle_index];
        ix_slideshow_div.style.visibility = "visible";
        ix_slideshow_div.style.display = "block";
    } else {
        site9.debug("ix_slideshow_main: Big trouble! Cannot find 'ix_slideshow_div'");
    }
}
site9.ProductGallery = function (regEntry, wodec) {
    this._regEntry = regEntry;
    this._wodec = wodec;
};
site9.ProductGallery.prototype = {
    imagePath: null,
    containerId: null,
    largeViewBaseUrl: "",
    mainImageHeight: null,
    unavailableImages: null,
    _orientations: null,
    _sizes: null,
    _altTags: null,
    _widths: null,
    _wodec: null,
    _regEntry: null,
    _smallImageElement: null,
    _fileExtension: ".jpg",
    _filePrefix: "",
    _defaultOrientationIndex: 0
};
site9.ProductGallery.instance = null;
site9.ProductGallery.prototype.init = function () {
    site9.ProductGallery.instance = this;
    this.build();
};
site9.ProductGallery.prototype.build = function () {
    var rolloverWrapper = document.createElement("ul");
    rolloverWrapper.id = "ProductImageWrapper";
    var smallImageWrapper = document.createElement("div");
    smallImageWrapper.className = "productImage";
    this._smallImageElement = document.createElement("img");
    this._smallImageElement.className = "ixSmallImage";
    if (this._widths && this._widths[1]) {
        this._smallImageElement.width = this._widths[1];
    }
    if (this.mainImageHeight) {
        this._smallImageElement.height = this.mainImageHeight;
    }
    this._smallImageElement.src = this.defaultImageUrl();
    this._smallImageElement.name = this._defaultOrientationIndex;
    if (this._sizes.length == 3) {
        this._smallImageElement.onclick = site9.ProductGallery.prototype.viewLargeImage;
    }
    smallImageWrapper.appendChild(this._smallImageElement);
    for (i = 0; i < this._orientations.length; i++) {
        var img = document.createElement("img");
        img.name = this._orientations[i];
        img.className = "ixThumbnailImage";
        if (this._widths && this._widths[0]) {
            img.width = this._widths[0];
        }
        img.onmouseover = site9.ProductGallery.prototype.rollImage;
        img.onmouseout = site9.ProductGallery.prototype.restoreImage;
        if (this._sizes.length == 3) {
            img.onclick = site9.ProductGallery.prototype.viewLargeImage;
            img.style.cursor = "pointer";
        }
        var src = this.buildImageUrl(this._orientations[i], 0);
        img.src = src;
        if (this.unavailableImages && this.unavailableImages.length > 0 && this.unavailableImages.indexOf(src) > -1) {
            img.style.visiblity = "hidden";
            img.style.display = "none";
        }
        img.title = this._altTags[i];
        img.alt = this._altTags[i];
        var li = document.createElement("li");
        li.appendChild(img);
        rolloverWrapper.appendChild(li);
        if (this.unavailableImages && this.unavailableImages.length > 0 && this.unavailableImages.indexOf(src) > -1) {
            li.style.visiblity = "hidden";
            li.style.display = "none";
        }
        if (i == 0) {
            li.className = "firstChild";
        }
    }
    var li = document.createElement("li");
    li.style.visible = "hidden";
    li.style.display = "none";
    li.className = "viewLarge";
    rolloverWrapper.appendChild(li);
    li = document.createElement("li");
    li.style.visible = "hidden";
    li.style.display = "none";
    li.className = "viewZoom";
    rolloverWrapper.appendChild(li);
    var container = new site9.CssSelector("." + this._wodec).selectFirst();
    container.appendChild(smallImageWrapper);
    container.appendChild(rolloverWrapper);
    if (this._sizes.length == 3) {
        container.appendChild(document.createElement("p"));
    }
};
site9.ProductGallery.prototype.buildImageUrl = function (orientation, sizeIndex) {
    var url = this.imagePath + this._filePrefix + orientation + this._sizes[sizeIndex] + this._fileExtension;
    return (url);
};
site9.ProductGallery.prototype.getParentComponent = function (element) {
    var result = null;
    var container = site9.getParentBySelector(".ProductGallery", element);
    if (typeof (container) != "undefined") {
        container = site9.getElementBySelector(".ix_module_id", container);
        if (typeof (container) != "undefined") {
            var wodec = container.id;
            result = site9.launchCompRegistry[wodec];
        } else {
            site9.debug("no child found");
        }
    } else {
        site9.debug("no parent found");
    }
    return (result);
};
site9.ProductGallery.prototype.rollImage = function (event) {
    if (typeof (event) == "undefined") {
        event = window.event;
    }
    var target = (typeof (event.target) != "undefined" ? event.target : event.srcElement);
    var component = site9.ProductGallery.prototype.getParentComponent(target);
    orientation = target.name;
    src = component.productGallery.buildImageUrl(orientation, 1);
    component.productGallery._smallImageElement.src = src;
    component.productGallery._smallImageElement.alt = component.productGallery._altTags[component.productGallery._orientations.indexOf(orientation)];
};
site9.ProductGallery.prototype.restoreImage = function (event) {
    if (typeof (event) == "undefined") {
        event = window.event;
    }
    var target = (typeof (event.target) != "undefined" ? event.target : event.srcElement);
    var component = site9.ProductGallery.prototype.getParentComponent(target);
    src = component.productGallery.defaultImageUrl();
};
site9.ProductGallery.prototype.viewLargeImage = function (event) {
    if (typeof (event) == "undefined") {
        event = window.event;
    }
    var target = (event.target || event.srcElement);
    component = site9.ProductGallery.prototype.getParentComponent(target);
    orientation = target.name;
    url = component.productGallery.buildImageUrl(orientation, 2);
    window.open(url, "LargeView", "width=540,height=670,resizable=1").focus();
};
site9.ProductGallery.prototype.setFileExtension = function (extension) {
    this._fileExtension = extension;
    if (this._fileExtension.indexOf(".") != 0) {
        this._fileExtension = "." + this._fileExtension;
    }
};
site9.ProductGallery.prototype.setFilePrefix = function (prefix) {
    this._filePrefix = prefix;
};
site9.ProductGallery.prototype.setWidths = function (widths) {
    this._widths = widths.split(",");
    for (i = 0; i < this._widths.length; i++) {
        this._widths[i] = Number(this._widths[i]);
    }
};
site9.ProductGallery.prototype.setAltTags = function (tags) {
    this._altTags = tags.split(",");
    for (i = 0; i < this._altTags.length; i++) {
        this._altTags[i] = this._altTags[i].trim();
    }
};
site9.ProductGallery.prototype.setSizes = function (sizes) {
    this._sizes = sizes.split(",");
    for (i = 0; i < this._sizes.length; i++) {
        this._sizes[i] = this._sizes[i].trim();
    }
};
site9.ProductGallery.prototype.setOrientations = function (orientations) {
    this._orientations = orientations.split(",");
    for (i = 0; i < this._orientations.length; i++) {
        this._orientations[i] = this._orientations[i].trim();
    }
};
site9.ProductGallery.prototype.defaultImageUrl = function () {
    return (this.buildImageUrl(this._orientations[this._defaultOrientationIndex], 1));
};
site9.ProductGallery.prototype.setDefaultOrientation = function (orientation) {
    this._defaultOrientationIndex = this._orientations.indexOf(orientation);
    if (this._smallImageElement != null) {
        this._smallImageElement.name = this._defaultOrientationIndex;
    }
};
site9.ContentScroller = function (wrapperId, height, rate) {
    this.rate = rate;
    this._wrapperElement = document.getElementById(wrapperId);
    this._wrapperElement.style.overflow = "hidden";
    this._wrapperElement.style.height = height + "px";
    this._wrapperElement.onmouseover = function () {
        site9.ContentScroller.instance.toggleScroll();
    };
    this._wrapperElement.onmouseout = function () {
        site9.ContentScroller.instance.toggleScroll();
    };
    this._scrollingContainer = this._wrapperElement.getElementsByTagName("div")[0];
    this._scrollingContainer.style.height = height + "px";
    this._scrollingContainer.style.overflow = "hidden";
    this._passiveContainer = this._scrollingContainer.cloneNode(true);
    this._passiveContainer.style.marginTop = "auto";
    this._passiveContainer.style.height = height + "px";
    this._passiveContainer.style.overflow = "hidden";
    this._wrapperElement.appendChild(this._passiveContainer);
    this._height = height;
    site9.ContentScroller.instance = this;
};
site9.ContentScroller.instance = null;
site9.ContentScroller.prototype = {
    rate: 10,
    _offset: 0,
    _interval: null,
    _height: 0,
    _wrapperElement: null,
    _scrollingContainer: null,
    _passiveContainer: null
};
site9.ContentScroller.prototype.start = function () {
    this.toggleScroll();
};
site9.ContentScroller.prototype.toggleScroll = function () {
    _this = site9.ContentScroller.instance;
    if (_this._interval != null) {
        clearInterval(_this._interval);
        _this._interval = null;
    } else {
        _this._interval = setInterval(_this.scroll, 1000 / _this.rate);
    }
};
site9.ContentScroller.prototype.scroll = function () {
    _this = site9.ContentScroller.instance;
    if (_this._offset >= _this._height) {
        _this._offset = 0;
        _this._wrapperElement.removeChild(_this._scrollingContainer);
        var temp = _this._scrollingContainer;
        _this._scrollingContainer = _this._passiveContainer;
        _this._passiveContainer = temp;
        _this._wrapperElement.appendChild(_this._passiveContainer);
        _this._passiveContainer.style.marginTop = "auto";
    } else {
        ++_this._offset;
    }
    _this._scrollingContainer.style.marginTop = "-" + _this._offset + "px";
};
site9.Elephant = {
    restoreFormValues: function (formName, data) {
        var f = document.forms.namedItem(unescape(formName));
        for (var key in data) {
            var aKey = unescape(key);
            if (!aKey.startsWith("_")) {
                var el = f.elements.namedItem(unescape(key));
                if (!el) {
                    site9.debug("Sorry, no form element named: ", key);
                } else {
                    site9.forms.setElValue(el, unescape(data[key]));
                }
            }
        }
    }
};

function ix_showMovie(src, title, width, height, fallbackImageTag) {
    document.writeln('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="' + width + '" height="' + height + '" title="' + title + '">');
    document.writeln('  <param name="movie" value="' + src + '" />');
    document.writeln('  <param name="quality" value="high" />');
    document.writeln('  <param name="wmode" value="transparent" />');
    document.writeln('  <embed src="' + src + '" quality="high" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="' + width + '" height="' + height + '"></embed>');
    if (typeof (fallbackImageTag) != "undefined") {
        document.writeln(fallbackImageTag);
    }
    document.writeln("</object>");
}
site9.YearlyCalendar = {
    MONTHS: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
    MONTHS_WITH_31_DAYS: ["Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec"],
    displayGroupName: null,
    releaseFacetQueryValue: null,
    revokeFacetQueryValue: null,
    disableEmptyDates: null,
    _moduleId: null,
    _wodec: null,
    _innerDiv: null,
    _outerDiv: null,
    init: function (moduleId, wodec, displayGroupName, releaseFacetQueryValue, revokeFacetQueryValue, disableEmptyDates) {
        this._moduleId = moduleId;
        this._wodec = wodec;
        this.displayGroupName = displayGroupName;
        this.releaseFacetQueryValue = releaseFacetQueryValue;
        this.revokeFacetQueryValue = revokeFacetQueryValue;
        this.disableEmptyDates = disableEmptyDates;
        this._outerDiv = document.getElementById(moduleId);
        this.createCalendar("inner_" + moduleId);
        return (this);
    },
    createCalendar: function (innerDivId) {
        this._innerDiv = document.createElement("div");
        this._innerDiv.id = innerDivId;
        this._innerDiv.className = "ix_calendar_year_view";
        this.addYear(new Date().getFullYear(), this._innerDiv);
        this._outerDiv.appendChild(this._innerDiv);
    },
    addYear: function (year, container) {
        var calContainer = document.createElement("div");
        var label = document.createElement("p");
        label.className = "year";
        var text = document.createTextNode(year);
        label.appendChild(text);
        var table = document.createElement("table");
        table.cellSpacing = 0;
        table.cellPadding = 0;
        table.border = 0;
        this.tableHeader(table);
        this.tableBody(table, year);
        this.tableFooter(table);
        calContainer.appendChild(label);
        calContainer.appendChild(table);
        container.appendChild(calContainer);
        return (container);
    },
    tableHeader: function (table) {},
    tableBody: function (table, year) {
        var row = null;
        for (var i = 0; i < this.MONTHS.length; i++) {
            var month = this.MONTHS[i];
            if (i % 3 == 0) {
                row = table.insertRow(table.rows.length);
            }
            cell = row.insertCell(row.cells.length);
            cell.className = year + " " + month;
            if (this.disableEmptyDates == false || this.abbreviatedMonthInBlackout(year, month) == false) {
                var link = document.createElement("a");
                link.href = this.linkBuilder(year, month);
            } else {
                var link = document.createElement("span");
                cell.className += " disabled";
            }
            var text = document.createTextNode(month);
            link.appendChild(text);
            cell.appendChild(link);
        }
    },
    tableFooter: function (table) {},
    abbreviatedMonthInBlackout: function (year, month) {
        var result = false;
        var blackoutMonths = eval("window.blackoutMonths_" + this._wodec);
        if (typeof (blackoutMonths) != "undefined") {
            result = (blackoutMonths.indexOf(month) > -1);
        }
        return (result);
    },
    linkBuilder: function (year, month) {
        var destination = "./?";
        if (typeof (this.revokeFacetQueryValue) != "undefined") {
            destination += this.displayGroupName + "_FT_=";
            destination += this.releaseFacetQueryValue + "_et_" + this.monthAsDigit(month) + "." + this.lastDayOfMonth(year, month) + "." + year;
            if (typeof (this.revokeFacetQueryValue) != "undefined") {
                destination += "&";
            }
        }
        if (typeof (this.revokeFacetQueryValue) != "undefined") {
            destination += this.displayGroupName + "_FT_=";
            destination += this.revokeFacetQueryValue + "_st_" + this.monthAsDigit(month) + ".01." + year;
        }
        destination += "&" + this.displayGroupName + "_S_A=releaseDate";
        return (destination);
    },
    monthAsDigit: function (month) {
        var result = "" + (this.MONTHS.indexOf(month) + 1);
        if (result.length == 1) {
            result = "0" + result;
        }
        return (result);
    },
    lastDayOfMonth: function (year, month) {
        var result = "30";
        if (this.MONTHS_WITH_31_DAYS.indexOf(month) > -1) {
            result = "31";
        } else {
            if (month == "Feb") {
                result = "28";
                if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
                    result = "29";
                }
            }
        }
        return (result);
    }
};
site9.MonthlyCalendar = {
    displayGroupName: null,
    releaseFacetQueryValue: null,
    revokeFacetQueryValue: null,
    _pagedate: "",
    _selected: "",
    _selector: "st_",
    init: function (wodec, displayGroupName, releaseFacetQueryValue, revokeFacetQueryValue) {
        var wrappingElement = new site9.CssSelector("." + wodec).selectFirst();
        if (typeof (wrappingElement.id) == "undefined" || wrappingElement.id == "") {
            wrappingElement.id = "outer_" + wodec;
        }
        var outerId = wrappingElement.id;
        var innerId = "inner_" + wodec;
        this.deriveInitialDatesFromURL();
        this.releaseFacetQueryValue = releaseFacetQueryValue;
        this.revokeFacetQueryValue = revokeFacetQueryValue;
        this.displayGroupName = displayGroupName;
        var minDate = eval("window.minDate_" + wodec);
        var maxDate = eval("window.maxDate_" + wodec);
        var blackoutDates = eval("window.blackoutDates_" + wodec);
        var calendar = null;
        if (typeof (minDate) != "undefined" && typeof (maxDate) != "undefined" && typeof (blackoutDates) != "undefined") {
            calendar = new YAHOO.widget.Calendar(innerId, outerId, {
                pagedate: this._pagedate,
                selected: this._selected,
                minDate: minDate,
                maxDate: maxDate
            });
            calendar.selectEvent.subscribe(this.calendarSelect);
            calendar.addRenderer(blackoutDates, calendar.renderBodyCellRestricted);
        } else {
            calendar = new YAHOO.widget.Calendar(innerId, outerId);
        }
        return (calendar);
    },
    renderBodyCellRestricted: function (date, cell) {
        return (YAHOO.widget.Calendar.STOP_RENDER);
    },
    deriveInitialDatesFromURL: function () {
        var url = document.URL;
        var index = url.indexOf("st_");
        if (index > -1) {
            var selectorSegment = url.substring(index, url.length);
            selectorSegment = selectorSegment.substring(selectorSegment.indexOf("_") + 1, selectorSegment.length);
            index = selectorSegment.indexOf("_");
            if (index == -1) {
                index = selectorSegment.length;
            }
            var dateSegment = selectorSegment.substring(0, index);
            dateSegment = dateSegment.replace(/\./g, "/");
            this._selected = dateSegment.replace(/0?(.*\/)0?(.*\/.*)/, "$1$2");
            this._pagedate = dateSegment.replace(/0?(.*)\/.*(\/.*)/, "$1$2");
            site9.debug(this._selected);
            site9.debug(this._pagedate);
        }
    },
    calendarSelect: function (name, object) {
        var date = new String(object[0]).split(",");
        var year = date[0].trim();
        var month = date[1].trim();
        var day = date[2].trim();
        if (month.length == 1) {
            month = "0" + month;
        }
        if (day.length == 1) {
            day = "0" + day;
        }
        var destination = "./?";
        if (typeof (site9.MonthlyCalendar.revokeFacetQueryValue) != "undefined") {
            destination += site9.MonthlyCalendar.displayGroupName + "_FT_=";
            destination += site9.MonthlyCalendar.releaseFacetQueryValue + "_et_" + month + "." + day + "." + year;
            if (typeof (site9.MonthlyCalendar.revokeFacetQueryValue) != "undefined") {
                destination += "&";
            }
        }
        if (typeof (site9.MonthlyCalendar.revokeFacetQueryValue) != "undefined") {
            destination += site9.MonthlyCalendar.displayGroupName + "_FT_=";
            destination += site9.MonthlyCalendar.revokeFacetQueryValue + "_st_" + month + "." + day + "." + year;
        }
        destination += "&" + site9.MonthlyCalendar.displayGroupName + "_S_A=releaseDate";
        window.location.href = destination;
        window.event.returnValue = false;
    }
};
site9.AjaxLink = {
    ajaxPost: function (theForm, url, constrainToViewport, targetDivId, positionDivId, displayType, transition, height, width, callingElement) {
        if (!url) {
            url = theForm.action;
        }
        YAHOO.util.Connect.setForm(theForm, false);
        site9.AjaxLink.ajaxSendReq("POST", constrainToViewport, false, url, targetDivId, positionDivId, displayType, transition, height, width, callingElement);
    },
    ajaxGet: function (url, constrainToViewport, useCache, targetDivId, positionDivId, displayType, transition, height, width, callingElement) {
        site9.AjaxLink.ajaxSendReq("GET", constrainToViewport, useCache, url, targetDivId, positionDivId, displayType, transition, height, width, callingElement);
    },
    ajaxSendReq: function (method, constrainToViewport, useCache, url, targetDivId, positionDivId, displayType, transition, height, width, callingElement) {
        if (!site9.AjaxLink.responseCache) {
            site9.AjaxLink.responseCache = new Array();
            site9.AjaxLink.responseCount = 0;
        }
        var response = site9.AjaxLink.responseCache[url];
        if (response && useCache) {
            if (response == "LOCK") {
                return;
            }
            response.body.style.overflow = "auto";
            response.show();
        } else {
            site9.AjaxLink.responseCache[url] = "LOCK";
            var divIdVal = targetDivId;
            if (!divIdVal || divIdVal == "null") {
                divIdVal = "xyzzy" + site9.AjaxLink.responseCount++;
            }
            var hasPositionDiv = true;
            if (!positionDivId || positionDivId == null) {
                hasPositionDiv = false;
            }
            if (!document.getElementById(positionDivId)) {
                hasPositionDiv = false;
            }
            var positioner = null;
            if (hasPositionDiv) {
                positioner = positionDivId;
            } else {
                positioner = site9.getParentByTagName("div", callingElement);
            }
            var existingTargetDiv = document.getElementById(divIdVal);
            var params = new Array();
            params["visible"] = false;
            params["constraintoviewport"] = constrainToViewport;
            params["underlay"] = "matte";
            if (width && width != "nullpx") {
                params["width"] = width;
            }
            if (height && height != "nullpx") {
                params["height"] = width;
            }
            var overlay = new YAHOO.widget.Panel(divIdVal, params);
            overlay.beforeShowEvent.subscribe(function () {
                YAHOO.util.Dom.setStyle(this.body, "overflow", "auto");
            }, overlay, true);
            overlay.beforeHideEvent.subscribe(function () {
                YAHOO.util.Dom.setStyle(this.body, "overflow", "hidden");
            }, overlay, true);
            overlay.setBody("<img src='/launch/s9/images/spinner.gif'> Loading");
            overlay.element.style.background = "#fff";
            if (existingTargetDiv) {
                overlay.render();
            } else {
                overlay.render(document.body);
            }
            if (displayType == "center") {
                overlay.center();
            } else {
                if (displayType == "fixed") {
                    overlay.cfg.setProperty("fixedcenter", true);
                } else {
                    overlay.cfg.setProperty("context", [positioner, displayType.substring(0, 2), displayType.substring(2)]);
                }
            }
            if (transition && transition != "null") {
                overlay.cfg.setProperty("effect", {
                    effect: YAHOO.widget.ContainerEffect.FADE,
                    duration: 0.4
                });
            }
            overlay.s9_useCache = useCache;
            overlay.hideEvent.subscribe(site9.AjaxLink.ajaxHide, overlay, true);
            site9.AjaxLink.responseCache[url] = overlay;
            overlay.show();
            var transaction = YAHOO.util.Connect.asyncRequest(method, url, new site9.AjaxLink.callback(url), null);
        }
    },
    ajaxHide: function (event) {
        if (!this.s9_useCache) {
            this.destroy();
        }
    },
    ajaxClose: function (url) {
        var panel = site9.AjaxLink.responseCache[url];
        if (panel) {
            panel.hide();
        }
    },
    ajaxHideParent: function (element) {
        var panelContainer = site9.getParentBySelector(".panel-container", element);
        if (panelContainer) {
            var panelCache = site9.AjaxLink.responseCache;
            for (var i in panelCache) {
                var aPanel = panelCache[i];
                if (aPanel.element && aPanel.element.id == panelContainer.id) {
                    aPanel.hide();
                }
            }
        }
    },
    callback: function (url) {
        this.url = url;
        this.success = function (o) {
            var panel = site9.AjaxLink.responseCache[url];
            panel.setBody(o.responseText);
            panel.show();
            window.onload = null;
            site9.execJS(panel.body);
            if (window.onload) {
                window.onload();
            }
            panel.syncPosition();
            panel.cfg.refireEvent("iframe");
        };
        this.failure = function (o) {
            site9.AjaxLink.responseCache[url].setBody("This request failed to load");
        };
    }
};
site9.launchCompRegistry = {
    registerComponent: function (id) {
        return (this[id] = {
            events: {},
            handlers: {},
            containerElement: document.getElementById(id)
        });
    }
};
site9.ProductForm = function (regEntry, choiceCombinations, variantId) {
    this._regEntry = regEntry;
    this._choiceCombinations = choiceCombinations;
    if (variantId) {
        this._initSku = this.getSkuForVariantId(variantId);
    }
    if (this._initSku) {
        site9.events.attach(window, "load", this.initHandler, null, null, this);
    } else {
        site9.events.attach(window, "load", this.setoption, null, null, this);
    }
};
site9.ProductForm.prototype = {
    setquantity: function (qty) {
        this._regEntry.events.onsetquantity(qty);
    },
    setoption: function (optionName, optionValue) {
        this.setvariant(optionName, optionValue);
        this._regEntry.events.onsetoption(optionName, optionValue);
    },
    hasVariants: function () {
        return this._choiceCombinations.length > 0;
    },
    setvariant: function (optionName, optionValue) {
        var selectedChoices = new Array();
        var selectBoxes = new site9.CssSelector(".ix_product_option").selectAll(this._regEntry.containerElement);
        for (var i = 0; i < selectBoxes.length; i++) {
            var selectObject = selectBoxes[i];
            if (selectObject.name == optionName) {
                selectedChoices[i] = optionValue;
            } else {
                if (selectObject.options) {
                    selectedChoices[i] = selectObject.options[selectObject.selectedIndex].value;
                } else {
                    selectedChoices[i] = selectObject.value;
                }
            }
        }
        var variantDef = this.getVariantDefForChoiceArray(selectedChoices);
        if (variantDef) {
            var newSku = variantDef[0];
            this._setvariant(newSku);
        }
    },
    initHandler: function () {
        if (!this._initSku) {
            this._initSku = null;
        }
        this.setVariantSku(this._initSku);
    },
    setVariantSku: function (newSku) {
        this._setvariant(newSku);
        if (newSku) {
            var variantDef = this.getVariantDefWithSku(newSku);
            if (variantDef) {
                var selectBoxes = new site9.CssSelector(".ix_product_option").selectAll(this._regEntry.containerElement);
                for (var i = 0; i < selectBoxes.length; i++) {
                    selectBoxes[i].value = variantDef[1][i];
                }
            }
        }
    },
    _setvariant: function (newSku) {
        if (newSku != null || (newSku == null && this.hasVariants())) {
            var skuField = new site9.CssSelector("[name = sku]").selectFirst(this._regEntry.containerElement);
            skuField.value = newSku;
        }
        this._regEntry.events.onsetvariant(newSku);
    },
    getVariantDefForChoiceArray: function (selectedChoices) {
        var match = null;
        for (var i = 0; i < this._choiceCombinations.length; i++) {
            match = this._choiceCombinations[i];
            var currentCombo = this._choiceCombinations[i][1];
            for (var j = 0; j < currentCombo.length; j++) {
                if (currentCombo[j] != selectedChoices[j]) {
                    match = null;
                    break;
                }
            }
            if (match != null) {
                break;
            }
        }
        return match;
    },
    getSkuForVariantId: function (variantId) {
        for (var i = 0; i < this._choiceCombinations.length; i++) {
            if (this._choiceCombinations[i][2]["oid"] == variantId) {
                return this._choiceCombinations[i][0];
            }
        }
        return null;
    },
    getSkuForVariantIndex: function (index) {
        return this._choiceCombinations[index][0];
    },
    getVariantAttributeValue: function (vSku, attribKey) {
        var variantDef = this.getVariantDefWithSku(vSku);
        return variantDef[2][attribKey];
    },
    getVariantDefWithSku: function (vSku) {
        for (var i = 0; i < this._choiceCombinations.length; i++) {
            if (this._choiceCombinations[i][0] == vSku) {
                return this._choiceCombinations[i];
            }
        }
    },
    getVariantIndexForSku: function (vSku) {
        for (var i = 0; i < this._choiceCombinations.length; i++) {
            if (this._choiceCombinations[i][0] == vSku) {
                return i;
            }
        }
    },
    getParentProductFormComp: function (element) {
        var formContainer = null;
        if (element.nodeName.toLowerCase() == "form") {
            formContainer = element;
        } else {
            var formContainer = site9.getParentBySelector("form", element);
        }
        if (formContainer != null) {
            var compContainer = formContainer.parentNode;
            return site9.launchCompRegistry[compContainer.id];
        }
    },
    getFormElement: function () {
        var forms = this._regEntry.containerElement.getElementsByTagName("form");
        return forms[0];
    },
    validate: function () {
        var skuField = new site9.CssSelector("[name = sku]").selectFirst(this._regEntry.containerElement);
        var valid = true;
        if (skuField.value && skuField.value != null && skuField.value != "null") {
            if (this.hasVariants() && !this.getVariantAttributeValue(skuField.value, "isForSale")) {
                valid = false;
                site9.Notifications.post({
                    name: "net.site9.validation.failed",
                    userLevelDescription: "Sorry. The configuration you have selected is currently unavailable.",
                    level: site9.Notifications.WarningLevel
                });
            }
        } else {
            valid = false;
            site9.Notifications.post({
                name: "net.site9.validation.failed",
                userLevelDescription: "You must choose a product configuration before adding to your cart.",
                level: site9.Notifications.WarningLevel
            });
        }
        return valid;
    }
};
site9.FetchShippingOptionCost = function (elementId, url, haltOnShippingCostFault) {
    this.elementId = elementId;
    this.url = url;
    this.haltOnShippingCostFault = haltOnShippingCostFault;
    this.showProgIndic = false;
    this.postalCode = "";
};
site9.FetchShippingOptionCost.prototype.fetch = function () {
    var transaction = YAHOO.util.Connect.asyncRequest("GET", this.url, new site9.FetchShippingOptionCost.callback(this), null);
    if (this.showProgIndic == true) {
        if (typeof (this.progIndic) == "undefined") {
            var parentNode = document.getElementById(this.elementId).parentNode;
            this.progIndic = document.createElement("img");
            this.progIndic.border = "0";
            this.progIndic.width = "12";
            this.progIndic.height = "12";
            this.progIndic.src = "../../ix/images/icons/searchwheel.gif";
            parentNode.appendChild(this.progIndic);
        }
    } else {
        document.getElementById(this.elementId).innerHTML = "calculating...";
    }
};
site9.FetchShippingOptionCost.prototype.updateDestPostalCode = function () {
    var element = document.getElementById("_DestPostalCode");
    if (element != null && typeof (element) != "undefined" && typeof (this.postalCode) != "undefined") {
        var text = document.createTextNode(" to " + this.postalCode);
        element.appendChild(text);
    }
};
site9.FetchShippingOptionCost.callback = function (costObject) {
    this.elementId = costObject.elementId;
    this.url = costObject.url;
    this.haltOnShippingCostFault = costObject.haltOnShippingCostFault;
    this.element = document.getElementById(this.elementId);
    this.timeout = 2000;
    this.success = function (o) {
        if (o.status != 200 && o.status != 202) {
            site9.debug(">>>>>> fetch returned status " + o.status + " for " + costObject.elementId);
            costObject.fetch();
        } else {
            if (o.status == 202) {
                var x = new String(o.responseText);
                if (x && x.length > 0 && x.charAt(0) == "#") {
                    var newElementId = costObject.elementId.substr(0, costObject.elementId.indexOf("_") + 1) + o.responseText.substr(1, o.responseText.length);
                    var newUrl = costObject.url.replace(costObject.elementId, newElementId);
                    costObject.url = newUrl;
                    site9.debug(">>>>> costObject.url = " + costObject.url);
                }
                costObject.fetch();
            } else {
                if (o.status == 200) {
                    if (o.responseText && o.responseText.length > 0) {
                        site9.debug(">>>>>> got the shipping cost for " + costObject.elementId);
                        this.element.innerHTML = o.responseText;
                        costObject.updateDestPostalCode();
                        if (costObject.completionCallback != null && typeof (costObject.completionCallback) != "undefined") {
                            costObject.completionCallback();
                        }
                    }
                    if (typeof (costObject.progIndic) != "undefined") {
                        costObject.progIndic.parentNode.removeChild(costObject.progIndic);
                    }
                }
            }
        }
    };
    this.failure = function (o) {
        if (o.status <= 0) {
            site9.debug(">>>>> fetch timeout, status = " + o.status + ", o.responseText = " + o.responseText);
            costObject.fetch();
        } else {
            site9.debug(">>>>>> fetch failed, status = " + o.status + " for " + costObject.elementId);
            this.element.innerHTML = "*";
            if (typeof (costObject.progIndic) != "undefined") {
                costObject.progIndic.parentNode.removeChild(costObject.progIndic);
            }
            this.element = new site9.CssSelector(".FetchShippingCostFaultMessage").selectFirst();
            this.element.style.visibility = "visible";
            this.element.style.display = "block";
            if (o.responseText && o.responseText.trim().length > 0 && this.element.innerHTML.indexOf(o.responseText.trim()) == -1) {
                this.element.innerHTML += " (" + o.responseText.trim() + ")";
            }
            if (costObject.haltOnShippingCostFault == true) {
                this.element = new site9.CssSelector(".PaymentInformationTable").selectFirst();
                this.element.style.visibility = "hidden";
                this.element.style.display = "none";
                this.element = new site9.CssSelector(".ContinueButton").selectFirst();
                this.element.disabled = true;
            }
            if (costObject.completionCallback != null && typeof (costObject.completionCallback) != "undefined") {
                costObject.completionCallback();
            }
        }
    };
};
