//developed by Joey Livingston on behalf of Limesharp Internet Ltd
//copyright © 2008 Limesharp Internet Ltd
//requires jquery
jQuery.noConflict();

function LimeForm(formID) {
	var fieldsets = jQuery('fieldset').get();
	var layerCount = 0;
	for(i=0; i<fieldsets.length; i++) {
		if(jQuery(fieldsets[i]).parent(formID)) {
			jQuery(fieldsets[i]).css({display:"none"});
			layerCount++;
		}
	}
	
	var currentLayerNumber = 0;
	var currentLayer = jQuery(fieldsets[currentLayerNumber]);
	
	getProgress();
	
	function showLayer(lyr){
		hideLayer(currentLayer);
		lyr.css({display:"block"});
		setOptionalInputs(lyr.find('input').get());
		setOptionalInputs(lyr.find('option').get());
		currentLayer = lyr;
	}
	
	function hideLayer(lyr){
		lyr.css({display:"none"});
	}
	
	function matchInput(fieldValue,inputName) {
		var matchValue = jQuery("input[name='"+inputName+"']").val();
		if(fieldValue == matchValue) {
			return true;
		} else {
			return false;
		}
	}
	
	function validateField() {
		var pass = true;
		var fields = jQuery(fieldsets[currentLayerNumber]).find('.field');
		for(i=0; i<fields.length; i++) {
			if(jQuery(fields[i]).css('display') != 'none') {
				var reqFields = jQuery(fields[i]).find('.required');
				for(j=0; j<reqFields.length; j++) {
					var check = false;
					var fieldValue = '';
					var radios = jQuery(reqFields[j]).parents('.field').find(':radio');
					for(k=0; k<radios.length; k++) {
						if(jQuery(radios[k]).attr('checked') == true) {
							fieldValue = jQuery(radios[k]).val();
							check = true;
						}
					}
					var textInputs = jQuery(reqFields[j]).parents('.field').find(':text');
					for(k=0; k<textInputs.length; k++) {
						if(jQuery(textInputs[k]).val() != '') {
							fieldValue = jQuery(textInputs[k]).val();
							check = true;
						}
					}
					var hiddenInputs = jQuery(reqFields[j]).parents('.field').find(':hidden');
					for(k=0; k<hiddenInputs.length; k++) {
						if(jQuery(hiddenInputs[k]).val() != '') {
							fieldValue = jQuery(hiddenInputs[k]).val();
							check = true;
						}
					}
					var textAreas = jQuery(reqFields[j]).parents('.field').find('textarea');
					for(k=0; k<textAreas.length; k++) {
						if(jQuery(textAreas[k]).val() != '') {
							fieldValue = jQuery(textAreas[k]).val();
							check = true;
						}
					}
					var selects = jQuery(reqFields[j]).parents('.field').find('select');
					for(k=0; k<selects.length; k++) {
						if(jQuery(selects[k]).val() != '') {
							fieldValue = jQuery(selects[k]).val();
							check = true;
						}
					}
					
					var requirements = jQuery(reqFields[j]).find('.requirements');
					for(m=0; m<requirements.length; m++) {
						var text = jQuery(requirements[m]).html();
						var re = new RegExp('{([^}]+)}');
						var command = text.match(re);
						instructions = command[1];
						commands = instructions.split('-');
						var functionName = commands[0];
						var functionParam = commands[1];
						check = eval(functionName+"('"+fieldValue+"', '"+functionParam+"');");
					}
					
					if(check == false) {
						jQuery(reqFields[j]).css({display:'block'});
					} else {
						jQuery(reqFields[j]).css({display:'none'});
					}
				}
			}
			
			if(pass != false) {
				if (typeof check != 'undefined') {
					pass = check;
				}
			}
		}
		return pass;
	}
	
	jQuery(".next").click(function(){
		pass = validateField();
		if(pass == true) {
			currentLayerNumber++;
		}
	});
	
	jQuery(".back").click(function(){
		currentLayerNumber--;
	});
	jQuery(".dir").click(function(){
		var nextLayer = jQuery(fieldsets[currentLayerNumber]);
		showLayer(nextLayer);
		getProgress();
		return false;
	});
	
	jQuery(':submit').click(function(){
		pass = validateField();
		if(pass != true) {
			return false;
		}
	});
	
	//
	function getProgress() {
		if(layerCount != 0) {
			layerMeasure = 100/layerCount;
		} else {
			layerMeasure = 0;
		}
		var progress = Math.round(layerMeasure * (currentLayerNumber + 1));
		jQuery('#progress-gauge').css("width",progress+'%'); //
	}
	
	function findOptionalInputs(inputs) {
		var re1 = new RegExp("{([a-zA-Z0-9\-_,]+)}","i");
		for(var i=0; i<inputs.length; i++) {
			var matches1 = inputs[i].value.match(re1);
			if(matches1) {
				for(var j=0; j<matches1.length; j++) {
					var re2 = new RegExp("[{}]+","i");
					var matches2 = matches1[j].match(re2);
					if(!matches2) {
						var fields = matches1[j].split(',');
						for(k=0; k<fields.length; k++) {
							showHideField(inputs[i],"#"+fields[k]);
							clickShowField(inputs[i],"#"+fields[k]);
						}
					}
				}
			}
		}
	}
	
	function setOptionalInputs(inputs) {
		var re1 = new RegExp("{([a-zA-Z0-9\-_,]+)}","i");
		for(var i=0; i<inputs.length; i++) {
			var matches1 = inputs[i].value.match(re1);
			if(matches1) {
				for(var j=0; j<matches1.length; j++) {
					var re2 = new RegExp("[{}]+","i");
					var matches2 = matches1[j].match(re2);
					if(!matches2) {
						var fields = matches1[j].split(',');
						for(k=0; k<fields.length; k++) {
							showHideField(inputs[i],"#"+fields[k]);
						}
					}
				}
			}
		}
	}
	
	function showHideField(input, field) {
		if(jQuery(input).attr('checked') == true || jQuery(input).attr('selected') == true) {
			jQuery(field).css({display:'block'});
		} else {
			jQuery(field).css({display:'none'});
		}
	}
	
	function clickShowField(input, field) {
		jQuery(input).parents('.field').children(input).click(function(){
			if(jQuery(input).attr('checked') == true || jQuery(input).attr('selected') == true) {
				jQuery(field).css({display:'block'});
			} else {
				jQuery(field).css({display:'none'});
			}
		});
	}
	
	showLayer(currentLayer);
	findOptionalInputs(jQuery("input").get());
	findOptionalInputs(jQuery("option").get());
}
