/**
 * Event handling. This class standardises the event model
 * accross user agents
 *
 * Copyright: (c)2007 CK Web Technologies - http://www.ckweb.com.au/
 * Author:    Chris Knowles <chris.knowles@ckweb.com.au>
 * Version:   $Id: Event.js 34 2007-10-12 01:16:17Z Chris $
 */

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

CKW.IE = false;

CKW.Event = function(){};

CKW.Event.listen = function() {
    if (window.addEventListener) {
        return function(elm, type, func) {
            elm = CKW.DOM.getElement(elm);
            if (elm) {
                elm.addEventListener(type, func, false);
            }
        };
    } else if (window.attachEvent) {
        return function(elm, type, func) {
            elm = CKW.DOM.getElement(elm);
            if (elm) {
                elm.func = function() {
                    func.call(elm, window.event);
                };
                elm.attachEvent('on' + type, elm.func);
            }
        };
    } 
    return false;
}();

CKW.Event.ignore = function() {
    if (window.removeEventListener) {
        return function(elm, type, func) {
            elm = CKW.DOM.getElement(elm);
            if (elm) {
                elm.removeEventListener(type, func, false);
            }
        };
    } else if (window.detachEvent) {
        return function(elm, type, func) {
            elm = CKW.DOM.getElement(elm);
            if (elm) {
                elm.detachEvent('on' + type, elm.func);
                elm.f = null;
            }
        };
    }
    return false;
}();


CKW.Event.cancel = function()
{
    if (window.detachEvent) {
        return function(e)
        {
            e = window.event;
            e.cancelBubble = true;
        };
    } else {
        return function(e)
        {
            e.stopPropagation();
        };
    }
}();

CKW.Event.kill = function()
{
    if (window.detachEvent) {
        return function(e)
        {
            e = window.event;
            e.cancelBubble = true;
            e.returnValue = false;
        };
    } else {
        return function(e)
        {
            e.preventDefault();
            e.stopPropagation();
        };
    }
}();

CKW.Event.onDomload = function()
{
    /* for Internet Explorer */
    /*@cc_on @*/
    /*@if (@_win32)
        CKW.IE = true;
        return function(func)
        {
            document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
            var script = document.getElementById("__ie_onload");
            script.onreadystatechange = function() {
                if (this.readyState == "complete") {
                    func(); // call the onload handler
                }
            };
            return;
        };
    /*@end @*/
    
    /* for Safari */
    if (/WebKit/i.test(navigator.userAgent)) { // sniff
    
        return function(func)
        {
            var _timer = setInterval(function() {
                if (/loaded|complete/.test(document.readyState)) {
                    clearInterval(_timer);
                    func(); // call the onload handler
                }
            }, 10);
            return;
        };
    }
    
    /* for Mozilla/Opera9 */
    if (document.addEventListener) {
        return function(func)
        {
            document.addEventListener("DOMContentLoaded", func, false);
            return;
        };
    } 
    
    /* for other browsers */
    return function(func)
    {
        CKW.Event.onload(func);
    };
    
}();

CKW.Event.onload = function(func)
{
    CKW.Event.listen(window, 'load', func);
};

CKW.Event.get = function(e)
{
    var evt = (e) ? e : ((window.event) ? event : null);
    var type = (evt.button) ? evt.button : null;
    var target = e.target || e.srcElement;
    return {e: evt, type: type, target: target};
};

CKW.Event.getTarget = function(e)
{
    var target = e.target || e.srcElement;
    if (target.nodeType == 3) {
        target = target.parentNode;
    }
    return target;
};

CKW.Event.getCoordinates = function(e)
{
    coords = {left:0, top:0};
    if (e.pageX) {
        coords.left = e.pageX;
        coords.top = e.pageY;
    } else if (e.clientX) {
        coords.left = e.clientX + document.body.scrollLeft - document.body.clientLeft;
        coords.top = e.clientY + document.body.scrollTop - document.body.clientTop;

        // include html element space, if applicable
        if (document.body.parentElement && document.body.parentElement.clientLeft) {
            var bodParent = document.body.parentElement;
            coords.left += bodParent.scrollLeft - bodParent.clientLeft;
            coords.top += bodParent.scrollTop - bodParent.clientTop;
        }
    }
    return coords;
};

var $E = CKW.Event;
