/*
 * Copyright (C) Jonathan Turkanis and Lincoln Law Center LLC 2006
 * File: coderage/controls/_pub/set_field.js
 * Date: 2006-12-22
 */
 
 //
// Contains the implementation of the function set_session_variable()
// which allows PHP session variables to be set using JavaScript.
// Before page unloads, all pairs (name, val) such that 
// set_session_variable(name, val) has been called will be submitted
// sent to the server using XMLHttpRequest and added to the array of PHP
// session variables.
//

echo_on = false;
required_fields = new Array();
field_values = new Array();
validators = new Array();
has_field_values = false;

function register_required_field(name, label)
{
	required_fields[name] = label;
}

function unregister_required_field(name)
{
    if (!(name in required_fields))
        return;
	var required = new Array();
	for (var f in required_fields)
		if (f != name)
			required[f] = required_fields[f];
	required_fields = required;
}

function set_field_value(name, value, validator, msg)
{
	echo ("name: " + name + ", value: " + value)
	field_values[name] = value;
	if (value !== '')
		has_field_values = true;
	if (document.forms[0][name].value != value)
		document.forms[0][name].value = value;
	if (value !== '' && validator)
		register_validator(name, validator, msg);
	echo("form value: " + document.forms[0][name].value);
}

window.set_session_variable = set_field_value;

function register_validator(name, validator, msg)
{
	validators[name] = [ validator, msg ];
}

function submit_if_valid(next)
{
	echo('submit if valid');
	var dirty = '';
	for (var f in field_values)
	   dirty += f + ',';
	document.forms[0].dirty_fields.value = dirty.substr(0, dirty.length - 1);
	if (!do_bypass_validation()) {
		for (var f in required_fields) {
		    //alert('checking ' + f + '; document.forms[0][f]=' + document.forms[0][f]);
			if ( document.forms[0][f] && 
				 is_visible(document.forms[0][f]) && 
				 !field_is_set(f) && 
				 (!has_field_values || field_values[f] == undefined || field_values[f] == '') ) 
			{
				alert("The field '" + required_fields[f] + "' is required");
				return;
			}	
		}
		for (var v in field_values) {
			if ( validators[v] != undefined && 
				 is_visible(document.forms[0][v]) && 
				 !test_value(validators[v][0], field_values[v]) ) 
			{
				alert(validators[v][1]);
				return;
			}
		}
	}
	//disable_buttons();
	hide_private_fields();
	remove_invisible_fields();
	if (next != null) {
		var href = document.location.href;
		var q = href.lastIndexOf("?");
		document.forms[0].current_page.value = href;
		document.forms[0].next_page.value = 
			href.substr(0, href.lastIndexOf("/") + 1) + 
			next + document.location.search;
	}
	document.forms[0].submit();

}

function is_visible(elt)
{		 		
	while (elt != null)
	{
		if ( elt.style && 
			 elt.style.display != undefined && 
			 elt.style.display == 'none' )
		{
			return false;
		}
		elt = elt.parentNode;
	}
	return true;
}

function field_is_set(id) {
    echo("testing field " + id + "; value = " +  document.forms[0][id]);
	elt = document.forms[0][id];
	echo ('field_is_set, id: ' + id + ' type: ' + elt.type + ' value: ' + elt.value);
	if (elt.length && elt[0].type == 'radio') {
		for (z = 0; z < elt.length; ++z) {
			if (elt[z].checked)
				return true;
		}
		return false;
	}
	return elt.type == 'checkbox' ?
	  	elt.checked :
	  	(elt.localName == 'radio' ? elt.value != '' && elt.value != undefined : 
	  		(elt.type == undefined ? false : elt.value != ''));
} 

function test_value(validator, value)
{
	return typeof(validator) == 'function' ?
		validator(value) :
		validator.test(value);
}

function do_bypass_validation()
{
	return window.bypass_validation == '1';
}

function disable_buttons()
{
	var submit = document.getElementsByTagName('input');
	for (var z = submit.length - 1; z != -1; --z) {
		var b = submit.item(z);
		if (b.type == 'submit' || b.type == 'button' || b.type == 'image') 
			b.disabled = true;
	}
}

function hide_private_fields()
{
    if (!/^get$/i.test(document.forms[0].method))
        return;
	for (var p in document.forms[0]) {
		elt = document.forms[0][p];
		if (elt && elt.name && elt.name.charAt && elt.name.charAt(0) == '_') {
			elt.value = '';
		}
	}
}

function remove_invisible_fields()
{
	var stack = Array(document.forms[0]);
	while (stack.length) {
	    var node = stack.pop();
	    if (node.style && node.style.display == "none") {
	        node.parentNode.removeChild(node);
	        continue;
	    }
    	for (var z = 0; z < node.childNodes.length; ++z)
    	   stack.push(node.childNodes.item(z));
	}
}

function get_private_field(id)
{
	var elt = document.getElementById(id);
	for (var z = 0; z < elt.childNodes.length; ++z)
	   if (elt.childNodes.item(z).type) // skip text nodes
	       return elt.childNodes.item(z);
	return null;
}

function echo(msg) { if (window.echo_on) alert(msg); }
