
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/

var Validate = new Class({
	
	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			dateFormat: 'dd/MM/yy',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'Please wait...'
		};
	},

	initialize: function(form, options){
		this.startPagination();
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');
		this.hidden = this.form.getElements('.hide');
		
		this.hidden.each(function(el,i) {
			el.setStyle('display', 'none');
		});
		
		this.list = [];
		
		this.elements.each(function(el,i){
			if(this.options.validateOnBlur){
				el.addEvent('blur', this.validate.bind(this, el));
			}
			
			if(el.get('tag') == "select" && el.getParent().getNext().hasClass('hide')) {
				el.addEvent('change', function() {
					if(el.value == 'Yes') {
						el.getParent().getNext().setStyle('display', 'block');
					}else {
						el.getParent().getNext().setStyle('display', 'none');
					}
				});
			}
			
			if(el.get('type') == "radio" && el.getParent().getParent().getParent().getNext().hasClass('hide')) {
				el.addEvent('click', function() {
					if(getRadio(el.get('name')) == "Yes") {
						el.getParent().getParent().getParent().getNext().setStyle('display', 'block');
					}else {
						el.getParent().getParent().getParent().getNext().setStyle('display', 'none');
					}
				});
			}
		}.bind(this));
		
		/*this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			this.elements.each(function(el,i){
				if(! this.validate(el)){
					event.stop();
					doSubmit = false;
					this.list.include(el);
				}else{
					this.list.remove(el);
				}
			}.bind(this));
			
			if(doSubmit){
				if(this.options.onSuccess){
					event.stop();
					this.options.onSuccess(this.form);
				}else{
					this.form.getElement('input[type=submit]').setProperty('value',this.options.label);
				}
			}else{
				this.options.onFail(this.getList());
			}
			
		}.bind(this));*/
		
		this.form.addEvent('submit', function(e){
			if ($$('.error').getLast() == "null") {
				e = new Event(e).stop();
			}
			if ($('Real_Total').get('value') == 0 || $('Real_Total').get('value') == "") {
				e = new Event(e).stop();
			}
		}.bind(this));
	},
	
	getList: function(){
		var list = new Element('ul');
		this.list.each(function(el,i){
			if(el.title != ''){
				var li = new Element('li').injectInside(list);
				new Element('label').setProperty('for', el.id).setText(el.title).injectInside(li);
			}
		});
		return list;
	},
	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);
		
		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':
				if(el.value != ''){
							
					if(el.hasClass('email')){
						var regEmail = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/;
						if(el.value.toUpperCase().match(regEmail)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Require Email');
						}
					}
					
					if(el.hasClass('number')){
						var regNum = /[-+]?[0-9]*\.?[0-9]+/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Require Number');
						}
					}
					
					if(el.hasClass('postcode')){
						var regPC = /^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/
						if(el.value.match(regPC)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Require Postcode');
						}
					}
					
					if(el.hasClass('date')){
						var d = Date.parseExact(el.value, this.options.dateFormat);
						if(d != null){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Require Date: '+this.options.dateFormat.toLowerCase());
						}
					}
					
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el);
				}else{
					valid = true;
				}
				break;
				
			case 'radio':
				var rad = $A(this.form[el.name]);
				var ok = false;
				rad.each(function(e,i){
					if(e.checked){
						ok = true;
					}
				});
				if(!ok){
					valid = false;
					this.setMsg(rad.getLast(), 'Required');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;
				
		}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title;
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				//el.error = new Element('span').addClass(this.options.errorMsgClass).setText(msg).injectBefore(el);
				el.error = new Element('span', {
					'class': this.options.errorMsgClass,
					'html': msg
				});
				el.getParent().grab(el.error, 'top');
			}else{
				el.error.set('html', msg);
			}
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.dispose();
			el.error = undefined;
		}
	},
	
	startPagination: function() {
		var page = 0;
		
		$$('fieldset').each(function(fieldset,page) {
			page++;
			fieldset.setStyle('position', 'absolute');
			fieldset.setStyle('top', '10px');
			fieldset.setStyle('left', '0px');
		
			if((fieldset.get('id') != "intro1") && (fieldset.get('id') != "intro" || test != true)) {

				var nextAnchor = new Element('a', {
					'href': '#',
					'class': 'nextBtn',
					'html': 'Next'
				});
			
				nextAnchor.addEvent('click', function() {
					var allowNext = true;
					elements = fieldset.getElements('.required');
					elements.each(function(el){
						if(! this.validate(el)){
							allowNext = false;
						}
					}.bind(this));
					if(allowNext) {
						
						this.fadePage(page, 'out');					
						this.fadePage(page+1, 'in');
					}
					return false;
				}.bind(this));
			}
			
			var backAnchor = new Element('a', {
				'href': '#',
				'class': 'backBtn',
				'html': 'Back'
			});
			
			backAnchor.addEvent('click', function() {
				this.fadePage(page, 'out');				
				this.fadePage(page-1, 'in');
				return false;
			}.bind(this));
			
			$$('input[type=submit]').each(function(input) {
				input.addEvent('click', function() {
					var allowNext = true;
					elements = fieldset.getElements('.required');
					
					elements.each(function(el){
						if(! this.validate(el)){
							allowNext = false;
						}
					}.bind(this));
					
					if(allowNext) {
						return true;
					}
					return false;
					
				}.bind(this));
			}.bind(this));

			fieldset.addClass('page'+page);
			if (page != 1) {
				fieldset.adopt(backAnchor);
				fieldset.fade('hide');
				fieldset.setStyle('height', '20px');
				//fieldset.setStyle('display', 'none');
			}
			if (page != $$('fieldset').length) {
				fieldset.adopt(nextAnchor);
			}
			if (page == 1) {
				//var newHeight = fieldset.getSize();
				//fieldset.getParent.setStyle('height', newHeight.y);
			}
		}, this);
	},

	fadePage: function(num, type) {
		window.scrollTo(0,0);
		$$('.page'+num).each(function(el) {
			if (type == 'in') {
				el.setStyle('height', 'auto');
			}
			el.fade(type).addEvent('onComplete', function() {
				if (type == 'out') {
					el.setStyle('height', '20px');
				}
			});
		});
	}
	
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/


window.addEvent('domready', function(){
	var mathEle = new Array($('Number_of_Campers'), $('overnight_no'), $('overnight_yes'), $('Nights_Staying'), $('family_no'), $('family_yes'), $('Number_of_Siblings'));
	
	mathEle.each(function(el) {
		if (el) {
			if (el.get('type') == "radio") {
				el.addEvent('click', function() {
					updateTotal();
				});
			}else {
				el.addEvent('change', function() {
					updateTotal();
				});
			}
		};
	});
});


function updateTotal() {
	var campers;
	
	$('session').set('value', getRadio('session_radio'));
	
	campers = $('Number_of_Campers').get('value');

	var cost = getCost(campers);
	var discount = getDiscounts(campers);
	
	$('Subtotal').set('value', '$'+cost);	
	$('Discounts').set('value', '$'+discount);
	$('Total').set('value', '$'+(cost-discount));
	$('Real_Total').set('value', cost-discount);
}

function getRadio(rName) {
	var v = "";
	$('registration').getElements('input[name='+rName+']').each(function(el){
		if(el.checked) v = el.get('value');
	});
	return v;
}

function getCost(campers) {
	var campers_fee;
	var overnight_fee;

	campers_fee = campers*campFee;
	
	$('overnight').set('value', getRadio('overnight_radio'));
	
	if ($('Nights_Staying').get('value') == "") {
		$('Nights_Staying').set('value', 0);
	}
		
	if ($('overnight').get('value') == "Yes") {
		overnight_fee = campers*dormFee*$('Nights_Staying').get('value');
	}else {
		overnight_fee = 0;
	}
	
	return (campers_fee+overnight_fee);
}

function getDiscounts(campers) {
	var earlyReg_discount;
	var team_discount;
	var family_discount;
	
	if ($('Early_Registration') && $('Early_Registration').get('value') == "true") {
		earlyReg_discount = campers * 20;
	}else {
		earlyReg_discount = 0;
	}
	
	if (campers < 5) {
		$('team_discount_div').setStyle('display', 'none');
		$('Team_Discount').set('value', '');
		team_discount = 0;
	}else {
		$('team_discount_div').setStyle('display', 'block');
		if (campers >= 10) {
			$('Team_Discount').set('value', '30');
			$('team_discount_div').getElements('.subtext').each(function(el){
				el.set('text','For 10 or more campers, $30 off each and a free coach/parent');
			});
			team_discount = 30 * campers;
		}else {
			$('Team_Discount').set('value', '20');
			$('team_discount_div').getElements('.subtext').each(function(el){
				el.set('text','For 5 or more campers, $20 off each and a free coach/parent');
			});
			team_discount = 20 * campers;
		}
	}
	
	$('family').set('value', getRadio('family_radio'));
	if ($('family').get('value') == "Yes") {
		if ($('Number_of_Siblings').get('value') < 2) {
			$('Number_of_Siblings').set('value', '2');
		}
		if (Number($('Number_of_Siblings').get('value')) > Number(campers)) {
			$('Number_of_Siblings').set('value', campers);
		}
		
		family_discount = 20 * ($('Number_of_Siblings').get('value')-1);
	}else {
		family_discount = 0;
		$('Number_of_Siblings').set('value', 0);
	}
	
	return (earlyReg_discount+team_discount+family_discount);
}

