// xctrl.js
// Module de controle se champs de saisie
// Pour que le controle soit fait automatiquement par le module il faut ajouter cette ligne dans le <head>
//    <script type='text/javascript' language='javascript' src='/commun/js/xctrl.js' />
// Votre champs input doit avoir la classe XCTRL_Class
// les differents types disponibles :
// XCTRL_Type = "date"      : champs de type date de la forme jj/mm/aaaa
// XCTRL_Type = "dateC"     : champs de type date de la forme jj/mm/aaaa associe a un calendrier
// XCTRL_Type = "montant"   : champs de type montant
// XCTRL_Type = "montant+"  : champs de type montant positif
// XCTRL_Type = "montantE"  : champs de type montant sans centime
// XCTRL_Type = "montantE+" : champs de type montant positif sans centime
// XCTRL_Type = "num"       : champs numerique (0-9)
// XCTRL_Type = "num-"      : champs numerique (0-9) avec signe '-' autorise
// XCTRL_Type = "alpha"     : champs aplhabetique (a-z)
// XCTRL_Type = "alpha-"    : champs aplhabetique (a-z) et '-'
// XCTRL_Type = "alphanum"  : champs alphanumerique (a-z, 0-9)
// pour les autres valeurs, celle ci est prise comme masque ex XCTRL_Type = "99/9999"
// ex : <input class="XCTRL_Class" XCTRL_Type="date" />
//
// pour les typages dynamiques, initialisez la propriete XCTRL_Type a la bonne valeur et faite un XCTRL_Set(obj), obj etant l'input
// exemple :
//  var obj = document.createElement("INPUT");
//  obj.className = "XCTRL_Class";
//  obj.setAttribute("XCTRL_Type","date");
//  document.body.appendChild(obj);
//  XCTRL_Set(obj);


if (!window.XCTRL_Included)
{
	window.XCTRL_Included = 1;
	try
	{
		XLOG_included();
		Xinclude("/commun/js/date.js");
  		Xinclude("/commun/js/montant.js");
  		Xinclude("/commun/js/XCalendrier.js");

		X_addEvent(window, "load", XCTRL_Init);
	}
	catch (e)
	{
	}
}

function trim(string)
{
	return string.replace(/(^\s*)|(\s*$)/g,'');
}

function XCTRL_Init()
{
	var all = document.getElementsByTagName("INPUT");

	for(var i = all.length-1 ; i >= 0 ; i--)
	{
		if(all[i].className.search(/XCTRL_Class/) != -1)
				XCTRL_Set(all[i]);
	}
}

function XCTRL_Set(monInput)
{
  if (!monInput || !monInput.tagName || monInput.tagName != "INPUT")
  {
    alert(monInput+"n'est pas un champs input !");
    return;
  }
  var type = monInput.attributes['XCTRL_Type'].value;
  
  if (type == "date")
    _XCTRL_setDate(monInput);
  if (type == "dateC")
    _XCTRL_setDateC(monInput);  
  else if (type == "montant")
    _XCTRL_setMontant(monInput);
  else if (type == "montant+")
    _XCTRL_setMontant2(monInput);
  else if (type == "montantE")
    _XCTRL_setMontantE(monInput);
  else if (type == "montantE+")
    _XCTRL_setMontantE2(monInput);
  else if (type == "num")    
    _XCTRL_setNum(monInput);
  else if (type == "num-")    
    _XCTRL_setNum2(monInput);
  else if (type == "alpha")    
    _XCTRL_setAlpha(monInput);
  else if (type == "alpha-")    
    _XCTRL_setAlphaMoins(monInput);
  else if (type == "alphanum")    
    _XCTRL_setAlphaNum(monInput);
  else 
    _XCTRL_setMasque(monInput);

}


// functions privees

// XCTRL_Type="date"
function _XCTRL_setDate(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_masqueDate);
  X_addEvent(monInput, "blur", _XCTRL_verifDate);
}
// XCTRL_Type="dateC"
function _XCTRL_setDateC(monInput)
{
  var monImage = document.createElement("IMG");
  monImage.src = "/commun/images/Calendrier.gif";
  monImage.nomInput = monInput.name;
  monImage.style.cursor="pointer";
  monImage.style.marginLeft="5px";
  monInput.parentNode.insertBefore(monImage, monInput.nextSibling);
  X_addEvent(monImage, "click", _XCTRL_ClickCalend);
  _XCTRL_setDate(monInput)
}
// XCTRL_Type="montant"
function _XCTRL_setMontant(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_montant);
  X_addEvent(monInput, "blur", _XCTRL_formatMontant);
}
// XCTRL_Type="montant+"
function _XCTRL_setMontant2(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_montant2);
  X_addEvent(monInput, "blur", _XCTRL_formatMontant);
}
// XCTRL_Type="montantE"
function _XCTRL_setMontantE(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_montantE);
  X_addEvent(monInput, "blur", _XCTRL_formatMontantE);
}
// XCTRL_Type="montantE+"
function _XCTRL_setMontantE2(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_montantE2);
  X_addEvent(monInput, "blur", _XCTRL_formatMontantE);
}
// XCTRL_Type="num"  
function _XCTRL_setNum(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_num);
}
// XCTRL_Type="num-"
function _XCTRL_setNum2(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_num2);
}
function _XCTRL_setMasque(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_masqueGenerique);
}
// XCTRL_Type="alpha"  
function _XCTRL_setAlpha(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_alpha);
}
// XCTRL_Type="alpha-"  
function _XCTRL_setAlphaMoins(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_alphaMoins);
}
// XCTRL_Type="alphanum"  
function _XCTRL_setAlphaNum(monInput)
{
  X_addEvent(monInput, "keypress", _XCTRL_alphanum);
}

function _XCTRL_masqueDate(evt)
{
  _XCTRL_masque(X_GetTarget(evt), "99/99/9999", evt);
}

function _XCTRL_ClickCalend(evt)
{
  var target = X_GetTarget(evt);

  XCALEND_afficher(target.nomInput, evt);
} 

function _XCTRL_num(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = (key >= 48 && key <= 57);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_num2(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = (key >= 48 && key <= 57 || key == 45);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_alpha(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = ( (key >= 65 && key <= 91) || (key > 95 && key < 123) || key == 32);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_alphaMoins(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = ( (key >= 65 && key <= 91) || (key > 95 && key < 123) || key == 32 || key == 45);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_alphanum(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = ( (key >= 65 && key <= 91) || (key > 95 && key < 123) || (key >= 48 && key <= 57) || key == 32);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_montant(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
  {
    ret = ( (key >=48 && key <= 57) || key == 32); // chiffres ou espace

    if (!ret)
    {
      var target = X_GetTarget(evt);
      ret =   ( (key == 44 || key == 46) && (target.value.search(/\,/) == -1 && target.value.search(/\./) == -1))
            ||( (key == 43 || key == 45) && (target.value.search(/\+/) == -1 && target.value.search(/\-/) == -1));

      if (ret && (key == 43 || key == 45))
      {
        ret = false;
        if (key == 45)
          target.value = "-"+target.value;
        else if (key == 43)
          target.value = "+"+target.value;
        
      }
    }      
  }
  X_eventSetReturn(evt, ret);
}


function _XCTRL_montant2(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = ( (key >=48 && key <= 57) || key == 44 || key == 46 || key == 32);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_montantE(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
  {
    ret = ( (key >=48 && key <= 57) || key == 32); // chiffres ou espace

    if (!ret)
    {
      var target = X_GetTarget(evt);
      ret =  ( (key == 43 || key == 45) && (target.value.search(/\+/) == -1 && target.value.search(/\-/) == -1));

      if (ret && (key == 43 || key == 45))
      {
        ret = false;
        if (key == 45)
          target.value = "-"+target.value;
        else if (key == 43)
          target.value = "+"+target.value;
        
      }
    }      
  }
  X_eventSetReturn(evt, ret);
}

function _XCTRL_montantE2(evt)
{
  var key = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
    ret = ( (key >=48 && key <= 57) || key == 32);

  X_eventSetReturn(evt, ret);
}

function _XCTRL_masqueGenerique(evt)
{
  var target = X_GetTarget(evt);
  var masque = target.attributes['XCTRL_Type'].value;

  if (masque)
    _XCTRL_masque(target, masque, evt);
  
}

function _XCTRL_formatMontant(evt)
{
 	var target = X_GetTarget(evt);
	var chaine = montantEnCentimes (target.value);

	if (chaine == "0")
    	chaine = "";
  	else
    	chaine = formateMontant(chaine);
	target.value = chaine;
}

function _XCTRL_formatMontantE(evt)
{
 	var target = X_GetTarget(evt);
	var chaine = montantEnCentimes (target.value);

	if (chaine == "0")
    	chaine = "";
  	else
    	chaine = formateMontant(chaine);
    
	target.value = chaine.substring(0, chaine.length-3);
}
// ---------------------------------------------------

function _XCTRL_masque(champs, masque, evt)
{
   var indice  = 0;
  var key     = X_keyCode(evt);
  var ret;

  if (_XCTRL_GoodKey(key))
    ret = true;
  else
  {
    var tab = X_GetPosSelect(X_GetTarget(evt));
    indice = champs.value.length - (tab.fin - tab.deb);
    ret = trt(indice);
  }

  X_eventSetReturn(evt, ret);
	function trt(ind)
	{
		if(ind < masque.length)
		{
			var x = masque.charAt(ind) ;
		
			if ( x == '9' )      // l'utilisateur doit taper un chiffre
			{ 
				var exp = /[0-9]/;
				return (exp.exec(String.fromCharCode(X_keyCode(evt))) != null);
			}
			else if ( x == 'a' ) // l'utilisateur doit taper une lettre
			{ 
				var exp = /[A-Z]/i;
				return (exp.exec(String.fromCharCode(X_keyCode(evt))) != null);
			}
			else 
			{ //l'utilisteur doit taper un caractere séparateur
				if(String.fromCharCode(X_keyCode(evt)) != x)
				{
					if( trt(ind + 1) == true)
					{
						champs.value = champs.value + x;
						return true;
					}
					else
						return false;
				}
				else
					return true;
			}
		}
		else
			return false;
	}
}

function _XCTRL_verifDate(evt)
{
  var champs = X_GetTarget(evt);
  
  if (champs.value && trim(champs.value) != "")
  {
	if (!XDateIsValid(champs.value))
  	{
  		X_eventSetReturn(evt, false);
    	alert("la date "+champs.value+" n'est pas valide");
    	if (champs.style.display != "none")
    	  champs.focus();
  	}    
  	else
  		X_eventSetReturn(evt, true);
  }
  else		
  		X_eventSetReturn(evt, true);

}
// -----------------------------------------------------------------------------

function _XCTRL_GoodKey(key)
{
  return (key == 0 || key == 8 || key == 13);
}