// check for the D_LEADS.leads namespace
var D_LEADS;
if (typeof D_LEADS == 'undefined') { var D_LEADS = {}; }

/* dashboard Leads javascript */
String.prototype.trim_lead_str = function () {
	return this.replace(/lid/, '');
};

String.prototype.trim_uid_str = function (){
	return this.replace(/uid/, '');
};

String.prototype.trim_ltid_str = function (){
	return this.replace(/ltid_/, '');
};

// D_LEADS.validate_form
// Lead Type form validation
D_LEADS.validate_form = {
	
	init: function() {
		
		var self = this;
				
		self.set_preset_toggle();
		
		// Custom method for validating fields with preset text
		$.validator.addMethod("preset", function(value, element, param){
				
			if ( param === true) {
				// if input's value is equal to the stored preset, it's invalid
				if (value == $(element).data('preset')) {
					return false;
				}
				else {
					return true;
				}
			}
			else {
				return true;
			}
		}, "This field is required.");
		
		// Custom method for validating choice sets
		$.validator.addMethod('required_choice', function(value, element) {
			var module = $(element).parents('li');
			return module.find('input:checked').length;
		}, "This field is required.");
		
		// Custom method for validating group fields (i.e., name and address)
		$.validator.addMethod('required_group', function(value, element) {
			var module = $(element).parents('li'),
			nInputs = module.find('input.required_group').length,
			nFilled = module.find('input.required_group:filled').length,
			nSelects = module.find('select.required_group').length,
			nSelectsFilled = 0;
			
			module.find('select.required_group').each(function(){
				if ($(this).attr('selectedIndex')) {
					nSelectsFilled ++;
				}
			});
									
			return (nInputs == nFilled && nSelects == nSelectsFilled); // returns true only if number of inputs and select is equal to number of filled inputs and selects
		}, "These fields are required.");
				
		self.validate();
	},
	
	set_preset_toggle: function() {
		
		var self = this,
		presets = $('input.req_preset, input.preset, textarea.preset, textarea.req_preset');
				
		// preset field value functionality
		presets.each(function(){
			self.store_preset($(this));
		});
		
		// on focus, remove the preset value
		presets.focus(function(){
			self.toggle_preset($(this), 'focus');
		});
		
		presets.blur(function(){
			self.toggle_preset($(this), 'blur');
		});
	},
	
	validate: function() {
	
		// We don't want indivual field messages to appear
		$.validator.messages.required = "This field is required.";
	
		// Validate form fields based on presence of class names
		$.validator.addClassRules({
			req_preset: {
				preset: true
			},
			required_group: {
				required: true,
				required_group: true
			},
			lt_email: {
				email: {
					depends: function(element){
						if ($(element).data('preset')) {
							return ($(element).val() != $(element).data('preset'));
						}
						else {
							return true;
						}
					}
				},
				required: false
			},
			lt_email_req: {
				email: true,
				required: true
			},
			lt_number: {
				required: false,
				number: true
			},
			lt_number_req: {
				required: true,
				number: true
			}
		});
	
		// The validation
		$('.lt_edit_form').validate({
			invalidHandler: function(form, validator) {
				if ($('div.errors p').length == 0) {
					$('div.errors').fadeIn(300).append('<p>Please correct the errors marked in red.</p>');
				}
			},
			errorPlacement: function(error, element) {
				if (element.parents('li').find('label.has_error').length == 0) {
     				error.appendTo(element.parents("li"));
     			}
   			},
   			highlight: function(element, errorClass) {
				$(element).parents('li').addClass(errorClass);
			},
			unhighlight: function(element, errorClass) {
				$(element).parents('li').removeClass(errorClass);
			},
			onfocusout: false,
			onkeyup: false,
			onclick: false,
			errorClass: "has_error",
			submitHandler: function(form) {
			
				var regex = new RegExp("(\<(/?[^\>]+)\>)", "g");
			
				// clear presets
				$(form).find('.preset, .req_preset').each(function(){
					if($(this).val() == $(this).data('preset')){
						$(this).val('');
					}
				});
				
				// remove HTML tags
				$(form).find('input[type=text], textarea').each(function(){
					var thisVal = $(this).val();
					$(this).val(thisVal.replace(regex, ''));
				});
						
				// If the lead type select menu is present, we need to set the form action url based on its value
				if ($('#lead_type').length > 0) {	
					$('#lead_edit_form').attr('action', '/forms/save_new_form/' + $('#lead_type').val());
				}
				
				form.submit();
				return false;
			}
		});
	},
	
	store_preset: function(element) {
		// store all preset input values as a jQuery data object
		element.data('preset', element.val());
	},
	
	toggle_preset: function(element, mode) {
	
		if (mode == 'focus') {
			if (element.val() == element.data('preset')) {
				element.val('').addClass('has_val');
			}
		}
		else if (mode == 'blur') {
			if (element.val() == '') {
				element.val(element.data('preset')).removeClass('has_val'); // add back the preset value
			}
		}
	}
};


$(document).ready(function() {
	D_LEADS.validate_form.init();
});
