var singleFieldError = false;

// Move browser to the front.
if (window.top != window.self) {
	window.top.location = window.location;
}


// -- toggleRadio ------------------------------------------------------------- 

	function toggleRadio(radioButtonName) {
		radioButtonName.checked = FALSE;
	}


// -- FormHasBeenSubmitted ---------------------------------------------------

// This function prevents a messy situation in Mozilla where an error has been 
// generated in a single field at the same time as the user has pressed the [submit] 
// button or a link.

	function formHasBeenSubmitted() {
	
		if (navigator.appCodeName == "Mozilla") {
			if (singleFieldError == false) {
				return true;
			} else {
				singleFieldError = false;
				return false;
			}
		}
	}

// -- RegEx -------------------------------------------------------------------

	function regEx(str,regexp,message,fieldtext) {
	
		singleFieldError = false;
		if (str == "") {
			return;
		}
		match = str.search(regexp);
		if (match == -1) { 
			singleFieldError = true;
			alert("Q. " + fieldtext +"\n Please Use : "+ message); 
		}
	}

// -- SetValue ----------------------------------------------------------------

// Determines if you are leaving the page without saving edits.
	var y = 0;
	function setValue(x) {
		y = x;
	}


// -- SaveEditsPrompt ---------------------------------------------------------
// 

//			if (confirm("You are leaving this page\nwithout saving your edits."

// 			"To save your edits before leaving this page please select the "
//			+"[Cancel] button in this box and then press the [Submit] button at the bottom of the form."


	function saveEditsPrompt() {

		if (y == 1) {
			if (confirm("Your edits have not been saved."
			+"\n\nTo save your edits before leaving this page please select the "
			+"[Cancel] button in this box and then press the [Submit] button at the bottom of the form."
			+"\n\nPress the [Ok] button in this box to continue without saving your edits."
			)) {
				return true;
			} else {
				return false;
			}
		}
	}
	

// -- AddBookmarkSidebar ------------------------------------------------------

	function addBookmarkSidebar(title,url) {
	// This adds a bookmark to Microsoft and a sidebar to Mozilla (F9).

		if (window.sidebar) { 
			window.sidebar.addPanel(title, url,""); 
		} else if( document.all ) {
			window.external.AddFavorite( url, title);
		} else if( window.opera && window.print ) {
			return true;
		}
	}


// -- GetTextAreaSize -----------------------------------------------------------
// Use the screen size to determine text area size

	function getTextAreaSize() {
		if ( screen.width == '800' ) {
			return 'widthTextArea800';
		} else {
			return 'widthTextArea1024';
		}
	}


// -- GetListTextAreaSize -----------------------------------------------------------
// Use the screen size to determine text area size in a list

	function getListTextAreaSize() {
		if ( screen.width == '800' ) {
			return 'widthListTextArea800';
		} else {
			return 'widthListTextArea1024';
		}
	}


// -- LastModified ------------------------------------------------------------
// Displays when the page was last modified.

function lastModified() {
	datUpdated = new Date(document.lastModified) ;
	datMonth = datUpdated.getMonth() + 1 ;
	datDate = datUpdated.getDate() ;
	datYear = datUpdated.getYear();
	if (navigator.appName != "Microsoft Internet Explorer") datYear = datYear + 1900; 
	document.write( datDate + "/" + datMonth + "/" + datYear) ;
}


// -- HideEmail ---------------------------------------------------------------
// Use : <script language="javascript" type="text/javascript">hideEmail("dxg","noc.soton.ac.uk")</script>

function hideEmail(name,address) {
 locationString =  name + '@' + address;
 document.write('<a href=mai' + 'lto:' + locationString + '>' + locationString + '</a> <small><i>(spam safe)</i></small>');
}

// Use : <script language="javascript" type="text/javascript">hideEmail("InterMARGINS","dxg","noc.soton.ac.uk")</script>

function hideEmail(location,name,address) {
 locationString =  name + '@' + address;
 document.write('<a href=mai' + 'lto:' + locationString + '>' + location + '</a>');
}
 
 
// -- ConfirmAlert ----------------------------------------------------------

function confirmAlert(message,id) {
  if (confirm(message)){
    alert(id);
    return true;
  } else {
    return false;
  }
}

// -- ConfirmMessage ----------------------------------------------------------

function confirmMessage(message) {
  if (confirm(message)){
    return true;
  } else {
    return false;
  }
}

// -- DoubleConfirm ----------------------------------------------------------

function doubleConfirm(message,message1) {
  if (confirm(message)){
		if (confirm(message1)){
			return true;
		} else {
			return false;
		}
  } else {
    return false;
  }
}

// -- ShowHideColumn ----------------------------------------------------------
// Show-hides columns in a table
// Example: <table class="displayTable" cellspacing="0" cellpadding="3" id="tablenumber{tablenumber}">
	// <tr>
	// <td class="header"><a href="javascript: void(0)" onclick="nmfHideColumn(0, {tablenumber});"><img src="images/close.gif" alt="close column" border="0" class="closeIcon" /></a><a href="link.html">Column 1</a></td>
	// <td class="header"><a href="javascript: void(0)" onclick="nmfHideColumn(1, {tablenumber});"><img src="images/close.gif" alt="close column" border="0" class="closeIcon" /></a><a href="link.html">Column 2</a></td>
	// </tr>
// </table>
// Note: columnnumber has to start from 0
function nmfHideColumn(columnnumber, tablenumber) {
	//var stl;
	//if(do_show != 0) { //ONLY REMOVE WHEN SURE IT IS NOT REQUIRED - ac
		//stl = 'block';
	//} else {

		var tbl  = document.getElementById(tablenumber);
		//alert(tbl);
		var rows = tbl.getElementsByTagName('tr');
		//for (var row=0; row<rows.length;row++) {
		var numberofcols = rows[0].getElementsByTagName('td');
		//}
		
		if (!window['colsclosed'+tablenumber]) {
			window['colsclosed'+tablenumber] = 0;
		}
		
		if (window['colsclosed'+tablenumber] < (numberofcols.length-1)) {
			//alert(window['colsclosed'+tablenumber]); //testing code
			for (var row=0; row<rows.length;row++) {
				var cols = rows[row].getElementsByTagName('td');
				cols[columnnumber].style.display='none';
			}
		window['colsclosed'+tablenumber]++;
		}
}

// -- ShowAllColumns ----------------------------------------------------------
// Shows all the columns in a table using the table id as reference (table number)
// Example: <div style='text-align: right'>
// [<a href='javascript: void(0)' onclick='nmfShowAllColumns(\"tablenumber1\");'>Click to re-open all columns</a>]
// </div>

function nmfShowAllColumns(tablenumber) {
	var stl;
	stl = '';
	
	var tbl  = document.getElementById(tablenumber);
	var rows = tbl.getElementsByTagName('tr');
	
	for (var row=0; row<rows.length;row++) {
	  var cols = rows[row].getElementsByTagName('td');
	  for (var i=0; i<cols.length;i++) {
		  cols[i].style.display=stl;
		}
	}
	window['colsclosed'+tablenumber] = 0;
}

//-- MD5 Start ----------------------------------------------------------------

 //
 // A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 // Digest Algorithm, as defined in RFC 1321.
 // Copyright (C) Paul Johnston 1999 - 2000.
 // Updated by Greg Holt 2000 - 2001.
 // See http://pajhome.org.uk/site/legal.html for details.
 //

 //
 // Convert a 32-bit number to a hex string with ls-byte first
 //
 
var hex_chr = "0123456789abcdef";
function rhex(num)
{
  str = "";
  for(j = 0; j <= 3; j++)
    str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
           hex_chr.charAt((num >> (j * 8)) & 0x0F);
  return str;
}

 //
 // Convert a string to a sequence of 16-word blocks, stored as an array.
 // Append padding bits and the length, as described in the MD5 standard.
 //

function str2blks_MD5(str)
{
  nblk = ((str.length + 8) >> 6) + 1;
  blks = new Array(nblk * 16);
  for(i = 0; i < nblk * 16; i++) blks[i] = 0;
  for(i = 0; i < str.length; i++)
    blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);
  blks[i >> 2] |= 0x80 << ((i % 4) * 8);
  blks[nblk * 16 - 2] = str.length * 8;
  return blks;
}

 //
 // Add integers, wrapping at 2^32. This uses 16-bit operations internally 
 // to work around bugs in some JS interpreters.
 //
function add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

 //
 // Bitwise rotate a 32-bit number to the left
 //
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

 //
 // These functions implement the basic operation for each round of the
 // algorithm.
 //
function cmn(q, a, b, x, s, t)
{
  return add(rol(add(add(a, q), add(x, t)), s), b);
}
function ff(a, b, c, d, x, s, t)
{
  return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function gg(a, b, c, d, x, s, t)
{
  return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function hh(a, b, c, d, x, s, t)
{
  return cmn(b ^ c ^ d, a, b, x, s, t);
}
function ii(a, b, c, d, x, s, t)
{
  return cmn(c ^ (b | (~d)), a, b, x, s, t);
}

 //
 // Take a string and return the hex representation of its MD5.
  //
function calcMD5(str)
{
  x = str2blks_MD5(str);
  a =  1732584193;
  b = -271733879;
  c = -1732584194;
  d =  271733878;

  for(i = 0; i < x.length; i += 16)
  {
    olda = a;
    oldb = b;
    oldc = c;
    oldd = d;

    a = ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = ff(c, d, a, b, x[i+10], 17, -42063);
    b = ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = ff(d, a, b, c, x[i+13], 12, -40341101);
    c = ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = ff(b, c, d, a, x[i+15], 22,  1236535329);    

    a = gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = gg(c, d, a, b, x[i+11], 14,  643717713);
    b = gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = gg(c, d, a, b, x[i+15], 14, -660478335);
    b = gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = gg(b, c, d, a, x[i+12], 20, -1926607734);
    
    a = hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = hh(b, c, d, a, x[i+14], 23, -35309556);
    a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = hh(d, a, b, c, x[i+12], 11, -421815835);
    c = hh(c, d, a, b, x[i+15], 16,  530742520);
    b = hh(b, c, d, a, x[i+ 2], 23, -995338651);

    a = ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = ii(c, d, a, b, x[i+10], 15, -1051523);
    b = ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = ii(d, a, b, c, x[i+15], 10, -30611744);
    c = ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = add(a, olda);
    b = add(b, oldb);
    c = add(c, oldc);
    d = add(d, oldd);
  }
  return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}
 
//-- MD5 Finish ---------------------------------------------------------------
