﻿

$(document).ready(init);

function init()
{
	
	$(".emailField").data("default", "Your e-mail");
	$(".emailField").bind("keydown", waitAndCheckEmail);
	
	if (($(".emailField").val() != "") && ($(".emailField").val() != $(".emailField").data("default"))) 
	{
		$(".emailField").addClass("focused");
	}
	
	$("#signupToNewsletterButton").bind("click", subscribe);
	$(".registerButton").bind("click", subscribeCheckTwo);
	
	$(".emailField").bind("focus", emailFocus);
	$(".emailField").bind("blur", emailBlur);
	
	$("#lgn").bind("click", function() {location.href = 'intranet/login.aspx?user=92mw'; });
	
	$("#privacyButton").bind("click", function()
	{
		$("#privacyDialog").modal();	
	});
	
	$(".closeDialog").bind("click", function()
	{
		$.modal.close();	
	});
	
	$(".signupDialogClose").bind("click", function()
	{
		$("#signupDialog").fadeOut("fast");	
	});
	
	
}


function emailBlur()
{
	var email = $(this);
	if (email.val() == "")
	{
		email.val(email.data("default"));
		email.removeClass("focused");
	}
}


function emailFocus()
{
	var email = $(this);
	if (email.val() == email.data("default"))
	{
		email.val("");
		email.addClass("focused");
	}
}

function subscribeCheckTwo()
{
	
	var field = $(".emailField");
	
	CallbackProxy(field[0], checkEmail)();
	
	return field.parent().parent().hasClass("fieldOk");
}	


function subscribe()
{
	
	
	
	var field = $(".emailField");
	
	CallbackProxy(field[0], checkEmail)();
	
	if (field.parent().parent().hasClass("fieldOk"))
	{
		$("#signupToNewsletterButton").unbind("click", subscribe);
		$.getJSON("json/subscribe.aspx", {email: field.val(), command: 'register'}, CallbackProxy(this, registerHandler));
	}
	else
	{
	
	}
}	

function waitAndCheckEmail()
{
	var field = $(this);
	
	if (field.val() != field.data("default"))
	{
		field.parent().parent().removeClass("fieldError");
		field.parent().parent().addClass("fieldChecking");
		field.parent().parent().removeClass("fieldOk");
		field.parent().parent().removeClass("fieldEmailExistsError");
		
		var timeoutRef = parseInt(field.data("checkFieldTimeout"));
		clearTimeout(timeoutRef);
		timeoutRef = setTimeout(CallbackProxy(this, checkEmail), 1000);
		field.data("checkFieldTimeout", timeoutRef);
	}
	
}

function checkEmail()
{
	var field = $(this);
	var result = checkInputField(field);
	
	field.parent().parent().removeClass("fieldChecking");
	field.parent().parent().removeClass("fieldError");
	field.parent().parent().removeClass("fieldOk");
	field.parent().parent().removeClass("fieldEmailExistsError");
	
	if (result.error)
	{
		field.parent().parent().addClass("fieldError");
	}
	else
	{
		field.parent().parent().addClass("fieldOk");
		
	}

	
}

function registerHandler(response)
{
	
	$("#signupToNewsletterButton").bind("click", subscribe);

	var field = $(this);
	if (response.error)
	{
		alert("error: " + response.messageString);
		
	}
	else
	{
		$("#emailField").val($("#emailField").data("default"));
		$("#signupDialog").fadeIn("fast");
	}
}

function checkInputField(field)
{
	var ok = true;
	var message = "";
	var required = field.hasClass("required");
	var isEmail = field.hasClass("isEmail");
	var value = field.val();
	
	if (isEmail)
	{
		var emailRe = /^(?:[a-zA-Z0-9_'^&amp;/+-])+(?:\.(?:[a-zA-Z0-9_'^&/+-])+)*@(?:(?:\[?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\.){3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\]?)|(?:[a-zA-Z0-9-]+\.)+(?:[a-zA-Z]){2,}\.?)$/gi;
		ok = value.match(emailRe) != null;
		if (!ok) message = "email error";
	}
	
	if (!ok)
	{	
		
		return {error: true, message: message}; 
	}
	
	return {error: false, message: message}; 
	
}

 /**
  * Create a proxy for functions so that they run in the desired scope with all its arguments intact
  * 
  * @param {Object} scope The scope defines where the function should be run
  * @param {Object} functionRef - The actuall function
  * @param {Object} args Any additional arguments that should be passed alongside any other arguments sent by the trigger
  * @example CallbackProxy(this, this.testMe); would retrun a function that will run testMe() inside "this".
  */ 
CallbackProxy = function(scope, functionRef, args)
{
	return function()
	{
		var argsList = []
		for(var i = 0; i < arguments.length; i++)
		{
			argsList.push(arguments[i]);
		}
		if (args != null) argsList.push(args);
		functionRef.apply(scope, argsList);
	}
}