/**
* FORMS
*/

var FormHelper = new function () {
	
	var email_regex = (/\b[A-Z0-9\._%\+\-]+@[A-Z0-9\.\-]+\.[A-Z]{2,4}\b/i);
	var text_regex = (/\w+/i);
	var zip_regex = (/[0-9]{5}(\-[0-9]{4})?/);
	var height_regex = (/[0-9,]{3,}/);
	var number_regex = (/^([0-9]+\.?[0-9]*|\.[0-9]+)$/);
	var int_regex = (/^[0-9]+$/);
	var pending_register = false;
	
	var clear_highlight = function() {
		var content_holder = document.getElementById( 'contentHolder' );
		var inputs = content_holder.getElementsByTagName( 'input' );
		var i;
		for ( i = 0; i < inputs.length; i++ ) {
			var input = inputs[i];
			var classes = input.getAttribute( 'class' ) || '';
			classes = classes.replace( 'highlight', '' );
			classes = classes.replace( (/\s+/g), ' ' );
			input.setAttribute( 'class', classes );
		}
	};
	
	var highlight = function( element ) {
		element.setAttribute( 'class', element.getAttribute( 'class' ) + ' highlight' );
	};
	
	/*	Contact helpers	*/
	
	var validate_contact = function() {
		var name = document.getElementById( 'name' ),
			email = document.getElementById( 'contact_email' ),
			organization = document.getElementById( 'organization' ),
			invalid = [],
			invalidStr = []
			i;
		//var types = document.getElementsByName( 'type' );				//	Don't need to test, guaranteed to have an appropriate value (radio group)
		
		clear_highlight();
		
		if ( !text_regex.test( organization.value ) ) {
			invalid.push( organization );
			invalidStr.push( 'Organization Name' );
		}
		
		if ( !text_regex.test( name.value ) ) {
			invalid.push( name );
			invalidStr.push( 'Name' );
		}
		
		if ( !email_regex.test( email.value ) ) {
			invalid.push( email );
			invalidStr.push( 'Email' );
		}
		
		if ( invalid.length === 0 ) {
			return true;
		}
		
		for ( i = 0; i < invalid.length; i++ ) {
			highlight( invalid[i] );
		}
		
		$().toastmessage( 'showToast', {type:'error', text:'Please check the following fields: <ul><li>' + invalidStr.join('</li><li>') + '</li></ul>'} );
		
		return false;
	};
	
	var contact_complete = function() {// req ) {
		var name = document.getElementById( 'name' );
		var email = document.getElementById( 'email' );
		var organization = document.getElementById( 'organization' );
		
		name.value = '';
		email.value = '';
		organization.value = '';
	};
	
	this.submit_contact = function() {
		var error = document.getElementById( 'contact_error' );
		error.innerHTML = '';
		if ( validate_contact() ) {
			//document.forms[0].submit();
			AjaxRequest.submit_form( document.forms[0], 'Mailer' );
			
			contact_complete();
		}
		return false;
	};
	
	/*	Login helpers	*/
	
	var validate_login = function() {
		var email = document.getElementById( 'email' );
		var password = document.getElementById( 'password' );
		
		clear_highlight();
		
		if ( email_regex.test( email.value ) ) {
			if ( password.value.length > 0 ) {
				return true;
			}
			highlight( password );
		}
		highlight( email );
		return false;
	};
	
	var serialize_login = function() {
		var email = document.getElementById( 'email' );
		var password = document.getElementById( 'password' );
		
		var json_obj = {};
		json_obj.email = email.value;
		json_obj.password = password.value;
		
		return JSON.stringify( json_obj );
	};
	
	var login_complete = function( req ) { //function( data, textStatus, jqXHR ) {
		var email = document.getElementById( 'email' );
		var password = document.getElementById( 'password' );
		
		email.value = '';
		password.value = '';
		
		var data = JSON.parse( req.responseText );
		var d = new Date( data.expires );
		DataStorage.store_data( 'id', data.id, d );
		DataStorage.store_data( 'email', data.email, d );
		DataStorage.store_data( 'sessionID', data.sessionId, d );
		DataStorage.store_data( 'expires', d, d );
		DataStorage.store_data( 'loggedIn', 1, d );
		
		loginCompleteAnimation();
	};
	
	var login_error = function() {// req ) {
		jQuery().toastmessage( 'showToast', {
			type: 'error',
			text: 'An error was experienced attempting to log in.'
		} );
	};
	
	this.submit_login = function() {
		if ( validate_login() ) {
			var data = serialize_login();
			
			AjaxRequest.post( {
				"url": "Login",
				"parameters": data,
				"onSuccess": login_complete,
				"onError": login_error
			} );
		}
		return false;
	};
	
	/*	Register helpers	*/
	
	var validate_register = function() {
		var registerForm = jQuery('#registerForm'),
			valid = true,
			invalid = [];
		
		clear_highlight();
		
		registerForm.find( 'input[required=required]' ).each( function() {
			var el = this,
				$el = jQuery(this),
				id = $el.attr('id'),
				classes = this.className.split(' '),
				val = $el.attr('value') || $el.val(),
				regex = text_regex,
				match_length = false;
			
			if ( (/email/i).test( id ) ) {
				regex = email_regex;
			} else if ( (/zip/i).test( id ) ) {
				regex = zip_regex;
			} else if ( (/height/i).test( id ) ) {
				regex = height_regex;
			} else if ( (/date/i).test( id ) ) {
				var d = new Date(val);
				if ( d.toString() === 'Invalid Date' ) {
					highlight( el );
					valid = false;
				}
			} else if ( jQuery.inArray( 'int', classes ) > -1 ) {
				//regex = int_regex;
				//match_length = true;
				
				if ( (''+val).length <= 0 || isNaN( parseInt( val, 10 ) ) ) {
					highlight(el);
					valid = false;
					invalid.push( $el.attr('title') );
					return;
				}
			} else if ( jQuery.inArray( 'number', classes ) > -1 ) {
				//regex = number_regex;
				//match_length = true;
				
				if ( (''+val).length <= 0 || isNaN( parseFloat( val ) ) ) {
					highlight(el);
					valid = false;
					invalid.push( $el.attr('title') );
					return;
				}
			} else if ( (/password/i).test( id ) ) {
				return;
			} else if ( (/terms/i).test( id ) ) {
				return;
			}
			
			if ( match_length && (regex.exec( val ).length >= 1 && regex.exec( val )[0] !== val) ) {
				if ( el.nodeName.toLowerCase() === 'input' && el.type.toLowerCase() !== 'hidden' ) {
					highlight( el );
				}
				valid = false;
				invalid.push( $el.attr('title') );
			}
			
			if ( !regex.test( val ) ) {
				if ( el.nodeName.toLowerCase() === 'input' && el.type.toLowerCase() !== 'hidden' ) {
					highlight( el );
				}
				valid = false;
				if ( (''+invalid[invalid.length-1]) !== $el.attr('title') ) {
					invalid.push( $el.attr('title') );
				}
			}
		} );
		
		var pass = jQuery('#register_password').attr('value') || jQuery('#register_password').val(),
			pass2 = jQuery('#register_confirmPassword').attr('value') || jQuery('#register_confirmPassword').val(),
			pel = document.getElementById('register_password'),
			pel2 = document.getElementById('register_confirmPassword'),
			terms = document.getElementById('terms');
			
		if ( (''+pass) !== (''+pass2) ) {
			highlight( pel );
			highlight( pel2 );
			valid = false;
			invalid.push( jQuery('#register_password').attr('title') );
			invalid.push( jQuery('#register_confirmPassword').attr('title') );
		}
		
		if ( !terms.checked ) {
			valid = false;
			invalid.push( jQuery(terms).attr('title') );
		}
		
		if ( !valid ) {
			$().toastmessage( 'showToast', {type:'error', text:'Some of your input was not valid. Please correct it. Check the following:<br /><ul><li>'+invalid.join('</li><li>')+'</li></ul>'} );
		}
		
		return valid;
	};
	
	var validate_register_section = function( section ) {
		var sec = jQuery('#registerForm .sub-content-wrapper').children( '#wrapper' + (+section) ),
			valid = true,
			invalid = [];
		
		clear_highlight();
		
		sec.find( 'input[required=required]' ).each( function() {
			var el = this;
			var $el = jQuery(this);
			var id = $el.attr('id');
			var classes = this.className.split(' ');
			var val = $el.attr('value') || $el.val();
			var regex = text_regex;
			var match_length = false;
			
			if ( (/email/i).test( id ) ) {
				regex = email_regex;
			} else if ( (/zip/i).test( id ) ) {
				regex = zip_regex;
			} else if ( (/height/i).test( id ) ) {
				regex = height_regex;
			} else if ( (/date/i).test( id ) ) {
				var d = new Date(val);
				if ( d.toString() === 'Invalid Date' ) {
					highlight( el );
					valid = false;
				}
			} else if ( jQuery.inArray( 'int', classes ) > -1 ) {
				//regex = int_regex;
				//match_length = true;
				
				if ( (''+val).length <= 0 || isNaN( parseInt( val, 10 ) ) ) {
					highlight(el);
					valid = false;
					invalid.push( $el.attr('title') );
					return;
				}
			} else if ( jQuery.inArray( 'number', classes ) > -1 ) {
				//regex = number_regex;
				//match_length = true;
				
				if ( (''+val).length <= 0 || isNaN( parseFloat( val ) ) ) {
					highlight(el);
					valid = false;
					invalid.push( $el.attr('title') );
					return;
				}
			} else if ( (/password/i).test( id ) ) {
				return;
			} else if ( (/terms/i).test( id ) ) {
				return;
			}
			
			if ( match_length && (regex.exec( val ).length >= 1 && regex.exec( val )[0] !== val) ) {
				if ( el.nodeName.toLowerCase() === 'input' && el.type.toLowerCase() !== 'hidden' ) {
					highlight( el );
				}
				valid = false;
				invalid.push( $el.attr('title') );
			}
			
			if ( !regex.test( val ) ) {
				if ( el.nodeName.toLowerCase() === 'input' && el.type.toLowerCase() !== 'hidden' ) {
					highlight( el );
				}
				valid = false;
				if ( (''+invalid[invalid.length-1]) !== $el.attr('title') ) {
					invalid.push( $el.attr('title') );
				}
			}
		} );
		
		if ( (+section) === 3 ) {
			var pass = jQuery('#register_password').attr('value') || jQuery('#register_password').val(),
				pass2 = jQuery('#register_confirmPassword').attr('value') || jQuery('#register_confirmPassword').val(),
				pel = document.getElementById('register_password'),
				pel2 = document.getElementById('register_confirmPassword'),
				terms = document.getElementById('terms');
				
			if ( (''+pass) !== (''+pass2) ) {
				highlight( pel );
				highlight( pel2 );
				valid = false;
				invalid.push( jQuery('#register_password').attr('title') );
				invalid.push( jQuery('#register_confirmPassword').attr('title') );
			}
			
			if ( !terms.checked ) {
				valid = false;
				invalid.push( jQuery(terms).attr('title') );
			}
		}
		
		if ( !valid ) {
			$().toastmessage( 'showToast', {type:'error', text:'Some of your input was not valid. Please correct it. Check the following:<br /><ul><li>'+invalid.join('</li><li>')+'</li></ul>'} );
		}
		
		return valid;
	};
	
	var serialize_register = function() {
		var first_name = document.getElementById( 'firstName' ),
			last_name = document.getElementById( 'lastName' ),
			address = document.getElementById( 'address' ),
			state = document.getElementById( 'state_select' ),
			zip = document.getElementById( 'zip' ),
			email = document.getElementById( 'register_email' ),
			website = document.getElementById( 'website' ),
			phone = document.getElementById( 'phone' ),
			mobile = document.getElementById( 'mobile' ),
			im = document.getElementById( 'im' ),
			birth_date = document.getElementById( 'birthdate' ),
			male = document.getElementById('male'),
			female = document.getElementById('femaile'),
			sex = male.checked ? male : female,
			school = document.getElementById( 'school' ),
			school_city = document.getElementById( 'schoolCity' ),
			school_state = document.getElementById( 'schoolState_select' ),
			grade = document.getElementById( 'grade' ),
			graduation_date = document.getElementById( 'graduationDate' ),
			major = document.getElementById( 'major' ),
			gpa = document.getElementById( 'gpa' ),
			sat = document.getElementById( 'sat' ),
			act = document.getElementById( 'act' ),
			rank = document.getElementById( 'rank' ),
			height = document.getElementById( 'height_select' ),
			weight = document.getElementById( 'weight' ),
			bats = document.getElementById( 'bats_select' ),
			throws = document.getElementById( 'throws_select' ),
			primary_position = document.getElementById( 'primaryPosition_select' ),
			secondary_position = document.getElementById( 'secondaryPosition_select' ),
			school_team = document.getElementById( 'schoolTeam' ),
			school_coach_name = document.getElementById( 'schoolCoachName' ),
			school_coach_email = document.getElementById( 'schoolCoachEmail' ),
			summer_team = document.getElementById( 'summerTeam' ),
			summer_coach_name = document.getElementById( 'summerCoachName' ),
			summer_coach_email = document.getElementById( 'summerCoachEmail' ),
			password = document.getElementById( 'register_password' );
			//	Format dates
			months = [
				'Jan',
				'Feb',
				'Mar',
				'Apr',
				'May',
				'Jun',
				'Jul',
				'Aug',
				'Sep',
				'Oct',
				'Nov',
				'Dec'
			],
			d = new Date(birth_date.value);
		birth_date.value = months[ d.getMonth() ] + ' ' + d.getDate() + ', ' + d.getFullYear() + ' 0:00:00 AM';
		d = new Date(graduation_date.value);
		graduation_date.value = months[ d.getMonth() ] + ' ' + d.getDate() + ', ' + d.getFullYear() + ' 0:00:00 AM';
		
		var h,
			feet = +height.value.substring(0, 1),
			inches = +height.value.substring(2);
		h = (feet*12)+inches;
		
		var data = {};
		
		data.firstName = first_name.value;
		data.lastName = last_name.value;
		data.guardianFirstName = '';							/*	NOT SET	*/
		data.guardianLastName = '';								/*	NOT SET	*/
		data.email = email.value;
		data.webSite = website.value;
		data.im = im.value;
		data.phone = phone.value;
		data.mobile = mobile.value;
		data.password = password.value;
		data.addresses = [{
			addressType: 'PRIMARY',
			street1: address.value,
			street2: '',										/*	NOT SET	*/
			apartmentNumber: '',								/*	NOT SET	*/
			city: '',											/*	NOT SET	*/
			state: state.value,
			country: '',										/*	NOT SET	*/
			postalCode: zip.value,
			phone: phone.value,
			mobile: mobile.value
		}];
		data.profile = {
			gender: sex.value,
			birthDate: birth_date.value,
			height: parseInt(+h, 10),
			weight: isNaN(parseInt(+weight.value, 10)) ? 0 : parseInt(+weight.value, 10),
			bats: bats.value,
			throws: throws.value,
			primaryPosition: primary_position.value,
			secondaryPosition: secondary_position.value,
			schoolTeam: school_team.value,
			schoolCoachName: school_coach_name.value,
			schoolCoachEmail: school_coach_email.value,
			summerTeam: summer_team.value,
			summerCoachName: summer_coach_name.value,
			summerCoachEmail: summer_coach_email.value,
			otherTeam: '',										/*	NOT SET	*/
			otherCoachName: '',									/*	NOT SET	*/
			otherCoachEmail: ''									/*	NOT SET	*/
		};
		data.academicProfile = {
			schoolCode: 'UNK',
			schoolName: school.value,
			schoolCity: school_city.value,
			schoolState: school_state.value,
			grade: isNaN(parseInt(+grade.value, 10)) ? 0 : parseInt(+grade.value, 10),
			graduationDate: graduation_date.value,
			major: major.value,
			satScore: isNaN(parseInt(+sat.value, 10)) ? 0 : parseInt(+sat.value, 10),
			actScore: isNaN(parseInt(+act.value, 10)) ? 0 : parseInt(+act.value, 10),
			rank: isNaN(parseInt(+rank.value, 10)) ? 0 : parseInt(+rank.value, 10),
			gpa: isNaN(+gpa.value) ? 0 : +gpa.value,
			status: 'COMMITTED'
		};
		
		//	Expire 999 years from now (so basically never).
		//	JS will handle if user registers Feb 29th & that date is actually March 1st 999 years from now.
		var date = new Date();
		var expiredDate = new Date(date.getFullYear()+999, date.getMonth(), date.getDate());
		DataStorage.store_data( 'user', JSON.stringify(data), expiredDate );
		DataStorage.store_data( 'email', email.value, expiredDate );
		
		return JSON.stringify( data );
	};
	
	var register_complete = function( req ) {
		pending_register = false;
		$().toastmessage( 'showToast', {type:'success', text:'Your registration was successful'} );
		loginCompleteAnimation();
		jQuery.address.value('/');
	};
	
	var register_error = function( req ) {
		switch( +req.status ) {
			case 406:	//	Duplicate account
				jQuery().toastmessage( 'showToast', {
					type: 'error',
					sticky: true,
					text: 'That user is already registered.'
				} );
				break;
			case 400:	//	Invalid JSON
				jQuery().toastmessage( 'showToast', {
					type: 'error',
					sticky: true,
					text: 'Attempted to send invalid JSON.'
				} );
				break;
			case 503:	//	Service unavailable
				jQuery().toastmessage( 'showToast', {
					type: 'error',
					text: 'Sorry, this service is unavailable at this time.'
				} );
				break;
			default:
				jQuery().toastmessage( 'showToast', {
					type: 'error',
					text: 'There was an error.'
				} );
				break;
		}
		
		pending_register = false;
		
		//changeAddress({value: '/register/1'});
		jQuery.address.value( '/register/1' );
	};
	
	this.validate_section = function( section ) {
		return validate_register_section( section );
	};
	
	this.submit_register = function() {
		if ( validate_register() ) {
			if ( !(!!pending_register) ) {
				pending_register = true;
				var data = serialize_register();
				
				AjaxRequest.post( {
					"url": "Register",
					"parameters": data,
					"onSuccess": register_complete,
					"onError": register_error
				} );
				return true;
			}
		} else {
			//changeAddress({value: '/register/1'});
			jQuery.address.value( '/register/1' );
		}
		return false;
	};
	
	var validate_schedule = function() {
		var state_select		= document.getElementById('state_select');						//	Has item selected by default
		var facility_select		= document.getElementById('facility_select');					//	Has item selected by default
		var date				= new Date( jQuery('#datepicker').datepicker( 'getDate' ) );	//	Has date selected by default
		var time_select			= document.getElementById('time_select');						//	Has item selected by default
		var routine_select		= document.getElementById('routine_select');					//	Has item selected by default
		
		//	No need for validating at this point
		
		return true;
	};
	
	var schedule_complete = function( req ) {
		var sid = (''+req.responseText).replace( (/[\'\"]/ig), '' );
		window.schedulingIdentificationNumber = sid;
		
		jQuery.address.value( '/payment' );
	};
	
	var schedule_error = function( req ) {
		jQuery().toastmessage( 'showToast', {
			type: 'error',
			sticky: true,
			text: 'There was an error attempting to submit the schedule.<br/>Error #'+req.status+': '+req.statusText
		} );
	};
	
	this.submit_schedule = function() {
		if ( validate_schedule() ) {
			var state = jQuery('#state_select').attr('value') || jQuery('#state_select').val(),
				facility = jQuery('#facility_select').attr('value') || jQuery('#facility_select').val(),
				date = new Date(jQuery('#datepicker').datepicker('getDate')),
				months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
				time = jQuery('#time_select').attr('value') || jQuery('#time_select').val(),
				times = time.split(' - '),
				start = times[0] || '',
				end = times[1] || '',
				//	Format dates
				formatted_start_date = ''+(months[date.getMonth()]+' '+date.getDate()+', '+date.getFullYear()+' '+start.substring(0,start.length-2)+':00:00 '+start.substring(start.length-2)),
				formatted_end_date = ''+(months[date.getMonth()]+' '+date.getDate()+', '+date.getFullYear()+' '+end.substring(0,end.length-2)+':00:00 '+end.substring(end.length-2)),
				routine = jQuery('#routine_select').attr('value') || jQuery('#routine_select').val(),
				//	Trim description and name to length
				desc = ''+jQuery('#routine_description p:first').html(),
				formatted_desc = desc.length > 50 ? desc.substring(0,47)+'...' : desc,
				name = ''+(DataStorage.get_data('email')+"'s routine on "+(date.getMonth()+1)+'/'+date.getDate()),
				formatted_name = name.length > 50 ? name.substring(0,47)+'...' : name,
				robj = {
					name:						''+formatted_name,	//	string
					description:				''+formatted_desc,	//	string
					time:						''+start,	//	string
					athleteId:					+DataStorage.get_data('id'),	//	number
					kioskId:					+active_kiosk_id || 0,	//	number
					routineType:				''+routine,	//	object <enum> -> string
					scheduledStartTime:			''+formatted_start_date,	//	date -> string
					scheduledEndTime:			''+formatted_end_date,	//	date -> string
					actualStartTime:			''+formatted_start_date,	//	date -> string
					actualEndTime:				''+formatted_end_date,	//	date -> string
					routineStatus:				'R',	//	object <enum> -> string
					createDate:					''+formatted_start_date	//	date -> string
				},
				dobj = {
					command: 'CREATE_SCHEDULE',
					userId: DataStorage.get_data('email'),
					sessionToken: DataStorage.get_data('sessionID'),
					routine: robj
				},
				data = JSON.stringify(dobj);
				
				AjaxRequest.post( {
					"url": "http://209.20.89.111:5080/sswebserver/Schedule",
					"parameters": data,
					"onSuccess": schedule_complete,
					"onError": schedule_error
				} );
				
		}
		
		return false;
	};
};
