﻿//  not work in Mozilla!!
//var ie = /MSIE/.test(navigator.userAgent);
//var moz = !ie && navigator.product == "Gecko";


/////////////////////
// work with Mozilla
//           http://www.mozilla.org/docs/dom/domref/dom_shortIX.html#IX_G	
//           http://developer.mozilla.org/en/docs/Migrate_apps_from_Internet_Explorer_to_Mozilla#Rich_text_editing
//           http://www.reloco.com.ar/mozilla/compat.html

//*******
// add function insertAdjacentHTML(), insertAdjacentText() and insertAdjacentElement () 
// Usage: include this code segment at the beginning 

if(typeof HTMLElement!="undefined" && ! 
HTMLElement.prototype.insertAdjacentElement){ 
HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode) 
{ 
switch (where){ 
case 'beforeBegin': 
this.parentNode.insertBefore(parsedNode,this) 
break; 
case 'afterBegin': 
this.insertBefore(parsedNode,this.firstChild); 
break; 
case 'beforeEnd': 
this.appendChild(parsedNode); 
break; 
case 'afterEnd': 
if (this.nextSibling) 
this.parentNode.insertBefore(parsedNode,this.nextSibling); 
else this.parentNode.appendChild(parsedNode); 
break; 
} 
} 

HTMLElement.prototype.insertAdjacentHTML = function 
(where,htmlStr) 
{ 
var r = this.ownerDocument.createRange(); 
r.setStartBefore(this); 
var parsedHTML = r.createContextualFragment(htmlStr); 
this.insertAdjacentElement(where,parsedHTML) 
} 


HTMLElement.prototype.insertAdjacentText = function 
(where,txtStr) 
{ 
var parsedText = document.createTextNode(txtStr) 
this.insertAdjacentElement(where,parsedText) 
} 
}
//********

//add a removeNode() method to the Node prototype 
if (window.Node && Node.prototype && !Node.prototype.removeNode)
{
	Node.prototype.removeNode = function( removeChildren )
	{
		var self = this;
		if ( Boolean( removeChildren ) )
		{
			return this.parentNode.removeChild( self );
		}
		else
		{
			var range = document.createRange();
			range.selectNodeContents( self );
			return this.parentNode.replaceChild( range.extractContents(), self );		
		}
	}
}

// **********
//add a neat contains() method to the Node prototype 
//Today I went through the Level 3 Core specification and found the compareDocumentPosition() method.
// This method works in roughly the same way as contains(),
// except that it generally compares the positions of two nodes and returns a bitmask:
//1: Position disconnected 
//2: Precedes 
//4: Follows 
//8: Contains 
//16: Is contained by 

if (window.Node && Node.prototype && !Node.prototype.contains)
{
	
	Node.prototype.contains = function (arg) {
		if(arg)
		return !!(this.compareDocumentPosition(arg) & 16)
		else return false;
	}
}

 

function addEvent( obj, type, fn ) {
if(obj)
  if ( obj.attachEvent ) {
    obj["e"+type+fn] = fn;
    obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
    obj.attachEvent( "on"+type, obj[type+fn] );
  } else
  {
  	if(obj.addEventListener)
    	obj.addEventListener( type, fn, false );
  }
}
function removeEvent( obj, type, fn ) {
if(obj)
  if ( obj.detachEvent ) {
    obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}

function noBubble(e)
{
	if (e && e.stopPropagation)
		e.stopPropagation();
	else
		window.event.cancelBubble = true;
}

//get element by ID
function getElement(aID)
{ 
if(document.all) return document.all[aID];
else return  document.getElementById(aID);
  
}

// get value of 'attrName' of object 'obj' 
function getAttr(obj,attrName)
{
	var ret=null;
	if(obj.attributes.getNamedItem(attrName))
	{
		ret=obj.attributes.getNamedItem(attrName).value;
	}
	return ret;
}

