var ps = window["ps"] || {};

ps.utils = {	
	affStatusMsg:function( msg, dst, style){	
		/*if ( typeof dst=="string" )
			dst = document.getElementById( dst );*/		
		if( !dst )
			return false;
		style = style || "ok";	
		if(style=="ok")
			msg = "<span style=\"background-color:#009900;font-weight:bold;color:#ffffff; padding:2px 5px 2px 5px;\"> "+msg+" </span>";
		else
			msg = "<span style=\"background-color:#ff0000;font-weight:bold;color:#ffffff; padding:2px 5px 2px 5px;\"> "+msg+" </span>";
		
		document.getElementById(dst).innerHTML = msg;
		window.setTimeout('document.getElementById("'+dst+'").innerHTML = ""', 3000);
	}
};

ps.questionForm = {
		
	inputPrefix:"r",
	cbInputPrefix:"cb",
	nbReponses:9,
	errors:[],
	clicksOrder:{},
	numClicks:1,
	useDoubleForm:false,
	showOrderFormOnCbClick:false,
	inputItems:false,
	bSortReponses:true,
	
	init:function(){
		this.clicksOrder = {};
		this.numClicks = 1;
		
		if( this.useDoubleForm ){
			if( document.getElementById("form_choose") )
				document.getElementById("form_choose").style.display="";		
			document.getElementById("form_order").style.display="none";
		}
	},
		
	validate:function(){
		var reps=[];
		this.errors=[];
		var valuesFound={};
		for(var i=1, len=this.nbReponses; i<=len; ++i){
			var elem = document.getElementById( this.inputPrefix+i );
			if( !elem ){
				errors.push("Mauvaise structure. Element "+( this.inputPrefix+i )+" non trouv&eacute; ");
				return false;
			}
			var value = elem.value;
			if(value=="")
				continue;
			
			if( isNaN( value ) ){
				this.errors.push( "Format de la r&eacute;ponse "+i+" incorrect ("+value+")" );
				return false;
			}			
			else if( value <= 0 || value > 4){
				this.errors.push( "Valeur incorrect pour la r&eacute;ponse "+i+". Les choix doivent etre num&eacute;rot&eacute;s de 1 &agrave; 4 " );
				return false;
			}
			valuesFound[ value ] = valuesFound[ value ] || 0;
			valuesFound[ value ]++;
		}
		
		var values = [];
		for( var val in valuesFound ){	
			if( valuesFound[val] > 1){
				this.errors.push( "Valeur "+val+" renseign&eacute;e plusieurs fois " );
				return false;
			}
			values.push( val );
		}			
		if( values.length==0 ){
			this.errors.push( "Aucune r&eacute;ponse renseign&eacute;e " );
			return false;
		}		
		if( values.length > 4 ){
			this.errors.push( "Vous devez saisir au plus 4 choix" );
			return false;
		}
		values.sort();
		//pas utiles
		for( var i=0, len=values.length; i < len; ++i ){
			if( values[i] != i+1 ){
				this.errors.push( "Ordre erron&eacute; pour la valeur "+values[i] );
				return false;
			}
		}		
		return true;
	},

	getErrors:function(){
		return this.errors;
	},
	
	getErrorStr:function(){
		var str = "";
		for( var i=0, len=this.errors.length; i<len; ++i){
			str += this.errors[i]+"\n";
		}		
		return str;		
	},
	
	populate:function( hashReponses ){
		this.errors=[];
		var res = true;
		for( var numRep in hashReponses ){
			var fieldName = this.inputPrefix+numRep;
			if( document.getElementById( fieldName ) ){				
				document.getElementById( fieldName ).value="";
				document.getElementById( "reponse_item_label_"+numRep ).innerHTML = hashReponses[ numRep ];	
				//si utilise les checkbox
				if( this.useDoubleForm && document.getElementById( "cb_reponse_item_label_"+numRep ) )
					document.getElementById( "cb_reponse_item_label_"+numRep ).innerHTML = hashReponses[ numRep ];
			}
			else{
				this.errors.push("Champ "+fieldName+" non preacute;sent");
				return false;				
			}
		}
		return res;
	},
	
	razInputs:function(){
		for(var i=1; i <= this.nbReponses; ++i ){
			var fieldName = this.inputPrefix+i;
			if( document.getElementById( fieldName ) ){
				document.getElementById( fieldName ).value = "";				
			}
		}
	},
	
	razCbInputs:function(){
		for(var i=1; i <= this.nbReponses; ++i ){
			var fieldName = this.cbInputPrefix+i;
			if( document.getElementById( fieldName ) ){
				document.getElementById( fieldName ).checked=false;				
			}
		}
	},
	
	getValues:function(){
		var hash = {};
		for(var i=1; i <= this.nbReponses; ++i ){
			var fieldName = this.inputPrefix+i;
			if( document.getElementById( fieldName ) ){
				hash[ fieldName ] = document.getElementById( fieldName ).value;				
			}
		}		
		return hash;
	},
	
	getValuesStr:function(){
		var hash = this.getValues();
		var str="";
		for(var k in hash ){
			str+="&"+k+"="+hash[k];			
		}
		return str;
	},
	
	resetInputs:function(){
		this.razInputs();
		jQuery("#form_order").hide();
		jQuery("#form_order .reponse_item").hide();
	},
	
	//si double form
	cbItemClickHandler:function( event ){		
		var target = event.target || event.srcElement;
		
		var nb = 0;	
		for(var i=1; i <= this.nbReponses; ++i ){		
			var fieldName = this.cbInputPrefix+i;
			if( document.getElementById( fieldName ) && document.getElementById( fieldName ).checked ){				
				nb++;
			}
		}
		if( nb > 4){
			jAlert("Vous devez cocher entre 1 et 4 propositions");
			if (event.preventDefault) { 
				event.preventDefault(); 
			} 
			event.returnValue = false;
			return;
		}
		
		//garde les noeuds dom des items de reponse avant tri, utile pour retrier apres
		//les noeuds vont etre sortis du dom pour etre reinjectés apres tri
		if( !this.inputItems ){
			var hashItems = {};						
			for(var i=1; i <= this.nbReponses; ++i ){
				var fieldName = "reponse_item_"+i;
				if( document.getElementById( fieldName ) ){					
					hashItems[ i ] = document.getElementById( fieldName );	
				}
			}
			this.inputItems = hashItems;
		}

		//a chaque selection de checkbox, ça incremente le numClick pour garder une notion d'ordre de click
		//stock ordre de click pour chaque reponse		
		var checked = target.checked;
		var numRep = target.value;	
		if( checked ){
			this.clicksOrder[ numRep ] = this.numClicks++;			
		}
		else{
			if( this.clicksOrder[ numRep ]  )
				this.clicksOrder[ numRep ] = 0;
		}
				
		this.razInputs();		
		jQuery("#form_order .reponse_item").hide();	
		
		//tri des nums de clicks et reaffecte l'ordre de selection des elements cliqués, 
		//ex on a cliqué rep 9,4,3, on a this.clicksOrder={9:1, 4:2, 3:3} et on declique rep 4, on a {9:1, 4:0, 3:3}, on veut {9:1, 3:2}
		var clickNumbers = [];
		for( var num in this.clicksOrder ){
			if( this.clicksOrder[num] > 0 )				
				clickNumbers.push( {"numRep":num, "order":this.clicksOrder[num] } );
		}
		clickNumbers.sort( function(a, b){ return a["order"]-b["order"]; } );				
		//reaffecte num de clicks de 1 à nb elems cliqués -> part de 1 et supprime les trous
		for( var i=0; i < clickNumbers.length; ++i){			
			this.clicksOrder[ clickNumbers[i]["numRep"] ] = (i+1);
		}
		
		var hashOrderParRep={};		
		var nbInputsToShow = 0;		
		//index des cb cliquées
		//on pourrait utiliser this.clicksOrder plutot, mais bon ...
		//trim des .reponse_item du dom pour affichage
		var arrItems=[];
		for(var i=1; i <= this.nbReponses; ++i ){			
			var arrItem = {"numRep":i, "order":0};			
			var fieldName = this.cbInputPrefix+i;
			if( document.getElementById( fieldName ) && document.getElementById( fieldName ).checked ){
				hashOrderParRep[ i ] = this.clicksOrder[ i ];				
				arrItem[ "order" ] = this.clicksOrder[ i ];
				nbInputsToShow++;
			}
			arrItems.push( arrItem );
		}
		//on a les nums de reponse triés par ordre
		arrItems.sort( function(a, b){ return a["order"]-b["order"]; } );
				
		if( nbInputsToShow > 0){			
					
			if( this.bSortReponses ){
				//si on veut retrier pour affichier les reponses en fonction de l'ordre
				jQuery("#reponse_items").empty();
				for(var i=0; i < arrItems.length; ++i){				
					var numRep = arrItems[i]["numRep"];
					var order = arrItems[i]["order"];
					var elem = this.inputItems[ numRep ];
					document.getElementById("reponse_items").appendChild( elem );
					if( order > 0 ){
						//alert(this.inputPrefix+numRep+" - "+order);
						elem.style.display='';	
						if( nbInputsToShow == 1)
							document.getElementById( this.inputPrefix+numRep ).value = order;
						else
							document.getElementById( this.inputPrefix+numRep ).value = "";
					}					
				}
			}
			else{			
				//affiche les items checkés
				for(var num in hashOrderParRep ){
					var elemName = "reponse_item_"+num;
					var elem = document.getElementById( elemName );
					if( elem ){
						elem.style.display='';					
						document.getElementById( this.inputPrefix+num ).value = hashOrderParRep[num];
					}
				}
			}
			
			if( this.showOrderFormOnCbClick )
				jQuery("#form_order").show();
		}
		else{
			jQuery("#form_order").hide();
		}
	},	
	
	validateChooseForm:function(){		
		this.errors=[];		
		var nbInputs = 0;
		var hash = {};
		for(var i=1; i <= this.nbReponses; ++i ){		
			var fieldName = this.cbInputPrefix+i;
			if( document.getElementById( fieldName ) && document.getElementById( fieldName ).checked ){
				hash[ i ] = true;			
				nbInputs++;
			}			
		}		
		if( nbInputs > 0 && nbInputs <= 4 ){			
			return nbInputs;
		}
		else{
			this.errors.push("Vous devez cocher entre 1 et 4 propositions ");
			return false;
		}		
	}
		
};

ps.questionSubForm = {
		
	errors:[],
	inputName:"subq",
	
	validate:function( theForm ){	
		this.errors=[];
		var items = theForm.elements[ this.inputName ];		
		for (var i=0, len=items.length; i<len; i++){
		  if (items[i].checked )
			 return true;		  
		}
		this.errors.push("Aucun item selectionn&eacute;");
		return false;
	},
	
	getErrors:function(){
		return this.errors;
	},
	
	getErrorStr:function(){
		var str = "";
		for( var i=0, len=this.errors.length; i<len; ++i){
			str += this.errors[i]+"\n";
		}		
		return str;		
	}
};


