
$.fn.openModal = function()
{
	return this.each(function()
	{
		if(eval('window.modalHandlers.'+this.id.replace('modal','modalOpen')))
		{
			if(eval('modalHandlers.'+this.id.replace('modal','modalOpen')+'();'))
			{
				$('.modalContainer').hide();
				trackingHandlers.trackModalOpen(this.id);
				$(this).add('#modalOverlay').show();
			}
		}
		else
		{
			$('.modalContainer').hide();
			trackingHandlers.trackModalOpen(this.id);
			$(this).add('#modalOverlay').show();
		}
	});
}

$.fn.closeModal = function()
{
	return this.each(function()
	{
		trackingHandlers.trackModalClose(this.id);
		$('.modalContainer,#modalOverlay').hide();
	});
}	

$.fn.backfillField = function()
{
	return this.each(function()
	{
		$(this).filter('input[@type=text],textarea').attr('defaultvalue',$(this).val()).blur(function() {($(this).val() == "") ? $(this).val($(this).attr('defaultvalue')) : null;}).blur();
	});
}

$.fn.prefillField = function()
{
	return this.each(function()
	{
		$(this).filter('input[@type=text],textarea').focus(function() {($(this).val() == $(this).attr('defaultvalue')) ? $(this).val("") : null;}).backfillField();
	});
}

$.fn.maxlengthTextarea = function()
{
	return this.each(function()
	{
		$(this).filter("textarea[@maxLength!='']").keyup(function()
		{
			if($(this).val().length > $(this).attr('maxlength'))
			{
				$(this).val($(this).val().substr(0,$(this).attr('maxlength')));
			}
		});
	});
}

$.fn.enableButton = function()
{
	return this.each(function()
	{
		$(this).css({opacity:1,cursor:'pointer'}).filter("[@isbound=''").click(function() {$(this).parents('form').submitForm();}).attr('isbound','isbound');
	});
}

$.fn.disableButton = function()
{
	return this.each(function()
	{
		$(this).css({opacity:0.5,cursor:'default'}).unbind('click').attr('isbound','');
	});
}

$.fn.addValidation = function()
{
	return this.each(function()
	{
		$(this).attr('isvalid','')
			.filter('input[@type=text].required,textarea.required').keyup(function()
			{
				($(this).val() == null || $(this).val() == "" || $(this).val() == $(this).attr('defaultvalue')) ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			})
			.end()
			.filter('input[@type=text].zipcode').keyup(function()
			{
				($(this).val().search(new RegExp("^[0-9]{5}$")) == -1) ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			})
			.end()
			.filter('input[@type=text].day,input[@type=text].month').keyup(function()
			{
				($(this).val().search(new RegExp("^[0-9]{1,2}$")) == -1) ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			})
			.end()
			.filter('input[@type=text].year').keyup(function()
			{
				($(this).val().search(new RegExp("^[0-9]{4}$")) == -1) ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			})
			.end()
			.filter('input[@type=text].email,textarea.email').keyup(function()
			{
				var isValid = true;
				var emails = $(this).val().split(',');
				for(var i=0; i < emails.length; i++)
				{
					if(emails[i].search(new RegExp("^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$")) == -1)
					{
						isValid = false;
					}
				}
				(!isValid) ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			})
			.end()
			.filter('select.required').change(function()
			{
				($(this).val() == 'null') ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			})
			.end()
			.filter('input[@type=checkbox].required').click(function()
			{
				(!$(this).attr('checked')) ? $(this).attr('isvalid','').bubbleValidation() : $(this).attr('isvalid','isvalid').bubbleValidation();
			});
	});
}

$.fn.bubbleValidation = function()
{
	return this.each(function()
	{
		$(this).filter("[@isvalid='']").siblings('.error').show();
		$(this).filter("[@isvalid='isvalid']").siblings('.error').hide();

		var isValid = (typeof($(this).parents('form').attr('validator')) != 'undefined' && $(this).parents('form').attr('validator') != "") ? eval('formHandlers.'+$(this).parents('form').attr('validator')+'();') : true;
		
		if($(this).parents('form').find("input[@isvalid=''],textarea[@isvalid=''],select[@isvalid='']").length > 0 || !isValid)
		{
			$(this).parents('form').find(".button[@id='']").disableButton()
		}
		else
		{
			$(this).parents('form').find(".button[@id='']").enableButton();
		}
	});
}

$.fn.initForm = function()
{
	return this.each(function()
	{
		$(this).find("input[@isvalid=''],textarea[@isvalid=''],select").attr('isvalid','isvalid');
		$(this).find('textarea').maxlengthTextarea();
		$(this).find('.backfill').backfillField();
		$(this).find('.prefill').prefillField();
		$(this).find(".button[@id='']").disableButton();
		$(this).find('.required,.email,.zipcode,.day,.month,.year').addValidation();
		
		$(this).find('input[@type=checkbox],input[@type=radio]').attr('defaultchecked','');
		$(this).find('input[@type=checkbox]:checked,input[@type=radio]:checked').attr('isvalid','isvalid').attr('defaultchecked','checked');
	});
}

$.fn.submitForm = function()
{
	return this.each(function()
	{
		if($(this).attr('action').toLowerCase() == 'local')
		{
			eval('formHandlers.'+$(this).attr('id')+'();');
			trackingHandlers.trackFormSubmit(this.id);
		}
		else
		{
			if(typeof($(this).attr('locked')) == 'undefined' || $(this).attr('locked') == "")
			{
				if($(this).attr('method').toLowerCase() == 'post')
				{
					$(this).attr('locked','locked');
					var id = $(this).attr('id');
					$.post($(this).attr('action'),$(this).serialize(),function(response)
					{	
						eval('formHandlers.'+id+'(response);');
						trackingHandlers.trackFormSubmit(id);
						$('#'+id).attr('locked','').resetForm();
					});
				}

				if($(this).attr('method').toLowerCase() == 'get')
				{
					$(this).attr('locked','locked');
					var id = $(this).attr('id');
					var params = $(this).serialize();
					params.randomizer = Math.round(Math.random()*100000000);
					$.get($(this).attr('action'),params,function(response)
					{	
						eval('formHandlers.'+id+'(response);');
						trackingHandlers.trackFormSubmit(id);
						$('#'+id).attr('locked','').resetForm();
					});
				}
			}
		}
	});
}

$.fn.bindButton = function()
{
	return this.each(function()
	{
		if(typeof(this.id) != 'undefined' && this.id != "")
		{
			$(this).click(function() {eval('buttonHandlers.'+this.id+'();');});
		}
	});
}

$.fn.resetForm = function()
{
	return this.each(function()
	{
		$(':input',this).each(function() 
		{
			var type = this.type;
			var tag = this.tagName.toLowerCase();

			if(type == 'text' || type == 'password' || tag == 'textarea')
			{	
				if(typeof($(this).attr('defaultvalue')) != 'undefined' && $(this).attr('defaultvalue') != "")
				{
					this.value = $(this).attr('defaultvalue');
				}
				else
				{
					this.value = '';
				}
				$(this).keyup();
			}
			else if(type == 'checkbox' || type == 'radio')
			{
				if($(this).attr('defaultchecked') == 'checked')
				{
					this.checked = true;
				}
				else
				{
					this.checked = false;
					$(this).filter('.required').attr('isvalid','');
				}
			}
			else if(tag == 'select')
			{
				this.selectedIndex = 0;
				$(this).change();
			}
		});
	});
}
