var compat = {level:0, dom:false, XMLHttpRequest:false};

if(document.getElementById)
{
  var c=compat;
  c.level=(document&&document.createElement&&document.createTextNode) ? 2 : 1;
  c.dom=(compat.level==2);
  c.isie=false;
  c.brokenHW=false;
  c.mouseXoff=0;
  c.mouseYoff=0;
  c.nodasheddotted=false;
  c.slowExtents=false;
  c.ver="unk";
  /*@cc_on
  @if (@_jscript)
    c.isie=true;
    c.mouseXoff=-2;
    c.mouseYoff=-2;
    c.brokenHW=!((document.compatMode)
       &&(document.compatMode.substring(0,3)=='CSS'))
  @end @*/

  var ua = navigator.userAgent.toLowerCase();
  var tests=[{br:'konqueror'},{br:'safari'},{br:'omniweb'},{br:'opera'},
             {br:'webtv'},{br:'icab'},{br:'msie',id:'ieclone'},{br:'compatible',id:'unk'},{br:'firefox'},];
  if(c.isie) { c.browser='msie';}
  else if (window.opera) {c.browser='opera'; c.slowExtents=true;}
  else
  {
    for(var i=0;i<tests.length;++i)
    {
      var test=tests[i];
      var place = ua.indexOf(test.br) + 1;
      if(place)
      {
        c.browser=test.id ? test.id : test.br;
        c.ver=parseFloat(ua.substr(place+test.br.length));
        break;
      }
    }
  }
  if(!c.browser)
  {
    c.browser="nn";
    c.ver=ua.charAt(8);
  }
  if(((c.browser=='msie')||(c.browser=='opera'))&&(c.ver=='unk'))
  {
    place = ua.indexOf(c.browser) + 1;
    if(place)
    {
      c.ver=parseFloat(ua.substr(place+c.browser.length));
    }
  }
  if((c.browser=='msie')&&(c.ver<5.5))
  {
    c.nodasheddotted=true;
  }
}

function getElem(id)
{
  if(typeof(id)!="string") return(id);
  var ret=document.getElementById(id);
  if(ret) return(ret);
  ret=document.getElementsByName(id);
  if(ret&&(ret.length>0)) return(ret[0]);
  return(null);
}

function pathJoin(prefix,suffix)
{
  if(!prefix) return(suffix);
  if(!suffix) return(prefix);
  var start,end;
  start=suffix.substr(0,1);
  end=suffix.substr(prefix.length-1,1);
  if((start=='/')&&(end=='/')) return(prefix+suffix.substr(1));
  if((start!='/')&&(end!='/')) return(prefix+'/'+suffix);
  return (prefix+suffix);
}

function entityEncode(data)
{
  data=data.replace(/&/g,'&amp;');
  data=data.replace(/</g,'&lt;');
  data=data.replace(/>/g,'&gt;');
  data=data.replace(/"/g,'&quot;');
  return(data);
}

function entityDecode(data)
{
  data=data.replace(/&lt;/g,'<');
  data=data.replace(/&gt;/g,'>');
  data=data.replace(/&quot;/g,'"');
  data=data.replace(/&amp;/g,'&');
  return(data);
}

function cancelBubble(e)
{
  if(e.stopPropogation)
  {
    e.stopPropogation();
  }
  else
  {
    e.cancelBubble=true;
  }
}

function setJSBodyTag(e)
{
  modClassName(document.body,'nojs','isjs');
  modClassName(document.body,false,compat.dom?'w3c_dom':'not_w3c_dom');
}

function cancelDefault(e)
{
  if(e.preventDefault)
  {
    e.preventDefault();
  }
  else
  {
    e.returnValue=false;
  }
}

function getParentNode(node)
{
  return((node.parentNode) ? node.parentNode : 
	(node.parentElement) ? node.parentElement : null);
}

function appendParam(url,param,value)
{
  var qPos=url.indexOf('?');
  url+=((qPos>=0) ? '&' : '?') +escape(param)+'='+escape(value);
  return(url);
}

function getMouseButton(e)
{
  if(e.which)
  {
    return(e.which);
  }
  else
  {
    return([0,1,3,3,2,2,2,2][e.button]);
  }
}

function modClassName(id,remove,add)
{
  if(compat.level>0)
  {
    var target=getElem(id);
    if(target)
    {
      var cn=target.className;
      if(cn)
      {
	cn=" "+cn+" ";
      	if(remove)
      	{
          var re=new RegExp(" ("+remove+" )+","g");
          cn=cn.replace(re," ");
        }
        if(add)
        {
          var re=new RegExp(' '+add+' ');
          if(!re.test(cn)) 
          {
            cn=cn.substring(1,cn.length)+add;
          }
          else
          {
            cn=cn.substring(1,cn.length-1);
          }
        }
        else if(cn==" ")
        {
          cn="";
        }
        else
        {
          cn=cn.substring(1,cn.length-1);
        }
      }
      else
      {
        cn=add;
      }
      target.className=cn;
    }
  }
}

function getFrom(e)
{
  if(e.fromElement) return(e.fromElement);
  return((e.type=='mouseout') ? e.target : e.relatedTarget);
}

function getTo(e)
{
  if(e.toElement) return(e.toElement);
  return((e.type=='mouseout') ? e.relatedTarget : e.target);
}

function getTarget(e)
{
  var target=(e.target) ? e.target : e.srcElement;
  if(target)
  {
    if(target.nodeType==3) target=getParentNode(target);
  }
  return(target);
}

function getRelated(e)
{  // needs to deal with event types where e.related would be e.fromElement
  var related=(e.related) ? e.relatedTarget : e.toElement;
  if(related)
  {
    if(related.nodeType==3) related=getParentNode(related);
  }
  return(related);
}

function contains_Impl(search)
{
  while((search!=this)&&(search!=null))
  {
    search=getParentNode(search);
  }
  return(search==this);
}

if(compat&&!compat.isie&&HTMLElement&&!HTMLElement.contains)
{
  HTMLElement.prototype.contains=contains_Impl;
}

function getDisplayStats()
{
  var retVal={};
  retVal.screenH=screen.height;
  retVal.screenW=screen.width;
  if((window.innerHeight>0)||(window.innerWidth>0))
  {
    retVal.currH=window.innerHeight;
    retVal.currW=window.innerWidth;
  }
  else if(!compat.isie||compat.brokenHW)
  {
    retVal.currH=document.body.clientHeight;
    retVal.currW=document.body.clientWidth;
  }
  else
  {
    retVal.currH=document.documentElement.clientHeight;
    retVal.currW=document.documentElement.clientWidth;
  }
  return(retVal);
}

function picProtect(ev)
{
  var e = ev ? ev : (window.event ?  window.event : null);
  var tgt=getTarget(e);
  if((tgt.tagName!='IMG')&&((tgt.tagName!="INPUT")||(tgt.type!="image")))
  {
    return(true);
  }
  if((e.type!='mousedown')||(e.button==2))
  {
    cancelDefault(e);
    return(false);
  }
  return(true);
}

function ppInit(e)
{
  document.body.onprecopy=picProtect;
  document.body.onprecut=picProtect;
  document.body.oncontextmenu=picProtect;
  document.body.onmousedown=picProtect;
  document.body.ondragstart=picProtect;
}

// written by Dean Edwards, 2005
// with input from Tino Zijdel, Matthias Miller, Diego Perini
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler) {
	// Modification by Tanny O'Haley, http://tanny.ica.com to add the
	// DOMContentLoaded for all browsers.
	if (type == "DOMContentLoaded" || type == "domload") {
		addDOMLoadEvent(handler);
		return;
	}
	
	if (element.addEventListener) {
		element.addEventListener(type, handler, false);
	} else {
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];
		if (!handlers) {
			handlers = element.events[type] = {};
			if (element["on" + type]) {
				handlers[0] = element["on" + type];
			}
		}
		handlers[handler.$$guid] = handler;
		element["on" + type] = handleEvent;
	}
};

addEvent.guid = 1;

function removeEvent(element, type, handler) {
	if (element.removeEventListener) {
		element.removeEventListener(type, handler, false);
	} else {
		if (element.events && element.events[type]) {
			delete element.events[type][handler.$$guid];
		}
	}
};

function handleEvent(event) {
	var returnValue = true;
	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
	var handlers = this.events[event.type];
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	return returnValue;
};

function fixEvent(event) {
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() {
	this.returnValue = false;
};
fixEvent.stopPropagation = function() {
	this.cancelBubble = true;
};

if (!window.addEventListener) {
	document.onreadystatechange = function(){
		if (window.onload && window.onload != handleEvent) {
			addEvent(window, 'load', window.onload);
			window.onload = handleEvent;
		}
	}
}

window.onDOMLoadEvents = new Array();
window.DOMContentLoadedInitDone = false;

function addDOMLoadEvent(listener) {
	window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;
}

function DOMContentLoadedInit() {
	if (window.DOMContentLoadedInitDone) return;
	window.DOMContentLoadedInitDone = true;
	for (var i=0; i<window.onDOMLoadEvents.length; i++) {
		var func = window.onDOMLoadEvents[i];
		func();
	}
}

function DOMContentLoadedScheduler() {
	if (window.DOMContentLoadedInitDone) return true;
	if(/KHTML|WebKit/i.test(navigator.userAgent)) {
		if(/loaded|complete/.test(document.readyState)) {
			DOMContentLoadedInit();
		} else {
			setTimeout("DOMContentLoadedScheduler()", 250);
		}
	} else if(document.getElementById("__ie_onload")) {
		return true;
	} else if(typeof document.getElementsByTagName != 'undefined' && (document.getElementsByTagName('body')[0] != null || document.body != null)) {
		DOMContentLoadedInit();
	} else {
		setTimeout("DOMContentLoadedScheduler()", 250);
	}
	
	return true;
}
setTimeout("DOMContentLoadedScheduler()", 250);

addEvent(window, "load", DOMContentLoadedInit);

if(document.addEventListener)
	document.addEventListener("DOMContentLoaded", DOMContentLoadedInit, false);

/*@cc_on @*/
/*@if (@_win32)
	document.write("<script id=__ie_onload defer src=//0><\/script>");
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function() {
		if (this.readyState == "complete") {
			DOMContentLoadedInit(); // call the onload handler
		}
	};
/*@end @*/


function addOnLoadHandler(handler)
{
  addEvent(window,"load",handler);
}

function addOnDomLoadHandler(handler)
{
  addEvent(window,"domload",handler);
}

addOnDomLoadHandler(setJSBodyTag);
addOnDomLoadHandler(ppInit);

var baseUrl;

if(!baseUrl)
{
  var matches=window.location.pathname.match(/^\/[^\/]+/)
  if(matches) var baseUrl=matches[0];
}
