/**
 * ------------------------------------------------------------------
 * Javascript form validation framework
 * @author Chris Keeley <chris@dnaadvertising.co.uk>
 * @version 0.1
 * @date 28 Feb 2008
 * ------------------------------------------------------------------
 * 
 * This file contains defintions of form parsing configurations.
 * In order to define a form config object and link it to the parsing framework
 * it is necessary to define a new object and assign it into the directory 
 * using: directory.insert( 'identifer string', objectVariable );
 *
 * In order to be compatible the defined config object needs to contain 
 * a member object identified by the 'name' attribute of the element in your form.
 *
 * E.g. <form><input type="text" name="my_text" ... /></form>
 * 
 * The corresponding directory entry needs to look like this:
 * 
 * 	var myFormConfig = { 
 
 *		// directory entry 
 * 		my_text: { 
 *			required: boolean, 
 *			exec: function(value) { 
 *				... 
 *			} 
 *		}
 *
 * The 'configObject.exec' member defines any functionality that you would like to perform on this element value and the 'configObject.required' member specifies whether
 * or not this item will undergo any processing. 
 * ---------------------------------------------------------------------------------------------------
 * - Note: if 'configObject.required' is set to false then no other members are necessary as the element will 
 * - not receive any futher processing.
 * ---------------------------------------------------------------------------------------------------
 * The return value is a boolean true if you want the element to be processed or false if not.
 *
 * XXX @TODO XXX
 * This file will quickly become very large and messy. 
 * Need to move the definitons across to XML or JSON file and need ability to 
 * have a file for each form config to seperate things out somewhat. 
 */
//====================================================================================
// COMMON FUNCTION DEFINITIONS 
//====================================================================================

/**
 * This function tests an email string against a regular expression 
 * designed to identify an rfc compliant email address.
 * This regex test is not 100% accurate but will validate for the majority of cases.
 */
function validateEmail(emailString) {
	var regex = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{ 1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/i
	var result = regex.exec(emailString);
	if(result == null) {
		return false;
	}
	return true;
}
 
//====================================================================================
// BEGIN CONFIG DEFINITIONS 
//====================================================================================
 
/////////////////////////////////////////////////////////////////////////////////////////////
// ADD NEWS ITEM FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var newsItemConfig = {
	// title 
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the short description 
	short_description: { 	
		required: true, 
		type: 'string',
		name: 'Short Description',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the date 
	date: { 
		required: true, 
		type: 'string',
		name: 'Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the news article 
	newsArticle: { 
		required: true, 
		type: 'string',
		name: 'News Article',
		error: 'This field is required',
		execute: function(value) { 
			/*
			var inst = FCKeditorAPI.GetInstance("newsArticle");
			var sValue = inst.GetHTML();
			if(sValue == '') {
				return false;
			}
			return true;
			*/
			// need to get at the content in a different way 
			var value = tinyMCE.getContent();
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the image file upload
	image: {	
		required: true, 
		type: 'string',
		name: 'Image',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the alt text for the image
	image_alt: { 
		required: false, 
		type: 'string',
		name: 'Image Alt Text',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
// insert the object into the directory 
directory.insert('newsitemform', newsItemConfig);
/////////////////////////////////////////////////////////////////////////////////////////////
// EDIT NEWS ITEM FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var editNewsItemConfig = {
	// title 
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the short description 
	short_description: { 	
		required: true, 
		type: 'string',
		name: 'Short Description',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the date 
	date: { 
		required: true, 
		type: 'string',
		name: 'Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the news article 
	newsArticle: { 
		required: true, 
		type: 'string',
		name: 'News Article',
		error: 'This field is required',
		execute: function(value) { 
			/*
			var inst = FCKeditorAPI.GetInstance("newsArticle");
			var sValue = inst.GetHTML();
			if(sValue == '') {
				return false;
			}
			return true;
			*/
			var value = tinyMCE.getContent();
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the image file upload
	image: {	
		required: false, 
		type: 'string',
		name: 'Image',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the alt text for the image
	image_alt: { 
		required: false, 
		type: 'string',
		name: 'Image Alt Text',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
// insert the object into the directory 
directory.insert('editnewsitemform', editNewsItemConfig);
/////////////////////////////////////////////////////////////////////////////////////////////
// NEW USER FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var newUserConfig = {
	// title 
	username: { 
		required: true, 
		type: 'string',
		name: 'Username',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// password
	password: { 
		required: true, 
		type: 'string',
		name: 'Password',
		error: 'A password is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// confirm password
	confirm_password: { 
		required: true, 
		type: 'string',
		name: 'Confirm Password',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			// hack for password comparison check
			var sword = $F('password').toLowerCase();
			var cword = $F('confirm_password').toLowerCase();
			if(sword != cword) {
				this.error = "Passwords do not match!";
			} else {
				return true;
			}
		return false;
		}
	},
	member_groups: { 
		required: true, 
		type: 'string',
		name: 'Member Groups',
		error: 'You must select at least one group',
		execute: function(value) { 
			if($('member_groups').options.length == 0) {
				this.error = "You must assign the user to at least one group!";
				return false;
			} else {
				var groupIdList = new Hash();
				$A($('member_groups').options).each( function( elem, index ) {
					groupIdList.set(elem.text, elem.value);
				});
				$('group_id_list').value = groupIdList.toJSON() ;
			}
			return true;
		}
	}
}
directory.insert('adduserform', newUserConfig);
/////////////////////////////////////////////////////////////////////////////////////////////
// EDIT USER FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var editUserConfig = {
	// title 
	username: { 
		required: true, 
		type: 'string',
		name: 'Username',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// password
	password: { 
		required: false, 
		type: 'string',
		name: 'Password',
		error: 'A password is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// confirm password
	confirm_password: { 
		required: false, 
		type: 'string',
		name: 'Confirm Password',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			// hack for password comparison check
			var sword = $F('password').toLowerCase();
			var cword = $F('confirm_password').toLowerCase();
			if(sword != cword) {
				this.error = "Passwords do not match!";
			} else {
				return true;
			}
			
		return false;
		}
	},
	member_groups: { 
		required: true, 
		type: 'string',
		name: 'Member Groups',
		error: 'You must select at least one group',
		execute: function(value) { 
			if($('member_groups').options.length == 0) {
				this.error = "You must assign the user to at least one group!";
				return false;
			} 
			else {
				var groupIdList = new Hash();
				$A($('member_groups').options).each( function( elem, index ) {
					groupIdList.set(elem.text, elem.value);
				});
				$('group_id_list').value = groupIdList.toJSON() ;
			}
			return true;
		}
	}
}
directory.insert('edituserform', editUserConfig);
/////////////////////////////////////////////////////////////////////////////////////////////
// LOGIN FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var adminForm = {
	// title 
	username: { 
		required: true, 
		type: 'string',
		name: 'Username',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// password
	password: { 
		required: true, 
		type: 'string',
		name: 'Password',
		error: 'A password is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('adminform', adminForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// ADD CONTACT FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var addContactForm = {
	// firstname  
	first_name: { 
		required: true, 
		type: 'string',
		name: 'Firstname',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// lastname 
	last_name: { 
		required: true, 
		type: 'string',
		name: 'Lastname',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Contact Phone 
	contact_phone: { 
		required: true, 
		type: 'string',
		name: 'Contact Phone',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// mobile phone
	mobile_phone: { 
		required: true, 
		type: 'string',
		name: 'Mobile Phone',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Email Address
	// Duplication - refactor into accessible function (@see editContactForm)
	email_address: { 
		required: true, 
		type: 'string',
		name: 'Email Address',
		error: 'This field is required',
		execute: function(value) { 
			if(value == "") {
				return false;
			}
			else if(!validateEmail(value)) {
				this.error = "Email is not in a valid format";
				return false;
			}
			return true;
		}
	},
	// address_one
	address_one: { 
		required: true, 
		type: 'string',
		name: 'Address One',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_two
	address_two: { 
		required: false, 
		type: 'string',
		name: 'Address Two',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_three
	address_three: { 
		required: false, 
		type: 'string',
		name: 'Address Three',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_four
	address_four: { 
		required: false, 
		type: 'string',
		name: 'Address Four',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// town
	town: { 
		required: true, 
		type: 'string',
		name: 'Town',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Region
	region: { 
		required: true, 
		type: 'string',
		name: 'Region',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Postcode
	postcode: { 
		required: true, 
		type: 'string',
		name: 'Postcode',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('addcontactform', addContactForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// EDIT CONTACT FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var editContactForm = {
	// firstname  
	first_name: { 
		required: true, 
		type: 'string',
		name: 'Firstname',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// lastname 
	last_name: { 
		required: true, 
		type: 'string',
		name: 'Lastname',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Contact Phone 
	contact_phone: { 
		required: true, 
		type: 'string',
		name: 'Contact Phone',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// mobile phone
	mobile_phone: { 
		required: true, 
		type: 'string',
		name: 'Mobile Phone',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Email Address
	// Duplication - refactor into accessible function (@see addContactForm)
	email_address: { 
		required: true, 
		type: 'string',
		name: 'Email Address',
		error: 'This field is required',
		execute: function(value) { 
			if(value == "") {
				return false;
			}
			else if(!validateEmail(value)) {
				this.error = "Email is not in a valid format";
				return false;
			}
			return true;
		}
	},
	// address_one
	address_one: { 
		required: true, 
		type: 'string',
		name: 'Address One',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_two
	address_two: { 
		required: false, 
		type: 'string',
		name: 'Address Two',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_three
	address_three: { 
		required: false, 
		type: 'string',
		name: 'Address Three',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_four
	address_four: { 
		required: false, 
		type: 'string',
		name: 'Address Four',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// town
	town: { 
		required: true, 
		type: 'string',
		name: 'Town',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Region
	region: { 
		required: true, 
		type: 'string',
		name: 'Region',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Postcode
	postcode: { 
		required: true, 
		type: 'string',
		name: 'Postcode',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('editcontactform', editContactForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// ADD HIRE CONTACT FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var addHireContactForm = {
	// firstname  
	name: { 
		required: true, 
		type: 'string',
		name: 'Firstname',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// mobile phone
	phone: { 
		required: true, 
		type: 'string',
		name: 'Mobile Phone',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Email Address
	// Duplication - refactor into accessible function (@see editContactForm)
	email: { 
		required: true, 
		type: 'string',
		name: 'Email Address',
		error: 'This field is required',
		execute: function(value) { 
			if(value == "") {
				return false;
			}
			else if(!validateEmail(value)) {
				this.error = "Email is not in a valid format";
				return false;
			}
			return true;
		}
	},
	// address_one
	address1: { 
		required: true, 
		type: 'string',
		name: 'Address One',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_two
	address2: { 
		required: false, 
		type: 'string',
		name: 'Address Two',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_three
	address3: { 
		required: false, 
		type: 'string',
		name: 'Address Three',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_four
	address4: { 
		required: false, 
		type: 'string',
		name: 'Address Four',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// town
	town: { 
		required: true, 
		type: 'string',
		name: 'Town',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Region
	region: { 
		required: true, 
		type: 'string',
		name: 'Region',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Postcode
	postcode: { 
		required: true, 
		type: 'string',
		name: 'Postcode',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	/**
	 * This is an additional function to handle 
	 * arbitrary conditions that are too difficult to 
	 * fit into the current framework.
	 * Of course this means that the framework is flawed
	 * but we wont get into that.
	 */
	additional_checkbox_processing: {
		required: true, 
		type: 'function',
		name: 'checkbox_processing',
		error: '',
		/**
		 * Element Protocol specifies the prefix of the 
		 * checkbox group to process and is followed by the number of checkboxes 
		 * to parse. The values are delimeted by ':' e.g option:17
		 * @param {Object} elementProtocol
		 */
		execute: function( elementProtocol ) { 
			
			var errorCount = 0;
			var protocolTokens = elementProtocol.split( ":" );
			var elementId = protocolTokens[ 0 ];
			var count = protocolTokens[ 1 ];
			var valueString = "";
			var sep = "";
			var firstRun = true;
			
			for( var i = 0; i < count; i++ ) {
				var checkboxElement = $( elementId + "_" + i );
				if ( checkboxElement ) {
					if ( checkboxElement.checked == true ) {
						if( valueString != "" ) {
							sep = ":";
						}
						valueString = valueString + sep + checkboxElement.value;
					}
					else {
						errorCount++;
					}
				}
			}

			if( errorCount == count ) {
				this.name = 'Programmes and Facilities';
				this.error = "You must select at least one option";
				return false;
			}
			else {
				/**
				 * format the list into a JSON string and insert into the page.
				 */
				var selectedList = new Element( 'input', {
					'type':'hidden',
					'id': 'selectedOptions',
					'name': 'selectedOptions',
					'value': valueString
				});
				$('addhirecontactform').appendChild( selectedList );
				return true;
			}
		}
	}
}
directory.insert('addhirecontactform', addHireContactForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// EDIT HIRE CONTACT FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var editHireContactForm = {
	// firstname  
	name: { 
		required: true, 
		type: 'string',
		name: 'Firstname',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// mobile phone
	phone: { 
		required: true, 
		type: 'string',
		name: 'Mobile Phone',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Email Address
	// Duplication - refactor into accessible function (@see editContactForm)
	email: { 
		required: true, 
		type: 'string',
		name: 'Email Address',
		error: 'This field is required',
		execute: function(value) { 
			if(value == "") {
				return false;
			}
			else if(!validateEmail(value)) {
				this.error = "Email is not in a valid format";
				return false;
			}
			return true;
		}
	},
	// address_one
	address1: { 
		required: true, 
		type: 'string',
		name: 'Address One',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_two
	address2: { 
		required: false, 
		type: 'string',
		name: 'Address Two',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_three
	address3: { 
		required: false, 
		type: 'string',
		name: 'Address Three',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// address_four
	address4: { 
		required: false, 
		type: 'string',
		name: 'Address Four',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// town
	town: { 
		required: true, 
		type: 'string',
		name: 'Town',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Region
	region: { 
		required: true, 
		type: 'string',
		name: 'Region',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Postcode
	postcode: { 
		required: true, 
		type: 'string',
		name: 'Postcode',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	/**
	 * This is an additional function to handle 
	 * arbitrary conditions that are too difficult to 
	 * fit into the current framework.
	 * Of course this means that the framework is flawed
	 * but we wont get into that.
	 */
	additional_checkbox_processing: {
		required: true, 
		type: 'function',
		name: 'checkbox_processing',
		error: '',
		/**
		 * Element Protocol specifies the prefix of the 
		 * checkbox group to process and is followed by the number of checkboxes 
		 * to parse. The values are delimeted by ':' e.g option:17
		 * @param {Object} elementProtocol
		 */
		execute: function( elementProtocol ) {
			var errorCount = 0;
			var protocolTokens = elementProtocol.split( ":" );
			var elementId = protocolTokens[ 0 ];
			var count = protocolTokens[ 1 ];
			var valueString = "";
			var sep = "";
			var firstRun = true;
			for( var i = 0; i < count; i++ ) {
				var checkboxElement = $( elementId + "_" + i );
				if ( checkboxElement ) {
					if ( checkboxElement.checked == true ) {
						if( valueString != "" ) {
							sep = ":";
						}
						valueString = valueString + sep + checkboxElement.value;
					}
					else {
						errorCount++;
					}
				}
			}
			if( errorCount == count ) {
				this.name = 'Programmes and Facilities';
				this.error = "You must select at least one option";
				return false;
			}
			else {
				/**
				 * format the list into a JSON string and insert into the page.
				 */
				var selectedList = new Element( 'input', {
					'type':'hidden',
					'id': 'selectedOptions',
					'name': 'selectedOptions',
					'value': valueString
				});
				$('edithirecontactform').appendChild( selectedList );
				return true;
			}
		}
	}
}
directory.insert('edithirecontactform', editHireContactForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// DOWNLOAD CONTACTS BY DATE CRITERIA FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var csvDateCriteriaForm = {
	// firstname  
	from_date: { 
		required: true, 
		type: 'string',
		name: 'From Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// firstname  
	to_date: { 
		required: true, 
		type: 'string',
		name: 'To Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('csvdatecriteriaform', csvDateCriteriaForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// UPLOAD NEWSLETTER FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var newsLetterForm = {
	// Title  
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Newsletter  
	newsletter: { 
		required: true, 
		type: 'string',
		name: 'Newsletter',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('newsletterform', newsLetterForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// UPLOAD GALLERY IMAGE FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var galleryImageForm = {
	// Title  
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Description   
	description: { 
		required: true, 
		type: 'string',
		name: 'Description',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Newsletter  
	image: { 
		required: true, 
		type: 'string',
		name: 'Image',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('galleryimageform', galleryImageForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// UPLOAD EDIT/UPDATE GALLERY IMAGE FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var editGalleryImageForm = {
	// Title  
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Description   
	description: { 
		required: true, 
		type: 'string',
		name: 'Description',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Newsletter  
	image: { 
		required: false, 
		type: 'string',
		name: 'Image',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('editgalleryimageform', editGalleryImageForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// STATISTICS
/////////////////////////////////////////////////////////////////////////////////////////////
//updatestatsform
var editStatsForm = {
	// Date
	date: { 
		required: true, 
		type: 'string',
		name: 'Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},  
	// Hydro
	hydro: { 
		required: true, 
		type: 'string',
		name: 'Hydro',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Wind
	wind: { 
		required: true, 
		type: 'string',
		name: 'Wind',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Energy from Waste
	energy_waste: { 
		required: true, 
		type: 'string',
		name: 'Energy from Waste',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Biomass Electricity
	biomass_elec: { 
		required: true, 
		type: 'string',
		name: 'Biomass Electricity',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Biomass Heat
	biomass_heat: { 
		required: true, 
		type: 'string',
		name: 'Biomass Heat',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// Wave and Tidal
	wave_tidal: { 
		required: true, 
		type: 'string',
		name: 'Wave and Tidal',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
directory.insert('updatestatsform', editStatsForm);
/////////////////////////////////////////////////////////////////////////////////////////////
// ADD PRESS ITEM FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var addPressConfig = {
	// title 
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the short description 
	short_description: { 	
		required: true, 
		type: 'string',
		name: 'Short Description',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the date 
	date: { 
		required: true, 
		type: 'string',
		name: 'Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the news article 
	publication: { 
		required: true, 
		type: 'string',
		name: 'Publication',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the image file upload
	pdf_file: {	
		required: true, 
		type: 'string',
		name: 'PDF File',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
// insert the object into the directory 
directory.insert('addpressitemform', addPressConfig);
/////////////////////////////////////////////////////////////////////////////////////////////
// EDIT PRESS ITEM FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var editPressConfig = {
	// title 
	title: { 
		required: true, 
		type: 'string',
		name: 'Title',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the short description 
	short_description: { 	
		required: true, 
		type: 'string',
		name: 'Short Description',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the date 
	date: { 
		required: true, 
		type: 'string',
		name: 'Date',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the news article 
	publication: { 
		required: true, 
		type: 'string',
		name: 'Publication',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	},
	// the image file upload
	pdf_file: {	
		required: true, 
		type: 'string',
		name: 'PDF File',
		error: 'This field is required',
		execute: function(value) { 
			if( value == '' ) {
				return false;
			}
			return true;
		}
	}
}
// insert the object into the directory 
directory.insert('editpressitemform', editPressConfig);
/////////////////////////////////////////////////////////////////////////////////////////////
// CSV DOWNLOAD CONTACTS FORM
/////////////////////////////////////////////////////////////////////////////////////////////
var csvForm = { /* pass straight through */ }
directory.insert('csvform', csvForm);
//====================================================================================
// END CONFIG DEFINITIONS 
//====================================================================================





