var baseURL = '/unison/signup2/';

deferredClassNameChangeTimeout = null;
var deferredFields = new Array();
var deferredNewClassNames = new Array();
var trialCreationRequest = null;
var usernameValidationMode = null;
var usernameValidationRequest = null;
var usernameValidationTimeout = null;


function clearError(fieldName)
{
	var field = getElement(fieldName);
	var className = field.className;

	className = className.replace(/ error$/, '');
	field.className = className;
}


function createHTTPRequest()
{
	// Browser-agnostic XMLHTTPRequest creator

	var request = null;
	
	if ( window.XMLHttpRequest ) 
	{ 
		// Mozilla, Safari, ...
		
		request = new XMLHttpRequest();
		
		if ( request.overrideMimeType ) 
		{
			// set type accordingly to anticipated content type
			
			//request.overrideMimeType('text/xml');
			request.overrideMimeType('text/html');
		}
	} 
	else if ( window.ActiveXObject ) 
	{ 
		// IE
		
		try 
		{
			request = new ActiveXObject('Msxml2.XMLHTTP');
		} 
		catch ( e ) 
		{
			try 
			{
				request = new ActiveXObject('Microsoft.XMLHTTP');
			} 
			catch ( e ) 
			{
			}
		}
	}

	return request;
}


function deferredClassNameChange()
{
	while ( deferredFields.length > 0 )
	{
		deferredField = deferredFields.shift();
		deferredNewClassName = deferredNewClassNames.shift();

		deferredField.className = deferredNewClassName;
	}

	deferredClassNameChangeTimeout = null;
}


function doDeferredClassNameChange(field, newClassName)
{
	if ( deferredClassNameChangeTimeout != null )
		clearTimeout(deferredClassNameChangeTimeout);

	deferredFields.push(field);
	deferredNewClassNames.push(newClassName);
	
	deferredClassNameChangeTimeout = setTimeout('deferredClassNameChange()', 0);
}


function focusElementById(focusId)
{
	// Attempt to place keyboard focus on the given element ID
	
	var field = getElement(focusId);

	if ( field != null )
		field.focus();
}


function getElement(elementID)
{
	// Browser-agnostic getElementById()
	
	var field = document.getElementById(elementID);
	
	return field;
}


function gotTrialCreationStateChange()
{
	// Check for HTTP request completion
	
	if ( trialCreationRequest.readyState != 4 )
	{
		// Not done yet
		return;
	}
		
	if ( trialCreationRequest.status == 200 )
	{
		// Got a success (200) HTTP response

		console.log(trialCreationRequest.responseText);

		clearError('ua_preview-username');
		clearError('ua_trial_signup-password');
		clearError('ua_trial_signup-email');

		var result = trialCreationRequest.responseText.split(':');

		var success = false;

		if ( result[0] == 'OK' )
		{
			success = true;
			showFinished();
		}	
		else if ( result[0] == 'USERNAME ERROR' )
		{	
			setError('ua_preview-username');
			focusElementById('ua_preview-username');
		}	
		else if ( result[0] == 'PASSWORD ERROR' )
		{
			setError('ua_trial_signup-password');
			focusElementById('ua_trial_signup-password');
		}		
		else if ( result[0] == 'EMAIL ERROR' )
		{
			setError('ua_trial_signup-email');
			focusElementById('ua_trial_signup-email');
		}
		
		if ( result[1] )
			alert(result[1]);
			
		if (!success)
		{
			// re-enable form submitting since it failed
			button = document.getElementById('ua_preview-submit');
			button.disabled = '';
		}
	}
	else
	{
		// Got an HTTP error
		
		alert(trialCreationRequest.responseText);
	}
	
	// Clear the request to allow another to be sent
	
	trialCreationRequest = null;
}


function gotUsernameValidationStateChange()
{
	// Check for HTTP request completion
	
	if ( usernameValidationRequest.readyState != 4 )
	{
		// Not done yet
		return;
	}
		
	var valid = false;
	var resultField = getElement('ua_' + usernameValidationMode + '-username-check');
	
	if ( usernameValidationRequest.status == 200 )
	{
		// Got a success (200) HTTP response
		
		if ( usernameValidationRequest.responseText == '1' )
			resultField.className = 'available';

		else if ( usernameValidationRequest.responseText == '0' )
			resultField.className = 'unavailable';

		else
		{
			resultField.className = 'hidden';
			alert('Unable to check username availability:\n\n[200] - [' + usernameValidationRequest.responseText + ']');
		}
	}
	else
	{
		// Got an HTTP error
		
		resultField.className = 'hidden';
		alert('Unable to check username availability:\n\n[200] - [' + usernameValidationRequest.responseText + ']');
	}
	
	// Clear the request to allow another to be sent
	
	usernameValidationRequest = null;
}


function initForm(mode)
{
	focusElementById('ua_' + mode + '-username');

	window.clearTimeout(usernameValidationTimeout);
	usernameValidationTimeout = null;
	
	var resultField = getElement('ua_' + mode + '-username-check');
	
	if ( resultField != null )
		resultField.className = 'hidden';
}


function previewSubmit(mac)
{
	if (document.getElementById('preview-terms').checked)
	{
		var emailField = getElement('ua_trial_signup-email');
		var passwordField = getElement('ua_trial_signup-password');
		var usernameField = getElement('ua_preview-username');
		
		var email = emailField.value;
		var password = passwordField.value;
		var username = usernameField.value;
	
		clearError('ua_preview-username');
		clearError('ua_trial_signup-password');
		clearError('ua_trial_signup-email');
	
		if ( username == '' )
		{
			setError('ua_preview-username');
			focusElementById('ua_preview-username');
			return;
		}
		
		if ( password == '' )
		{
			setError('ua_trial_signup-password');
			focusElementById('ua_trial_signup-password');
			return;
		}
	
		if ( email == '' )
		{
			setError('ua_trial_signup-email');
			focusElementById('ua_trial_signup-email');
			return;
		}
			
		trialCreationRequest = createHTTPRequest();
		
		if ( trialCreationRequest == null ) 
		{
			alert('Can\'t create HTTP request');
			return;
		}
		
		url = baseURL + 'lib/create-trial.php';
	
		parameters = 'email=' + encodeURIComponent(email) + '&username=' + encodeURIComponent(username) + '&password=' + encodeURIComponent(password) + '&mac=' + encodeURIComponent(mac);
		
		trialCreationRequest.onreadystatechange = gotTrialCreationStateChange;
		trialCreationRequest.open('POST', url, true);
		trialCreationRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
	
		trialCreationRequest.send(parameters);
		
		// prevent double-submitting
		button = document.getElementById('ua_preview-submit');
		button.disabled = 'disabled';
	}
}

function sendUsernameValidationRequest(username) 
{	
	// Given a username, urlencode it and send to validation script
	
	usernameValidationRequest = createHTTPRequest();
	
	if ( usernameValidationRequest == null ) 
	{
		alert('Can\'t create HTTP request');
		return;
	}
	
	url = baseURL + 'lib/validateusername.php';

	parameters = 'username=' + encodeURIComponent(username);
	
	usernameValidationRequest.onreadystatechange = gotUsernameValidationStateChange;
	usernameValidationRequest.open('POST', url, true);
	usernameValidationRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

	usernameValidationRequest.send(parameters);
}


function setError(fieldName)
{
	var field = getElement(fieldName);
	
	var className = field.className;
	className = className.replace(/ error$/, '');
	className += ' error';
	
	doDeferredClassNameChange(field, className);
}


function signupSubmit()
{
	if (document.getElementById('signup-terms').checked)
	{
		return true;
	}
	else
	{
		return false;
	}
}


function startUsernameValidationTimeout(mode)
{
	usernameValidationMode = mode;
	
	// Called on keypress, starts a timer which will validate the username when fired
	
	if ( usernameValidationTimeout != null )
	{
		// Clear any previously pending timeout
		
		window.clearTimeout(usernameValidationTimeout);
		usernameValidationTimeout = null;
	}
	
	// Clear status field

	var resultField = getElement('ua_' + usernameValidationMode + '-username-check');
	
	if ( resultField != null )
		resultField.className = 'hidden';
	
	// Set the timeout
	
	usernameValidationTimeout = window.setTimeout('validateUsername()', 1000);
}


function validateUsername()
{
	// Clear any pending username validation timeout
	
	window.clearTimeout(usernameValidationTimeout);
	usernameValidationTimeout = null;

	// If a request is already in progress, don't send another

	if ( usernameValidationRequest != null )
		return;
		
	// Notify user that validation is in progress

	var resultField = getElement('ua_' + usernameValidationMode + '-username-check');

	if ( resultField != null )
	{
		resultField.className = 'checking';
			
		// Send the validation request
			
		var usernameField = getElement('ua_' + usernameValidationMode + '-username');
		var username = usernameField.value;
		
		sendUsernameValidationRequest(username);
	}
	else
	{
		console.log("Can't find username form field:" + 'ua_' + usernameValidationMode + '-username-check');
	}
}

function termsChange(formType)
{
	var checkbox = document.getElementById(formType + '-terms');
	var button = document.getElementById('ua_' + formType + '-submit');
	if (!checkbox.checked)
	{
		button.className = 'indented medium';
		button.disabled = 'disabled';
	}
	else
	{	
		button.className = 'indented medium default';
		button.disabled = '';
	}
}

