/**
 * @history Modified April 29, 2009 by Jon Beebe
 * Fixed a couple of issues that caused this script to not verify
 * a new form that did not have a second email verification field
 *
 **/

var formErrors = [];

function validate_form(event) {
	// Find all forms to be validated
	var form = $('.signupform');
	
	// Create our empty error array
	// If validation errors occur they will be
	// placed in here in the order in which they occur
	formErrors = [];
	
	// Process all *required* elements in the form
	$('.required', form).each( function() { parseFormElement(this); } );
	
	// For debugging, log what we found
	//log('form errors found: ' + formErrors.length);
	
	// for (var i = 0; i < formErrors.length; i++) {
	// 	log(' error ' + i + ' is');
	// 	log(formErrors[i][0]);
	// }
	
	// If errors were found then DO NOT submit the form by
	// returning false here. Otherwise return true.
	if (formErrors.length <= 0) {
		form.submit();return true;
	}
	else {
		alert("Please fill in all highlighted fields");
		event.preventDefault();
		return false;
	}
	// log("END validate_form");
}

function parseFormElement(elem) {
	// log(elem);
	
	// For convenience get a reference to the jquery object
	elem = $(elem);
	
	var name = elem.attr('name');
	var id = elem.attr('id');
	//log("working on item named '" + name + "', id = '" + id + "'");
	
	switch(id) {
		case 'pwd':
			var retypePassword = $('#retypepwd').val();
			var value = elem.val();
			if ((value !== retypePassword) || (value.length <= 0) || (retypePassword.length <= 0)) {
				errorElem(elem);
				errorElem($('#retypepwd'));
			}
			else {
				elem.removeClass('error');
				$('#retypepwd').removeClass('error');
			}
			break;
			
		case 'retypepwd':
		case 'retypeemail':
			// do nothing here
			break;
			
		case 'email':
			validateEmail(elem);
			break;
			
		case 'phone':
			validatePhoneNumber(elem);
			break;
		
		case 'hearAbout':
		case 'Category1': // The Ad Categories select element
			var value = elem.attr('selectedIndex');
			// log("select value = '" + value + "'");
			if (value <= 0) {
				errorElem(elem, elem.parent());
			}
			else {
				elem.parent().removeClass('error');
			}
			break;
			
		// The Generate Traffic checkboxes
		case 'traffic':
			validateCheckboxes(elem);
			break;
			
		case 'termsconditions':
			validateCheckboxes(elem, true);
			break;
		
		default:
			var value = elem.val();
			// // log("value  =");
			// log(value);
			if ((value == '') || (value == null) || (value == undefined)) {
				errorElem(elem);
			}
			else {
				elem.removeClass('error');
			}
			break;
	}
}

function errorElem(elem, target) {
	formErrors.push(elem);
	if (target) {
		target.addClass('error');
	}
	else {
		elem.addClass('error');
	}
}

function validateCheckboxes(elem, allChecked) {
	// log('validateCheckboxes');
	var count = $(':input', elem).length;
	var checkedCount = 0;
	var boxes = $(':input', elem).each( function() {
		if (this.checked) {
			// log('checked');
			checkedCount++;
		}
		else {
			// log('false');
		}
	});
	
	if (checkedCount <= 0 || (allChecked && (checkedCount != count))) {
		errorElem(elem);
	}
	else {
		elem.removeClass('error');
	}
}

function validateEmail(elem) {
	var value = elem.val();
	//log("testing email value '" + value + "'");
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	if(reg.test(value) == false) {
		// log('email FAILED at first check');
		errorElem(elem);
		errorElem($('#retypeemail'));
		return;
	}
	else {
		elem.removeClass('error');
		$('#retypeemail').removeClass('error');
	}
	
	// If a second email field exists then process it
	// Otherwise we ignore this email verification step
	var retypeElem = $('#retypeemail');
	if(retypeElem.length > 0) {
		var retypeValue = $('#retypeemail').val();
		// log('retype value = ' + retypeValue);
		if ((value !== retypeValue) || (value.length <= 0) || (retypeValue.length <= 0)) {
			// log('email FAILED at second check');
			errorElem(elem);
			errorElem($('#retypeemail'));
		}
		else {
			elem.removeClass('error');
			$('#retypeemail').removeClass('error');
		}
	}
}

function validatePhoneNumber(elem) {
	var reg = new RegExp(/^([0-9 \+\-\(\)]){10,}$/);
	//log('reg = ' + reg);
	var test = reg.test(elem.val());
	//// log ('test = ' + test);
	if(test == false) {
		errorElem(elem);
	}
	else {
		elem.removeClass('error');
	}
}

$(document).ready(function () {
	// Find all forms to be validated
	var form = $('.signupform');
	
	// If forms were found then wire up their
	// submit functions to the validation javascript function
	// This will cause them to run the javascript prior
	// to submitting their results to the server
	if(form.length > 0) {
		form.children('.submit').click(validate_form);
	}
	// else {
	// 	//log("no form found :(");
	// }
	
	
    // Added by jON bEEBE July 7th, 2009
    //
    // Wire up a listener to the 'select' element so that when
    // users choose 'other' they are presented with a 
    // text field to type into
    
    $('#hearAbout').change( function(event) {

        // If the value of this select element is 'other'
        // then show the other text field and add a 'required' class
        
        if( $(this).val().toLowerCase() == 'other') {
            
            // Show the 'other' text field and turn
            // on the 'required' tag
            
            $('#hearAboutOtherText').css('display', 'block').children('input').addClass('required').focus();
        }
        
        // Otherwise the user has not chosen 'other' and we want to hide
        // the other text field and make sure it is not required for sumbission
        
        else {
            
            // Make sure the 'other' text field is hidden
            // and NOT required
            
            $('#hearAboutOtherText').css('display', 'none').children('input').removeClass('required');
        }
    });
});

function log($message) {
	try {
		console.log($message);
	}
	catch(e) {
		//alert($message);
	}
}
