// Registration page js

/**
* -------------------------------------------------------------------------------
*	Displays info and errors
*/
function ZJSoutputRegisterStatus (mode, container, msg) {
	if ($(container) == null) return false;
	// modes: error, none(default), info
	switch (mode) {
		case 'error':
			$(container).removeClass('reg_msginfo');
			$(container).addClass('reg_msgerror');
			$(container).getElement('.reg_msg').setProperty('html', msg);
			break;
		case 'info':
			$(container).removeClass('reg_msgerror');
			$(container).addClass('reg_msginfo');
			$(container).getElement('.reg_msg').setProperty('html', msg);
			break;
		default:
			$(container).removeClass('reg_msgerror');
			$(container).removeClass('reg_msginfo');
			$(container).getElement('.reg_msg').setProperty('html', '');
			break;
	}
}
/**
* -------------------------------------------------------------------------------
*	Input filter for username and password fields
*/
function ZJSfilterInput (obj, max, allowed_chars){
	if(obj.value.length > max) {
	    obj.value = obj.value.substring(0, max);
  	}
  	if (allowed_chars != "*"){
  		new_val = "";
  		for (i=0; i<obj.value.length; i++) {
    		if (allowed_chars.indexOf(obj.value.charAt(i),0) != -1) new_val+=obj.value.charAt(i);
		}
		if (obj.value!=new_val) obj.value = new_val;
  	}
}

function ZJSusernameKeyUp (field) {
	ZJSfilterInput(field, 14, ac_numb+ac_lwr+ac_upr);
	$('s').setProperty( 'disabled', 'disabled' ).addClass( 'disabled' );
	$('user_check').removeProperty( 'disabled' ).removeClass( 'disabled' );
	ZJSoutputRegisterStatus('', 'div_reg_username', '');
}
/**
* -------------------------------------------------------------------------------
*	onFocus and onBlur handlers
*/
function ZJSfocusStatusHandler (field, container, min, max) {
	var msg = '';
	if (max > 0) {
		ZJSfilterInput(field, max, '*');
		msg += min + '-' + max + ' characters. ';
	}
	msg += 'No symbols. No spaces.\n';
	ZJSoutputRegisterStatus('info', container, msg);
}

function ZJSblurStatusHandler (field, container) {
	var vObj = new Validation (field.id, field.vRules.fn, field.vRules.params);
	field.fireEvent('validate');
	mode = (vObj.result.valid) ? '' : 'error';
	ZJSoutputRegisterStatus(mode, container, vObj.result.msg);
}
/**
* -------------------------------------------------------------------------------
*	Populate the phone models <select> field
*	note: use ctype!=TYPE_GAME to fetch "normal" non-game phones
*/
function ZJSgetPhoneModels (brand_id, is_games, select_id, selected_phone_id) {
	target_select_id = select_id;
	user_phone_id = selected_phone_id;
	var parameters = "?ctype="+(is_games?"3":"4")+"&brand="+brand_id;
	makeRequest('/ajax/ajax-get-phones.php'+parameters, ZJSgetPhoneModelsCallback);
}

function ZJSgetPhoneModelsCallback () {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			var json = eval('(' + http_request.responseText + ')');

			if( $chk($('registerfrm')) ){
				var brandname = $('r_phone_brand').options[$('r_phone_brand').selectedIndex].text;
				if (brandname.toLowerCase() == 'nokia') {
					$('registerfrm').getElement('.phoneimg').removeClass('generic');
					$('registerfrm').getElement('.phoneimg').addClass('nokia');
				} else {
					$('registerfrm').getElement('.phoneimg').removeClass('nokia');
					$('registerfrm').getElement('.phoneimg').addClass('generic');
				}
			}
			selbox_models = $(target_select_id);
			var phones = new Array();
			if (json != '') {
				phones = json.slice();
			}
			selbox_models.options.length = 0;
			var option = new Element( 'option' ).setProperties( { 'value' : '', 'html' : 'Select model'} ).inject( selbox_models );
			phones.each( ( function ( el ) {
				var option = new Element( 'option' ).setProperties( { 'value' : el.id, 'html' : el.model, 'selected' : ($chk(user_phone_id) && el.id == user_phone_id)} ).inject( selbox_models );
			} ).bind( this ) );
		}
	}
}
/**
* -------------------------------------------------------------------------------
*	Check the email field against the db
*/
function ZJSajaxCheckEmail (email) {
	var parameters = "email="+escape(email);
	makePOSTRequest('/ajax/ajax-register.php', parameters, ZJSajaxCheckEmailCallback);
}

function ZJSajaxCheckEmailCallback () {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			var json = eval('(' + http_request.responseText + ')');
			if (json.result == false) {
				ZJSoutputRegisterStatus('error', 'reg_div_email', json.msg);
			}
		}
	}
}
/**
* -------------------------------------------------------------------------------
*	Validation
*/
// associate the field ids with the functions and parameters for validation
var validRules = [	{"id":"r_username",		"fn":"checkUsername",		"params":",5,14"},
					{"id":"r_g_male",		"fn":"checkRadio",			"params":",'Specify your gender.'"},
					{"id":"r_g_female",		"fn":"checkRadio",			"params":",'Specify your gender.'"},
					{"id":"r_mail_1",		"fn":"checkEmail",			"params":""},
					{"id":"r_birth_month",	"fn":"checkDOB",			"params":""},
					{"id":"r_birth_day",	"fn":"checkDOB",			"params":""},
					{"id":"r_birth_year",	"fn":"checkDOB",			"params":""},
					{"id":"r_country",		"fn":"checkSelectValue",	"params":",0,'Specify your country.'"},
					{"id":"r_password",		"fn":"checkPassword",		"params":",null,4,15"},
					{"id":"r_password_2",	"fn":"checkPassword",		"params":",$('r_password'),4,15"},
					{"id":"r_phone_brand",	"fn":"checkSelectValue",	"params":",0,'Specify your phone brand.'"},
					{"id":"r_phone_model",	"fn":"checkSelectValue",	"params":",0,'Specify your phone model.'"},
					{"id":"r_no_phonemodel","fn":"checkCheckbox",		"params":",'Specify your phone model.'"},
					{"id":"r_tos_id",		"fn":"checkCheckbox",		"params":",''"}
				 ];


// assign the rules to their respective fields (for individual calls - e.i. onblur)
function ZJSassignRules () {
	var vLen = validRules.length;
	for (y=0; y<vLen; y++) {
		$(validRules[y].id).vRules = validRules[y];
	}
}

var Validation = new Class ({

	initialize: function (field, event, params) {
		this.result = {"msg":"", "valid":true};
		add_event = eval('this.'+event+'($(field)'+params+')');
		$(field).addEvents( {
			'validate': function () { add_event }
		} );
	},

	checkUsername: function (field, min, max) {
		var val = field.value;
		if (val == "") return this.result = {"msg":"Specify a username.","valid":false};

		if ( (val.length < min) || (val.length > max) || (!isValid(val,ac_lwr+ac_numb+ac_upr)) ) {
			this.result = {"msg":"Use "+min+"-"+max+" characters. No symbols. No spaces.","valid":false};
		}
		return this.result;
	},

	checkEmail: function (field) {
		var val = field.value;
		var emailFilter=/^.+@.+\..{2,4}$/;

		if (val == "") {
			this.result = {"msg":"Specify your e-mail address.", "valid":false};
		} else if (!emailFilter.test(val)) {
			this.result = {"msg":"Please enter a valid e-mail address.", "valid":false};
		} else {
			var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]\ ]/
			if (val.match(illegalChars)) {
				this.result = {"msg":"The e-mail address contains illegal characters.", "valid":false};
	 		}
		}
		if (this.result.valid && $('s').getProperty('disabled') == false) {
			ZJSajaxCheckEmail(val);
		} else {
			return this.result;
		}
	},

	checkDOB: function (field) {
		var is_date =  true;
		var parent = field.getParent();
		parent.getChildren().each( function(el) {
			if (el.value == 0) {
				is_date = false;
			}
		});

		if ( !(is_date) ) {
			this.result = {"msg":"Specify your date of birth.","valid":false};
		}
		else if ( ! zjsIsValidDate(parent.childNodes[3].value, parent.childNodes[1].value, parent.childNodes[2].value)) {
			this.result = {"msg":"Enter a valid date.","valid":false};
		}
		else if ( 16 > zjsGetAge(parent.childNodes[3].value, parent.childNodes[1].value, parent.childNodes[2].value) ) {
			this.result = {"msg":"You have to be 16 or over to register."};
		}
		return this.result;
	},

	checkPassword: function (field, field2, min, max) {
		var val1 = field.value;
		var val2 = null;
		if (field2 != null) {
			val2 = field2.value;
		}

		if (val1 == "" && val2 == null) return this.result = {"msg":"Specify your password.","valid":false};

		if ( (val2 != null && val1 != val2) || (val2 == '' && val1 == '') ) {
			return this.result = {"msg":"Match the password to the one above.","valid":false};
		}

		if ((val1.length < min) || (val1.length > max) || (!isValid(val1,ac_lwr+ac_numb)) ) {
			return this.result = {"msg":"Use "+min+"-"+max+" characters. No symbols, spaces, or caps.","valid":false};
		}
	},

	checkRadio: function (field, custom_msg) {
		var is_checked = false;
		if (field.checked) {
			is_checked = true;
		} else {
			var parent = field.getParent();
			parent.getChildren().each( function(el) {
				if (el.name == field.name && el.checked) {
					is_checked = true;
				}
			});
		}
		if ( !(is_checked) ) {
			this.result = {"msg":custom_msg,"valid":false};
		}
		return this.result;
	},

	checkSelectValue: function (field, errVal, custom_msg) {
		var val = field.value;
		if (val == errVal) {
			this.result = {"msg":custom_msg,"valid":false};
		}
		// TO-DO: more elegant handling for phone model checkbox
		// NOTE: no need to handle, phone is deprecated in this scope
		if ((field.id == 'r_phone_brand' || field.id == 'r_phone_model') && $('r_no_phonemodel').getProperty('checked')) {
			return this.result = {"msg":'',"valid":true};
		}
		return this.result;
	},

	checkCheckbox: function (field, custom_msg) {
		var is_checked = false;
		if (field.checked) {
			is_checked = true;
		}
		if (field.id == 'r_no_phonemodel') {  // TO-DO: more elegant handling for phone model checkbox
			if (!is_checked) {
				$('r_phone_brand').removeProperty( 'disabled' );
				$('r_phone_model').removeProperty( 'disabled' );
				if ($('r_phone_model').value > 0) {
					return this.result = {"msg":"","valid":true};
				}
			} else {
				$('r_phone_brand').setProperty( 'disabled', 'disabled' );
				$('r_phone_model').setProperty( 'disabled', 'disabled' );
				ZJSoutputRegisterStatus('','reg_div_phonebrand','');
				is_checked = true;
			}
		}
		if ( !(is_checked) ) {
			this.result = {"msg":custom_msg,"valid":false};
		}
		return this.result;
	}

});



/**
* -------------------------------------------------------------------------------
*	Check the whole registration form
*/
function ZJScheckRegisterForm() {
	$('s').setProperty( 'disabled', 'disabled' ).addClass( 'disabled' );
	var return_val = true;
	var vLen = validRules.length;
	for (n=0; n<vLen; n++) {
		vObj = new Validation (validRules[n].id, validRules[n].fn, validRules[n].params);
		$(validRules[n].id).fireEvent('validate');
		var container = $(validRules[n].id).getParent().getParent();
		mode =  '';
		if (vObj.result.valid == false) {
			mode = 'error';
			return_val = false;
		}
		ZJSoutputRegisterStatus(mode, container.id, vObj.result.msg);
	}
	if ( !(return_val) ) {
		$('reg_div_notify').setProperty('html', '<div class="notify_error">Hey... some information is missing. Please make corrections as noted below.</div>');
		ZJSscrollWindow($('reg_div_notify'));
		$('s').removeProperty( 'disabled' ).removeClass( 'disabled' );
	}

	return return_val;
}

function ZJScheckRegisterFormPartner() {
	$('s').setProperty( 'disabled', 'disabled' ).addClass( 'disabled' );
	var return_val = true;
	var vLen = validRulesPartner.length;
	for (n=0; n<vLen; n++) {
		vObj = new Validation (validRulesPartner[n].id, validRulesPartner[n].fn, validRulesPartner[n].params);
		$(validRulesPartner[n].id).fireEvent('validate');
		var container = $(validRulesPartner[n].id).getParent().getParent();
		mode =  '';
		if (vObj.result.valid == false) {
			mode = 'error';
			return_val = false;
		}
		ZJSoutputRegisterStatus(mode, container.id, vObj.result.msg);
	}
	if ( !(return_val) ) {
		$('reg_div_notify').setProperty('html', '<div class="notify_error">Hey... some information is missing. Please make corrections as noted below.</div>');
		ZJSscrollWindow($('reg_div_notify'));
		$('s').removeProperty( 'disabled' ).removeClass( 'disabled' );
	}

	return return_val;
}

/**
* -------------------------------------------------------------------------------
*	Username functions
*/
var zjsPrevUsername = '';

function ZJSselectUsername (val) {
	$('r_username').value = val;
	$('user_check').setProperty( 'disabled', 'disabled' ).addClass( 'disabled' );
	$('s').removeProperty( 'disabled' ).removeClass( 'disabled' );
	ZJSoutputRegisterStatus('info', 'div_reg_username', 'Now submit your username.');
}

function ZJSajaxCheckUsername (){
	var u = trim($('r_username').value);

	/* Only check if username is valid length and different */
	if ((u.length < 15 && u.length > 4 ) && (zjsPrevUsername != u)){
		var parameters = "username="+encodeURIComponent(u);
		zjsPrevUsername = u;
 		response = makePOSTRequest('/ajax/ajax-register.php', parameters, ZJSajaxCheckUsernameCallback);
	} else if (u.length > 14 || u.length < 5) {
		ZJSoutputRegisterStatus('error', 'div_reg_username', 'Use 5-14 characters. No symbols. No spaces.');
	} else if (zjsPrevUsername == u) {
		ZJSoutputRegisterStatus('error', 'div_reg_username', 'Specify a different username.');
	}
}

function ZJSajaxCheckUsernameCallback() {
	if (http_request.readyState == 4) {
		if (http_request.status == 200){

			var json = eval('(' + http_request.responseText + ')');

			if(json.result == true){
				// invalid username
				ZJSoutputRegisterStatus('error', 'div_reg_username', '<strong>'+json.username+'</strong> is unavailable.');
				for ( m=0, l=0; l<3; m++ ){
					if (json.data[m] == undefined) {
						continue;
					} else {
						$('reg_suggest_'+l).setProperty('html', '<a class="ident" href="javascript:void(0);" onclick="ZJSselectUsername(\''+json.data[m]+'\');">' + json.data[m] + '</a>');
						l++;
					}
				}
				$('s').setProperty( 'disabled', 'disabled' ).addClass( 'disabled' );
			} else {
				// valid username, give feedback on the success! :)
				ZJSoutputRegisterStatus('info', 'div_reg_username', '<strong>'+json.username+'</strong> is available.');
				$('s').removeProperty( 'disabled' ).removeClass( 'disabled' );
				$('user_check').setProperty( 'disabled', 'disabled' ).addClass( 'disabled' );
			}
		}
	}
}
