if(!window.onerror){
	try{
	    window.onerror = function(){
	        //ShowJsError is a flag set in HtmlTitleAdapater for requests coming from MySpace OfficeIP.
			//Show javascript errors for office ip.
			return !MySpace.ShowJsError;
		};
	}catch(e){}
}

Function.__typeName = "Function";
Function.__class = true;
Function.createCallback = function(A, B) {
    return function() {
        var C = arguments.length;
        if (C > 0) {
            var D = [];
            for (var E = 0; E < C; E++) {
                D[E] = arguments[E]
            }
            D[C] = B;
            return A.apply(this, D)
        }
        return A.call(this, B)
    }
};
Function.createDelegate = function(B, A) {
    return function() {
        return A.apply(B, arguments)
    }
};
Function.emptyFunction = Function.emptyMethod = function() {};
Function._validateParams = function(D, F) {
    var B;
    B = Function._validateParameterCount(D, F);
    if (B) {
        B.popStackFrame();
        return B
    }
    for (var A = 0; A < D.length; A++) {
        var E = F[Math.min(A, F.length - 1)],
        C = E.name;
        if (E.parameterArray) {
            C += "[" + (A - F.length + 1) + "]"
        }
        B = Function._validateParameter(D[A], E, C);
        if (B) {
            B.popStackFrame();
            return B
        }
    }
    return null
};
Function._validateParameterCount = function(D, B) {
    var F = B.length,
    E = 0;
    for (var A = 0; A < B.length; A++) {
        if (B[A].parameterArray) {
            F = Number.MAX_VALUE
        } else {
            if (!B[A].optional) {
                E++
            }
        }
    }
    if (D.length < E || D.length > F) {
        var C = Error.parameterCount();
        C.popStackFrame();
        return C
    }
    return null
};
Function._validateParameter = function(L, N, G) {
    var M, H = N.type,
    C = !!N.integer,
    D = !!N.domElement,
    B = !!N.mayBeNull;
    M = Function._validateParameterType(L, H, C, D, B, G);
    if (M) {
        M.popStackFrame();
        return M
    }
    var J = N.elementType,
    I = !!N.elementMayBeNull;
    if (H === Array && typeof L !== "undefined" && L !== null && (J || !I)) {
        var E = !!N.elementInteger,
        F = !!N.elementDomElement;
        for (var K = 0; K < L.length; K++) {
            var A = L[K];
            M = Function._validateParameterType(A, J, E, F, I, G + "[" + K + "]");
            if (M) {
                M.popStackFrame();
                return M
            }
        }
    }
    return null
};
Function._validateParameterType = function(J, I, A, B, D, H) {
    var K;
    if (typeof J === "undefined") {
        if (D) {
            return null
        } else {
            K = Error.argumentUndefined(H);
            K.popStackFrame();
            return K
        }
    }
    if (J === null) {
        if (D) {
            return null
        } else {
            K = Error.argumentNull(H);
            K.popStackFrame();
            return K
        }
    }
    if (I && I.__enum) {
        if (typeof J !== "number") {
            K = Error.argumentType(H, Object.getType(J), I);
            K.popStackFrame();
            return K
        }
        if (J % 1 === 0) {
            var G = I.prototype;
            if (!I.__flags || J === 0) {
                for (var E in G) {
                    if (G[E] === J) {
                        return null
                    }
                }
            } else {
                var C = J;
                for (var E in G) {
                    var F = G[E];
                    if (F === 0) {
                        continue
                    }
                    if ((F & J) === F) {
                        C -= F
                    }
                    if (C === 0) {
                        return null
                    }
                }
            }
        }
        K = Error.argumentOutOfRange(H, J, String.format(Sys.Res.enumInvalidValue, J, I.getName()));
        K.popStackFrame();
        return K
    }
    if (B && J !== window && J !== document && !(window.HTMLElement && J instanceof HTMLElement) && typeof J.nodeName !== "string") {
        K = Error.argument(H, Sys.Res.argumentDomElement);
        K.popStackFrame();
        return K
    }
    if (I && !I.isInstanceOfType(J)) {
        K = Error.argumentType(H, Object.getType(J), I);
        K.popStackFrame();
        return K
    }
    if (I === Number && A) {
        if (J % 1 !== 0) {
            K = Error.argumentOutOfRange(H, J, Sys.Res.argumentInteger);
            K.popStackFrame();
            return K
        }
    }
    return null
};
Error.__typeName = "Error";
Error.__class = true;
Error.create = function(C, A) {
    var B = new Error(C);
    B.message = C;
    if (A) {
        for (var D in A) {
            B[D] = A[D]
        }
    }
    B.popStackFrame();
    return B
};
Error.argument = function(B, D) {
    var A = "Sys.ArgumentException: " + (D ? D: Sys.Res.argument);
    if (B) {
        A += "\n" + String.format(Sys.Res.paramName, B)
    }
    var C = Error.create(A, {
        name: "Sys.ArgumentException",
        paramName: B
    });
    C.popStackFrame();
    return C
};
Error.argumentNull = function(B, D) {
    var A = "Sys.ArgumentNullException: " + (D ? D: Sys.Res.argumentNull);
    if (B) {
        A += "\n" + String.format(Sys.Res.paramName, B)
    }
    var C = Error.create(A, {
        name: "Sys.ArgumentNullException",
        paramName: B
    });
    C.popStackFrame();
    return C
};
Error.argumentOutOfRange = function(E, B, D) {
    var A = "Sys.ArgumentOutOfRangeException: " + (D ? D: Sys.Res.argumentOutOfRange);
    if (E) {
        A += "\n" + String.format(Sys.Res.paramName, E)
    }
    if (typeof B !== "undefined" && B !== null) {
        A += "\n" + String.format(Sys.Res.actualValue, B)
    }
    var C = Error.create(A, {
        name: "Sys.ArgumentOutOfRangeException",
        paramName: E,
        actualValue: B
    });
    C.popStackFrame();
    return C
};
Error.argumentType = function(E, F, A, D) {
    var B = "Sys.ArgumentTypeException: ";
    if (D) {
        B += D
    } else {
        if (F && A) {
            B += String.format(Sys.Res.argumentTypeWithTypes, F.getName(), A.getName())
        } else {
            B += Sys.Res.argumentType
        }
    }
    if (E) {
        B += "\n" + String.format(Sys.Res.paramName, E)
    }
    var C = Error.create(B, {
        name: "Sys.ArgumentTypeException",
        paramName: E,
        actualType: F,
        expectedType: A
    });
    C.popStackFrame();
    return C
};
Error.argumentUndefined = function(B, D) {
    var A = "Sys.ArgumentUndefinedException: " + (D ? D: Sys.Res.argumentUndefined);
    if (B) {
        A += "\n" + String.format(Sys.Res.paramName, B)
    }
    var C = Error.create(A, {
        name: "Sys.ArgumentUndefinedException",
        paramName: B
    });
    C.popStackFrame();
    return C
};
Error.format = function(B) {
    var C = "Sys.FormatException: " + (B ? B: Sys.Res.format),
    A = Error.create(C, {
        name: "Sys.FormatException"
    });
    A.popStackFrame();
    return A
};
Error.invalidOperation = function(B) {
    var C = "Sys.InvalidOperationException: " + (B ? B: Sys.Res.invalidOperation),
    A = Error.create(C, {
        name: "Sys.InvalidOperationException"
    });
    A.popStackFrame();
    return A
};
Error.notImplemented = function(B) {
    var C = "Sys.NotImplementedException: " + (B ? B: Sys.Res.notImplemented),
    A = Error.create(C, {
        name: "Sys.NotImplementedException"
    });
    A.popStackFrame();
    return A
};
Error.parameterCount = function(B) {
    var C = "Sys.ParameterCountException: " + (B ? B: Sys.Res.parameterCount),
    A = Error.create(C, {
        name: "Sys.ParameterCountException"
    });
    A.popStackFrame();
    return A
};
Error.prototype.popStackFrame = function() {
    if (typeof this.stack === "undefined" || this.stack === null || typeof this.fileName === "undefined" || this.fileName === null || typeof this.lineNumber === "undefined" || this.lineNumber === null) {
        return
    }
    var B = this.stack.split("\n"),
    E = B[0],
    C = this.fileName + ":" + this.lineNumber;
    while (typeof E !== "undefined" && E !== null && E.indexOf(C) === -1) {
        B.shift();
        E = B[0]
    }
    var D = B[1];
    if (typeof D === "undefined" || D === null) {
        return
    }
    var A = D.match(/@(.*):(\d+)$/);
    if (typeof A === "undefined" || A === null) {
        return
    }
    this.fileName = A[1];
    this.lineNumber = parseInt(A[2]);
    B.shift();
    this.stack = B.join("\n")
};
if (!window) {
    this.window = this
}
window.Type = Function;
window.__rootNamespaces = [];
window.__registeredTypes = {};
Type.prototype.callBaseMethod = function(B, C, A) {
    var D = this.getBaseMethod(B, C);
    if (!A) {
        return D.apply(B)
    } else {
        return D.apply(B, A)
    }
};
Type.prototype.getBaseMethod = function(C, D) {
    var A = this.getBaseType();
    if (A) {
        var B = A.prototype[D];
        return B instanceof Function ? B: null
    }
    return null
};
Type.prototype.getBaseType = function() {
    return typeof this.__baseType === "undefined" ? null: this.__baseType
};
Type.prototype.getInterfaces = function() {
    var B = [],
    A = this;
    while (A) {
        var F = A.__interfaces;
        if (F) {
            for (var E = 0,
            C = F.length; E < C; E++) {
                var D = F[E];
                if (!Array.contains(B, D)) {
                    B[B.length] = D
                }
            }
        }
        A = A.__baseType
    }
    return B
};
Type.prototype.getName = function() {
    return typeof this.__typeName === "undefined" ? "": this.__typeName
};
Type.prototype.implementsInterface = function(E) {
    this.resolveInheritance();
    var F = E.getName(),
    B = this.__interfaceCache;
    if (B) {
        var D = B[F];
        if (typeof D !== "undefined") {
            return D
        }
    } else {
        B = this.__interfaceCache = {}
    }
    var A = this;
    while (A) {
        var C = A.__interfaces;
        if (C) {
            if (Array.indexOf(C, E) !== -1) {
                return B[F] = true
            }
        }
        A = A.__baseType
    }
    return B[F] = false
};
Type.prototype.inheritsFrom = function(A) {
    this.resolveInheritance();
    var B = this.__baseType;
    while (B) {
        if (B === A) {
            return true
        }
        B = B.__baseType
    }
    return false
};
Type.prototype.initializeBase = function(B, A) {
    this.resolveInheritance();
    if (this.__baseType) {
        if (!A) {
            this.__baseType.apply(B)
        } else {
            this.__baseType.apply(B, A)
        }
    }
    return B
};
Type.prototype.isImplementedBy = function(B) {
    if (typeof B === "undefined" || B === null) {
        return false
    }
    var A = Object.getType(B);
    return !! (A.implementsInterface && A.implementsInterface(this))
};
Type.prototype.isInstanceOfType = function(A) {
    if (typeof A === "undefined" || A === null) {
        return false
    }
    if (A instanceof this) {
        return true
    }
    var B = Object.getType(A);
    return !! (B === this) || B.inheritsFrom && B.inheritsFrom(this) || B.implementsInterface && B.implementsInterface(this)
};
Type.prototype.registerClass = function(E, A, D) {
    this.prototype.constructor = this;
    this.__typeName = E;
    this.__class = true;
    if (A) {
        this.__baseType = A;
        this.__basePrototypePending = true
    }
    if (!window.__classes) {
        window.__classes = {}
    }
    window.__classes[E.toUpperCase()] = this;
    if (D) {
        this.__interfaces = [];
        for (var B = 2; B < arguments.length; B++) {
            var C = arguments[B];
            this.__interfaces.push(C)
        }
    }
    return this
};
Type.prototype.registerInterface = function(A) {
    this.prototype.constructor = this;
    this.__typeName = A;
    this.__interface = true;
    return this
};
Type.prototype.resolveInheritance = function() {
    if (this.__basePrototypePending) {
        var A = this.__baseType;
        A.resolveInheritance();
        for (var B in A.prototype) {
            var C = A.prototype[B];
            if (!this.prototype[B]) {
                this.prototype[B] = C
            }
        }
        delete this.__basePrototypePending
    }
};
Type.getRootNamespaces = function() {
    return Array.clone(window.__rootNamespaces)
};
Type.isClass = function(A) {
    if (typeof A === "undefined" || A === null) {
        return false
    }
    return !! A.__class
};
Type.isInterface = function(A) {
    if (typeof A === "undefined" || A === null) {
        return false
    }
    return !! A.__interface
};
Type.isNamespace = function(A) {
    if (typeof A === "undefined" || A === null) {
        return false
    }
    return !! A.__namespace
};
Type.parse = function(typeName, ns) {
    var fn;
    if (ns) {
        if (!window.__classes) {
            return null
        }
        fn = window.__classes[ns.getName().toUpperCase() + "." + typeName.toUpperCase()];
        return fn || null
    }
    if (!typeName) {
        return null
    }
    if (!Type.__htClasses) {
        Type.__htClasses = {}
    }
    fn = Type.__htClasses[typeName];
    if (!fn) {
        fn = eval(typeName);
        Type.__htClasses[typeName] = fn
    }
    return fn
};
Type.registerNamespace = function(C) {
    var E = window,
    F = C.split(".");
    for (var A = 0; A < F.length; A++) {
        var D = F[A],
        B = E[D];
        if (!B) {
            B = E[D] = {};
            if (A === 0) {
                window.__rootNamespaces[window.__rootNamespaces.length] = B
            }
            B.__namespace = true;
            B.__typeName = F.slice(0, A + 1).join(".");
            B.getName = function() {
                return this.__typeName
            }
        }
        E = B
    }
};
Object.__typeName = "Object";
Object.__class = true;
Object.getType = function(A) {
    var B = A.constructor;
    if (!B || typeof B !== "function" || !B.__typeName || B.__typeName === "Object") {
        return Object
    }
    return B
};
Object.getTypeName = function(A) {
    return Object.getType(A).getName()
};
Boolean.__typeName = "Boolean";
Boolean.__class = true;
Boolean.parse = function(A) {
    var B = A.trim().toLowerCase();
    if (B === "false") {
        return false
    }
    if (B === "true") {
        return true
    }
};
Date.__typeName = "Date";
Date.__class = true;
Date._appendPreOrPostMatch = function(E, A) {
    var F = 0,
    B = false;
    for (var G = 0,
    C = E.length; G < C; G++) {
        var D = E.charAt(G);
        switch (D) {
        case "'":
            if (B) {
                A.append("'")
            } else {
                F++
            }
            B = false;
            break;
        case "\\":
            if (B) {
                A.append("\\")
            }
            B = !B;
            break;
        default:
            A.append(D);
            B = false;
            break
        }
    }
    return F
};
Date._expandFormat = function(B, A) {
    if (!A) {
        A = "F"
    }
    if (A.length === 1) {
        switch (A) {
        case "d":
            return B.ShortDatePattern;
        case "D":
            return B.LongDatePattern;
        case "t":
            return B.ShortTimePattern;
        case "T":
            return B.LongTimePattern;
        case "F":
            return B.FullDateTimePattern;
        case "M":
        case "m":
            return B.MonthDayPattern;
        case "s":
            return B.SortableDateTimePattern;
        case "Y":
        case "y":
            return B.YearMonthPattern;
        default:
            throw Error.format(Sys.Res.formatInvalidString)
        }
    }
    return A
};
Date._expandYear = function(C, B) {
    if (B < 100) {
        var A = (new Date).getFullYear();
        B += A - A % 100;
        if (B > C.Calendar.TwoDigitYearMax) {
            return B - 100
        }
    }
    return B
};
Date._getParseRegExp = function(K, H) {
    if (!K._parseRegExp) {
        K._parseRegExp = {}
    } else {
        if (K._parseRegExp[H]) {
            return K._parseRegExp[H]
        }
    }
    var J = Date._expandFormat(K, H);
    J = J.replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1");
    var L = new Sys.StringBuilder("^"),
    C = [],
    G = 0,
    D = 0,
    E = Date._getTokenRegExp(),
    I;
    while ((I = E.exec(J)) !== null) {
        var A = J.slice(G, I.index);
        G = E.lastIndex;
        D += Date._appendPreOrPostMatch(A, L);
        if (D % 2 === 1) {
            L.append(I[0]);
            continue
        }
        switch (I[0]) {
        case "dddd":
        case "ddd":
        case "MMMM":
        case "MMM":
            L.append("(\\D+)");
            break;
        case "tt":
        case "t":
            L.append("(\\D*)");
            break;
        case "yyyy":
            L.append("(\\d{4})");
            break;
        case "fff":
            L.append("(\\d{3})");
            break;
        case "ff":
            L.append("(\\d{2})");
            break;
        case "f":
            L.append("(\\d)");
            break;
        case "dd":
        case "d":
        case "MM":
        case "M":
        case "yy":
        case "y":
        case "HH":
        case "H":
        case "hh":
        case "h":
        case "mm":
        case "m":
        case "ss":
        case "s":
            L.append("(\\d\\d?)");
            break;
        case "zzz":
            L.append("([+-]?\\d\\d?:\\d{2})");
            break;
        case "zz":
        case "z":
            L.append("([+-]?\\d\\d?)");
            break
        }
        Array.add(C, I[0])
    }
    Date._appendPreOrPostMatch(J.slice(G), L);
    L.append("$");
    var B = L.
    toString ().replace(/\s+/g, "\\s+"),
    F = {
        regExp: B,
        groups: C
    };
    K._parseRegExp[H] = F;
    return F
};
Date._getTokenRegExp = function() {
    return /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z/g
};
Date.parseLocale = function(A) {
    return Date._parse(A, Sys.CultureInfo.CurrentCulture, arguments)
};
Date.parseInvariant = function(A) {
    return Date._parse(A, Sys.CultureInfo.InvariantCulture, arguments)
};
Date._parse = function(C, G, B) {
    var E = false;
    for (var I = 1,
    A = B.length; I < A; I++) {
        var D = B[I];
        if (D) {
            E = true;
            var H = Date._parseExact(C, D, G);
            if (H) {
                return H
            }
        }
    }
    if (!E) {
        var F = G._getDateTimeFormats();
        for (var I = 0,
        A = F.length; I < A; I++) {
            var H = Date._parseExact(C, F[I], G);
            if (H) {
                return H
            }
        }
    }
    return null
};
Date._parseExact = function(H, B, Q) {
    H = H.trim();
    var N = Q.dateTimeFormat,
    E = Date._getParseRegExp(N, B),
    C = (new RegExp(E.regExp)).exec(H);
    if (C !== null) {
        var D = E.groups,
        U = null,
        X = null,
        S = null,
        T = null,
        W = 0,
        M = 0,
        L = 0,
        V = 0,
        P = null,
        I = false;
        for (var K = 0,
        A = D.length; K < A; K++) {
            var Z = C[K + 1];
            if (Z) {
                switch (D[K]) {
                case "dd":
                case "d":
                    S = Date._parseInt(Z);
                    if (S < 1 || S > 31) {
                        return null
                    }
                    break;
                case "MMMM":
                    X = Q._getMonthIndex(Z);
                    if (X < 0 || X > 11) {
                        return null
                    }
                    break;
                case "MMM":
                    X = Q._getAbbrMonthIndex(Z);
                    if (X < 0 || X > 11) {
                        return null
                    }
                    break;
                case "M":
                case "MM":
                    var X = Date._parseInt(Z) - 1;
                    if (X < 0 || X > 11) {
                        return null
                    }
                    break;
                case "y":
                case "yy":
                    U = Date._expandYear(N, Date._parseInt(Z));
                    if (U < 0 || U > 9999) {
                        return null
                    }
                    break;
                case "yyyy":
                    U = Date._parseInt(Z);
                    if (U < 0 || U > 9999) {
                        return null
                    }
                    break;
                case "h":
                case "hh":
                    W = Date._parseInt(Z);
                    if (W === 12) {
                        W = 0
                    }
                    if (W < 0 || W > 11) {
                        return null
                    }
                    break;
                case "H":
                case "HH":
                    W = Date._parseInt(Z);
                    if (W < 0 || W > 23) {
                        return null
                    }
                    break;
                case "m":
                case "mm":
                    M = Date._parseInt(Z);
                    if (M < 0 || M > 59) {
                        return null
                    }
                    break;
                case "s":
                case "ss":
                    L = Date._parseInt(Z);
                    if (L < 0 || L > 59) {
                        return null
                    }
                    break;
                case "tt":
                case "t":
                    var F = Z.toUpperCase();
                    I = F === N.PMDesignator.toUpperCase();
                    if (!I && F !== N.AMDesignator.toUpperCase()) {
                        return null
                    }
                    break;
                case "f":
                    V = Date._parseInt(Z) * 100;
                    if (V < 0 || V > 999) {
                        return null
                    }
                    break;
                case "ff":
                    V = Date._parseInt(Z) * 10;
                    if (V < 0 || V > 999) {
                        return null
                    }
                    break;
                case "fff":
                    V = Date._parseInt(Z);
                    if (V < 0 || V > 999) {
                        return null
                    }
                    break;
                case "dddd":
                    T = Q._getDayIndex(Z);
                    if (T < 0 || T > 6) {
                        return null
                    }
                    break;
                case "ddd":
                    T = Q._getAbbrDayIndex(Z);
                    if (T < 0 || T > 6) {
                        return null
                    }
                    break;
                case "zzz":
                    var J = Z.split(/:/);
                    if (J.length !== 2) {
                        return null
                    }
                    var R = Date._parseInt(J[0]);
                    if (R < -12 || R > 13) {
                        return null
                    }
                    var O = Date._parseInt(J[1]);
                    if (O < 0 || O > 59) {
                        return null
                    }
                    P = R * 60 + (Z.startsWith("-") ? -O: O);
                    break;
                case "z":
                case "zz":
                    var R = Date._parseInt(Z);
                    if (R < -12 || R > 13) {
                        return null
                    }
                    P = R * 60;
                    break
                }
            }
        }
        var Y = new Date;
        if (U === null) {
            U = Y.getFullYear()
        }
        if (X === null) {
            X = Y.getMonth()
        }
        if (S === null) {
            S = Y.getDate()
        }
        Y.setFullYear(U, X, S);
        if (Y.getDate() !== S) {
            return null
        }
        if (T !== null && Y.getDay() !== T) {
            return null
        }
        if (I && W < 12) {
            W += 12
        }
        Y.setHours(W, M, L, V);
        if (P !== null) {
            var G = Y.getMinutes() - (P + Y.getTimezoneOffset());
            Y.setHours(Y.getHours() + parseInt(G / 60), G % 60)
        }
        return Y
    }
};
Date._parseInt = function(A) {
    return parseInt(A.replace(/^[\s0]+(\d+)$/, "$1"))
};
Date.prototype.format = function(A) {
    return this._toFormattedString(A, Sys.CultureInfo.InvariantCulture)
};
Date.prototype.localeFormat = function(A) {
    return this._toFormattedString(A, Sys.CultureInfo.CurrentCulture)
};
Date.prototype._toFormattedString = function(H, E) {
    if (!H || H.length === 0 || H === "i") {
        if (E && E.name.length > 0) {
            return this.
            toLocaleString ()
        } else {
            return this.
            toString ()
        }
    }
    var I = E.dateTimeFormat;
    H = Date._expandFormat(I, H);
    var L = new Sys.StringBuilder,
    K;
    function J(M) {
        if (M < 10) {
            return "0" + M
        }
        return M.
        toString ()
    }
    function F(M) {
        if (M < 10) {
            return "00" + M
        }
        if (M < 100) {
            return "0" + M
        }
        return M.
        toString ()
    }
    var C = 0,
    D = Date._getTokenRegExp();
    for (; true;) {
        var A = D.lastIndex,
        G = D.exec(H),
        B = H.slice(A, G ? G.index: H.length);
        C += Date._appendPreOrPostMatch(B, L);
        if (!G) {
            break
        }
        if (C % 2 === 1) {
            L.append(G[0]);
            continue
        }
        switch (G[0]) {
        case "dddd":
            L.append(I.DayNames[this.getDay()]);
            break;
        case "ddd":
            L.append(I.AbbreviatedDayNames[this.getDay()]);
            break;
        case "dd":
            L.append(J(this.getDate()));
            break;
        case "d":
            L.append(this.getDate());
            break;
        case "MMMM":
            L.append(I.MonthNames[this.getMonth()]);
            break;
        case "MMM":
            L.append(I.AbbreviatedMonthNames[this.getMonth()]);
            break;
        case "MM":
            L.append(J(this.getMonth() + 1));
            break;
        case "M":
            L.append(this.getMonth() + 1);
            break;
        case "yyyy":
            L.append(this.getFullYear());
            break;
        case "yy":
            L.append(J(this.getFullYear() % 100));
            break;
        case "y":
            L.append(this.getFullYear() % 100);
            break;
        case "hh":
            K = this.getHours() % 12;
            if (K === 0) {
                K = 12
            }
            L.append(J(K));
            break;
        case "h":
            K = this.getHours() % 12;
            if (K === 0) {
                K = 12
            }
            L.append(K);
            break;
        case "HH":
            L.append(J(this.getHours()));
            break;
        case "H":
            L.append(this.getHours());
            break;
        case "mm":
            L.append(J(this.getMinutes()));
            break;
        case "m":
            L.append(this.getMinutes());
            break;
        case "ss":
            L.append(J(this.getSeconds()));
            break;
        case "s":
            L.append(this.getSeconds());
            break;
        case "tt":
            L.append(this.getHours() < 12 ? I.AMDesignator: I.PMDesignator);
            break;
        case "t":
            L.append((this.getHours() < 12 ? I.AMDesignator: I.PMDesignator).charAt(0));
            break;
        case "f":
            L.append(F(this.getMilliseconds()).charAt(0));
            break;
        case "ff":
            L.append(F(this.getMilliseconds()).substr(0, 2));
            break;
        case "fff":
            L.append(F(this.getMilliseconds()));
            break;
        case "z":
            K = this.getTimezoneOffset() / 60;
            L.append((K >= 0 ? "+": "-") + Math.floor(Math.abs(K)));
            break;
        case "zz":
            K = this.getTimezoneOffset() / 60;
            L.append((K >= 0 ? "+": "-") + J(Math.floor(Math.abs(K))));
            break;
        case "zzz":
            K = this.getTimezoneOffset() / 60;
            L.append((K >= 0 ? "+": "-") + J(Math.floor(Math.abs(K))) + I.TimeSeparator + J(Math.abs(this.getTimezoneOffset() % 60)));
            break
        }
    }
    return L.
    toString ()
};
Number.__typeName = "Number";
Number.__class = true;
Number.parseLocale = function(A) {
    return Number._parse(A, Sys.CultureInfo.CurrentCulture)
};
Number.parseInvariant = function(A) {
    return Number._parse(A, Sys.CultureInfo.InvariantCulture)
};
Number._parse = function(C, D) {
    var B = C.trim();
    if (B.match(/infinity/i) !== null) {
        return parseFloat(B)
    }
    if (B.match(/^0x[a-f0-9]+$/i) !== null) {
        return parseInt(B)
    }
    var F = D.numberFormat,
    A = F.NumberDecimalSeparator,
    G = F.NumberGroupSeparator,
    E = new RegExp("^[+-]?[\\d\\" + G + "]*\\" + A + "?\\d*([eE][+-]?\\d+)?$");
    if (!B.match(E)) {
        return Number.NaN
    }
    B = B.split(G).join("");
    B = B.replace(A, ".");
    return parseFloat(B)
};
Number.prototype.format = function(A) {
    return this._toFormattedString(A, Sys.CultureInfo.InvariantCulture)
};
Number.prototype.localeFormat = function(A) {
    return this._toFormattedString(A, Sys.CultureInfo.CurrentCulture)
};
Number.prototype._toFormattedString = function(P, J) {
    if (!P || P.length === 0 || P === "i") {
        if (J && J.name.length > 0) {
            return this.
            toLocaleString ()
        } else {
            return this.
            toString ()
        }
    }
    var C = ["n %", "n%", "%n"],
    D = ["-n %", "-n%", "-%n"],
    B = ["(n)", "-n", "- n", "n-", "n -"],
    E = ["$n", "n$", "$ n", "n $"],
    F = ["($n)", "-$n", "$-n", "$n-", "(n$)", "-n$", "n-$", "n$-", "-n $", "-$ n", "n $-", "$ n-", "$ -n", "n- $", "($ n)", "(n $)"];
    function K(T, Y, Z, X, U) {
        var u = Z[0],
        s = 1,
        w = T.
        toString (),
        y = "",
        W = "",
        q = w.split(".");
        if (q.length > 1) {
            w = q[0];
            y = q[1];
            var r = y.split(/e/i);
            if (r.length > 1) {
                y = r[0];
                W = "e" + r[1]
            }
        }
        if (Y > 0) {
            var t = y.length - Y;
            if (t > 0) {
                y = y.slice(0, Y)
            } else {
                if (t < 0) {
                    for (var V = 0; V < Math.abs(t); V++) {
                        y += "0"
                    }
                }
            }
            y = U + y
        } else {
            y = ""
        }
        y += W;
        var x = w.length - 1,
        v = "";
        while (x >= 0) {
            if (u === 0 || u > x) {
                if (v.length > 0) {
                    return w.slice(0, x + 1) + X + v + y
                } else {
                    return w.slice(0, x + 1) + y
                }
            }
            if (v.length > 0) {
                v = w.slice(x - u + 1, x + 1) + X + v
            } else {
                v = w.slice(x - u + 1, x + 1)
            }
            x -= u;
            if (s < Z.length) {
                u = Z[s];
                s++
            }
        }
        return w.slice(0, x + 1) + X + v + y
    }
    var S = J.numberFormat,
    O = Math.abs(this);
    if (!P) {
        P = "D"
    }
    var R = -1;
    if (P.length > 1) {
        R = parseInt(P.slice(1))
    }
    var Q;
    switch (P.charAt(0)) {
    case "d":
    case "D":
        Q = "n";
        if (R !== -1) {
            var M = "" + O,
            I = R - M.length;
            if (I > 0) {
                for (var G = 0; G < I; G++) {
                    M = "0" + M
                }
            }
            O = M
        }
        if (this < 0) {
            O = -O
        }
        break;
    case "c":
    case "C":
        if (this < 0) {
            Q = F[S.CurrencyNegativePattern]
        } else {
            Q = E[S.CurrencyPositivePattern]
        }
        if (R === -1) {
            R = S.CurrencyDecimalDigits
        }
        O = K(Math.abs(this), R, S.CurrencyGroupSizes, S.CurrencyGroupSeparator, S.CurrencyDecimalSeparator);
        break;
    case "n":
    case "N":
        if (this < 0) {
            Q = B[S.NumberNegativePattern]
        } else {
            Q = "n"
        }
        if (R === -1) {
            R = S.NumberDecimalDigits
        }
        O = K(Math.abs(this), R, S.NumberGroupSizes, S.NumberGroupSeparator, S.NumberDecimalSeparator);
        break;
    case "p":
    case "P":
        if (this < 0) {
            Q = D[S.PercentNegativePattern]
        } else {
            Q = C[S.PercentPositivePattern]
        }
        if (R === -1) {
            R = S.PercentDecimalDigits
        }
        O = K(Math.abs(this), R, S.PercentGroupSizes, S.PercentGroupSeparator, S.PercentDecimalSeparator);
        break;
    default:
        throw Error.format(Sys.Res.formatBadFormatSpecifier)
    }
    var H = /n|\$|-|%/g,
    N = "";
    for (; true;) {
        var A = H.lastIndex,
        L = H.exec(Q);
        N += Q.slice(A, L ? L.index: Q.length);
        if (!L) {
            break
        }
        switch (L[0]) {
        case "n":
            N += O;
            break;
        case "$":
            N += S.CurrencySymbol;
            break;
        case "-":
            N += S.NegativeSign;
            break;
        case "%":
            N += S.PercentSymbol;
            break
        }
    }
    return N
};
RegExp.__typeName = "RegExp";
RegExp.__class = true;
Array.__typeName = "Array";
Array.__class = true;
Array.add = Array.enqueue = function(B, A) {
    B[B.length] = A
};
Array.addRange = function(B, A) {
    B.push.apply(B, A)
};
Array.clear = function(A) {
    A.length = 0
};
Array.clone = function(A) {
    if (A.length === 1) {
        return [A[0]]
    } else {
        return Array.apply(null, A)
    }
};
Array.contains = function(B, A) {
    return Array.indexOf(B, A) >= 0
};
Array.dequeue = function(A) {
    return A.shift()
};
Array.forEach = function(A, D, E) {
    for (var B = 0,
    C = A.length; B < C; B++) {
        var F = A[B];
        if (typeof F !== "undefined") {
            D.call(E, F, B, A)
        }
    }
};
Array.indexOf = function(D, C, B) {
    if (typeof C === "undefined") {
        return - 1
    }
    var E = D.length;
    if (E !== 0) {
        B = B - 0;
        if (isNaN(B)) {
            B = 0
        } else {
            if (isFinite(B)) {
                B = B - B % 1
            }
            if (B < 0) {
                B = Math.max(0, E + B)
            }
        }
        for (var A = B; A < E; A++) {
            if (typeof D[A] !== "undefined" && D[A] === C) {
                return A
            }
        }
    }
    return - 1
};
Array.insert = function(B, A, C) {
    B.splice(A, 0, C)
};
Array.parse = function(value) {
    if (!value) {
        return []
    }
    return eval(value)
};
Array.remove = function(A, C) {
    var B = Array.indexOf(A, C);
    if (B >= 0) {
        A.splice(B, 1)
    }
    return B >= 0
};
Array.removeAt = function(B, A) {
    B.splice(A, 1)
};
String.__typeName = "String";
String.__class = true;
String.prototype.endsWith = function(A) {
    return this.substr(this.length - A.length) === A
};
String.prototype.startsWith = function(A) {
    return this.substr(0, A.length) === A
};
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, "")
};
String.prototype.trimEnd = function() {
    return this.replace(/\s+$/, "")
};
String.prototype.trimStart = function() {
    return this.replace(/^\s+/, "")
};
String.format = function() {
    return String._toFormattedString(false, arguments)
};
String.localeFormat = function() {
    return String._toFormattedString(true, arguments)
};
String._toFormattedString = function(A, C) {
    var J = "",
    H = C[0];
    for (var L = 0; true;) {
        var G = H.indexOf("{", L),
        I = H.indexOf("}", L);
        if (G < 0 && I < 0) {
            J += H.slice(L);
            break
        }
        if (I > 0 && (I < G || G < 0)) {
            J += H.slice(L, I + 1);
            L = I + 2;
            continue
        }
        J += H.slice(L, G);
        L = G + 1;
        if (H.charAt(L) === "{") {
            J += "{";
            L++;
            continue
        }
        if (I < 0) {
            break
        }
        var E = H.substring(L, I),
        F = E.indexOf(":"),
        B = parseInt(F < 0 ? E: E.substring(0, F)) + 1,
        D = F < 0 ? "": E.substring(F + 1),
        K = C[B];
        if (typeof K === "undefined" || K === null) {
            K = ""
        }
        if (K.toFormattedString) {
            J += K.toFormattedString(D)
        } else {
            if (A && K.localeFormat) {
                J += K.localeFormat(D)
            } else {
                if (K.format) {
                    J += K.format(D)
                } else {
                    J += K.
                    toString ()
                }
            }
        }
        L = I + 1
    }
    return J
};
Type.registerNamespace("Sys");
Sys.IDisposable = function() {};
Sys.IDisposable.prototype = {};
Sys.IDisposable.registerInterface("Sys.IDisposable");
Sys.StringBuilder = function(A) {
    this._parts = typeof A !== "undefined" && A !== null && A !== "" ? [A.
    toString ()] : [];
    this._value = {};
    this._len = 0
};
Sys.StringBuilder.prototype = {
    append: function(A) {
        this._parts[this._parts.length] = A
    },
    appendLine: function(A) {
        this._parts[this._parts.length] = typeof A === "undefined" || A === null || A === "" ? "\r\n": A + "\r\n"
    },
    clear: function() {
        this._parts = [];
        this._value = {};
        this._len = 0
    },
    isEmpty: function() {
        if (this._parts.length === 0) {
            return true
        }
        return this.
        toString () === ""
    },
    toString: function(B) {
        B = B || "";
        var A = this._parts;
        if (this._len !== A.length) {
            this._value = {};
            this._len = A.length
        }
        var C = this._value;
        if (typeof C[B] === "undefined") {
            if (B !== "") {
                for (var D = 0; D < A.length;) {
                    if (typeof A[D] === "undefined" || A[D] === "" || A[D] === null) {
                        A.splice(D, 1)
                    } else {
                        D++
                    }
                }
            }
            C[B] = this._parts.join(B)
        }
        return C[B]
    }
};
Sys.StringBuilder.registerClass("Sys.StringBuilder");
if (!window.XMLHttpRequest) {
    window.XMLHttpRequest = function() {
        var A = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
        for (var B = 0; B < A.length; B++) {
            try {
                var D = new ActiveXObject(A[B]);
                return D
            } catch(C) {}
        }
        return null
    }
}
Sys.Browser = {};
Sys.Browser.InternetExplorer = {};
Sys.Browser.Firefox = {};
Sys.Browser.Safari = {};
Sys.Browser.Opera = {};
Sys.Browser.agent = null;
Sys.Browser.hasDebuggerStatement = false;
Sys.Browser.name = navigator.appName;
Sys.Browser.version = parseFloat(navigator.appVersion);
if (navigator.userAgent.indexOf(" MSIE ") > -1) {
    Sys.Browser.agent = Sys.Browser.InternetExplorer;
    Sys.Browser.version = parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);
    Sys.Browser.hasDebuggerStatement = true
} else {
    if (navigator.userAgent.indexOf(" Firefox/") > -1) {
        Sys.Browser.agent = Sys.Browser.Firefox;
        Sys.Browser.version = parseFloat(navigator.userAgent.match(/Firefox\/(\d+\.\d+)/)[1]);
        Sys.Browser.name = "Firefox";
        Sys.Browser.hasDebuggerStatement = true
    } else {
        if (navigator.userAgent.indexOf(" Safari/") > -1) {
            Sys.Browser.agent = Sys.Browser.Safari;
            Sys.Browser.version = parseFloat(navigator.userAgent.match(/Safari\/(\d+\.\d+)/)[1]);
            Sys.Browser.name = "Safari"
        } else {
            if (navigator.userAgent.indexOf("Opera/") > -1) {
                Sys.Browser.agent = Sys.Browser.Opera
            }
        }
    }
}
Type.registerNamespace("Sys.UI");
Sys._Debug = function() {};
Sys._Debug.prototype = {
    _appendConsole: function(A) {
        if (typeof Debug !== "undefined" && Debug.writeln) {
            Debug.writeln(A)
        }
        if (window.console && window.console.log) {
            window.console.log(A)
        }
        if (window.opera) {
            window.opera.postError(A)
        }
        if (window.debugService) {
            window.debugService.trace(A)
        }
    },
    _appendTrace: function(A) {
        var B = document.getElementById("TraceConsole");
        if (B && B.tagName.toUpperCase() === "TEXTAREA") {
            B.value += A + "\n"
        }
    },
    assert: function(C, B, A) {
        if (!C) {
            B = A && this.assert.caller ? String.format(Sys.Res.assertFailedCaller, B, this.assert.caller) : String.format(Sys.Res.assertFailed, B);
            if (confirm(String.format(Sys.Res.breakIntoDebugger, B))) {
                this.fail(B)
            }
        }
    },
    clearTrace: function() {
        var A = document.getElementById("TraceConsole");
        if (A && A.tagName.toUpperCase() === "TEXTAREA") {
            A.value = ""
        }
    },
    fail: function(message) {
        this._appendConsole(message);
        if (Sys.Browser.hasDebuggerStatement) {
            eval("debugger")
        }
    },
    trace: function(A) {
        this._appendConsole(A);
        this._appendTrace(A)
    },
    traceDump: function(B, A) {
        var C = this._traceDump(B, A, true)
    },
    _traceDump: function(L, J, G, K, I) {
        J = J ? J: "traceDump";
        K = K ? K: "";
        if (L === null) {
            this.trace(K + J + ": null");
            return
        }
        switch (typeof L) {
        case "undefined":
            this.trace(K + J + ": Undefined");
            break;
        case "number":
        case "string":
        case "boolean":
            this.trace(K + J + ": " + L);
            break;
        default:
            if (Date.isInstanceOfType(L) || RegExp.isInstanceOfType(L)) {
                this.trace(K + J + ": " + L.
                toString ());
                break
            }
            if (!I) {
                I = []
            } else {
                if (Array.contains(I, L)) {
                    this.trace(K + J + ": ...");
                    return
                }
            }
            Array.add(I, L);
            if (L == window || L === document || window.HTMLElement && L instanceof HTMLElement || typeof L.nodeName === "string") {
                var B = L.tagName ? L.tagName: "DomElement";
                if (L.id) {
                    B += " - " + L.id
                }
                this.trace(K + J + " {" + B + "}")
            } else {
                var D = Object.getTypeName(L);
                this.trace(K + J + (typeof D === "string" ? " {" + D + "}": ""));
                if (K === "" || G) {
                    K += "    ";
                    var H, C, A, F, E;
                    if (Array.isInstanceOfType(L)) {
                        C = L.length;
                        for (H = 0; H < C; H++) {
                            this._traceDump(L[H], "[" + H + "]", G, K, I)
                        }
                    } else {
                        for (F in L) {
                            E = L[F];
                            if (!Function.isInstanceOfType(E)) {
                                this._traceDump(E, F, G, K, I)
                            }
                        }
                    }
                }
            }
            Array.remove(I, L)
        }
    }
};
Sys._Debug.registerClass("Sys._Debug");
Sys.Debug = new Sys._Debug;
Sys.Debug.isDebug = false;
function Sys$Enum$parse(I, G) {
    var K, J, C;
    if (G) {
        K = this.__lowerCaseValues;
        if (!K) {
            this.__lowerCaseValues = K = {};
            var E = this.prototype;
            for (var F in E) {
                K[F.toLowerCase()] = E[F]
            }
        }
    } else {
        K = this.prototype
    }
    if (!this.__flags) {
        C = G ? I.toLowerCase() : I;
        J = K[C.trim()];
        if (typeof J !== "number") {
            throw Error.argument("value", String.format(Sys.Res.enumInvalidValue, I, this.__typeName))
        }
        return J
    } else {
        var D = (G ? I.toLowerCase() : I).split(","),
        B = 0;
        for (var H = D.length - 1; H >= 0; H--) {
            var A = D[H].trim();
            J = K[A];
            if (typeof J !== "number") {
                throw Error.argument("value", String.format(Sys.Res.enumInvalidValue, I.split(",")[H].trim(), this.__typeName))
            }
            B |= J
        }
        return B
    }
}
function Sys$Enum$toString(H) {
    if (typeof H === "undefined" || H === null) {
        return this.__string
    }
    var G = this.prototype,
    B;
    if (!this.__flags || H === 0) {
        for (B in G) {
            if (G[B] === H) {
                return B
            }
        }
    } else {
        var A = this.__sortedValues;
        if (!A) {
            A = [];
            for (B in G) {
                A[A.length] = {
                    key: B,
                    value: G[B]
                }
            }
            A.sort(function(J, I) {
                return J.value - I.value
            });
            this.__sortedValues = A
        }
        var F = [],
        D = H;
        for (B = A.length - 1; B >= 0; B--) {
            var C = A[B],
            E = C.value;
            if (E === 0) {
                continue
            }
            if ((E & H) === E) {
                F[F.length] = C.key;
                D -= E;
                if (D === 0) {
                    break
                }
            }
        }
        if (F.length && D === 0) {
            return F.reverse().join(", ")
        }
    }
    return ""
}
Type.prototype.registerEnum = function(C, A) {
    for (var B in this.prototype) {
        this[B] = this.prototype[B]
    }
    this.__typeName = C;
    this.parse = Sys$Enum$parse;
    this.__string = this.
    toString ();
    this.
    toString = Sys$Enum$toString;
    this.__flags = A;
    this.__enum = true
};
Type.isEnum = function(A) {
    if (typeof A === "undefined" || A === null) {
        return false
    }
    return !! A.__enum
};
Type.isFlags = function(A) {
    if (typeof A === "undefined" || A === null) {
        return false
    }
    return !! A.__flags
};
Sys.EventHandlerList = function() {
    this._list = {}
};
Sys.EventHandlerList.prototype = {
    addHandler: function(A, B) {
        Array.add(this._getEvent(A, true), B)
    },
    removeHandler: function(C, A) {
        var B = this._getEvent(C);
        if (!B) {
            return
        }
        Array.remove(B, A)
    },
    getHandler: function(A) {
        var B = this._getEvent(A);
        if (!B || B.length === 0) {
            return null
        }
        B = Array.clone(B);
        if (!B._handler) {
            B._handler = function(F, E) {
                for (var C = 0,
                D = B.length; C < D; C++) {
                    B[C](F, E)
                }
            }
        }
        return B._handler
    },
    _getEvent: function(B, A) {
        if (!this._list[B]) {
            if (!A) {
                return null
            }
            this._list[B] = []
        }
        return this._list[B]
    }
};
Sys.EventHandlerList.registerClass("Sys.EventHandlerList");
Sys.EventArgs = function() {};
Sys.EventArgs.registerClass("Sys.EventArgs");
Sys.EventArgs.Empty = new Sys.EventArgs;
Sys.CancelEventArgs = function() {
    Sys.CancelEventArgs.initializeBase(this);
    this._cancel = false
};
Sys.CancelEventArgs.prototype = {
    get_cancel: function() {
        return this._cancel
    },
    set_cancel: function(A) {
        this._cancel = A
    }
};
Sys.CancelEventArgs.registerClass("Sys.CancelEventArgs", Sys.EventArgs);
Sys.INotifyPropertyChange = function() {};
Sys.INotifyPropertyChange.prototype = {};
Sys.INotifyPropertyChange.registerInterface("Sys.INotifyPropertyChange");
Sys.PropertyChangedEventArgs = function(A) {
    Sys.PropertyChangedEventArgs.initializeBase(this);
    this._propertyName = A
};
Sys.PropertyChangedEventArgs.prototype = {
    get_propertyName: function() {
        return this._propertyName
    }
};
Sys.PropertyChangedEventArgs.registerClass("Sys.PropertyChangedEventArgs", Sys.EventArgs);
Sys.INotifyDisposing = function() {};
Sys.INotifyDisposing.prototype = {};
Sys.INotifyDisposing.registerInterface("Sys.INotifyDisposing");
Sys.Component = function() {
    if (Sys.Application) {
        Sys.Application.registerDisposableObject(this)
    }
};
Sys.Component.prototype = {
    _id: null,
    _initialized: false,
    _updating: false,
    get_events: function() {
        if (!this._events) {
            this._events = new Sys.EventHandlerList
        }
        return this._events
    },
    get_id: function() {
        return this._id
    },
    set_id: function(A) {
        this._id = A
    },
    get_isInitialized: function() {
        return this._initialized
    },
    get_isUpdating: function() {
        return this._updating
    },
    add_disposing: function(A) {
        this.get_events().addHandler("disposing", A)
    },
    remove_disposing: function(A) {
        this.get_events().removeHandler("disposing", A)
    },
    add_propertyChanged: function(A) {
        this.get_events().addHandler("propertyChanged", A)
    },
    remove_propertyChanged: function(A) {
        this.get_events().removeHandler("propertyChanged", A)
    },
    beginUpdate: function() {
        this._updating = true
    },
    dispose: function() {
        if (this._events) {
            var A = this._events.getHandler("disposing");
            if (A) {
                A(this, Sys.EventArgs.Empty)
            }
        }
        delete this._events;
        Sys.Application.unregisterDisposableObject(this);
        Sys.Application.removeComponent(this)
    },
    endUpdate: function() {
        this._updating = false;
        if (!this._initialized) {
            this.initialize()
        }
        this.updated()
    },
    initialize: function() {
        this._initialized = true
    },
    raisePropertyChanged: function(A) {
        if (!this._events) {
            return
        }
        var B = this._events.getHandler("propertyChanged");
        if (B) {
            B(this, new Sys.PropertyChangedEventArgs(A))
        }
    },
    updated: function() {}
};
Sys.Component.registerClass("Sys.Component", null, Sys.IDisposable, Sys.INotifyPropertyChange, Sys.INotifyDisposing);
function Sys$Component$_setProperties(N, F) {
    var K, E = Object.getType(N),
    J = E === Object || E === Sys.UI.DomElement,
    G = Sys.Component.isInstanceOfType(N) && !N.get_isUpdating();
    if (G) {
        N.beginUpdate()
    }
    for (var L in F) {
        var M = F[L],
        I = J ? null: N["get_" + L];
        if (J || typeof I !== "function") {
            var D = N[L];
            if (!M || typeof M !== "object" || J && !D) {
                N[L] = M
            } else {
                Sys$Component$_setProperties(D, M)
            }
        } else {
            var C = N["set_" + L];
            if (typeof C === "function") {
                C.apply(N, [M])
            } else {
                if (M instanceof Array) {
                    K = I.apply(N);
                    for (var H = 0,
                    B = K.length,
                    A = M.length; H < A; H++, B++) {
                        K[B] = M[H]
                    }
                } else {
                    if (typeof M === "object" && Object.getType(M) === Object) {
                        K = I.apply(N);
                        Sys$Component$_setProperties(K, M)
                    }
                }
            }
        }
    }
    if (G) {
        N.endUpdate()
    }
}
function Sys$Component$_setReferences(E, A) {
    for (var B in A) {
        var C = E["set_" + B],
        D = $find(A[B]);
        C.apply(E, [D])
    }
}
var $create = Sys.Component.create = function(B, D, F, G, C) {
    var I = C ? new B(C) : new B,
    H = Sys.Application,
    A = H.get_isCreatingComponents();
    I.beginUpdate();
    if (D) {
        Sys$Component$_setProperties(I, D)
    }
    if (F) {
        for (var E in F) {
            I["add_" + E](F[E])
        }
    }
    H._createdComponents[H._createdComponents.length] = I;
    if (I.get_id()) {
        H.addComponent(I)
    }
    if (A) {
        if (G) {
            H._addComponentToSecondPass(I, G)
        } else {
            I.endUpdate()
        }
    } else {
        if (G) {
            Sys$Component$_setReferences(I, G)
        }
        I.endUpdate()
    }
    return I
};
Sys.UI.MouseButton = function() {
    throw Error.notImplemented()
};
Sys.UI.MouseButton.prototype = {
    leftButton: 0,
    middleButton: 1,
    rightButton: 2
};
Sys.UI.MouseButton.registerEnum("Sys.UI.MouseButton");
Sys.UI.Key = function() {
    throw Error.notImplemented()
};
Sys.UI.Key.prototype = {
    backspace: 8,
    tab: 9,
    enter: 13,
    esc: 27,
    space: 32,
    pageUp: 33,
    pageDown: 34,
    end: 35,
    home: 36,
    left: 37,
    up: 38,
    right: 39,
    down: 40,
    del: 127
};
Sys.UI.Key.registerEnum("Sys.UI.Key");
Sys.UI.DomEvent = function(C) {
    var B = C;
    this.rawEvent = B;
    this.altKey = B.altKey;
    if (typeof B.button !== "undefined") {
        this.button = typeof B.which !== "undefined" ? B.button: B.button === 4 ? Sys.UI.MouseButton.middleButton: B.button === 2 ? Sys.UI.MouseButton.rightButton: Sys.UI.MouseButton.leftButton
    }
    if (B.type === "keypress") {
        this.charCode = B.charCode || B.keyCode
    } else {
        if (B.keyCode && B.keyCode === 46) {
            this.keyCode = 127
        } else {
            this.keyCode = B.keyCode
        }
    }
    this.clientX = B.clientX;
    this.clientY = B.clientY;
    this.ctrlKey = B.ctrlKey;
    this.target = B.target ? B.target: B.srcElement;
    if (this.target) {
        var A = Sys.UI.DomElement.getLocation(this.target);
        this.offsetX = typeof B.offsetX !== "undefined" ? B.offsetX: window.pageXOffset + (B.clientX || 0) - A.x;
        this.offsetY = typeof B.offsetY !== "undefined" ? B.offsetY: window.pageYOffset + (B.clientY || 0) - A.y
    }
    this.screenX = B.screenX;
    this.screenY = B.screenY;
    this.shiftKey = B.shiftKey;
    this.type = B.type
};
Sys.UI.DomEvent.prototype = {
    preventDefault: function() {
        if (this.rawEvent.preventDefault) {
            this.rawEvent.preventDefault()
        } else {
            if (window.event) {
                window.event.returnValue = false
            }
        }
    },
    stopPropagation: function() {
        if (this.rawEvent.stopPropagation) {
            this.rawEvent.stopPropagation()
        } else {
            if (window.event) {
                window.event.cancelBubble = true
            }
        }
    }
};
Sys.UI.DomEvent.registerClass("Sys.UI.DomEvent");
var $addHandler = Sys.UI.DomEvent.addHandler = function(B, D, C) {
    if (!B._events) {
        B._events = {}
    }
    var E = B._events[D];
    if (!E) {
        B._events[D] = E = []
    }
    var A;
    if (B.addEventListener) {
        A = function(F) {
            return C.call(B, new Sys.UI.DomEvent(F))
        };
        B.addEventListener(D, A, false)
    } else {
        if (B.attachEvent) {
            A = function() {
                return C.call(B, new Sys.UI.DomEvent(window.event))
            };
            B.attachEvent("on" + D, A)
        }
    }
    E[E.length] = {
        handler: C,
        browserHandler: A
    }
},
$addHandlers = Sys.UI.DomEvent.addHandlers = function(C, D, E) {
    for (var A in D) {
        var B = D[A];
        if (E) {
            B = Function.createDelegate(E, B)
        }
        $addHandler(C, A, B)
    }
},
$clearHandlers = Sys.UI.DomEvent.clearHandlers = function(B) {
    if (B._events) {
        var C = B._events;
        for (var A in C) {
            var D = C[A];
            for (var E = D.length - 1; E >= 0; E--) {
                $removeHandler(B, A, D[E].handler)
            }
        }
        B._events = null
    }
},
$removeHandler = Sys.UI.DomEvent.removeHandler = function(B, E, D) {
    var F = null,
    G = B._events[E],
    F = null;
    for (var A = 0,
    C = G.length; A < C; A++) {
        if (G[A].handler === D) {
            F = G[A].browserHandler;
            break
        }
    }
    if (B.removeEventListener) {
        B.removeEventListener(E, F, false)
    } else {
        if (B.detachEvent) {
            B.detachEvent("on" + E, F)
        }
    }
    G.splice(A, 1)
};
Sys.IContainer = function() {};
Sys.IContainer.prototype = {};
Sys.IContainer.registerInterface("Sys.IContainer");
Sys._ScriptLoader = function() {
    this._scriptsToLoad = null;
    this._scriptLoadedDelegate = Function.createDelegate(this, this._scriptLoadedHandler)
};
Sys._ScriptLoader.prototype = {
    dispose: function() {
        this._stopLoading();
        if (this._events) {
            delete this._events
        }
        this._scriptLoadedDelegate = null
    },
    loadScripts: function(B, D, C, A) {
        this._loading = true;
        this._allScriptsLoadedCallback = D;
        this._scriptLoadFailedCallback = C;
        this._scriptLoadTimeoutCallback = A;
        if (B > 0) {
            this._timeoutCookie = window.setTimeout(Function.createDelegate(this, this._scriptLoadTimeoutHandler), B * 1000)
        }
        this._loadScriptsInternal()
    },
    notifyScriptLoaded: function() {
        if (!this._loading) {
            return
        }
        this._currentTask._notified++;
        if (Sys.Browser.agent === Sys.Browser.Safari) {
            if (this._currentTask._notified === 1) {
                window.setTimeout(Function.createDelegate(this,
                function() {
                    this._scriptLoadedHandler(this._currentTask.get_scriptElement(), true)
                }), 0)
            }
        }
    },
    queueCustomScriptTag: function(A) {
        if (!this._scriptsToLoad) {
            this._scriptsToLoad = []
        }
        Array.add(this._scriptsToLoad, A)
    },
    queueScriptBlock: function(A) {
        if (!this._scriptsToLoad) {
            this._scriptsToLoad = []
        }
        Array.add(this._scriptsToLoad, {
            text: A
        })
    },
    queueScriptReference: function(A) {
        if (!this._scriptsToLoad) {
            this._scriptsToLoad = []
        }
        Array.add(this._scriptsToLoad, {
            src: A
        })
    },
    _createScriptElement: function(C) {
        var B = document.createElement("SCRIPT");
        B.type = "text/javascript";
        for (var A in C) {
            B[A] = C[A]
        }
        return B
    },
    _loadScriptsInternal: function() {
        if (this._scriptsToLoad && this._scriptsToLoad.length > 0) {
            var A = Array.dequeue(this._scriptsToLoad),
            B = this._createScriptElement(A);
            if (B.text && Sys.Browser.agent === Sys.Browser.Safari) {
                B.innerHTML = B.text;
                delete B.text
            }
            if (typeof A.src === "string") {
                this._currentTask = new Sys._ScriptLoaderTask(B, this._scriptLoadedDelegate);
                this._currentTask.execute()
            } else {
                document.getElementsByTagName("HEAD")[0].appendChild(B);
                Sys._ScriptLoader._clearScript(B);
                this._loadScriptsInternal()
            }
        } else {
            var C = this._allScriptsLoadedCallback;
            this._stopLoading();
            if (C) {
                C(this)
            }
        }
    },
    _raiseError: function(B) {
        var C = this._scriptLoadFailedCallback,
        A = this._currentTask.get_scriptElement();
        this._stopLoading();
        if (C) {
            C(this, A, B)
        } else {
            throw Sys._ScriptLoader._errorScriptLoadFailed(A.src, B)
        }
    },
    _scriptLoadedHandler: function(B, A) {
        if (A && this._currentTask._notified) {
            if (this._currentTask._notified > 1) {
                this._raiseError(true)
            } else {
                Array.add(Sys._ScriptLoader._getLoadedScripts(), B.src);
                this._currentTask.dispose();
                this._currentTask = null;
                this._loadScriptsInternal()
            }
        } else {
            this._raiseError(false)
        }
    },
    _scriptLoadTimeoutHandler: function() {
        var A = this._scriptLoadTimeoutCallback;
        this._stopLoading();
        if (A) {
            A(this)
        }
    },
    _stopLoading: function() {
        if (this._timeoutCookie) {
            window.clearTimeout(this._timeoutCookie);
            this._timeoutCookie = null
        }
        if (this._currentTask) {
            this._currentTask.dispose();
            this._currentTask = null
        }
        this._scriptsToLoad = null;
        this._loading = null;
        this._allScriptsLoadedCallback = null;
        this._scriptLoadFailedCallback = null;
        this._scriptLoadTimeoutCallback = null
    }
};
Sys._ScriptLoader.registerClass("Sys._ScriptLoader", null, Sys.IDisposable);
Sys._ScriptLoader.getInstance = function() {
    var A = Sys._ScriptLoader._activeInstance;
    if (!A) {
        A = Sys._ScriptLoader._activeInstance = new Sys._ScriptLoader
    }
    return A
};
Sys._ScriptLoader.isScriptLoaded = function(A) {
    var B = document.createElement("script");
    B.src = A;
    return Array.contains(Sys._ScriptLoader._getLoadedScripts(), B.src)
};
Sys._ScriptLoader.readLoadedScripts = function() {
    if (!Sys._ScriptLoader._referencedScripts) {
        var A = Sys._ScriptLoader._referencedScripts = [],
        D = document.getElementsByTagName("SCRIPT");
        for (i = D.length - 1; i >= 0; i--) {
            var C = D[i],
            B = C.src;
            if (B.length) {
                if (!Array.contains(A, B)) {
                    Array.add(A, B)
                }
            }
        }
    }
};
Sys._ScriptLoader._clearScript = function(A) {
    if (!Sys.Debug.isDebug) {
        A.parentNode.removeChild(A)
    }
};
Sys._ScriptLoader._errorScriptLoadFailed = function(A, D) {
    var B;
    if (D) {
        B = Sys.Res.scriptLoadMultipleCallbacks
    } else {
        B = Sys.Res.scriptLoadFailed
    }
    var C = "Sys.ScriptLoadFailedException: " + String.format(B, A),
    E = Error.create(C, {
        name: "Sys.ScriptLoadFailedException",
        scriptUrl: A
    });
    E.popStackFrame();
    return E
};
Sys._ScriptLoader._getLoadedScripts = function() {
    if (!Sys._ScriptLoader._referencedScripts) {
        Sys._ScriptLoader._referencedScripts = [];
        Sys._ScriptLoader.readLoadedScripts()
    }
    return Sys._ScriptLoader._referencedScripts
};
Sys._ScriptLoaderTask = function(A, B) {
    this._scriptElement = A;
    this._completedCallback = B;
    this._notified = 0
};
Sys._ScriptLoaderTask.prototype = {
    get_scriptElement: function() {
        return this._scriptElement
    },
    dispose: function() {
        if (this._disposed) {
            return
        }
        this._disposed = true;
        this._removeScriptElementHandlers();
        Sys._ScriptLoader._clearScript(this._scriptElement);
        this._scriptElement = null
    },
    execute: function() {
        this._addScriptElementHandlers();
        document.getElementsByTagName("HEAD")[0].appendChild(this._scriptElement)
    },
    _addScriptElementHandlers: function() {
        this._scriptLoadDelegate = Function.createDelegate(this, this._scriptLoadHandler);
        if (Sys.Browser.agent !== Sys.Browser.InternetExplorer) {
            this._scriptElement.readyState = "loaded";
            $addHandler(this._scriptElement, "load", this._scriptLoadDelegate)
        } else {
            $addHandler(this._scriptElement, "readystatechange", this._scriptLoadDelegate)
        }
        this._scriptErrorDelegate = Function.createDelegate(this, this._scriptErrorHandler);
        $addHandler(this._scriptElement, "error", this._scriptErrorDelegate)
    },
    _removeScriptElementHandlers: function() {
        if (this._scriptLoadDelegate) {
            var A = this.get_scriptElement();
            if (Sys.Browser.agent !== Sys.Browser.InternetExplorer) {
                $removeHandler(A, "load", this._scriptLoadDelegate)
            } else {
                $removeHandler(A, "readystatechange", this._scriptLoadDelegate)
            }
            $removeHandler(A, "error", this._scriptErrorDelegate);
            this._scriptErrorDelegate = null;
            this._scriptLoadDelegate = null
        }
    },
    _scriptErrorHandler: function() {
        if (this._disposed) {
            return
        }
        this._completedCallback(this.get_scriptElement(), false)
    },
    _scriptLoadHandler: function() {
        if (this._disposed) {
            return
        }
        var B = this.get_scriptElement();
        if (B.readyState !== "loaded" && B.readyState !== "complete") {
            return
        }
        var A = this;
        window.setTimeout(function() {
            A._completedCallback(B, true)
        },
        0)
    }
};
Sys._ScriptLoaderTask.registerClass("Sys._ScriptLoaderTask", null, Sys.IDisposable);
Sys.ApplicationLoadEventArgs = function(A, B) {
    Sys.ApplicationLoadEventArgs.initializeBase(this);
    this._components = A;
    this._isPartialLoad = B
};
Sys.ApplicationLoadEventArgs.prototype = {
    get_components: function() {
        return this._components
    },
    get_isPartialLoad: function() {
        return this._isPartialLoad
    }
};
Sys.ApplicationLoadEventArgs.registerClass("Sys.ApplicationLoadEventArgs", Sys.EventArgs);
Sys._Application = function() {
    Sys._Application.initializeBase(this);
    this._disposableObjects = [];
    this._components = {};
    this._createdComponents = [];
    this._secondPassComponents = [];
    this._unloadHandlerDelegate = Function.createDelegate(this, this._unloadHandler);
    this._loadHandlerDelegate = Function.createDelegate(this, this._loadHandler);
    Sys.UI.DomEvent.addHandler(window, "unload", this._unloadHandlerDelegate);
    Sys.UI.DomEvent.addHandler(window, "load", this._loadHandlerDelegate)
};
Sys._Application.prototype = {
    _creatingComponents: false,
    _disposing: false,
    get_isCreatingComponents: function() {
        return this._creatingComponents
    },
    add_load: function(A) {
        this.get_events().addHandler("load", A)
    },
    remove_load: function(A) {
        this.get_events().removeHandler("load", A)
    },
    add_init: function(A) {
        if (this._initialized) {
            A(this, Sys.EventArgs.Empty)
        } else {
            this.get_events().addHandler("init", A)
        }
    },
    remove_init: function(A) {
        this.get_events().removeHandler("init", A)
    },
    add_unload: function(A) {
        this.get_events().addHandler("unload", A)
    },
    remove_unload: function(A) {
        this.get_events().removeHandler("unload", A)
    },
    addComponent: function(A) {
        this._components[A.get_id()] = A
    },
    beginCreateComponents: function() {
        this._creatingComponents = true
    },
    dispose: function() {
        if (!this._disposing) {
            this._disposing = true;
            if (window.pageUnload) {
                window.pageUnload(this, Sys.EventArgs.Empty)
            }
            var E = this.get_events().getHandler("unload");
            if (E) {
                E(this, Sys.EventArgs.Empty)
            }
            var A = Array.clone(this._disposableObjects);
            for (var B = 0,
            C = A.length; B < C; B++) {
                A[B].dispose()
            }
            Array.clear(this._disposableObjects);
            Sys.UI.DomEvent.removeHandler(window, "unload", this._unloadHandlerDelegate);
            if (this._loadHandlerDelegate) {
                Sys.UI.DomEvent.removeHandler(window, "load", this._loadHandlerDelegate);
                this._loadHandlerDelegate = null
            }
            var D = Sys._ScriptLoader.getInstance();
            if (D) {
                D.dispose()
            }
            Sys._Application.callBaseMethod(this, "dispose")
        }
    },
    endCreateComponents: function() {
        var A = this._secondPassComponents;
        for (var B = 0,
        C = A.length; B < C; B++) {
            var D = A[B].component;
            Sys$Component$_setReferences(D, A[B].references);
            D.endUpdate()
        }
        this._secondPassComponents = [];
        this._creatingComponents = false
    },
    findComponent: function(A, B) {
        return B ? Sys.IContainer.isInstanceOfType(B) ? B.findComponent(A) : B[A] || null: Sys.Application._components[A] || null
    },
    getComponents: function() {
        var B = [],
        A = this._components;
        for (var C in A) {
            B[B.length] = A[C]
        }
        return B
    },
    initialize: function() {
        if (!this._initialized && !this._initializing) {
            this._initializing = true;
            window.setTimeout(Function.createDelegate(this, this._doInitialize), 0)
        }
    },
    notifyScriptLoaded: function() {
        var A = Sys._ScriptLoader.getInstance();
        if (A) {
            A.notifyScriptLoaded()
        }
    },
    registerDisposableObject: function(A) {
        if (!this._disposing) {
            this._disposableObjects[this._disposableObjects.length] = A
        }
    },
    raiseLoad: function() {
        var A = this.get_events().getHandler("load"),
        B = new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents), !this._initializing);
        if (A) {
            A(this, B)
        }
        if (window.pageLoad) {
            window.pageLoad(this, B)
        }
        this._createdComponents = []
    },
    removeComponent: function(A) {
        var B = A.get_id();
        if (B) {
            delete this._components[B]
        }
    },
    unregisterDisposableObject: function(A) {
        if (!this._disposing) {
            Array.remove(this._disposableObjects, A)
        }
    },
    _addComponentToSecondPass: function(A, B) {
        this._secondPassComponents[this._secondPassComponents.length] = {
            component: A,
            references: B
        }
    },
    _doInitialize: function() {
        Sys._Application.callBaseMethod(this, "initialize");
        var A = this.get_events().getHandler("init");
        if (A) {
            this.beginCreateComponents();
            A(this, Sys.EventArgs.Empty);
            this.endCreateComponents()
        }
        this.raiseLoad();
        this._initializing = false
    },
    _loadHandler: function() {
        if (this._loadHandlerDelegate) {
            Sys.UI.DomEvent.removeHandler(window, "load", this._loadHandlerDelegate);
            this._loadHandlerDelegate = null
        }
        this.initialize()
    },
    _unloadHandler: function() {
        this.dispose()
    }
};
Sys._Application.registerClass("Sys._Application", Sys.Component, Sys.IContainer);
Sys.Application = new Sys._Application;
var $find = Sys.Application.findComponent;
Type.registerNamespace("Sys.Net");
Sys.Net.WebRequestExecutor = function() {
    this._webRequest = null;
    this._resultObject = null
};
Sys.Net.WebRequestExecutor.prototype = {
    get_webRequest: function() {
        return this._webRequest
    },
    _set_webRequest: function(A) {
        this._webRequest = A
    },
    get_started: function() {
        throw Error.notImplemented()
    },
    get_responseAvailable: function() {
        throw Error.notImplemented()
    },
    get_timedOut: function() {
        throw Error.notImplemented()
    },
    get_aborted: function() {
        throw Error.notImplemented()
    },
    get_responseData: function() {
        throw Error.notImplemented()
    },
    get_statusCode: function() {
        throw Error.notImplemented()
    },
    get_statusText: function() {
        throw Error.notImplemented()
    },
    get_xml: function() {
        throw Error.notImplemented()
    },
    get_object: function() {
        if (!this._resultObject) {
            this._resultObject = Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData())
        }
        return this._resultObject
    },
    executeRequest: function() {
        throw Error.notImplemented()
    },
    abort: function() {
        throw Error.notImplemented()
    },
    getResponseHeader: function() {
        throw Error.notImplemented()
    },
    getAllResponseHeaders: function() {
        throw Error.notImplemented()
    }
};
Sys.Net.WebRequestExecutor.registerClass("Sys.Net.WebRequestExecutor");
window.XMLDOM = function(E) {
    if (!window.DOMParser) {
        var F = ["Msxml2.DOMDocument.3.0", "Msxml2.DOMDocument"];
        for (var A = 0; A < F.length; A++) {
            try {
                var B = new ActiveXObject(F[A]);
                B.async = false;
                B.loadXML(E);
                B.setProperty("SelectionLanguage", "XPath");
                return B
            } catch(C) {}
        }
        return null
    } else {
        try {
            var D = new window.DOMParser;
            return D.parseFromString(E, "text/xml")
        } catch(C) {
            return null
        }
    }
    return null
};
Sys.Net.XMLHttpExecutor = function() {
    Sys.Net.XMLHttpExecutor.initializeBase(this);
    var A = this;
    this._xmlHttpRequest = null;
    this._webRequest = null;
    this._responseAvailable = false;
    this._timedOut = false;
    this._timer = null;
    this._aborted = false;
    this._started = false;
    this._onReadyStateChange = function() {
        if (A._xmlHttpRequest.readyState === 4) {
            A._clearTimer();
            A._responseAvailable = true;
            A._webRequest.completed(Sys.EventArgs.Empty);
            if (A._xmlHttpRequest != null) {
                A._xmlHttpRequest.onreadystatechange = Function.emptyMethod;
                A._xmlHttpRequest = null
            }
        }
    };
    this._clearTimer = function() {
        if (A._timer != null) {
            window.clearTimeout(A._timer);
            A._timer = null
        }
    };
    this._onTimeout = function() {
        if (!A._responseAvailable) {
            A._clearTimer();
            A._timedOut = true;
            A._xmlHttpRequest.onreadystatechange = Function.emptyMethod;
            A._xmlHttpRequest.abort();
            A._webRequest.completed(Sys.EventArgs.Empty);
            A._xmlHttpRequest = null
        }
    }
};
Sys.Net.XMLHttpExecutor.prototype = {
    get_timedOut: function() {
        return this._timedOut
    },
    get_started: function() {
        return this._started
    },
    get_responseAvailable: function() {
        return this._responseAvailable
    },
    get_aborted: function() {
        return this._aborted
    },
    executeRequest: function() {
        this._webRequest = this.get_webRequest();
        var F = this._webRequest.get_body(),
        B = this._webRequest.get_headers();
        this._xmlHttpRequest = new XMLHttpRequest;
        this._xmlHttpRequest.onreadystatechange = this._onReadyStateChange;
        var D = this._webRequest.get_httpVerb();
        this._xmlHttpRequest.open(D, this._webRequest.getResolvedUrl(), true);
        if (B) {
            for (var A in B) {
                var C = B[A];
                if (typeof C !== "function") {
                    this._xmlHttpRequest.setRequestHeader(A, C)
                }
            }
        }
        if (D.toLowerCase() === "post") {
            if (B === null || !B["Content-Type"]) {
                this._xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
            }
            if (!F) {
                F = ""
            }
        }
        var E = this._webRequest.get_timeout();
        if (E > 0) {
            this._timer = window.setTimeout(Function.createDelegate(this, this._onTimeout), E)
        }
        this._xmlHttpRequest.send(F);
        this._started = true
    },
    getResponseHeader: function(A) {
        var B;
        try {
            B = this._xmlHttpRequest.getResponseHeader(A)
        } catch(C) {}
        if (!B) {
            B = ""
        }
        return B
    },
    getAllResponseHeaders: function() {
        return this._xmlHttpRequest.getAllResponseHeaders()
    },
    get_responseData: function() {
        return this._xmlHttpRequest.responseText
    },
    get_statusCode: function() {
        return this._xmlHttpRequest.status
    },
    get_statusText: function() {
        return this._xmlHttpRequest.statusText
    },
    get_xml: function() {
        var A = this._xmlHttpRequest.responseXML;
        if (!A || !A.documentElement) {
            A = new XMLDOM(this._xmlHttpRequest.responseText);
            if (!A || !A.documentElement) {
                return null
            }
        } else {
            if (navigator.userAgent.indexOf("MSIE") !== -1) {
                A.setProperty("SelectionLanguage", "XPath")
            }
        }
        if (A.documentElement.namespaceURI === "http://www.mozilla.org/newlayout/xml/parsererror.xml" && A.documentElement.tagName === "parsererror") {
            return null
        }
        if (A.documentElement.firstChild && A.documentElement.firstChild.tagName === "parsererror") {
            return null
        }
        return A
    },
    abort: function() {
        if (this._aborted || this._responseAvailable || this._timedOut) {
            return
        }
        this._aborted = true;
        this._clearTimer();
        if (this._xmlHttpRequest && !this._responseAvailable) {
            this._xmlHttpRequest.onreadystatechange = Function.emptyMethod;
            this._xmlHttpRequest.abort();
            this._xmlHttpRequest = null;
            var A = this._webRequest._get_eventHandlerList().getHandler("completed");
            if (A) {
                A(this, Sys.EventArgs.Empty)
            }
        }
    }
};
Sys.Net.XMLHttpExecutor.registerClass("Sys.Net.XMLHttpExecutor", Sys.Net.WebRequestExecutor);
Sys.Net._WebRequestManager = function() {
    this._this = this;
    this._defaultTimeout = 0;
    this._defaultExecutorType = "Sys.Net.XMLHttpExecutor"
};
Sys.Net._WebRequestManager.prototype = {
    add_invokingRequest: function(A) {
        this._get_eventHandlerList().addHandler("invokingRequest", A)
    },
    remove_invokingRequest: function(A) {
        this._get_eventHandlerList().removeHandler("invokingRequest", A)
    },
    add_completedRequest: function(A) {
        this._get_eventHandlerList().addHandler("completedRequest", A)
    },
    remove_completedRequest: function(A) {
        this._get_eventHandlerList().removeHandler("completedRequest", A)
    },
    _get_eventHandlerList: function() {
        if (!this._events) {
            this._events = new Sys.EventHandlerList
        }
        return this._events
    },
    get_defaultTimeout: function() {
        return this._defaultTimeout
    },
    set_defaultTimeout: function(A) {
        this._defaultTimeout = A
    },
    get_defaultExecutorType: function() {
        return this._defaultExecutorType
    },
    set_defaultExecutorType: function(A) {
        this._defaultExecutorType = A
    },
    executeRequest: function(webRequest) {
        var executor = webRequest.get_executor();
        if (!executor) {
            var failed = false;
            try {
                var executorType = eval(this._defaultExecutorType);
                executor = new executorType
            } catch(a) {
                failed = true
            }
            webRequest.set_executor(executor)
        }
        if (executor.get_aborted()) {
            return
        }
        var evArgs = new Sys.Net.NetworkRequestEventArgs(webRequest),
        handler = this._get_eventHandlerList().getHandler("invokingRequest");
        if (handler) {
            handler(this, evArgs)
        }
        if (!evArgs.get_cancel()) {
            executor.executeRequest()
        }
    }
};
Sys.Net._WebRequestManager.registerClass("Sys.Net._WebRequestManager");
Sys.Net.WebRequestManager = new Sys.Net._WebRequestManager;
Sys.Net.NetworkRequestEventArgs = function(A) {
    Sys.Net.NetworkRequestEventArgs.initializeBase(this);
    this._webRequest = A
};
Sys.Net.NetworkRequestEventArgs.prototype = {
    get_webRequest: function() {
        return this._webRequest
    }
};
Sys.Net.NetworkRequestEventArgs.registerClass("Sys.Net.NetworkRequestEventArgs", Sys.CancelEventArgs);
Sys.Net.WebRequest = function() {
    this._url = "";
    this._headers = {};
    this._body = null;
    this._userContext = null;
    this._httpVerb = null;
    this._executor = null;
    this._invokeCalled = false;
    this._timeout = 0
};
Sys.Net.WebRequest.prototype = {
    add_completed: function(A) {
        this._get_eventHandlerList().addHandler("completed", A)
    },
    remove_completed: function(A) {
        this._get_eventHandlerList().removeHandler("completed", A)
    },
    completed: function(A) {
        var B = Sys.Net.WebRequestManager._get_eventHandlerList().getHandler("completedRequest");
        if (B) {
            B(this._executor, A)
        }
        B = this._get_eventHandlerList().getHandler("completed");
        if (B) {
            B(this._executor, A)
        }
    },
    _get_eventHandlerList: function() {
        if (!this._events) {
            this._events = new Sys.EventHandlerList
        }
        return this._events
    },
    get_url: function() {
        return this._url
    },
    set_url: function(A) {
        this._url = A
    },
    get_headers: function() {
        return this._headers
    },
    get_httpVerb: function() {
        if (this._httpVerb === null) {
            if (this._body === null) {
                return "GET"
            }
            return "POST"
        }
        return this._httpVerb
    },
    set_httpVerb: function(A) {
        this._httpVerb = A
    },
    get_body: function() {
        return this._body
    },
    set_body: function(A) {
        this._body = A
    },
    get_userContext: function() {
        return this._userContext
    },
    set_userContext: function(A) {
        this._userContext = A
    },
    get_executor: function() {
        return this._executor
    },
    set_executor: function(A) {
        this._executor = A;
        this._executor._set_webRequest(this)
    },
    get_timeout: function() {
        if (this._timeout === 0) {
            return Sys.Net.WebRequestManager.get_defaultTimeout()
        }
        return this._timeout
    },
    set_timeout: function(A) {
        this._timeout = A
    },
    getResolvedUrl: function() {
        return Sys.Net.WebRequest._resolveUrl(this._url)
    },
    invoke: function() {
        Sys.Net.WebRequestManager.executeRequest(this);
        this._invokeCalled = true
    }
};
Sys.Net.WebRequest._resolveUrl = function(A, B) {
    if (A && A.indexOf("://") !== -1) {
        return A
    }
    if (!B || B.length === 0) {
        var G = document.getElementsByTagName("base")[0];
        if (G && G.href && G.href.length > 0) {
            B = G.href
        } else {
            B = document.URL
        }
    }
    var F = B.indexOf("?");
    if (F !== -1) {
        B = B.substr(0, F)
    }
    B = B.substr(0, B.lastIndexOf("/") + 1);
    if (!A || A.length === 0) {
        return B
    }
    if (A.charAt(0) === "/") {
        var E = B.indexOf("://"),
        C = B.indexOf("/", E + 3);
        return B.substr(0, C) + A
    } else {
        var D = B.lastIndexOf("/");
        return B.substr(0, D + 1) + A
    }
};
Sys.Net.WebRequest._createQueryString = function(F, A) {
    if (!A) {
        A = encodeURIComponent
    }
    var B = new Sys.StringBuilder,
    D = 0;
    for (var G in F) {
        var E = F[G];
        if (typeof E === "function") {
            continue
        }
        var C = Sys.Serialization.JavaScriptSerializer.serialize(E);
        if (D !== 0) {
            B.append("&")
        }
        B.append(G);
        B.append("=");
        B.append(A(C));
        D++
    }
    return B.
    toString ()
};
Sys.Net.WebRequest._createUrl = function(B, A) {
    if (!A) {
        return B
    }
    var C = Sys.Net.WebRequest._createQueryString(A);
    if (C.length > 0) {
        var D = "?";
        if (B && B.indexOf("?") !== -1) {
            D = "&"
        }
        return B + D + C
    } else {
        return B
    }
};
Sys.Net.WebRequest.registerClass("Sys.Net.WebRequest");
Sys.Net.WebServiceProxy = function() {};
Sys.Net.WebServiceProxy.prototype = {
    set_timeout: function(A) {
        this._timeout = A
    },
    get_timeout: function() {
        return this._timeout
    },
    set_defaultUserContext: function(A) {
        this._userContext = A
    },
    get_defaultUserContext: function() {
        return this._userContext
    },
    set_defaultSucceededCallback: function(A) {
        this._succeeded = A
    },
    get_defaultSucceededCallback: function() {
        return this._succeeded
    },
    set_defaultFailedCallback: function(A) {
        this._failed = A
    },
    get_defaultFailedCallback: function() {
        return this._failed
    },
    set_path: function(A) {
        this._path = A
    },
    get_path: function() {
        return this._path
    },
    _invoke: function(F, E, C, D, G, A, B) {
        if (G === null || typeof G === "undefined") {
            G = this.get_defaultSucceededCallback()
        }
        if (A === null || typeof A === "undefined") {
            A = this.get_defaultFailedCallback()
        }
        if (B === null || typeof B === "undefined") {
            B = this.get_defaultUserContext()
        }
        return Sys.Net.WebServiceProxy.invoke(F, E, C, D, G, A, B, this.get_timeout())
    }
};
Sys.Net.WebServiceProxy.registerClass("Sys.Net.WebServiceProxy");
Sys.Net.WebServiceProxy.invoke = function(B, L, C, I, D, J, G, E) {
    var K = new Sys.Net.WebRequest;
    K.get_headers()["Content-Type"] = "application/json; charset=utf-8";
    if (!I) {
        I = {}
    }
    var F = I;
    if (!C || !F) {
        F = {}
    }
    K.set_url(Sys.Net.WebRequest._createUrl(B + "/" + L, F));
    var H = null;
    if (!C) {
        H = Sys.Serialization.JavaScriptSerializer.serialize(I);
        if (H === "{}") {
            H = ""
        }
    }
    K.set_body(H);
    K.add_completed(A);
    if (E && E > 0) {
        K.set_timeout(E)
    }
    K.invoke();
    function A(T) {
        if (T.get_responseAvailable()) {
            var S = T.get_statusCode(),
            N = null;
            try {
                var P = T.getResponseHeader("Content-Type");
                if (P.startsWith("application/json")) {
                    N = T.get_object()
                } else {
                    if (P.startsWith("text/xml")) {
                        N = T.get_xml()
                    } else {
                        N = T.get_responseData()
                    }
                }
            } catch(M) {}
            var O = T.getResponseHeader("jsonerror"),
            R = O === "true";
            if (R) {
                N = new Sys.Net.WebServiceError(false, N.Message, N.StackTrace, N.ExceptionType)
            }
            if (S < 200 || S >= 300 || R) {
                if (J) {
                    if (!N || !R) {
                        N = new Sys.Net.WebServiceError(false, String.format(Sys.Res.webServiceFailedNoMsg, L), "", "")
                    }
                    N._statusCode = S;
                    J(N, G, L)
                }
            } else {
                if (D) {
                    D(N, G, L)
                }
            }
        } else {
            var Q;
            if (T.get_timedOut()) {
                Q = String.format(Sys.Res.webServiceTimedOut, L)
            } else {
                Q = String.format(Sys.Res.webServiceFailedNoMsg, L)
            }
            if (J) {
                J(new Sys.Net.WebServiceError(T.get_timedOut(), Q, "", ""), G, L)
            }
        }
    }
    return K
};
Sys.Net.WebServiceProxy._generateTypedConstructor = function(A) {
    return function(B) {
        if (B) {
            for (var C in B) {
                this[C] = B[C]
            }
        }
        this.__type = A
    }
};
Sys.Net.WebServiceError = function(D, C, A, B) {
    this._timedOut = D;
    this._message = C;
    this._stackTrace = A;
    this._exceptionType = B;
    this._statusCode = -1
};
Sys.Net.WebServiceError.prototype = {
    get_timedOut: function() {
        return this._timedOut
    },
    get_statusCode: function() {
        return this._statusCode
    },
    get_message: function() {
        return this._message
    },
    get_stackTrace: function() {
        return this._stackTrace
    },
    get_exceptionType: function() {
        return this._exceptionType
    }
};
Sys.Net.WebServiceError.registerClass("Sys.Net.WebServiceError");
Type.registerNamespace("Sys.Services");
Sys.Services._ProfileService = function() {
    Sys.Services._ProfileService.initializeBase(this);
    this.properties = {}
};
Sys.Services._ProfileService.DefaultWebServicePath = "";
Sys.Services._ProfileService.prototype = {
    _defaultFailedCallback: null,
    _defaultLoadCompletedCallback: null,
    _defaultSaveCompletedCallback: null,
    _path: "",
    _timeout: 0,
    get_defaultFailedCallback: function() {
        return this._defaultFailedCallback
    },
    set_defaultFailedCallback: function(A) {
        this._defaultFailedCallback = A
    },
    get_defaultLoadCompletedCallback: function() {
        return this._defaultLoadCompletedCallback
    },
    set_defaultLoadCompletedCallback: function(A) {
        this._defaultLoadCompletedCallback = A
    },
    get_defaultSaveCompletedCallback: function() {
        return this._defaultSaveCompletedCallback
    },
    set_defaultSaveCompletedCallback: function(A) {
        this._defaultSaveCompletedCallback = A
    },
    get_path: function() {
        return this._path
    },
    set_path: function(A) {
        if (!A || !A.length) {
            A = ""
        }
        this._path = A
    },
    get_timeout: function() {
        return this._timeout
    },
    set_timeout: function(A) {
        this._timeout = A
    },
    load: function(A, E, D, C) {
        var F = {},
        B;
        if (!A) {
            B = "GetAllPropertiesForCurrentUser"
        } else {
            B = "GetPropertiesForCurrentUser";
            F = {
                properties: this._clonePropertyNames(A)
            }
        }
        this._invoke(this._get_path(), B, false, F, Function.createDelegate(this, this._onLoadComplete), Function.createDelegate(this, this._onLoadFailed), [E, D, C])
    },
    save: function(D, B, E, C) {
        var A = this._flattenProperties(D, this.properties);
        this._invoke(this._get_path(), "SetPropertiesForCurrentUser", false, {
            values: A
        },
        Function.createDelegate(this, this._onSaveComplete), Function.createDelegate(this, this._onSaveFailed), [B, E, C])
    },
    _clonePropertyNames: function(C) {
        var E = [],
        D = {};
        for (var A = 0; A < C.length; A++) {
            var B = C[A];
            if (!D[B]) {
                Array.add(E, B);
                D[B] = true
            }
        }
        return E
    },
    _flattenProperties: function(J, C, B) {
        var I = {},
        F, G;
        if (J && J.length === 0) {
            return I
        }
        for (var H in C) {
            F = C[H];
            G = B ? B + "." + H: H;
            if (Sys.Services.ProfileGroup.isInstanceOfType(F)) {
                var D = this._flattenProperties(J, F, G);
                for (var E in D) {
                    var A = D[E];
                    I[E] = A
                }
            } else {
                if (!J || Array.indexOf(J, G) !== -1) {
                    I[G] = F
                }
            }
        }
        return I
    },
    _get_path: function() {
        var A = this.get_path();
        if (!A.length) {
            A = Sys.Services._ProfileService.DefaultWebServicePath
        }
        if (!A || !A.length) {
            throw Error.invalidOperation(Sys.Res.servicePathNotSet)
        }
        return A
    },
    _onLoadComplete: function(B, D, C) {
        if (typeof B !== "object") {
            throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, C, "Object"))
        }
        var F = this._unflattenProperties(B);
        for (var A in F) {
            this.properties[A] = F[A]
        }
        var G = D[0],
        E = G ? G: this._defaultLoadCompletedCallback;
        if (E) {
            E(B.length, D[2], "Sys.Services.ProfileService.load")
        }
    },
    _onLoadFailed: function(C, D) {
        var B = D[1],
        A = B ? B: this._defaultFailedCallback;
        if (A) {
            A(C, D[2], "Sys.Services.ProfileService.load")
        }
    },
    _onSaveComplete: function(E, F, C) {
        if (typeof E !== "number") {
            throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, C, "Number"))
        }
        var B = F[0],
        D = F[2],
        A = B ? B: this._defaultSaveCompletedCallback;
        if (A) {
            A(E, D, "Sys.Services.ProfileService.save")
        }
    },
    _onSaveFailed: function(C, E) {
        var B = E[1],
        D = E[2],
        A = B ? B: this._defaultFailedCallback;
        if (A) {
            A(C, D, "Sys.Services.ProfileService.save")
        }
    },
    _unflattenProperties: function(F) {
        var H = {},
        G, E, C = 0;
        for (var B in F) {
            C++;
            E = F[B];
            G = B.indexOf(".");
            if (G !== -1) {
                var D = B.substr(0, G);
                B = B.substr(G + 1);
                var A = H[D];
                if (!A || !Sys.Services.ProfileGroup.isInstanceOfType(A)) {
                    A = new Sys.Services.ProfileGroup;
                    H[D] = A
                }
                A[B] = E
            } else {
                H[B] = E
            }
        }
        F.length = C;
        return H
    }
};
Sys.Services._ProfileService.registerClass("Sys.Services._ProfileService", Sys.Net.WebServiceProxy);
Sys.Services.ProfileService = new Sys.Services._ProfileService;
Sys.Services.ProfileGroup = function(B) {
    if (B) {
        for (var A in B) {
            this[A] = B[A]
        }
    }
};
Sys.Services.ProfileGroup.registerClass("Sys.Services.ProfileGroup");
Sys.Services._AuthenticationService = function() {
    Sys.Services._AuthenticationService.initializeBase(this)
};
Sys.Services._AuthenticationService.DefaultWebServicePath = "";
Sys.Services._AuthenticationService.prototype = {
    _defaultFailedCallback: null,
    _defaultLoginCompletedCallback: null,
    _defaultLogoutCompletedCallback: null,
    _path: "",
    _timeout: 0,
    _authenticated: false,
    get_defaultFailedCallback: function() {
        return this._defaultFailedCallback
    },
    set_defaultFailedCallback: function(A) {
        this._defaultFailedCallback = A
    },
    get_defaultLoginCompletedCallback: function() {
        return this._defaultLoginCompletedCallback
    },
    set_defaultLoginCompletedCallback: function(A) {
        this._defaultLoginCompletedCallback = A
    },
    get_defaultLogoutCompletedCallback: function() {
        return this._defaultLogoutCompletedCallback
    },
    set_defaultLogoutCompletedCallback: function(A) {
        this._defaultLogoutCompletedCallback = A
    },
    get_isLoggedIn: function() {
        return this._authenticated
    },
    get_path: function() {
        return this._path
    },
    set_path: function(A) {
        if (!A || !A.length) {
            A = ""
        }
        this._path = A
    },
    get_timeout: function() {
        return this._timeout
    },
    set_timeout: function(A) {
        this._timeout = A
    },
    login: function(H, A, B, C, E, G, F, D) {
        this._invoke(this._get_path(), "Login", false, {
            userName: H,
            password: A,
            createPersistentCookie: B
        },
        Function.createDelegate(this, this._onLoginComplete), Function.createDelegate(this, this._onLoginFailed), [H, A, B, E, G, F, D])
    },
    logout: function(D, B, A, C) {
        this._invoke(this._get_path(), "Logout", false, {},
        Function.createDelegate(this, this._onLogoutComplete), Function.createDelegate(this, this._onLogoutFailed), [D, B, A, C])
    },
    _get_path: function() {
        var A = this.get_path();
        if (!A.length) {
            A = Sys.Services._AuthenticationService.DefaultWebServicePath
        }
        if (!A || !A.length) {
            throw Error.invalidOperation(Sys.Res.servicePathNotSet)
        }
        return A
    },
    _onLoginComplete: function(D, G, C) {
        if (typeof D !== "boolean") {
            throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, C, "Boolean"))
        }
        var A = G[3],
        F = G[4],
        E = G[6],
        B = F ? F: this._defaultLoginCompletedCallback;
        if (D) {
            this._authenticated = true;
            if (B) {
                B(true, E, "Sys.Services.AuthenticationService.login")
            }
            if (typeof A !== "undefined" && A !== null) {
                window.location.href = A
            }
        } else {
            if (B) {
                B(false, E, "Sys.Services.AuthenticationService.login")
            }
        }
    },
    _onLoginFailed: function(C, D) {
        var B = D[5],
        A = B ? B: this._defaultFailedCallback;
        if (A) {
            A(C, D[6], "Sys.Services.AuthenticationService.login")
        }
    },
    _onLogoutComplete: function(C, B, D) {
        if (C !== null) {
            throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType, D, "null"))
        }
        var G = B[0],
        A = B[1],
        E = B[3],
        F = A ? A: this._defaultLogoutCompletedCallback;
        this._authenticated = false;
        if (F) {
            F(null, E, "Sys.Services.AuthenticationService.logout")
        }
        if (!G) {
            window.location.reload()
        } else {
            window.location.href = G
        }
    },
    _onLogoutFailed: function(C, D) {
        var B = D[2],
        A = B ? B: this._defaultFailedCallback;
        if (A) {
            A(C, D[3], "Sys.Services.AuthenticationService.logout")
        }
    },
    _setAuthenticated: function(A) {
        this._authenticated = A
    }
};
Sys.Services._AuthenticationService.registerClass("Sys.Services._AuthenticationService", Sys.Net.WebServiceProxy);
Sys.Services.AuthenticationService = new Sys.Services._AuthenticationService;
Type.registerNamespace("Sys.Serialization");
Sys.Serialization.JavaScriptSerializer = function() {};
Sys.Serialization.JavaScriptSerializer.registerClass("Sys.Serialization.JavaScriptSerializer");
Sys.Serialization.JavaScriptSerializer._stringRegEx = new RegExp('["\b\f\n\r\t\\\\\x00-\x1F]', "i");
Sys.Serialization.JavaScriptSerializer._serializeWithBuilder = function(J, K, D) {
    var I;
    switch (typeof J) {
    case "object":
        if (J) {
            if (Array.isInstanceOfType(J)) {
                K.append("[");
                for (I = 0; I < J.length; ++I) {
                    if (I > 0) {
                        K.append(",")
                    }
                    Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(J[I], K)
                }
                K.append("]")
            } else {
                if (Date.isInstanceOfType(J)) {
                    K.append('"\\/Date(');
                    K.append(J.getTime());
                    K.append(')\\/"');
                    break
                }
                var G = [],
                C = 0;
                for (var E in J) {
                    if (E.startsWith("$")) {
                        continue
                    }
                    G[C++] = E
                }
                if (D) {
                    G.sort()
                }
                K.append("{");
                var B = false;
                for (I = 0; I < C; I++) {
                    var F = J[G[I]];
                    if (typeof F !== "undefined" && typeof F !== "function") {
                        if (B) {
                            K.append(",")
                        } else {
                            B = true
                        }
                        Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(G[I], K, D);
                        K.append(":");
                        Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(F, K, D)
                    }
                }
                K.append("}")
            }
        } else {
            K.append("null")
        }
        break;
    case "number":
        if (isFinite(J)) {
            K.append(String(J))
        } else {
            throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)
        }
        break;
    case "string":
        K.append('"');
        if (Sys.Browser.agent === Sys.Browser.Safari || Sys.Serialization.JavaScriptSerializer._stringRegEx.test(J)) {
            var A = J.length;
            for (I = 0; I < A; ++I) {
                var H = J.charAt(I);
                if (H >= " ") {
                    if (H === "\\" || H === '"') {
                        K.append("\\")
                    }
                    K.append(H)
                } else {
                    switch (H) {
                    case "\b":
                        K.append("\\b");
                        break;
                    case "\f":
                        K.append("\\f");
                        break;
                    case "\n":
                        K.append("\\n");
                        break;
                    case "\r":
                        K.append("\\r");
                        break;
                    case "\t":
                        K.append("\\t");
                        break;
                    default:
                        K.append("\\u00");
                        if (H.charCodeAt() < 16) {
                            K.append("0")
                        }
                        K.append(H.charCodeAt().
                        toString (16))
                    }
                }
            }
        } else {
            K.append(J)
        }
        K.append('"');
        break;
    case "boolean":
        K.append(J.
        toString ());
        break;
    default:
        K.append("null");
        break
    }
};
Sys.Serialization.JavaScriptSerializer.serialize = function(A) {
    var B = new Sys.StringBuilder;
    Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(A, B, false);
    return B.
    toString ()
};
Sys.Serialization.JavaScriptSerializer.deserialize = function(data) {
    if (data.length === 0) {
        throw Error.argument("data", Sys.Res.cannotDeserializeEmptyString)
    }
    try {
        var exp = data.replace(new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)\\)\\\\/\\"', "g"), "$1new Date($2)");
        return eval("(" + exp + ")")
    } catch(a) {
        throw Error.argument("data", Sys.Res.cannotDeserializeInvalidJson)
    }
};
Sys.CultureInfo = function(C, A, B) {
    this.name = C;
    this.numberFormat = A;
    this.dateTimeFormat = B
};
Sys.CultureInfo.prototype = {
    _getDateTimeFormats: function() {
        if (!this._dateTimeFormats) {
            var A = this.dateTimeFormat;
            this._dateTimeFormats = [A.MonthDayPattern, A.YearMonthPattern, A.ShortDatePattern, A.ShortTimePattern, A.LongDatePattern, A.LongTimePattern, A.FullDateTimePattern, A.RFC1123Pattern, A.SortableDateTimePattern, A.UniversalSortableDateTimePattern]
        }
        return this._dateTimeFormats
    },
    _getMonthIndex: function(A) {
        if (!this._upperMonths) {
            this._upperMonths = this._toUpperArray(this.dateTimeFormat.MonthNames)
        }
        return Array.indexOf(this._upperMonths, this._toUpper(A))
    },
    _getAbbrMonthIndex: function(A) {
        if (!this._upperAbbrMonths) {
            this._upperAbbrMonths = this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames)
        }
        return Array.indexOf(this._upperMonths, this._toUpper(A))
    },
    _getDayIndex: function(A) {
        if (!this._upperDays) {
            this._upperDays = this._toUpperArray(this.dateTimeFormat.DayNames)
        }
        return Array.indexOf(this._upperDays, this._toUpper(A))
    },
    _getAbbrDayIndex: function(A) {
        if (!this._upperAbbrDays) {
            this._upperAbbrDays = this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames)
        }
        return Array.indexOf(this._upperAbbrDays, this._toUpper(A))
    },
    _toUpperArray: function(D) {
        var A = [];
        for (var B = 0,
        C = D.length; B < C; B++) {
            A[B] = this._toUpper(D[B])
        }
        return A
    },
    _toUpper: function(A) {
        return A.split("\u00A0").join(" ").toUpperCase()
    }
};
Sys.CultureInfo._parse = function(A) {
    var B = Sys.Serialization.JavaScriptSerializer.deserialize(A);
    return new Sys.CultureInfo(B.name, B.numberFormat, B.dateTimeFormat)
};
Sys.CultureInfo.registerClass("Sys.CultureInfo");
Sys.CultureInfo.InvariantCulture = Sys.CultureInfo._parse('{"name":"","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":true,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"\u00A4","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":0,"PercentNegativePattern":0,"NegativeInfinitySymbol":"-Infinity","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"Infinity","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"\u2030","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"@-62135568000000@","MaxSupportedDateTime":"@253402300799999@","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, dd MMMM yyyy HH:mm:ss","LongDatePattern":"dddd, dd MMMM yyyy","LongTimePattern":"HH:mm:ss","MonthDayPattern":"MMMM dd","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\':\'mm\':\'ss \'GMT\'","ShortDatePattern":"MM/dd/yyyy","ShortTimePattern":"HH:mm","SortableDateTimePattern":"yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'","YearMonthPattern":"yyyy MMMM","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":true,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]}}');
if (typeof __cultureInfo === "undefined") {
    var __cultureInfo = '{"name":"en-US","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":false,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"$","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":0,"PercentNegativePattern":0,"NegativeInfinitySymbol":"-Infinity","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"Infinity","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"\u2030","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"@-62135568000000@","MaxSupportedDateTime":"@253402300799999@","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":false},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, MMMM dd, yyyy h:mm:ss tt","LongDatePattern":"dddd, MMMM dd, yyyy","LongTimePattern":"h:mm:ss tt","MonthDayPattern":"MMMM dd","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\':\'mm\':\'ss \'GMT\'","ShortDatePattern":"M/d/yyyy","ShortTimePattern":"h:mm tt","SortableDateTimePattern":"yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'","YearMonthPattern":"MMMM, yyyy","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":false,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]}}'
}
Sys.CultureInfo.CurrentCulture = Sys.CultureInfo._parse(__cultureInfo);
delete __cultureInfo;
Sys.UI.Point = function(B, A) {
    this.x = B;
    this.y = A
};
Sys.UI.Point.registerClass("Sys.UI.Point");
Sys.UI.Bounds = function(D, C, A, B) {
    this.x = D;
    this.y = C;
    this.height = B;
    this.width = A
};
Sys.UI.Bounds.registerClass("Sys.UI.Bounds");
Sys.UI.DomElement = function() {};
Sys.UI.DomElement.registerClass("Sys.UI.DomElement");
Sys.UI.DomElement.addCssClass = function(B, A) {
    if (!Sys.UI.DomElement.containsCssClass(B, A)) {
        if (B.className === "") {
            B.className = A
        } else {
            B.className += " " + A
        }
    }
};
Sys.UI.DomElement.containsCssClass = function(A, B) {
    return Array.contains(A.className.split(" "), B)
};
Sys.UI.DomElement.getBounds = function(B) {
    var A = Sys.UI.DomElement.getLocation(B);
    return new Sys.UI.Bounds(A.x, A.y, B.offsetWidth || 0, B.offsetHeight || 0)
};
var $get = Sys.UI.DomElement.getElementById = function(C, D) {
    if (!D) {
        return document.getElementById(C)
    }
    if (D.getElementById) {
        return D.getElementById(C)
    }
    var F = [],
    E = D.childNodes;
    for (var A = 0; A < E.length; A++) {
        var B = E[A];
        if (B.nodeType == 1) {
            F[F.length] = B
        }
    }
    while (F.length) {
        B = F.shift();
        if (B.id == C) {
            return B
        }
        E = B.childNodes;
        for (A = 0; A < E.length; A++) {
            B = E[A];
            if (B.nodeType == 1) {
                F[F.length] = B
            }
        }
    }
    return null
};
switch (Sys.Browser.agent) {
case Sys.Browser.InternetExplorer:
    Sys.UI.DomElement.getLocation = function Sys$UI$DomElement$getLocation(B) {
        if (B.self || B.nodeType === 9) {
            return new Sys.UI.Point(0, 0)
        }
        var G = B.getClientRects();
        if (!G || !G.length) {
            return new Sys.UI.Point(0, 0)
        }
        var F = B.ownerDocument.parentWindow,
        D = F.screenLeft - top.screenLeft - top.document.documentElement.scrollLeft + 2,
        C = F.screenTop - top.screenTop - top.document.documentElement.scrollTop + 2,
        H = F.frameElement || null;
        if (H) {
            var A = H.currentStyle;
            D += (H.frameBorder || 1) * 2 + (parseInt(A.paddingLeft) || 0) + (parseInt(A.borderLeftWidth) || 0) - B.ownerDocument.documentElement.scrollLeft;
            C += (H.frameBorder || 1) * 2 + (parseInt(A.paddingTop) || 0) + (parseInt(A.borderTopWidth) || 0) - B.ownerDocument.documentElement.scrollTop
        }
        var E = G[0];
        return new Sys.UI.Point(E.left - D, E.top - C)
    };
    break;
case Sys.Browser.Safari:
    Sys.UI.DomElement.getLocation = function(I) {
        if (I.window && I.window === I || I.nodeType === 9) {
            return new Sys.UI.Point(0, 0)
        }
        var E = 0,
        D = 0,
        B = null,
        F = null,
        J;
        for (var K = I; K; B = K, (F = J, K = K.offsetParent)) {
            J = Sys.UI.DomElement._getCurrentStyle(K);
            var G = K.tagName;
            if ((K.offsetLeft || K.offsetTop) && (G !== "BODY" || (!F || F.position !== "absolute"))) {
                E += K.offsetLeft;
                D += K.offsetTop
            }
        }
        J = Sys.UI.DomElement._getCurrentStyle(I);
        var H = J ? J.position: null,
        A = H && H !== "static";
        if (!H || H !== "absolute") {
            for (var K = I.parentNode; K; K = K.parentNode) {
                G = K.tagName;
                if (G !== "BODY" && G !== "HTML" && (K.scrollLeft || K.scrollTop)) {
                    E -= K.scrollLeft || 0;
                    D -= K.scrollTop || 0
                }
                J = Sys.UI.DomElement._getCurrentStyle(K);
                var C = J ? J.position: null;
                if (C && C === "absolute") {
                    break
                }
            }
        }
        return new Sys.UI.Point(E, D)
    };
    break;
case Sys.Browser.Opera:
    Sys.UI.DomElement.getLocation = function(H) {
        if (H.window && H.window === H || H.nodeType === 9) {
            return new Sys.UI.Point(0, 0)
        }
        var F = 0,
        E = 0,
        A = null;
        for (var I = H; I; A = I, I = I.offsetParent) {
            var D = I.tagName;
            F += I.offsetLeft || 0;
            E += I.offsetTop || 0
        }
        var C = H.style.position,
        G = C && C !== "static";
        for (var I = H.parentNode; I; I = I.parentNode) {
            D = I.tagName;
            if (D !== "BODY" && D !== "HTML" && (I.scrollLeft || I.scrollTop) && (G && (I.style.overflow === "scroll" || I.style.overflow === "auto"))) {
                F -= I.scrollLeft || 0;
                E -= I.scrollTop || 0
            }
            var B = I && I.style ? I.style.position: null;
            G = G || B && B !== "static"
        }
        return new Sys.UI.Point(F, E)
    };
    break;
default:
    Sys.UI.DomElement.getLocation = function(G) {
        if (G.window && G.window === G || G.nodeType === 9) {
            return new Sys.UI.Point(0, 0)
        }
        var F = 0,
        E = 0,
        B = null,
        C = null,
        I = null;
        for (var J = G; J; B = J, (C = I, J = J.offsetParent)) {
            var H = J.tagName;
            I = Sys.UI.DomElement._getCurrentStyle(J);
            if ((J.offsetLeft || J.offsetTop) && !(H === "BODY" && (!C || C.position !== "absolute"))) {
                F += J.offsetLeft;
                E += J.offsetTop
            }
            if (B !== null && I) {
                if (H !== "TABLE" && H !== "TD" && H !== "HTML") {
                    F += parseInt(I.borderLeftWidth) || 0;
                    E += parseInt(I.borderTopWidth) || 0
                }
                if (H === "TABLE" && (I.position === "relative" || I.position === "absolute")) {
                    F += parseInt(I.marginLeft) || 0;
                    E += parseInt(I.marginTop) || 0
                }
            }
        }
        I = Sys.UI.DomElement._getCurrentStyle(G);
        var D = I ? I.position: null,
        A = D && D !== "static";
        if (!D || D !== "absolute") {
            for (var J = G.parentNode; J; J = J.parentNode) {
                H = J.tagName;
                if (H !== "BODY" && H !== "HTML" && (J.scrollLeft || J.scrollTop)) {
                    F -= J.scrollLeft || 0;
                    E -= J.scrollTop || 0;
                    I = Sys.UI.DomElement._getCurrentStyle(J);
                    F += parseInt(I.borderLeftWidth) || 0;
                    E += parseInt(I.borderTopWidth) || 0
                }
            }
        }
        return new Sys.UI.Point(F, E)
    };
    break
}
Sys.UI.DomElement.removeCssClass = function(C, D) {
    var B = " " + C.className + " ",
    A = B.indexOf(" " + D + " ");
    if (A >= 0) {
        C.className = (B.substr(0, A) + " " + B.substring(A + D.length + 1, B.length)).trim()
    }
};
Sys.UI.DomElement.setLocation = function(A, D, C) {
    var B = A.style;
    B.position = "absolute";
    B.left = D + "px";
    B.top = C + "px"
};
Sys.UI.DomElement.toggleCssClass = function(A, B) {
    if (Sys.UI.DomElement.containsCssClass(A, B)) {
        Sys.UI.DomElement.removeCssClass(A, B)
    } else {
        Sys.UI.DomElement.addCssClass(A, B)
    }
};
Sys.UI.DomElement._getCurrentStyle = function(B) {
    var A = (B.ownerDocument ? B.ownerDocument: B.documentElement).defaultView;
    return A && B !== A && A.getComputedStyle ? A.getComputedStyle(B, null) : B.style
};
Sys.UI.Behavior = function(A) {
    Sys.UI.Behavior.initializeBase(this);
    this._element = A;
    var B = A._behaviors;
    if (!B) {
        A._behaviors = [this]
    } else {
        B[B.length] = this
    }
};
Sys.UI.Behavior.prototype = {
    _name: null,
    get_element: function() {
        return this._element
    },
    get_id: function() {
        var A = Sys.UI.Behavior.callBaseMethod(this, "get_id");
        if (A) {
            return A
        }
        if (!this._element || !this._element.id) {
            return ""
        }
        return this._element.id + "$" + this.get_name()
    },
    get_name: function() {
        if (this._name) {
            return this._name
        }
        var B = Object.getTypeName(this),
        A = B.lastIndexOf(".");
        if (A != -1) {
            B = B.substr(A + 1)
        }
        if (!this.get_isInitialized()) {
            this._name = B
        }
        return B
    },
    set_name: function(A) {
        this._name = A
    },
    initialize: function() {
        Sys.UI.Behavior.callBaseMethod(this, "initialize");
        var A = this.get_name();
        if (A) {
            this._element[A] = this
        }
    },
    dispose: function() {
        Sys.UI.Behavior.callBaseMethod(this, "dispose");
        if (this._element) {
            var A = this.get_name();
            if (A) {
                this._element[A] = null
            }
            Array.remove(this._element._behaviors, this);
            delete this._element
        }
    }
};
Sys.UI.Behavior.registerClass("Sys.UI.Behavior", Sys.Component);
Sys.UI.Behavior.getBehaviorByName = function(A, C) {
    var B = A[C];
    return B && Sys.UI.Behavior.isInstanceOfType(B) ? B: null
};
Sys.UI.Behavior.getBehaviors = function(A) {
    if (!A._behaviors) {
        return []
    }
    return Array.clone(A._behaviors)
};
Sys.UI.Behavior.getBehaviorsByType = function(E, D) {
    var B = E._behaviors,
    F = [];
    if (B) {
        for (var A = 0,
        C = B.length; A < C; A++) {
            if (D.isInstanceOfType(B[A])) {
                F[F.length] = B[A]
            }
        }
    }
    return F
};
Sys.UI.VisibilityMode = function() {
    throw Error.notImplemented()
};
Sys.UI.VisibilityMode.prototype = {
    hide: 0,
    collapse: 1
};
Sys.UI.VisibilityMode.registerEnum("Sys.UI.VisibilityMode");
Sys.UI.Control = function(A) {
    Sys.UI.Control.initializeBase(this);
    this._element = A;
    A.control = this;
    this._oldDisplayMode = this._element.style.display;
    if (!this._oldDisplayMode || this._oldDisplayMode == "none") {
        this._oldDisplayMode = ""
    }
};
Sys.UI.Control.prototype = {
    _parent: null,
    _visibilityMode: Sys.UI.VisibilityMode.hide,
    get_element: function() {
        return this._element
    },
    get_id: function() {
        if (!this._element) {
            return ""
        }
        return this._element.id
    },
    set_id: function() {
        throw Error.invalidOperation(Sys.Res.cantSetId)
    },
    get_parent: function() {
        if (this._parent) {
            return this._parent
        } else {
            var A = this._element.parentNode;
            while (A) {
                if (A.control) {
                    return A.control
                }
                A = A.parentNode
            }
            return null
        }
    },
    set_parent: function(A) {
        this._parent = A
    },
    get_visibilityMode: function() {
        return this._visibilityMode
    },
    set_visibilityMode: function(A) {
        if (this._visibilityMode !== A) {
            this._visibilityMode = A;
            if (this.get_visible() === false) {
                if (this._visibilityMode === Sys.UI.VisibilityMode.hide) {
                    this._element.style.display = this._oldDisplayMode
                } else {
                    this._element.style.display = "none"
                }
            }
        }
        this._visibilityMode = A
    },
    get_visible: function() {
        return this._element.style.visibility != "hidden"
    },
    set_visible: function(A) {
        if (A != this.get_visible()) {
            this._element.style.visibility = A ? "visible": "hidden";
            if (A || this._visibilityMode === Sys.UI.VisibilityMode.hide) {
                this._element.style.display = this._oldDisplayMode
            } else {
                this._element.style.display = "none"
            }
        }
    },
    addCssClass: function(A) {
        Sys.UI.DomElement.addCssClass(this._element, A)
    },
    dispose: function() {
        Sys.UI.Control.callBaseMethod(this, "dispose");
        if (this._element) {
            this._element.control = undefined;
            delete this._element
        }
    },
    initialize: function() {
        Sys.UI.Control.callBaseMethod(this, "initialize");
        var A = this._element
    },
    onBubbleEvent: function() {
        return false
    },
    raiseBubbleEvent: function(A, C) {
        var B = this.get_parent();
        while (B) {
            if (B.onBubbleEvent(A, C)) {
                return
            }
            B = B.get_parent()
        }
    },
    removeCssClass: function(A) {
        Sys.UI.DomElement.removeCssClass(this._element, A)
    },
    toggleCssClass: function(A) {
        Sys.UI.DomElement.toggleCssClass(this._element, A)
    }
};
Sys.UI.Control.registerClass("Sys.UI.Control", Sys.Component);
Sys.Res = {
    argumentInteger: "Value must be an integer.",
    scriptLoadMultipleCallbacks: "The script '{0}' contains multiple calls to Sys.Application.notifyScriptLoaded(). Only one is allowed.",
    invokeCalledTwice: "Cannot call invoke more than once.",
    webServiceFailed: "The server method '{0}' failed with the following error: {1}",
    argumentType: "Object cannot be converted to the required type.",
    argumentNull: "Value cannot be null.",
    controlCantSetId: "The id property can't be set on a control.",
    formatBadFormatSpecifier: "Format specifier was invalid.",
    webServiceFailedNoMsg: "The server method '{0}' failed.",
    argumentDomElement: "Value must be a DOM element.",
    invalidExecutorType: "Could not create a valid Sys.Net.WebRequestExecutor from: {0}.",
    cannotCallBeforeResponse: "Cannot call {0} when responseAvailable is false.",
    actualValue: "Actual value was {0}.",
    enumInvalidValue: "'{0}' is not a valid value for enum {1}.",
    scriptLoadFailed: "The script '{0}' could not be loaded.",
    parameterCount: "Parameter count mismatch.",
    cannotDeserializeEmptyString: "Cannot deserialize empty string.",
    formatInvalidString: "Input string was not in a correct format.",
    invalidTimeout: "Value must be greater than or equal to zero.",
    cannotAbortBeforeStart: "Cannot abort when executor has not started.",
    argument: "Value does not fall within the expected range.",
    cannotDeserializeInvalidJson: "Cannot deserialize. The data does not correspond to valid JSON.",
    invalidHttpVerb: "httpVerb cannot be set to an empty or null string.",
    nullWebRequest: "Cannot call executeRequest with a null webRequest.",
    eventHandlerInvalid: "Handler was not added through the Sys.UI.DomEvent.addHandler method.",
    cannotSerializeNonFiniteNumbers: "Cannot serialize non finite numbers.",
    argumentUndefined: "Value cannot be undefined.",
    webServiceInvalidReturnType: "The server method '{0}' returned an invalid type. Expected type: {1}",
    servicePathNotSet: "The path to the web service has not been set.",
    argumentTypeWithTypes: "Object of type '{0}' cannot be converted to type '{1}'.",
    cannotCallOnceStarted: "Cannot call {0} once started.",
    badBaseUrl1: "Base URL does not contain ://.",
    badBaseUrl2: "Base URL does not contain another /.",
    badBaseUrl3: "Cannot find last / in base URL.",
    setExecutorAfterActive: "Cannot set executor after it has become active.",
    paramName: "Parameter name: {0}",
    cannotCallOutsideHandler: "Cannot call {0} outside of a completed event handler.",
    format: "One of the identified items was in an invalid format.",
    assertFailedCaller: "Assertion Failed: {0}\r\nat {1}",
    argumentOutOfRange: "Specified argument was out of the range of valid values.",
    webServiceTimedOut: "The server method '{0}' timed out.",
    notImplemented: "The method or operation is not implemented.",
    assertFailed: "Assertion Failed: {0}",
    invalidOperation: "Operation is not valid due to the current state of the object.",
    breakIntoDebugger: "{0}\r\n\r\nBreak into debugger?"
};
if (typeof(Sys) !== "undefined") {
    Sys.Application.notifyScriptLoaded()
}
//
// AjaxFrameworkExtensions.js Usage
//
// Additional features added to the Ajax Framework
//

// returns the bounds of the current viewport
Sys.UI.getViewportBounds = function() {
	return { width: self.innerWidth || (document.documentElement.clientWidth || document.body.clientWidth)
			  , height: self.innerHeight || (document.documentElement.clientHeight || document.body.clientHeight)
			  , x: window.pageXOffset || (document.documentElement.scrollLeft || document.body.scrollLeft)
			  , y: window.pageYOffset || (document.documentElement.scrollTop || document.body.scrollTop)
	};
};

// returns the percent of visibility the given element has in the current viewport, between 0 and 1
Sys.UI.DomElement.getPercentVisible = function(el) {
	var bounds = Sys.UI.DomElement.getBounds(el);
	var viewPort = Sys.UI.getViewportBounds();

	if (bounds.height === 0 || bounds.width === 0) {
		return 0;
	}

	var topPixel = viewPort.y - bounds.y;
	topPixel = (topPixel < 0) ? 0 : (topPixel > bounds.height ? bounds.height : topPixel);

	var bottomPixel = viewPort.y + viewPort.height - bounds.y;
	bottomPixel = (bottomPixel > bounds.height) ? bounds.height : bottomPixel;

	var leftPixel = viewPort.x - bounds.x;
	leftPixel = (leftPixel < 0) ? 0 : (leftPixel > bounds.width ? bounds.width : leftPixel);

	var rightPixel = viewPort.x + viewPort.width - bounds.x;
	rightPixel = (rightPixel > bounds.width) ? bounds.width : rightPixel;

	return ((bottomPixel - topPixel) / bounds.height) * ((rightPixel - leftPixel) / bounds.width);
};
MySpace._Application = function() { MySpace._Application.initializeBase(this); }
MySpace._Application.prototype = { 
    Culture : {IPCulture:0, PreferredCulture:1},
	_list : {},
	_intMaintenanceConfigs : null,
	_maintenanceConfigs : null,
	isDOMLoaded : false,		
	add_DOMloaded : function(handler) {
		Array.add(this._getEvent("domloaded"), handler);
	},
	intlFeatureDisabled : function(key, culture, cultureType) {
	    if (!MySpace.ClientIntMaintenanceConfigs) MySpace.ClientIntMaintenanceConfigs = {};
	    	        
	    if (MySpace.ClientIntMaintenanceConfigs[key.toLowerCase()]) {
            var feature = MySpace.ClientIntMaintenanceConfigs[key.toLowerCase()];
            
            return this._checkFeatureDisabled(feature, culture, cultureType);
	    }
	    else
	        return false;
	},
	intlSubFeatureDisabled : function(featureKey, subFeatureKey, culture, cultureType) {
	    if (!MySpace.ClientIntMaintenanceConfigs) MySpace.ClientIntMaintenanceConfigs = {};
	    	        
	     if (MySpace.ClientIntMaintenanceConfigs[featureKey.toLowerCase()]) {
	        var feature = MySpace.ClientIntMaintenanceConfigs[featureKey.toLowerCase()];
	        
	        if (!this._checkFeatureDisabled(feature, culture, cultureType)) {
	            if (feature.subfeatures[subFeatureKey.toLowerCase()]) {
	                return this._checkFeatureDisabled(feature.subfeatures[subFeatureKey.toLowerCase()], culture, cultureType);
	            }
	            else
	                return false;
            }
            else
                return true;
	     }
	     else 
	        return false;
	},
	keyDisabled : function(key) {
        if (!MySpace.ClientMaintenanceConfigs) MySpace.ClientMaintenanceConfigs = {};
      
		if (MySpace.ClientMaintenanceConfigs[key.toLowerCase()] < 1)
			return true;
		else
			return false;	
	},
	remove_DOMloaded : function(handler) {
		var evt = this._getEvent("domloaded");
		if (!evt) return;
		Array.remove(evt, handler);
	},
	_checkFeatureDisabled : function(feature, culture, cultureType) {
	    if (feature.enabled) {
	        if (cultureType == MySpace.Application.Culture.PreferredCulture) {
                if (feature.excPrefCltr.length == 0 && feature.allPrefCltr.length == 0)
                    return false;
                
                if (Array.contains(feature.excPrefCltr, culture))
                    return true;
                   
                if (feature.allPrefCltr.length == 0 || Array.contains(feature.allPrefCltr, culture))
                    return false;
                else
                    return true;
            } else if (cultureType == MySpace.Application.Culture.IPCulture) {
                if (feature.excIPCltr.length == 0 && feature.allIPCltr.length == 0)
                    return false;
                    
                if (Array.contains(feature.excIPCltr, culture))
                    return true;
                    
                if (feature.allIPCltr.length == 0 || Array.contains(feature.allIPCltr, culture))
                    return false;
                else
                    return true;
            }
        }
        else 
            return true;
        
        return !feature.enabled;
	},
	_getEvent : function(id, create) {
		if (!this._list[id])
			this._list[id] = [];
		return this._list[id];
	},
	_raiseDOMloaded : function() {
	    this.isDOMLoaded=true;
	    
		var evt = this._getEvent("domloaded");
		if (!evt || (evt.length === 0)) return null;
		evt = Array.clone(evt);
		if (!evt._handler) {
			evt._handler = function(source, args) {
				for (var i = 0, l = evt.length; i < l; i++) {
					try {
						evt[i](source, args);
					}
					catch(ex) {
						if (MySpace.ShowJsError) {
							alert("Error in DOMLoaded handler:\n\n" + ex.message + "\n\n(This error message will only appear for office IP's)");
							if (window.console && console.error) {
								console.error("DOMloaded handler error", ex);
								if (ex.stack && console.log) console.log(ex.stack);
							}
						}
					}
				}
			};
		}
		var h = evt._handler;
		if (h)
			h(this, null);
		var handler = this.get_events().getHandler('DOMloaded');
		if(handler) {
			var eventArgs = new Sys.EventArgs();
			handler(this, eventArgs);
		}
	}
}
MySpace._Application.registerClass('MySpace._Application', Sys.Component);
MySpace.Application = new MySpace._Application();
Type.registerNamespace("MySpace");
Type.registerNamespace("MySpace.UI");
Type.registerNamespace("MySpace.Utils");

MySpace.Util=function(){throw "Cannot instantiate static class.";};

/**
* Logs a user in if they are not already.  Redirects to a global http handler that stores their current page.
*/
MySpace.enforceLogin=function(){
    if(MySpace.ClientContext && MySpace.ClientContext.IsLoggedIn){ return; }
    location.href="/Modules/Common/Services/LoginRedirector.ashx";
};

_queryString=function(){
	var __pairs = window.location.search.substring(1).split("&");
	for(var i=0;i<__pairs.length;i++){
		var pos=__pairs[i].indexOf('=');
		if(pos>=0){
			var name=__pairs[i].substring(0,pos).toLowerCase();
			try{
				this[name]=decodeURIComponent(__pairs[i].substring(pos+1));
			}catch(e){}
		}
	}
}
var queryString=new _queryString();
var fuseaction = queryString['fuseaction'];
function QueryString(key){return queryString[key.toLowerCase()];}//only here for backward compatibility, use construct above

function generalizeDomain(){
	var domain = document.domain;
	if(domain[domain.length-1]===".")return;
	var domains = domain.split(".");
	var domainsLength = domains.length;
	if (domainsLength >= 2){document.domain = domains[domainsLength - 2] + "." + domains[domainsLength - 1];}
}
var supressFuseactions = {"forums.post":4,"mail.compose":5,"mail.message":6, "mail.reply":7, "mail.forward":8};
if(typeof supressGeneralizeDomain==="undefined" && typeof supressFuseactions[fuseaction]==="undefined") generalizeDomain();

// Stop using TextFilterWBR! 
// use MySpace.Util.InjectWBR, MySpace.Util.ApplyWBRtoElements and MySpace.Util.ApplyWBRtoElement
function TextFilterWBR(){
    var regex = new RegExp(/[^\s]{3}/mgi);
    var hs = this.match(/(<.*?>|&[#0-9a-zA-Z]{1,5};)/mgi);
    var o=[];
    var offset = 0;
    if(hs){
        for(var i = 0 ; i < hs.length; i++){
            o.push(this.substring(offset, offset = (this.indexOf(hs[i],offset))).replace(regex, "$&<wbr/>"));
            o.push(this.substring(offset, offset += hs[i].length));
        }
    }
    if(offset<this.length) 
        o.push(this.substring(offset,this.length).replace(regex, "$&<wbr/>"));
    
    return o.join("");
}
String.prototype.call = function(f,c){
    return f.call(this,c);
}

Function.createPartial=function(scope, method /*, ...*/){
	var pre=[];
	for(var i=2;i<arguments.length;i++){ pre.push(arguments[i]); }
	var named=typeof method=="string";
	return function(){
		var f=named ? (scope || window)[method] : method;
		var args=pre.concat([]);
		for(var i=0;i<arguments.length;i++){ args.push(arguments[i]); }
		return f && f.apply(scope || window, args);
	};
};

var checkflag = "false";
function checkUncheckAll(f){
	if (checkflag == "false"){
		for (var i=0;i<f.length;i++)
			f[i].checked = true;
		f.checked = true;
		checkflag = "true";
	}else {
		for (var i=0; i < f.length; i++)
			f[i].checked = false;
		f.checked = false;
		checkflag = "false";
	}
}

function openWin( windowURL, windowName, windowFeatures ) {
	return window.open( windowURL, windowName, windowFeatures ) ;
}

function get_url() { //el=str, case_sensitive=bool
	var rs="i";
	var urls = document.URL;
	urls = urls.replace(/'/g,"");

	var el = "friendID";
	var re = new RegExp( "\\?[\\w\\W]*"+ el +"=([^\\&\\?#]*)", rs);
	var arr = re.exec(urls);
	if(!arr){
		elg = "groupID";
		var red = new RegExp( "\\?[\\w\\W]*"+ elg +"=([^\\&\\?#]*)", rs);
		arr = red.exec(urls);
	}
	if(arr && arr.length>1)return arr[1];
	else{
		var expr = /\/([\w]*)$/i;
		arr = expr.exec(urls);
			if(arr && arr.length>1) {
				return arr[1].toLowerCase(); }
			else {
				return ''; }
	}
}

var browser = new (function() {
	var ua = navigator.userAgent.toLowerCase();

	this.isGecko = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
	this.isSafari = (ua.indexOf('safari') != -1);
	this.isIE = (ua.indexOf('msie') != -1 && (ua.indexOf('webtv') == -1));

	this.versionMinor = parseFloat(navigator.appVersion);

	if (this.isGecko) {
		this.versionMinor = parseFloat(ua.substring(ua.indexOf('/', ua.indexOf('gecko/') + 6) + 1));
	}
	else if (this.isIE && this.versionMinor >= 4) {
		this.versionMinor = parseFloat(ua.substring(ua.indexOf('msie ') + 5));
	}
	else if (this.isSafari) {
		this.versionMinor = parseFloat(ua.substring(ua.lastIndexOf('safari/') + 7));
	}

	this.versionMajor = parseInt(this.versionMinor, 10);

	this.isWin = (ua.indexOf('win') != -1);
	this.isMac = (ua.indexOf('mac') != -1);

	this.isIE6x = (this.isIE && this.versionMajor == 6);
	this.isIE6up = (this.isIE && this.versionMajor >= 6);
})();

MySpace.Utils.hasOwnProperty = (Object.prototype.hasOwnProperty) ? function(o, prop) { return o && o.hasOwnProperty(prop); } : function(o, prop) { return !(typeof (o[prop]) === 'undefined' && o.constructor.prototype[prop] !== o[prop]); };

(function() {
var Selector = function() {};

var reNth = /^(?:([-]?\d*)(n){1}|(odd|even)$)*([-+]?\d*)$/;

Selector.prototype = {
    document: window.document,
    attrAliases: {
        'for': 'htmlFor'
    },

    shorthand: {
        '\\#(-?[_a-z]+[-\\w]*)': '[id=$1]',
        '\\.(-?[_a-z]+[-\\w]*)': '[class~=$1]'
    },

    operators: {
        '=': function(attr, val) { return attr === val; }, 
        '!=': function(attr, val) { return attr !== val; }, 
        '~=': function(attr, val) { 
            var s = ' ';
            return (s + attr + s).indexOf((s + val + s)) > -1;
        },
        '|=': function(attr, val) { return getRegExp('^' + val + '[-]?').test(attr); }, 
        '^=': function(attr, val) { return attr.indexOf(val) === 0; }, 
        '$=': function(attr, val) { return attr.lastIndexOf(val) === attr.length - val.length; }, 
        '*=': function(attr, val) { return attr.indexOf(val) > -1; }, 
        '': function(attr, val) { return attr; }
    },

    pseudos: {
        'root': function(node) {
            return node === node.ownerDocument.documentElement;
        },

        'nth-child': function(node, val) {
            return getNth(node, val);
        },

        'nth-last-child': function(node, val) {
            return getNth(node, val, null, true);
        },

        'nth-of-type': function(node, val) {
            return getNth(node, val, node.tagName);
        },
         
        'nth-last-of-type': function(node, val) {
            return getNth(node, val, node.tagName, true);
        },
         
        'first-child': function(node) {
            return getChildren(node.parentNode)[0] === node;
        },

        'last-child': function(node) {
            var children = getChildren(node.parentNode);
            return children[children.length - 1] === node;
        },

        'first-of-type': function(node, val) {
            return getChildren(node.parentNode, node.tagName.toLowerCase())[0];
        },
         
        'last-of-type': function(node, val) {
            var children = getChildren(node.parentNode, node.tagName.toLowerCase());
            return children[children.length - 1];
        },
         
        'only-child': function(node) {
            var children = getChildren(node.parentNode);
            return children.length === 1 && children[0] === node;
        },

        'only-of-type': function(node) {
            return getChildren(node.parentNode, node.tagName.toLowerCase()).length === 1;
        },

        'empty': function(node) {
            return node.childNodes.length === 0;
        },

        'not': function(node, simple) {
            return !Selector.test(node, simple);
        },

        'contains': function(node, str) {
            var text = node.innerText || node.textContent || '';
            return text.indexOf(str) > -1;
        },
        'checked': function(node) {
            return node.checked === true;
        }
    },

    test: function(node, selector) {
        node = Selector.document.getElementById(node) || node;

        if (!node) {
            return false;
        }

        var groups = selector ? selector.split(',') : [];
        if (groups.length) {
            for (var i = 0, len = groups.length; i < len; ++i) {
                if ( rTestNode(node, groups[i]) ) { 
                    return true;
                }
            }
            return false;
        }
        return rTestNode(node, selector);
    },
    
    filter: function(nodes, selector) {
        nodes = nodes || [];

        var node,
            result = [],
            tokens = tokenize(selector);

        if (!nodes.item) { 
            for (var i = 0, len = nodes.length; i < len; ++i) {
                if (!nodes[i].tagName) { 
                    node = Selector.document.getElementById(nodes[i]);
                    if (node) { 
                        nodes[i] = node;
                    } else {
                        // skip invalid node
                    }
                }
            }
        }
        result = rFilter(nodes, tokenize(selector)[0]);
        clearParentCache();
        
        return result;
    },

    query: function(selector, root, firstOnly) {
        var result = query(selector, root, firstOnly);
        
        return result;
    }
};

var query = function(selector, root, firstOnly, deDupe) {
    var result =  (firstOnly) ? null : [];
    if (!selector) {
        return result;
    }

    var groups = selector.split(','); 
    if (groups.length > 1) {
        var found;
        for (var i = 0, len = groups.length; i < len; ++i) {
            found = arguments.callee(groups[i], root, firstOnly, true);
            result = firstOnly ? found : result.concat(found); 
        }
        clearFoundCache();
        return result;
    }

    if (root && !root.nodeName) {
        root = Selector.document.getElementById(root);
        if (!root) {
            
            return result;
        }
    }

    root = root || Selector.document;
    var tokens = tokenize(selector);
    var idToken = tokens[getIdTokenIndex(tokens)],
        nodes = [],
        node,
        id,
        token = tokens.pop() || {};
        
    if (idToken) {
        id = getId(idToken.attributes);
    }

    if (id) {
        if (id === token.id) { 
            nodes = [Selector.document.getElementById(id)] || root;
        } else { 
            node = Selector.document.getElementById(id);
            if (root === Selector.document || contains(node, root)) {
                if ( node && rTestNode(node, null, idToken) ) {
                    root = node; 
                }
            } else {
                return result;
            }
        }
    }

    if (root && !nodes.length) {
        nodes = root.getElementsByTagName(token.tag);
    }

    if (nodes.length) {
        result = rFilter(nodes, token, firstOnly, deDupe); 
    }
    clearParentCache();
    return result;
};

var contains = function() {
    if (document.documentElement.contains && !(Sys.Browser.agent === Sys.Browser.Safari && Sys.Browser.version < 3))  {
        return function(needle, haystack) {
            return haystack.contains(needle);
        };
    } else if ( document.documentElement.compareDocumentPosition ) {
        return function(needle, haystack) {
            return !!(haystack.compareDocumentPosition(needle) & 16);
        };
    } else  { 
        return function(needle, haystack) {
            var parent = needle.parentNode;
            while (parent) {
                if (needle === parent) {
                    return true;
                }
                parent = parent.parentNode;
            } 
            return false;
        }; 
    }
}();

var rFilter = function(nodes, token, firstOnly, deDupe) {
    var result = firstOnly ? null : [];

    for (var i = 0, len = nodes.length; i < len; i++) {
        if (! rTestNode(nodes[i], '', token, deDupe)) {
            continue;
        }

        if (firstOnly) {
            return nodes[i];
        }
        if (deDupe) {
            if (nodes[i]._found) {
                continue;
            }
            nodes[i]._found = true;
            foundCache[foundCache.length] = nodes[i];
        }

        result[result.length] = nodes[i];
    }

    return result;
};

var rTestNode = function(node, selector, token, deDupe) {
    token = token || tokenize(selector).pop() || {};

    if (!node.tagName ||
        (token.tag !== '*' && node.tagName.toUpperCase() !== token.tag) ||
        (deDupe && node._found) ) {
        return false;
    }

    if (token.attributes.length) {
        var attribute;
        for (var i = 0, len = token.attributes.length; i < len; ++i) {
            attribute = node.getAttribute(token.attributes[i][0], 2);
            if (attribute === undefined) {
                return false;
            }
            if ( Selector.operators[token.attributes[i][1]] &&
                    !Selector.operators[token.attributes[i][1]](attribute, token.attributes[i][2])) {
                return false;
            }
        }
    }

    if (token.pseudos.length) {
        for (var i = 0, len = token.pseudos.length; i < len; ++i) {
            if (Selector.pseudos[token.pseudos[i][0]] &&
                    !Selector.pseudos[token.pseudos[i][0]](node, token.pseudos[i][1])) {
                return false;
            }
        }
    }

    return (token.previous && token.previous.combinator !== ',') ?
            combinators[token.previous.combinator](node, token) :
            true;
};


var foundCache = [];
var parentCache = [];
var regexCache = {};

var clearFoundCache = function() {
    
    for (var i = 0, len = foundCache.length; i < len; ++i) {
        try { 
            delete foundCache[i]._found;
        } catch(e) {
            foundCache[i].removeAttribute('_found');
        }
    }
    foundCache = [];
    
};

var clearParentCache = function() {
    if (!document.documentElement.children) { 
        return function() {
            for (var i = 0, len = parentCache.length; i < len; ++i) {
                delete parentCache[i]._children;
            }
            parentCache = [];
        };
    } else return function() {}; 
}();

var getRegExp = function(str, flags) {
    flags = flags || '';
    if (!regexCache[str + flags]) {
        regexCache[str + flags] = new RegExp(str, flags);
    }
    return regexCache[str + flags];
};

var combinators = {
    ' ': function(node, token) {
        while (node = node.parentNode) {
            if (rTestNode(node, '', token.previous)) {
                return true;
            }
        }  
        return false;
    },

    '>': function(node, token) {
        return rTestNode(node.parentNode, null, token.previous);
    },
    '+': function(node, token) {
        var sib = node.previousSibling;
        while (sib && sib.nodeType !== 1) {
            sib = sib.previousSibling;
        }

        if (sib && rTestNode(sib, null, token.previous)) {
            return true; 
        }
        return false;
    },

    '~': function(node, token) {
        var sib = node.previousSibling;
        while (sib) {
            if (sib.nodeType === 1 && rTestNode(sib, null, token.previous)) {
                return true;
            }
            sib = sib.previousSibling;
        }

        return false;
    }
};

var getChildren = function() {
    if (document.documentElement.children) { 
        return function(node, tag) {
            return (tag) ? node.children.tags(tag) : node.children || [];
        };
    } else {
        return function(node, tag) {
            if (node._children) {
                return node._children;
            }
            var children = [],
                childNodes = node.childNodes;

            for (var i = 0, len = childNodes.length; i < len; ++i) {
                if (childNodes[i].tagName) {
                    if (!tag || childNodes[i].tagName.toLowerCase() === tag) {
                        children[children.length] = childNodes[i];
                    }
                }
            }
            node._children = children;
            parentCache[parentCache.length] = node;
            return children;
        };
    }
}();

var getNth = function(node, expr, tag, reverse) {
    if (tag) tag = tag.toLowerCase();
    reNth.test(expr);
    var a = parseInt(RegExp.$1, 10), 
        n = RegExp.$2, 
        oddeven = RegExp.$3, 
        b = parseInt(RegExp.$4, 10) || 0, 
        result = [];

    var siblings = getChildren(node.parentNode, tag);

    if (oddeven) {
        a = 2; 
        op = '+';
        n = 'n';
        b = (oddeven === 'odd') ? 1 : 0;
    } else if ( isNaN(a) ) {
        a = (n) ? 1 : 0; 
    }

    if (a === 0) { 
        if (reverse) {
            b = siblings.length - b + 1; 
        }

        if (siblings[b - 1] === node) {
            return true;
        } else {
            return false;
        }

    } else if (a < 0) {
        reverse = !!reverse;
        a = Math.abs(a);
    }

    if (!reverse) {
        for (var i = b - 1, len = siblings.length; i < len; i += a) {
            if ( i >= 0 && siblings[i] === node ) {
                return true;
            }
        }
    } else {
        for (var i = siblings.length - b, len = siblings.length; i >= 0; i -= a) {
            if ( i < len && siblings[i] === node ) {
                return true;
            }
        }
    }
    return false;
};

var getId = function(attr) {
    for (var i = 0, len = attr.length; i < len; ++i) {
        if (attr[i][0] == 'id' && attr[i][1] === '=') {
            return attr[i][2];
        }
    }
};

var getIdTokenIndex = function(tokens) {
    for (var i = 0, len = tokens.length; i < len; ++i) {
        if (getId(tokens[i].attributes)) {
            return i;
        }
    }
    return -1;
};

var patterns = {
    tag: /^((?:-?[_a-z]+[\w-]*)|\*)/i,
    attributes: /^\[([a-z]+\w*)+([~\|\^\$\*!=]=?)?['"]?([^'"\]]*)['"]?\]*/i,
    pseudos: /^:([-\w]+)(?:\(['"]?(.+)['"]?\))*/i,
    combinator: /^\s*([>+~]|\s)\s*/
};

var tokenize = function(selector) {
    var token = {},     
        tokens = [],    
        id,             
        found = false,  
        match;          

    selector = replaceShorthand(selector); 

    do {
        found = false; 
        for (var re in patterns) {
                if (!MySpace.Utils.hasOwnProperty(patterns, re)) {
                    continue;
                }
                if (re != 'tag' && re != 'combinator') { 
                    token[re] = token[re] || [];
                }
            if (match = patterns[re].exec(selector)) {
                found = true;
                if (re != 'tag' && re != 'combinator') {
                    if (re === 'attributes' && match[1] === 'id') {
                        token.id = match[3];
                    }

                    token[re].push(match.slice(1));
                } else { 
                    token[re] = match[1];
                }
                selector = selector.replace(match[0], ''); 
                if (re === 'combinator' || !selector.length) { 
                    token.attributes = fixAttributes(token.attributes);
                    token.pseudos = token.pseudos || [];
                    token.tag = token.tag ? token.tag.toUpperCase() : '*';
                    tokens.push(token);

                    token = {
                        previous: token
                    };
                }
            }
        }
    } while (found);

    return tokens;
};

var fixAttributes = function(attr) {
    var aliases = Selector.attrAliases;
    attr = attr || [];
    for (var i = 0, len = attr.length; i < len; ++i) {
        if (aliases[attr[i][0]]) { 
            attr[i][0] = aliases[attr[i][0]];
        }
        if (!attr[i][1]) { 
            attr[i][1] = '';
        }
    }
    return attr;
};

var replaceShorthand = function(selector) {
    var shorthand = Selector.shorthand;
    var attrs = selector.match(patterns.attributes); 
    if (attrs) {
        selector = selector.replace(patterns.attributes, 'REPLACED_ATTRIBUTE');
    }
    for (var re in shorthand) {
        if (!MySpace.Utils.hasOwnProperty(shorthand, re)) {
            continue;
        }
        selector = selector.replace(getRegExp(re, 'gi'), shorthand[re]);
    }

    if (attrs) {
        for (var i = 0, len = attrs.length; i < len; ++i) {
            selector = selector.replace('REPLACED_ATTRIBUTE', attrs[i]);
        }
    }
    return selector;
};

if (Sys.Browser.agent === Sys.Browser.InternetExplorer && ((Sys.Browser.version === 8 && document.documentMode <= 7) || Sys.Browser.version <= 7)){ 
    Selector.prototype.attrAliases['class'] = 'className';
}

Selector = new Selector();
Selector.patterns = patterns;

Type.registerNamespace('MySpace.Utils');
MySpace.Utils.Selector = Selector;
$q = Selector.query;
})();

MySpace.Util.parseNameValuePair=function(nameValuePair, delimiter, modifier){
	/// <param name="nameValuePair" type="String"></param>
	/// <param name="delimiter" type="Regex"></param>
	/// <param name="modifier" type="Function" mayBeNull="true" optional="true"></param>
	/// <returns type="Object"></returns>
	if(!delimiter) delimiter="=";
	if(!nameValuePair || nameValuePair[0]===delimiter) return null;
	var nameValueObject;
	var pos=nameValuePair.search(delimiter);
	if(pos>0){
		nameValueObject={
			name:nameValuePair.substring(0,pos),
			value:nameValuePair.substring(pos+1)
		}
	}
	else nameValueObject={name:nameValuePair,value:""};

	if(modifier) nameValueObject=modifier(nameValueObject);
	return nameValueObject;
}
MySpace.Util.parseNameValuePairs=function(nameValuePairs, pairDelimiter, nameValueDelimiter, nameValueModifier){
	/// <param name="nameValuePairs" type="String"></param>
	/// <param name="pairDelimiter" type="Regex"></param>
	/// <param name="nameValueDelimiter" type="Regex"></param>
	/// <param name="modifier" type="Function" mayBeNull="true" optional="true"></param>
	/// <returns type="Object"></returns>
	var _collection=null,nameValuePair=null;
	var _pairs = nameValuePairs.split(pairDelimiter);
	for(var i=0;i<_pairs.length;i++){
		nameValuePair=MySpace.Util.parseNameValuePair(_pairs[i],nameValueDelimiter,nameValueModifier);
		if(!nameValuePair) continue;
		if(!_collection) _collection={};
		_collection[nameValuePair.name]=nameValuePair.value;
	}
	return _collection;
}

MySpace.Cookie=function(name, rawValue){
	/// <param name="name" type="String"></param>
	/// <param name="rawValue" type="String"></param>
	this._name = name;
	this._rawValue = rawValue;
	this._value = unescape(rawValue);
	this._values = MySpace.Util.parseNameValuePairs(rawValue,"&",null,this._modifier);
}
MySpace.Cookie.prototype={
	get_name:function(){return this._name;},
	get_value:function(){return this._value;},
	get_values:function(){return this._values;},

	_modifier:function(nameValueObject){
		if(!nameValueObject.value) return null;
		nameValueObject.value=unescape(nameValueObject.value);
		return nameValueObject;
	},
	toString:function(){
		/// <returns type="String"></returns>
		var valuesArray=[];
		var values=this.get_values();
		if(!values) return this.get_value();
		for(var i in values)
			valuesArray[valuesArray.length] = i+"="+escape(values[i]);
		return valuesArray.join("&");
	}
}
MySpace.Cookie.registerClass('MySpace.Cookie');

MySpace._Cookies=function(){
	var nvc = MySpace.Util.parseNameValuePairs(document.cookie,/\s?;\s?/,null);
	for(var name in nvc)
		this[name] = new MySpace.Cookie(name, nvc[name]);
}
MySpace._Cookies.prototype={
	save:function(cookie,domain,expires){
		/// <param name="cookie" type="MySpace.Cookie"></param>
		/// <param name="domain" type="String"></param>
		/// <param name="expires" type="Date"></param>
		var value=cookie.toString();
		var parts=[cookie.get_name()+"="+value];
		if(domain){
			if(domain!=="localhost" && domain.charAt(0)!==".")
				throw Error.invalidOperation("domain must start with '.'");
			parts[1]="domain="+domain;
		}
		if(expires)parts[parts.length]="expires="+expires.toGMTString();
		parts[parts.length]="path=/";
		document.cookie = parts.join("; "); 
		MySpace.Cookies=new MySpace._Cookies();
	},
	remove:function(cookieName, domain){
		/// <param name="cookieName" type="String"></param>
		this.save(new MySpace.Cookie(cookieName,""),domain,new Date().addDays(-1));
	}
}
MySpace._Cookies.registerClass('MySpace._Cookies');
MySpace.Cookies=new MySpace._Cookies();
//
// MySpace.Timer component
//

MySpace.Timer=function(){
	MySpace.Timer.initializeBase(this);
	this._interval=1000;
	this._enabled=false;
	this._timer=null
};
MySpace.Timer.prototype={
	get_interval:function(){
		return this._interval
	},
	set_interval:function(a){
		if(this._interval!==a){
			this._interval=a;
			this.raisePropertyChanged("interval");
			if(!this.get_isUpdating()&&this._timer!==null)this.restartTimer()
		}
	},
	get_enabled:function(){
		return this._enabled
	},
	set_enabled:function(a){
		if(a!==this.get_enabled()){
			this._enabled=a;
			this.raisePropertyChanged("enabled");
			if(!this.get_isUpdating())if(a)this._startTimer();
			else this._stopTimer()
		}
	},
	add_tick:function(a){
		this.get_events().addHandler("tick",a)
	},
	remove_tick:function(a){
		this.get_events().removeHandler("tick",a)
	},
	dispose:function(){
		this.set_enabled(false);
		this._stopTimer();
		MySpace.Timer.callBaseMethod(this,"dispose")
	},
	updated:function(){
		MySpace.Timer.callBaseMethod(this,"updated");
		if(this._enabled)this.restartTimer()
	},
	_timerCallback:function(){
		var a=this.get_events().getHandler("tick");
		if(a)a(this,Sys.EventArgs.Empty)
	},
	restartTimer:function(){
		this._stopTimer();
		this._startTimer()
	},
	_startTimer:function(){
		this._timer=window.setInterval(Function.createDelegate(this,this._timerCallback),this._interval)
	},
	_stopTimer:function(){
		window.clearInterval(this._timer);
		this._timer=null
	}
};
MySpace.Timer.registerClass("MySpace.Timer",Sys.Component);
MySpace.Util.applyWBRToElements = function(elements,options){
	/// <param name="elements" type="Array" elementType="DomElement"></param>
	/// <param name="frequency" type="Number" integer="true" optional="true"></param>
	/// <param name="regex" type="RegExp" optional="true"></param>
	for(var i=0;i<elements.length;i++)
		MySpace.Util.applyWBRToElement(elements[i],options);
}
MySpace.Util.applyWBRToElement=function(element,options){
	/// <param name="elements" type="Array" elementType="DomElement"></param>
	/// <param name="options" type="Object" optional="true">
	///  options can include:
	///   frequency: number of non-whitespace chars to break after (defaults to 20)
	///   breakCharsRegex: regex for additional places where a break can be added after (defaults to all punctuation chars)
	/// </param>
	if(MySpace.Application.keyDisabled("CommonWordBreaker")){ return; }
	
	options=options || {};
	var frequency=options.frequency || 20;
	var breakCharsRegex=options.breakCharsRegex || MySpace.Util.applyWBRToElement._breakCharsRegex;
	var wrapChar=MySpace.Util.applyWBRToElement._wrapChar;
	var longWordRegex=new RegExp("\\S{"+frequency+",}", "g");
	var unbrokenCharsRegex=new RegExp("[^"+wrapChar+"]{"+frequency+"}(?!"+wrapChar+")", "g");	// 20 non-zwsp chars, not followed by a zwsp
	var replaceValue=MySpace.Util.applyWBRToElement._replaceValue;
	var bigChunkRegex=new RegExp("\\S{"+frequency+"}(?!$)", "g");	// 20 non-whitespace chars, not at the end of the string
	
	_r(element);
	function _r(e){
		if(!e || !e.childNodes)return;
		
		for(var i=0;i<e.childNodes.length;i++){
			var el=e.childNodes[i];
			if(/(STYLE|SCRIPT)/.test(el.nodeName)){ continue; }
			
			if(el.nodeType===3){
				if(Sys.Browser.agent===Sys.Browser.Safari){
                //check if the browser version is 3 or later
                    if (Sys.Browser.version > 522.12){
					//Safari doesn't support WBR well, so use zero-width space even though
					//it breaks copy-and-paste
					if(!MySpace.Util.applyWBRToElement._replaceFunctionSupported){ return; }

					el.nodeValue=el.nodeValue.replace(longWordRegex, function(word){
						return word.replace(breakCharsRegex, replaceValue).replace(unbrokenCharsRegex, replaceValue);
                        
					});
                    }else { return; }
				}else{
					//Keep splitting the text node and inserting a WBR every 20 chars, or
					//whenever punctuation is found
					var match;
					while(match=bigChunkRegex.exec(el.nodeValue)){
						var splitIdx=match.index+frequency;
						
						breakCharsRegex.lastIndex=match.index;
						var breakMatch=breakCharsRegex.exec(el.nodeValue);
						if(breakMatch && breakMatch.index<match.index+frequency){
							splitIdx=breakMatch.index+1;
						}

						var parent=el.parentNode;
						el=el.splitText(splitIdx);
						parent.insertBefore(document.createElement("wbr"), el);
						bigChunkRegex.lastIndex=0;
						
						// Advance past the newly created text node and WBR node
						i += 2;
					}
				}
			}
			else _r(el);
		}
	}
}
MySpace.Util.applyWBRToElement._breakCharsRegex=/[-!@#$%&*()_=+\[{\]}\\|;:'",.<>\/?`~^]/g;
MySpace.Util.applyWBRToElement._wrapChar="\u200B";	// zero-width space
MySpace.Util.applyWBRToElement._replaceValue="$&"+MySpace.Util.applyWBRToElement._wrapChar;
//Test for old Safari's (before 2.0.4) that don't support passing a function to String.replace
MySpace.Util.applyWBRToElement._replaceFunctionSupported=("x".replace(/./, function(){return "y";}) === "y");
///////////////////////
// NEW GLOBAL HEADER //
///////////////////////
var msglobalnav = {

    $$: function(el, tag) { return el.getElementsByTagName(tag) },
    menuItems: [],
    searchTypesOn: 0,
    searchTimer: null,
    searchFramer: null,

    loadStrings: function(defs) {
        for (var classKey in defs) {
            if (!MySpaceRes[classKey]) { MySpaceRes[classKey] = {}; }

            for (var resourceKey in defs[classKey]) {
                MySpaceRes[classKey][resourceKey] = defs[classKey][resourceKey];
            }
        }
    },

    initNavigation: function() {
        var leftUL = $get("leftNav");
        var nestedSubNav = leftUL.getElementsByTagName("IFRAME");
        if ((typeof (nestedSubNav) === "undefined") || (nestedSubNav.length <= 0)) return;

        var rightUL = $get("rightNav");
        var leftItems = leftUL.hasChildNodes ? leftUL.childNodes : [];
        var rightItems = rightUL.hasChildNodes ? rightUL.childNodes : [];

        for (var i = 0; i < leftItems.length; i++)
            if (leftItems[i].nodeName === "LI" && leftItems[i].className.indexOf("dropDown") > -1) this.menuItems.push(leftItems[i]);
        for (var i = 0; i < rightItems.length; i++)
            if (rightItems[i].nodeName === "LI" && rightItems[i].className.indexOf("dropDown") > -1) this.menuItems.push(rightItems[i]);

        for (var i = 0; i < this.menuItems.length; i++) {
            var mi = this.menuItems[i];
            var subItems = this.$$(mi, "LI");
            var ul = this.$$(mi, "UL")[0];
            if (subItems.length > 0) {

                var min = 140;
                for (var j = 0; j < subItems.length; j++) { if (min < subItems[j].offsetWidth) { min = subItems[j].offsetWidth; } }

                var frme = this.$$(mi, "IFRAME")[0];
                if (frme) {
                    for (var t = 0; t < subItems.length; t++) {
                        subItems[t].style.width = min + 'px';
                    }

                    frme.style.width = min + 2 + 'px';
                    frme.style.height = ul.offsetHeight + 'px';
                }
            }
        }
    },

    addIE6Events: function() {

        for (var i = 0; i < this.menuItems.length; i++) {
            var mi = this.menuItems[i];
            var subItems = this.$$(mi, "LI");
            if (subItems.length > 0) {
                if (this.$$(mi, "IFRAME")[0]) {
                    mi.onmouseover = function() { this.className += (this.className.indexOf("hover") > -1) ? "" : " hover"; }
                    mi.onmouseout = function() { this.className = this.className.replace(" hover", ""); event.cancelBubble = true; }
                }
            }
        }
    },

    applyAlphaImageLoader: function(id, url, method) {
        var el = document.getElementById(id);
        if (el == null) return;
        var img = new Image();
        img.src = url;
        el.style.backgroundImage = 'none';
        $addHandler(window, 'load', function() {
            el.style.filter = 'progid:DXImagetransform.Microsoft.AlphaImageLoader(enabled="true", src="' + url + '", sizingMethod="' + method + '");';
        });
    },

    openSearchTypes: function(arg) {

        var isHeader = (arg.toLowerCase() === 'header');
        var searchMenuListBox = 'srchMenuListBox_' + arg;
        var searchList = $get(searchMenuListBox);
        if (searchList == null) return;

        searchList.className += (searchList.className.indexOf(' open') > -1) ? '' : ' open';
        var pos = Sys.UI.DomElement.getLocation(searchList);
        if (isHeader) {
            if (this.searchFramer == null) { this.searchFramer = this.$$(searchList, "IFRAME")[0]; }
            if (this.searchFramer) {
                this.searchFramer.style.width = searchList.offsetWidth + 'px';
                this.searchFramer.style.height = searchList.offsetHeight + 'px';
            }
        }
        window.clearTimeout(this.searchTimer);
        this.searchTimer = null;
    },

    hideSearchTypes: function(arg) {
        var x = this;
        this.searchTimer = setTimeout(function() {

            var searchMenuListBox = 'srchMenuListBox_' + arg;
            var searchList = $get(searchMenuListBox);
            if (searchList == null) return;

            searchList.className = '';
            if (x.searchFramer == null) { x.searchFramer = x.$$(searchList, "IFRAME")[0]; }

            x.searchTimer = null;
        }, 500);
    },

    switchSearchTypeTo: function(v, searchType) {
        var _after = '<small>&#9660;</small>';
        var types;
        var searchText = 'search_t_' + searchType;
        var searchTypeValue = 'searchTypeValue_' + searchType;
        var srchMenuListBox = 'srchMenuListBox_' + searchType;
        var typeName = v + '_' + searchType;
        if ($get(searchText)) $get(searchText).value = v;
        if ($get(typeName))
            if ($get(searchTypeValue)) $get(searchTypeValue).innerHTML = $get(typeName).innerHTML + _after;

        if ($get(srchMenuListBox)) $get(srchMenuListBox).className = '';


        if ((window.intKeyRebrandHeader == true) && (searchType == 'Header')) {
            var newDefaultText = '';
            if ((v == 'tmusic_Header') || (v == 'Music'))
                newDefaultText = MusicDefaultText;
            else if ((v == 'tvid_Header') || (v == 'MySpaceTV'))
                newDefaultText = VideoDefaultText;
            else if ((v == 'tlocal_Header') || (v == 'Local'))
                newDefaultText = LocalDefaultText;
            else if ((v == 'Images') || (v == 'timages_Header'))
                newDefaultText = ImagesDefaultText;

            if (window.ORANGESearchBox) {
                ORANGESearchBox.set_defaultValue(newDefaultText);
            }
        }
        window.clearTimeout(this.searchTimer);
        this.searchTimer = null;
    },

    srchSubmit: function(searchValue) {
        if (window.ORANGESearchBox) {
            if (ORANGESearchBox.get_value().length > 0)
                return true;
            else
                return false;
        }
        else {
            if ($get(searchValue).value.length > 0)
                return true;
            else
                return false;
        }
    },

    srchMenuList: function(isOn, searchType) {
        var x = this;
        if (isOn) {
            window.clearTimeout(this.searchTimer);
            this.searchTimer = null;
        }
        else {
            this.searchTimer = setTimeout(function() {

                var srchMenuListBox = 'srchMenuListBox_' + searchType;
                if ($get(srchMenuListBox)) $get(srchMenuListBox).className = '';
                x.searchTimer = null;
            }, 500);
        }
    },

    searchLocation: function(url, fuseaction, type, qry) {
        var fuseAction = $get(fuseaction);
        var typeElement = $get(type);
        var qryElement = $get(qry);
        if (qryElement.value.length > 0) {
            window.location = url + fuseAction.name + "=" + fuseAction.value + "&" + typeElement.name + "=" + typeElement.value
								+ "&" + qryElement.name + "=" + qryElement.value + '&submit=Search';
        }
        return false;
    },

    toggleInternationalLinks: function(e) {
        if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7))
            return true;

        var el = $get('footer');
        if (!el || !$get('internationalLinks', el)) return true;

        if (Sys.UI.DomElement.containsCssClass(el, "intlLinks"))
            Sys.UI.DomElement.removeCssClass(el, "intlLinks");
        else
            Sys.UI.DomElement.addCssClass(el, "intlLinks");

        e.preventDefault();
        return false;
    },

    initializeProfileSearchMenu: function(defaultVal) {

        if (!defaultVal) return;

        if (MySpace.ClientContext.FunctionalContext) {
            if (MySpace.ClientContext.FunctionalContext === "UserViewProfile") {
                if (MySpace.ClientContext.ProfileType === "Band") {
                    switchSearchTypeTo('Music', 'Header');
                }
            }
        }
    },


    // BACKWARDS COMPATIBILITY (V1,Ad Profiles ONLY)
    framer: null,
    menuTopOffset: (Sys.Browser.agent === Sys.Browser.InternetExplorer) ? -3 : 0,
    menuLeftOffset: (Sys.Browser.agent === Sys.Browser.InternetExplorer) ? -3 : 0,
    linkOffset: (Sys.Browser.agent === Sys.Browser.InternetExplorer && document.compatMode == "BackCompat") ? 0 : -15,
    timerOut: null,
    menuOutTime: 250,
    currentItemId: null,

    toggle: function(id, show) {
        if (show) {
            var subNavDropDown = this.getSubNav(id);
            //cancel the time
            if (this.timerOut) {
                clearTimeout(this.timerOut);
                this.timerOut = null;
            }

            //turn off previous					
            if (this.currentItemId != null) {
                var current = this.getItems(this.currentItemId);
                current.parent.className = '';
                this.framer.style.left = '-100000px';
                current.child.style.left = '-100000px';
                this.currentItemId = null;
            }
            //turn-on new one
            subNavDropDown.child.style.left = subNavDropDown.childLeft
            subNavDropDown.child.style.top = subNavDropDown.childTop
            subNavDropDown.parent.className = 'open';

            if (this.framer == null) { this.framer = document.getElementById('framer'); }

            this.framer.style.left = subNavDropDown.childLeft;
            this.framer.style.top = subNavDropDown.childTop;
            this.framer.style.width = subNavDropDown.child.offsetWidth + 'px';
            this.framer.style.height = subNavDropDown.child.offsetHeight + 'px';
            this.framer.style.zIndex = subNavDropDown.child.style.zIndex + 1;
            this.framer.style.display = 'block';
            this.currentItemId = id;
        }
        else {
            this.timerOut = setTimeout(function() { msglobalnav.hideDropDown(id); }, this.menuOutTime);
        }
    },

    getSubNav: function(id) {
        var items = this.getItems(id);
        var subNavDropDown = {};
        subNavDropDown.parent = items.parent;
        subNavDropDown.child = items.child;
        if (!items.parent.resized) {
            this.fixedSub(subNavDropDown.child, subNavDropDown.parent);
            items.parent.resized = true;
        }
        var pos = Sys.UI.DomElement.getLocation(items.parent);
        subNavDropDown.childLeft = pos.x + 'px';
        subNavDropDown.childTop = (pos.y + items.parent.offsetHeight) + 'px';
        return subNavDropDown;
    },

    getItems: function(id) {
        return { 'child': document.getElementById('subNav' + id), 'parent': document.getElementById('nav' + id) };
    },

    fixedSub: function(sub, parent) {
        //FIX FOR UHP
        var d = document.getElementById('userdisplay');
        var uhpOffset = 0;
        if (d && d.className === 'module' && d.tagName === 'DIV') { uhpOffset = 1; }

        var items = sub.getElementsByTagName('LI');

        var max = 140;
        for (var i = 0; i < items.length; i++) {
            if (max < items[i].offsetWidth) { max = items[i].offsetWidth; }
        }

        if (max < parent.offsetWidth) max = parent.offsetWidth;
        sub.style.width = max + 'px';

        for (var i = 0; i < items.length; i++) {
            items[i].style.width = max + 'px';
            items[i].getElementsByTagName('A')[0].style.width = (max + this.linkOffset + uhpOffset) + 'px';
        }
    },

    hideDropDown: function(id) {
        var subNavDropDown = this.getItems(id);
        subNavDropDown.parent.className = '';
        this.framer.style.left = '-100000px';
        this.framer.style.display = 'none';
        subNavDropDown.child.style.left = '-100000px';
        this.timerOut = null;
        this.currentItemId = null;
    },

    subToggle: function(id, show) {
        if (show) {
            if (this.timerOut) {
                clearTimeout(this.timerOut);
                this.timerOut = null;
            }
        }
        else {
            this.timerOut = setTimeout(function() { msglobalnav.hideDropDown(id); }, this.menuOutTime);
        }
    }
};






//
// JsonpWebServiceProxy class
//

Type.registerNamespace("MySpace.Net");
MySpace.Net.JsonpWebServiceProxy = function() {};
MySpace.Net.JsonpWebServiceProxy.registerClass("MySpace.Net.JsonpWebServiceProxy");

MySpace.Net.JsonpWebServiceProxy.invoke=function(url, params, onSuccess, onFailure, jsonpParam, context, timeout){
	params[jsonpParam || "jsonp"]="MySpace.Net.JsonpWebServiceProxy._handlers["+(++this._counter)+"]";
	
	var count=this._counter;
	this._handlers[count]=function(res){
		MySpace.Net.JsonpWebServiceProxy._handle(el, count, res, onSuccess, onFailure, context);
	};
	
	var pairs=[];
	for(var key in params){
		pairs.push(encodeURIComponent(key)+"="+encodeURIComponent(params[key]));
	}
	url=url+(url.indexOf("?")==-1 ? "?" : "&")+pairs.join("&");
	
	var el=document.createElement("script");
	el.type="text/javascript";
	el.src=url;

	var errorHandler=function(){
		if(MySpace.Net.JsonpWebServiceProxy._handlers[count] != Function.emptyFunction){
			MySpace.Net.JsonpWebServiceProxy._handle(el, count, {}.x, onSuccess, onFailure, context);
		}
	};
	$addHandler(el, "error", errorHandler);
	setTimeout(errorHandler, timeout || 30000);
	
	document.getElementsByTagName("head")[0].appendChild(el);
};
MySpace.Net.JsonpWebServiceProxy._handle=function(el, counter, result, onSuccess, onFailure, context){
	for(var i=0;i<this._deadScripts.length;i++){
		var node=this._deadScripts[i];
		node.parentNode.removeChild(node);
	}
	this._deadScripts=[];
	
	$clearHandlers(el);
	this._handlers[counter]=Function.emptyFunction;
	this._deadScripts.push(el);
		
	if(typeof result != "undefined"){
		if(onSuccess){ onSuccess(result, context); }
	}
	else{
		if(onFailure){ onFailure(context); }
	}
};
MySpace.Net.JsonpWebServiceProxy._counter=0;
MySpace.Net.JsonpWebServiceProxy._handlers=[];
MySpace.Net.JsonpWebServiceProxy._deadScripts=[];


//
// Ad targeting objects
//

if (!MySpace.Ads)
    MySpace.Ads = {};

if(!MySpace.Ads.Account)
    MySpace.Ads.Account={};

if (!MySpace.Ads.BandType)
    MySpace.Ads.BandType = {"Genre1":"","Genre2":"","Genre3":""};
// start MySpace IM code
function getIMwin(h,w) {
	var getIMurl = "http://www.myspace.com/Modules/IM/Pages/GetIM.aspx";
	var getIMh = h;
	var getIMw = w;
	var getIMleft = (screen.availwidth-w)/2;
	var getIMtop =(screen.availheight-h)/2;
	window.open(getIMurl,null,'height='+getIMh+',width='+getIMw+',left='+getIMleft+',top='+getIMtop+',status=no,toolbar=no,menubar=no,location=no');
}

function gotIM(){
	try{if (document.cookie && document.cookie.indexOf('imyspaceim') != -1)return true;}catch(err){}
	try{new ActiveXObject("MySpaceIMX.MySpaceIMPlugin.1");return true;}catch(err){}
	try{if(navigator.mimeTypes && navigator.mimeTypes.length>0)if(navigator.mimeTypes["application/myspaceim"])return true;}catch(err){}
	return false
}

/**
* Original IM invoker signature.  Taken over by WebIM to avoid tracing all
* invokation locations.
*/
function IsMySpaceIMInstalled(){
	MySpace.invokeWebIMWrapper();
}

function legacyIsMySpaceIMInstalled(){IsMySpaceIMInstalledById(get_url());}

function IsMySpaceIMInstalledById(fid){
	if(gotIM())window.location.href='myim:sendIM?uID=0&cID='+fid;
	else getIMwin(475,600);
}


/**
* Safe wrapper function for handling invoking WebIM.
* This encapsulates logic for degrading invokation
* 1. If logged out, redirect to login page.
* 2. WebIM, if available
* 2a.  If WebIM disabled in user settings but enabled in maint keys.
* 2b.  If WebIM is enabled in both settings and maint keys.
* 3. Desktop IM, if available
* 4. Desktop IM download page
* The object MySpace.ClientContext.ProfileFriend is currently
* emitted by the UserContactLinks control to the footer.
*/

MySpace.invokeWebIMWrapper = function (friendSpec) {
	if(!MySpace.ClientContext.IsLoggedIn){
		MySpace.enforceLogin();
		return;
	}
	if(friendSpec === undefined || friendSpec == null){
		if(MySpace.ClientContext.ProfileFriend){
			friendSpec = MySpace.ClientContext.ProfileFriend;
		}
		else{
			friendSpec = MySpace.ClientContext.DisplayFriendId;
		}
	}
	
	//add retry wait loop in case user clicks before WebIM loaded
	if(window.webimChatRetries === undefined || window.webimChatRetries == null){
		window.webimChatRetries = 0;
	}
	
	if(window.WebIM && window.webimChatRetries < 10){
		if( WebIM.Console && WebIM.Console.ConsoleUI && WebIM.Console.ConsoleUI.ready ) {
			if( WebIM.Manager.startIM ) {
				WebIM.Manager.startIM(friendSpec, {useDesktopClient: true});				
			}
			else {
				IsMySpaceIMInstalledById( friendSpec.id ? friendSpec.id : friendSpec );	
			}
		}
		//If WebIM is enabled in the config keys but disabled in the users setting, present option to enable WebIM.
		else if( WebIM.Config && WebIM.Config.WebIMSettingsURL && WebIM.Strings && WebIM.Strings.ENABLE_MYSPACEIM  ) {
			//first check if the desktop client is there.
			if( gotIM( ) ) {
				IsMySpaceIMInstalledById( friendSpec.id ? friendSpec.id : friendSpec );
				return;
			}
			var popout = MySpace.UI.Popup.create(WebIM.Strings.IMCALL_DISABLED_SETTINGS, WebIM.Strings.ENABLE_MYSPACEIM, function( ref, e ) {
				if( e && e.target && e.target.value && e.target.value.trim( ) === WebIM.Strings.IMCALL_SETTINGS_LINK ) {
					location.href = WebIM.Config.WebIMSettingsURL;
				}
			} );
			// add the buttons
			popout.add_button( WebIM.Strings.IMCALL_SETTINGS_LINK, true );
			popout.add_button( WebIM.Strings.CANCEL, false );
			//call the popout now
			popout.show( );
		}
		else { //load not complete, load error, or IM suppressed
			//attempt retry in expanding envelope until max failures
			var spaceTime = Math.min(5000, 100 * Math.pow(window.webimChatRetries, 2));
			window.setTimeout(function(){
				window.webimChatRetries++;
				MySpace.invokeWebIMWrapper(friendSpec);
			}, spaceTime);
		}
	}
	else{
		legacyIsMySpaceIMInstalled();
	}
};

// end MySpace IM code
MySpace.UI.DefaultTextboxBehavior=function(e){
	MySpace.UI.DefaultTextboxBehavior.initializeBase(this, [e]);
	
	this._defaultValue="";
};
MySpace.UI.DefaultTextboxBehavior.prototype={
	initialize:function(){
		MySpace.UI.DefaultTextboxBehavior.callBaseMethod(this, "initialize");
		var e = this.get_element();

		if (!this._defaultValue) {
			this._defaultValue = e.title;
		}
	
		this.set_value(e.value);
		
		this._focusHandler=Function.createDelegate(this, this._onFocus);
		$addHandler(e, "focus", this._focusHandler);
		this._blurHandler=Function.createDelegate(this, this._onBlur);
		$addHandler(e, "blur", this._blurHandler);
	},
	
	dispose:function(){
		$removeHandler(this.get_element(), "focus", this._focusHandler);
		$removeHandler(this.get_element(), "blur", this._blurHandler);
		MySpace.UI.DefaultTextboxBehavior.callBaseMethod(this, "dispose");
	},
	
	_onFocus:function(e){
		if(this.get_element().value==this._defaultValue){
			this.get_element().value="";
			this._updateClass();
		}
		
		this._fire_onFocus(this, e);
	},
	_onBlur:function(e){
		if(!this.get_element().value){
			this.get_element().value=this._defaultValue;
			this._updateClass();
		}
		
		this._fire_onBlur(this, e);
	},
	
	_updateClass:function(){
		var e=this.get_element();
		if(this._defaultValue && e.value==this._defaultValue){
			Sys.UI.DomElement.addCssClass(e, "msDefaultTextbox");
		}
		else{
			Sys.UI.DomElement.removeCssClass(e, "msDefaultTextbox");
		}
	},
	
	get_defaultValue:function(){ return this._defaultValue; },
	set_defaultValue:function(val){
		if(this.get_element().value==this._defaultValue){
			this.get_element().value=val;
		}
		this._defaultValue=val;
		this._updateClass();
	},
	
	get_value:function(){
		if(this.get_element().value==this._defaultValue){
			return "";
		}
		else{
			return this.get_element().value;
		}	
	},
	set_value:function(val){
		this.get_element().value=val || this._defaultValue;
		this._updateClass();
	},
	
	add_onFocus:function(handler){  
		this._get_events().addHandler("onfocus", handler);           
	},  
	remove_onFocus:function(handler){  
		this._get_events().removeHandler("onfocus", handler);        
	},
	
	add_onBlur:function(handler){  
		this._get_events().addHandler("onblur", handler);           
	},  
	remove_onBlur:function(handler){  
		this._get_events().removeHandler("onblur", handler);        
	},
	
	_fire_onFocus:function(sender, eventArgs){
		var handler=this._get_events().getHandler("onfocus");        
											
		if(handler){
			handler(this, eventArgs);                                 
		}
	},
	
	_fire_onBlur:function(sender, eventArgs){
		var handler=this._get_events().getHandler("onblur");        
											
		if(handler){
			handler(this, eventArgs);                                 
		}
	},
	
	_get_events:function(){  
		if(!this._events){
			this._events=new Sys.EventHandlerList();
		}
		return this._events;  
	}
};
MySpace.UI.DefaultTextboxBehavior.registerClass("MySpace.UI.DefaultTextboxBehavior", Sys.UI.Behavior);

(function() {
	Array.forEach($q('input.DefaultTextBox'), function(di) {
		$create(MySpace.UI.DefaultTextboxBehavior, null, null, null, di);
	});
})();
MySpace.UI._ProfileImageLink = new (function() {
	var ff2 = (Sys.Browser.agent == Sys.Browser.Firefox) && (Sys.Browser.version <= 2),
		 counter = 0,
		 images = [];
    
	MySpace.Application.add_DOMloaded(function() {
		if (!MySpace._ProfileImageLink) { return; }
		
		var links = MySpace.Utils.Selector.query("span.msProfileLink");
		for (var i = 0; i < links.length; i++) {
			MySpace.UI._ProfileImageLink.init(links[i]);
		}
	});
	
	this.init = function(el) {	
		if (el.style.width) {
			// Compute the frequency to insert word breaks, based on the width of the image,
			// assuming 8 pixels per character.
			var width = parseInt(el.style.width);
			MySpace.Util.applyWBRToElement(el, {frequency: Math.round(width / 8)});
			
			if (ff2) {
				el.style.overflow = "visible";
			}
		}
		
		var img = el.getElementsByTagName("img")[0];
		if (img) {
			img.onerror = Function.createPartial(window, onError, img);
			
			if (String(img.src).indexOf(".") > 0 && img.getAttribute("thsrc")) {
				counter++;
				images[counter] = {image: img, bgLoader: new Image()};
				images[counter].bgLoader.onload = Function.createPartial(window, onBgLoad, counter);
				images[counter].bgLoader.onerror = Function.createPartial(window, onError, img);
				images[counter].bgLoader.src = img.getAttribute("thsrc");
			}
		}
	};
	
	function onError(img) {
		img.onError = null;
		img.src = MySpace._ProfileImageLinkFailImage || (MySpace.StaticContentBase + "/modules/common/static/img/no_pic.gif");
	}
	
	function onBgLoad(j) {
		var bgLoader = images[j].bgLoader,
			image = images[j].image,
			maxWidth = parseInt(image.getAttribute("MaxWidth")),
			maxHeight = parseInt(image.getAttribute("MaxHeight")),
			centerImg = (image.getAttribute("CenterImg")=="True"),
			aspectHeight = maxHeight,
			aspectWidth = maxWidth,
			bgHeight = parseInt(bgLoader.height),
			bgWidth = parseInt(bgLoader.width);
		
		if (!(bgHeight && bgWidth)) {
			bgLoader.src = MySpace._ProfileImageLinkFailImage || (MySpace.StaticContentBase + "/modules/common/static/img/no_pic.gif");
			return;
		}
		bgLoader.onload = null;
		
		if (bgHeight < maxHeight && bgWidth > maxWidth) {
		    aspectHeight = (bgHeight/bgWidth) * maxWidth;
		} else if (bgHeight > maxHeight && bgWidth < maxWidth) {
		    aspectWidth = (maxHeight*bgWidth) / bgLoader.height;
		}
		
		var imgHeight = bgHeight * aspectWidth / bgWidth;
		var resize = (bgHeight > maxHeight) || (bgWidth > maxWidth);
		
		if (resize) {
			if (bgHeight > bgWidth) {
				image.style.height = aspectHeight + "px";
				image.style.maxHeight = aspectHeight + "px"; // Needed for Firefox2
				image.style.width = (bgWidth*aspectHeight/bgHeight) + "px";
			} else {
				image.style.height = imgHeight + "px";
				image.style.width = aspectWidth + "px";
			}
		} else {
			image.style.height = bgHeight + "px";
			image.style.maxHeight = bgHeight + "px"; // Needed for Firefox2
			image.style.width = bgWidth + "px";
		}
		
		if (centerImg && (imgHeight < maxHeight)) {
			// Center the image vertically
			var fixHeight = (maxHeight - imgHeight) / 2;
			if (fixHeight*2 < maxHeight) {
				image.style.paddingTop = image.style.paddingBottom = fixHeight + "px";
			}     
		}
		
		image.src = bgLoader.src;       
	}
})();
/*! SWFObject v2.1 <http://code.google.com/p/swfobject/>
	Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/

var swfobject = function() {
	
	var UNDEF = "undefined",
		OBJECT = "object",
		SHOCKWAVE_FLASH = "Shockwave Flash",
		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
		FLASH_MIME_TYPE = "application/x-shockwave-flash",
		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
		
		win = window,
		doc = document,
		nav = navigator,
		
		domLoadFnArr = [],
		regObjArr = [],
		objIdArr = [],
		listenersArr = [],
		script,
		timer = null,
		storedAltContent = null,
		storedAltContentId = null,
		isDomLoaded = false,
		isExpressInstallActive = false;
	
	/* Centralized function for browser feature detection
		- Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
		- User agent string detection is only used when no alternative is possible
		- Is executed directly for optimal performance
	*/	
	var ua = function() {
		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
			playerVersion = [0,0,0],
			d = null;
		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
			d = nav.plugins[SHOCKWAVE_FLASH].description;
			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
			}
		}
		else if (typeof win.ActiveXObject != UNDEF) {
			var a = null, fp6Crash = false;
			try {
				a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
			}
			catch(e) {
				try { 
					a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
					playerVersion = [6,0,21];
					a.AllowScriptAccess = "always";	 // Introduced in fp6.0.47
				}
				catch(e) {
					if (playerVersion[0] == 6) {
						fp6Crash = true;
					}
				}
				if (!fp6Crash) {
					try {
						a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
					}
					catch(e) {}
				}
			}
			if (!fp6Crash && a) { // a will return null when ActiveX is disabled
				try {
					d = a.GetVariable("$version");	// Will crash fp6.0.21/23/29
					if (d) {
						d = d.split(" ")[1].split(",");
						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
					}
				}
				catch(e) {}
			}
		}
		var u = nav.userAgent.toLowerCase(),
			p = nav.platform.toLowerCase(),
			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
			ie = false,
			windows = p ? /win/.test(p) : /win/.test(u),
			mac = p ? /mac/.test(p) : /mac/.test(u);
		/*@cc_on
			ie = true;
			@if (@_win32)
				windows = true;
			@elif (@_mac)
				mac = true;
			@end
		@*/
		return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
	}();

	/* Cross-browser onDomLoad
		- Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
		- Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
	*/ 
	var onDomLoad = function() {
		if (!ua.w3cdom) {
			return;
		}
		addDomLoadEvent(main);
		if (ua.ie && ua.win) {
			if (MySpace.Application.keyDisabled("FixSwfObjectLoad")) {
				try {	 // Avoid a possible Operation Aborted error
					doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 
					script = getElementById("__ie_ondomload");
					if (script) {
						addListener(script, "onreadystatechange", checkReadyState);
					}
				}
				catch(e) {}
			}
			else {
				// This alternative method for detecting DOMContentLoaded in IE is copied from
				// SWFObject 2.2beta.  The old way causes delays for some configurations, due to
				// the invalid URL "http://:/".
				
				doc.attachEvent("onreadystatechange", function() {
					if (doc.readyState == "complete") {
						doc.detachEvent("onreadystatechange", arguments.callee);
						callDomLoadFunctions();
					}
				});
				if (win == top) { // if not inside an iframe
					(function(){
						if (isDomLoaded) { return; }
						try {
							doc.documentElement.doScroll("left");
						}
						catch(e) {
							setTimeout(arguments.callee, 0);
							return;
						}
						callDomLoadFunctions();
					})();
				}
			}
		}
		if (ua.webkit && typeof doc.readyState != UNDEF) {
			timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
		}
		if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
		}
		addLoadEvent(callDomLoadFunctions);
	}();
	
	function checkReadyState() {
		if (script.readyState == "complete") {
			script.parentNode.removeChild(script);
			callDomLoadFunctions();
		}
	}
	
	function callDomLoadFunctions() {
		if (isDomLoaded) {
			return;
		}
		if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
			var s = createElement("span");
			try { // Avoid a possible Operation Aborted error
				var t = doc.getElementsByTagName("body")[0].appendChild(s);
				t.parentNode.removeChild(t);
			}
			catch (e) {
				return;
			}
		}
		isDomLoaded = true;
		if (timer) {
			clearInterval(timer);
			timer = null;
		}
		var dl = domLoadFnArr.length;
		for (var i = 0; i < dl; i++) {
			domLoadFnArr[i]();
		}
	}
	
	function addDomLoadEvent(fn) {
		if (isDomLoaded) {
			fn();
		}
		else { 
			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
		}
	}
	
	/* Cross-browser onload
		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
		- Will fire an event as soon as a web page including all of its assets are loaded 
	 */
	function addLoadEvent(fn) {
		if (typeof win.addEventListener != UNDEF) {
			win.addEventListener("load", fn, false);
		}
		else if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("load", fn, false);
		}
		else if (typeof win.attachEvent != UNDEF) {
			addListener(win, "onload", fn);
		}
		else if (typeof win.onload == "function") {
			var fnOld = win.onload;
			win.onload = function() {
				fnOld();
				fn();
			};
		}
		else {
			win.onload = fn;
		}
	}
	
	/* Main function
		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
	*/
	function main() { // Static publishing only
		var rl = regObjArr.length;
		for (var i = 0; i < rl; i++) { // For each registered object element
			var id = regObjArr[i].id;
			if (ua.pv[0] > 0) {
				var obj = getElementById(id);
				if (obj) {
					regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
					regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
					if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
						if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
							fixParams(obj);
						}
						setVisibility(id, true);
					}
					else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
						showExpressInstall(regObjArr[i]);
					}
					else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
						displayAltContent(obj);
					}
				}
			}
			else {	// If no fp is installed, we let the object element do its job (show alternative content)
				setVisibility(id, true);
			}
		}
	}
	
	/* Fix nested param elements, which are ignored by older webkit engines
		- This includes Safari up to and including version 1.2.2 on Mac OS 10.3
		- Fall back to the proprietary embed element
	*/
	function fixParams(obj) {
		var nestedObj = obj.getElementsByTagName(OBJECT)[0];
		if (nestedObj) {
			var e = createElement("embed"), a = nestedObj.attributes;
			if (a) {
				var al = a.length;
				for (var i = 0; i < al; i++) {
					if (a[i].nodeName == "DATA") {
						e.setAttribute("src", a[i].nodeValue);
					}
					else {
						e.setAttribute(a[i].nodeName, a[i].nodeValue);
					}
				}
			}
			var c = nestedObj.childNodes;
			if (c) {
				var cl = c.length;
				for (var j = 0; j < cl; j++) {
					if (c[j].nodeType == 1 && c[j].nodeName == "PARAM") {
						e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
					}
				}
			}
			obj.parentNode.replaceChild(e, obj);
		}
	}
	
	/* Show the Adobe Express Install dialog
		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
	*/
	function showExpressInstall(regObj) {
		isExpressInstallActive = true;
		var obj = getElementById(regObj.id);
		if (obj) {
			if (regObj.altContentId) {
				var ac = getElementById(regObj.altContentId);
				if (ac) {
					storedAltContent = ac;
					storedAltContentId = regObj.altContentId;
				}
			}
			else {
				storedAltContent = abstractAltContent(obj);
			}
			if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
				regObj.width = "310";
			}
			if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
				regObj.height = "137";
			}
			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
				dt = doc.title,
				fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
				replaceId = regObj.id;
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			if (ua.ie && ua.win && obj.readyState != 4) {
				var newObj = createElement("div");
				replaceId += "SWFObjectNew";
				newObj.setAttribute("id", replaceId);
				obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
				obj.style.display = "none";
				var fn = function() {
					obj.parentNode.removeChild(obj);
				};
				addListener(win, "onload", fn);
			}
			createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
		}
	}
	
	/* Functions to abstract and display alternative content
	*/
	function displayAltContent(obj) {
		if (ua.ie && ua.win && obj.readyState != 4) {
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			var el = createElement("div");
			obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
			el.parentNode.replaceChild(abstractAltContent(obj), el);
			obj.style.display = "none";
			var fn = function() {
				obj.parentNode.removeChild(obj);
			};
			addListener(win, "onload", fn);
		}
		else {
			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
		}
	} 

	function abstractAltContent(obj) {
		var ac = createElement("div");
		if (ua.win && ua.ie) {
			ac.innerHTML = obj.innerHTML;
		}
		else {
			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
			if (nestedObj) {
				var c = nestedObj.childNodes;
				if (c) {
					var cl = c.length;
					for (var i = 0; i < cl; i++) {
						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
							ac.appendChild(c[i].cloneNode(true));
						}
					}
				}
			}
		}
		return ac;
	}
	
	/* Cross-browser dynamic SWF creation
	*/
	function createSWF(attObj, parObj, id) {
		var r, el = getElementById(id);
		if (el) {
			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
				attObj.id = id;
			}
			if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
				var att = "";
				for (var i in attObj) {
					if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
						if (i.toLowerCase() == "data") {
							parObj.movie = attObj[i];
						}
						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							att += ' class="' + attObj[i] + '"';
						}
						else if (i.toLowerCase() != "classid") {
							att += ' ' + i + '="' + attObj[i] + '"';
						}
					}
				}
				var par = "";
				for (var j in parObj) {
					if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
					}
				}
				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
				objIdArr[objIdArr.length] = attObj.id; // Stored to fix object 'leaks' on unload (dynamic publishing only)
				r = getElementById(attObj.id);	
			}
			else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
				var e = createElement("embed");
				e.setAttribute("type", FLASH_MIME_TYPE);
				for (var k in attObj) {
					if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
						if (k.toLowerCase() == "data") {
							e.setAttribute("src", attObj[k]);
						}
						else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							e.setAttribute("class", attObj[k]);
						}
						else if (k.toLowerCase() != "classid") { // Filter out IE specific attribute
							e.setAttribute(k, attObj[k]);
						}
					}
				}
				for (var l in parObj) {
					if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
						if (l.toLowerCase() != "movie") { // Filter out IE specific param element
							e.setAttribute(l, parObj[l]);
						}
					}
				}
				el.parentNode.replaceChild(e, el);
				r = e;
			}
			else { // Well-behaving browsers
				var o = createElement(OBJECT);
				o.setAttribute("type", FLASH_MIME_TYPE);
				for (var m in attObj) {
					if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							o.setAttribute("class", attObj[m]);
						}
						else if (m.toLowerCase() != "classid") { // Filter out IE specific attribute
							o.setAttribute(m, attObj[m]);
						}
					}
				}
				for (var n in parObj) {
					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
						createObjParam(o, n, parObj[n]);
					}
				}
				el.parentNode.replaceChild(o, el);
				r = o;
			}
		}
		return r;
	}
	
	function createObjParam(el, pName, pValue) {
		var p = createElement("param");
		p.setAttribute("name", pName);	
		p.setAttribute("value", pValue);
		el.appendChild(p);
	}
	
	/* Cross-browser SWF removal
		- Especially needed to safely and completely remove a SWF in Internet Explorer
	*/
	function removeSWF(id) {
		var obj = getElementById(id);
		if (obj && (obj.nodeName == "OBJECT" || obj.nodeName == "EMBED")) {
			if (ua.ie && ua.win) {
				if (obj.readyState == 4) {
					removeObjectInIE(id);
				}
				else {
					win.attachEvent("onload", function() {
						removeObjectInIE(id);
					});
				}
			}
			else {
				obj.parentNode.removeChild(obj);
			}
		}
	}
	
	function removeObjectInIE(id) {
		var obj = getElementById(id);
		if (obj) {
			for (var i in obj) {
				if (typeof obj[i] == "function") {
					obj[i] = null;
				}
			}
			obj.parentNode.removeChild(obj);
		}
	}
	
	/* Functions to optimize JavaScript compression
	*/
	function getElementById(id) {
		var el = null;
		try {
			el = doc.getElementById(id);
		}
		catch (e) {}
		return el;
	}
	
	function createElement(el) {
		return doc.createElement(el);
	}
	
	/* Updated attachEvent function for Internet Explorer
		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
	*/	
	function addListener(target, eventType, fn) {
		target.attachEvent(eventType, fn);
		listenersArr[listenersArr.length] = [target, eventType, fn];
	}
	
	/* Flash Player and SWF content version matching
	*/
	function hasPlayerVersion(rv) {
		var pv = ua.pv, v = rv.split(".");
		v[0] = parseInt(v[0], 10);
		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
		v[2] = parseInt(v[2], 10) || 0;
		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
	}
	
	/* Cross-browser dynamic CSS creation
		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
	*/	
	function createCSS(sel, decl) {
		if (ua.ie && ua.mac) {
			return;
		}
		var h = doc.getElementsByTagName("head")[0], s = createElement("style");
		s.setAttribute("type", "text/css");
		s.setAttribute("media", "screen");
		if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
			s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
		}
		h.appendChild(s);
		if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
			var ls = doc.styleSheets[doc.styleSheets.length - 1];
			if (typeof ls.addRule == OBJECT) {
				ls.addRule(sel, decl);
			}
		}
	}
	
	function setVisibility(id, isVisible) {
		var v = isVisible ? "visible" : "hidden";
		if (isDomLoaded && getElementById(id)) {
			getElementById(id).style.visibility = v;
		}
		else {
			createCSS("#" + id, "visibility:" + v);
		}
	}

	/* Filter to avoid XSS attacks 
	*/
	function urlEncodeIfNecessary(s) {
		var regex = /[\\\"<>\.;]/;
		var hasBadChars = regex.exec(s) != null;
		return hasBadChars ? encodeURIComponent(s) : s;
	}
	
	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
	*/
	var cleanup = function() {
		if (ua.ie && ua.win) {
			window.attachEvent("onunload", function() {
				// remove listeners to avoid memory leaks
				var ll = listenersArr.length;
				for (var i = 0; i < ll; i++) {
					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
				}
				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
				var il = objIdArr.length;
				for (var j = 0; j < il; j++) {
					removeSWF(objIdArr[j]);
				}
				// cleanup library's main closures to avoid memory leaks
				for (var k in ua) {
					ua[k] = null;
				}
				ua = null;
				for (var l in swfobject) {
					swfobject[l] = null;
				}
				swfobject = null;
			});
		}
	}();
	
	
	return {
		/* Public API
			- Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
		*/ 
		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
			if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
				return;
			}
			var regObj = {};
			regObj.id = objectIdStr;
			regObj.swfVersion = swfVersionStr;
			regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
			regObjArr[regObjArr.length] = regObj;
			setVisibility(objectIdStr, false);
		},
		
		getObjectById: function(objectIdStr) {
			var r = null;
			if (ua.w3cdom) {
				var o = getElementById(objectIdStr);
				if (o) {
					var n = o.getElementsByTagName(OBJECT)[0];
					if (!n || (n && typeof o.SetVariable != UNDEF)) {
							r = o;
					}
					else if (typeof n.SetVariable != UNDEF) {
						r = n;
					}
				}
			}
			return r;
		},
		
		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
			if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
				return;
			}
			widthStr += ""; // Auto-convert to string
			heightStr += "";
			if (hasPlayerVersion(swfVersionStr)) {
				setVisibility(replaceElemIdStr, false);
				var att = {};
				if (attObj && typeof attObj === OBJECT) {
					for (var i in attObj) {
						if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
							att[i] = attObj[i];
						}
					}
				}
				att.data = swfUrlStr;
				att.width = widthStr;
				att.height = heightStr;
				var par = {}; 
				if (parObj && typeof parObj === OBJECT) {
					for (var j in parObj) {
						if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
							par[j] = parObj[j];
						}
					}
				}
				if (flashvarsObj && typeof flashvarsObj === OBJECT) {
					for (var k in flashvarsObj) {
						if (flashvarsObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
							if (typeof par.flashvars != UNDEF) {
								par.flashvars += "&" + k + "=" + flashvarsObj[k];
							}
							else {
								par.flashvars = k + "=" + flashvarsObj[k];
							}
						}
					}
				}
				addDomLoadEvent(function() {
					createSWF(att, par, replaceElemIdStr);
					if (att.id == replaceElemIdStr) {
						setVisibility(replaceElemIdStr, true);
					}
				});
			}
			else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
				isExpressInstallActive = true; // deferred execution
				setVisibility(replaceElemIdStr, false);
				addDomLoadEvent(function() {
					var regObj = {};
					regObj.id = regObj.altContentId = replaceElemIdStr;
					regObj.width = widthStr;
					regObj.height = heightStr;
					regObj.expressInstall = xiSwfUrlStr;
					showExpressInstall(regObj);
				});
			}
		},
		
		getFlashPlayerVersion: function() {
			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
		},
		
		hasFlashPlayerVersion: hasPlayerVersion,
		
		createSWF: function(attObj, parObj, replaceElemIdStr) {
			if (ua.w3cdom) {
				return createSWF(attObj, parObj, replaceElemIdStr);
			}
			else {
				return undefined;
			}
		},
		
		removeSWF: function(objElemIdStr) {
			if (ua.w3cdom) {
				removeSWF(objElemIdStr);
			}
		},
		
		createCSS: function(sel, decl) {
			if (ua.w3cdom) {
				createCSS(sel, decl);
			}
		},
		
		addDomLoadEvent: addDomLoadEvent,
		
		addLoadEvent: addLoadEvent,
		
		getQueryParamValue: function(param) {
			var q = doc.location.search || doc.location.hash;
			if (param == null) {
				return urlEncodeIfNecessary(q);
			}
			if (q) {
				var pairs = q.substring(1).split("&");
				for (var i = 0; i < pairs.length; i++) {
					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
					}
				}
			}
			return "";
		},
		
		// For internal usage only
		expressInstallCallback: function() {
			if (isExpressInstallActive && storedAltContent) {
				var obj = getElementById(EXPRESS_INSTALL_ID);
				if (obj) {
					obj.parentNode.replaceChild(storedAltContent, obj);
					if (storedAltContentId) {
						setVisibility(storedAltContentId, true);
						if (ua.ie && ua.win) {
							storedAltContent.style.display = "block";
						}
					}
					storedAltContent = null;
					storedAltContentId = null;
					isExpressInstallActive = false;
				}
			} 
		}
	};
}();

