var contribute = {
	load: function()
	{
		jQuery("#amount_other").bind("keyup", function()
		{
			if (jQuery.trim(jQuery(this).val()) != "")
				jQuery("#amt_other").attr("checked", true);
		});
		
		jQuery("#paypalform").submit(contribute.submit);
	}
	, submit: function()
	{
		var paypalform = jQuery("#paypalform"); 
		paypalform.attr("disabled", true);
		var missing = false, firstMissing = null, data = {}, number = 0,
			$contrib = jQuery("#contribution"), amount = 0, errormsg = "";
		
		$contrib.find("input[name=email]").parents("td:first")
			.removeClass("invalid")
			.find("div.invalid").hide();
		$contrib.find("input[name=phone]").parents("td:first")
			.removeClass("invalid")
			.find("div.invalid").hide();
		$contrib.find("input[name=zip]").parents("td:first")
			.removeClass("invalid")
			.find("div.invalid").hide();
	
		$contrib.find("label.required").each(function()
		{
			var $this = jQuery(this), $td = $this.parents("td:first"),
				key = $this.attr("for"),
				val = jQuery.trim(jQuery("#" + key).val());
			data[key] = val;

			if (val == "")
			{
				missing = true;
				$td.addClass("missing").find("div.errormsg").show();
				if (!firstMissing)
					firstMissing = $this;
			}
			else
			{
				$td.removeClass("missing").find("div.errormsg").hide();
				paypalform.find("input[type=hidden][pass=1][name=" + $this.attr("name") + "]").val(val);
			}
		});
	
		$contrib.find("input[name=amount]").each(function()
		{
			var $this = jQuery(this);
			if ($this.attr("checked"))
				amount = $this.val();
			else if (!firstMissing)
				firstMissing = $this;
		});
		if (amount == "other")
		{
			amount = parseInt($contrib.find("#amount_other").val());
		}
		if (!amount)
		{
			missing = true;
			$contrib.find("#amount_error").show();
		}
		else
			$contrib.find("#amount_error").hide();
	
		jQuery("#paypal_amount").val(amount);
		data["amount"] = amount;
		
		if (!jQuery("#legal_confirm").attr("checked"))
		{
			missing = true;
			jQuery("#legal_error").show();
			if (!firstMissing)
				firstMissing = jQuery("legal_confirm");
		}
		else
			jQuery("#legal_error").hide();
	
		if (missing)
		{
			jQuery("#formerr").show();
			jQuery(document).scrollTop(0);
			if (firstMissing)
				firstMissing.focus();
			jQuery("#paypalform").attr("disabled", false);
			return false
		}
		else
		{
			if (!contribute.checkemail($contrib.find("input[name=email]").val()))
			{
				jQuery("#formerr").show();
				$contrib.find("input[name=email]").focus()
					.parents("td:first")
					.addClass("invalid")
					.find("div.invalid").show();
				jQuery(document).scrollTop(0);
				return false;
			}
		
			var phone = $contrib.find("input[name=phone]").val();
			if (!contribute.checkphone(phone))
			{
				jQuery("#formerr").show();
				$contrib.find("input[name=phone]").focus()
					.parents("td:first")
					.addClass("invalid")
					.find("div.invalid").show();
				jQuery(document).scrollTop(0);
				return false;
			}
			else
			{
				phone = phone.replace(/[^0-9]/g, '');
				paypalform.find("input[type=hidden][name=night_phone_a]").val(phone.substring(0, 3));
				paypalform.find("input[type=hidden][name=night_phone_b]").val(phone.substring(3, 3));
				paypalform.find("input[type=hidden][name=night_phone_c]").val(phone.substring(6, 4));
			}
			if (!contribute.checkzip($contrib.find("input[name=zip]").val()))
			{
				jQuery("#formerr").show();
				$contrib.find("input[name=zip]").focus()
					.parents("td:first")
					.addClass("invalid")
					.find("div.invalid").show();
				jQuery(document).scrollTop(0);
				return false;
			}
		
			jQuery("#formerr").hide();
			jQuery("#paypalbtn").attr("disabled", true);
		
			jQuery.ajax({ url: "contribute_/process.php", type: "POST", data: data, dataType: "json", async: false, success:function(d)
				{
					if (d.error)
						errormsg = d.error;
					if (d.number)
						number = d.number;
				},
				error: function(req, textStatus, errorThrown)
				{
					alert("There was an error processing your form, please try again. If the problem continues contact the site directly.\n" + errormsg);
					jQuery("#paypalform").attr("disabled", false);
					jQuery(document).scrollTop(0);
					return false;

				}
			});

			if (number)
			{
				jQuery("#paypal_number").val(number);
				return true;
			}
			else
			{
				alert("There was an error processing your form, please try again. If the problem continues contact the site directly.\n" + errormsg);
				jQuery("#paypalform").attr("disabled", false);
				jQuery(document).scrollTop(0);
				return false;
			}
		}
	}
	, checkemail: function(val)
	{
		var filter = /^.+@.+\..{2,3}$/;
		return filter.test(val);
	}
	, checkzip: function (field)
	{
		var regex = /(^\d{5}$)|(^\d{5}-\d{4}$)/
		return regex.test(field);
	}
	, checkphone: function(val)
	{
		// Declaring required variables
		var digits = "0123456789";
		// non-digit characters which are allowed in phone numbers
		var phoneNumberDelimiters = "()- ";
		// characters which are allowed in international phone numbers
		// (a leading + is OK)
		var validWorldPhoneChars = phoneNumberDelimiters + "+";
		// Minimum no of digits in an international phone no.
		var minDigitsInIPhoneNumber = 10;

		function isInteger(s)
		{
		    for (var i = 0; i < s.length; ++i)
		    {   
		        // Check that current character is number.
		        var c = s.charAt(i);
		        if (((c < "0") || (c > "9"))) 
					return false;
		    }
		    // All characters are numbers.
		    return true;
		}
		function stripCharsInBag(s, bag)
		{   
		    var returnString = "";
		    // Search through string's characters one by one.
		    // If character is not in bag, append to returnString.
		    for (var i = 0; i < s.length; ++i)
		    {   
		        // Check that current character isn't whitespace.
		        var c = s.charAt(i);
		        if (bag.indexOf(c) == -1) 
					returnString += c;
		    }
		    return returnString;
		}

		function checkInternationalPhone(strPhone)
		{
			var bracket = 3, s, brchr;
			strPhone = jQuery.trim(strPhone);
			if (strPhone.indexOf("+") > 1) 
				return false;
			if (strPhone.indexOf("-") != -1)
				bracket = bracket + 1;
			if (strPhone.indexOf("(") != -1 && strPhone.indexOf("(") > bracket)
				return false;
			brchr = strPhone.indexOf("(");
			if (strPhone.indexOf("(") != -1 && strPhone.charAt(brchr+2) != ")")
				return false;
			if (strPhone.indexOf("(") == -1 && strPhone.indexOf(")") != -1)
				return false;
			s = stripCharsInBag(strPhone,validWorldPhoneChars);
			return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
		}

		return checkInternationalPhone(val);
	}
};
jQuery(document).ready(contribute.load);

