/**
 * IE Mutation Events support.
 * 
 * @link http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-mutationevents
 * @link http://tobiasz123.wordpress.com/2009/01/19/utilizing-mutation-events-for-automatic-and-persistent-event-attaching
 * @version 0.1 alpha1
 * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
 */
// you can utilize this callback instead of jquery
//var IEMutationEventsCallback = function(event) {
//	
//}
appendChildNew = function(source){
	var appendChild = source.appendChild;
	return function(node) {
//		alert(node.nodeType);
//		if (node.nodeType == 11)
//			alert(node.all[0].nodeType);
		var result = appendChild(node);
		// jquery 1.3 - append via fragment
		if (node.nodeType != 11) {
			if (node.parentDocument == document)
				if (typeof jQuery != 'undefined')
					jQuery(node).trigger('DOMNodeInserted');
		} else {
			// fragments are supported only for one node
			if (typeof jQuery != 'undefined')
				jQuery(source.lastChild).trigger('DOMNodeInserted');
//			alert(source.lastChild.tagName);
//			for (i in node)
//				alert(i);
		}
		// jquery 1.2 - no fragment
//		$(document).trigger('DOMNodeInserted', [result]);
		if (typeof IEMutationEventsCallback != 'undefined')
			IEMutationEventsCallback({
				target: result, 
				type: 'DOMNodeInserted'
			});
		return result;
	}
}
removeChildNew = function(source){
	var removeChild = source.insertBefore;
	return function(node) {
		var result = removeChild(node);
		if (typeof jQuery != 'undefined')
			jQuery(result).trigger('DOMNodeRemoved');
		if (typeof IEMutationEventsCallback != 'undefined')
			IEMutationEventsCallback({
				target: result, 
				type: 'DOMNodeRemoved'
			});
		return result;
	}
}
removeNodeNew = function(source){
	var removeChild = source.removeNode;
	return function(node) {
		var result = removeNode(node);
		if (typeof jQuery != 'undefined')
			jQuery(result).trigger('DOMNodeRemoved');
		if (typeof IEMutationEventsCallback != 'undefined')
			IEMutationEventsCallback({
				target: result, 
				type: 'DOMNodeRemoved'
			});
		return result;
	}
}
insertBeforeNew = function(source){
	var insertBefore = source.insertBefore;
	return function(node, before) {
		var result = insertBefore(node, before);
		if (typeof jQuery != 'undefined')
			jQuery(result).trigger('DOMNodeInserted');
		if (typeof IEMutationEventsCallback != 'undefined')
			IEMutationEventsCallback({
				target: result, 
				type: 'DOMNodeInserted'
			});
		return result;
	}
}
// http://delete.me.uk/2004/09/ieproto.html
var __IEcreateElement = document.createElement;
document.createElement = function (tagName) {
    var element = __IEcreateElement(tagName);
    element.insertBefore = insertBeforeNew(element);
    element.removeChild = removeChildNew(element);
    element.appendChild = appendChildNew(element);
    element.removeNode = removeNodeNew(element);
    return element;
}
var __IEcreateDocumentFragment = document.createDocumentFragment;
document.createDocumentFragment = function () {
    var fragment = __IEcreateDocumentFragment();
    fragment.insertBefore = insertBeforeNew(fragment);
    fragment.removeChild = removeChildNew(fragment);
    fragment.appendChild = appendChildNew(fragment);
    fragment.removeNode = removeNodeNew(fragment);
    return fragment;
}
var IEMutationEventsOnLoad = function(){
	//alert(document.all.length);
	for (var i = 0; i < document.all.length; i++) {
		document.all[i].insertBefore = insertBeforeNew(document.all[i]);
		document.all[i].removeChild = removeChildNew(document.all[i]);
		document.all[i].appendChild = appendChildNew(document.all[i]);
		document.all[i].removeNode = removeNodeNew(document.all[i]);
	}
	//alert('onload complete');
}
if (typeof jQuery != 'undefined')
	jQuery(IEMutationEventsOnLoad);
else
	document.onload = IEMutationEventsOnLoad;