gid = document.getElementById ? function( o ) { return document.getElementById( o ) || null; } : ( document.all ? function( o ) { return document.all( o ) || null; } : null );
function loadBadgeImage(pBadge, pTargetID){
	var elem = gid(pTargetID);
	if (!elem) return;
	var img = document.createElement('img');
	img.border=0;
	img.src=pBadge;
	img.width=220;
	img.height=241;
	if (elem.childNodes.length == 0){
		elem.appendChild(img);
	} else {
		elem.removeChild(elem.childNodes[0]);
		elem.appendChild(img);
	}
}

function loadImage(pSource, pTargetID){
	var elem = gid(pTargetID);
	if (!elem) return;
	var img = document.createElement('img');
	img.border=0;
	img.src=pSource;
	if (elem.childNodes.length == 0){
		elem.appendChild(img);
	} else {
		elem.removeChild(elem.childNodes[0]);
		elem.appendChild(img);
	}
}

function loadBadge(pBadge){
	loadBadgeImage(pBadge,'badgeDiv');
	if(arrBadges){
		var elem = gid('badgeTextDiv');
		if (elem) {
			if (elem.childNodes.length > 0) elem.removeChild(elem.childNodes[0]);
			if (arrBadges[pBadge]){
				var e = document.createTextNode(arrBadges[pBadge]);
				elem.appendChild(e);
			}
		}
	}
}
function loadArtworkImage(pArtwork, pTargetID){
	var elem = gid(pTargetID);
	if (!elem) return;
	var img = document.createElement('img');
	img.border=0;
	img.src=pArtwork;
	img.width=470;
	img.height=700;
	if (elem.childNodes.length == 0){
		elem.appendChild(img);
	} else {
		elem.removeChild(elem.childNodes[0]);
		elem.appendChild(img);
	}
}
function loadArtwork(pArtwork){
	loadArtworkImage(pArtwork,'artworkDiv');
	if(arrArtworks){
		var elem = gid('artworkTextDiv');
		if (elem) {
			if (elem.childNodes.length > 0) elem.removeChild(elem.childNodes[0]);
			if (arrArtworks[pArtwork]){
				var e = document.createTextNode(arrArtworks[pArtwork]);
				elem.appendChild(e);
			}
		}
	}
}

function loadBag(pBag){loadImage(pBag,'bagDiv');}
function addEvent(elm, evType, fn, useCapture)
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
} 

function openKIBMap(){window.open('/images/kibmap.jpg','','menubar=0,resizable=0,width=425,height=270');}
function openMMAMMap(){window.open('/images/mmatmap.jpg','','menubar=0,resizable=0,width=425,height=270');}
var randomStartingAdvert = true;
var randomAdvertProgression = false;
var disableAdverts=false;
var advertDurationInSeconds = 5;
var adTransitionTimeInMilliseconds = 1300;
var lastAdvertID=0;
var arrAdverts = new Array();
var lastAdvert=0;

function Advert(pImage, pAltText, pURL){
	
	var theImg = document.createElement("IMG");
	theImg.border=0;
	theImg.alt=pAltText;
	theImg.src=pImage;
	theImg.width=170;
	theImg.height=125;
	theImg.id='advertimg' + lastAdvertID;
	
	var theHref = document.createElement("A");
	theHref.href=pURL;
	theHref.target="_blank";
	theHref.appendChild(theImg);
	
	var theDiv = document.createElement("DIV");
	theDiv.style.heigth="100%";
	theDiv.style.width="100%";
	theDiv.id='advert' + lastAdvertID;
	
	theDiv.style.display='none';
	theImg.style.display='inline';
	theDiv.appendChild(theHref);
	
	this.div = theDiv;
	this.img = theImg;
	this.href = theHref;
	this.id = lastAdvertID;
	lastAdvertID++;
	
}
Advert.prototype.hideAll = function (){
	this.div.style.display='none';
	this.img.style.display='none';
	this.href.style.display='none';
}
Advert.prototype.showAll = function (){
	this.div.style.display='inline';
	this.img.style.display='inline';
	this.href.style.display='inline';
}
Advert.prototype.getDiv = function (){ return this.div;}
Advert.prototype.getImg = function (){ return this.img;}
Advert.prototype.hide = function (){
	//var thisAdd = this.getDiv();
	opacity(this.id, 99, 0, adTransitionTimeInMilliseconds);
}
Advert.prototype.show = function (){
	changeOpacityStyle(this.div.style, 0);
	this.div.style.display='inline';
	opacity(this.id, 1, 100, adTransitionTimeInMilliseconds);
}
function opacity(id, opacStart, opacEnd, millisec) {
 //speed for each frame
 var speed = Math.round(millisec / 100);
 var timer = 0;

 //determine the direction for the blending, if start and end are the same nothing happens
	if(opacStart > opacEnd) {
		for(i = opacStart; i >= opacEnd; i--) {
			setTimeout("changeOpac(" + i + "," + id + ");",(timer * speed));
			timer++;
		}
	} else if(opacStart < opacEnd) {
		for(i = opacStart; i <= opacEnd; i++){
			setTimeout("changeOpac(" + i + "," + id + ");",(timer * speed));
			timer++;
		}
	}
}

function changeOpacityStyle(pStyle, opacity){
	pStyle.opacity = (opacity / 100);
	pStyle.MozOpacity = (opacity / 100);
	pStyle.KhtmlOpacity = (opacity / 100);
	pStyle.filter = "alpha(opacity=" + opacity + ")";	
}

//change the opacity for different browsers
function changeOpac(opacity, id, skipTrigger) {
	var ad = arrAdverts[id];
	if (!ad) return;
	var elem = ad.getDiv();
	if (!elem) return;
	st = elem.style;
	if(!st) return;
	changeOpacityStyle(st, opacity);
	if(opacity>0)ad.showAll();
	if (skipTrigger) return;
	if (opacity == 0){
		ad.hideAll();
		showNextAdvert();
	} else if (opacity == 100)  {
		setTimeout("nextAdvert()",advertDurationInSeconds*1000);
	}
}

function nextAdvert(){
	if (arrAdverts.length == 0) return;
	var advert = arrAdverts[lastAdvert];
	if (!advert) return;
	advert.hide();
}

function showNextAdvert(){
	if (randomAdvertProgression) {
		var newLast =0;
		newLast = Math.floor(Math.random()*arrAdverts.length);
		while (newLast == lastAdvert){newLast = Math.floor(Math.random()*arrAdverts.length);}
		lastAdvert = newLast;
	}else{
		lastAdvert++;
		if (lastAdvert == arrAdverts.length) lastAdvert=0;
	}
	var advert = arrAdverts[lastAdvert];
	if (!advert) return;
	advert.show();
}

function appendAdvert(pAdvert){
	arrAdverts[pAdvert.id]=pAdvert;
	var elem = gid('advertDiv');
	if (!elem) return;
	elem.appendChild(pAdvert.getDiv());
}

function isValidEmail(pStr){
	return isEmailValid(pStr);
}
function isEmailValid(emailStr) {
/* The following pattern is used to check if the entered e-mail address
   fits the user@domain format.  It also is used to separate the username
   from the domain. */
var emailPat=/^(.+)@(.+)$/
/* The following string represents the pattern for matching all special
   characters.  We don't want to allow special characters in the address. 
   These characters include ( ) < > @ , ; : \ " . [ ]    */
var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
/* The following string represents the range of characters allowed in a 
   username or domainname.  It really states which chars aren't allowed. */
var validChars="\[^\\s" + specialChars + "\]"
/* The following pattern applies if the "user" is a quoted string (in
   which case, there are no rules about which characters are allowed
   and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
   is a legal e-mail address. */
var quotedUser="(\"[^\"]*\")"
/* The following pattern applies for domains that are IP addresses,
   rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
   e-mail address. NOTE: The square brackets are required. */
var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
/* The following string represents an atom (basically a series of
   non-special characters.) */
var atom=validChars + '+'
/* The following string represents one word in the typical username.
   For example, in john.doe@somewhere.com, john and doe are words.
   Basically, a word is either an atom or quoted string. */
var word="(" + atom + "|" + quotedUser + ")"
// The following pattern describes the structure of the user
var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
/* The following pattern describes the structure of a normal symbolic
   domain, as opposed to ipDomainPat, shown above. */
var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")


/* Finally, let's start trying to figure out if the supplied address is
   valid. */

/* Begin with the coarse pattern to simply break up user@domain into
   different pieces that are easy to analyze. */
var matchArray=emailStr.match(emailPat)
if (matchArray==null) {
  /* Too many/few @'s or something; basically, this address doesn't
     even fit the general mould of a valid e-mail address. */
	alert("Email address seems incorrect (check @ and .'s)")
	return false
}
var user=matchArray[1]
var domain=matchArray[2]

// See if "user" is valid 
if (user.match(userPat)==null) {
    // user is not valid
    alert("The username doesn't seem to be valid.")
    return false
}

/* if the e-mail address is at an IP address (as opposed to a symbolic
   host name) make sure the IP address is valid. */
var IPArray=domain.match(ipDomainPat)
if (IPArray!=null) {
    // this is an IP address
	  for (var i=1;i<=4;i++) {
	    if (IPArray[i]>255) {
	        alert("Destination IP address is invalid!")
		return false
	    }
    }
    return true
}

// Domain is symbolic name
var domainArray=domain.match(domainPat)
if (domainArray==null) {
	alert("The domain name doesn't seem to be valid.")
    return false
}

/* domain name seems valid, but now make sure that it ends in a
   three-letter word (like com, edu, gov) or a two-letter word,
   representing country (uk, nl), and that there's a hostname preceding 
   the domain or country. */

/* Now we need to break up the domain to get a count of how many atoms
   it consists of. */
var atomPat=new RegExp(atom,"g")
var domArr=domain.match(atomPat)
var len=domArr.length
if (domArr[domArr.length-1].length<2 || 
    domArr[domArr.length-1].length>3) {
   // the address must end in a two letter or three letter word.
   alert("The address must end in a three-letter domain, or two letter country.")
   return false
}

// Make sure there's a host name preceding the domain.
if (len<2) {
   var errStr="This address is missing a hostname!"
   alert(errStr)
   return false
}

// If we've gotten this far, everything's valid!
return true;
}
