function set_value(fieldname,value,form)
{
	if ( typeof form == 'undefined' )
		var form = document.forms[0];
	// must go all this trouble because everthing farts on document.forms[0].name.value if name is an int
	for (i=0; i<form.length; i++)
	{
		if ( typeof form.elements[i].name != 'undefined' && form.elements[i].name == fieldname )
		{
			form.elements[i].value = value;
			break;
		}
	}
}
// if form has validated, sets value of all submit buttons to please wait and disables them
function please_wait(node_form,sub)
{
	if ( node_form && typeof node_form.checkValidity == "function" && !node_form.checkValidity() )
		return;
	if ( typeof sub == "undefined" )
		sub = true;
	for ( f=0; f<document.forms.length; f++ )
	{
		var form = document.forms[f];
		for ( i=0; i<form.length; i++ )
		{
			if ( typeof form.elements[i].type != 'undefined' && form.elements[i].type == 'submit' )
			{
				form.elements[i].value_old = form.elements[i].value;
				form.elements[i].value = 'Please Wait...';
				form.elements[i].disabled = true;
			}
		}
	}
	if ( sub && typeof node_form != 'undefined' )
		node_form.submit();
}
function un_wait()
{
	for ( f=0; f<document.forms.length; f++ )
	{
		var form = document.forms[f];
		for ( i=0; i<form.length; i++ )
		{
			if ( typeof form.elements[i].type != 'undefined' && form.elements[i].type == 'submit' && typeof form.elements[i].value_old != 'undefined' )
			{
				form.elements[i].disabled = false;
				form.elements[i].value = form.elements[i].value_old;
			}
		}
	}
}
function get_form_elements(form_id,name)
{
	var es_all = document.getElementById(form_id).elements;
	var es = [];
	if ( es_all )
		for ( i=0; i<es_all.length; i++ )
		{
			var e = es_all[i];
			if ( e.getAttribute('name') == name )
				es.push(e);
		}
	return es
}
function get_value(form_id,name)
{
	var ret = [];
	var es = get_form_elements(form_id,name);
	for ( i=0; i<es.length; i++ )
	{
		var e = es[i];
		var type = e.getAttribute('type');
		if ( in_array(type,['radio','checkbox']) )
		{
			if ( e.checked )
				ret.push(e.value);
		}
		else if ( type == "select" && e.getAttribute('multiple') )
		{
			for ( j=0; j<e.options.length; j++ )
				if ( e.options[j].selected )
					ret.push(e.options[j].value);
		}
		else
		{
			var val = e.value;
			var ph = e.getAttribute('placeholder')
			if ( val == ph )
				val = '';
			ret.push(val);
		}
	}
	if ( name.indexOf('[]') < 0 )
		ret = typeof ret[0] == "undefined"
			? ""
			: ret[0];
	return ret;
}
// http://parentnode.org/javascript/working-with-the-cursor-position/
function setCaretTo(obj, pos)
{
	if (obj.createTextRange) {
		var range = obj.createTextRange();
		range.move("character", pos);
		range.select();
	}
	else if (typeof obj.selectionStart == 'number') {
		obj.focus();
		obj.setSelectionRange(pos, pos);
	}
}
wf2_check_implementation = function()
{
	//debug('wf2_check_implementation');
	var testForm = document.createElement('form');
	var results = {
		'radio'		: true,
		'checkbox'	: true
	};
	if ( testForm.checkValidity )
	{
		var testInputs = [];
		var addTestWidget = function(type,checked)
		{
			var node = document.createElement('input');
			node.type		= type;
			node.name		= type+'_validity_test';
			node.required	= 'required';
			node.checked	= checked;
			testForm.appendChild(node);
			testInputs.push(node);
		}
		addTestWidget('radio',false)
		addTestWidget('radio',true)
		addTestWidget('checkbox',false)
		addTestWidget('checkbox',true)
		results = {
			'radio'		: testInputs[0].checkValidity(),
			'checkbox'	: testInputs[2].checkValidity()
		};
	}
	return results;
}
function set_required(form_id,name,req)
{
	//debug('set_required',name,req);
	var es = get_form_elements(form_id,name);
	node_form = document.getElementById(form_id);
	for ( var i=0; i<es.length; i++ )
	{
		var e = es[i];
		var c = true;
		while ( c )
		{
			var type = e.getAttribute('type');
			var req_handled_correctly = typeof wf2_implementation[type] == 'boolean'
				? wf2_implementation[type]
				: true;
			if ( !req_handled_correctly )
				req = false;
			if ( req )
			{
				if ( e.form )
					e.setAttribute('required',"");
			}
			else
			{
				e.removeAttribute('required');
				classNameRemove(e,'invalid');
			}
			if ( classNameHas(e,'field_container') )
				c = false;
			else
			{
				e = e.parentNode;
				if (  e == node_form )
					c = false;
			}
		}
	}
}
function in_array(v,a)
{
	for ( var i=0; i<a.length; i++ )
		if ( a[i] == v )
			return true;
	return false;
}
function classNameHas(node,className)
{
	var re = new RegExp('\\b'+className+'\\b','i');
	var str = node.className;
	return str && str.match(re);
}
function classNameAdd(node,className)
{
	var str = node.className;
	if ( !classNameHas(node,className) )
		node.className = str == null
			? className
			: str + ' ' + className;
}
function classNameRemove(node,className)
{
	str = node.className;
	if ( str )
	{
		var classes = str.split(' ');
		for ( i=0; i<classes.length; i++ )
			if ( classes[i].toLowerCase()  == className.toLowerCase()  )
				classes.splice(i,1);
		node.className = classes.join(' ');
	}
}
function getEvtTarget(evt)
{
	return evt.target
		? evt.target
		: evt.srcElement;
}
//addEvent(document.getElementById(id), 'event-name', handler, byAssignment);
function addEvent(obj, event_name, fnc)
{
	if ( obj )
	{
		if ( obj.attachEvent )
			obj.attachEvent("on"+event_name, fnc);
		else if ( obj.addEventListener )
			obj.addEventListener(event_name, fnc, false);
	}
}
//
//from http://www.atan.cn/article.asp?id=517 and http://dean.edwards.name/weblog/2006/06/again/
onDomLoaded = function(func)
{
	if ( typeof Prototype == 'object' )
	{
		document.observe('dom:loaded',func);
		return;
	}
	else if ( typeof jquery == 'object' )
	{
		$(document).ready(func);
		return;
	}
	function init()
	{
		var script;
		if (arguments.callee.done)
			return;
		arguments.callee.done = true;
		if (_timer)
			clearInterval(_timer);
		//do stuff
		func();
		if ( script = document.getElementById("__ie_onload") )
			script.parentNode.removeChild(script);
	};
	/* for Mozilla/Opera9 */
	if (document.addEventListener)
		document.addEventListener("DOMContentLoaded", init, false);
	/* for Internet Explorer */
	/*@cc_on @*/
	/*@if (@_win32)
	document.write('<script id="__ie_onload" defer><\/script>');
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function() {
		if ( this.readyState == "complete" )
			init(); // call the onload handler
	};
	/*@end @*/
	/* for Safari */
	if ( /WebKit/i.test(navigator.userAgent) )
	{
		var _timer = setInterval( function()
		{
			if ( /loaded|complete/.test(document.readyState) )
				init();
		}, 10);
	}
	/* for other browsers */
	window.onload = init;
};
addEvent(window,'focus',un_wait);
var functions_form_class_loaded = false;
addEvent(window,'load',function()
{
	if ( functions_form_class_loaded )
		return;
	//debug('functions_form_class: window loaded');
	functions_form_class_loaded = true;
	var forms = document.getElementsByTagName('form');
	for ( i=0; i<forms.length; i++ )
	{
		var form = forms[i];
		for ( j=0; j<form.length; j++ )
		{
			var input = form.elements[j];
			if ( input.getAttribute('autofocus') != null )
			{
				try {
					input.focus();
				}
				catch(e){}
			}
		}
	}
});
onDomLoaded( function()
{
	//debug('functions_form_class: dom loaded');
	wf2_implementation = wf2_check_implementation();
	var inputs = document.getElementsByTagName('input');
	for ( i=0; i<inputs.length; i++ )
	{
		var node = inputs[i];
		var type = node.getAttribute('type');
		var req_handled_correctly = typeof wf2_implementation[type] == 'boolean'
			? wf2_implementation[type]
			: true;
		// populate value with placeholder
		if ( ( !node.checkValidity || node.wf2_tiny ) && ( ph = node.getAttribute('placeholder') ) )
		{
			var chars = 0;
			if ( node.value==='' || node.value == ph )
			{
				classNameAdd(node,'placeholder');
				node.value = ph;
			}
			else
			{
				//classNameRemove(node,'placeholder');	// needs to be done onload.IE hasn't populated back button values yet
			}
			addEvent(node,'focus',function(evt)
			{
				chars = 0;
				var node = getEvtTarget(evt);
				if ( node.value == node.getAttribute('placeholder') )
					setCaretTo(node,0);
				// Firefox selects AFTER the focus event when using tab..
			});
			addEvent(node,'click',function(evt)
			{
				chars = 0;
				var node = getEvtTarget(evt);
				if ( node.value == node.getAttribute('placeholder') )
					setCaretTo(node,0);
			});
			addEvent(node,'blur',function(evt)
			{
				var node = getEvtTarget(evt);
				var ph = node.getAttribute('placeholder');
				if ( node.value==='' || node.value == ph )
				{
					classNameAdd(node,'placeholder');
					node.value = ph;
				}
				else
					classNameRemove(node,'placeholder');
			});
			addEvent(node,'keydown',function(evt)
			{
				var node = getEvtTarget(evt);
				if ( chars == 0 && node.value == node.getAttribute('placeholder') )
				{
					chars++;
					node.value = "";
					classNameRemove(node,'placeholder');
				}
			});
		}
		if ( !req_handled_correctly )
		{
			node.removeAttribute('required');
		}
	}
})

