//------------------------------------------------------------
//	 Object Compatibility Checking 
//------------------------------------------------------------
var W3CDOM = (document.getElementsByTagName && document.createElement);

//------------------------------------------------------------
//	Document Load Evenets
//------------------------------------------------------------

if (W3CDOM) {
	
	// Add Js Enabled Style sheet
	document.write('<link rel="stylesheet" type="text/css" href="/styles/modules/js_enabled.css" media="screen" />');
	
	// Add Load Events
	addLoadEvent(addRoundedCornerHooks);
}

//------------------------------------------------------------
//	More Urgent Init Events
//------------------------------------------------------------

function init () {
	
	// sIFR 
	if(typeof sIFR == "function") {
		switchFonts();
	}
	
	// Mark document 
	var node = document.getElementsByTagName('body')[0];
	addClass(node, 'hasJS');
}

//------------------------------------------------------------
//	Add extra elements to use as hooks for rounded corners
//------------------------------------------------------------

function addRoundedCornerHooks(element_id) {
	
	// Content will allways be on the page and need hooks
	var content = document.getElementById('content');
	if (content) {
		applyRoundedCornerHooks(content);
	}
	
	var form_wrapper = document.getElementsBySelector('div.form_wrapper')[0];
	if (form_wrapper) {
		applyRoundedCornerHooks(form_wrapper);	 
	}
}


function applyRoundedCornerHooks(elem) {
	
	if (!elem) return false;
	
	space = document.createTextNode(' ');
	
	var top_elem = createElement('div');
	top_elem.className = 'top_corners pseudo_corner';
	//top_elem.appendChild(space);
	
	var bottom_elem = createElement('div');
	bottom_elem.className = 'bottom_corners pseudo_corner';
	bottom_elem.appendChild(space);
	
	elem.insertBefore(top_elem, elem.firstChild);
	elem.appendChild(bottom_elem);
}

//------------------------------------------------------------
//	Specific Support Functions (Add pseudo hover on elements)
//------------------------------------------------------------

function applyPseudoHovers(elems) {

	for(var i=0;i<elems.length;i++) {

		elems[i].onmouseover = function() { addClass(this, 'hover'); };
		elems[i].onmouseout = function() { removeClass(this, 'hover');  };
	}	
}

function createElement(element) {
	
	if (typeof document.createElementNS != 'undefined') {
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
	}
	if (typeof document.createElement != 'undefined') {
		return document.createElement(element);
	}
	return false;
}


//------------------------------------------------------------
//	Event Functions
//------------------------------------------------------------

// Add a function to be run on page loa
function addLoadEvent(func) {

addEvent(window, 'load', func);
/*
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }*/
}

function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else 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] );
	}
}

function removeEvent( obj, type, fn )
{
	if (obj.removeEventListener)
		obj.removeEventListener( type, fn, false );
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
}

//------------------------------------------------------------
//	Class Handling 
//------------------------------------------------------------

// Does the element have this class name?
function hasClass(obj,cName) {
	if(obj) {
		return new RegExp('\\b'+cName+'\\b').test(obj.className);
	}
}

// Add the class to this element
function addClass(obj,cName) {
    if(obj) {
		if (!hasClass(obj,cName)) {
	        obj.className+=obj.className?' '+cName:cName;
	    }
	    return true;
	}
}

// Remove the class from this element
function removeClass(obj,cName) {
    if (!hasClass(obj,cName)) return false;
    var rep = obj.className.match(' '+cName)?' '+cName:cName;
    obj.className=obj.className.replace(rep,'');
    return true;
}

// Remove all child and grand child nodes from this element
function removeChildren( elem ) {
    while ( elem.hasChildNodes() ) {
        elem.removeChild( elem.lastChild );
    }
}

//------------------------------------------------------------
//	Popups, Evil, Euurgghhhh! (ghoest noise)
//------------------------------------------------------------

function openPopup(url, name, opts) {
	
	name = name || '_popup';
	opts = opts || '';
	
	window.open(url, name, opts);
}

//------------------------------------------------------------
//  Additional / Useful DOM Functions
//------------------------------------------------------------

// Remove all child and grand child nodes from this element
function removeChildren( elem ) {
    while ( elem.hasChildNodes() ) {
        elem.removeChild( elem.lastChild );
    }
}

function insertAfter(newNode, targetNode) {
    var parent = targetNode.parentNode;
	if (parent.lastChild == targetNode) {
		parent.appendChild(newNode);
	} else {
		parent.insertBefore(newNode, targetNode.nextSibling);
	}
}

function prependChild(parent, node) {
    parent.insertBefore(node, parent.firstChild);
}

// Taken and modified from: 
// http://www-128.ibm.com/developerworks/xml/library/x-matters41.html#listing2
function easyCreateElement(name, attrs, style, text) {
    var e = createElement(name);
    if (attrs) {
        for (key in attrs) {
            if (key == 'class') e.className = attrs[key];
            else if (key == 'id') e.id = attrs[key];
            else e.setAttribute(key, attrs[key]);
        }
    }
    if (style) for (key in style) e.style[key] = style[key];
    if (text) e.appendChild(document.createTextNode(text));
    return e;
}

// XHTML Compatible Element Creation
function createElement(element) {

    if (typeof document.createElementNS != 'undefined') {
        return document.createElementNS('http://www.w3.org/1999/xhtml', element);
    }
    if (typeof document.createElement != 'undefined') {
        return document.createElement(element);
    }
    return false;
}

//------------------------------------------------------------
// Simon Wilson's getElementsBySelector()
// See: http://simon.incutio.com/js/getElementsBySelector.js
//------------------------------------------------------------

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('o H(e){d e.M?e.M:e.A(\'*\')}D.T=o(P){c(!D.A){d 9 g()}5 F=P.J(\' \');5 6=9 g(D);n(5 i=0;i<F.f;i++){t=F[i].K(/^\\s+/,\'\').K(/\\s+$/,\'\');c(t.C(\'#\')>-1){5 u=t.J(\'#\');5 7=u[0];5 N=u[1];5 I=D.Q(N);c(7&&I.W.V()!=7){d 9 g()}6=9 g(I);G;}c(t.C(\'.\')>-1){5 u=t.J(\'.\');5 7=u[0];5 B=u[1];c(!7){7=\'*\'}5 8=9 g;5 y=0;n(5 h=0;h<6.f;h++){5 a;c(7==\'*\'){a=H(6[h])}L{a=6[h].A(7)}n(5 j=0;j<a.f;j++){8[y++]=a[j]}}6=9 g;5 z=0;n(5 k=0;k<8.f;k++){c(8[k].B&&8[k].B.E(9 r(\'\\\\b\'+B+\'\\\\b\'))){6[z++]=8[k]}}G;}c(t.E(/^(\\w*)\\[(\\w+)([=~\\|\\^\\$\\*]?)=?"?([^\\]"]*)"?\\]$/)){5 7=r.$1;5 l=r.$2;5 O=r.$3;5 p=r.$4;c(!7){7=\'*\'}5 8=9 g;5 y=0;n(5 h=0;h<6.f;h++){5 a;c(7==\'*\'){a=H(6[h])}L{a=6[h].A(7)}n(5 j=0;j<a.f;j++){8[y++]=a[j]}}6=9 g;5 z=0;5 m;U(O){x\'=\':m=o(e){d(e.q(l)==p)};v;x\'~\':m=o(e){d(e.q(l).E(9 r(\'\\\\b\'+p+\'\\\\b\')))};v;x\'|\':m=o(e){d(e.q(l).E(9 r(\'^\'+p+\'-?\')))};v;x\'^\':m=o(e){d(e.q(l).C(p)==0)};v;x\'$\':m=o(e){d(e.q(l).S(p)==e.q(l).f-p.f)};v;x\'*\':m=o(e){d(e.q(l).C(p)>-1)};v;R:m=o(e){d e.q(l)}}6=9 g;5 z=0;n(5 k=0;k<8.f;k++){c(m(8[k])){6[z++]=8[k]}}G;}7=t;5 8=9 g;5 y=0;n(5 h=0;h<6.f;h++){5 a=6[h].A(7);n(5 j=0;j<a.f;j++){8[y++]=a[j]}}6=8}d 6}',59,59,'|||||var|currentContext|tagName|found|new|elements||if|return||length|Array|||||attrName|checkFunction|for|function|attrValue|getAttribute|RegExp||token|bits|break||case|foundCount|currentContextIndex|getElementsByTagName|className|indexOf|document|match|tokens|continue|getAllChildren|element|split|replace|else|all|id|attrOperator|selector|getElementById|default|lastIndexOf|getElementsBySelector|switch|toLowerCase|nodeName'.split('|'),0,{}))