nlsEffectList = {
    barn: "progid:DXImageTransform.Microsoft.Barn(Duration=0.3,motion=out,orientation=vertical);",
    blinds: "progid:DXImageTransform.Microsoft.Blinds(Duration=0.3,Bands=8,direction=right);",
    checkerboard: "progid:DXImageTransform.Microsoft.Checkerboard(Duration=0.3,Direction=right,SquaresX=20,SquaresY=20);",
    fade: "progid:DXImageTransform.Microsoft.Fade(Duration=0.3,Overlap=1.00);",
    inset: "progid:DXImageTransform.Microsoft.Inset(Duration=0.3);",
    iris: "progid:DXImageTransform.Microsoft.Iris(Duration=0.3,irisstyle=CIRCLE,motion=in);",
    pixelate: "progid:DXImageTransform.Microsoft.Pixelate(Duration=0.3,MaxSquare=10);",
    radialwipe: "progid:DXImageTransform.Microsoft.RadialWipe(Duration=0.3,wipestyle=WEDGE)",
    randombars: "progid:DXImageTransform.Microsoft.RandomBars(Duration=0.3,Orientation=horizontal);",
    randomdissolve: "progid:DXImageTransform.Microsoft.RandomDissolve(duration=0.3);",
    slide: "progid:DXImageTransform.Microsoft.Slide(Duration=0.3,slidestyle=HIDE,Bands=5);",
    spiral: "progid:DXImageTransform.Microsoft.Spiral(Duration=0.3,GridSizeX=64,GridSizeY=64);",
    stretch: "progid:DXImageTransform.Microsoft.Stretch(Duration=0.3,stretchstyle=HIDE);",
    strips: "progid:DXImageTransform.Microsoft.Strips(Duration=0.3,motion=rightdown);",
    wheel: "progid:DXImageTransform.Microsoft.Wheel(Duration=0.3,spokes=10);",
    gradienwipe: "progid:DXImageTransform.Microsoft.GradientWipe(Duration=0.3,GradientSize=0.75,wipestyle=0,motion=forward);",
    zigzag: "progid:DXImageTransform.Microsoft.Zigzag(Duration=0.3,GridSizeX=8,GridSizeY=8);",
    itemfade: "progid:DXImageTransform.Microsoft.Fade(Duration=0.2,Overlap=0.75);",
    itemdissolve: "progid:DXImageTransform.Microsoft.RandomDissolve(duration=0.3);",
    aoslide: "Duration:2"
};
function NlsMenuEffect(mId, effName) {
    this.mId = mId;
    this.elm = null;
    this.effName = effName;
    this.isOut = false;
    this.prop = new Object();
    this.onShow = function() {};
    this.onHide = function() {};
    this.start = _defStart;
    this.run = _defRun;
    if (effName == "aoslide") {
        this.start = _slideStart;
        this.run = _slideRun
    }
    return this
};
_fadeTm = null;
_fadesEff = new Object();
function _defStart(isOut) {
    var mn = NlsMenu.$GE(this.mId);
    mn.childNodes[0].style.position = "";
    nlsMenu[this.mId].rt.ready = true;
    this.elm = NlsMenu.$GE("effwin_" + this.mId);
    if (nls_isIE) {
        this.elm.style.filter = nlsEffectList[this.effName];
        if (this.elm.filters.length > 0) this.elm.filters[0].apply();
    } else {
        this.elm = this.elm.parentNode;
        this.isOut = (isOut == true);
        if (!this.prop["init"]) {
            this.elm.style.MozOpacity = (isOut ? 1 : 0);
            this.elm.style.opacity = (isOut ? 1 : 0);
        }
        this.prop["init"] = true;
        this.prop["dur"] = 15;
        this.prop["rng"] = 100;
        this.prop["spd"] = 10
    }
};
function _defRun() {
    if (nls_isIE) {
        if (this.elm.filters.length > 0) this.elm.filters[0].play();
    } else {
        var me = this;
        if (this.elm.style.MozOpacity) this.prop["opa"] = "MozOpacity";
        else this.prop["opa"] = "opacity";
        var p = new Object();
        p.x1 = this.elm.style[this.prop["opa"]] * this.prop["rng"];
        if (this.isOut) {
            p.x2 = 0
        } else {
            p.x2 = this.prop["rng"] - 1
        }
        _fc_fade(p);
        this.prop["pt"] = p;
        this.prop["sd"] = 0;
        _fadesEff[this.mId] = this;
        if (!_fadeTm) _fadeTm = setInterval(function() {
            _fadeAnimate();
        },
        this.prop["spd"]);
    }
};
function _fadeAnimate() {
    var b = true;
    for (var it in _fadesEff) {
        var eff = _fadesEff[it];
        var p = eff.prop["pt"];
        if (eff.prop["sd"] < eff.prop["dur"]) {
            eff.prop["sd"]++;
            eff.elm.style[eff.prop["opa"]] = effect_bezier(eff.prop["sd"] / eff.prop["dur"], p.x1, p.x2, p.c1, p.c2) / eff.prop["rng"]
        } else {
            eff.elm.style[eff.prop["opa"]] = p.x2 / eff.prop["rng"];
            if (eff.isOut) {
                eff.onHide();
                eff.elm.style[eff.prop["opa"]] = 0
            } else {
                eff.onShow();
            }
            delete _fadesEff[eff.mId]
        }
        b = false
    }
    if (b) {
        clearInterval(_fadeTm);
        _fadeTm = null
    }
};
_slideTm = null;
_slidesEff = new Object();
function _slideStart(isOut) {
    var mn = NlsMenu.$GE(this.mId);
    this.elm = mn.childNodes[0];
    if (!isOut && this.prop["init"] != true) {
        this.elm.style.position = "";
        var w = this.elm.offsetWidth;
        var h = this.elm.offsetHeight;
        with(mn.style) {
            overflow = "hidden";
            width = w + "px";
            height = h + "px"
        };
        with(this.elm.style) {
            position = nls_isIE ? "absolute": "relative";
            switch (this.prop["dir"]) {
            case "right":
                top = "0px";
                left = -w + "px";
                this.prop["st"] = "left";
                break;
            case "left":
                top = "0px";
                left = w + "px";
                this.prop["st"] = "left";
                break;
            case "down":
                top = -h + "px";
                left = "0px";
                this.prop["st"] = "top";
                break;
            case "up":
                top = h + "px";
                left = "0px";
                this.prop["st"] = "top";
                break
            }
        };
        this.prop["mw"] = w;
        this.prop["mh"] = h;
        if (!nls_isIE) this.prop["init"] = true
    }
    this.prop["dur"] = parseFloat(nlsEffectList[this.effName].split(":")[1]) * 10;
    this.prop["spd"] = 15;
    this.isOut = (isOut == true);
    nlsMenu[this.mId].rt.ready = false
};
function _slideRun() {
    var me = this;
    var p = new Object();
    var l = parseInt(this.elm.style.left);
    var t = parseInt(this.elm.style.top);
    var c = this.isOut ? 1 : 0;
    switch (this.prop["dir"]) {
    case "right":
        p.x1 = l;
        p.x2 = -this.prop["mw"] * c;
        break;
    case "left":
        p.x1 = l;
        p.x2 = this.prop["mw"] * c;
        break;
    case "down":
        p.x1 = t;
        p.x2 = -this.prop["mh"] * c;
        break;
    case "up":
        p.x1 = t;
        p.x2 = this.prop["mh"] * c;
        break
    };
    _fc_slide(p);
    this.prop["pt"] = p;
    this.prop["sd"] = 0;
    _slidesEff[this.mId] = this;
    if (!_slideTm) _slideTm = setInterval(function() {
        _slideAnimate();
    },
    this.prop["spd"]);
};
function _slideAnimate() {
    var b = true;
    for (var it in _slidesEff) {
        var eff = _slidesEff[it];
        var p = eff.prop["pt"];
        if (eff.prop["sd"] < eff.prop["dur"]) {
            eff.elm.style[eff.prop["st"]] = effect_bezier(eff.prop["sd"] / eff.prop["dur"], p.x1, p.x2, p.c1, p.c2) + "px";
            eff.prop["sd"]++
        } else {
            eff.elm.style[eff.prop["st"]] = p.x2 + "px";
            if (eff.isOut) {
                eff.onHide();
            } else {
                nlsMenu[eff.mId].rt.ready = true;
                eff.onShow();
            }
            delete _slidesEff[eff.mId]
        }
        b = false
    }
    if (b) {
        clearInterval(_slideTm);
        _slideTm = null
    }
};
function _fc_fade(p) {
    p.c1 = p.x1 + (p.x2 - p.x1) * 2 / 3;
    p.c2 = p.x2
};
function _fc_slide(p) {
    p.c1 = p.x1 + (p.x2 - p.x1) * 2 / 3;
    p.c2 = p.x2
};
function _f1(t) {
    return (1 - t);
};
function _f2(t) {
    return (1 - t) * (1 - t);
};
function _f3(t) {
    return (1 - t) * (1 - t) * (1 - t);
};
function _f4(t) {
    return t * t * t
};
function effect_bezier(t, x1, x2, c1, c2) {
    return _f3(t) * x1 + 3 * t * _f2(t) * c1 + 3 * t * t * _f1(t) * c2 + _f4(t) * x2
};
function NlsMenuItemEffect(itemId, effName) {
    this.tmId = null;
    this.itemId = itemId;
    this.elm = null;
    this.effName = effName
};
NlsMenuItemEffect.prototype.init = function() {
    if (!nls_isIE) return;
    if (this.elm == null) this.elm = NlsMenu.$GE(this.itemId);
    if (nlsEffectList[this.effName]) this.elm.style.filter = nlsEffectList[this.effName];
    if (this.elm.filters.length > 0) this.elm.filters[0].apply();
};
NlsMenuItemEffect.prototype.start = function() {
    if (!nls_isIE) return;
    if (this.elm.filters.length > 0) this.elm.filters[0].play();
};
NLSMENU.applyBorder = function(bTop, bBottom, bLeft, bRight) {
    if (!bTop && !bBottom && !bLeft && !bRight) {
        this.customBorder = null
    } else {
        this.customBorder = new NlsMenuBorder(bTop, bBottom, bLeft, bRight);
    }
};
function NlsMenuBorder(bTop, bBottom, bLeft, bRight) {
    var border = "<table cellpadding=0 cellspacing=0>";
    var sTop = "",
    sBottom = "",
    sLeft = "",
    sRight = "";
    if (bTop) sTop = "<td><table width='100%' cellpadding=0 cellspacing=0><tr><td class='@stlprf_mtop'></td></tr></table></td>";
    if (bBottom) sBottom = "<td><table width='100%' cellpadding=0 cellspacing=0><tr><td class='@stlprf_mbottom'></td></tr></table></td>";
    if (bLeft) {
        sLeft = "<td height='100%' class='@stlprf_mleft' style='font-size:1pt;'>&nbsp;</td>";
        if (bTop) sTop = "<td class='@stlprf_mtopleft'></td>" + sTop;
        if (bBottom) sBottom = "<td class='@stlprf_mbottomleft'></td>" + sBottom
    }
    if (bRight) {
        sRight = "<td height='100%' class='@stlprf_mright' style='font-size:1pt;'>&nbsp;</td>";
        if (bTop) sTop += "<td class='@stlprf_mtopright'></td>";
        if (bBottom) sBottom += "<td class='@stlprf_mbottomright'></td>"
    }
    if (sTop != "") sTop = "<tr>" + sTop + "</tr>";
    if (sBottom != "") sBottom = "<tr>" + sBottom + "</tr>";
    border += sTop + "<tr height='100%'>" + sLeft + "<td>@menu</td>" + sRight + "</tr>" + sBottom;
    border += "</table>";
    this.applyBorder = function(smenu, stlprf) {
        var b = border.replace(/@stlprf_/gi, stlprf);
        return b.replace(/@menu/gi, smenu);
    };
    return this
};