﻿var ns4 = (navigator.appName.indexOf("Netscape") != -1 && !document.getElementById);

if (!window.JSFX)
    JSFX = new Object();

JSFX.layerNo = 0;
/**********************************************************************************/
JSFX.createLayer = function(htmlStr, parent) {
    var elem = null;

    if (document.layers) {
        var xName = "xLayer" + JSFX.layerNo++;
        if (parent == null)
            elem = new Layer(2000);
        else
            elem = new Layer(2000, parent.elem);

        elem.document.open();
        elem.document.write(htmlStr);
        elem.document.close();
        elem.moveTo(0, 0);
        elem.innerHTML = htmlStr;
    }
    else
        if (document.all) {
        if (parent == null)
            parent = document.body;
        else
            parent = parent.elem;

        var xName = "xLayer" + JSFX.layerNo++;
        var txt = '<DIV ID="' + xName + '"'
			+ ' STYLE="position:absolute;left:0;top:0;visibility:hidden">'
			+ htmlStr
			+ '</DIV>';

        parent.insertAdjacentHTML("BeforeEnd", txt);

        elem = document.all[xName];
    }
    else
        if (document.getElementById) {
        if (parent == null)
            parent = document.body;
        else
            parent = parent.elem;

        var xName = "xLayer" + JSFX.layerNo++;
        var txt = ""
			+ "position:absolute;left:0px;top:0px;visibility:hidden";

        var newRange = document.createRange();

        elem = document.createElement("DIV");
        elem.setAttribute("style", txt);
        elem.setAttribute("id", xName);

        parent.appendChild(elem);

        newRange.setStartBefore(elem);
        strFrag = newRange.createContextualFragment(htmlStr);
        elem.appendChild(strFrag);
    }

    return elem;
}
/**********************************************************************************/
JSFX.Layer = function(newLayer, parent) {
    if (!newLayer)
        return;

    if (typeof newLayer == "string")
        this.elem = JSFX.createLayer(newLayer, parent);
    else
        this.elem = newLayer;

    if (document.layers) {
        this.images = this.elem.document.images;
        this.parent = parent;
        this.style = this.elem;
        if (parent != null)
            this.style.visibility = "inherit";
    }
    else {
        this.images = document.images;
        this.parent = parent;
        this.style = this.elem.style;
    }
    window[this.elem.id] = this; //save a reference to this
}
/**********************************************************************************/
JSFX.findLayer = function(theDiv, d) {
    if (document.layers) {
        var i;
        if (d == null) d = document;
        var theLayer = d.layers[theDiv];
        if (theLayer != null)
            return (theLayer);
        else
            for (i = 0; i < d.layers.length; i++) {
            theLayer = JSFX.findLayer(theDiv, d.layers[i].document);
            if (theLayer != null)
                return (theLayer);
        }
        return ("Undefined....");
    }
    else
        if (document.all)
        return (document.all[theDiv]);
    else
        if (document.getElementById)
        return (document.getElementById(theDiv));
    else
        return ("Undefined.....");
}

/**********************************************************************************/
/*** moveTo (x,y) ***/
JSFX.Layer.prototype.moveTo = function(x, y) {
    this.style.left = x + "px";
    this.style.top = y + "px";
}
if (ns4)
    JSFX.Layer.prototype.moveTo = function(x, y) { this.elem.moveTo(x, y); }
/**********************************************************************************/
/*** show()/hide() Visibility ***/
JSFX.Layer.prototype.show = function() { this.style.visibility = "visible"; }
JSFX.Layer.prototype.hide = function() { this.style.visibility = "hidden"; }
JSFX.Layer.prototype.isVisible = function() { return this.style.visibility == "visible"; }
if (ns4) {
    JSFX.Layer.prototype.show = function() { this.style.visibility = "show"; }
    JSFX.Layer.prototype.hide = function() { this.style.visibility = "hide"; }
    JSFX.Layer.prototype.isVisible = function() { return this.style.visibility == "show"; }
}
/**********************************************************************************/
/*** zIndex ***/
JSFX.Layer.prototype.setzIndex = function(z) { this.style.zIndex = z; }
JSFX.Layer.prototype.getzIndex = function() { return this.style.zIndex; }
/**********************************************************************************/
/*** ForeGround (text) Color ***/
JSFX.Layer.prototype.setColor = function(c) { this.style.color = c; }
if (ns4)
    JSFX.Layer.prototype.setColor = function(c) {
        this.elem.document.write("<FONT COLOR='" + c + "'>" + this.elem.innerHTML + "</FONT>");
        this.elem.document.close();
    }
/**********************************************************************************/
/*** BackGround Color ***/
JSFX.Layer.prototype.setBgColor = function(color) { this.style.backgroundColor = color == null ? 'transparent' : color; }
if (ns4)
    JSFX.Layer.prototype.setBgColor = function(color) { this.elem.bgColor = color; }
/**********************************************************************************/
/*** BackGround Image ***/
JSFX.Layer.prototype.setBgImage = function(image) { this.style.backgroundImage = "url(" + image + ")"; }
if (ns4)
    JSFX.Layer.prototype.setBgImage = function(image) { this.style.background.src = image; }
/**********************************************************************************/
/*** set Content***/
JSFX.Layer.prototype.setContent = function(xHtml) { this.elem.innerHTML = xHtml; }
if (ns4)
    JSFX.Layer.prototype.setContent = function(xHtml) {
        this.elem.document.write(xHtml);
        this.elem.document.close();
        this.elem.innerHTML = xHtml;
    }

/**********************************************************************************/
/*** Clipping ***/
JSFX.Layer.prototype.clip = function(x1, y1, x2, y2) { this.style.clip = "rect(" + y1 + " " + x2 + " " + y2 + " " + x1 + ")"; }
if (ns4)
    JSFX.Layer.prototype.clip = function(x1, y1, x2, y2) {
        this.style.clip.top = y1;
        this.style.clip.left = x1;
        this.style.clip.bottom = y2;
        this.style.clip.right = x2;
    }
/**********************************************************************************/
/*** Resize ***/
JSFX.Layer.prototype.resizeTo = function(w, h) {
    this.style.width = w + "px";
    this.style.height = h + "px";
}
if (ns4)
    JSFX.Layer.prototype.resizeTo = function(w, h) {
        this.style.clip.width = w;
        this.style.clip.height = h;
    }
/**********************************************************************************/
/*** getX/Y ***/
JSFX.Layer.prototype.getX = function() { return parseInt(this.style.left); }
JSFX.Layer.prototype.getY = function() { return parseInt(this.style.top); }
if (ns4) {
    JSFX.Layer.prototype.getX = function() { return this.style.left; }
    JSFX.Layer.prototype.getY = function() { return this.style.top; }
}
/**********************************************************************************/
/*** getWidth/Height ***/
JSFX.Layer.prototype.getWidth = function() { return this.elem.offsetWidth; }
JSFX.Layer.prototype.getHeight = function() { return this.elem.offsetHeight; }
if (!document.getElementById)
    JSFX.Layer.prototype.getWidth = function() {
        //Extra processing here for clip
        return this.elem.scrollWidth;
    }

if (ns4) {
    JSFX.Layer.prototype.getWidth = function() { return this.style.clip.right; }
    JSFX.Layer.prototype.getHeight = function() { return this.style.clip.bottom; }
}
/**********************************************************************************/
/*** Opacity ***/
if (ns4) {
    JSFX.Layer.prototype.setOpacity = function(pc) { return 0; }
}
else if (document.all) {
    JSFX.Layer.prototype.setOpacity = function(pc) {
        if (this.style.filter == "")
            this.style.filter = "alpha(opacity=100);";
        this.elem.filters.alpha.opacity = pc;
    }
}
else {
    /*** Assume NS6 ***/
    JSFX.Layer.prototype.setOpacity = function(pc) { this.style.MozOpacity = pc + '%' }
}
/**************************************************************************/
/*** Event Handling - Start ***/
/*** NS4 ***/
if (ns4) {
    JSFX.eventmasks = {
        onabort: Event.ABORT, onblur: Event.BLUR, onchange: Event.CHANGE,
        onclick: Event.CLICK, ondblclick: Event.DBLCLICK,
        ondragdrop: Event.DRAGDROP, onerror: Event.ERROR,
        onfocus: Event.FOCUS, onkeydown: Event.KEYDOWN,
        onkeypress: Event.KEYPRESS, onkeyup: Event.KEYUP, onload: Event.LOAD,
        onmousedown: Event.MOUSEDOWN, onmousemove: Event.MOUSEMOVE,
        onmouseout: Event.MOUSEOUT, onmouseover: Event.MOUSEOVER,
        onmouseup: Event.MOUSEUP, onmove: Event.MOVE, onreset: Event.RESET,
        onresize: Event.RESIZE, onselect: Event.SELECT, onsubmit: Event.SUBMIT,
        onunload: Event.UNLOAD
    };
    JSFX.Layer.prototype.addEventHandler = function(eventname, handler) {
        this.elem.captureEvents(JSFX.eventmasks[eventname]);
        var xl = this;
        this.elem[eventname] = function(event) {
            event.clientX = event.pageX;
            event.clientY = event.pageY;
            event.button = event.which;
            event.keyCode = event.which;
            event.altKey = ((event.modifiers & Event.ALT_MASK) != 0);
            event.ctrlKey = ((event.modifiers & Event.CONTROL_MASK) != 0);
            event.shiftKey = ((event.modifiers & Event.SHIFT_MASK) != 0);
            return handler(xl, event);
        }
    }
    JSFX.Layer.prototype.removeEventHandler = function(eventName) {
        this.elem.releaseEvents(JSFX.eventmasks[eventName]);
        delete this.elem[eventName];
    }
}
/**************************************************************************/
/** IE 4/5+***/
else
    if (document.all) {
    JSFX.Layer.prototype.addEventHandler = function(eventName, handler) {
        var xl = this;
        this.elem[eventName] = function() {
            var e = window.event;
            e.cancelBubble = true;
            if (document.getElementById) {
                e.layerX = e.offsetX;
                e.layerY = e.offsetY;
            }
            else {
                /*** Work around for IE 4 : clone window.event ***/
                ev = new Object();
                for (i in e)
                    ev[i] = e[i];
                ev.layerX = e.offsetX;
                ev.layerY = e.offsetY;
                e = ev;
            }

            return handler(xl, e);
        }
    }
    JSFX.Layer.prototype.removeEventHandler = function(eventName) {
        this.elem[eventName] = null;
    }
}
/**************************************************************************/
/*** Assume NS6 ***/
else {
    JSFX.Layer.prototype.addEventHandler = function(eventName, handler) {
        var xl = this;
        this.elem[eventName] = function(e) {
            e.cancelBubble = true;
            return handler(xl, e);
        }
    }
    JSFX.Layer.prototype.removeEventHandler = function(eventName) {
        this.elem[eventName] = null;
    }
}
/*** Event Handling - End ***/
/**************************************************************************/
JSFX.Layer.prototype.setTimeout = function(f, t) {
    setTimeout("window." + this.elem.id + "." + f, t);
}
if (!window.JSFX)
    JSFX = new Object();

if (!JSFX.Browser)
    JSFX.Browser = new Object();

if (navigator.appName.indexOf("Netscape") != -1) {
    JSFX.Browser.getCanvasWidth = function() { return innerWidth; }
    JSFX.Browser.getCanvasHeight = function() { return innerHeight; }
    JSFX.Browser.getWindowWidth = function() { return outerWidth; }
    JSFX.Browser.getWindowHeight = function() { return outerHeight; }
    JSFX.Browser.getScreenWidth = function() { return screen.width; }
    JSFX.Browser.getScreenHeight = function() { return screen.height; }
    JSFX.Browser.getMinX = function() { return (pageXOffset); }
    JSFX.Browser.getMinY = function() { return (pageYOffset); }
    JSFX.Browser.getMaxX = function() { return (pageXOffset + innerWidth); }
    JSFX.Browser.getMaxY = function() { return (pageYOffset + innerHeight); }

}
else if (document.all) {
    JSFX.Browser.getCanvasWidth = function() { return document.body.clientWidth; }
    JSFX.Browser.getCanvasHeight = function() { return document.body.clientHeight; }
    JSFX.Browser.getWindowWidth = function() { return document.body.clientWidth; }
    JSFX.Browser.getWindowHeight = function() { return document.body.clientHeight; }
    JSFX.Browser.getScreenWidth = function() { return screen.width; }
    JSFX.Browser.getScreenHeight = function() { return screen.height; }
    JSFX.Browser.getMinX = function() { return (document.body.scrollLeft); }
    JSFX.Browser.getMinY = function() { return (document.body.scrollTop); }
    JSFX.Browser.getMaxX = function() {
        return (document.body.scrollLeft
			+ document.body.clientWidth);
    }
    JSFX.Browser.getMaxY = function() {
        return (document.body.scrollTop
				+ document.body.clientHeight);
    }
}
JSFX.FallingSprite = function(theHtml) {
    //Call the superclass constructor
    this.superC = JSFX.Layer;
    this.superC(theHtml);

    this.x = Math.random() * (JSFX.Browser.getMaxX() - 40);
    this.y = -40;
    this.dx = Math.random() * 4 - 2;
    this.dy = Math.random() * 6 + 2;
    this.ang = 0;
    this.angStep = .2;
    this.amp = 10;
    this.state = "FALL";

    this.moveTo(this.x, this.y);
    this.show();
}
JSFX.FallingSprite.prototype = new JSFX.Layer;

JSFX.FallingSprite.prototype.animate = function() {
    if (this.state == "OFF")
        return;

    this.x += this.dx;
    this.y += this.dy;
    this.ang += this.angStep;

    this.moveTo(this.x + this.amp * Math.sin(this.ang), this.y);

    if ((this.x > JSFX.Browser.getMaxX() - 20)
	 || (this.x < JSFX.Browser.getMinX() - 0)
	 || (this.y > JSFX.Browser.getMaxY() - 40)) {
        if (this.state == "STOPPING") {
            this.moveTo(-100, -100);
            this.hide();
            this.state = "OFF";
        }
        else {
            this.x = Math.random() * (JSFX.Browser.getMaxX() - 40);
            this.y = JSFX.Browser.getMinY() - 40;
            this.dx = Math.random() * 4 - 2;
            this.dy = Math.random() * 6 + 2;
            this.ang = 0;
        }
    }
}
/*** Class FallingObj extends Object ***/
JSFX.FallingObj = function(numSprites, theImage, stopTime) {
    this.id = "JSFX_FallingObj_" + JSFX.FallingObj.count++;
    this.sprites = new Array();
    for (i = 0; i < numSprites; i++) {
        this.sprites[i] = new JSFX.FallingSprite(theImage);
    }
    window[this.id] = this;
    this.animate();

    if (stopTime)
        setTimeout("window." + this.id + ".stop()", stopTime * 1000);

}
JSFX.FallingObj.count = 0;

JSFX.FallingObj.prototype.stop = function() {
    for (i = 0; i < this.sprites.length; i++)
        this.sprites[i].state = "STOPPING";
}

JSFX.FallingObj.prototype.animate = function() {
    setTimeout("window." + this.id + ".animate()", 40);

    for (i = 0; i < this.sprites.length; i++)
        this.sprites[i].animate();

}
/*** END Class FallingObj ***/

/*
* Class Falling extends Object (Static method for creating "Falling" objects
*/
Falling = function(n, theImage, stopTime) {
    myFalling = new JSFX.FallingObj(n, theImage, stopTime);

    return myFalling;
}

