function tap_formerror(str,frm) { var html = ""; 
	var node = frm.nodeName.toLowerCase(); if (node != 'form') { frm = frm.form; } 
	var presenter = (typeof frm.tap_errorelement != 'undefined')? frm.tap_errorelement: null; 
	
	if (presenter != null) { 
		if (typeof presenter == 'string') { presenter = document.getElementById(presenter); } 
		if (presenter != null && typeof presenter.innerHTML != 'undefined') { 
			// provide css-class based formatting for multi-input form validators to match server-side validation 
			str = str.replace(/\n  ([^\n]+)/g,"<div>$1</div>"); 
			str = str.replace(/((<div>[^<]+<\/div>)+)/g,"<div class=\"tap_formvalidate_list\">$1</div>"); 
			
			// put each error on its own line 
			str = str.split("\n"); presenter.style.display = "block"; 
			for (var x = 0; x < str.length; x++) { html += "<div>" + str[x] + "</div>"; } 
			
			if (node=='form') { presenter.innerHTML = html; frm.tap_errorelement = null; return true; } 
			else { 
				if (presenter.innerHTML.toLowerCase().indexOf(html.toLowerCase()) < 0) { presenter.innerHTML += html; } 
				frm.tap_errorelement = null; return true; 
			} 
		} 
	} return alert(str); 
} 

function tap_formvalues(frm) { 
	var field = (arguments.length > 1 && typeof arguments[1] == 'string')? arguments[1].toLowerCase(): null; 
	var x = 0; var input = null; var ivalue = null; 
	var formdata = new Object(); var iname = null; 
	for (var i = 0; i < frm.length; i++) { input = frm[i]; 
		if (typeof input.name != 'undefined' && input.name.length > 0) { 
			iname = input.name.toLowerCase(); 
			if (field == null || field == iname) { 
				if (input.type == 'button' || input.type == 'submit' || input.type == 'reset') { ; } // buttons shouldn't be used to transport data 
				else if (input.type == 'select-multiple') { 
					for (x = 0; x < input.length; x = x + 1) { 
						if (input.options[x].selected==true) { 
							formdata[iname] = (typeof formdata[iname] == 'undefined')? input.options[x].value : formdata[iname] + ',' + input.options[x].value; 
						} 
					} 
				} else if ((input.type != 'radio' && input.type != 'checkbox') || input.checked == true) { 
					formdata[iname] = (typeof formdata[iname] == 'undefined') ? input.value : formdata[iname] + ',' + input.value; 
				} 
			} 
		} 
	} 
	if (field == null) { return formdata; } 
	else { return (typeof formdata[field] == 'undefined')? '': formdata[field]; } 
} 

function tap_formpopulate(frm,formdata) { 
	var input = null; var iname = null; var x = null; 
	for (var i = 1; i < frm.length; i++) { input = frm[i]; 
		if (typeof input.name != 'undefined' && input.name.length > 0) { 
			iname = input.name.toLowerCase(); 
			if (typeof formdata[iname] != 'undefined') { 
				switch (input.type) {
					case 'radio': { ; } 
					case 'checkbox': { 
						input.checked = (new String(',' + formdata[iname] + ',').toLowerCase().indexOf(',' + input.value.toLowerCase() + ',') >= 0)? true : false; 
						break; 
					} 
					case 'select': { ; } 
					case 'select-one': { ; } 
					case 'select-mulitple': { 
						for (x = 0; x < input.length; x++) { 
							input.options[x].selected = (new String(',' + formdata[iname] + ',').toLowerCase().indexOf(',' + input.value.toLowerCase() + ',') >= 0)? true : false; 
						} break; 
					} 
					default: { input.value = formdata[iname]; } 
				} 
				if (typeof input.id != 'undefined' && input.id.length > 0 
				&& typeof eval(input.id + '_focus') != 'undefined') 
					{ eval(input.id + '_focus();'); } 
			} 
		} 
	} 
} 

function tap_requirefield(str) { return (str.match(new RegExp('\\S'))!=null); } 

function tap_inputislength(str,len) { return (tap_requirefield(str)==false || str.length == parseInt(len)); }  
function tap_inputislengthmax(str,len) { return (tap_requirefield(str)==false || str.length <= parseInt(len)); } 
function tap_inputislengthmin(str,len) { return (tap_requirefield(str)==false || str.length >= parseInt(len)); } 
function tap_inputislengthrange(str,range) { range = range.split(','); 
	return (tap_requirefield(str)==false || (str.length >= parseInt(range[0]) && str.length <= parseInt(range[1]))); 
} 

function tap_inputisemail(str) { 
	if (tap_requirefield(str)==false) { return true; } 
	else { return str.toLowerCase().match(new RegExp('^[a-z0-9][-.\\w]*@[-a-z0-9]+(\\.[a-z]{2,6}){1,3}$'))!=null; } 
} 

function tap_inputishttp(str) { 
	if (tap_requirefield(str)==false) { return true; } 
	else { return str.toLowerCase().match(new RegExp('^https?://([-a-z0-9]+\\.)?[-a-z0-9]+(\\.[a-z]{2,6}){1,3}([?/].*)?$'))!=null; } 
} 

function tap_inputisdate(str,format) { 
	if (tap_requirefield(str)==false) { return true; } 
	else if (typeof tap_lsinputisdate == 'function') { return tap_lsinputisdate(str); } 
	else { return str.match(new RegExp(format))!=null; } 
} 

function tap_inputisnumeric(str) { if (tap_requirefield(str)==false) { return true; } else { return (isNaN(str) == false); } } 
function tap_inputisnumericmax(str,mx) { return (tap_requirefield(str)==false || (isNaN(str) == false && parseFloat(str) <= parseFloat(mx))); } 
function tap_inputisnumericmin(str,mn) { return (tap_requirefield(str)==false || (isNaN(str) == false && parseFloat(str) >= parseFloat(mn))); } 
function tap_inputisnumericrange(str,range) { 
	range = range.split(','); 
	if (tap_requirefield(str)==false) { return true; } 
	else if (isNaN(str)==true 
		|| parseFloat(str) < parseFloat(range[0]) 
		|| parseFloat(str) > parseFloat(range[1])) { return false; } 
	else { return true; } 
} 

function tap_importHTML(html,target) { 
	var node = null; var e = null; 
	var stage = null; var fname = null; 
	target.innerHTML = html.content; 
	if (typeof html.events != 'undefined') { 
		for (var i in html.events) { 
			node = document.getElementById(i); 
			for (stage in html.events[i]) { 
				for (e in html.events[i][stage]) { 
					if (stage=='client') { fname = e.substring(2,e.length); } else { fname = e; } 
					fname = node.id + '_' + fname; 
					window[fname] = new Function(html.events[i][stage][e]); 
					if (stage=='client') { node[e] = window[fname]; } 
				} 
			} 
		} 
	} 
} 


