﻿/* **************************
* This script allows you to fade up or down any item's opacity
* using the fadeUp, fadeDown, and fadeDownAndHide functions.
* These are the only "public" functions, all the rest can be
* left untouched. You can set the frame rate and percentage increase
* using the fs.setFps and fs.setIncrementPercent functions
**************************** */

var fs = new Object();
fs.faders = new Array();
fs.increment = 0.05;
fs.framerate = 30;

function Fader(elementId, opacity) {
    this.elementId = elementId;
    this.opacity = opacity || 0.0;
    fs.faders[elementId] = this;
    this.callbackDown = null;
    this.callbackUp = null;
    this.timeout = null;
    this.ios = isIos();
}

Fader.prototype.getElement = function() {
    return document.getElementById(this.elementId);
}

Fader.prototype.clearTimer = function()
{
    if (this.timeout != null) {
        clearTimeout(this.timeout);
    }
}


Fader.prototype.setCallbackDown = function(func) {
this.removeCallBacks();
    this.callbackDown = func;
}


Fader.prototype.setCallbackUp = function(func) {
    this.removeCallBacks();
    this.callbackUp = func;
}

Fader.prototype.removeCallBacks = function() {
    if (this.ios) {
        var el = this.getElement();
        if (this.callbackUp) {
            el.removeEventListener('webkitTransitionEnd', this.callbackUp, false);
        }
        if (this.callbackDown) {
            el.removeEventListener('webkitTransitionEnd', this.callbackDown, false);
        }
    }
}


Fader.prototype.setOpacity = function(value) {
    if (value > 1.0) value = 1.0;
    if (value < 0.0) value = 0.0;
    this.opacity = value;
    var mopacity = this.opacity * 100;
    var obj = document.getElementById(this.elementId);
    if (obj) {
        obj.style.filter = "alpha(opacity=" + mopacity + ")";
        obj.style.opacity = this.opacity;
    }

}

Fader.prototype.inc = function(amount) {
    this.setOpacity(this.opacity + amount);
}

Fader.prototype.dec = function(amount) {
    this.setOpacity(this.opacity - amount);
}

Fader.prototype.fullon = function() {
    var obj = document.getElementById(this.elementId);
    obj.style.filter = "none";
    obj.style.opacity = 1;
}

Fader.prototype.setShowing = function(val) {
    var obj = document.getElementById(this.elementId);
    if (val) {
        obj.style.display = "block";
    }
    else {
        obj.style.display = "none";
    }
}

fs.getFader = function(elementId, startingOpacity) {
    if (fs.faders[elementId]) {
        return fs.faders[elementId];
    }
    return new Fader(elementId, startingOpacity);
}

function setFps(val) {
    fs.framerate = Math.ceil(1000 / val);
}

function setIncrementPercent(val) {
    fs.increment = (val / 100);
}

function startFadeUp(elementId) {
    var fader = fs.getFader(elementId, 0.0);
    fader.setOpacity(0.0);
    fader.setShowing(true);
    fadeUp(elementId);
}

function getFader(elementId) {
    return fs.getFader(elementId);
}


function fadeUp(elementId) {
    var fader = fs.getFader(elementId, 0.0);
    fader.clearTimer();
    if (fader.opacity < 1) {
        fader.inc(fs.increment);
        fader.timeout = setTimeout("fadeUp('" + elementId + "')", fs.framerate);
    }
    else {
        fader.fullon();
        if (fader.callbackUp) {
            fader.callbackUp.call();
        }
    }
}



function fadeDown(elementId) {
    var fader = fs.getFader(elementId, 1.0);
    fader.clearTimer();
    if (fader.opacity > 0) {
        fader.dec(fs.increment);
        fader.timeout = setTimeout("fadeDown('" + elementId + "')", fs.framerate);
    }
    else {
        if (fader.callbackDown) {
            fader.callbackDown.call();
        }
    }
}

function fadeDownHalf(elementId) {
    var fader = fs.getFader(elementId, 1.0);
    fader.clearTimer();
    if (fader.opacity > 0.4) {
        fader.dec(fs.increment);
        fader.timeout = setTimeout("fadeDownHalf('" + elementId + "')", fs.framerate);
    }
    else {
        if (fader.callbackDown) {
            fader.callbackDown.call();
        }
    }
}

function fadeDownAndHide(elementId) {
    var fader = fs.getFader(elementId, 1.0);
    fader.clearTimer();
    if (fader == null) {
        alert("fader not created for " + elementId);
        return;
    }
    if (fader.opacity > 0) {
        fader.dec(fs.increment);
        fader.timeout = setTimeout("fadeDownAndHide('" + elementId + "')", fs.framerate);
    }
    else {
        var obj = document.getElementById(elementId);
        obj.style.display = "none";
        obj.style.filter = "alpha(opacity=100)";
        obj.style.opacity = 1.0;
        if (fader.callbackDown) {
            fader.callbackDown.call();
        }
    }
}

function faderHideElement(elementId) {
    var fader = fs.getFader(elementId);
    fader.setOpacity(0);
}

function faderOpaqueElement(elementId) {
    var fader = fs.getFader(elementId);
    fader.removeCallBacks();
    if (fader.ios) {
        var obj = fader.getElement();
        obj.style.webkitTransitionDuration = '0s';
    }
    fader.setOpacity(0);
    var el = fader.getElement();
}

function isIos() {
    var userAgent = "" + navigator.userAgent;
    userAgent = userAgent.toLowerCase();
    if ((userAgent.indexOf("ipod") >= 0) || (userAgent.indexOf("ipad") >= 0) ||
	    (userAgent.indexOf("iphone") >= 0) || (userAgent.indexOf("chrome") >= 0)
	    || (userAgent.indexOf("safari") >= 0)) {
        return true;
    }
    return false;
}

