/*
 * 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');
	
	//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 loginRegexp = /[^\-a-z0-9_]+/gi;
	
	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;
	var ajaxReponse = false;
	
	/*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 false;
		}
		if(L < 2 && data != ''){//Longueur min.
			userUrl.text(defaultUserUrl);
			msgshow(loginfield,'.error','Trop court');
			return false;//'Trop court';
		}
		// TODO Tester le bon fonctionnement
		if(data.match(loginRegexp)){//alphaNumeric
			userUrl.text(defaultUserUrl);
			msgshow(loginfield,'.error','Incorrect');
			return false;//'Incorrect';
		}
		
		$.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(loginfield.val());
					msgshow(loginfield,'.good',false);
				}
				if(rep == 0){//Non-dispo
					userUrl.text(defaultUserUrl);
					msgshow(loginfield,'.error',"Pseudonyme n'est plus disponnible");
				}
			},
			complete:function(){
				clearTimeout($.data(loginfield, "timer"));
			}
		});
		return true;
	};
	
	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;
		}
		
		
		$.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',"Adresse e-mail existe déjà");
				}
			},
			complete:function(){
				clearTimeout($.data(mailfield, "timer"));
			}
		});
		
		
		msgshow(mailfield,'.good',false);
		
		var tabData = data.split('\u0040');
		var loginRef = tabData[0];
		loginRef = loginRef.replace(new RegExp("[_.]", "gi"), '-'); 
		loginfield.val(loginRef);
		
		//var rep = loginverif(loginRef);
		if(!loginverif(loginRef)){
			//loginfield.val("");
			msgshow(loginfield,'.info',false);
		}
		// TODO Request AJAX avail
		
		return null;
	};
	
	var formVerif = function(){
		var valid = true;
		$.each(formValidator, function(i, val){
			if(val == 0){ valid = false; }
		});
		if(valid == true){
			
		} else {
			
		}
	};
	
	/*
	 * 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 votre identifiant');
		}
		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);
	});
	
	// Birthday
	birthfield.focus(function(){ fieldfocus(birthfield); });
	
	birthfield.blur(function(){ fieldblur(birthfield); });
	
	birthfield.keyup(function(){
		var birthval = $(this).val();
		msghide($(this), true);
		birthverif(birthval);
	});
	
	/*fnamefield.focus();*/
});