function kwasiAddEventListener( DOM_ELEMENT, EVENT_TYPE, FUNCTION, PREVENT_DEFAULT ) {
	if ( DOM_ELEMENT.addEventListener ) {
		var wrapperFunction = function( EVENT ) {
			FUNCTION( EVENT );
			
			if ( PREVENT_DEFAULT ) {
				EVENT.preventDefault();
			}
		};
		
		DOM_ELEMENT.addEventListener( EVENT_TYPE, wrapperFunction, false );
	} else if ( DOM_ELEMENT.attachEvent ) { //IE
		var wrapperFunction = function() {
			FUNCTION();
			
			if ( PREVENT_DEFAULT ) {
				event.returnValue = false;
			}
		};
		
		DOM_ELEMENT.attachEvent( "on" + EVENT_TYPE, wrapperFunction );
	} else {
//		alert( "kwasiAddEventListener : You are using a legacy browser!" );
//		eval( "DOM_ELEMENT.on" + EVENT_TYPE + " = FUNCTION;" );
	}
}

function kwasiStyleOpacity( DOM_ELEMENT, AMOUNT ) {
	if ( DOM_ELEMENT.addEventListener ) {
		DOM_ELEMENT.style.opacity = AMOUNT;
	} else {	//IE
		DOM_ELEMENT.style.filter = "alpha(opacity=" + (AMOUNT * 100) + ")";
	}
}

function kwasiEventTarget( EVENT ) {
	if ( EVENT ) {
		return EVENT.target;
	} else {	//IE
		return event.srcElement;
	}
}

function kwasiEventPreventDefault( EVENT ) {
	if ( EVENT ) {
		EVENT.preventDefault();
	} else {	//IE
		event.returnValue = false;
	}
}

function kwasiKeyCode( EVENT ) {
	if ( EVENT ) {
		return EVENT.which;
	} else { //IE
		return event.keyCode;		
	}
}

function kwasiShiftKey( EVENT ) {
	if ( EVENT ) {
		return EVENT.shiftKey;
	} else if ( event ) { //IE
		return event.shiftKey;		
	} else {	//there was no event at all
		return undefined;
	}
}

function getViewportDimensions() {
	var result = { left:0, top:0, width:0, height:0 };
	
	if ( window.pageXOffset != undefined ) {
		result.left = window.pageXOffset;
		result.top = window.pageYOffset;
	} else {	//IE
		result.left = document.documentElement.scrollLeft;
		result.top = document.documentElement.scrollTop;
	}
	
	if ( window.innerWidth != undefined ) {
		result.width = window.innerWidth;
		result.height = window.innerHeight;
	} else {	//IE
		result.width = document.documentElement.clientWidth;
		result.height = document.documentElement.clientHeight;
	}
			
	return result;
}

function getCanvasDimensions() {
	var result = { width:0, height:0 };
	
	if ( document.body.offsetWidth ) {
		result.width = document.body.offsetWidth;
		result.height = document.body.offsetHeight;
	} else {	//IE
		result.width = document.body.clientWidth;
		result.height = document.body.clientHeight;
	}
	
	return result;
}

function kwasiXMLHttpRequest() {
	try {
		xmlHttp = new XMLHttpRequest();
	} catch ( e ) {
		try {
			xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP" );
		} catch ( e ) {
			try {
				xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );
			} catch ( e ) {
				xmlHttp = false;
			}
		}
	}
	
	return xmlHttp;
}

function kwasiNavigatorLanguage() {
	if ( navigator.language ) {
		return navigator.language;
	} else {	//IE
		return navigator.browserLanguage;
	}
}
