////////////////////////////////////////////////////////////////////////////////
// Namespace initialization
////////////////////////////////////////////////////////////////////////////////
var net;
if (!net) {
	net = {};
} else if (typeof net != 'object') {
	throw new Error('net already exists and is not an object');
}

////////////////////////////////////////////////////////////////////////////////
// net.canuda
////////////////////////////////////////////////////////////////////////////////
if (net.canuda && typeof net.canuda != 'object') {
	throw new Error('net.canuda already exists and is not an object');
}

net.canuda = function()
{
// private:
	var inited = false;
	var version = '0.0.3';
	
// public:
return {
	init: function()
    {
		if (inited) { return; }
		inited = true;
//        alert('net.canuda v' + version + ' has been succesfully initialized');
	}
};}();

////////////////////////////////////////////////////////////////////////////////
// net.canuda.Event
////////////////////////////////////////////////////////////////////////////////
if (net.canuda.Event && typeof net.canuda.Event != 'object') {
	throw new Error('net.canuda.Event already exists and is not an object');
}

net.canuda.Event = function()
{
// private:
	var getIEType = function(type)
    {
		switch (type) {
		case 'DOMMouseScroll':
			return 'onmousewheel';
		default:
			return 'on' + type;
		}
	};

// public:
return {
	addEventListener: function(target, type, listener, useCapture)
    {
		if (!target.listeners) { target.listeners = {}; }
        if (!target.listeners[type]) { target.listeners[type] = {}; }
		if (target.listeners[type][listener]) { return; }
		if (target.addEventListener) {
			target.listeners[type][listener] = {
				'type': type,
				'listener': listener,
				'useCapture': useCapture };
			target.addEventListener(type, listener, useCapture);
		} else if (target.attachEvent) {
			target.listeners[type][listener] = {
				type: type,
				listener: function() {
					var e = window.event;
					var evt = {
					// Event
						type: e.type,
						target: e.srcElement,
						currentTarget: target,
						// eventPhase
						// timeStamp
						// bubbles
						// cancelable
						stopPropagation: function() { e.cancelBubble = true; },
						preventDefault: function() { e.returnValue = false; },
					// UIEvent
						// view
						detail: e.type == 'mousewheel' ?
										  -e.wheelDelta / 40 : null,
					// MouseEvent
						button: [0, 0, 2, 1, 1][e.button],
						altKey: e.altKey,
						ctrlKey: e.ctrlKey,
						// metaKey
						shiftKey: e.shiftKey,
						clientX: e.clientX,
						clientY: e.clientY,
						// screenX
						// screenY
						relatedTarget: type == 'mouseover' ? e.fromElement :
									   (type == 'mouseout' ? e.toElement :
															 null)
					};
					return listener(evt);
				},
				useCapture: useCapture
			};
			target.attachEvent(getIEType(type),
							   target.listeners[type][listener].listener);
		}
	},

	removeAllEventListeners: function(target)
    {
        var listeners = target.listeners;
        for (var type in listeners) {
            if (!listeners.hasOwnProperty(type)) { continue; }
            var lType = listeners[type];
            for (var listener in lType) {
                if (!lType.hasOwnProperty(listener)) { continue; }
                net.canuda.Event.removeEventListener(target,
                    type, listener, lType[listener].useCapture);
            }
        }
		delete target.listeners;
	},

	removeEventListener: function(target, type, listener, useCapture)
    {
		if (target.removeEventListener) {
			target.removeEventListener(type, listener, useCapture);
		} else if (target.detachEvent) {
			target.detachEvent(getIEType(type),
                               target.listeners[type][listener].listener);
		}
		delete target.listeners[type][listener];
	}
};}();

net.canuda.Event.addEventListener(window, 'DOMContentLoaded',
								  net.canuda.init, false);
net.canuda.Event.addEventListener(window, 'load', net.canuda.init, false);
