/*****************************************************************
* mikroE basic scripts
* Author: Nikola Topalovic @ http://mikroe.com/
* $Date: 2005/08/30 09:40$
*****************************************************************/

/** Form validation **/
// from http://www.onlinetools.org/articles/unobtrusivejavascript/

// Test if DOM is available and if there is an element called 'required'
function checkform(of) {
	if(!document.getElementById || !document.createTextNode){return;}
	if(!document.getElementById('required')){return;}

// Define error messages and split the required fields
	var errorID='errormsg';
	var errorClass='errorfield';
/* changes for linked list */
	var errorMsg='Please enter or change the following fields:';
/* end changes for linked list */
	var errorImg='/images/alert.gif';
	var errorAlt='Error';
	var errorTitle='This field has an error!';
	var reqfields=document.getElementById('required').value.split(',');

// Cleanup old mess
	// if there is an old errormessage field,delete it
	if(document.getElementById(errorID)) {
		var em=document.getElementById(errorID);
		em.parentNode.removeChild(em);
	}
	// remove old images and classes from the required fields
	for(var i=0;i<reqfields.length;i++){
		var f=document.getElementById(reqfields[i]);
		if(!f){continue;}
		/*if(f.previousSibling && /img/i.test(f.previousSibling.nodeName)) {
			f.parentNode.removeChild(f.previousSibling);
		}*/
		//~nt
		if(f.parentNode.lastChild && /img/i.test(f.parentNode.lastChild.nodeName)) {
			f.parentNode.removeChild(f.parentNode.lastChild);
		}
		f.className='';
	}
// loop over required fields
	for(var i=0;i<reqfields.length;i++) {
// check if required field is there
		var f=document.getElementById(reqfields[i]);
		if(!f){continue;}
// test if the required field has an error,
// according to its type
		switch(f.type.toLowerCase()) {
			case 'text':
				if(f.value=='' && f.id!='email'){cf_adderr(f);}
// email is a special field and needs checking
				if(f.id=='email' && !cf_isEmailAddr(f.value)){cf_adderr(f);}
			break;
			case 'textarea':
				if(f.value==''){cf_adderr(f);}
			break;
			case 'checkbox':
				if(!f.checked){cf_adderr(f);}
			break;
			case 'select-one':
				if(!f.selectedIndex && f.selectedIndex==0){cf_adderr(f);}
			break;
		}
	}
	return !document.getElementById(errorID);

	/* Tool methods */
	function cf_adderr(o) {
		// create image, add to and colourise the error fields
		var errorIndicator=document.createElement('img');
		errorIndicator.alt=errorAlt;
		errorIndicator.src=errorImg;
		errorIndicator.title=errorTitle;
		o.className=errorClass;
		//o.parentNode.insertBefore(errorIndicator,o);
		o.parentNode.appendChild(errorIndicator); //~nt

	// Check if there is no error message
		if(!document.getElementById(errorID)) {
		// create errormessage and insert before submit button
			var em=document.createElement('div');
			em.id=errorID;
			var newp=document.createElement('p');
			newp.appendChild(document.createTextNode(errorMsg));
			em.appendChild(newp);
/* added for linked list */
			var newul=document.createElement('ul');
			em.appendChild(newul);
/* end added for linked list */
			// find the submit button
			for(var i=0;i<of.getElementsByTagName('input').length;i++) {
				if(/submit/i.test(of.getElementsByTagName('input')[i].type)) {
					var sb=of.getElementsByTagName('input')[i];
					break;
				}
			}
			if(sb) {
				sb.parentNode.insertBefore(em,sb);
			}
		}
/* added for linked list */
		var em=document.getElementById(errorID).getElementsByTagName('ul')[0];
		var newli=document.createElement('li');
		var newa=document.createElement('a');
		for(var i=0;i<of.getElementsByTagName('label').length;i++) {
			if(of.getElementsByTagName('label')[i].htmlFor==o.id) {
				var txt=of.getElementsByTagName('label')[i].firstChild.nodeValue;
				break;
			}
		}

		newa.appendChild(document.createTextNode(txt));
		newa.href='#'+f.id;
		newa.onclick=function() {
			var loc=this.href.match(/#(\w.+)/)[1];
			document.getElementById(loc).focus();
			return false;
		};
		newli.appendChild(newa);
		em.appendChild(newli);
/* end added for linked list */
	}
	function cf_isEmailAddr(str) {
		return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	}
}


/** aqtree3, explorer-style tree; for the sitemap **/

/*
aqtree3clickable.js
http://www.kryogenix.org/code/browser/aqlists/

Converts an unordered list to an explorer-style tree, with clickable
icons. To make this work,simply make the top UL of your nested
unordered list of class "aqtree3clickable".
*/

addEvent(window,"load",makeTreesC);

function makeTreesC() {
	// We don't actually need createElement, but we do
	// need good DOM support, so this is a good check.
	if (!document.createElement) return;

	uls=document.getElementsByTagName("ul");
	for (uli=0;uli<uls.length;uli++) {
		ul=uls[uli];
		if (ul.nodeName=="UL" && ul.className=="aqtree3clickable") {
			processULELC(ul);
		}
	}
}

function processULELC(ul) {
	if (!ul.childNodes || ul.childNodes.length==0) return;
	// Iterate LIs
	for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
		var item=ul.childNodes[itemi];
		if (item.nodeName=="LI") {
			// Iterate things in this LI
			var a;
			var subul;
			subul="";
			for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
				var sitem=item.childNodes[sitemi];
				switch (sitem.nodeName) {
					case "A": a=sitem; break;
					case "UL": subul=sitem;
								 processULELC(subul);
								 break;
				}
			}
			if (subul) {
				associateELC(a,subul);
			} else {
				a.parentNode.className="aq3bullet";
			}
		}
	}
}

function associateELC(a,ul) {
	if (a.parentNode.className.indexOf('aq3open')==-1)
	a.parentNode.className='aq3closed';
	a.onclick=function() {
		this.parentNode.className=(this.parentNode.className=='aq3open')?"aq3closed":"aq3open";
		return false;
	};
}

/* Utility functions */

function addEvent(obj,evType,fn) {
	/* adds an eventListener for browsers which support it
	 Written by Scott Andrew: nice one, Scott */
	if (obj.addEventListener) {
		obj.addEventListener(evType,fn,true);
		return true;
	} else if (obj.attachEvent) {
		var r=obj.attachEvent("on"+evType,fn);
		return r;
	} else {
		return false;
	}
}
