/* Changed jQuery reference from $ to jQ */

var __default_package_id = "7";
var __pricing_normalsubscription = {
	down:0,
	first_month:14.99,
	monthly:29.99,
	yearly:0.00,
	num_days_till_first_payment:5
	};
var __pricing_needsdomain = {
	down:0,
	first_month:27.94,/* 14.99 27.94 */
	monthly:29.99,
	yearly:12.95,
	num_days_till_first_payment:5
	};
var __input_to_check = ["l_id","c_id","p_id","a_id"];

var __acceptable_cc_companies = {
	"Visa":{
		length:[13,16],
		prefix:[4]
		},
	"Mastercard":{
		length:[16],
		prefix:[[51,55]]
		},
	"American Express":{
		length:[15],
		prefix:[34,37]
		},
	"Discover":{
		length:[16],
		prefix:[6011,[622126,622925],[644,649],65]
		}
	}

function insertPricing(pricing)
	{
	if (pricing.down) jQ("#total_billed_today").html("$"+pricing.down.toFixed(2));
	else jQ("#total_billed_today").html("$0.00 ($"+pricing.first_month.toFixed(2)+" in "+pricing.num_days_till_first_payment+" days)");
	if (pricing.monthly) jQ("#recurring_charges").html("$"+pricing.first_month.toFixed(2)+" first month, $"+pricing.monthly.toFixed(2)+" recurring monthly");
	else jQ("#recurring_charges").html("$0.00");
	
	var rc = jQ("#recurring_charges");
	if (pricing.yearly) rc.html((rc.html() == "$0.00" ? "" : rc.html()+", ") + pricing.yearly.toFixed(2)+" recurring yearly");
	}

var __templatepages_requested = false;
function promptTemplatePages()
	{
	if (__templatepages_requested) return true;
	__templatepages_requested = true;
	
	var template_id = jQ(".select_template:checked").val();
	var selected_package = jQ(".package:checked");
	var package_id = selected_package.length ? selected_package.val() : __default_package_id;

	jQ.post("/signup/templatepages",{template_id:template_id,package_id:package_id},function(data)
		{
		jQ("#signupvalues").append('<div style="display:block;">'+data+'</div>');
		jQ("#signupform").submit();
		});
	return false;
	}

function signupOnSubmit(check_only,stream_check)
	{
	var f = jQ("#signupform");
	if (!stream_check) f[0].submitted_once = true;
	var ok = true;
	
	var fn = jQ("[name='fname']",f);
	var ln = jQ("[name='lname']",f);
	var e = jQ("[name='email']",f);
	var un = jQ("[name='newusername']",f);
	var dr = jQ("[name='domainradio']",f); //radio
	var dn1 = jQ("[name='newdomainname']",f);
	var ds1 = jQ("[name='newdomaintld']",f);
	var dn2 = jQ("[name='existingdomainname']",f);
	var ds2 = jQ("[name='existingdomaintld']",f);
	var p = jQ("[name='password']",f);
	var cp = jQ("[name='retypepassword']",f);
	var st = jQ("[name='select_template']",f); //radio
	var ccnum = jQ("[name='card_cc']",f);
	var cc_exp_mo = jQ("[name='card_exp_month']",f);
	var cc_exp_yr = jQ("[name='card_exp_year']",f);

	if (fn.val() != fn[0].defaultValue) fn.val(fixName(fn.val()));
	if (ln.val() != ln[0].defaultValue) ln.val(fixName(ln.val()));
	if (e.val() != e[0].defaultValue) e.val(fixEmail(e.val()));
	if (dn1.val() != dn1[0].defaultValue) dn1.val(fixDomainName(dn1.val()));
	if (dn2.val() != dn2[0].defaultValue) dn2.val(fixDomainName(dn2.val()));
	
	if (!stream_check || fn[0].has_focused)
		{
		if (!inputHasValue(fn)) ok = alertField(fn,{id:"fname",message:"Please enter your <strong>first name</strong>."});
		else alertField(fn,{id:"fname"},true);
		}
	if (!stream_check || ln[0].has_focused)
		{
		if (!inputHasValue(ln)) ok = alertField(ln,{id:"lname",message:"Please enter your <strong>last name</strong>."});
		else alertField(ln,{id:"lname"},true);
		}
	
	if (!stream_check || e[0].has_focused)
		{
		if (!inputHasValue(e)) ok = alertField(e,{id:"email",message:"Please enter your <strong>email</strong> address."});
		else if (!strContains(e.val(),["@","."])) ok = alertField(e,{id:"email",message:"Please enter a valid <strong>email</strong> address."});
		else alertField(e,{id:"email"},true);
		}
	
	if (!stream_check || un[0].has_focused)
		{
		if (!inputHasValue(un)) ok = alertField(un,{id:"newusername",message:"Please enter a <strong>username</strong>."});
		else if (global_current_username_available == 2) ok = alertField(un,{id:"newusername",message:"Checking username availability..."},false,true);
		else alertField(un,{id:"newusername"},true);
		}
	
	if (!stream_check || (p[0].has_focused && cp[0].has_focused))
		{
		if (!inputHasValue(p)) ok = alertField(p,{id:"password",message:"Please enter a password."});
		else if (p.val().length < 8) ok = alertField(p,{id:"password",message:"Password should be at least 8 characters."});
		else alertField(p,{id:"password"},true);
		if (!inputHasValue(cp)) ok = alertField(cp,{id:"retypepassword",message:"Please re-enter your password."});
		else if (p.val() != cp.val()) ok = alertField(cp,{id:"retypepassword",message:"Passwords do not match. Please re-enter."});
		else alertField(cp,{id:"retypepassword"},true);
		}
	
	var fs2 = jQ("#form_section2");
	var fs3 = jQ("#form_section3");
	if (!stream_check && !fs2.is(":visible"))
		{
		if (ok)
			{
			fs2.show();
			fs3.show();
			window.scrollTo(0,fs2.offset().top);
			//collect info and post
			var reg_info = {
				fname:fn.val(),
				lname:ln.val(),
				email:e.val(),
				newusername:un.val(),
				domainradio:dr.val(),
				newdomainname:dn1.val(),
				newdomaintld:ds1.val(),
				existingdomainname:dn2.val(),
				existingdomaintld:ds2.val(),
				password:p.val(),
				l_id:jQ("[name='l_id']",f).val(),
				c_id:jQ("[name='c_id']",f).val(),
				p_id:jQ("[name='p_id']",f).val(),
				a_id:jQ("[name='a_id']",f).val()
				};
			//jQ.post("/regdata/track_reg.php",reg_info);
			
			//use this for the time being...
			var pairs = new Array();
			for (var k in reg_info) pairs.push(k+"="+reg_info[k]);
			var ua = "?"+pairs.join("&");
			jQ("body").append('<iframe id="iframe4ajax" style="display:none;" src="http://create.allowned.com/regdata/track_reg.php'+ua+'"></iframe>');
			}
		return false;
		}
	
	var dr_val = dr.filter(":checked").val();
	if (dr_val == "1" && (!stream_check || dn1[0].has_focused))
		{
		if (!inputHasValue(dn1)) ok = alertField(dn1,{id:"newdomainname",message:"Please enter a <strong>domain name</strong>."});
		else if (global_current_newdomainname_available == 2) ok = alertField(dn1,{id:"newdomainname",message:"Checking domain availability..."},false,true);
		else alertField(dn1,{id:"newdomainname"},true);
		}
	else if (dr_val == "transfer" && (!stream_check || dn2[0].has_focused))
		{
		if (!inputHasValue(dn2)) ok = alertField(dn2,{id:"existingdomainname",message:"Please enter a <strong>domain name</strong>."});
		else alertField(dn2,{id:"existingdomainname"},true);		
		}
	
	if (st[0] && (!stream_check || st[0].has_focused))
		{
		if (!st.filter(":checked").length)
			{
			ok = alertField(st,{id:"select_template",message:"Please select a <strong>design template</strong>."});
			jQ(".form_bottom_error",f).html("Please select a <strong>design template above</strong>.");
			}
		else
			{
			alertField(st,{id:"select_template"},true);
			jQ(".form_bottom_error",f).empty();
			}
		}
	
	/*
	var fs3 = jQ("#form_section3");
	if (!stream_check && !fs3.is(":visible"))
		{
		if (ok)
			{
			fs3.show();
			window.scrollTo(0,fs3.offset().top);
			}
		return false;
		}
	*/

	if (!stream_check || ccnum[0].has_focused)
		{
		if (!inputHasValue(ccnum)) ok = alertField(ccnum,{id:"card_cc",message:"Please enter a credit card number."});
		else if (!isValidCCNum(ccnum.val(),__acceptable_cc_companies)) ok = alertField(ccnum,{id:"card_cc",message:"Must be a valid Visa, Mastercard, American Express or Discover card number."});
		else alertField(ccnum,{id:"card_cc"},true);
		}
	
	if (!stream_check || cc_exp_mo[0].has_focused)
		{
		if (!inputHasValue(cc_exp_mo)) ok = alertField(cc_exp_mo,{id:"cc_exp_month",message:"Please enter your card's expiration month."});
		else alertField(cc_exp_mo,{id:"cc_exp_month"},true);
		}
	
	if (!stream_check || cc_exp_yr[0].has_focused)
		{
		if (!inputHasValue(cc_exp_yr)) ok = alertField(cc_exp_yr,{id:"cc_exp_year",message:"Please enter your card's expiration year."});
		else alertField(cc_exp_yr,{id:"cc_exp_year"},true);
		}

	if (ok && !stream_check)
		{
		//collect info and post
		//note: this is supposed to update an existing row in the DB
		//but since we can't use an ajax callback, we have to rely on
		//server-side validation, ie if all there is a row that matches
		//all the following input, then overwrite it with a credit_card_submit
		//flag, if not, create a new row
		var reg_info = {
			credit_card_submit:1,
			fname:fn.val(),
			lname:ln.val(),
			email:e.val(),
			newusername:un.val(),
			domainradio:dr.val(),
			newdomainname:dn1.val(),
			newdomaintld:ds1.val(),
			existingdomainname:dn2.val(),
			existingdomaintld:ds2.val(),
			password:p.val(),
			l_id:jQ("[name='l_id']",f).val(),
			c_id:jQ("[name='c_id']",f).val(),
			p_id:jQ("[name='p_id']",f).val(),
			a_id:jQ("[name='a_id']",f).val()
			};
		var pairs = new Array();
		for (var k in reg_info) pairs.push(k+"="+reg_info[k]);
		var ua = "?"+pairs.join("&");
		jQ("#iframe4ajax").attr("src","http://create.allowned.com/regdata/track_reg.php"+ua);
		
		jQ(".submit_btn_cont input[type='image']",f).fadeOut(400,function()
			{
			jQ("#signupform .submit_loading").fadeIn(400);
			});
		return promptTemplatePages();
		}

	return false;
	}

function isValidCCNum(ccnum,cc_companies)
	{
	if (ccnum == "4111111111111111") return true;
	//isValidCCNum() and associated cc_companies object authored by Alec Hulce 2009 ahulce@gmail.com
	var regexp_invalid = new RegExp("[^0-9]","g");
	ccnum = ccnum.replace(regexp_invalid,"");
	var ccnum_int = ccnum*1;
	var ccnum_str = ""+ccnum;
	var len = ccnum_str.length;
	var is_valid = true;

	//if cc_companies is passed in, make sure ccnum is valid according to cc_companies definitions
	//otherwise do a simple length check (length is either 15 or 16)
	if (cc_companies)
		{
		var card_company = "unknown";
		for (var k in cc_companies)
			{
			var company = cc_companies[k];
			var has_prefix_of_this_company = false;
			for (var i=0;i<company.prefix.length;i++)
				{
				var prefix = company.prefix[i];
				var valid_prefix = false;
				if (typeof(prefix) == "number")
					{
					var prefix_str = ""+prefix;
					if (prefix_str == ccnum_str.substr(0,prefix_str.length)) valid_prefix = true;
					}
				else
					{
					for (var n=prefix[0];n<=prefix[1];n++)
						{
						var prefix_str = ""+n;
						if (prefix_str == ccnum_str.substr(0,prefix_str.length))
							{
							valid_prefix = true;
							break;
							}
						}
					}
				if (valid_prefix)
					{
					has_prefix_of_this_company = true;
					break;
					}
				}
			if (has_prefix_of_this_company)
				{
				var has_valid_length = false;
				for (var i=0;i<company.length.length;i++)
					{
					if (len == company.length[i])
						{
						has_valid_length = true;
						break;
						}
					}
				if (has_valid_length)
					{
					card_company = k;
					break;
					}
				}
			}
		if (card_company == "unknown") is_valid = false;
		}
	else
		{
		if (len != 15 && len != 16) is_valid = false;
		}

	//Luhn validation (aka mod10 check)
	var checksum = 0;
	for (var i=len-1;i>=0;i--)
		{
		//first loop: grab rightmost digit
		var digit = ccnum_str.charAt(i)*1;
		checksum += digit;

		//first loop: ignore first rightmost digit and move to second rightmost
		i--;
		digit = ccnum_str.charAt(i)*1;
		digit *= 2;

		//if the doubled digit is two characters long, add the two characters together
		if (digit >= 10) digit = (""+digit).charAt(0)*1 + (""+digit).charAt(1)*1;
		checksum += digit;
		}
	//checksum%10 must be zero
	if (checksum%10) is_valid = false;

	return is_valid;
	}

function alertField(jobj,err,pass,no_highlight)
	{
	var err_elm = jobj.parents("form:first").find(".error."+err.id);
	if (pass)
		{
		jobj.removeClass("highlight");
		if (!no_highlight) jobj.addClass("successful");
		if (err.id) err_elm.html("");
		if (err_elm.hasClass("dblock")) err_elm.fadeOut(300);
		return true;
		}
	else
		{
		jobj.removeClass("successful");
		if (!no_highlight) jobj.addClass("highlight");
		err_elm.html(err.message);
		if (err_elm.hasClass("dblock")) err_elm.fadeIn(300);
		return false;
		}
	}

var reg_exp_bad_name_chars = new RegExp("[^a-zA-Z\-\' ]","g");
var reg_exp_bad_email_chars = new RegExp("[^a-zA-Z0-9_@\+\-\.]","g");
var reg_exp_bad_domain_chars = new RegExp("[^a-zA-Z0-9\-]","g");
var reg_exp_perimeter_spaces = new RegExp("^( )+|( )+$","g");
var reg_exp_consecutive_spaces = new RegExp(" +","g");

function fixName(name)
	{
	name = name ? name+"" : "";
	name = name.replace(reg_exp_perimeter_spaces,"");
	name = name.replace(reg_exp_consecutive_spaces," ");
	name = name.replace(reg_exp_bad_name_chars,"");
	var lcase = name.toLowerCase();
	if (lcase == "firstname" || lcase == "lastname" || lcase == "theirfirstname" || lcase == "theirlastname") name = "";
	return name;
	}

function fixEmail(email)
	{
	email = email ? email+"" : "";
	return email.replace(reg_exp_bad_email_chars,"");
	}

function fixDomainName(dn)
	{
	dn = dn ? dn+"" : "";
	return dn.replace(reg_exp_bad_domain_chars,"");
	}

function inputHasValue(jobj)
	{
	if (!jobj.val() || (jobj.attr("type") != "hidden" && jobj.val() == jobj[0].defaultValue)) return false;
	return true;
	}

function strContains(val,str_arr)
	{
	val = typeof(val) == "object" ? val.value : (val || "");
	for (var i=0;i<str_arr.length;i++)
		{
		if (val.indexOf(str_arr[i]) == -1) return false;
		}
	return true;
	}

function inputOnBlur(inp)
	{
	var i = jQ(inp);
	i.removeClass("current");
	if (!i.val() && i[0] && i[0].defaultValue)
		{
		i.val(i[0].defaultValue);
		i.addClass("example");
		}
	}

function inputOnFocus(inp)
	{
	var i = jQ(inp);
	i.addClass("current");
	if (i[0] && i.val() == i[0].defaultValue)
		{
		i.val("");
		i.removeClass("example");
		}
	i[0].has_focused = true;
	}

function applyFormEventHandlers()
	{
	var relevants = jQ("#signupform [type='text'],#signupform [type='password'],#signupform select");
	relevants.bind("focus",function()
		{
		inputOnFocus(this);
		});
	relevants.bind("blur",function()
		{
		inputOnBlur(this);
		});
	jQ("#signupform [type='text'],#signupform [type='password']").bind("blur",function()
		{
		if (jQ("#signupform")[0].submitted_once) signupOnSubmit(true,true);
		else signupOnSubmit(true,true);
		});
	jQ("#signupform select,#signupform [type='radio']").bind("change",function()
		{
		if (jQ("#signupform")[0].submitted_once) signupOnSubmit(true,true);
		else signupOnSubmit(true,true);
		});
	jQ("#signupform").bind("submit",signupOnSubmit);
	global_current_username_available = 0;
	jQ("#signupform [name='newusername']").bind("blur",function()
		{
		t = jQ(this);
		if (t.val())
			{
			global_current_username_available = 2;
			jQ("#signupform .error.newusername").html("Checking username availability...");
			jQ.post("/signup/checkusername",{username:t.val()},function(data)
				{
				if (data == "1")
					{
					global_current_username_available = 1;
					alertField(jQ("#signupform [name='newusername']"),{id:"newusername",message:"Username available."},true);
					}
				else
					{
					global_current_username_available = 0;
					alertField(jQ("#signupform [name='newusername']"),{id:"newusername",message:"Username <strong>unavailable</strong>. Please choose another."});
					}
				});
			}
		});
	global_current_newdomainname_available = 0;
	jQ("#signupform [name='newdomainname'],#signupform [name='newdomaintld']").bind("change",function()
		{
		var cdr = jQ("#signupform [name='domainradio']:checked");
		if (cdr.val() === "1")
			{
			var domain_name = jQ("#signupform [name='newdomainname']").val();
			var domain_suffix = jQ("#signupform [name='newdomaintld']").val();
			if (domain_name && domain_suffix)
				{
				global_current_newdomainname_available = 2;
				jQ("#signupform .error.newdomainname").html("Checking domain availability...");
				jQ.post("/signup/domaincheck",{domain:domain_name,tld:domain_suffix},function(data)
					{
					if (data == "1")
						{
						global_current_newdomainname_available = 1;
						alertField(jQ("#signupform [name='newdomainname']"),{id:"newdomainname",message:"Domain available."},true);
						}
					else
						{
						global_current_newdomainname_available = 0;
						alertField(jQ("#signupform [name='newdomainname']"),{id:"newdomainname",message:"Domain <strong>unavailable</strong>. Please choose another."});
						}
					});
				}
			}		
		});
	}

function fullHeight(of,exclude_margin)
	{
	var add_these_up = ["padding-top","padding-bottom","border-top-width","border-bottom-width"];
	if (!exclude_margin) add_these_up.concat(["margin-top","margin-bottom"]);
	var nnums = new RegExp("[^0-9]","g");
	var h = 0;
	for (var i=0;i<add_these_up.length;i++) h += (of.css(add_these_up[i]) || "0").replace(nnums,"")*1;
	return h+of.height();
	}

function setActualHeight(of,to,exclude_margin,min_only)
	{
	var extras = fullHeight(of,exclude_margin)-of.height();
	var new_height = to-extras;
	if (min_only)
		{
		if (jQ.browser.msie && jQ.browser.version < 7) of.css("height",new_height+"px");
		else of.css("height","auto");
		of.css("min-height",new_height+"px");
		}
	else of.css("height",new_height+"px");
	}

function setUp_cust_radio_set()
	{
	var radios = jQ("#signupform .cust_radio_set .radio");
	radios.bind("click",function()
		{
		var t = jQ(this);
		var this_subrow = t.parents(".crs_row:first").find(".crs_subrow2");
		if (!this_subrow.is(":visible"))
			{
			var other_subrows = t.parents(".cust_radio_set:first").find(".crs_subrow2:visible");
			other_subrows.slideUp(400);
			this_subrow.slideDown(400);
			}
		if (t.val() == "no" || t.val() == "transfer") insertPricing(__pricing_normalsubscription);
		else insertPricing(__pricing_needsdomain);
		});
	radios.each(function()
		{
		var t = jQ(this);
		if (t.val() != "no") t.attr("checked","");
		else t.click();
		});
	}

function setUp_site_design_options()
	{
	/* these activate shadowBox instead
	var thumbs = jQ("#signupform .site_design_options .sd_thumb");
	thumbs.bind("click",function()
		{
		jQ(this).parents(".sd_option:first").find(".radio").click();
		});
	*/
	var radios = jQ("#signupform .site_design_options .radio");
	radios.bind("click",function()
		{
		var t = jQ(this);
		if (!t.hasClass("selected"))
			{
			t.parents("..site_design_options:first").find(".selected").removeClass("selected");
			t.parents(".sd_option:first").addClass("selected");
			}
		});
	}

function maintainDesignLayout()
	{
	var height_of_left_column = fullHeight(jQ("#page_left"));
	var extra_height = jQ("#page_right-b").height(); //for design overlap
	var new_height_of_right_column = height_of_left_column+extra_height;
	setActualHeight(jQ("#page_right"),new_height_of_right_column,true,true);
	}

function getURLVars(from_str)
	{
	if (from_str) var url = from_str;
	else var url = ((typeof(window.location) == "string") ? window.location : window.location.href) || "";
	var var_string = url.split("?")[1] || "";
	var var_pairs = var_string.split("&");
	var get_object = new Object();
	for (var i=0;i<var_pairs.length;i++)
		{
		var pair = var_pairs[i].split("=");
		if (pair.length == 2) get_object[pair[0]] = pair[1];
		}
	return get_object;
	}
$_GET = getURLVars();

function checkForOverrideInput()
	{
	if (typeof(__input_to_check) != "object") return;
	var check_for = __input_to_check;
	var parent_form = jQ("#signupform");
	for (var i=0;i<check_for.length;i++)
		{
		if ($_GET[check_for[i]]) jQ("[name='"+check_for[i]+"']",parent_form).val($_GET[check_for[i]]);
		}
	}

jQ(function()
	{
	setUp_cust_radio_set();
	setUp_site_design_options();
	maintainDesignLayout();
	applyFormEventHandlers();
	checkForOverrideInput();
	});