// JavaScript Document
var formlayer = "";

function submit_classicform(form)
{
	form.onsubmit = "return true";
	if(eval(form.fonction.value+"(form)"))
		form.submit();
}

function submit_ajaxform(form)
{
	if(eval(form.fonction.value+"(form)"))
	{
		ajaxForm(Form.serialize(form), form.action, formlayer)
	}
}


/************************************* SYSTEME DE VALIDATION **************************************/


Validator = Class.create();

Validator.prototype = {
	initialize : function(className, error, test) {
		this.test = test ? test : function(){ return true };
		this.error = error ? error : 'Validation failed.';
		this.className = className;
	}
}

var Validation = Class.create();

Validation.prototype = {
	initialize : function(form, options){
		this.options = Object.extend({
			stopOnFirst : false,
			immediate : false
		}, options || {});
		this.form = $(form);
		Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
		if(this.options.immediate) {	
				Form.getElements(this.form).each(function(input) { // Thanks Mike!
				Event.observe(input, 'blur', function(ev) { 
					Validation.validate(Event.element(ev).id);
				});
				
			});
		}
	},
	onSubmit :  function(ev){
		if(!this.validate()) 
			Event.stop(ev);
		else
		{
			if(formlayer == "")
				submit_classicform(this.form);
			else
				submit_ajaxform(this.form);
		}
	},
	validate : function() {
		if(this.options.stopOnFirst) {
			return Form.getElements(this.form).all(Validation.validate);
		} else {
			return Form.getElements(this.form).collect(Validation.validate).all();
		}
	}
}

Object.extend(Validation, {
	validate : function(elm, index, options){ // index is here only because we use this function in Enumerations
		var options = Object.extend({}, options || {}); // options still under development and here as a placeholder only
		elm = $(elm);
		var cn = elm.classNames();
		return result = cn.all(Validation.test.bind(elm));
	},
	test : function(name) {
		var v = Validation.get(name);
		var id = 'advice-' + name + '-' + this.id;
		var prop = '__advice'+name;
		if(Validation.isVisible(this) && !v.test($F(this))) {
			if(!this[prop]) {
				var advice = document.createElement('div');
				advice.appendChild(document.createTextNode(v.error));
				advice.className = 'validation-advice';
				advice.id = id;
				advice.style.display = 'none';
				this.parentNode.insertBefore(advice, this.nextSibling);
				if(typeof Effect == 'undefined') {
					advice.style.display = 'block';
				} else {
					new Effect.Appear(advice.id, {duration : 1 });
				}
			}
			this[prop] = true;
			this.removeClassName('validation-passed');
			this.addClassName('validation-failed');
			return false;
		} else {
			try {
				$(id).remove();
			} catch(e) {}
			this[prop] = '';
			this.removeClassName('validation-failed');
			this.addClassName('validation-passed');
			return true;
		}
	},
	isVisible : function(elm) {
		while(elm.tagName != 'BODY') {
			if(!$(elm).visible()) return false;
			elm = elm.parentNode;
		}
		return true;
	},
	add : function(className, error, test, options) {
		var nv = {};
		nv[className] = new Validator(className, error, test, options);
		Object.extend(Validation.methods, nv);
	},
	addAllThese : function(validators) {
		var nv = {};
		$A(validators).each(function(value) {
				nv[value[0]] = new Validator(value[0], value[1], value[2]);
			});
		Object.extend(Validation.methods, nv);
	},
	get : function(name) {
		return  Validation.methods[name] ? Validation.methods[name] : new Validator();
	},
	methods : {}
});

//var $V = Validation.validate;
//var $VG = Validation.get;
//var $VA = Validation.add;

Validation.add('IsEmpty', '', function(v) {
				return  ((v == null) || (v.length == 0) || /^\s+$/.test(v));
			});

Validation.addAllThese([
	['required', langFormRequired, function(v) {
				return !Validation.get('IsEmpty').test(v);
			}],
	['number', langFormNumber, function(v) {
				return Validation.get('IsEmpty').test(v) || !isNaN(v);
			}],
	['digits', langFormDigit, function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
			}],
	['alpha', langFormAlpha, function (v) {
				return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
			}],
	['alphanum', langFormAlphanum, function(v) {
				return Validation.get('IsEmpty').test(v) ||  !/\W/.test(v)
			}],
	['date', langFormDate, function(v) {
				var test = new Date(v);
				return Validation.get('IsEmpty').test(v) || !isNaN(test);
			}],
	['email', langFormEmail, function (v) {
				return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
			}],
	['dateformat', langFormDateformat, function(v) {
				if(!Validation.get('IsEmpty').test(v)) {
					var upper = 31;
					if(/^(\d{2})\/(\d{2})\/(\d{4})$/.test(v)) { // dd/mm/yyy
						if(RegExp.$2 == '02') upper = 29;
						if((RegExp.$1 <= upper) && (RegExp.$2 <= 12)) {
							return true;
						} else {
							return false;
						}
					} else {
						return false;
					}
				} else {
					return true;
				}
			}],
	['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00 .', function(v) {
				// [$]1[##][,###]+[.##]
				// [$]1###+[.##]
				// [$]0.##
				// [$].##
				return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
			}]
]);

/////////////////////////////////////////////////////////////////////////////////////

function submitform(form, layer)
{
	formlayer = layer;
	new Validation(form);
}


function resetform(get, post, layer)
{
	if(layer != "")
		ajaxSimple(get, post, layer);
	else
		document.location.href = get;
}
////// SELECTION TO SELECTION ///////////////////////////////////////////////////////////////////////////////
//bascule d'une liste  une autre
function bascule_elt(l1,l2) {
	if (l1.options.selectedIndex>=0)
	{
		o = new Option(l1.options[l1.options.selectedIndex].text,l1.options[l1.options.selectedIndex].value);
		l2.options[l2.options.length] = o;
		l1.options[l1.options.selectedIndex] = null;
	}
}
//Permet de rcuprer l'id d'un lment dans une liste en connaissance sa value
function getIndexFromValue(liste, valeur)
{
	var taille = liste.options.length;
	for(i=0;i<taille;i++)
		if(liste.options[i].value == valeur)
			return i;
	return null;
}
//selectionne un liste entire afin de procder  la validation du formulaire
function select_choice_list(choice_list) {
	for(i=0;i<choice_list.options.length;i++)
		if(choice_list.options[i].selected == false)
			choice_list.options[i].selected = true;
}
//tout dplcaer (add/remove)
function move_all(l1,l2) {
	//on selectionne la liste de dpart entirement
	select_choice_list(l1);
	var taille = l1.options.length
	for(i=0;i<taille;i++)
	{
		bascule_elt(l1,l2);
	}
}
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////FILE UPLOAD////////////////////////////////////////////////////

function fileIframeProgress(div1, div2) {
	$(div1).style.display = "";
	//$(div2).style.display = "none";
}


/***********************************************************************************************************/
/*                                             CALENDRIER EN JAVASCRIPT                                    */
/***********************************************************************************************************/

var duree_jour = 24 * 60 * 60 * 1000;

var nom_mois = new Array();

var tab_cal = new Array();


function displayCalendrier(input, lang)
{
	var my_input = $(input);
	eval("var cal_"+input+" = new Calendrier();");
	eval("tab_cal['"+input+"'] = cal_"+input+";");
	eval("cal_"+input+".afficher(my_input, '"+lang+"');");
	eval("$('"+input+"_div').style.display='';");
}


function Calendrier() {

	this.date_jour = dateAMidi();

	this.feries = null;
	
	this.input = null;
	
	this.lang = null;
	
	this.input_id = null;
	
}

Calendrier.prototype.closecal = function()
{
	$(this.input.id+'_div').style.display='none';
}
Calendrier.prototype.returndate = function(jour)
{
	var mois = parseInt(this.date_jour.getMonth());
	mois += 1;
	mois = mois.toString();
	if(mois.length == 1)
		mois = "0"+mois;
	jour = jour.toString();
	if(jour.length == 1)
		jour = "0"+jour;
	if(this.lang == "fr")
		this.input.value = jour+"/"+mois+"/"+this.date_jour.getFullYear();
	else
		this.input.value = this.date_jour.getFullYear()+"-"+mois+"-"+jour;
	$(this.input.id+'_div').style.display='none';
}

Calendrier.prototype.afficher = function(input, lang) {

	// affiche le mois concernant la date demande (en argument, facultative)
	if(this.input == null)
		this.input = input;
	if(this.input_id == null)
		this.input_id = input.id;
	if(this.lang == null)
	{
		this.lang = lang;
		if(this.lang == "fr")
		{
			nom_mois = Array("Janvier", "F&eacute;vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Ao&ugrave;t", "Septembre", "Octobre", "Novembre", "D&eacute;cembre");
		}
		else
		{
			nom_mois = Array("January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
		}
	}
	this.joursFeries();

	html = "<table id='calendrier' cellspacing='0' cellpadding='0' border='0' summary='calendrier'>";

	html += "<tr><td>";

	html += "<table id='calendrier-haut' cellspacing='0' cellpadding='0' border='0' summary='mois et anne du calendrier' width='100%'>";

	html += this.afficherEntete();

	html += "</table>";

	html += "</td></tr>";

	html += "<tr><td>";

	html += "<table id='calendrier-jours' cellspacing='0' cellpadding='0' border='0' summary='jour du mois' width='100%'>";

	html += this.afficherJoursSemaine();

	html += this.afficherJoursMois();

	html += "</table>";

	html += "</td></tr>";

	html += "</table>";

	//document.write(html);
	$(this.input.id+'_div').innerHTML = html;
	//return html;
}



Calendrier.prototype.joursFeries = function() {

	// indique les jours fris en fonction de l'anne du calendrier

	var feries = this.date_jour.joursFeriesMobiles();

	this.feries = "|" + feries.join("|") + "|";

}



Calendrier.prototype.afficherEntete = function() {

	// affiche le mois (en lettres) et l'anne avec des flches pour les incrmenter ou les dcrmenter

	// affichage de 2 flches prec 

	var html = "<tr>";
	/*html += "<td class='calendrier-fleche'>";

	html += "<a href='javascript:calendrier.anneePrecedente();calendrier.afficher();' title='anne prcdente'>";

	html += "<img src='an_prec.gif' border='0' width='11' height='11' alt='anne prcdente' onmouseover='this.src=\"an_preca.gif\"' onmouseout='this.src=\"an_prec.gif\"'></a>";

	html += "</td>";
*/
	html += "<td class='calendrier-fleche'>";
	//html += "<a href=\"javascript:alert(tab_cal['"+this.input_id+"']);\" title='mois prcdent'>&lt;&lt;</a>"
	html += "<a href=\"javascript:tab_cal['"+this.input_id+"'].moisPrecedent();tab_cal['"+this.input_id+"'].afficher();\" title='mois prcdent'>&lt;&lt;</a>";

	//html += "<img src='mois_preca.gif' border='0' onmouseover='this.src=\"mois_prec.gif\"' onmouseout='this.src=\"mois_preca.gif\"'></a>";

	// affichage du mois avec son id qui permettra de modifier le contenu du <td>

	html += "<td id='calendrier-mois-an' align='center'>" + this.date_jour.moisLitteral() + " " + this.date_jour.getFullYear() + "</td>";

	// affichage de 2 flches suiv 

	html += "</td>";

	html += "<td class='calendrier-fleche'>";

	html += "<a href=\"javascript:tab_cal['"+this.input_id+"'].moisSuivant();tab_cal['"+this.input_id+"'].afficher();\" title='mois suivant'>&gt;&gt;</a>";

	//html += "<img src='mois_suiva.gif' border='0' onmouseover='this.src=\"mois_suiv.gif\"' onmouseout='this.src=\"mois_suiva.gif\"'></a>";

	html += "</td>";

	/*html += "<td class='calendrier-fleche'>";

	html += "<a href='javascript:calendrier.anneeSuivante();calendrier.afficher();' title='anne suivante'>";

	html += "<img src='an_suiv.gif' border='0' width='11' height='11' alt='anne suivante' onmouseover='this.src=\"an_suiva.gif\"' onmouseout='this.src=\"an_suiv.gif\"'></a>";

	html += "</td>";
	*/
	html += "</tr>";

	return html;

}



Calendrier.prototype.afficherJoursSemaine = function() {

	// affiche les jours de la semaine sur une ligne

	if(this.lang == "fr")
	{
		var jours_sem = new Array("L", "M", "M", "J", "V", "S", "D");
	}
	else
	{
		var jours_sem = new Array("M", "T", "W", "T", "F", "S", "S");
	}
	var html = "<tr>";

	for (var i=0;i<jours_sem.length;i++) {

		if (i < 5) html += "<td class='calendrier-sem'>" + jours_sem[i] + "</td>";

		else html += "<td class='calendrier-fin-sem'>" + jours_sem[i] + "</td>";

	}

	html += "</tr>";

	return html;

}



Calendrier.prototype.afficherJoursMois = function() {

	// affiche les jours du mois en fonction du mois et de l'anne en cours

	// limites indique le dbut et la fin des jours visibles dans le calendrier

	// de faon  ce que le calendrier contienne le 1er du mois sur la 1re ligne

	var limites = this.limitesMoisCalendrier();

	var jour = limites[0];

	var auj = dateAMidi();

	var col = 0;

	var ligne = 0;

	var html = "<tr>";

	while (jour <= limites[1]) {

		if (col == 7) {

			html += "</tr><tr>";

			col = 0;

			ligne++;

		}

		if (jour.memeJour(auj)) 
		{
			html += "<td class='calendrier-jour-auj";
		}
		if (jour.dansLeMois(this.date_jour)) 
		{ 
			if (col < 5) 
				html += "<td class='calendrier-jour";
			else 
				html += "<td class='calendrier-jour-we";
			html += "'><a href=\"javascript:tab_cal['"+this.input_id+"'].returndate('"+ jour.getDate()+"')\">" + jour.getDate() + "</a></td>";
		}
		
		else html += "<td class='calendrier-jour-horsmois'><a href=\"javascript:tab_cal['"+this.input_id+"'].closecal()\">&nbsp;</a></td>";

		//if (this.estFerie(jour)) html += " calendrier-jour-ferie";

		

		jour.jourSuivant();

		col++;

	}

	html += "</tr>";

	while (ligne < 5) {

		html += "<tr>";

		for (col=0;col<7;col++) html += "<td class=''>&nbsp;</td>";

		html += "</tr>";

		ligne++;

	}		

	return html;

}



Calendrier.prototype.limitesMoisCalendrier = function() {

	// dtermine les limites du calendrier relatif au mois de la date en cours, de telle faon  ce que le 1er du mois

	// soit sur la 1re ligne, que le dernier du mois sur la dernire ligne, 

	// et que le dbut du calendrier commence un lundi et la fin finisse un dimanche

	

	// on cherche la date du dbut du calendrier

	var jour = new Date(this.date_jour.getTime());

	jour.debutMois(); // date du 1er du mois

	var jour_semaine = jour.getDay();

	jour_semaine = jour_semaine ? jour_semaine - 1 : 6;

	var debut_cal = new Date();

	debut_cal.setTime(jour.getTime() - jour_semaine * duree_jour);

	

	// puis la date de la fin du calendrier

	jour.finMois(); 

	jour_semaine = jour.getDay();

	jour_semaine = jour_semaine ? jour_semaine - 1 : 6;

	var fin_cal = new Date();

	fin_cal.setTime(jour.getTime() + (6 - jour_semaine)  * duree_jour);

	

	var limites = new Array(debut_cal, fin_cal);

	return limites;

}



Calendrier.prototype.moisSuivant = function() {

	// fait passer le calendrier au mois suivant

	// il faut modifier le jour courant du calendrier,

	// puis modifier le mois et ventuellement l'anne en haut du calendrier

	// et les jours, tout a via la structure du DOM

	this.date_jour.moisSuivant();

	this.joursFeries();

	this.majEntete();

	this.majJoursMois();

}



Calendrier.prototype.moisPrecedent = function() {

	// fait passer le calendrier au mois suivant

	// il faut modifier le jour courant du calendrier,

	// puis modifier le mois et ventuellement l'anne en haut du calendrier

	// et les jours, tout a via la structure du DOM

	this.date_jour.moisPrecedent();

	this.joursFeries();

	this.majEntete();

	this.majJoursMois();

}



Calendrier.prototype.anneeSuivante = function() {

	// fait passer le calendrier au mois suivant

	// il faut modifier le jour courant du calendrier,

	// puis modifier le mois et ventuellement l'anne en haut du calendrier

	// et les jours, tout a via la structure du DOM

	this.date_jour.anneeSuivante();

	this.joursFeries();

	this.majEntete();

	this.majJoursMois();

}



Calendrier.prototype.anneePrecedente = function() {

	// fait passer le calendrier au mois suivant

	// il faut modifier le jour courant du calendrier,

	// puis modifier le mois et ventuellement l'anne en haut du calendrier

	// et les jours, tout a via la structure du DOM

	this.date_jour.anneePrecedente();

	this.majEntete();

	this.majJoursMois();

}



Calendrier.prototype.majEntete = function() {

	// met  jour le mois et l'anne en-tte du calendrier
	document.getElementById("calendrier-mois-an").lastChild.nodeValue = this.date_jour.moisLitteral() + " " + this.date_jour.getFullYear();

}



Calendrier.prototype.majJoursMois = function() {

	// met  jour les jours du mois

	// racine est le noeud TBODY dont les lignes du tableau sont les childNodes

	var racine = document.getElementById("calendrier-jours").lastChild;

//	alert("fils 1 de racine = " + racine.childNodes[1].nodeName);

	var limites = this.limitesMoisCalendrier();

// alert("limites du calendrier = " + limites[0].afficher() + ", " + limites[1].afficher() + " date du calendrier = " + this.date_jour.afficher());

	var jour = limites[0];

	var auj = dateAMidi();

	var iligne = 1;

	var ligne = racine.childNodes[iligne];

	var cell = ligne.firstChild;

	var col = 0;

	do {

		if (col == 7) {

			ligne = racine.childNodes[++iligne];

			cell = ligne.firstChild;

			col = 0;

		}

		else cell = ligne.childNodes[col];

		if (jour.memeJour(auj)) cell.attributes["class"].nodeValue = "calendrier-jour-auj";

		else if (jour.dansLeMois(this.date_jour)) { 

			if (col < 5) cell.attributes["class"].nodeValue = "calendrier-jour";

			else cell.attributes["class"].nodeValue = "calendrier-jour-we";

		}

		else cell.attributes["class"].nodeValue = "calendrier-jour-horsmois";

		if (this.estFerie(jour)) cell.attributes["class"].nodeValue += " calendrier-jour-ferie";

		cell.firstChild.nodeValue = jour.getDate();

		jour.jourSuivant();

// alert("jour en cours = " + jour.afficher() + " diff = " + (limites[1].getTime() - jour.getTime()) / duree_jour);

		col++;

	} while ((limites[1].getTime() - jour.getTime()) >= 0);

	// cas o les jours s'affichent sur moins de 6 lignes

	while (iligne < 6) {

		ligne = racine.childNodes[++iligne];

		for (col=0;col<7;col++) {

			cell = ligne.childNodes[col];

			cell.attributes["class"].nodeValue = "";

			cell.firstChild.nodeValue = " ";

		}

	}

}



Calendrier.prototype.estFerie = function(jour) {

	// dtermine si un jour est fri (rajouter la date de Pques plus tard)

	var ch_date = rajoute0(jour.getDate()) + "/" + rajoute0(jour.getMonth()+1);

 	if (this.feries.indexOf("|" + ch_date + "|") == -1) return false;

 	else return true;

}





// FONCTIONS UTILITAIRES





Date.prototype.dansLeMois = function(date_ref) {

	// indique si la date en cours et date_ref sont du mme mois et de la mme anne

	if ((this.getMonth() == date_ref.getMonth()) && (this.getFullYear() == date_ref.getFullYear()))

		return true;

	else return false;

}



Date.prototype.jourSuivant = function() {

	// incrmente le jour de la date en fonction du nombre de jours en argument (si pas d'argument, l'incrment = 1)

	// p. ex. var jour = new Date(2004, 0, 1) (soit 01/01/2004), jour.jourSuivant() donnera le 02/01/2004

	// et jour.jourSuivant(31) donnera le 01/02/2004

	if (arguments.length) var increment = parseInt(arguments[0]);

	else var increment = 1;

	this.setDate(this.getDate() + increment);

}



Date.prototype.moisSuivant = function() {

	// passe le jour au mois suivant

	if (this.getMonth() < 11) this.setMonth(this.getMonth() + 1);

	else {

   		this.setMonth(0);

   		this.setFullYear(this.getFullYear() + 1);

 	}

}



Date.prototype.moisPrecedent = function() {

	// passe le jour au mois prcdent

	if (this.getMonth()) this.setMonth(this.getMonth() - 1);

	else {

   		this.setMonth(11);

   		this.setFullYear(this.getFullYear() - 1);

 	}

}



Date.prototype.anneeSuivante = function() {

	// passe le jour  l'anne suivante

	this.setFullYear(this.getFullYear() + 1);

}



Date.prototype.anneePrecedente = function() {

	// passe le jour  l'anne prcdente

	this.setFullYear(this.getFullYear() - 1);

}



Date.prototype.debutMois = function() {

	// met la date en cours au premier du mois

	this.setTime(this.getTime() - (this.getDate() - 1) * duree_jour); 

}



Date.prototype.finMois = function() {

	// met la date en cours  la fin du mois

	this.moisSuivant();

 	this.setDate(1);

 	this.setTime(this.getTime() - duree_jour);

}



Date.prototype.memeJour = function(une_date) {

	// si la date courante est le mme jour que une_date, retourne "true", sinon retourne "false"

	var diff = Math.abs(this.getTime() - une_date.getTime());

	if (diff < 60*60*1000) return true;

	else return false;

}



Date.prototype.moisLitteral = function() {

	return nom_mois[this.getMonth()];

}

Date.prototype.joursFeriesMobiles = function() {

	// ajoute aux jours fris fixes les jours fris mobiles : lundi de Pques, Ascension et lundi de Pentecte

	var jours_feries = new Array("");

	var jour = paques(this.getFullYear());

	// lundi de Pques

	jour.jourSuivant();

	jours_feries.splice(1, 0, jour.afficherJourMois());

	// ascension

	jour.jourSuivant(38);

	if (jour.getMonth() > 3) jours_feries.splice(3, 0, jour.afficherJourMois());

	else jours_feries.splice(2, 0, jour.afficherJourMois());

	// lundi de Pentecte

	jour.jourSuivant(11);

	jours_feries.splice(4, 0, jour.afficherJourMois());

	return jours_feries;

}

	

Date.prototype.afficherJourMois = function() {

	return rajoute0(this.getDate()) + "/" + rajoute0(eval(this.getMonth() + 1));

}



function dateAMidi() {

	// cre une date  midi (12h 0mn 0sec)

	if (arguments.length) ladate = arguments[0];

	else ladate = new Date();

	ladate.setHours(12);

	ladate.setMinutes(0);

	ladate.setSeconds(0);

	return ladate;

}

	

function rajoute0(valeur) {

	return (valeur < 10) ? "0" + valeur : valeur;

}



function paques(annee) {

    // retourne une date Javascript, qui est la date de Pques en fonction de l'anne

    annee = parseInt(annee);

    var date_paques = null;

    var b = annee - 1900;

    var c = annee % 19;

    var d = Math.floor((7*c+1)/19);

    var e = (11*c+4-d) % 29;

    var f = Math.floor(b/4);

    var g = (b+f+31-e) % 7;

    var avril = 25-e-g;

    if (avril > 0) date_paques = new Date(annee, 3, avril);

    else date_paques = new Date(annee, 2, avril + 31);

    return date_paques;

}
/////////////////////////////////////////////////////////////////////////////////////
//FONCTION PERMETTANT DE FAIR DES TAB DANS UN TEXTAREA

function setSelectionRange(input, selectionStart, selectionEnd) {
	if (input.setSelectionRange) {
		input.focus();
		input.setSelectionRange(selectionStart, selectionEnd);
	}
	else if (input.createTextRange) {
		var range = input.createTextRange();
		range.collapse(true);
		range.moveEnd('character', selectionEnd);
		range.moveStart('character', selectionStart);
		range.select();
	}
}

function replaceSelection (input, replaceString) {
	if (input.setSelectionRange) {
		var selectionStart = input.selectionStart;
		var selectionEnd = input.selectionEnd;
		input.value = input.value.substring(0, selectionStart)+ replaceString + input.value.substring(selectionEnd);
		
		if (selectionStart != selectionEnd){ 
			setSelectionRange(input, selectionStart, selectionStart + 	replaceString.length);
		}else{
			setSelectionRange(input, selectionStart + replaceString.length, selectionStart + replaceString.length);
		}

	}else if (document.selection) {
		var range = document.selection.createRange();

		if (range.parentElement() == input) {
			var isCollapsed = range.text == '';
			range.text = replaceString;

			 if (!isCollapsed)  {
				range.moveStart('character', -replaceString.length);
				range.select();
			}
		}
	}
}


// We are going to catch the TAB key so that we can use it, Hooray!
function catchTab(item,e){
	if(navigator.userAgent.match("Gecko")){
		c=e.which;
	}else{
		c=e.keyCode;
	}
	if(c==9){
		replaceSelection(item,String.fromCharCode(9));
		setTimeout("document.getElementById('"+item.id+"').focus();",0);	
		return false;
	}		
}
/////////////////////////////////////////////////////////////////////////////////////

