jQuery.validator.addMethod("username", function( value, element ) {
	var regex = /^([a-z]|\d|\.|@)+$/;
	return this.optional(element) || regex.test(value);
}, "Your username must contain only lowercase letters, numbers, or basic punctuation");

$(document).ready(function() {
  if ($('#signinForm').length > 0) setupSigninForm();
  if ($('#resetPasswordForm').length > 0) setupResetPasswordForm();
  if ($('#signupForm').length > 0) setupSignupForm();
  if ($('#classroomSignupForm').length > 0) setupClassroomSignupForm();
  if ($('#classroomSignupPreForm').length > 0) setupClassroomSignupPre();
  if ($('#classroomSignupPostForm').length > 0) setupClassroomSignupPost();
  if ($('#feedbackForm').length > 0) setupFeedbackForm();
  if ($('#settingsForm').length > 0) setupSettingsForm();
  if ($('#saveProgressForm').length > 0) setupSaveProgressForm();
  if ($('#rewardForm').length > 0) setupRewardForm();
  if ($('#upsellRejectionSurveyForm').length > 0) setupUpsellRejectionSurveyForm();
});

ALREADY_IN_USE_MESSAGE = "{0} is already in use. <a href='/signin'>Sign in</a>"

function setupSigninForm() {
	$('#signinForm').validate({
	  messages: {
  	  signin_username: {
  			required: "Enter your username",
  			remote: jQuery.format("{0} is not a registered username")
  		},
  		signin_password: {
  			required: "Enter your password",
  			remote: "Incorrect password"
  		}
		},
	  rules: {
  	  signin_username: {
  			required: true,
  			remote: "/users/existing_username"
  		},
  		signin_password: {
  			required: true,
  			remote: {
  			  url: "/users/check_password",
  			  type: "get",
  			  data: {
            username: function() { return $("#signin_username").val(); },
            password: function() { return sha1Hash($("#signin_password").val()); }
  			  }
  			}
  		}
		},
    errorPlacement: errorPlacement,
		submitHandler: submitSigninForm
	});
	
	$("#username").focus();
}

function submitSigninForm() {
	params = { 
		username: $('input#signin_username').val(),
	  password: sha1Hash($('input#signin_password').val())
	}
	$.post("/users/signin", params, signinSuccessful);
}

function signinSuccessful(response) {
	location.href = '/play';
}

function setupResetPasswordForm() {
  $('#resetPasswordForm').validate({
	  messages: {
  	  email: {
  			required: "Enter your email address",
  			remote: jQuery.format("{0} is not registered with an account")
  		}
		},
	  rules: {
  	  email: {
  			required: true,
  			email: true,
  			remote: "/users/existing_email"
  		}
		},
    errorPlacement: errorPlacement,
		submitHandler: submitResetPasswordForm
	});
	
	$("#email").focus();
}

function submitResetPasswordForm() {
	params = { 
		email: $('input#email').val()
	}
	$.post("/users/reset_password_email", params, resetPasswordSuccessful);
}

function resetPasswordSuccessful() {
  trackEvent("Account", "Reset Account", "Reset Account Form", 1); 
  $(".submitConfirmation").show();
}

function setupSignupForm() {
  $('#signupForm').validate({
    rules: {
      email: {
			  required: true,
			  remote: "/users/available_email"
			}
    },
    firstname: {
				required: true,
				remote: "/users/check_swearing"
			},
		lastname: {
				required: true,
				remote: "/users/check_swearing"
		},
		messages: {
			firstname: {
				required: "Enter your first name",
				remote: "Swearing is not allowed"
			},
			lastname: {
				required: "Enter your last initial",
				remote: "Swearing is not allowed"
			},
			email: {
				required: "Enter your email address",
				remote: jQuery.format(ALREADY_IN_USE_MESSAGE)
			}
		},
    errorPlacement: errorPlacement,
  	submitHandler: submitSignupForm
  });

  $("#firstname").focus();
}

function submitSignupForm() {
	$('form').hide();
	$('#intro').hide();
	$('#thankyou').show();

	$.post("/users/create_user", 
		{ firstname: $('input#firstname').val(),
		  lastname: $('input#lastname').val(),
		  email: $('input#email').val()
		});
	
  trackEvent("Account", "Signup", "Signup Form", 1); 
}

function setupClassroomSignupPre() {
  $('#classroomSignupPreForm').validate({
		submitHandler: submitClassroomSignupFormPre
	});	
}

function setupClassroomSignupPost() {
  $('#classroomSignupPostForm').validate({
		submitHandler: submitClassroomSignupFormPost
	});	
}

function suggestUsername() {
  var firstname = $("#firstname").val(); 
  var lastname = $("#lastname").val(); 
  if(firstname && lastname && !$("#username").val()) { 
      $("#username").val((firstname + '.' + lastname).toLowerCase());
  } 
}

function submitClassroomSignupFormPre(form) {	
	//params = {};
	//$.post("/users/create_user", params, classroomSignupSuccessful);
  classroomSignupSuccessfulPre("");
}

function submitClassroomSignupFormPost(form) {	
	//params = {};
	//$.post("/users/create_user", params, classroomSignupSuccessful);
  classroomSignupSuccessfulPost("");
}

function checkmark(label) {
	label.html(" ").addClass("checkmark");
}

function inputChanged() {
	$("input[type=submit]").attr("disabled", "");
}

function classroomSignupSuccessfulPre(response) {
  $('#classroomSignupPre').jqmHide();
  $("#classroomSignup").jqmShow();
}

function classroomSignupSuccessfulPost(response) {
  window.location = $("#new_classroom_link").attr("href");
}

function setupFeedbackForm() {
  $('#feedbackForm').validate({
    messages: {
			feedback: "Enter your feedback"
		},
		submitHandler: submitFeedbackForm,
    errorPlacement: errorPlacement
  });
}

function submitFeedbackForm() {
	$.postJSON("/feedback/submit_feedback", 
		{ feedback: $('textarea#user_feedback').val()
		});

  MODAL_SHOWN_REASON = "Submitted from Feedback Form";
  $('#feedback').jqmHide();  
	$('textarea').attr('value', '');
}

function setupRewardForm() {
  $('#rewardForm').validate({
    rules: {
      reward_email: {
			  required: true,
			  remote: "/users/available_email"
			}
    },
    messages: {
      reward_email: {
        required: "Enter your email address",
        remote: jQuery.format(ALREADY_IN_USE_MESSAGE)
      },
			reward_feedback: "Enter your feedback"
		},
		submitHandler: submitRewardForm,
    errorPlacement: errorPlacement
  });
}

function submitRewardForm() {
	$.postJSON("/users/claim_reward", 
		{ email: $('input#reward_email').val(),
		  feedback: $('textarea#reward_feedback').val(),
		  reward_id: EARNED_REWARD_ID
		});

  MODAL_SHOWN_REASON = "Claimed Reward";
  $('#reward').jqmHide();
  $(".email").val($('input#reward_email').val());
	$('textarea').attr('value', '');
}

function setupSettingsForm() {
  $('#settingsForm').validate({
    rules: {
			firstname: "required",
			lastname: "required",
			username: {
				required: true,
				remote: "/users/available_username"
			},
			password: {
				required: true
			},
			settings_email: {
			  required: false,
			  remote: "/users/available_email"
			}
		},
		messages: {
			firstname: "Enter your first name",
			lastname: "Enter your last initial",
			username: {
				required: "Enter a username",
				remote: jQuery.format(ALREADY_IN_USE_MESSAGE)
			},
			password: {
				required: "Provide a password"
			},
			settings_email: {
			  remote: jQuery.format(ALREADY_IN_USE_MESSAGE)
			}
		},
		submitHandler: submitSettingsForm,
    errorPlacement: errorPlacement		
	});
}

function submitSettingsForm() {
	params = {
	  firstname: $('input#firstname').val(),
	  lastname: $('input#lastname').val(),
	  email: $('input#settings_email').val(),
	  username: $('input#username').val(),
	  password: sha1Hash($('input#password').val())
	};
	
  $(".email").val($('#settings_email').val());

	$.postJSON("/users/save_user_settings", params, saveSettingsSuccessful);  
  trackEvent("Modal", "Settings", "Saved with Button Click", 1);	
}

function saveSettingsSuccessful() {
  USER.username = $('input#username').val();
  fullName = $('input#firstname').val() + " " + $('input#lastname').val();
  leaderboardName = $('input#firstname').val() + " " +
                    $('input#lastname').val().charAt(0) + ".";
  $(".fullName").html(fullName);
  $("#headerName").show();
  $(".userLeaderboardRow td div.name").html(leaderboardName);

  MODAL_SHOWN_REASON = "Settings Saved";
  $('#settings').jqmHide();
}

function setupSaveProgressForm() {
  $('#saveProgressForm').validate({
    rules: {
			save_progress_firstname: {
				required: true,
				remote: "/users/check_swearing"
			},
			save_progress_lastname: {
				required: true,
				remote: "/users/check_swearing"
			},
			save_progress_username: {
				required: true,
				remote: "/users/available_username"
			},
			save_progress_password: {
				required: true
			},
			save_progress_settings_email: {
			  required: false,
			  remote: "/users/available_email"
			}
		},
		messages: {
			save_progress_firstname: {
				required: "Enter your first name",
				remote: "Swearing is not allowed"
			},
			save_progress_lastname: {
				required: "Enter your last initial",
				remote: "Swearing is not allowed"
			},
			save_progress_username: {
				required: "Enter a username",
				remote: jQuery.format(ALREADY_IN_USE_MESSAGE)
			},
			save_progress_password: {
				required: "Provide a password"
			},
			save_progress_settings_email: {
			  remote: jQuery.format(ALREADY_IN_USE_MESSAGE)
			},
			agree: {
			  required: "You must agree to the above"
			}
		},
		submitHandler: submitSaveProgressForm,
    errorPlacement: errorPlacement		
	});
}

function submitSaveProgressForm() {
	params = {
	  firstname: $('input#save_progress_firstname').val(),
	  lastname: $('input#save_progress_lastname').val(),
	  email: $('input#save_progress_settings_email').val(),
	  username: $('input#save_progress_username').val(),
	  password: sha1Hash($('input#save_progress_password').val())
	};
	
  leaderboardName = $('input#save_progress_firstname').val() + " " +
                    $('input#save_progress_lastname').val().charAt(0) + ".";
  $(".userLeaderboardRow td div.name").html(leaderboardName);

  USER.firstname = $("input#save_progress_firstname").val();
  USER.lastname = $("input#save_progress_lastname").val();
  USER.username = $("input#save_progress_username").val();
  USER.password = $("input#save_progress_password").val();
  USER.email = $('#save_progress_settings_email').val();
  setupHeader();
  
	$.postJSON("/users/save_user_settings", params, saveProgressSuccessful);  
  trackEvent("Modal", "Save Progress", "Saved with Button Click", 1);
}

function saveProgressSuccessful() {
  MODAL_SHOWN_REASON = "Save Progress Submitted After Shown Due to " + MODAL_SHOWN_REASON;
  $('#saveProgress').jqmHide();
  
  if (!freeClassroomUse()) {
    if (UPSELL_OPTION_SELECTED) {
      upsellPlanSelected();
    }
    else {
      showUpsell("After User Saved Progress");        
    }    
  }
}

function setupClassroomSignupForm() {
  $('#classroomSignupForm').validate({
    rules: {
			classroom_signup_teachersname: {
				required: true
			},
			classroom_signup_teachersemail: {
				required: true
			},
			classroom_signup_classroomname: {
				required: true
			},
			classroom_signup_schoolname: {
			  required: true
			},
			classroom_signup_city: {
			  required: true
			},
			classroom_signup_state: {
			  required: true
			},
			classroom_signup_country: {
			  required: true
			}
		},
		messages: {
			classroom_signup_teachersname: {
				required: "Enter your name"
			},
			classroom_signup_teachersemail: {
				required: "Enter your email"
			},
			classroom_signup_schoolname: {
        required: "Enter the school's name"
			},
			classroom_signup_city: {
			  required: "City required"
			},
			classroom_signup_state: {
			  required: "State required"
			},
			classroom_signup_country: {
			  required: "Country required"
			}
		},
		submitHandler: submitSaveClassroomForm,
    errorPlacement: errorPlacement		
	});
}


function submitSaveClassroomForm() {
	params = {
	  teachername: $('input#classroom_signup_teachersname').val(),
	  teacheremail: $('input#classroom_signup_teachersemail').val(),
	  schoolname: $('input#classroom_signup_schoolname').val(),
    city: $('input#classroom_signup_city').val(),
    state: $('input#classroom_signup_state').val(),
    country: $('input#classroom_signup_country').val(),
    timezone: $('select#classroom_signup_timezone').val()
	};
  
	$.postJSON("/admin/classrooms/save_classroom", params, saveClassroomSuccessful);  
  trackEvent("Modal", "Save Classroom", "Saved with Button Click", 1);
}

function saveClassroomSuccessful() {
  MODAL_SHOWN_REASON = "Save Classroom Submitted After Shown Due to " + MODAL_SHOWN_REASON;
  $('#classroomSignup').jqmHide();
  $("#classroomSignupPost").jqmShow();
  //$("#new_classroom_link").attr("href", "/" + $('input#classroom_signup_classroomshortcut').val());
  //$("#new_classroom_link").text('http://www.carrotsticks.com/' + $('input#classroom_signup_classroomshortcut').val());
}

function errorPlacement(error, element) {
	if (element.is(":checkbox")) {
	  error.appendTo(element.parent().next().children()[1]);
	}
	else {
	  error.appendTo(element.next()); 
	}    
}

function setupUpsellRejectionSurveyForm() {
  $('#upsellRejectionSurveyForm').validate({
		submitHandler: submitUpsellRejectionSurveyForm
	});
}

function submitUpsellRejectionSurveyForm() {
  checkboxes = $.map($('#upsellRejectionSurveyForm input:checked'),
                     function(element) {return $(element).attr('id');}).join(",");
  
  params = {
    checkboxes: checkboxes,
    feedback: $('textarea#upsell_rejection_survey_feedback').val()
  };
	$.postJSON("/feedback/submit_upsell_rejection_survey", params);


  MODAL_SHOWN_REASON = "Survey Submitted After Shown Due to " + MODAL_SHOWN_REASON;
  $('#upsellRejectionSurvey').jqmHide();  
}
