var fmform = {
	dataChanged: false,
	skipValidateActions: ['cancelaction'],
	initialiseFormEvents: function(formid, dontcheckforsaves, cansavedraft) {
		$("#" + formid).keyup(this.inputOnChange);
		$("#" + formid).change(this.inputOnChange);
		$("#" + formid + ' input').focus(this.inputOnFocus);
		$("#" + formid + ' input').blur(this.inputOnBlur);
		$("#" + formid + ' select').focus(this.inputOnFocus);
		$("#" + formid + ' select').blur(this.inputOnBlur);
		$("#" + formid + ' input:submit').click(this.formValidate);
		$('.helpicon').click(this.helpOnClick);

		for(var key in window.form_fields) {
			if($.inArray(window.form_fields[key].datatype, new Array('Integer', 'Number', 'Money')) > -1) {
				fmform.formatNumberInput(key, window.form_fields[key].datatype);
			}
			else if(window.form_fields[key].datatype == 'Date') {
				var width = $('#' + key).width();
				if(width == 200) $('#' + key).width(132);
				else if(width == 280) $('#' + key).width(212);
				$('#' + key).datepicker({dateFormat: 'yy-mm-dd', changeMonth: true, changeYear: true, showOtherMonths: true, selectOtherMonths: true});
			}
			else if(window.form_fields[key].lookup) {
				fmform.convertToLookup(key);
			}
		}
		if(!dontcheckforsaves) {
			$('header a, #help a, #schemetabs a').click(function(event) {
				if(fmform.dataChanged) {
					var strhref = $(this).attr('href');
					var shtml = '<div class="clearfix"><p>You have not saved your data, are you sure you want to browse away from this page? Any changes will be lost.</p>';
					shtml += '<div class="first actionbar">';
					shtml += '<input type="submit" name="submitdata" id="submitdata" value="Submit" class="primaryaction" /> ';
					if(cansavedraft) shtml += '<input type="submit" name="savedraft" id="savedraft" value="Save draft" class="primaryaction" /> '
					shtml += '<a href="' + strhref + '" class="secondaryaction">Continue</a> ';
					shtml += '<a href="#" class="cancelaction simplemodal-close">Cancel</a></div></div>';
					$(shtml).modal({appendTo: '#' + formid});
					return false;
				}
				return true;
			});
		}
	},
	formatNumberInput: function(inputName, dataType) {
		var $input = $('#' + inputName);
		if ($input.length) {
			var nStr = $input.val();
			nStr = nStr.replace(/(\u00A3)|,/g, "");
			var x = nStr.split('.');
			var x1 = x[0];
			var x2 = x.length > 1 ? '.' + x[1].substr(0,2) : '';
			var rgx = /(\d+)(\d{3})/;
			while (rgx.test(x1)) {
				x1 = x1.replace(rgx, '$1' + ',' + '$2');
			}
			$input.val(x1 + x2);
			if(dataType === 'Money' && $input.val() !== '') {
				$input.val('\u00A3' + $input.val());
			}
		}
	},
	validateInput: function(inputName, datatype, isMandatory) {
		var $input = $('#' + inputName);
		if ($input.length) {
			var errorlist = new Array();
			var inputVal = $input.val();

			if(isMandatory && (inputVal == '-- Please choose --' || inputVal == '' || inputVal == null || (datatype == 'DropDown' && inputVal == 0))) {
				errorlist.push('This is a required field');
			}	
			switch(datatype) {
				case 'String': {
					break;
				}
				case 'Number': {
					inputVal = inputVal.replace(/,/g, "");
					if(inputVal.search(/^-?\d*\.?\d*$/) == -1) errorlist.push('Please enter a number in this field');
					break;
				}
				case 'Email': {
					if(inputVal.search(/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/) == -1) errorlist.push('Please enter a valid email address');
					break;
				}
				case 'Money': {
					inputVal = inputVal.replace(/(\u00A3)|,/g, "");
					if(inputVal.search(/^-?\d*\.?\d{0,2}$/) == -1) errorlist.push('Please enter a number in this field');
					break;
				}
				case 'Date': {
					if(inputVal.search(/^(\d{4}-\d{2}-\d{2})?$/) == -1) errorlist.push('Please enter the date in yyyy-mm-dd format');
					break;
				}
				case 'Integer': {
					inputVal = inputVal.replace(/,/g, "");
					if(inputVal.search(/^\d*$/) == -1) errorlist.push('Please enter a whole number');
					break;
				}
				case 'Percentage': {
					if(inputVal.search(/^-?\d*\.?\d*$/) == -1) errorlist.push('Please enter a number in this field');
					break;
				}	
				default: break;
			}
			this.setErrors(inputName, errorlist);
			return errorlist;
		}
		return [];
	},
	setErrors: function(inputName, errorlist, id) {
		if(errorlist.length > 0) {
			var errorhtml = '<ul '+(id!==undefined?'id="'+id+'"':'')+' class="error">';
			for(var i = 0; i < errorlist.length; i++) {
				errorhtml += '<li>' + errorlist[i] + '</li>';
			}
			errorhtml += '</ul>';
			$('#' + inputName + 'errors').html(errorhtml);
		} else {
			$('#' + inputName + 'errors').html('');
		}
	},
	clearErrors: function(id) {
		$('#'+id).remove();
	},
	inputOnChange: function(event) {
		if(window.form_fields[event.target.name] !== undefined) {
			fmform.validateInput(event.target.name, window.form_fields[event.target.name].datatype, window.form_fields[event.target.name].mandatory);
		}
		fmform.dataChanged = true;
	},
	formValidate: function(event) {
		// should we skip form validate?
		var canskip = false;
		var cansend = true;
		for(var i = 0; i < fmform.skipValidateActions.length; i++) {
			if(event.target.name.indexOf(fmform.skipValidateActions[i]) == 0) canskip = true;
		}
		if(!canskip) {
			var fullerrorlist = new Array();
			var tmperrorlist = new Array();
			for(var key in window.form_fields) {

				tmperrorlist = fmform.validateInput(key, window.form_fields[key].datatype, window.form_fields[key].mandatory);
				if(tmperrorlist.length > 0) {
					cansend = false;
					for(var i = 0; i < tmperrorlist.length; i++) {
						fullerrorlist.push("'" + window.form_fields[key].label + "':" + tmperrorlist[i]);
					}
				}
			}
		}
		if(cansend) {
			for(var key in window.form_fields) {
				if($.inArray(window.form_fields[key].datatype, new Array('Integer', 'Number', 'Money')) > -1 && $('#' + key).length) {
					$('#' + key).val($('#' + key).val().replace(/[^0-9\.]/g, ""));
				}
			}
			fmform.dataChanged = false;
		}
		else {
			var errorhtml = '<p>The following errors were found on the form. please review your data and then try submitting again.</p><ul>';
			for(var i = 0; i < fullerrorlist.length; i++) {
				errorhtml += '<li>' + fullerrorlist[i] + '</li>';
			}
			errorhtml += '</ul><input type="button" value="OK" class="simplemodal-close" />';
			$.modal(errorhtml);
		}
		return cansend;
	},
	inputOnFocus: function(event) {
		if(window.form_fields[event.target.name] !== undefined) {
			// convert the value to a number if formatted in a particular way
			var dt = window.form_fields[event.target.name].datatype;
			if($.inArray(dt, new Array('Integer', 'Number', 'Money')) > -1) {
				event.target.value = event.target.value.replace(/[^0-9\.]/g, "")
			}
		}
		fmform.showTooltip(event.target.name);
	},
	inputOnBlur: function(event) {
		if(window.form_fields[event.target.name] !== undefined) {
			var dt = window.form_fields[event.target.name].datatype;
			if($.inArray(dt, new Array('Integer', 'Number', 'Money')) > -1) {
				fmform.formatNumberInput(event.target.name, dt);
			}
		}
		fmform.showTooltip(event.target.name);
	},
	showTooltip: function(element) {
		// show a tooltip if it has one
		if($('#' + element + 'tooltip').is(":visible")) {
			$('#' + element + 'tooltip').fadeOut(200);
		} else {
			$('.tooltip:visible').fadeOut(200);
			if(window.form_fields[element] && window.form_fields[element].tooltip != '') {
				$('#' + element + 'tooltip').fadeIn(200);
			}
		}
	},
	helpOnClick: function(event) {
		var ttname = event.target.id.substring(0, event.target.id.length - 8);
		fmform.showTooltip(ttname);
	},
	filterDropDown: function(dbfield, depfield, callback) {
		  $.getJSON("/framework/components/objects/projectteam.cfc?wsdl", {
				method: 'filterDropDownValues',
				returnformat: 'json',
				valuename: dbfield.substring(0, dbfield.length - window.form_fields[dbfield].appendid.length),
				objectid: depfield.data('objectid'),
				depvalue: depfield.val()
			  },
			  function(ddvals) {
				  var options = '<option value="0">-- Please choose --</option>';
				  for (var i = 0; i < ddvals.length; i++) {
					  options += '<option value="' + ddvals[i].dropdownid + '">' + ddvals[i].dropdownvalue + '</option>';
				  }
				  var val = $('#'+dbfield).html(options).children('option:first').attr('selected', 'selected').text();
				  $('#'+dbfield+' + .lookupvalue').text(val);
				  if (callback) callback();
			  });
	},
	filterDropDowns: function(event) {
		var depfield = $(event.target);
		var depfields = depfield.data("depfields");
		for(var i = 0; i < depfields.length; i++) {
			var dd = depfields[i];
			fmform.filterDropDown(dd, depfield, function() {
				fmform.setDropDownEnabled(dd, $('#' + dd).find('option').length > 1);
			});
		}
	},
	convertToLookup: function(selectid) {
		$('select#' + selectid).css('display', 'none');
		var htmllookup = '<span class="lookupvalue">' + $('select#' + selectid + ' :selected').text() + '</span>';
		htmllookup += '<a href="#"><img src="/images/Search_32x32.png" alt="Magnifying glass, click here to lookup value" /></a>';
		$('select#' + selectid).after(htmllookup);
		$('select#' + selectid).parent().find('a').click(this.showLookup);
		if ($('select#' + selectid).find('option').length < 2) {
			this.setDropDownEnabled(selectid, false);
		}
	},
	showLookup: function(event) {
		var sel = $(event.target);
		var luwin = '<div id="lookupwindow"><form name="lookupform"><input type="text" name="searchlookup" id="searchlookup" /><ul id="searchlookuplist">';
		var opts = sel.parent().parent().find('option');
		for(var i = 1; i < opts.length; i++) {
			luwin += '<li><a href="#" class="simplemodal-close" rel="' + opts[i].value + '">' + opts[i].text + '</a></li>';
		}
		luwin += '</ul><div class="actionbar"><a class="simplemodal-close cancelaction">Cancel</a></div>';
		$.modal(luwin);
		$('#searchlookuplist a').click(function(event) {
			sel.parent().parent().find('select').val(this.rel);
			sel.parent().parent().find('.lookupvalue').text($(this).text());
		});
		$('#searchlookup').keyup(function() {
			$('#searchlookuplist a').each(function(index) {
				if($(this).text().toLowerCase().indexOf($('#searchlookup').val().toLowerCase()) > -1) {
					$(this).css('display', 'inline');
				} else {
					$(this).css('display', 'none');
				}
			});
		});
	},
	/* <select> does not have a readonly attribute, so we use disabled in conjunction with a hidden field */
	setDropDownEnabled: function(inputName, enabled) {
		/* use for lookups as well */
		if (window.form_fields[inputName] && window.form_fields[inputName].lookup) {
			$('#' + inputName).parent().find('a').toggle(enabled);
		}
		else {
			var $input = $('#'+inputName);
			if ($input.length) {
				$input.attr('disabled',enabled?'':'disabled');

				var $hidden = $('#hidden'+$input.attr("name"));
				if(!$hidden.length) {
					$hidden = $('<input id="hidden'+$input.attr("name")+'" name="'+$input.attr("name")+'" type="hidden" />');
				}
			
				if(enabled) {
					$hidden.detach();
				}
				else  {
					$hidden.val($input.val());
					if (!$('#hidden'+$input.attr("name")).length) {
						$input.after($hidden);
					}
				}
			}
		}
	}
}

