// validation and verification available in one script

v = {
		//global variables for validation
	errorCount: 0,
	image_regex: /(_ovr\.gif)|(\-gray\.png)/,
	t: '',
	in_process: new Array(),
		//global variables for verification
	field: '',
	fieldData: new Array(),
	fieldMap: '#LeadFirstName,#LeadLastName,#LeadAddress,#LeadCity,#LeadState,#LeadZip,#LeadPhone',
	highlightMap:{
		"phone":"#LeadPhone",
		"name":"#LeadFirstName,#LeadLastName",
		"address":"#LeadAddress",
		"city":"#LeadCity",
		"state":"#LeadState",
		"zip":"#LeadZip"
	},
	attempts: 0,
	accept: false,
	submitclick: false,
	verified: false,
	
		//initialize functions to observe all inputs
	init : function () {
			//test if valid document
		if(!document.getElementById || !document.createTextNode) return;
		
			//if verification field does not exist, append to form
		if(!$(v.field).length) (/V3Form/i.test(v.field)) ? $('#V3Form').append('<input type="hidden" name="data[Lead][hidden3]" value="" />') : $('[id$=Form]').append('<input type="hidden" name="data[Lead][verification]" value="" />');
		
			//initialize listeners
		$('input[id!=select], select[id!=LeadSubmitCoreLocationId][id!=LeadSubmitCoreCourseId]').bind('keypress change', function( event ) {
			field_id = $(v.getTarget(event)).attr('id');
			if ( v.t != '') clearTimeout(v.t);
			event.type == 'keypress' ? v.t = setTimeout('v.testContent( field_id )', 1500) : v.testContent( field_id );
		});
		
			//test verification field if not empty
		if($(v.field).val() != '') {
			v.attempts++;
			$(v.fieldMap).each(function() {
				if( $(this).val() != '' && $(this).val() != 0 ) {
					v.fieldData[$(this).attr('id')] = $(this).val();
				}
			});
			if( $(v.field).val().search('ACCEPT') != -1 ) {
				v.accept = true;
			}
		}
		
		if(/V3Form/i.test(v.field)) {
			v.highlightMap = {
				"phone":"#LeadPhone1",
				"name":"#LeadFirstName,#LeadLastName",
				"address":"#LeadAddress1",
				"city":"#LeadCity",
				"state":"#LeadState",
				"zip":"#LeadZip"
			};
			v.fieldMap = '#LeadFirstName,#LeadLastName,#LeadAddress1,#LeadCity,#LeadState,#LeadZip,#LeadPhone1';
		}
			//patch for location errors in forms app until server side is revamped
		$('#LeadSubmitCoreLocationId, #LeadSubmitCoreCourseId').change(function() {
			if( $(this).parent().hasClass('error') ) v.removeError($(this).attr('id')); 
		});
	},
	
		//get event target
	getTarget : function ( e ) {
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if ( !target ) { return false; }
		while (target.nodeType != 1 && target.nodeName.toLowerCase() != 'body') {
			target = target.parentNode;
		}
		return target;
	},
	
		//test content of form
	testContent : function ( field_id ) {
			//regex expressions for testing zip field
		var zip_regex = /(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$)/;
			//set error message
		var response = new Array();
		var params = new Array();
		response.errors = 'Please enter your ' + $('#' + field_id).prev().text();
		
			//set params string for callCakeAjax
		if(/V3Form/i.test(v.field)) {
			if($('#'+field_id).attr('type') == 'checkbox' && $('#' + field_id ).attr('checked') == false) {
				eval("params = {" + field_id + ":\"" + $('#' + field_id + '_').val() + "\" };");
			} else {
				eval("params = {" + field_id + ":\"" + $('#' + field_id ).val() +"\" };");
			}
		} else {
				eval("params = {\"" + $('#form_id').attr('name') + "\":\"" + $('#form_id').attr('value') + "\" , \"" + $('#' + field_id).attr('name') + "\":\"" + $('#' + field_id).val() + "\" };");
		}
		switch( field_id ) {
			case 'LeadEmail':
			case 'LeadDatumEmail':
			case 'LeadPhone':
			case 'LeadDatumPhone':
			case 'LeadPhone1':
				try { v.callAjax( field_id, params, 'validate'); }
				catch( err ) {};
				break;
			case 'LeadState':
				response.status_code = /[A-Z]{2}/i.test($('#' + field_id).val());
				// v.isValid(field_id, response);
				break;
			case 'LeadGradYear':
			case 'LeadHsGradYear':
				response.status_code = /[0-9]{4}/.test($('#'+field_id).val());
				// v.isValid( field_id, response );
				break;
			case 'LeadZip':
				response.status_code = zip_regex.test($('#' + field_id).val());
				break;
			case 'LeadFirstName':
			case 'LeadLastName':
			case 'LeadAddress':
			case 'LeadAddress1':
			case 'LeadCity':
			case 'LeadEducationLevel':
				response.status_code = /^[A-Z0-9\s\.\-]+$/i.test($('#' + field_id).val());
				break;
			default:
				response.status_code = ($('#' + field_id ).val() != '' && $('#' + field_id ).val() != '0' && $('#' + field_id ).val() != 'Please Choose' ) ? true : false;
				break;
		}
		
		if(field_id != 'LeadEmail' && field_id != 'LeadPhone' && field_id != 'LeadPhone1') v.isValid( field_id, response );
		
		//enable submit button after field change on form
		$('[id*=submit]').attr('disabled',false);
	},
	
	callAjax : function ( field_id, params, action ) {
		var url = action == 'verify' ? '/verify_lead.json' : '/validate_lead.json';

		// if( v.in_process[field_id] ) { return false; }
		// v.in_process[field_id] = true;

		if(/V3Form/i.test(v.field)) url = '/leads' + url;
	//	if(action == 'verify' && (/V3Form/i.test(v.field)) == false ) url = url.replace('.json', '_lead.json');
		new $.ajax({
			url: url,
			type:'POST',
			data: params,
			success: function ( res ) {
				if( action == 'verify') {
					
					v.processVerification(res);
					if(v.accept == true) {
						v.verified = true;
					}
				} else {
					var response = res || 'Error in field';
					v.isValid( field_id, response );
					$('img.overlay').hide();    // TODO: check how we'll handle various image overlays and whatnots
				}
			},
			complete: function () {
				if( action == 'verify') {
					if( v.verified == true ) {
						$('[id$=Form]').submit();
					}
				}
				v.in_process[field_id] = false;
			}
		});
	},
	
		//test response to assign or remove errors
	isValid : function ( field_id, response ) {
		response.status_code != true ? v.addError( field_id, response.errors ) : v.removeError( field_id );
	},

	checkFields : function () {
		var flag = true;
		$('input[id!=submit]:visible, select:visible').each( function () {
			//TODO: What do do for non-required fields?
			if( $(this).val() == '' || $(this).val() == '0' || $(this).val() == 'Please Choose' ) {
				v.testContent($(this).attr('id'));
				flag = false;
				return false;
			}
		});
		if(flag == true && v.verified != true) {
			return v.checkVerification();
		}
	},

	checkVerification : function () {
		var changed = false;
		var params = $(v.fieldMap).serializeArray();

		if( $(v.field).val().search('ACCEPT') != -1 ) {
			return true;
		}

		$(v.fieldMap).each( function () {
			if($(this).attr('id') in v.fieldData && v.fieldData[$(this).attr('id')] != $(this).val()) {
				changed = true;
			}
			v.fieldData[$(this).attr('id')] = $(this).val();
		});

		if( v.accept === false && v.attempts == 0 ) {
			//first attempt
			v.callAjax( null, params, 'verify');
			v.attempts++;
		} else if( v.accept === false && v.attempts > 0 ) {
			if(changed == true) {
				v.callAjax( null, params, 'verify');
				v.attempts++;
			} else if( v.accept === false ) {
				v.bounce();
			}
		//} else if( v.accept === false && v.attempts >=5 ) {
		//	v.createMessage("You've tried too many times");
		//	return false;
		} else {
			return true;
		}
	},

	processVerification : function ( res ) {
		if(res.result.rule != undefined && res.result.rule_details.decision != undefined) {
			$(v.field).val(res.result.rule_details.decision + '-' + res.result.rule);
		}
		if(res.result.rule_details != undefined) {
			if (res.result.rule_details.decision == "REJECT") {
				if(res.result.rule_details.feedback != undefined) {
					v.createMessage(res.result.rule_details.feedback);
				}
				if(res.result.rule_details.fields != undefined) {
					v.highlight(res.result.rule_details.fields);
				}
			} else {
				v.removeMessage();
				v.accept = true;
			}
		} else {
			v.removeMessage();
			v.accept = true;
		}
		if(res.result.std_address != undefined) {
			(/V3Form/i.test(v.field)) ? $('#LeadAddress1').val(res.result.std_address) : $('#LeadAddress').val(res.result.std_address);
		}
		if(res.result.std_city != undefined) {
			$('#LeadCity').val(res.result.std_city);
		}
		if(res.result.std_state != undefined) {
			$('#LeadState').val(res.result.std_state);
		}
		if(res.result.std_zip != undefined) {
			$('#LeadZip').val(res.result.std_zip);
		}
	},
	
		//adds errors to specific field as well as showing general error messages
	addError : function ( field_id, response ) {
		$('#'+ field_id).parent().addClass('error');
		if( typeof(response) == 'object' ) {
			response = response[ field_id.replace('Lead','').toLowerCase() ];
		}
		if(($('#' + field_id).next(0).size() <= 0 && $('#' + field_id).attr('type') != 'checkbox') || ($('#' + field_id).next(0).next(0).size() <= 0 && $('#' + field_id).attr('type') == 'checkbox')) {
			if($('#' + field_id).hasClass('clearField') == false) {
				var element = $(document.createElement('div')).addClass('error-message').append(response);
				$('#' + field_id).parent().append(element);
			}
			v.errorCount++;
		}

		if(v.errorCount <= 1) {
			v.createMessage();
		}
	},
	
	removeError : function ( field_id ) {
		
		if($('#' + field_id).parent().hasClass('error')) {
			$('#' + field_id).parent().removeClass('error');
			if($('#' + field_id).hasClass('clearField') == false) {
				$('#' + field_id).parent().children(':last').remove();
			}
			v.errorCount--;
		}

		if(v.errorCount <= 0) {
			v.removeMessage();
		}
	},
	
	createMessage : function ( feedback ) {
		if( feedback == undefined ) feedback = 'Please check the highlighted fields';
		var msg = $(document.createElement('h2')).append(feedback);

		if($('h2#botErr').length < 1) {
			msg.addClass('flashMessage').attr('id', 'botErr').prependTo($('div.submit'));
		}

		if( v.image_regex.test($('[id*=submit]').attr('src')) == false) {
			if(/V3Form/i.test(v.field)) {
				var src = $('[id*=submit]').attr('src').replace('.gif','_ovr.gif');
			} else {
				var src = $('[id*=submit]').attr('src').replace('.png','-gray.png');
			}
			$('[id*=submit]').attr('src',src).attr('disabled',true);
		}
		$('img.overlay').hide();
	},
	
	removeMessage : function () {
		$('.flashMessage').remove();
		$(v.fieldMap).removeClass('highlight');

		if( v.image_regex.test($('[id*=submit]').attr('src')) == true) {
			if(/V3Form/i.test(v.field)) {
				var src = $('[id*=submit]').attr('src').replace('_ovr.gif','.gif');
			} else {
				var src = $('[id*=submit]').attr('src').replace('-gray.png','.png');
			}
			$('[id*=submit]').attr('src',src).attr('disabled',false);
		}
	},

	highlight:function(fields) {
		$(v.fieldMap).removeClass('highlight');
		for(var i=0;i < fields.length;i++) {
			if(v.highlightMap[fields[i]] != undefined) {
				$(v.highlightMap[fields[i]]).addClass('highlight');
			}
		}
	},

	bounce : function () {
		$('[class*=flashMessage]').hide().delay(500).show();
	}
} //end class v

$(document).ready( function() {
		//set form field string
	v.field = $('#V3Form').length ? '#V3Form > input[name="data[Lead][hidden3]"]' : '[id$=Form] > input[name="data[Lead][verification]"]';
	
	// init the validation and verification
	v.init();
	
	$('[id$=Form]').submit( function() {
		//show pinwheel
		if( v.accept == true && v.verified == true ) {
			return true;
		} else {
			v.checkFields();
			return false;
		}
	});
});
