/**
 * This file is part of WebWorx javascript widget library. All rights reserver.
 *
 * Common rountines and object used in webworx library.
 */ 
var __copyrights = "(c) 2005 Scoped Software";
var __version = "1.0";

/**
 * Main wx library object. This instance encapsulates different cross pratforms utils
 * as well as some utility stuff used by different widgets.
 */
function WxLib() {
// private:
    var self = this;
    
    function IEEvent(event, currentTarget) {
        with (event) {        
            this.type = type;        
            this.clientX = clientX;
            this.clientY = clientY;
            this.target = srcElement;
        }
                
            // query related target attribute
        if ("relatedTarget" in event) {
            this.relatedTarget = event.relatedTarget;
        } else {
            switch (event.type) {
            case "mouseover":
                this.relatedTarget = event.fromElement;
                break;
            case "mouseout":
                this.relatedTarget = event.toElement;
                break;
            }
        }
        
        this.currentTarget = currentTarget;
        this.preventDefaultValue = false;
    }
    
    IEEvent.prototype.preventDefault = function() {
        this.preventDefaultValue = true;
    }
    
    /**
     * Wraps event listener so it can be used with IE events handlers. This method uses
     * closure to carry the event handler instance.
     */
    function createEventHandler(currentTarget, eventListener) {
        return function() {
            // new object has to be created as IE event instance is
            // sealed therfor cannot be copied, and from unknow reason it do not
            // contains target and currentTarget properties
            var ieEvent = new IEEvent(event, currentTarget);                                                                    
            // call event handler interface
            eventListener.handleEvent(ieEvent);
            // simulate prevent default behaviour on IE
            return !ieEvent.preventDefaultValue;
        }    
    };
    
// public members:
    this.copyrighs = __copyrights;
    this.version = __version;            
    
    this.explorer = document.all;

// priviledge interface:
    /**
     * Hooks event listener to passed object in platform independant maner.
     *
     * @param eventTarget HTMLElement instance or EventTarget instance that will be hooked with listener
     * @param eventType event type
     * @param eventListener instance of EventListener implementation
     */
    this.addEventListener = function(eventTarget, eventType, eventListener) {
        if (eventTarget.addEventListener) {
            // standerd DOM method

            eventTarget.addEventListener(eventType, eventListener, false);
        } else {
            eventTarget.attachEvent("on" + eventType, createEventHandler(eventTarget, eventListener));
        }    
    };    

    this.removeEventListener = function(eventTarget, eventType, eventListener) {
        if (eventTarget.removeEventListener) {
            // standerd DOM method
            eventTarget.removeEventListener(eventType, eventListener, false);
        } else {
            eventTarget.detachEvent("on" + eventType, createEventHandler(eventTarget, eventListener));
        }    
    };        
};

    
/**
 * Default conversion function that provides textual description of this object.
 */
WxLib.prototype.toString = function() {
    return "wxLib v" + this.version;
};

/**
 * Instantiate the sole instance of WxLibrary object. Other wx modules can use this
 * instance to perform different task.
 */
var wxLib = new WxLib();
