var snPrefixes = new Object();
var snIndexes = new Object();
var fnPrefixes = new Object();
var fnIndexes = new Object();
var origins = new Object();
var navDropDown = null;
var decimalSeparator = '.';

function initNavBar(){
    var f = document.forms['navBarForm'];
    var p = extractParams();
    if (p.nametype != null) {
    	var rbg = f.elements['nametype'];
    	for (var i in rbg) {
    		if (rbg[i].value == p.nametype) {
    			rbg[i].checked = true;
    			break;
    		}
    	}
    }
    if (document.getElementsByTagName) {
		var inputElements = document.getElementsByTagName("input");
		for (var i = 0; i < inputElements.length; i++) {
			if (inputElements[i].className && (inputElements[i].className.indexOf("disableAutoComplete") != -1)) {
				inputElements[i].setAttribute("autocomplete","off");
			}
		}
	}
    var i;
    if (typeof(f) != 'undefined') {
		i = f.elements['sname'];
		if (typeof(i.blur) != 'undefined') {
			i.blur();
		}
		if (p.sname != null) {
			i.value = p.sname;
			constrainSubmit(i, 'go', 2);
		}
		i = f.elements['sname'];
		if (typeof(i.focus) != 'undefined') {
			i.focus();
		}
	}
    navDropDown = doGetById('navDropDown');
	if (typeof(navDropDown) != 'undefined') {
		navDropDown.show = function() {
			navDropDown.style.visibility = 'visible';
		};
		navDropDown.hide = function() {
			navDropDown.style.visibility = 'hidden';
		};
		navDropDown.isShowing = function() {
			return (navDropDown.style.visibility == 'visible');
		};
		if (navDropDown) {
			navDropDown.hide();
		}
	}
    // Check for some cookie stuff
    var ntc = readCookie('user.currNameType');
    if (ntc != null) {
    	try {
    		var inps = document.getElementsByTagName('input');
    		for (var i = 0; i < inps.length; i++) {
    			if (inps.item(i).getAttribute('value') == ntc) {
    				inps.item(i).checked = true;
    			}
    		}
    	}
    	catch (ex) {
    	}
    }
    var xurl = siteRootPath + 'instantatlas/xml/index/origins.xml';
	doGetUrl({url: xurl, load: onOriginsLoad});
}

function onNameTypeClick(inp) {
	createCookie('user.currNameType', inp.value, 30);
}

function onOriginsLoad(data) {
	try {
		var os = data.getElementsByTagName('origin');
		for (var i = 0; i < os.length; i++) {
			origins[os.item(i).getAttribute('code')] = os.item(i).getAttribute('name');
		}
	}
	catch (e) {
		//alert('No origins XML yet!');
	}
}

function constrainSubmit(sel, sId, minChars) {
	var s = sel.value;
	if (sel.form && sel.form[sId]) {
		sel.form[sId].disabled = (s == null) || (s.length < minChars);
	}
}

function loadPrefix(sel, ntRadio) {
	var r = sel.form[ntRadio];
	var nameType = getCheckedValue(r);
	var s = sel.value;
	var prefixes = (nameType.toLowerCase() == 'surname' ? snPrefixes : fnPrefixes);
	if ((s != null) && (s.length > 0)) {
		// Got them already?
		var c = s.charAt(0);
		c = encodeURIComponent(c);
		c = replaceAll(c, '%', '_');
		if (prefixes[c] != null) {
			return;
		}
		var xurl = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/prefixes_' + c + '.xml';
		doGetUrl({url: xurl, load: onPrefixLoad, error: onPrefixError, handleAs: 'xml'});
	}
}

function hasTwoOrMore(frm, fid) {
	return (frm.elements[fid].value != null) && (frm.elements[fid].value.length >= 2);
}

function showMatches(sel, ntRadio) {
	if (navDropDown != null) {
		navDropDown.hide();
	}
	var r = sel.form[ntRadio];
	var nameType = getCheckedValue(r);
	var s = sel.value;
	var prefixes = (nameType.toLowerCase() == 'surname' ? snPrefixes : fnPrefixes);
	if ((s != null) && (s.length > 2)) {
		// Got them already?
		var c = s.charAt(0).toLowerCase();
		c = encodeURIComponent(c);
		c = replaceAll(c, '%', '_');
		if (prefixes[c] != null) {
			findMatches(s, nameType.toLowerCase(), populateDropDown);
		}
		else {
			var xurl = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/prefixes_' + encodeURIComponent(s.charAt(0).toLowerCase()) + '.xml';
			doGetUrl({url: xurl, load: function(data) {onPrefixLoad(data); showMatches(sel,ntRadio);}, error: onPrefixError, handleAs: 'xml'});
		}
	}
}

var dropDownControls = 'search';

function populateDropDown(matches) {
	var s = document.forms['navBarForm'].elements['spossible'];
	s.options.length = 0;
	attachNameMatchesAsOptions(s, matches);
	if (s.options.length > 0) {
		if (s.options.length < s.size) {
			s.size = s.options.length;
		}
		else {
			s.size = 20;
		}
		navDropDown.show();
	}
	else  {
		navDropDown.hide();
	}
}

function showOver(e) {
	if (e) {
		e.className = 'hovered';
	}
}
function showOut(e) {
	if (e) {
		e.className = 'norm';
	}
}
function parentOver(e) {
	var p = e.parentNode;
	if (p) {
		p.className = 'hovered';
	}
}
function parentOut(e) {
	var p = e.parentNode;
	if (p) {
		p.className = 'norm';
	}
}

function applyNameFromSelect(s) {
	var aid = s.options[s.selectedIndex].value;
	var atx = s.options[s.selectedIndex].text;
	if (dropDownControls == 'search') {
		applyName(atx);
	}
	else {
		applyNameToData(aid + ';' + atx);
	}
}

function applyNameFromSelectClick(e, s) {
	if (!e) {
		e = window.event;
	}
	// Enter
	if ((e.which == 13) || (e.keyCode == 13)) {
		applyNameFromSelect(s);
	}
	// Escape
	else if ((e.which == 27) || (e.keyCode == 27)) {
		var f = document.forms['navBarForm'];
		var i = f.elements['sname'];
		if (typeof(i.focus) != 'undefined') {
			i.focus();
		}
		navDropDown.hide();
	}
}

function applyName(aid) {
	navDropDown.hide();
	document.forms['navBarForm'].elements['sname'].value = aid;
	document.forms['navBarForm'].submit();
}

function applyNameToData(aid) {
	navDropDown.hide();
	var currentRegion = window.location.href;
	if (currentRegion.lastIndexOf('?') > 0) {
		currentRegion = currentRegion.substring(0, currentRegion.lastIndexOf('?'));
	}
	// back from xxx/atlas.html
	if (currentRegion.lastIndexOf('/') > 0) {
		currentRegion = currentRegion.substring(0, currentRegion.lastIndexOf('/'));
	}
	// back from xxx/single|double
	if (currentRegion.lastIndexOf('/') > 0) {
		currentRegion = currentRegion.substring(0, currentRegion.lastIndexOf('/'));
	}
	currentRegion = currentRegion.substring(currentRegion.lastIndexOf('/') + 1);
	document.forms['navBarForm'].elements['sname'].value = aid.split(';')[1];
	doUpdateAtlasData(aid.split(';')[0], aid.split(';')[1], currentRegion);
}

function getCheckedValue(rbg) {
	for (var i = 0; i < rbg.length; i++) {
		if (rbg[i].checked) {
			return rbg[i].value;
		}
	}
	return rbg[0].value;
}

function showprops(o, prefix, delimiter) {
	var ln = (delimiter != null ? delimiter : '\n');
	var s = (prefix != null ? prefix + ln : '');
	for (var i in o) {
		if (typeof(o[i]) != 'function')
			s += 'o.' + i + '=' + o[i] + ln;
	}
	alert(s);
}

/** Handle an index page XML response */
function onPrefixLoad(data, nameType) {
	try {
		var xml = data.getElementsByTagName('prefixes');
		xml = xml.item(0);
		var nt = xml.getAttribute('type').toLowerCase();
		var ltr = xml.getAttribute('letter');
		ltr = encodeURIComponent(ltr);
		ltr = replaceAll(ltr, '%', '_');
		var s = xml.firstChild.nodeValue;
		var pfs = s.split(',');
		if (nt == 'forename') {
			fnPrefixes[ltr] = pfs;
		}
		else {
			snPrefixes[ltr] = pfs;
		}
	}
	catch (e) {
		// silent for now!
	}
}

/** Handle an index page XML response */
function onPrefixError(data) {
	showprops(ioargs);
	showprops(data);
}

function replaceAll(str, o, n) {
	while (str.indexOf(o) >= 0) {
		str = str.replace(o, n);
	}
	return str;
}

var once = false;

function refreshSearchList(radioBtn) {
	var f = radioBtn.form;
	var btns = f.elements[radioBtn.name];
	var val = getCheckedValue(btns);
	var p = extractParams();
	findMatches(p.sname, 
					p.nametype, 
					function(matchedNames) {
								var s = document.forms['nameForm1'].elements['mName1'];
								attachNameMatchesAsOptions(s, matchedNames, doGetById('noResults'));
							},
					(val == 'false')
				);
	document.getElementById('searchterm').innerHTML = p.sname;
}

/** Start the process of finding matching names */
function findMatches(nameFragment, nameType, okHandler, includeNonMappable) {
	if (doGetById('waitPanel') != null) {
		doGetById('waitPanel').style.visibility = 'visible';
	}
	var prefixes = (nameType.toLowerCase() == 'surname' ? snPrefixes : fnPrefixes);
	var indexes = (nameType.toLowerCase() == 'surname' ? snIndexes : fnIndexes);
	// Got them already?
	var nfl = nameFragment.toLowerCase();
	nfl = replaceAll(nfl, '+', ' ');
	var c = nfl.charAt(0);
	c = encodeURIComponent(c);
	c = replaceAll(c, '%', '_');
	var pf = nameFragment.substring(0, 2).toLowerCase();
	pf = encodeURIComponent(pf);
	pf = replaceAll(pf, '%', '_');
	once = true;
	if (prefixes[c] != null) {
		var hasUnmapped = indexes[pf + '_status'] == 'all';
		if ((indexes[pf] != null) && (hasUnmapped || (includeNonMappable != true))){
			var matches = new Object();
			var nc = nameFragment.length;
			var o = indexes[pf];
			for (var i in o) {
				if ((o[i].substring(0, nc).toLowerCase() == nfl) && ((includeNonMappable == true) || (i.charAt(0) != 'x'))){
					matches[i] = o[i];
				}
			}
			okHandler(matches);
			if (doGetById('waitPanel') != null) {
				doGetById('waitPanel').style.visibility = 'hidden';
			}
	
		}
		else {
			var url = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/index_' + pf;
			url += (includeNonMappable == true ? '' : '_mappable') + '.xml';
			doGetUrl({url: url, load: function(data) {
												onIndexLoad(data, pf, nameType.toLowerCase()); 
												indexes[pf + '_status'] = (includeNonMappable == true ? 'all' : 'mappable');
												findMatches(nameFragment, nameType, okHandler, includeNonMappable);
										}, 
										error: onIndexError, handleAs: "xml"});
		}
	}
	else {
		// get the prefixes then do the search
		var url = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/prefixes_' + c + '.xml';
		doGetUrl({url: url, load: function(data) {onPrefixLoad(data); findMatches(nameFragment, nameType, okHandler);}, error: onPrefixError, handleAs: "xml"});
	}
}

/** Load an index */
function loadIndex(prefix, nameType) {
	var c = prefix.charAt(0);
	c = encodeURIComponent(c.toLowerCase());
	c = replaceAll(c, '%', '_');
	var prefixes = (nameType.toLowerCase() == 'surname' ? snPrefixes : fnPrefixes);
	var indexes = (nameType.toLowerCase() == 'surname' ? snIndexes : fnIndexes);
	var matches = prefixes[c];
	var got = false;
	for (var i in matches) {
		if (matches[i] == prefix) {
			got = true;
			break;
		}
	}
	if (got) {
		pf = encodeURIComponent(prefix.toLowerCase());
		pf = replaceAll(pf, '%', '_');
		// Got them already?
		if (indexes[pf] != null) {
			return;
		}
		var url = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/index_' + pf + '.xml';
		doGetUrl({url: url, load: onIndexLoad, error: onIndexError, handleAs: "xml"});
	}
}


var lastErrorMsg = '';

/** Handle an index page XML response */
function onIndexLoad(data, pf, ont) {
	var xml = null;
	try {
		xml = data.getElementsByTagName('index');
		xml = xml.item(0);
	}
	catch (ex) {
		lastErrorMsg = ex;
		xml = null;
	}
	if (xml == null) {
		if (ont == 'forename') {
			fnIndexes[pf] = new Object();
		}
		else {
			snIndexes[ltr] = new Object();
		}
		lastErrorMsg = 'data access error!\n' + data;
		return;
	}
	var nt = xml.getAttribute('type').toLowerCase();
	var ltr = xml.getAttribute('prefix');
	ltr = encodeURIComponent(ltr);
	ltr = replaceAll(ltr, '%', '_');
	var c = xml.getElementsByTagName('entry');
	var names = new Object();
	var nid, n;
	for (var i = 0; i < c.length; i++) {
		nid = c.item(i).getAttribute('id');
		if ((c.item(i).getAttribute('src') != null) && (c.item(i).getAttribute('src') != '')) {
			nid += ':' + c.item(i).getAttribute('src');
		}
		n = c.item(i).getAttribute('name');
		names[nid] = n;
	}
	if (nt == 'forename') {
		fnIndexes[ltr] = names;
	}
	else {
		snIndexes[ltr] = names;
	}
}

/** Handle an index page XML response */
function onIndexError(data) {
	lastErrorMsg = 'index ' + data;
}

/** Extract the parameters from a GET URL */
function extractParams() {
	var params = new Object();
	var url = window.location.href;
	if (url.indexOf('?') > 0) {
		url = url.substring(url.indexOf('?') + 1);
		var pairs = url.split('&');
		for (var i in pairs) {
			var n = pairs[i].substring(0, pairs[i].indexOf('='));
			var v = pairs[i].substring(pairs[i].indexOf('=') + 1);
			params[n] = decodeURIComponent(v);
		}
	}
	return params;
}

/** Write out a list of matches */
function writeNameMatchesAsRadio(matches) {
	for (var i in matches) {
		document.write('<p><input type="radio" name="data" value="' + matches[i] + '" id="data_' + matches[i] + '" />');
		document.writeln('<label for="data_' + matches[i] + '">' + i + '</label></p>');
	}
}

var lastMatches = null;

/** Write out a list of matches */
function attachNameMatchesAsRadio(pNode, matches, eNode) {
	var doc = pNode.ownerDocument;
	var first = true;
	for (var i in matches) {
		var p = doc.createElement('p');
		var r = doc.createElement('input');
		r.setAttribute('type' ,'radio');
		r.setAttribute('name', 'data');
		r.setAttribute('value', i + ';' + matches[i]);
		r.setAttribute('id', 'data_' + i);
		if (first) {
			r.setAttribute('checked', 'checked');
			first = false;
		}
		p.appendChild(r);
		r = doc.createElement('label');
		r.setAttribute('for', 'data_' + i);
		r.appendChild(doc.createTextNode(matches[i]));
		p.appendChild(r);
		pNode.appendChild(p);
	}
	if (first && (eNode != null)) {
		eNode.style.display = 'block';
		eNode.style.visibility = 'visible';
	}
	else if (eNode != null) {
		eNode.style.display = 'none';
		eNode.style.visibility = 'hidden';
	}
	lastMatches = matches;
}

/** Write out a list of matches */
function attachNameMatchesAsOptions(sel, matches, eNode) {
	var first = true;
	sel.options.length = 0;
	for (var i in matches) {
		sel.options[sel.options.length] = new Option(matches[i], i);
		if (first) {
			sel.options[sel.options.length - 1].selected = true;
			first = false;
		}
		// Non-mappable
		if (i.charAt(0) == 'x') { 
			sel.options[sel.options.length - 1].style.fontStyle = 'italic';
			sel.options[sel.options.length - 1].className = 'italicised';
		}
	}
	if (first && (eNode != null)) {
		eNode.style.display = 'block';
		eNode.style.visibility = 'visible';
	}
	else if (eNode != null) {
		eNode.style.display = 'none';
		eNode.style.visibility = 'hidden';
	}
	sel.parentNode.style.display = (first ? 'none' : 'block');
	lastMatches = matches;
	checkMappable(sel);
}

/** Thin out the last set of matches based on the text box values */
function thinMatches(sel) {
	/*var s = sel.value;
	if (lastMatches != null) {
		var nc = s.length;
		for (var i in lastMatches) {
			var n = document.getElementById('data_' + i);
			if (n != null) {
				if ((nc < 2) || (lastMatches[i].substring(0, nc).toLowerCase() == s)) {
					n.parentNode.style.display = 'block';
				}
				else {
					n.parentNode.style.display = 'none';
				}
			}
		}
	}*/
}

function findStartLetters(r, tgt, hideThese) {
	if (hideThese) {
		doHideThese(hideThese);
	}
	var f = r.form;
	var t = f.elements[tgt];
	var xurl = siteRootPath + 'instantatlas/xml/index/' + r.value.toLowerCase() + '/firstletters.xml';
	doGetUrl({url: xurl, load: function(data) {fillSelectBox(t, data, true); }, error: function(data) {alert(data); }, handleAs: 'text'});	
}

function findPrefixes(s, tgt, nt, hideThese) {
	if (hideThese) {
		doHideThese(hideThese);
	}
	var f = s.form;
	var t = f.elements[tgt];
	var c = s.options[s.selectedIndex].value;
	if ((c == null) || (c == undefined) || (c == '')) {
		c = s.options[s.selectedIndex].text;
	}
	c = c.charAt(0).toLowerCase();
	var ec = encodeURIComponent(c);
	ec = replaceAll(ec, '%', '_');
	var nameType = getCheckedValue(f.elements[nt]);
	var prefixes = (nameType.toLowerCase() == 'surname' ? snPrefixes : fnPrefixes);
	// Got them already?
	if ((prefixes[ec] != undefined) && (prefixes[ec] != null)) {
		var uppers = new Array(prefixes[ec].length);
		for (var i = 0; i < uppers.length; i++) {
			uppers[i] = prefixes[ec][i].toUpperCase();
		}
		fillSelectBoxFromArray(t, uppers, true);
	}
	else {
		var xurl = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/prefixes_' + encodeURIComponent(c) + '.xml';
		doGetUrl({url: xurl, load: function(data) { onPrefixLoad(data); findPrefixes(s, tgt, nt, hideThese); }, error: onPrefixError, handleAs: 'xml'});
	}
}

function handleSearchKey(inp, e, onDown) {
	if (!e) {
		e = window.event;
	}
	var kc = (e.which != null ? e.which : e.keyCode == 13);
	// Special case some characters...
	// Escape - 27
	if (kc == 27) {
		navDropDown.hide();
	}
	// Down arrow
	else if (kc == 40) {
		var s = document.forms['navBarForm'].elements['spossible'];
		if (navDropDown.isShowing()) {
			if (typeof(s.focus) != 'undefined') {
				s.focus();
			}
		}
		else if (s.options.length > 0) {
			navDropDown.show();
		}
	}
	// Otherwise do the normal work! If it is allowed to...
	else if (!onDown) {
		var fnc = function() {
			constrainSubmit(inp, 'go', 2);
			loadPrefix(inp,'nametype');
			showMatches(inp,'nametype');
		};
		window.clearTimeout();
		window.setTimeout(fnc, 100);
	}
}

function findNames(s, tgt, nt, blankFirstLine, oldMatcher) {
	var f = s.form;
	if (doGetById('waitPanel') != null) {
		doGetById('waitPanel').style.visibility = 'visible';
	}
	var t = f.elements[tgt];
	var nameFragment = s.options[s.selectedIndex].value.toLowerCase();
	var nameType = getCheckedValue(f.elements[nt]);
	/*var okHandler = function(matches) {
		fillSelectBoxFromArray(t, matches, blankFirstLine);
	};
	findMatches(nameFragment, nameType, okHandler, false);
	*/
	var prefixes = (nameType.toLowerCase() == 'surname' ? snPrefixes : fnPrefixes);
	var indexes = (nameType.toLowerCase() == 'surname' ? snIndexes : fnIndexes);
	var c = nameFragment.charAt(0).toLowerCase();
	var ec = encodeURIComponent(c);
	ec = replaceAll(ec, '%', '_');
	var pf = nameFragment.substring(0, 2).toLowerCase();
	pf = encodeURIComponent(pf);
	pf = replaceAll(pf, '%', '_');
	if (prefixes[ec] != null) {
		if (indexes[pf] != null) {
			var matches = new Array();
			var nc = nameFragment.length;
			var o = indexes[pf];
			for (var i in o) {
				if (o[i].substring(0, nc).toLowerCase() == nameFragment) {
					matches[matches.length] = i + ';' + o[i];
				}
			}
			// Might have changed because they typed another letter!
			if ((oldMatcher == null) || (nameFragment == oldMatcher)) {
				fillSelectBoxFromArray(t, matches, blankFirstLine);
			}
			if (doGetById('waitPanel') != null) {
				doGetById('waitPanel').style.visibility = 'hidden';
			}
		}
		else {
			var url = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/index_' + pf + '.xml';
			doGetUrl({url: url, load: function(data) {onIndexLoad(data); findNames(s, tgt, nt, blankFirstLine, nameFragment);}, error: onIndexError, handleAs: "xml"});
		}
	}
	else {
		// get the prefixes then do the search
		var url = siteRootPath + 'instantatlas/xml/index/' + nameType.toLowerCase() + '/prefixes_' + encodeURIComponent(c) + '.xml';
		doGetUrl({url: url, load: function(data) {onPrefixLoad(data); findNames(s, tgt, nt, blankFirstLine, nameFragment);}, error: onPrefixError, handleAs: "xml"});
	}
}

function fillSelectBox(box, rawXml, blankFirstLine) {
	/*var txt = rawXml.substring(rawXml.indexOf('>') + 1); // <?xml ...
	txt = txt.substring(txt.indexOf('>') + 1); // first tag...
	txt = txt.substring(0, txt.indexOf('<'));*/
	var txt = rawXml.documentElement.firstChild.nodeValue;
	var labels = txt.split(',');
	fillSelectBoxFromArray(box, labels, blankFirstLine);
}

function fillSelectBoxFromArray(box, labels, blankFirstLine) {
	box.options.length = 0;
	if (blankFirstLine == true) {
		box.options[0] = new Option(' ', ' ');
	}
	for (var i = 0; i < labels.length; i++) {
		var e = labels[i];
		if (e.indexOf(';') > 0) {
			box.options[box.options.length] = new Option(e.split(';')[1], e.split(';')[0]);
		}
		else if (e != '"') {
			box.options[box.options.length] = new Option(e, e);
		}
		// Non-mappable
		if (e.charAt(0) == 'x') { 
			box.options[box.options.length - 1].style.fontStyle = 'italic';
			box.options[box.options.length - 1].className = 'italicised';
		}
	}
	box.parentNode.style.display = 'inline';
	checkMappable(box);
}

function doHideThese(ids) {
	for (var i = 0; i < ids.length; i++) {
		var e = doGetById(ids[i]);
		if (e != null) {
			e.parentNode.style.display = 'none';
		}
	}
}


function goForm(mapOrData, region) {
	var f = document.forms['nameForm1'];
	var ns = f.elements['mName1'];
	var nid = null;
	var n = null;
	nid = ns.options[ns.selectedIndex].value;
	if (nid.indexOf(':') > 0)  {
		nid = nid.substring(0, nid.indexOf(':'));
	}
	n = ns.options[ns.selectedIndex].text;
	var tpath = (nid.substring(0, 2) == 'sn' ? 'surname' : 'forename');
	var durl = 'instantatlas/xml/' + n.charAt(0).toLowerCase() + '/data/' + tpath + '/' + region.toLowerCase() + '/data_' + nid + '.xml';
	if (mapOrData == 'map') {
		durl = encodeURIComponent(siteRootPath + durl.substring(0, durl.lastIndexOf('.')));
		var aurl = './instantatlas/reports/master/' + region + '/single/atlas.html?data=' + durl + '&name=' + encodeURIComponent(n);
		window.location.href = aurl;
	}
	else if (mapOrData == 'table') {
		window.location.href = siteRootPath + durl;
	}
}

function doGroup(btn, region) {
	var f = btn.form;
	var ns = f.elements['grp'];
	var nid = null;
	var n = null;
	nid = ns.options[ns.selectedIndex].value;
	if (nid.indexOf(':') > 0)  {
		nid = nid.substring(0, nid.indexOf(':'));
	}
	n = ns.options[ns.selectedIndex].text;
	var durl = 'instantatlas/xml/groups/data/' + region.toLowerCase() + '/data_' + nid + '.xml';
	durl = encodeURIComponent(siteRootPath + durl.substring(0, durl.lastIndexOf('.')));
	var aurl = './instantatlas/reports/master/' + region + '/single/groupatlas.html?data=' + durl + '&name=' + encodeURIComponent(n);
	window.location.href = aurl;
}

function findClasses(dataFile, ltr, pNode, classesText, rangeText) {
	if (dataFile.indexOf('/') > 0) {
		dataFile = dataFile.substring(dataFile.lastIndexOf('/') + 1);
	}
	var nid = dataFile.substring(dataFile.lastIndexOf('_') + 1);
	if (doGetById('surname')) {
		doGetById('surname').style.display = (nid.substring(0, 2) == 'sn' ? 'inline' : 'none');
	}
	if (doGetById('forename')) {
		doGetById('forename').style.display = (nid.substring(0, 2) == 'fn' ? 'inline' : 'none');
	}
	var xurl = siteRootPath + 'instantatlas/xml/' + ltr.toLowerCase() + '/classes/classes_' + nid + '.xml';
	doGetUrl({url: xurl, load: function(data) { attachClassesAsTable(pNode, data, classesText, rangeText); }, error: onPrefixError, handleAs: 'xml'});
}

var lastClassText = null;
var lastRangeText = null;
var lastNid = null;
var lastName = null;
var categoricColours = new Object();
categoricColours['A'] = '#050588';
categoricColours['B'] = '#0506f5';
categoricColours['C'] = '#1617f5';
categoricColours['D'] = '#2728f5';
categoricColours['E'] = '#3839f5';
categoricColours['F'] = '#494af5';
categoricColours['G'] = '#5b5bf5';
categoricColours['H'] = '#6c6cf5';
categoricColours['I'] = '#7d7ef5';
categoricColours['J'] = '#8e8ff5';
categoricColours['K'] = '#9fa0f5';
categoricColours['L'] = '#b0b1f5';
categoricColours['M'] = '#c1c2f5';
categoricColours['N'] = '#d3d3f5';
categoricColours['O'] = '#e5e5f5';
categoricColours['P'] = '#f5f5f5';

/** Write out a list of matches */
function attachClassesAsTable(pNode, data, classesText, rangeText) {
	var doc = pNode.ownerDocument;
	while (pNode.hasChildNodes()) {
		pNode.removeChild(pNode.firstChild);
	}
	var first = true;
	var matches = data.getElementsByTagName('band');
	if (matches.length > 0) {
		var tb = '<table><tr><th>';
		tb += classesText;
		tb += '</th><th>';
		tb += rangeText;
		tb += '</th></tr>';
		var rows = new Array(matches.length);
		for (var i = matches.length - 1; i > 0; i--) {
			if (matches.item(i).getAttribute('base') != matches.item(i - 1).getAttribute('base')) {
				var td = '';
				td += '<tr>';
				//tb += '<td style="background-color: ';
				//tb += categoricColours[matches.item(i).getAttribute('label')];
				//tb += '">&nbsp;&nbsp;&nbsp;</td>';
				td += '<td align="center">';
				td += matches.item(i).getAttribute('label');
				td += '</td><td align="center">';
				td += formatNumber(parseFloat(matches.item(i).getAttribute('base')), 1) + ' - ' + formatNumber(parseFloat(matches.item(i - 1).getAttribute('base')), 1);
				td += '</td></tr>';
				rows[i] = td;
			}
		}
		if (matches.item(0) != null) {
			var td = '';
			td += '<tr>';
			//tb += '<td style="background-color: ';
			//tb += categoricColours[matches.item(0).getAttribute('label')];
			//tb += '">&nbsp;</td>';
			td += '<td align="center">';
			td += matches.item(0).getAttribute('label');
			td += '</td><td align="center">';
			td += '&gt; ' + formatNumber(parseFloat(matches.item(0).getAttribute('base')), 1);
			td += '</td>';
			rows[0] = td;
			tb += rows.join(' ');
			tb += '</tr></table>';
			pNode.innerHTML = tb;
			pNode.style.display = 'block';
			lastClassText = classesText;
			lastRangeText = rangeText;
		}
		lastNid = data.getElementsByTagName('classification').item(0).getAttribute('id');
		lastName = data.getElementsByTagName('classification').item(0).getAttribute('name');
	}
}

function formatNumber(n, nd) {
	var m = Math.pow(10, nd);
	var fn = Math.round(n * m) / m;
	var s = '' + fn;
	if ((s.indexOf('.') < 0) && (nd > 0)) {
		s = s + '.';
		for (var i = 0; i < nd; i++) {
			s += '0';
		}
	}
	return s.replace('.', decimalSeparator);
}

function updateAtlasData(ns, region) {
	var nid = null;
	var n = null;
	nid = ns.options[ns.selectedIndex].value;
	n = ns.options[ns.selectedIndex].text;
	doUpdateAtlasData(nid, n, region);
}

function changeDataType(region, categoricOrNumeric) {
	doUpdateAtlasData(lastNid, lastName, region, categoricOrNumeric);
}

function changeGroupData(btn, region) {
	var f = btn.form;
	var ns = f.elements['grp'];
	var nid = null;
	var n = null;
	nid = ns.options[ns.selectedIndex].value;
	if (nid.indexOf(':') > 0)  {
		nid = nid.substring(0, nid.indexOf(':'));
	}
	n = ns.options[ns.selectedIndex].text;
	doUpdateAtlasData(nid, n, region, 'categoric');
}

function doUpdateAtlasData(nid, n, region, categoricOrNumeric) {
	if (nid.indexOf(':') > 0)  {
		nid = nid.substring(0, nid.indexOf(':'));
	}
	var tid = (categoricOrNumeric == 'numeric' ? 't2' : 't1');
	var tpath = (nid.substring(0, 2) == 'sn' ? 'surname' : (nid.substring(0, 2) == 'fn' ? 'forename' : ''));
	var durl = siteRootPath + 'instantatlas/xml/' + (tpath == '' ? 'groups/' : encodeURIComponent(n.charAt(0).toLowerCase()) + '/') + 'data/' + (tpath == '' ? '' : tpath + '/') + region.toLowerCase() + '/data_' + nid + '_' + tid + '.xml';
	var m = thisMovie('instantAtlasReport');
	m.loadThemeFrom(durl);
	if (categoricOrNumeric == 'numeric') {
		doGetById('classesTable').innerHTML = '&nbsp;';
	}
	else {
		findClasses(nid, n.charAt(0).toLowerCase(), doGetById('classesTable'), lastClassText, lastRangeText);
	}
	if (doGetById('searchterm')) {
		doGetById('searchterm').innerHTML = n;
	}
	if (doGetById('surname')) {
		doGetById('surname').style.display = (nid.substring(0, 2) == 'sn' ? 'inline' : 'none');
	}
	if (doGetById('forename')) {
		doGetById('forename').style.display = (nid.substring(0, 2) == 'fn' ? 'inline' : 'none');
	}
}

var mappableAttempts = 0;

function checkMappable(s) {
	var f = document.forms['mapForm1'];
	if (!f) {
		f = s.form;
	}
	if (f) {
		if ((s.options != null) && (s.options.length > 0)) {
			var nid = s.options[s.selectedIndex].value;
			var ds = false;
			// Non mappable?
			ds = (nid.substring(0, 2) != 'fn') && (nid.substring(0, 2) != 'sn');
			for (var i = 0; i < f.elements.length; i++) {
				f.elements[i].disabled = ds && (f.elements[i].nodeName.toLowerCase() == 'button');
			}
			// Where from?
			if (nid.indexOf(':') > 0) {
				var srcId = nid.substring(nid.indexOf(':') + 1);
				var os = '';
				var osi = srcId.split('+');
				for (var i in osi) {
					os += ', ' + origins[osi[i]];
				}
				if ((os != '') && (os.indexOf(', undefined') < 0)) {
					 var p = doGetById('nameSrc');
					 var n = doGetById('nameSrcName');
					 var o = doGetById('nameSrcSrc');
					 if (p && n && o) {
						n.innerHTML = s.options[s.selectedIndex].text;
						o.innerHTML = os.substring(2);
						p.style.display = 'block';
						p.style.top = (15 + Math.round(Math.min((s.selectedIndex * 135.0) / s.options.length, 150))) + 'px';
					 }
					 else if (p) {
						p.style.display = 'none';
					 }
					 o = doGetById('nameNoMap');
					 if (o != null) {
					 	o.style.display = (nid.charAt(0) == 'x' ? 'inline' : 'none');
					 }
					 mappableAttempts = 0;
				}
				else if (mappableAttempts < 10) {
					mappableAttempts++;
					window.setTimeout(function() {checkMappable(s); }, 300);
				}
			}
		}
	}
}

function toggleSpecialCharacters() {
	var b = doGetById('specialCharVisBtn');
	var d = doGetById('specialCharButtons');
	if (d.style.display == 'none') {
		d.style.display = 'block';
		b.innerHTML = 'ñáø...\u25b2';//<img src="' + siteRootPath + 'images/keyboard_key.gif" width="16" height="16" alt="key"/>\u25b2';
	}
	else {
		d.style.display = 'none';
		b.innerHTML = 'ñáø...\u25bc'; //'<img src="' + siteRootPath + 'images/keyboard_key.gif" width="16" height="16" alt="key"/>\u25bc';
	}
}

function addCharacterToForm(btn, c, tgt) {
	var f = btn.form;
	var i = f.elements[tgt];
	i.value += c;
	i.focus();
	constrainSubmit(i, 'go', 2);
	loadPrefix(i,'nametype');
	showMatches(i,'nametype');
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') {
			c = c.substring(1,c.length);
		}
		if (c.indexOf(nameEQ) == 0) {
			return c.substring(nameEQ.length,c.length);
		}
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}
