String.prototype.trim = function() { return (( ar = /^\s*([\s\S]*\S+)\s*$/.exec(this)) ? ar[1] : "" ); }  // example:  str = str.trim();

function setInputClass(elem, defVal)
{
	if((typeof(elem.defVal) == 'undefined') || (elem.defVal == "null") || (elem.defVal == ""))
	{
		// never allow the default value to be null
		if (elem.defVal == "null" || elem.defVal == null)
		{
			elem.defVal = "";
		}
	    elem.setAttribute('defVal', defVal);
	    elem.defVal = defVal;
	}

	// if the value is ever null, switch it back to the default value
	if (elem.value == null || elem.value == "null")
    {
    	elem.value = elem.defVal;
    	classname(elem, 'del', 'chg');
    }

	classname(elem, 'swap', 'act', '');

	var act = classname(elem, 'check', 'act');
	var def = (elem.value == elem.defVal || elem.value.trim() == "");

	if (def && act)
	{
        elem.value = "";
    }
    else if (def)
    {
        elem.value = defVal;
        classname(elem, 'switch', 'chg', 'def');
	}
    else
    {
        classname(elem, 'switch', 'def', 'chg');
    }
	if (act)
	{
//        elem.select();
    }
}

// "constants" for get()
var CHILD_BY_TAG = 'cTAG_ONE';
var CHILD_BY_CLASS = 'cCLASS_ONE';

var CHILDREN_BY_CLASS = 'dCLASS';
var PARENT_BY_CLASS = 'aCLASS';

var CHILDREN_BY_TAG = 'dTAG';
var PARENT_BY_TAG = 'aTAG';

var CHILDREN_BY_TAG_ONELEV = 'dTAG_ONE';
var CHILDREN_BY_CLASS_ONELEV = 'dCLASS_ONE';

var EVENT_BY_TAG = "eTAG";
var EVENT_BY_CLASS = "eCLASS";
var EVENT = "eEVENT";

function get(elem)
{
	if (arguments.length == 1)
	{
		return (isElem(elem)) ? elem : document.getElementById(elem);
	}
	else
	{
		for (var i = 0, args = new Array(); i < arguments.length; i++)
		{
			args.push(arguments[i]);
		}

		return superget(args);
	}
}

function classname(node, op, c1, c2)
{
	if (node = get(node))
	{
		if (op == 'clear')
		{
			node.className = "";
			return;
		}
		if (op == 'split')
		{
			return (node.className.trim() != "") ? node.className.split(/\s+/) : new Array();
		}

		//john added this to make tiny bit more speedy..feb 23/06
		if (op == 'check')
		{
			if (node.className.trim() != '')
			{
				var classnames = node.className.split(/\s+/);

				for (var i = arguments.length - 1; i >= 2; i--)
				{
					if (in_array(classnames, arguments[i]))
					{
						return 1;
					}
				}
			}
			return 0;
		}

		var cn = node.className;
		var index = cn.search('\\b' + c1 + '\\b');
		var exists = (index < 0) ? 0 : 1;
		var middle = "";

		switch (op)
		{
			case 'add':
				middle = c1;
			break;

			case 'swap':
				middle = (exists) ? c2 : "";
			break;
		}

		var length = c1.length;
		index = (exists) ? index : cn.length;

		var pre = cn.substr(0, index).trim();
		var post = cn.substr(index + length).trim();


		node.className = (pre + " " + middle + " " + post).trim();

		if (op == 'switch')
		{
			classname(node, 'add', c2);
		}
		else if (op == 'swap' && !exists)
		{
			classname(node, 'switch', c2, c1);
		}
		return node;
	}
	return null;
}

// helper functions (ignore these)
function superget(args)
{
	var opt = args[1];
	var one_lev = 0;

	switch (opt)
	{
		case 'eEVENT':
		case 'eTAG':
		case 'eCLASS':
			var e = args.shift();
			var baseEl = (e.srcElement) ? e.srcElement : e.target;

			args.shift();
		return ((opt != 'eEVENT' && checkTagOrClass(baseEl, args, opt.charAt(1).toLowerCase()) || opt == 'eEVENT')) ? baseEl : null;

		case 'dTAG_ONE':
		case 'dCLASS_ONE':
			one_lev = 1;

		case 'dCLASS':
		case 'aCLASS':
		case 'dTAG':
		case 'aTAG':
			var node = args.shift();
			var get_type = opt.charAt(1).toLowerCase();

			args.shift();
		return (opt.charAt(0) == 'd') ? getDescendants(node, args, get_type, one_lev) : getAncestor(node, args, get_type);

		case 'cCLASS_ONE':
		case 'cTAG_ONE':
			var node = args.shift();
			var get_type = opt.charAt(1).toLowerCase();
			args.shift();
		return getDescendants(node, args, get_type, 0).pop();

		default:
			for (var i = 0, ret_a = new Array(); i < args.length; i++)
			{
				ret_a.push(get(args[i]));
			}
		return ret_a;
	}
}

function checkTagOrClass(n, crit_a, get_type)
{
	var crit_a = (is_array(crit_a)) ? crit_a : {0: crit_a};
	var add = false;

	for (i in crit_a)
	{
		add = false;

		switch (get_type)
		{
			case 'c':
				var add = classname(n, 'check', crit_a[i]);
			break;

			case 't':
			default:
				var add = (n.tagName.toLowerCase() == crit_a[i].toLowerCase()) ? true : false;
			break;
		}
		if (add)
		{
			return add;
		}
	}
}

function getAncestor(node, args, get_type)
{
	var node = get(node);
	var new_args = new Array();

	for (var i in args)
	{
		new_args.push(args[i]);
	}

	try
	{
		while (node && !checkTagOrClass(node, new_args, get_type))
		{
			try
			{
				node = node.parentNode;
			}
			catch (e)
			{
				node = node;
			}
		}

		return node;
	}
	catch (e)
	{
		return null;
	}
}

function getDescendants(node, args, get_type, one_lev)
{
	var ret_a = new Array();
	var node = get(node);

	for (var i = 0; node && i < node.childNodes.length; i++)
	{
		var n = node.childNodes[i];
		var add = 0;

		if (n.nodeType == 1 && checkTagOrClass(n, args, get_type))
		{
			ret_a.push(n);
		}
		if (n.hasChildNodes() && !one_lev)
		{
			var child_a = getDescendants(n, args, get_type);

			if (child_a.length)
			{
				ret_a = ret_a.concat(child_a);
			}
		}
	}
	return (ret_a.length) ? ret_a : new Array();
}

function isElem(elem)
{
	return (elem && elem.tagName) ? true : false;
}

function show()
{
	return cycle(arguments, 'show');
}

function hide()
{
	return cycle(arguments, 'hide');
}


function cycle(args, op)
{
	for (var i = 0; i < args.length; i++)
	{
		if (args[i])
		{
			switch (op)
			{
				case 'show':
				case 'hide':
					classname(args[i], (op == 'show') ? 'del' : 'add', 'h');
				break;

				case 'hideContent':
				case 'showContent':

					var elem = get(args[i]);

					if (isElem(elem))
					{
						elem.style.visibility = (op == 'hideContent') ? 'hidden' : 'visible';
					}

				break;

				case 'del':
					var el = get(args[i]);

					if (el)
					{
						el.parentNode.removeChild(el);
					}
				break;

				case 'hideIframe':
				case 'showIframe':
					var frame = get(args[i]);

					if (frame)
					{
						if (op == 'hideIframe')
						{
							frame.style.width  = 0;
							frame.style.height = 0;
						}
						else
						{
							frame.style.width  = frame.real_width;
							frame.style.height = frame.real_height;
						}
					}
				break;
			}
		}
	}
	if (i == 1)
	{
		return get(args[0]);
	}
}

function in_array(arr, val)
{
	var found = 0;

	for (var i = 0; i < arr.length; i++)
	{
		if (arr[i] == val)
		{
			found = 1;
			break;
		}
	}

	return found;
} // end in_array


function is_array(obj)
{
	try
	{
		if(typeof(obj) != "object" || obj == null)
		{
			return false;
		}
		else
		{
			// check for absence of obj.splice is a hack that may not work across
			// browsers. needed to do this (or something like it) for safari.
			if (obj.constructor.toString().indexOf("Array") == -1 && !(obj.splice()))
			{
				return false;
			}
			else
			{
				return true;
			}
		}
	}
	catch(e)
	{
		return false;
	}
}





// johonb@gmail.com
// Created:  2007.06.12
var manFields = new Array( 'first_name', 'last_name', 'title', 'organization', 'email', 'phone', 'state');


function harvestFormElems(form)
{
	var found_inputs = [];
	var fieldsets = get(form, CHILDREN_BY_TAG, 'fieldset');

	for (i in fieldsets)
	{
		var inputs = get(fieldsets[i], CHILDREN_BY_TAG, 'input');

		for (j in inputs)
		{
			found_inputs.push(inputs[j]);
		}
	}

	return found_inputs;
}

function formval(elem)
{
	var form = get(elem, PARENT_BY_TAG, 'form');
	var valid = true;
	var field;
	var val;

	var elements = harvestFormElems(form);

	for (i in elements)
	{
		var elem = elements[i];

		if (toValidate(elem.name))
		{
			var mandatory_check = manCheck(elem);

			if (!mandatory_check)
			{
				valid = false;
			}
		}
	}

	if (valid)
	{
		form.submit();
	}
}

function toValidate(elemName)
{
	for (var i=0; i < manFields.length; i++)
	{
		if (elemName == manFields[i])
		{
			return true;
		}
	}

	return false;
}

function showWarning(field)
{
	var fieldset = get(field, PARENT_BY_TAG, 'fieldset');
	var warning = get(fieldset, CHILD_BY_TAG, 'span');

	classname(fieldset, 'add', 'warn');

	show(warning);
}

function hideWarning(field)
{
	var fieldset = get(field, PARENT_BY_TAG, 'fieldset');
	var warning = get(fieldset, CHILD_BY_TAG, 'span');

	classname(fieldset, 'del', 'warn');

	hide(warning);
}

function manCheck(field)
{
	var valid = true;

	valid = (!classname(field, 'check', 'def')) && specialVal(field);

	if (!valid)
	{
		showWarning(field);
		valid = false;
	}
	else
	{
		hideWarning(field);
	}

  return valid;
}

// Add specialized validation here
function specialVal(field)
{
	var rc = true;
	var name = field.name;
	var value = field.value;
	var pos = -1;

	// Is email field?
	if( name.indexOf( 'email' ) >= 0 )
	{
		pos = value.indexOf( '@' );

		if( value.indexOf( '@' ) <= 0 )
		{
			showWarning(field);
			rc = false;
		}
		else if( pos == value.length-1 )
		{
			showWarning(field);
			rc = false;
		}
	} // Valid number?
	else if( name.indexOf( 'employees' ) >= 0 )
	{
		var nof = field.value.replace( /^\s+|\s+$/g, '' ) ;

		if( isNaN( parseInt( nof ) ) || ! isNumeric( nof ) )
		{
			showWarning(field);
			rc = false;
		}
	}

	return rc;
}

// Check for valid numeric strings
function isNumeric( strString )
{
	var strValidChars = "0123456789";
	var strChar;
	var blnResult = true;

	if( strString.length == 0 ) return false;

	// Test strString consists of valid digits listed above
	for( i = 0; i < strString.length && blnResult; i++ )
	{
		strChar = strString.charAt( i );

		if( strValidChars.indexOf( strChar ) == -1 )
		{
			blnResult = false;
		}
	}

	return blnResult;
}
