//WEBCOMpro CMS © Patrick Heyer, www.webcompro-cms.com

//--------------------------------
//    ANIMATION
//--------------------------------
function fx_create_image(object,
                         image_url)
{
        var _object = document.createElement("img");

        with (_object)
        {
                id             = object;
                src            = image_url;
                style.position = "absolute";
        };

        document.getElementsByTagName("body")[0].appendChild(_object);
};
//................................
function fx_move(object,
                 _x,
                 _y)
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return;
        };

        _x      = Math.floor(_x);
        _y      = Math.floor(_y);
        visible = fx_visible(object);

        with (object.style)
        {
                if ((parseInt(left) != _x) || (parseInt(top) != _y))
                {
                        if (visible) visibility = "hidden";
                        left = _x + "px";
                        top  = _y + "px";
                        if (visible) visibility = "visible";
                };
        };
};
//................................
function fx_change_image(object,
                         image_url)
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return;
        };

        object.src = image_url;
};
//................................
function fx_visible(object) //arguments: 1 => set
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return false;
        };

        if (fx_visible.arguments.length > 1)
        {
                object.style.visibility = fx_visible.arguments[1] ? "visible" : "hidden";
                return fx_visible.arguments[1];
        };

        return object.style.visibility == "visible";
};
//................................
function fx_transparency(object,
                         value)
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return false;
        };

        value = Math.floor(value);
        if (value < 0)        value =   0;
        else if (value > 100) value = 100;

        object.style.opacity = value / 100;
        object.style.filter  = "Alpha(opacity=" + value + ")";
};
//................................
function fx_left(object) //arguments: 1 => relative
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return 0;
        };

        var relative = (fx_left.arguments.length > 1) && fx_left.arguments[1];
        if (relative) return object.offsetLeft;

        var value = 0;

        do
        {
                value += object.offsetLeft;
        }
        while (object = object.offsetParent);

        return value;
}
//................................
function fx_top(object) //arguments: 1 => relative
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return 0;
        };

        var relative = (fx_top.arguments.length > 1) && fx_top.arguments[1];
        if (relative) return object.offsetTop;

        var value = 0;

        do
        {
                value += object.offsetTop;
        }
        while (object = object.offsetParent);

        return value;
}
//................................
function fx_offset_left(object) //arguments: 1 => no cropping
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return 0;
        };

        var no_cropping = (fx_offset_left.arguments.length > 1) && fx_offset_left.arguments[1];;
        var parent      = object.offsetParent;
        var value       = object.offsetLeft;
        var _value      = 0;
        var body        = document.getElementsByTagName("body")[0];
        var root        = document.documentElement;

        while (object = object.parentNode)
        {
                if ((object == body) || (object == root)) break;

                if (object.scrollLeft)
                {
                        value  -= object.scrollLeft;
                        _value  = object.offsetLeft;
                };

                if (object == parent)
                {
                        value  += object.offsetLeft;
                        _value += object.offsetLeft;
                        parent  = object.offsetParent;
                };
        };

        if ((! no_cropping) && (value < _value)) value = _value;
        return value;
};
//................................
function fx_offset_top(object) //arguments: 1 => no cropping
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return 0;
        };

        var no_cropping = (fx_offset_top.arguments.length > 1) && fx_offset_top.arguments[1];
        var parent      = object.offsetParent;
        var value       = object.offsetTop;
        var _value      = 0;
        var body        = document.getElementsByTagName("body")[0];
        var root        = document.documentElement;

        while (object = object.parentNode)
        {
                if ((object == body) || (object == root)) break;

                if (object.scrollTop)
                {
                        value  -= object.scrollTop;
                        _value  = object.offsetTop;
                };

                if (object == parent)
                {
                        value  += object.offsetTop;
                        _value += object.offsetTop;
                        parent  = object.offsetParent;
                };
        };

        if ((! no_cropping) && (value < _value)) value = _value;
        return value;
};
//................................
function fx_width(object) //arguments: 1 => no cropping
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return 0;
        };

        var no_cropping = (fx_width.arguments.length > 1) && fx_width.arguments[1];
        if (no_cropping) return object.offsetWidth;

        var parent      = object;
        var value       = object.offsetWidth;
        var _value      = 0;
        var offset      = fx_offset_left(object);
        var _offset     = 0;
        var body        = document.getElementsByTagName("body")[0];
        var root        = document.documentElement;

        while (parent = parent.parentNode)
        {
                if ((parent == body) || (parent == root)) break;

                _offset = fx_offset_left(parent, true);
                _value  = parent.offsetWidth - offset + _offset;

                if (_value < value) value = _value;
        };

        return value;
};
//................................
function fx_height(object) //arguments: 1 => no cropping
{
        if (typeof object != "object")
        {
                object = document.getElementById(object);
                if (typeof object != "object") return 0;
        };

        var no_cropping = (fx_height.arguments.length > 1) && fx_height.arguments[1];
        if (no_cropping) return object.offsetHeight;

        var parent  = object;
        var value   = object.offsetHeight;
        var _value  = 0;
        var offset  = fx_offset_top(object);
        var _offset = 0;
        var body    = document.getElementsByTagName("body")[0];
        var root    = document.documentElement;

        while (parent = parent.parentNode)
        {
                if ((parent == body) || (parent == root)) break;

                _offset = fx_offset_top(parent, true);
                _value  = parent.offsetHeight - offset + _offset;

                if (_value < value) value = _value;
        };

        return value;
};
//................................
function fx_page_left()
{
        if (typeof window.pageYOffset == "number")
                return window.pageXOffset;

        if (document.documentElement && document.documentElement.scrollLeft)
                return document.documentElement.scrollLeft;

        if (document.body)
                return document.body.scrollLeft;

        return 0;
};
//................................
function fx_page_top()
{
        if (typeof window.pageYOffset == "number")
                return window.pageYOffset;

        if (document.documentElement && document.documentElement.scrollTop)
                return document.documentElement.scrollTop;

        if (document.body)
                return document.body.scrollTop;

        return 0;
};
//................................
var fx_window_width  = 0;
var fx_window_height = 0;

function fx_update_page_size()
{
        if (typeof window.innerWidth == "number")
        {
                fx_window_width  = window.innerWidth;
                fx_window_height = window.innerHeight;
        }
        else if (document.documentElement && document.documentElement.clientWidth)
        {
                fx_window_width  = document.documentElement.clientWidth;
                fx_window_height = document.documentElement.clientHeight;
        }
        else if (document.body)
        {
                fx_window_width  = document.body.clientWidth;
                fx_window_height = document.body.clientHeight;
        };
};
//................................
function fx_adjust_window()
{
        var root    = (document.documentElement && document.documentElement.scrollWidth) ?
                      document.documentElement : document.body;
        var cwidth  = root.scrollWidth;
        var cheight = root.scrollHeight;

        if ((cwidth <= fx_window_width) && (cheight <= fx_window_height)) return;

        var mwidth  = (typeof window.outerWidth  == "number") ? window.outerWidth  - window.innerWidth  + 1 :  50;
        var mheight = (typeof window.outerHeight == "number") ? window.outerHeight - window.innerHeight + 1 : 150;

        var width   = cwidth  + mwidth;
        var height  = cheight + mheight;

        if (width  > screen.availWidth)  width  = screen.availWidth;
        if (height > screen.availHeight) height = screen.availHeight;

        var left    = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
        var top     = (typeof window.screenTop  == "number") ? window.screenTop  : window.screenY;
        var flag    = false;

        if ((left + width)  > screen.availWidth)  { left = screen.availWidth  - width;  flag = true; };
        if ((top  + height) > screen.availHeight) { top  = screen.availHeight - height; flag = true; };

        if (flag) window.moveTo(left, top);
        window.resizeTo(width, height);
};
//--------------------------------
//    EVENTS
//--------------------------------
/*
 * register callback function
 *
 * example 1:
 * function my_callback_function(my_event) { ... };
 * fx_register_callback(my_callback_function);
 *
 * example 2:
 * function my_callback_function(my_event) { ... };
 * function my_class() { ... this.callback = my_callback_function; ... };
 * var my_instance = new my_class();
 * fx_register_callback(my_instance);
 *
 * possible values for my_event:
 * "window_load", "window_resize", "window_unload",
 * "mousedown",   "mousemove",     "mouseup",
 * "keydown",     "keypress",      "keyup"
 * "dblclick"
 */

var fx_callback   = new Array();
var fx_event      = new Array(10);
var fx_event_slot = -1;

function fx_register_callback(callback)
{
        fx_callback[fx_callback.length] = callback;
};
//................................
function fx_event_raise(event)
{
        if (fx_event_slot >= 9) return;

        var slot = ++fx_event_slot;
        var callback;
        var data;

        fx_event[slot] = new Array(
                event,
                fx_window_width, fx_window_height,
                fx_mouse_key,
                fx_mouse_x, fx_mouse_y,
                fx_keyboard_key);

        for (var i = 0; i < fx_callback.length; i++)
        {
                callback = fx_callback[i];

                switch (typeof callback)
                {
                case "object":
                        callback.callback(event);
                        break;

                case "function":
                        callback(event);
                };

                data = fx_event[slot];
                if (data == false) break;

                fx_window_width  = data[1];
                fx_window_height = data[2];
                fx_mouse_key     = data[3];
                fx_mouse_x       = data[4];
                fx_mouse_y       = data[5];
                fx_keyboard_key  = data[6];
        };

        fx_event_consume();
};
//................................
function fx_event_consume()
{
        if (fx_event_slot < 0) return;
        fx_event[fx_event_slot--] = false;
};
//................................
function fx_event_listen(object,
                         event,
                         _function)
{
        if (object.addEventListener) object.addEventListener(event, _function, false);
        else if (object.attachEvent) object.attachEvent("on" + event, _function);
};
//--------------------------------
//    VARIOUS
//--------------------------------
function fx_event_window_onload(e)
{
        fx_update_page_size();
        fx_event_raise("window_load");
};
//................................
function fx_event_window_onresize(e)
{
        fx_update_page_size();
        fx_event_raise("window_resize");
};
//................................
function fx_event_window_onunload(e)
{
        fx_update_page_size();
        fx_event_raise("window_unload");
};
//................................
function fx_event_disabled() { return false };
//................................
//    MOUSE
//................................
var fx_mouse_key = false;

function fx_event_onmousedown(e)
{
        if (window.event)
        {
                fx_mouse_key = window.event.button;
                if (fx_mouse_key == 2)      fx_mouse_key = 3;
                else if (fx_mouse_key == 4) fx_mouse_key = 2;
        }
        else
        {
                fx_mouse_key = e.which;
        };

        fx_update_mouse_position(e);
        fx_event_raise("mousedown");
};
//................................
function fx_event_onmousemove(e)
{
        fx_update_mouse_position(e);
        fx_event_raise("mousemove");
};
//................................
function fx_event_onmouseup(e)
{
        fx_mouse_key = false;
        fx_update_mouse_position(e);
        fx_event_raise("mouseup");
};
//................................
function fx_event_ondblclick(e)
{
        fx_event_raise("dblclick");
};
//................................
var fx_mouse_x = 0;
var fx_mouse_y = 0;

function fx_update_mouse_position(e)
{
        if (window.event)
        {
                fx_mouse_x = fx_page_left() + window.event.clientX;
                fx_mouse_y = fx_page_top()  + window.event.clientY;
        }
        else
        {
                fx_mouse_x = e.pageX;
                fx_mouse_y = e.pageY;
        };
}
//................................
//    KEYBOARD
//................................
var fx_keyboard_key = false;

function fx_event_onkeydown(e)
{
        if (window.event) fx_keyboard_key = window.event.keyCode;
        else              fx_keyboard_key = e.which
        fx_event_raise("keydown");
};
//................................
function fx_event_onkeypress()
{
        fx_event_raise("keypress");
};
//................................
function fx_event_onkeyup()
{
        fx_keyboard_key = false;
        fx_event_raise("keyup");
};

fx_event_listen(window,   "load",         fx_event_window_onload);
fx_event_listen(window,   "resize",       fx_event_window_onresize);
fx_event_listen(window,   "beforeunload", fx_event_window_onunload);
fx_event_listen(document, "keydown",      fx_event_onkeydown);
fx_event_listen(document, "keypress",     fx_event_onkeypress);
fx_event_listen(document, "keyup",        fx_event_onkeyup);
fx_event_listen(document, "mousedown",    fx_event_onmousedown);
fx_event_listen(document, "mousemove",    fx_event_onmousemove);
fx_event_listen(document, "mouseup",      fx_event_onmouseup);
fx_event_listen(document, "dblclick",     fx_event_ondblclick);
