/*
 * SignUp Validator reworld.com
 */
// TODO Régler les styles (focus/blur)
$(document).ready(function(){
	/*
	 * Déclarations
	 */
	var formValidator = { fnamefield:0, loginfield:0, passfield:0, mailfield:0 };
	//var bannedKey = [17, 59, 106, 107, 111, 188, 190, 191, 192, 219, 220, 221, 226];
	//var bannedChar = ['é','~','\'','{','(','[','|','è','`','\\','ç','^','à','@',')',']','°',];
	var loadImg = '<img src="/img/spinner.gif" style="vertical-align:middle;" />';
	
	var sForm = $('#signup_form_spe');
	
	var prenamefield = sForm.find('#UserUserPrenom');
	var prenameRegexp = /[^a-z0-9\u00C0-\u1FFE\u2E80-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF'\.\s\-_]/gi;
	
	var fnamefield = sForm.find('#UserUserNom');
	//var fnameRegexp = new RegExp("[^a-z0-9\.\-_]+","gi");
	var fnameRegexp = /[^a-z0-9\u00C0-\u1FFE\u2E80-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF'\.\s\-_]/gi;
	
	var loginfield = sForm.find('#UserUserLogin');
	var loginBanKey = [32];
	//var loginRegexp = /[-_a-zA-Z0-9]/;
	var loginRegexp = new RegExp("[^\-a-z0-9_ ]+", "gi");//alphaNumeric inverse
	
	var userUrl = sForm.find('#user_url span');
	var defaultUserUrl = userUrl.text();
	
	var passfield = sForm.find('#UserUPass');
	var passRegexp = /[^\-a-z0-9_]+/gi;/*new RegExp("[a-zA-Z0-9\-_]{4,100}","gi");*/
	
	var mailfield = sForm.find('#UserUserEmail');
	var emailRegexp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2,4})+$/;
	
	var birthfield = sForm.find('#UserUserBirth');
	var birthRegexp = /^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/;
	
	var mytimer;
	
	/*fnamefield.val(''); loginfield.val(''); passfield.val(''); mailfield.val('');*/
	
	/*
	 * Fonctions
	 */
	
	//Renvoi le type de message qui est affiché (class: info, good, error)
	var msgType = function(elem){
		var msgCol = elem.parents('tr:eq(0)').find('td.valid');
		//TODO Need finish
		alert(msgCol.find('div:visible').val());
		/*$.each(msgCol.children('div'), function(i, val){
			alert();
		});*/
		
	};
	
	var msghide = function(elem, goodone){
		var msgCol = elem.parents('tr:eq(0)').find('td.valid'); 
		msgCol.find('.error').empty().hide();
		msgCol.find('.info').hide();
		if(goodone){
			/*elem.removeAttr('class');
			elem.addClass('round');*/
			msgCol.find('.good').hide();
		}
	};
	
	var msgshow = function(elem,type,msg){
		msghide(elem, true);
		var msgCol = elem.parents('tr:eq(0)').find('td.valid');
		if(msg){
			msgCol.find(type).html(msg);//JSON msg d'erreur
		}
		msgCol.find(type).show();
	};
	
	var fieldfocus = function(elem){
		elem.css({'background-color' : '#FAFAFA', 'border-color' : '#AAAAAA'});
		//elem.removeClass('round');
		elem.removeAttr('class');
		//elem.addClass('round_left');
		var fval = elem.val();
		if(fval == ''){
			msghide(elem, true);
			msgshow(elem,'.info',false);
		} /*else {
			//Validation
			msgshow(elem,'.info',false);
		}*/
	};
	
	var fieldblur = function(elem, req){
		var fval = elem.val();
		elem.removeAttr('style');
		if(fval == '' && req === true){
			msghide(elem, true);
			msgshow(elem,'.error','Champ requis');
		} 
		if(fval == ''){
			msghide(elem, false);
			elem.removeAttr('class');
		}
		//elem.addClass('round');
	};
	
	//TODO Lors du focus sur un champs, mettre un timer qui à chaque x secondes controle la valeur du champs
	//	Check changement par liste de suggestion FF (ex: email)
	var fieldtimer = function(elem, thefct){
		
		console.log($.isFunction(thefct));
		//msghide(elem, true);
		
		//msgshow(elem,'.info',false);
		mytimer = setTimeout(function(){			
			fieldtimer(elem);
		}, 2000);
		console.log('started');
		//$.data(this, "timer", ctrltimer);
	};

	/*
	 * Vérifications
	 */
	/*var fnameverif = function(data){
		var L = data.length;
		if(data == ''){
			msgshow(fnamefield,'.info',false);
			return null;
		}
		if(data.match(fnameRegexp)){
			msgshow(fnamefield,'.error','Incorrect');
			return null;
		} else {
			msgshow(fnamefield,'.good',false);
			return null;
		}		
	};*/
	
	var loginverif = function(data){
		//Non-vide
		//Sans espace
		var L = data.length;
		/*alert('DATA:'+data+' - L: '+L);*/
		if(data == '' || L == 0){
			msgshow(loginfield,'.info',false);
			return null;
		}
		if(L < 2 && data != ''){//Longueur min.
			userUrl.text(defaultUserUrl);
			msgshow(loginfield,'.error','Trop court');
			return null;//'Trop court';
		}
		if(data.match(loginRegexp)){//alphaNumeric
			userUrl.text(defaultUserUrl);
			msgshow(loginfield,'.error','Incorrect');
			return null;//'Incorrect';
		}
		var reponse = true;
		$.ajax({
			type: 'post',
			url: '/users/availablelogin',
			cache: false,
			dataType: 'text',
			data: {'data[login]':data},
			async: true,
			beforeSend:function(){
				msghide(loginfield, true);
				msgshow(loginfield,'.info',loadImg+' check...');
				userUrl.text('...');
			},
			success:function(rep, textStatus){
				msghide(loginfield, true);
				if(rep == 1){//Dispo
					userUrl.text(data.replace(' ', '-'));
				//	userUrl.text(loginfield.val());
					msgshow(loginfield,'.good',false);
				}
				if(rep == 0){//Non-dispo
					userUrl.text(defaultUserUrl);
					msgshow(loginfield,'.error',"Ce nom n'est plus disponible");
				}
			},
			complete:function(){
				clearTimeout($.data(loginfield, "timer"));
			}
		});
		return null;
	};
	
	var passverif = function(data){
		var L = data.length;
		if(data == ''){
			msgshow(passfield,'.info',false);
			return null;
		}
		if(L < 4){
			msgshow(passfield,'.error','Trop court');
			return null;
		}
		if(data.match(passRegexp)){
			msgshow(passfield,'.error','Incorrect');
			return null;
		}
		msgshow(passfield,'.good',false);
		return null;
	};
	/*
	var mailverif = function(data){
		var L = data.length;
		if(data == ''){
			msgshow(mailfield,'.info',false);return null;
		}
		if(!data.match(emailRegexp)){
			msgshow(mailfield,'.error','Entrez un e-mail valide');return null;
		}
		msgshow(mailfield,'.good',false);return null;
	};*/
	var mailverif = function(data){
		var L = data.length;
		if(data == ''){
			msgshow(mailfield,'.info',false);return null;
		}
		if(!data.match(emailRegexp)){
			msgshow(mailfield,'.error','Entrez un e-mail valide');return null;
		}
		
		
		$.ajax({
			type: 'post',
			url: '/users/availableemail',
			cache: false,
			dataType: 'text',
			data: {'data[email]':data},
			async: true,
			beforeSend:function(){
				msghide(mailfield, true);
				msgshow(mailfield,'.info',loadImg+' check...');
				userUrl.text('...');
			},
			success:function(rep, textStatus){
				msghide(mailfield, true);
				if(rep == 1){//Dispo
					msgshow(mailfield,'.good',false);
				}
				if(rep == 0){//Non-dispo
					msgshow(mailfield,'.error',"Addresse e-mail existe déjà");
				}
			},
			complete:function(){
				clearTimeout($.data(mailfield, "timer"));
			}
		});
		
		
		msgshow(mailfield,'.good',false);
		
		return null;
	};
	var formVerif = function(){
		var valid = true;
		$.each(formValidator, function(i, val){
			if(val == 0){ valid = false; }
		});
		if(valid == true){
			
		} else {
			
		}
	};
	
	var fnameverif = function(){
		var loginRef = $("#UserUserNom").val().toLowerCase();
		loginRef = loginRef.replace(new RegExp("[^a-zA-Z0-9_\.\-]", "gi"), '-'); 		
		loginfield.val(loginRef);
	};	
	
	/*
	 * Events
	 */
	// Full Name
	/*fnamefield.focus(function(){
		fieldfocus(fnamefield);
		
		//TODO Gérer les msg (hide/show) en fonction de la valeur
	});
	fnamefield.blur(function(){
		fieldblur(fnamefield);
		//TODO Gérer les msg (hide/show) en fonction de la valeur
	});
	fnamefield.keyup(function(event){
		//var a = event.which;
		//var b = String.fromCharCode(a);
		//if(a != 8 || a != 13){alert('KeyCode: '+event.keyCode+' => a: '+a+' => b: '+b);}
		var fnameval = $(this).val();
		msghide($(this), true);
		fnameverif(fnameval);
		//A bannir : 106, 111, 107, 219, 59, 221, 220, 192,191,190,188, 226, 17
		//Combinaison à bannir: 50
	});*/
	
	// Login
	loginfield.focus(function(){
		fieldfocus(loginfield);
		//TODO Gérer les msg (hide/show) en fonction de la valeur
	});
	loginfield.blur(function(){
		fieldblur(loginfield, true);
		//TODO Gérer les msg (hide/show) en fonction de la valeur
	});

	loginfield.keyup(function(event){
		clearTimeout($.data(this, "timer"));//Clear du timer
		var loginval = $(this).val();
		if(loginval.length == 0){
			msghide($(this), true);
			msgshow(loginfield,'.info','Entrez un pseudo unique sur ReWorld');
		}
		var wait = setTimeout(function(){
			msghide(loginfield, true);
			loginverif(loginval);
		}, 200);
		$.data(this, "timer", wait);
	});
	
	// Password
	passfield.focus(function(){
		fieldfocus(passfield);
	});
	passfield.blur(function(){
		fieldblur(passfield, true);
	});
	passfield.keyup(function(event){
		var passval = $(this).val();
		msghide($(this), true);
		passverif(passval);
	});
	
	// Mail
	mailfield.focus(function(){
		fieldfocus(mailfield);
		
		//TESTING :
		//fieldtimer(mailfield, mailverif);
		//$.data(mailfield, "timer", ctrltimer);
	});
	mailfield.blur(function(){
		fieldblur(mailfield);
		
		//TESTING :
		clearTimeout(mytimer);
		console.log('timer cleared');
		//clearTimeout($.data(mailfield, "timer"));
	});
	mailfield.keyup(function(){
		var mailval = $(this).val();
		msghide($(this), true);
		mailverif(mailval);
	});
	fnamefield.keyup(function(){
		var fnameval = $(this).val();
		fnameverif(fnameval);
	});	
	
	// Birthday
	birthfield.focus(function(){ fieldfocus(birthfield); });
	
	birthfield.blur(function(){ fieldblur(birthfield); });
	
	birthfield.keyup(function(){
		var birthval = $(this).val();
		msghide($(this), true);
		birthverif(birthval);
	});
	
	inputChange();
	
	$("#user_cp").change(function() {
		var myname = $(this).attr('name');
		myname = myname.substring(11);
		var strLength = myname.length - 1;
		myname = myname.substr(0, strLength);
		var myval = $(this).val();
		var nbPts = parseInt($('#val-nb-points').html());
		if(myname != ''){
			$.ajax({
				type: 'post',
				url: '/users/getcity',
				cache: false,
				dataType: 'text',
				data: {'data[name]':myname,'data[val]':myval},
				async: true,
				beforeSend:function(){ },
				success:function(rep, textStatus){				      
					if(rep.length>0) {
						$('#champs_villes').html(rep);
					}
					else {
						$('#champs_villes').html("<input type='text' name='data[User][user_ville]'>");
						inputChange();
					}
				      
				},
				complete:function(){
				}
			});
		}
	});	
	
	//fnamefield.focus();
	
});//Fin document ready

function inputChange(){
	// Check des points obtenu
	$("input, select, textarea").change(function() {
		var myname = $(this).attr('name').split('[')[2];
		var strLength = myname.length - 1;
		myname = myname.substr(0, strLength);
		var myval = $(this).val();
		var nbPts = parseInt($('#val-nb-points').html());
		if(myname != ''){
			//getpointforfield
			$.ajax({
				type: 'post',
				url: '/users/printpoint',
				cache: false,
				dataType: 'text',
				data: {'data[name]':myname,'data[val]':myval},
				async: true,
				beforeSend:function(){ },
				success:function(rep, textStatus){
					if(rep >= 1 || rep < 0){//Dispo
						var gainPts = parseInt(rep);
						/*nbPts = nbPts + gainPts;
						if(nbPts < 0)
							nbPts = 0;
						$('#val-nb-points').html(nbPts);*/
						$('#val-nb-points').html(gainPts);
						$.ajax({
							type: 'post',
							url: '/users/getprogressbar',
							cache: false,
							dataType: 'text',
							data: {'data[name]':myname,'data[val]':myval},
							async: true,
							beforeSend:function(){ },
							success:function(rep, textStatus){
								$('#progressbar').progressbar('option', 'value', rep);
							},
							complete:function(){ }
						});						
					}
				},
				complete:function(){
				}
			});
		}
	});
}
