	//[ v2009.1212 ei-xapp.js
	//[
	//[	<script type="text/javascript" src="/scripts/js/ei-xapp.js"></script>
	//[	<script>
	//[		Event.observe(window, 'load', function() {
	//[			XappForm.Validate('golfer_form');
	//[		});
	//[	</script>
	//[
	//[	<style>	
	//[		input, textarea, select{ border:1px solid #808080; }
	//[		form .required{ background-color: #fffbcb; }
	//[		form .error{ background-color: #ffdae3; }
	//[		/*light #F2F7FB dark #F9FBFD*/
	//[	</style> 
	var XappForms = new Hash();
	var XappForm = 
	{
		CssClassRequired: 'required',
		CssClassError: 'error',
		handler: null,
		
	    Validate: function(form, config)
	    {
			var form_id = (form.id != undefined) ? form.id : form;
			
			XappForm.handler = (config != undefined) ? config : XappForm.handler;
			
			Event.observe(form_id, 'submit', XappForm.Review);			
			
			//[ TODO: add populate config to Xapp.forms var
			
	    },
	    Review: function(event)
		{
	    	if( event.target.id )
	    	{
				var field_errors = 0;
		
				//---[ get fields ]---
				var inputs = event.target.getInputs();
				
				for( i=0; i < inputs.length; i++ )
				{
					var field_name = (inputs[i].id != undefined) ? inputs[i].id : inputs[i].name;
		
					if( $(field_name) && $(field_name).visible() )
					{
						if( $(field_name).hasClassName(XappForm.CssClassRequired) )
						{
							if( $(field_name).value.blank() )
							{
								XappForm.SetError(field_name, true);
			
								field_errors++;
							}
							else if( field_name.indexOf("email") > -1 )
							{
								XappForm.SetError(field_name, false);
				
			        			if( !XappForm.IsValidEmail( $(field_name).value ) )
			        			{
			        				XappForm.SetError(field_name);
			        			
			        				field_errors++;	
			        			}
							}
							else
							{
								XappForm.SetError(field_name, false);
							}
						}
					}
				}
				
				//[ Validate Check Boxes
				var cb_inputs = event.target.getInputs('checkbox');
				var cb_index = '';

				for( i=0; i < cb_inputs.length; i++ )
				{
					var field_name = (cb_inputs[i].id != undefined) ? cb_inputs[i].id : cb_inputs[i].name;
				
					if( $(field_name) && $(field_name).visible() )
					{
						if( $(field_name).hasClassName(XappForm.CssClassRequired) )
						{
							//[ find *_label or label_* or use msg box
							var label_name = $('label_' + field_name) ? 'label_' + field_name : field_name + '_label';
							
							if( $(label_name) && $(label_name).visible() )
							{
								XappForm.SetError(label_name, !$(field_name).checked );
							}
							else
							{
								if( !$(field_name).checked )
									alert('The form is missing a required checkbox.');
							}
						}
					}
					
					cb_index += field_name;
				
					if( i < cb_inputs.length -1 )
						cb_index += ',';	
				}
				
				/*/
				//[ redo this concept but add subtract yes/no hidden fields for non checked boxes on submit 
				//---[ add checkbox index to form ]---
				if( !cb_index.blank() && !$('checkbox_index') )
				{
					var cbs = new Element('input', {'type':'hidden','name':'checkbox_index','id':'checkbox_index','value':cb_index});
					$(event.target.id).insert(cbs);
				}
				/**/
				
				//[ handle drop menus <select
				var select_inputs = event.target.getElementsByTagName("select");
				field_errors += XappForm.ProcessFields(select_inputs);
				
				//[ handle <textarea fields
				var textarea_inputs = event.target.getElementsByTagName("textarea");
				field_errors += XappForm.ProcessFields(textarea_inputs);				

				
				if( XappForm.handler != null && XappForm.handler != undefined)
					field_errors += XappForm.handler(this); 				
	    	
				if( field_errors == 0 )
					return true;	    	
	    	}

	    	event.stop();
		},
		//////////////////////////////////////////////////
		ProcessFields: function(inputs)
		{
			var field_errors = 0;
			
			for(var i=0; i < inputs.length; i++ )
			{
				var field_name = (inputs[i].id != undefined) ? inputs[i].id : inputs[i].name;
			
				if( $(field_name) && $(field_name).visible() )
				{
					if( $(field_name).hasClassName(XappForm.CssClassRequired) )
					{
						if( $(field_name).value.blank() )
						{
							XappForm.SetError(field_name, true);
		
							field_errors++;
						}
						else
						{
							XappForm.SetError(field_name, false);
						}							
					}
				}
			}
			
			return field_errors;
		},
		//////////////////////////////////////////////////
		SetError: function(field_name, error_on)
		{
			if( error_on == undefined || error_on == true )
				Element.addClassName(field_name, XappForm.CssClassError);
			else
				Element.removeClassName(field_name, XappForm.CssClassError);
		},            		
		IsValidEmail: function(email)
		{
			var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	
			return pattern.test(email);
		},
		Listen: function()
		{
			new PeriodicalExecuter(	function(pe) 
			{
				var forms = document.getElementsByTagName("form");
				
				for (var i=0; i < forms.length; i++) 
				{
					var f = forms[i].id;
					
					//[ new form
					if( XappForms.get(f) == undefined )
					{
						XappForms.set(f, true);				
						XappForm.Validate(f);
					}
				}
				/**/
				//if( confirm("Stop?\n\n" + msg) ) pe.stop();		
			}, 1);			
		}
		/**/
	};

	
	////////////////////////////////////////////
	// XAPP FORM LOADER
    $A( document.getElementsByTagName("script")).findAll( function(s) { 
    	return (s.src && s.src.match(/ei-xapp\.js(\?.*)?$/)) }).each( function(s) {

    	if( s.src.indexOf("?skip=") > -1 )
    	{
    		var url = s.src.substr(s.src.indexOf("?skip="), s.src.length).replace('?skip=', '');
    		
    		//[ commans mean skip multiple forms
    		if( url.indexOf(",") > 0 )
    		{
    			var forms = url.split(',');
    			
    			forms.each( function(n) {
    				XappForms.set(n, true);	
    			});
    		}
    		else
    		{
    			XappForms.set(url,true);
    		}
    	}
    	
    	XappForm.Listen();
    });
 	////////////////////////////////////////////
 	
 	
	function mysqlDate (timestamp)
	{
		var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
		var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
		
		return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
	}	

	Date.prototype.format = function(format) {
	    var result = "";
	    for (var i = 0; i < format.length; ++i) {
	        result += this.dateToString(format.charAt(i));
	    }
	    return result;
	}
	
	Date.prototype.dateToString = function(character) 
	{
		//---[ TODO: determine if upper or lower case and add 0 ]---
		
	    switch (character) 
	    {
		    case "Y": return this.getFullYear(); break;
		    case 'm': return this.getMonth() + 1; break;
		    case 'd':return this.getDate(); break;
			case 'H':return this.getHours(); break;
			case 'i':return this.getMinutes(); break;
			case 's':return this.getSeconds(); break;
	    	default: return character; break;
	    }
	} 	
 	
 	
	String.prototype.DashedCode = function() 
	{
		var code = this.replace(/^\s+|\s+$/g,"");
		code = code.replace(/[^a-zA-Z 0-9]+/g,'');			
		code = code.replace(/[-' ']/g,'-');
		
		return code.toLowerCase();			
	}