/***************************************
 * Fonctions de gestion de l'affichage *
 * du formulaire de recherche avancée  *
 ***************************************/

// Utilitaire pour afficher/cache une boîte
function boxShow(box, visible) {
	if (visible)
		box.show();
	else
		box.hide();
}

function updateBoxes() {
	boxShow($('boxDocuRevues'), $('requete.checkDocuRevues').checked);
	boxShow($('boxDocuJuris'), $('requete.checkDocuJuris').checked);
}

// Gestion de l'affichage des boîtes de recherche avancées
// pour la jurisprudence et les revues
function manageDocuForms(checkbox) {
	switch (checkbox) {
		case 'juris':
		case 'revues':
			if ($('requete.checkDocuRevues').checked && $('requete.checkDocuJuris').checked) 
				$('requete.checkDocuAll').checked = 'checked';
			else
				$('requete.checkDocuAll').checked = '';
			break;
			
		case 'all':
			$('requete.checkDocuRevues').checked = $('requete.checkDocuAll').checked;
			$('requete.checkDocuJuris').checked = $('requete.checkDocuAll').checked;
			break;
		
		default:
	}
	updateBoxes();
}

// Remise à zéro intelligente du formulaire
function resetForm() {
	document.forms.rechAv.reset();
	resetFormAdvanc() ;
	manageDocuForms();
	updateRevueDetails();
	for (var level = 2; level <= 3; level++) {
		updateJuris(level, 3);
		$('requete.selJurisL' + level)
			.setValue(defaultJuris[level]);
	}
}
 
function resetFormAdvanc() {
	var myForm = document.forms.rechAv;
	if (!$('requete.checkDocuAll').checked) {
		$('requete.checkDocuAll').click();
	}	
	$('requete.textField1').value="Vos mots clés";
	$('requete.textField2').value="Vos mots clés";
	$('requete.textField3').value="Vos mots clés";
	$('requete.textField4').value="Vos mots clés";

	$('requete.proxiTopLeft').value="";
	$('requete.proxiBotLeft').value="";
	$('requete.condTopLeft').value = "ET";	
	$('requete.condBotLeft').value = "ET";	
	$('requete.condRight').value = "ET";		
	$('requete.selRevue').value = "";	
	$('requete.selJurisL1').value = "";
	$('requete.selJurisL2').value = "";
	$('requete.selJurisL3').value = "";
	
	$('requete.revueDateFrom').value="";
	$('requete.revueDateTo').value="";
	$('requete.jurisDateFrom').value="";
	$('requete.jurisDateTo').value="";
	
	$('requete.proxiTopLeft').value="";
	$('requete.proxiBotLeft').value="";
	$('requete.revueNumero').value="";
	$('requete.revueArticleId').value="";
	$('requete.revuePage').value="";
	$('requete.revueAuteurPrenom').value="";
	$('requete.revueAuteurNom').value="";
	$('requete.jurisDecision').value="";
	
	manageDocuForms();
	updateRevueDetails();
	for (var level = 2; level <= 3; level++) {
		updateJuris(level, 3);
		$('requete.selJurisL' + level)
			.setValue(defaultJuris[level]);
	}
}

function demandeInformation(form) {
    var url = form.action;
    var target = 'contactReponse';
    var myAjax = new Ajax.Updater(
        target,
        url,
        {method: 'post',parameters:{contactNom:$('contactNom').value, 
                                    contactTelephone:$('contactTelephone').value,
                                    contactEmail:$('contactEmail').value,
                                    contactNote:$('contactNote').value}});
    $('demandeInformation').reset();
    return false;
}

function stress(field) {
	field.style.background = '#ffffcc';
}

function unstress(field) {
	field.style.background = '';
}

function prepareSubmitFiltre(isRevue) {
	var cd = new Array();
	var errorField = null;
	var myForm = document.forms.revueDateFilter;
	if(isRevue){
		cd.push($('filtre.revueDateFrom'));
		cd.push($('filtre.revueDateTo'));
	}else{
		cd.push($('filtre.jurisDateFrom'));
		cd.push($('filtre.jurisDateTo'));
		myForm = document.forms.jurisDateFilter;
	}
	for (var i = 0; i < cd.length; i++) {
		cleanField(cd[i]);
		if (cd[i].value != '' && !checkDate(cd[i])) {
			stress(cd[i]);
			if (errorField == null) {
				errorField = cd[i];
				errorMessage = "Le format de la date utilisé est invalide, veuillez entrer une date au format: jj/mm/aaaa";
			}
		}
	}
	// Si il y a eu une erreur, on affiche le message
	if (errorField != null) {
		modalWarn('Erreur de saisie', errorMessage, 'Erreur sur la saisie du formulaire');
		if (errorField != true)
			errorField.focus();
		return false;
	} else {
		myForm.submit();
		return true;
	}
}
// Préparation de l'envoi des données
// et refuser un formulaire vide mais qui cherche dans tous les fonds
// TODO: ne pas vérifier les champs cachés
function prepareSubmit() {
	var errorField = null;
	var errorMessage = null; 

	// Check des fonds
	if (!$('requete.checkDocuRevues').checked 
		&& !$('requete.checkDocuJuris').checked) {
		errorField = true;
		errorMessage = "Vous devez sélectionner au moins un fond pour votre recherche.";
	}
	
	var requeteAllFunds = ($('requete.checkDocuRevues').checked && $('requete.checkDocuJuris').checked);
	
	// Check de la recherche FullText
	var emptyFields = 0;
	for (var i = 1; i <= 4; i++) {
		var textField = $('requete.textField' + i);
		nullContentIfDefault(textField); 
		cleanField(textField);
		if (textField.value == '')
			emptyFields++;
	}
	
	var requeteFulltext = (emptyFields < 4);
	
	var cp = Array(
			$('requete.proxiTopLeft'),
			$('requete.proxiBotLeft')
			);
	for (var i = 0; i < cp.length; i++) {
		cleanField(cp[i]);
		if (cp[i].value != '' && !checkNumber(cp[i])) {
			stress(cp[i]);
			if (errorField == null) {
				errorField = cp[i];
				errorMessage = "Le format de la proximité est invalide, veuillez entrer un nombre.";
			}
		}
	}

	// Sélection des champs date à traiter
	// et traitements spécifiques
	var cd = new Array();
	var countRevues = 0;

	if ($('requete.checkDocuRevues').checked) {
		// Traitement des champs revues
		// Check de la sélection des revues
		for (var i = 0; i < $('requete.selRevue').length; i++)
			if ($('requete.selRevue').item(i).selected)
				countRevues++;
		if (countRevues == 0) {
			stress($('requete.selRevue'));
			if (errorField == null) {
				errorField = $('requete.selRevue');
				errorMessage = "La recherche doit porter sur au moins une revue.";
			}
		} else {
			unstress($('requete.selRevue'));
		}
		
		cd.push($('requete.revueDateFrom'));
		cd.push($('requete.revueDateTo'));
	}
	if ($('requete.checkDocuJuris').checked) {
		// Traitement des champs jurisprudence
		var countJuris = 0;
		for (var i = 0; i < $('requete.selJurisL1').length; i++)
			if ($('requete.selJurisL1').item(i).selected)
				countJuris++;
		if (countJuris == 0) {
			stress($('requete.selJurisL1'));
			if (errorField == null) {
				errorField = $('requete.selJurisL1');
				errorMessage = "La recherche doit porter sur au moins une juridiction de premier niveau.";
			}
		} else {
			unstress($('requete.selJurisL1'));
		}

		cd.push($('requete.jurisDateFrom'));
		cd.push($('requete.jurisDateTo'));
	};
	
	// Check des formats des dates
	for (var i = 0; i < cd.length; i++) {
		nullContentIfDefault(cd[i]);
		cleanField(cd[i]);
		if (cd[i].value != '' && !checkDate(cd[i])) {
			stress(cd[i]);
			if (errorField == null) {
				errorField = cd[i];
				errorMessage = "Le format de la date utilisé est invalide, veuillez entrer une date au format: jj/mm/aaaa";
			}
		}
	}
	
	// On cherche à savoir quels sont les encarts renseignés
	var requeteRevueCriteria = 
		($('requete.revueNumero').value != '')
		|| ($('requete.revueArticleId').value != '')
		|| ($('requete.revuePage').value != '')
		|| ($('requete.revueDateFrom').value != '')
		|| ($('requete.revueDateTo').value != '')
		|| ($('requete.revueAuteurNom').value != '')
		|| ($('requete.revueAuteurPrenom').value != '')
		|| (countRevues > 1)
		|| ((countRevues == 1) && ($('requete.selRevue').value != ''));
	var requeteJurisCriteria = 
		($('requete.revueNumero').value != '')
		|| ($('requete.revueArticleId').value != '')
		|| ($('requete.revuePage').value != '')
		|| ($('requete.revueDateFrom').value != '')
		|| ($('requete.revueDateTo').value != '')
		|| ($('requete.revueAuteurNom').value != '')
		|| ($('requete.revueAuteurPrenom').value != '')
		|| ($('requete.selJurisL1').value != '');
	
	if (requeteAllFunds && !requeteFulltext) {
		if (!requeteRevueCriteria && !requeteJurisCriteria) {
			if (errorField == null) {
				errorField = true;
				errorMessage = "Vous devez sélectionner au moins un critère.";
			}
		}
		if (requeteRevueCriteria && !requeteJurisCriteria) {
			$('requete.checkDocuJuris').checked = '';
			updateBoxes();
		}
		if (!requeteRevueCriteria && requeteJurisCriteria) {
			$('requete.checkDocuRevue').checked = '';
			updateBoxes();
		}
	}
			
	
	// Si il y a eu une erreur, on affiche le message
	if (errorField != null) {
		modalWarn('Erreur de saisie', errorMessage, 'Erreur sur la saisie du formulaire');
		if (errorField != true)
			errorField.focus();
		return false;
	} else {
		return true;
	}
}

function checkNumber(field) {
	var a = field.value.match(/^\d+$/);
	return (a != null);
}
function checkDate2(field) {
	var a = field.value.match(/^(\d+)\/(\d+)\/(\d+)$/);
	if (a == null) return false;
	if ((a[2] < 1900 || a[2] > 9999) && (a[2] < 00 || a[2] > 99))
		return false;
	if (a[1] < 1 || a[2] > 12)
		return false;
	if (a[0] < 1 || a[0] > 31)
		return false;
	return true;
}
function checkDate( field ) {
	strValue = field.value;
 // var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
  var objRegExp = /^\d{1,2}(\/)\d{1,2}\1\d{4}$/;
  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else{
    var strSeparator = strValue.substring(2,3); 
    var arrayDate = strValue.split(strSeparator); 
    //create a lookup for months not equal to Feb.
    var arrayLookup = { '01' : 31,'03' : 31, 
                        '04' : 30,'05' : 31,
                        '06' : 30,'07' : 31,
                        '08' : 31,'09' : 30,
                        '10' : 31,'11' : 30,'12' : 31};
    var intDay = parseInt(arrayDate[0],10); 

    //check if month value and day value agree
    if(arrayLookup[arrayDate[1]] != null) {
      if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0)
        return true; //found in lookup table, good date
    }
    
    //check for February (bugfix 20050322)
    //bugfix  for parseInt kevin
    //bugfix  biss year  O.Jp Voutat
    var intMonth = parseInt(arrayDate[1],10);
    if (intMonth == 2) { 
       var intYear = parseInt(arrayDate[2]);
       if (intDay > 0 && intDay < 29) {
           return true;
       }
       else if (intDay == 29) {
         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
             (intYear % 400 == 0)) {
              // year div by 4 and ((not div by 100) or div by 400) ->ok
             return true;
         }   
       }
    }
  }  
  return false; //any other values, bad date
}


function cleanField(field) {
	unstress(field);
	field.value =
		field.value.replace(/^\s+|\s+$/g, '');
}

// Gestion de l'affichage de la sélection par revue/article/page
// si on n'a qu'une seule revue de sélectionnée
function updateRevueDetails() {	
	var selRevue = $('requete.selRevue');
	var selValue = '';
	var count = 0;
	for (i = 0; i < selRevue.length; i++) {
		if (selRevue.item(i).selected) {
			count++;
			selValue = selRevue.item(i).value;
		}
	}
	if (count == 1) {
		if (selValue != '') {
		    $('revueDetails').show();
			if (CONF_REVUES_WITH_ID.indexOf(',' + selValue + ',') > -1) {
			    $('revueIdArticleLabel').show();
			    $('revueIdArticleValue').show();
			} else {
			    $('revueIdArticleLabel').hide();
			    $('revueIdArticleValue').hide();
			}
		} else
			$('revueDetails').hide();
	} else {
		$('revueDetails').hide();
	}
}

// Données de l'arbre des jurisprudences
var dataJuris = new Array();
// Données par défaut des niveaux >= 2 de l'arbre
var defaultJuris = new Array();
// Texte
var textJuris = new Array();
// Default
var allJuris = 'Toutes les juridictions';

function setAllJuris(s) {
	allJuris = s;
}

// Ajouter un objet dans l'arbre des jurisprudences
function addJuris(level, k, v, lib) {
	if (dataJuris[level] == null)
		dataJuris[level] = new Array();
	if (dataJuris[level][k] == null)
		dataJuris[level][k] = new Array();
	dataJuris[level][k].push(v);
	textJuris[v] = lib;
}

// Régler la juridiction par défaut pour un level donné
// (utilisé pour le "reset" du formulaire)
function setDefaultJuris(level, k) {
	defaultJuris[level] = k;
}

// Mise à jour d'un niveau de jurisprudence
function updateJuris(level, max) {
	if (level > max) return;
	
	for (var i = level; i <= max; i++) {
		$('requete.selJurisL' + i).hide();
		$('arrowJurisL' + i).hide();
	}
	
	var selJuris = $('requete.selJurisL' + level);
	var selJurisParent = $('requete.selJurisL' + (level - 1));
	var arrowJuris = $('arrowJurisL' + level);
	selJuris.length = 0;

	var sel = selJurisParent.selectedIndex;
	var selName = selJurisParent.item(sel);
	if (!selName) return;
	
	selName = selName.value;
	if (values = dataJuris[level][selName]) {
		var opt = document.createElement('option');
    	opt.value = '';
    	opt.innerHTML = allJuris;
    	selJuris.appendChild(opt);
		for (i = 0; i < values.length; i++) {
			var opt = document.createElement('option');
	    	opt.value = values[i];
	    	opt.innerHTML = textJuris[values[i]];
	    	selJuris.appendChild(opt);
		}
		arrowJuris.show();
		selJuris.show();
	}
}

function setProx() {
	var proxy1 = $('requete.proxiTopLeft');
	var proxy2 = $('requete.proxiBotLeft');
	if($('requete.condTopLeft').value == 'PROX'){
		proxy1.disabled=false;
		if(proxy1.value == "") proxy1.value="3";
	}else{
		proxy1.disabled=true;
		proxy1.value="";
	}
	if($('requete.condBotLeft').value == 'PROX'){
		proxy2.disabled=false;
		if(proxy2.value == "") proxy2.value="3";
	}else{
		proxy2.disabled=true;
		proxy2.value="";
	}
}
