
//==============================================================
//##
//## Fonctions de bas niveau
//##
//==============================================================

function uncheck(obj)
{
	obj.checked = !obj.checked;
//	return !obj.disabled;
}

//==============================================================
function LTrim(str)
//==============================================================
{
  var whitespace = new String(" \t\n\r");
  var s = new String(str);

  if (whitespace.indexOf(s.charAt(0)) != -1) {
		var j=0, i = s.length;
		while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
			 j++;

		s = s.substring(j, i);
  }
  return s;
}



//==============================================================
function RTrim(str)
//==============================================================
{
  var whitespace = new String(" \t\n\r");
  var s = new String(str);

  if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {
		var i = s.length - 1;		// Get length of string
		while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
			 i--;

		s = s.substring(0, i+1);
  }

  return s;
}


//==============================================================
function Trim(str)
//==============================================================
{
 return RTrim(LTrim(str));
}



//==============================================================
function validNum(sVal, min, max)
//==============================================================
{
	var ret = false;

	if( isNaN(sVal) == false)
	 {
		if(sVal.indexOf("0")==0)
			intVal = parseInt(sVal.substring(1));
		else
			intVal = parseInt(sVal);

		if ( (intVal >= min) && (intVal <= max) )
			ret = true;
	 }

	return ret;
}








//##############################################################
//##
//## Fonctions de haut niveau (Check)
//##
//##############################################################


//##############################################################
function checkNum( item, min, max, nom )
//##############################################################
{
	if ( Trim(item.value) == "")
	 return true;
	else
	 {

		if( min && max )
		 {
			if( validNum( item.value,min,max) )
				return true;
			else
			 {
				alert("-"+nom+"- doit être compris entre "+min+" et "+max );
				item.focus();
				return false;
			 }
		 }
		else
		 {
			if( isNaN( item.value ) )
			 {
				alert("-"+nom+"- doit être de type numérique !!!" );
				item.focus();
				return false;
			 }
			else
				return true;
		 }
	 }
}




//##############################################################
function checkOblig( item, msg )
//##############################################################
{
	var val;
	val = Trim(item.value);
	var elt,i,theform,findif;
	theform = item.form;
	elt = theform.elements;

	if(item.type == "radio" || item.type == "checkbox")
	 {
		// Si c'est un controle de type RADIOBUTTON / CHECKBOX
		// il existe plusieurs éléments du même nom ...

		// !!! AMELIORATION POSSIBLE !!!
		// On peut indexer directement l'ELT, sans être
		// obliger de parcourir tous les champs du FORM
		// !!! AMELIORATION POSSIBLE !!!

		var elt,i,theform,findif;
		theform = item.form;
		elt = theform.elements;
		findit = false;
		for (i=0;i< elt.length;i++)
		 {
			// Parcours donc, l'ensemble des éléments pour rechercher
			// celui qui est checké (et qui contient donc, la valeur à
			// prendre en compte)
			if(elt[i].name==item.name && elt[i].checked)
			 {
				// c'est le bon élément
				findit = true;
				val =  Trim(elt[i].value);
				break;
			 }
		 }

		if(!findit)
			val=""; // pour sortir en erreur (car, aucun n'est checked !)
	 }

	if(elt["_"+item.name])
	 {
		// si ITEM a son pendant avec un "_" ...
		// c'est que c'est une EDDDW !!!
		// donc, c soit l'un renseigner, soit l'autre ...
		if(!val)
		 { //la dddw né pas renseigné, on substitue son item, à celui de la saisie libre
			item = elt["_"+item.name];
			val = Trim(item.value);
		 }
	 }



	if(item.type=="select-one" || item.type=="select-multiple") // listbox (spécial pour netscape4)
	 {
		var v;
		v = item.selectedIndex;
		if(v>=0)
			val = item.options[v].value;
		else
			val = "";
	 }

//	alert("TEST OBLIG type["+item.type+"] :"+item.name+"="+val+"(length="+val.length+")");

	if( ! ( val.length>0 ) )
	 {
		alert( msg );
		item.focus();
		return false;
	 }
	else
		return true;
}





//##############################################################
function checkDate(item,msg)
//##############################################################
{
var v = item.value;

//	v = v.replace(/(^\s*)|(\s*$)/g, "");	// trim ;-) en regex, mais ne marche pas sous n4
	v = Trim(v);

	if ( v == "")
	 return true;
	else
	 {
		var t;
		t = v.split("/");
		if(t.length!=3) t = v.split(".");
		if(t.length!=3) t = v.split(" ");

		if(t.length==3)
		 {
			var d = Number(t[0]);
			var m = Number(t[1]);
			var y = Number(t[2]);
			y=(y<100?(y>69?1900+y:2000+y):y);
		 
			var dt;
			dt = new Date(y,(m - 1),d);

			if( !(d==dt.getDate() && m==(dt.getMonth()+1) && y==dt.getFullYear() ))
			 {
				alert( msg+" : Date invalide !\nVeuillez la corriger !");
				item.focus();
				return false;
			 }

			d=(d<10?"0"+d:d);
			m=(m<10?"0"+m:m);
			item.value=d+"/"+m+"/"+y;

			return true;
		 }

		alert(msg+" : Format de date incorrect!\nEntrez une date sous la forme dd/mm/yyyy");
		item.focus();
		return false;
	 }
}

//|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\\

var CCAL= new Array();

function ccal(col)
// appelé par le click sur le fameux bouton date
{
var layer,code_col,ld,theDay;
layer = document.getElementById("layer_"+col.name); // récup le layer (voir ccal_btn() )
code_col = col.form.name +"."+ col.name;					// forme un identifiant unik
CCAL[code_col]=col; 											// pour stocker le ptr sur la colonne dans un tableau global
CCAL[code_col+".layer"]=layer;								// ainsi que le ptr vers le layer associé

if(layer.style.visibility == 'visible')
	ccal_set(code_col); //hide
else
 {
	if( checkDate(col,'date incorrecte') )
	 {
	if(col.value!="")
	 {
		ld = col.value.split("/");
		theDay	= new Date(ld[2],ld[1] - 1,ld[0]);
	 }
	else
		theDay	= new Date();

	  layer.innerHTML=ccal_gen(code_col, theDay.getMonth(),theDay.getFullYear(),theDay);
	  layer.style.visibility = 'visible';
	 }
 }
}

function ccal_gen(code_col, mois,annee,theDay)
// appelé pac ccal() et ccal_cma()
{
var html,i,ajour,j,jour,nbjour,fday,mname,monthdays;

	mname = new Array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Decembre');
	monthdays = new Array(30, ((annee % 4 == 0 && annee % 100 != 0) || annee % 400 == 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);


	html = "";
	for(i in mname) html+='<option value="'+i+'"'+(i==mois?" selected":"")+'>'+mname[i]+'</option>';
	html= "<select class='bsd_btn' onChange='ccal_cma(\""+code_col+"\",this.value,"+annee+");'>"+html+"</select>";

	html="<table width=150 cellpadding=1 cellspacing=1 style='border:1px outset white;background-color:buttonface'><tr><td>"+html;

	html+=" <b>"+annee+"</b>";
   html +='<input type="button" class="bsd_btn" value="<" onclick="ccal_cma(\''+code_col+'\','+mois+','+(annee-1)+')">' ;
   html +='<input type="button" class="bsd_btn" value=">" onclick="ccal_cma(\''+code_col+'\','+mois+','+(annee+1)+')">' ;
	html+="<br>";
	html+="<table width=100 align='left'><tr>";
	html+="<td class='bsd_sem'>dim</td>";
	html+="<td class='bsd_sem'>lun</td>";
	html+="<td class='bsd_sem'>mar</td>";
	html+="<td class='bsd_sem'>mer</td>";
	html+="<td class='bsd_sem'>jeu</td>";
	html+="<td class='bsd_sem'>ven</td>";
	html+="<td class='bsd_sem'>sam</td>";
	html+="</tr><tr>";

	nbjour= monthdays[mois];

	mois = Number(mois);
	fday = new Date(annee,mois,1);
	for(i=1;i<=50;i++)
	{
		jour = i - fday.getDay();
		if(jour>= 1 && jour<=nbjour)
		 {
			j=(jour<10?"0"+jour:jour)+"/"+(mois+1<10?"0"+(mois+1):(mois+1))+"/"+annee;
			ajour='<a href="javascript:ccal_set(\''+code_col+'\',\''+j+'\')">'+jour+'</a>';
		 }
		else
			ajour="";

		if(jour == theDay.getDate() && mois==theDay.getMonth() && annee==theDay.getFullYear())
			html+="<td class='bsd_btn'>"+ajour+"</td>";
		else
			html+="<td class='bsd_jour'>"+ajour+"</td>";

		if(i%7==0)
		 {
			html+="</tr>";
			if(jour<nbjour)
				html+="<tr>";
			else
				break;
		 }
	}
	html+="</tr></table>";
	html+="</td></tr></table>";

	return html;
}
function jo() { return("jo"); }

function ccal_btn(nom,classe) // init la bouton/div si dom compliant
// appelé à la génération du champ "date"
{
if(document.getElementById) // dom compliant
	return '<input class="'+classe+'" type="button" onclick="ccal(this.form.elements[\''+nom+'\']);return false;" value="=">'+"<div id='layer_"+nom+"'></div>";
else
	return '';
}


function ccal_cma(c,m,a)   // change mois/annee
// appelé par clic sur changement mois/année du calendrier
{
var layer = CCAL[c+".layer"];
	layer.innerHTML=ccal_gen(c,m,a,new Date());
}

function ccal_set(c,v) // selectionne une date
// appelé par clic sur un jour du calendrier et par ccal()
{
var layer = CCAL[c+".layer"];
	layer.style.visibility = 'hidden';
   layer.outerHTML="<div id='layer_"+CCAL[c].name+"'></div>";
   layer.innerHTML="";

	if(v) {CCAL[c].value=v; CCAL[c].focus();}
}

//=======================================================================================
// richtext (c)2002 - malz (IE>5.5) only
//=======================================================================================
function dedit( id )
{
var elt,contenu,d;
	elt = document.all[ "richedit_"+id ];
	if(elt.id)
	 {
		contenu = elt.innerHTML;
		elt.frameWindow = document.frames[elt.id];
		elt.src = "about:blank";
		elt.value = contenu ;

		d = elt.frameWindow.document; // mozilla/midas : document.getElementById( id ).contentDocument;
		d.designMode = "On";
 				d.open();
 				d.write( contenu );
 				d.close();

		elt.save	= function ()	{ document.all[ id ].value = d.body.innerHTML; }
		elt.focus = function()	{ elt.frameWindow.focus(); }

		elt.getRange = function () {
			var doc = this.frameWindow.document;
			var r = doc.selection.createRange();
			if (doc.body.contains(r.parentElement()))
				return r;
			return null;
		}

		elt.getSelection = function () {
			var r = this.getRange();
			if(r!=null)
				return r.htmlText;
			return null;
		}

		elt.execCommand = function (execProp, execVal, bUI) {
		// bold
		// italic
		// underline
		// createlink
		// backcolor, #xxx
		// forecolor, #xxx
			var doc = this.frameWindow.document;
			var type = doc.selection.type;
			var oTarget = (type == "None" ? doc : doc.selection.createRange() );
			var r = oTarget.execCommand(execProp, bUI, execVal);
			if (type == "Text")
				oTarget.select();
			this.focus();
			return r;
		}

		elt.queryCommand = function (execProp, execVal, bUI) {
			var doc = this.frameWindow.document;
			var type = doc.selection.type;
			var oTarget = (type == "None" ? doc : doc.selection.createRange() );
			var r = oTarget.queryCommandValue(execProp);
			this.focus();
			return r;
		}


		elt.addHtml = function( code , replaceOnly) {
			var r = this.getRange();
			if (r != null)
			 {
				if(replaceOnly)
				 {	if(this.frameWindow.document.selection.type!='None') r.pasteHTML( code );}
				else
					r.pasteHTML( code );
			 }
			this.focus();
		}

		return elt;
	 }

}

