// Danzo2020 lasik calculator, reworked in jquery / javascript
// history: server support for .NET/ASPX is problematic from a migration, client submitted work won't run.
//
// author: chrisn@page1solutions.com
// copyright 2008, page1solutions, llc
//

// Globals configuration - Client can tweak these. ---

var intAge			   = 18;
var maxAge             = 77;
var glassesMultiplier  = 300;
var contactsMultiplier = 90;
var costOfProcedure	   = 4000;
var youDontNeedLasik   = "Not Applicable";

//
// Validation object, 
// define type, which jQuery selector to hide/show on error, type of input element
//
var validator = {
 "#tbHowOldAreYou"           : { 'type' : 'integer', 'error' : '#tbHowOldAreYouError',          'input' : 'text'},
 "#tbAnnualContactFittings"  : { 'type' : 'float', 'error'   : '#tbAnnualContactFittingsError', 'input' : 'text'},
 "#tbBoxOfContactsCost"      : { 'type' : 'float', 'error'   : '#tbBoxOfContactsCostError',     'input' : 'text'},
 "#tbBoxesOfContactAYear"    : { 'type' : 'integer', 'error' : '#tbBoxesOfContactAYearError',   'input' : 'text'}
};

//
// disable object: disable these if contacts checked is false.
//
var disable  = {
 "#tbAnnualContactFittings"  : {'value' : 0},
 "#tbBoxOfContactsCost"      : {'value' : 0},
 "#tbBoxesOfContactAYear"    : {'value' : 0}
}

//
// Calculate Lasik Procedure costs
//
function btnCalculate () {
	
	var tbAnnualContactFittings    = jQuery("#tbAnnualContactFittings").val();
	var tbBoxOfContactsCost        = jQuery("#tbBoxOfContactsCost").val();
	var tbBoxesOfContactAYear      = jQuery("#tbBoxesOfContactAYear").val();
	var intAge                     = jQuery("#tbHowOldAreYou").val();
    var intTotal = 0;
	
	jQuery(":input[name='cbWearGlasses']").each(function(){
		
		if ( jQuery(this).attr("checked") == true ) {
			
			if ( jQuery(this).val() == 'yes' ) {
			
				intTotal += (maxAge - intAge) * glassesMultiplier;
			}
		}
	});
	
	jQuery(":input[name='cbWearContacts']").each(function(){
		
		if ( jQuery(this).attr("checked") ==  true ) {
		
			if ( jQuery(this).val() == 'yes' ) {
			
				intTotal += (maxAge - intAge) * contactsMultiplier;
				
				for ( var j in disable ) {
					jQuery(j).removeAttr("disabled");
					
				}
			}
			else {
				//
				// disable other inputs
				for (var j in disable) {
					
					jQuery(j).attr("disabled", "disabled");
					jQuery(j).val(disable[j]['value']);
				}			
			}
		}
	}); 
	
	tbAverageCostOverALifetime  = intTotal + (tbAnnualContactFittings * (maxAge - intAge)); 
	tbAverageCostOverALifetime += (tbBoxOfContactsCost * tbBoxesOfContactAYear * (maxAge - intAge));
	
	tbSavings = tbAverageCostOverALifetime - costOfProcedure;
	
	if ( (tbSavings < 0) || (tbAverageCostOverALifetime < 0) ) {
		
		tbSavings                  = youDontNeedLasik;
		tbAverageCostOverALifetime = youDontNeedLasik;
	}
	
	jQuery("#tbAverageCostOverALifetime").val(tbAverageCostOverALifetime);
	jQuery("#tbSavings").val(tbSavings);
	
	// DEBUG
	
	/*console.log("\r\n  intAge " + intAge );
	console.log("\r\n  intTotal " + intTotal );
	console.log("\r\n  tbAnnualContactFittings " + tbAnnualContactFittings);
	console.log("\r\n tbBoxOfContactsCost   " + tbBoxOfContactsCost);
	console.log("\r\n  tbBoxesOfContactAYear " + tbBoxesOfContactAYear );
	console.log("\r\n  tbAverageCostOverALifetime " + tbAverageCostOverALifetime );
	console.log("\r\n  tbSavings " + tbSavings);
	*/
}

//
// Checks that a given value is of a given type.  
// Returns true or false
//
function validate (type, val) {

	switch ( type ) {
		
		case "integer" : 

		 	var regex = /^[0-9]+$/
		    break;

        case "float" :
                 
            var regex = /^[0-9]*([.]{1}[0-9]+)?$/
		    break;
	
		case "email" :

			var regex =	/^\s*[a-zA-Z0-9_\-.?=]+@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-.]{2,4})+\s*$/
			break;

		case "phone" :

			var regex = /^[0-9-+_.\(\) ]{7,27}$/
			break;

		case "name" :

			var regex = /^[a-zA-Z|\s.,]+$/
			break;

		case "nonempty" :

			if (testString == '') {
				return false;
			}
			else {
				return true;
			}
			break;

		default:
			//
			// if designer puts a wrong validation type, auto-validate
			//
			return true;
	}

	var pattern = new RegExp(regex);
	var isValid = pattern.test(val);
	var logged  = isValid.toString();

	return isValid;
}

function if_valid_calculate () {

	//
	// Break gracefully
	//
	var valid      = true;
	var error_flag = false;
	
	//
	// @todo@ add object check on validator
	//
	for (var i in validator) {
		
		//
		// check this object element's validity
		//
		
		val   = jQuery(i).val();
		valid = validate(validator[i]['type'], val);

		//
		// if invalid, show an error msg, flag that at least one is invalid.
		//
		if ( !valid ) {
		
			show_error_message(validator[i]['error'], 'show');
			error_flag = true;
		}
		else {
			show_error_message(validator[i]['error'], 'hide');
		}
	}
	
	//
	// calculate if there are no errors.
	//
	if ( !error_flag ) {
		
		btnCalculate();
	}	
}

function show_error_message (jq_selector, state) {

	if ( state == "show" && jQuery(jq_selector).hasClass('hide') ) {
		
		jQuery(jq_selector).toggleClass('hide');
	}
	else if ( state == "hide" && (jQuery(jq_selector).hasClass('hide') != true) ) {
		
		jQuery(jq_selector).toggleClass('hide');
	}
}

jQuery(document).ready(function(){

	jQuery("#tbHowOldAreYou").val(intAge);
	jQuery("#tbBoxesOfContactAYear, #tbAnnualContactFittings, #tbBoxOfContactsCost").attr("disabled", "disabled");
	
	jQuery(":text").change(function(){
		if_valid_calculate();
	});
	
	jQuery(":radio, :submit").click(function(){
		if_valid_calculate();
	});
	
}); //document ready