/**
 * UI Effects - movement, fading etc.
 *
 * Copyright: (c)2007 CK Web Technologies - http://www.ckweb.com.au/
 * Author:    Chris Knowles <chris.knowles@ckweb.com.au>
 * Version:   $Id: FX.js 25 2007-10-06 04:19:05Z Chris $
 */

if (!CKW) {
    var CKW = function(){};
}

CKW.FX =
{
    fadeIn: function(elm, transparency)
    {
        if (this.timer) {
            window.clearTimeout(this.timer);
        }
        if (!transparency) {
            transparency = 0;
            CKW.FX.setTransparency(elm, 0);
            elm.style.display = 'block';
        } else {
            CKW.FX.setTransparency(elm, transparency);
        }
        if (transparency < 100) {
            var self = this;
            transparency += 20;
            this.timer = window.setTimeout(function(){self.fadeIn(elm, transparency)}, 1);
        }
        
        /*
          
        
        elm = CKW.DOM.getElement(elm);
        if (!params) {
            params = {time: 100, opacity: 10};
        } else {
            if (!params.time) {
                params.time = 1;
            }
            if (!params.opacity) {
                params.opacity = 10;
            }
        }
        var opacity = 0;
        elm.style.display = 'block';
        var ticker = setInterval(
            function()
            {
                if(opacity < 100) {
                    opacity += params.opacity;
                    CKW.FX.setTransparency(elm, opacity);
                } else {
                    CKW.FX.cancelTicker(ticker);
                }
            },
            params.time
        );
          */
    },
    
    fadeOut: function(elm, transparency)
    {
        if (this.timer) {
            window.clearTimeout(this.timer);
        }
        if (transparency == undefined) {
            transparency = 100;
            CKW.FX.setTransparency(elm, 100);
        } else {
            CKW.FX.setTransparency(elm, transparency);
        }
        if (transparency > 0) {
            var self = this;
            transparency -= 20;
            this.timer = window.setTimeout(function(){self.fadeOut(elm, transparency)}, 1);
        } else {
            elm.style.display = 'none';
        }
        /*
          elm = CKW.DOM.getElement(elm);
        if (!params) {
            params = {time: 100, opacity: 10};
        } else {
             if (!params.time) {
                params.time = 1;
            }
            if (!params.opacity) {
                params.opacity = 10;
            }
        }
        var opacity = 100;
        var ticker = setInterval(
            function()
            {
                if(opacity > 0) {
                    opacity -= params.opacity;
                    CKW.FX.setTransparency(elm, opacity);
                } else {
                    CKW.FX.cancelTicker(ticker, elm);
                }
            },
            params.time
        );
          */
    },
    
    cancelTicker: function(ticker, elm)
    {
        clearInterval(ticker);
        if (elm) {
            elm.style.display = 'none';
        }
    },
    
    /**
     * Sets the transparency of an element
     *
     * @var string id      - id of the element to make semi-transparent
     * @var int percentage - the percentage transparency
     */
    setTransparency: function(id, percentage)
    {
        id = CKW.DOM.getElement(id);
        id.style.KHTMLOpacity = percentage / 100;
        id.style.MozOpacity = percentage / 100;
        id.style.opacity = percentage / 100;
        id.style.filter = "alpha(opacity:" + percentage + ")";
    },
    
    toggleWidth: function(elm, params)
    {
        elm = $D.getElement(elm);
        if (!elm.ckwFxOpen) {
            CKW.FX.widen(elm, {add: params.show});
        } else {
            CKW.FX.narrow(elm, {subtract: params.show});
        }
    },
    
    widen: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetWidth;
        var finish = elm.offsetWidth + params.add;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp < finish) {
                    tmp += params.step;
                    elm.style.width = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.widen(elm, {add: 10, step: 2});
                        CKW.FX.narrow(elm, {subtract: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = true;
                }
            },
            1
        );
    },
    
    cancelTick: function(ticker)
    {
        clearInterval(ticker);
    },

    narrow: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetWidth;
        var finish = elm.offsetWidth - params.subtract;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp > finish) {
                    tmp -= params.step;
                    elm.style.width = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.narrow(elm, {subtract: 10, step: 2});
                        CKW.FX.widen(elm, {add: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = false;
                }
            },
            1
        );
    },
    
    toggleHeight: function(elm, params)
    {
        elm = $D.getElement(elm);
        if (!elm.ckwFxOpen) {
            CKW.FX.lengthen(elm, {add: params.show});
        } else {
            CKW.FX.shorten(elm, {subtract: params.show});
        }
    },
    
    lengthen: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetHeight;
        var finish = elm.offsetHeight + params.add;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp < finish) {
                    tmp += params.step;
                    elm.style.height = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.lengthen(elm, {add: 10, step: 2});
                        CKW.FX.shorten(elm, {subtract: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = true;
                }
            },
            1
        );
    },
    
    shorten: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetHeight;
        var finish = elm.offsetHeight - params.subtract;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp > finish) {
                    tmp -= params.step;
                    elm.style.height = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.shorten(elm, {subtract: 10, step: 2});
                        CKW.FX.lengthen(elm, {add: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = false;
                }
            },
            1
        );
    },
    
    grow: function(elm, params)
    {
        // get width and height
        
    },
    
    shrink: function(elm, params)
    {
        // get width and height
    
    }
}

var $F = CKW.FX;