var sign_in_hover = false;
var sign_in_active = false;

var popup_timer = { 'email':null, 'password':null, 'username':null, 'submit':null };

var popup_hover = { 'email':false, 'password':false, 'username':false, 'submit':false };
var popup_active = { 'email':false, 'password':false, 'username':false, 'submit':false };

var popup_shown = { 'email':false, 'password':false, 'username':false, 'submit':false };

var popup_msg = { 'email':'', 'password':'', 'username':'', 'submit':'' };

var popups = ['email', 'password', 'username', 'submit'];

var signup_fields = ['email', 'password', 'username'];

var signup_valid = { 'email':false, 'password':false, 'username':false };

var key_timer;

var world;
var scroll_speed = 83;       // Speed in milliseconds
var step = 1;               // How many pixels to move per step
var current = 0;            // The current pixel row
var image_width = 1028;      // Background image height

//The pixel row where to start a new loop
var restart_position = image_width - 1;

$(document).ready( function() {

	world = $('#world');

	if ( ! ( (navigator.platform.indexOf("iPhone") != -1) || (navigator.platform.indexOf("iPod") != -1) ) ) {
		//Calls the scrolling function repeatedly
		var init = setInterval( 'world_day_rotation()', scroll_speed );
	}
	
	$('.border').fadeTo(0, 0.75);
	
	$('#signin_persistent').customInput();
	
	$('#sign-in').hover(
		function () {
			sign_in_hover = true;
			show_sign_in();
		}, 
		function () {
			sign_in_hover = false;
			delay_hide_sign_in()
		}
	);
	
	$('#sign-in input').focus(function () {
		cancel_delay();
		sign_in_active = true;
		show_sign_in();
	});
	
	$('#sign-in input').focusout(function () {
		sign_in_active = false;
		delay_hide_sign_in();
	});
	
	$('#sign-up form').submit( function () {
		if ( validate_signup() ) {
			return true;
		} else {
			return false;
		}
	} );
	
	$('#signup_submit').parent().hover(
		function () {
//			console.log('submit hovered');
			popup_hover['submit'] = true;
			validate_signup();
		}, 
		function () {
			popup_hover['submit'] = false;
//			console.log('submit unhovered');
			hide_popup('submit');
		}
	);
	
	$.each( signup_fields, function ( i, val ) {
		$('#signup_'+val).keyup( function () {
			if ( key_timer ) {
				clearTimeout( key_timer );
				key_timer = null;
			}
			
			if ( $('#signup_'+val).val() == '' ) {
				validate( val );
			} else {
				key_timer = setTimeout( function() { validate( val ); } , 1000 );
			}
		});
	
		
		$('#signup_'+val).focus( function () {
			popup_active[val] = true;
			validate( val );
		});
		
		$('#signup_'+val).focusout( function () {
			popup_active[val] = false;
			validate( val );
		});
		
		$('#signup_'+val).parent().hover(
			function () {
//				console.log(val+' hovered');
				popup_hover[val] = true;
				validate( val );
			}, 
			function () {
//				console.log(val+' unhovered');
				popup_hover[val] = false;
				validate( val );
			}
		);
	} );
});

function world_day_rotation()
{
	//Go to next pixel row.
	current += step;
	
	//If at the end of the image, then go to the top.
	if ( current == restart_position ) {
		current = 0;
	}
	
	//Set the CSS of the header.
	world.css( 'background-position', current + 'px' + ' 0' );
}

function delay_hide_sign_in()
{
	var elem = $('#sign-in');
	$.data(elem, 'timer', setTimeout(function() { hide_sign_in(); }, 1000));
}

function cancel_delay()
{
	clearTimeout($('#sign-in').stop().data('timer'));
}

function hide_sign_in()
{
	if ( ! sign_in_active && ! sign_in_hover ) {
	
		$('.border').fadeTo("slow", 0.75);
		$('#extra').fadeOut('slow');
	}
}

function show_sign_in()
{
	$('.border').fadeTo('fast', 1);
	$('#extra').fadeIn('fast');
}


function show_popup( input, msg )
{
//	console.log('showing '+input);
	$('.feedback-popup.'+input+' p').html( msg );
	
	if ( popup_timer[input] ) {
		clearTimeout( popup_timer[input] );
		popup_timer[input] = null;
	}
	
	if ( ! popup_shown[input] ) {
//		console.log('actually showing '+input);
		popup = $('.feedback-popup.'+input);
		
		popup.css('top', 50);
		popup.css('display', 'block');
		popup.stop().animate( {
				opacity: 1.0,
				top: '+=20'
			}, 200, function() {
			// animation finished
		});
	}
	popup_shown[input] = true;
}


function hide_popup( input )
{
//	console.log('hiding '+input);
	if ( popup_timer[input] ) {
		clearTimeout( popup_timer[input] );
		popup_timer[input] = null;
	}

	popup_timer[input] = setTimeout( function () { hide( input ); } , 300 );
}

function hide( input ) {
//	console.log('after timeout hiding '+input);
	popup_shown[input] = false;
	popup = $('.feedback-popup.'+input);
	
	popup.stop().animate( {
			opacity: 0.0,
			top: '+=20'
		}, 200, function() {
		$('.feedback-popup.'+input).css('display', 'none');
		$('.feedback-popup.'+input+' p').html( '' );
	});
}


function validate_email( email )
{
	var email_reg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
	
	valid = email_reg.test( email );
	
	if ( ! valid ) {
		popup_msg['email'] = 'Not a valid email address';
	} else {
		// TODO: check email already used
	}
	
	return valid;
}

function validate_password( password )
{	
	var valid = validatePassword( password, {
		length:   [8, Infinity],
		lower:    1,
		upper:    0,
		numeric:  1,
		special:  0,
		badWords: ["password"],
		badSequenceLength: 4
	});
	
	if ( ! valid ) {
		popup_msg['password'] = 'Must be at least 8 characters and contain 1 number';
	}
	
	return valid;
}

function validate_username( username )
{	
	username_reg = /[a-zA-Z0-9_]{1,15}/;

	valid = username_reg.test( username );
	
	if ( ! valid ) {
		popup_msg['username'] = 'Must be 1 to 15 characters (letters, numbers, underscores)';
	}
	
	return valid;
}

function validate( input )
{
	var function_name = 'validate_' + input;
	var input_val = $('#signup_'+input).val();
	
	signup_valid[input] = false;

	if ( input_val == '' ) {
	
		hide_popup( input );
		$('#signup_'+input).removeClass('invalid');
		$('#signup_'+input).removeClass('valid');
		
	} else if ( ! window[function_name](input_val) ) {
	
		if ( popup_hover[input] || popup_active[input] ) {
			show_popup( input, popup_msg[input] );
		} else {
			hide_popup( input );
		}
		
		$('#signup_'+input).removeClass('valid');
		$('#signup_'+input).addClass('invalid');
	} else {
		signup_valid[input] = true;
		hide_popup( input );
		$('#signup_'+input).removeClass('invalid');
		$('#signup_'+input).addClass('valid');
	}
}


function validate_signup()
{
	var valid = true;
	var empty = false;
	
	$.each( signup_fields, function ( i, val ) {
		validate( val );
		
		if ( ! signup_valid[val] ) {
			valid = false;
		}
		
		if ( $('#signup_'+val).val() == '' ) {
			empty = true;
		}
	} );
	
	var msg = 'Some fields are incorrect';
	
	if ( empty ) {
		msg = 'Some fields are empty';
	}
	
	if ( ! valid && popup_hover['submit'] ) {
		show_popup( 'submit', msg );
	}
	
	return valid;
}


/*
	Password Validator 0.1
	(c) 2007 Steven Levithan <stevenlevithan.com>
	MIT License
*/

function validatePassword (pw, options) {
	// default options (allows any password)
	var o = {
		lower:    0,
		upper:    0,
		alpha:    0, /* lower + upper */
		numeric:  0,
		special:  0,
		length:   [0, Infinity],
		custom:   [ /* regexes and/or functions */ ],
		badWords: [],
		badSequenceLength: 0,
		noQwertySequences: false,
		noSequential:      false
	};

	for (var property in options)
		o[property] = options[property];

	var	re = {
			lower:   /[a-z]/g,
			upper:   /[A-Z]/g,
			alpha:   /[A-Z]/gi,
			numeric: /[0-9]/g,
			special: /[\W_]/g
		},
		rule, i;

	// enforce min/max length
	if (pw.length < o.length[0] || pw.length > o.length[1])
		return false;

	// enforce lower/upper/alpha/numeric/special rules
	for (rule in re) {
		if ((pw.match(re[rule]) || []).length < o[rule])
			return false;
	}

	// enforce word ban (case insensitive)
	for (i = 0; i < o.badWords.length; i++) {
		if (pw.toLowerCase().indexOf(o.badWords[i].toLowerCase()) > -1)
			return false;
	}

	// enforce the no sequential, identical characters rule
	if (o.noSequential && /([\S\s])\1/.test(pw))
		return false;

	// enforce alphanumeric/qwerty sequence ban rules
	if (o.badSequenceLength) {
		var	lower   = "abcdefghijklmnopqrstuvwxyz",
			upper   = lower.toUpperCase(),
			numbers = "0123456789",
			qwerty  = "qwertyuiopasdfghjklzxcvbnm",
			start   = o.badSequenceLength - 1,
			seq     = "_" + pw.slice(0, start);
		for (i = start; i < pw.length; i++) {
			seq = seq.slice(1) + pw.charAt(i);
			if (
				lower.indexOf(seq)   > -1 ||
				upper.indexOf(seq)   > -1 ||
				numbers.indexOf(seq) > -1 ||
				(o.noQwertySequences && qwerty.indexOf(seq) > -1)
			) {
				return false;
			}
		}
	}

	// enforce custom regex/function rules
	for (i = 0; i < o.custom.length; i++) {
		rule = o.custom[i];
		if (rule instanceof RegExp) {
			if (!rule.test(pw))
				return false;
		} else if (rule instanceof Function) {
			if (!rule(pw))
				return false;
		}
	}

	// great success!
	return true;
}
