var MembersSignup = {
	passwordMinLength: 4,
	usernameMinLength: 3,
	usernameRegExp: /^([A-Za-z0-9_\-]){3,}$/,
	emailRegExp: /^[A-Za-z0-9_]([A-Za-z0-9_\-\.])*\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
	simplePasswords: ['asdasd', 'admin', 'pass', 'password', 'password1', 'password12', 'password123', '1234', '12345', 'xxxx', 'qwerty', 'asdfgh', '123456', 'abcdef', 'abc123', 'monkey', 'letmein'],
	to: null,
	call: null,
	
	$sources: {},
	$helpers: {},
	$form: null,
	
	init: function() {
		MembersSignup.$form = $('signupForm');
		MembersSignup.$form.getElements('li .aid').setStyles({visibility: 'hidden'});
		MembersSignup.$sources.username    = $('reg_username');
		MembersSignup.$sources.email       = $('reg_email');
		MembersSignup.$sources.password    = $('reg_password');
		MembersSignup.$sources.confirmPass = $('reg_password_confirm');
		$H(MembersSignup.$sources).each(function(v, k) {
			v.addClass('invalid-field');
			v.autocomplete = 'off';
			MembersSignup.$helpers[k] = $(v.parentNode).getElement('div.aid');
		});

		MembersSignup.$sources.username.addEvent('keyup', MembersSignup.usernameCheck);
		MembersSignup.$sources.password.addEvent('keyup', MembersSignup.passwordCheck);
		MembersSignup.$sources.confirmPass.addEvent('keyup', MembersSignup.confirmPassword);
		MembersSignup.$sources.email.addEvent('keyup', MembersSignup.isValidEmail);
		
		MembersSignup.$form.addEvent('submit', MembersSignup.onSubmit);
	},
	
	usernameCheck: function(e) {
		var e = new Event(e);
		var user = e.target.value;
		
		MembersSignup.stopAll();
		
		if( !user.length ) { return; }
		
		//check min length
		if( user.length < MembersSignup.usernameMinLength ) {
			return MembersSignup.show('username', 'Too short', 'fail');
		}

		if( !MembersSignup.usernameRegExp.test(user) ) {
			return MembersSignup.show('username', 'Invalid username', 'fail');
		}
		
		MembersSignup.to = setTimeout(function() {
			MembersSignup.show('username', 'Checking availability...', 'loading');
			MembersSignup.call = new XHR({ 
				method: 'get', 
				autoCancel: true,
				onSuccess: function(response) {
					response = Json.evaluate(response);
					MembersSignup.show('username', response.message, response.valid ? 'ok' : 'fail');
				}
			});
			MembersSignup.call.send('/xmlrpc/signup.php', 'q=' + user + '&action=user');

		}, 250);
	},
	
	passwordCheck: function(e) {
		var e = new Event(e);
		var pass = e.target.value;
		
		MembersSignup.hide('confirmPass');
		
		if( !pass.length ) { return; }
		
		//check min length
		if( pass.length < MembersSignup.passwordMinLength ) {
			return MembersSignup.show('password', 'Too short', 'fail');
		}

		//if username == pass -> too obvious
		if( pass == MembersSignup.$sources.username.value ) {
			return MembersSignup.show('password', 'Too easy', 'fail');
		}
		
		//check banned passwords -> too obvious/simple/easy
		if( MembersSignup.simplePasswords.contains(pass) ) {
			return MembersSignup.show('password', 'Too easy', 'fail');
		}
		
		var strength = MembersSignup.getPassStrength(pass);

		if( strength < 34 ) {
			return MembersSignup.show('password', 'Weak', 'warn');
		}
		if( strength < 50 ) {
			return MembersSignup.show('password', 'Good', 'ok');
		}
		if( strength < 75 ) {
			return MembersSignup.show('password', 'Strong', 'ok');
		}

		return MembersSignup.show('password', 'Very strong', 'ok', {color: '#088F00'});
	},
	
	confirmPassword: function(e) {
		var e = new Event(e);
		var pass = e.target.value;
		if( !pass.length ) { return; }
		
		if( MembersSignup.$sources.password.value == pass ) {
			MembersSignup.show('confirmPass', 'OK', 'ok');
		}
		else {
			MembersSignup.show('confirmPass', 'Passwords don\'t match', 'fail');
		}
	},
	
	isValidEmail: function(e) {
		var e = new Event(e);
		var email = e.target.value;
		
		MembersSignup.stopAll();
		
		if( !email.length ) { return; }
		
		if( !MembersSignup.emailRegExp.test(email) ) {
			MembersSignup.show('email', 'Should look like an email', 'fail');
			return;
		}
		
		if( MembersSignup.to ) { clearTimeout(MembersSignup.to); }
		MembersSignup.to = setTimeout(function() {
			MembersSignup.show('email', 'Checking email...', 'loading');
			MembersSignup.call = new XHR({ 
				method: 'get', 
				autoCancel: true,
				onSuccess: function(response) {
					response = Json.evaluate(response);
					MembersSignup.show('email', response.message, response.valid ? 'ok' : 'fail');
				}
			});
			MembersSignup.call.send('/xmlrpc/signup.php', 'q=' + email + '&action=email');
		}, 250);
	},
	
	show: function(obj, msg, type) {
		var imgSrc = color = '';
		switch(type) {
			case 'loading': 
				MembersSignup.$sources[obj].addClass('invalid-field');
				MembersSignup.$sources[obj].removeClass('valid-field');
				imgSrc = 'loading.gif';
				break;
			
			case 'fail':
				MembersSignup.$sources[obj].addClass('invalid-field');
				MembersSignup.$sources[obj].removeClass('valid-field');
				imgSrc = 'cancel.gif';
				color = '#fe1001';
				break;
			
			case 'ok':
				MembersSignup.$sources[obj].addClass('valid-field');
				MembersSignup.$sources[obj].removeClass('invalid-field');
				imgSrc = 'checkmark.gif';
				color = '#088F00';
				break;

			case 'warn':
				MembersSignup.$sources[obj].addClass('valid-field');
				MembersSignup.$sources[obj].removeClass('invalid-field');
				color = '#DF920D';
				imgSrc = 'error.gif';
				break;
		}
		
		MembersSignup.$helpers[obj].setStyles({visibility: 'visible', backgroundImage: imgSrc ? 'url(/img/icons/' + imgSrc + ')' : '', color: color ? color : ''});
		MembersSignup.$helpers[obj].setText(msg);
	},
	
	getPassStrength: function(pass) {
		var strength = pass.length * 4;
		strength += (MembersSignup._sameChars(1, pass).length - pass.length) * 1;
		strength += (MembersSignup._sameChars(2, pass).length - pass.length) * 1;
		strength += (MembersSignup._sameChars(3, pass).length - pass.length) * 1;
		strength += (MembersSignup._sameChars(4, pass).length - pass.length) * 1;
		
		if( pass.match(/(.*[0-9].*[0-9].*[0-9])/) ) { 
			strength += 5;
		}
		if( pass.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/) ) {
			strength += 5;
		}
		if( pass.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/) ) { 
			strength += 10;
		}
		if( pass.match(/([a-zA-Z])/) && pass.match(/([0-9])/) ) { 
			strength += 15;
		}
		if( pass.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && pass.match(/([0-9])/) ){
			strength += 15;
		}
		if( pass.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && pass.match(/([a-zA-Z])/)){
			strength += 15;
		}
		if( pass.match(/^\w+$/) || pass.match(/^\d+$/) ){
			strength -= 10;
		}

		if( strength < 0 ) { strength = 0; }
		if( strength > 100 ) { strength = 100; }
		
		return strength;
	},
	
	_sameChars: function(size, origPass) {
		var pass = "";
		for(var n = 0; n < origPass.length; n++ ) {
			var same = true;
			for( var m = 0; m < size && (m + n + size) < origPass.length; m++){
				same = same && ( origPass.charAt(m + n) == origPass.charAt(m + n + size) );
			}
			if( m < size ) {
				same = false;
			}
			if( same ) {
				n += size - 1;
				same = false;
			}
			else {
				pass += origPass.charAt(n);
			}
		}
		
		return pass;
	},
	
	hide: function(obj) {
		MembersSignup.$helpers[obj].setStyles({visibility: 'hidden', backgroundImage: '', color: ''});
		MembersSignup.$helpers[obj].setText('');
	}, 
	
	onSubmit: function(e) {
		e = new Event(e);
		e.stop();
		
		var valid = true;
		$H(MembersSignup.$sources).each(function(v, k) {
			valid = valid && v.hasClass('valid-field');
		});
		if( valid ) {
			return MembersSignup.$form.submit();
		}
		
		alert('Sign up form contains errors');
	},
	
	stopAll: function() {
		if( MembersSignup.to ) { clearTimeout(MembersSignup.to); }
		if( MembersSignup.call ) { MembersSignup.call.cancel(); }
	}
	
};

var MembersDashboard = {
	init: function() {
		$$('#mCenter ul.dashboard a.icon')
				.addEvent('mouseenter', function(e) {
					e = new Event(e);
					$($(e.target.parentNode).getElements('a')[1]).addClass('hover');
				})
				.addEvent('mouseleave', function(e) {
					e = new Event(e);
					$($(e.target.parentNode).getElements('a')[1]).removeClass('hover');
				});
	}
};

var MembersRecover = {
	passwordMinLength: 4,
	simplePasswords: ['asdasd', 'admin', 'pass', 'password', 'password1', 'password12', 'password123', '1234', '12345', 'xxxx', 'qwerty', 'asdfgh', '123456', 'abcdef', 'abc123', 'monkey', 'letmein'],
	$sources: {},
	$helpers: {},
	$form: null,
	$username: null,

	init: function() {
		MembersRecover.$form = $('signupForm');
		MembersRecover.$form.getElements('li .aid').setStyles({visibility: 'hidden'});
		MembersRecover.$sources.password    = $('rec_password');
		MembersRecover.$sources.confirmPass = $('rec_password_confirm');
		MembersRecover.$username = $('rec_username');
		$H(MembersRecover.$sources).each(function(v, k) {
			v.addClass('invalid-field');
			v.autocomplete = 'off';
			MembersRecover.$helpers[k] = $(v.parentNode).getElement('div.aid');
		});
	
		MembersRecover.$sources.password.addEvent('keyup', MembersRecover.passwordCheck);
		MembersRecover.$sources.confirmPass.addEvent('keyup', MembersRecover.confirmPassword);
		
		MembersRecover.$form.addEvent('submit', MembersRecover.onSubmit);
	},
	
	passwordCheck: function(e) {
		var e = new Event(e);
		var pass = e.target.value;
		
		MembersRecover.hide('confirmPass');
		
		if( !pass.length ) { return; }
		
		//check min length
		if( pass.length < MembersRecover.passwordMinLength ) {
			return MembersRecover.show('password', 'Too short', 'fail');
		}

		//if username == pass -> too obvious
		if( pass == MembersRecover.$username.value ) {
			return MembersRecover.show('password', 'Too easy', 'fail');
		}
		
		//check banned passwords -> too obvious/simple/easy
		if( MembersRecover.simplePasswords.contains(pass) ) {
			return MembersRecover.show('password', 'Too easy', 'fail');
		}
		
		var strength = MembersSignup.getPassStrength(pass);

		if( strength < 34 ) {
			return MembersRecover.show('password', 'Weak', 'warn');
		}
		if( strength < 50 ) {
			return MembersRecover.show('password', 'Good', 'ok');
		}
		if( strength < 75 ) {
			return MembersRecover.show('password', 'Strong', 'ok');
		}

		return MembersRecover.show('password', 'Very strong', 'ok', {color: '#088F00'});
	},
	
	confirmPassword: function(e) {
		var e = new Event(e);
		var pass = e.target.value;
		if( !pass.length ) { return; }
		
		if( MembersRecover.$sources.password.value == pass ) {
			MembersRecover.show('confirmPass', 'OK', 'ok');
		}
		else {
			MembersRecover.show('confirmPass', 'Passwords don\'t match', 'fail');
		}
	},
	
	show: function(obj, msg, type) {
		var imgSrc = color = '';
		switch(type) {
			case 'loading': 
				MembersRecover.$sources[obj].addClass('invalid-field');
				MembersRecover.$sources[obj].removeClass('valid-field');
				imgSrc = 'loading.gif';
				break;
			
			case 'fail':
				MembersRecover.$sources[obj].addClass('invalid-field');
				MembersRecover.$sources[obj].removeClass('valid-field');
				imgSrc = 'cancel.gif';
				color = '#fe1001';
				break;
			
			case 'ok':
				MembersRecover.$sources[obj].addClass('valid-field');
				MembersRecover.$sources[obj].removeClass('invalid-field');
				imgSrc = 'checkmark.gif';
				color = '#088F00';
				break;

			case 'warn':
				MembersRecover.$sources[obj].addClass('valid-field');
				MembersRecover.$sources[obj].removeClass('invalid-field');
				color = '#DF920D';
				imgSrc = 'error.gif';
				break;
		}
		
		MembersRecover.$helpers[obj].setStyles({visibility: 'visible', backgroundImage: imgSrc ? 'url(/img/icons/' + imgSrc + ')' : '', color: color ? color : ''});
		MembersRecover.$helpers[obj].setText(msg);
	},
	
	hide: function(obj) {
		MembersRecover.$helpers[obj].setStyles({visibility: 'hidden', backgroundImage: '', color: ''});
		MembersRecover.$helpers[obj].setText('');
	}, 
	
	onSubmit: function(e) {
		e = new Event(e);
		e.stop();
		
		var valid = true;
		$H(MembersRecover.$sources).each(function(v, k) {
			valid = valid && v.hasClass('valid-field');
		});
		if( valid ) {
			return MembersRecover.$form.submit();
		}
		
		alert('Sign up form contains errors');
	}
};
