/*
   Copyright (C) 2005-2007 PimenTech SARL (http://www.pimentech.fr)

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public
   License along with this library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.	
*/

if (!document.getElementById) {
	if (document.all) {
		document.getElementById = function() {
			if (typeof document.all[arguments[0]] != "undefined") {
				return document.all[arguments[0]];
			}
			else{
				return null;
			}
		}
	}
	else if (document.layers) {
		document.getElementById = function() {
			if (typeof document[arguments[0]] != "undefined" ) {
				return document[arguments[0]];
			} 
			else {
				return null;
			}
		}
	}
 }



function get(el) {
	if (typeof el == 'string') { // accept object or id
		el = document.getElementById(el);
	}
	return el;
}

/* trim function (strip) */
function trim(str) {
  return str.replace(/^\s*|\s*$/g,"");
}

/* pour interpreter le contenu des balises script apres un innerHTML */
function evalScriptContent(element) {
	var script = element.getElementsByTagName('SCRIPT');
	for (var i = 0; i < script.length; i++) {
		eval(script[i].innerHTML);
	}
	
}

// popup javascript pour confirmation de formulaire
function delete_confirm(element, text) {
	return confirm("Attention : \nVoulez-vous vraiment supprimer " + element + " ?" + text);
};

// creer popup html sans plantage firefox + centree
function PopupCentrer(page, largeur, hauteur, options) {
	var top=(screen.height-hauteur)/2;
	var left=(screen.width-largeur)/2;
	window.open(page,"","top="+top+",left="+left+",width="+largeur+",height="+hauteur+","+options);
};

// redirection javascript
function redirect(url) {
	window.location = url;
}

// affiche le bloc de type id_on , efface le block de type id_off
function autoDisplay(id, displayType) {
  undisplay(id + '_off');
  if (arguments.length > 1)
	  display(id + '_on', displayType);
  else
	  display(id + '_on');
}

// inverse de autoDisplay
function autoUndisplay(id, displayType) {
  if (arguments.length > 1)	
    display(id + '_off', displayType);
  else
	  display(id + '_off');
  undisplay(id + '_on');
}

function display(id, displayType) {
	var object = document.getElementById(id);
	if (arguments.length > 1)
		object.style.display = displayType;
	else
		object.style.display = 'block';
}

function undisplay(id) {
	var object = document.getElementById(id);
	object.style.display = 'none';
}

// verifie que tous les champs de class 'necessary' sont remplis
// necessite un <p class="error_necessary">
function verif_form(form) {
	var error_message = '';
	if (typeof form == 'string') var form = document.forms[form]; // pour compatibilite ascendante
	if (!check_missing(form)) {
		error_message = "Saisie incomplete : les champs jaunes sont obligatoires.\n";
	}
	var name = form.name;
	if (!form.name) name = 'formulaire';
	error_message += check_types(form);
	var p_error = (document.getElementById('error_' + name) || document.getElementById(name) || null);
	if (error_message != '') {
		if (! p_error) {
			p_error = document.createElement('p');
			p_error.setAttribute('id', 'error_' + name);
			p_error.setAttribute('class', 'warning');
			var error_text = document.createTextNode(error_message);
			p_error.appendChild(error_text);
			form.insertBefore(p_error, form.firstChild);
			p_error.style.display = 'block';
		}
		else {
			if (trim(p_error.innerHTML) == '') {
				var error_text = document.createTextNode(error_message);
				p_error.replaceChild(error_text, p_error.firstChild);
			}
			p_error.style.display = 'block';
		}
		return false;
	}
	if (p_error) {
		p_error.style.display = 'none';	
	}
	return true;
}


function check_types(form) {
	var error_message = '';
	var el, name, value, className;
	var errorf = function(el) { if (el.className.indexOf('error-type') == -1) el.className += ' error-type'; }
	for (var i=0;i<form.length;i++) {
		el = form[i];
		name = el.name;
		value = el.value;
		className = el.className;
		if (name && value) {
			if (className.indexOf('type-integer') != -1) {
				if (!isInteger(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas un entier !\n" ;
					errorf(el);
					continue;
				}
			}
			else if (className.indexOf('type-float') != -1) {
				if (!isFloat(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas un decimal !\n" ;
					errorf(el);
					continue;
				}
			}
			else if (className.indexOf('type-datetime') != -1) {
				if (!isDateTime(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas une date valide de la forme jj/mm/aaaa hh:mm !\n" ;
					errorf(el);
					continue;
				}
			}
			else if (className.indexOf('type-date') != -1) {
				if (!isDate(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas une date valide de la forme jj/mm/aaaa !\n" ;
					errorf(el);
					continue;
				}
			}
			else if (className.indexOf('type-time') != -1) {
				if (!isTime(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas une heure valide de la forme hh:mm !\n" ;
					errorf(el);
					continue;
				}
			}
			else if (className.indexOf('type-email') != -1) {
				if (!isEmail(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas un email valide !\n" ;
					errorf(el);
					continue;
				}
			}
			else if (className.indexOf('type-login') != -1) {
				if (!isLogin(value)) {
					error_message += "Erreur de saisie : '" + value + "' n'est pas un login valide (pas d'accents ni espaces,...) !\n" ;
					errorf(el);
					continue;
				}
			}
			el.className = className.replace('error-type', '');
		}
	}
	return error_message;
}



// for verif_form function
function check_missing(form) {
	var no_error = true;
	var el, name, value, className;
	var first = true;
	for (var i=0;i<form.length;i++) {
		el = form[i];
		className = el.className;
		if (!el.value && className.indexOf('necessary') != -1) {
			if (className.indexOf('necessary-missing') == -1) {
				el.className = className.replace('necessary', 'necessary-missing');
				if (first && smoothScroll) {
					smoothScroll(el);
					first = false;
				}
			}
			no_error = false;
		}
		else {
			if (className.indexOf('necessary-missing') != -1) {
				el.className = className.replace('necessary-missing', 'necessary');
			}
		}
	}
	return no_error;
}


// submit a form
function load_form(name, action) {
	var form = document.forms[name];
	form.action = action;
	form.submit();
}

function isInteger(str) {
	var reg = /^(\d)+$/;
    if (str.match(reg)) 
		return true;
    return false;
}

function isTime(str) {
    var regTime = /^(\d{2}):(\d{2})$/;
	var match = str.match(regTime);
    if (match) {
		var hours = Number(match[1]);
		var minutes = Number(match[2]);
		d = new Date(0, 0, 0, hours, minutes);
		if (d.getHours() == hours && d.getMinutes() == minutes)
			return true;
	}
    return false;
}

function isDate(str) {
	var regFullDate = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/; 
	var match = str.match(regFullDate);
    if (match) {
		var day = Number(match[1]);
		var month = Number(match[2]);
		var year = Number(match[3]);
		if (year > 2038) return false; /* Python DateTime limit (32bit) :-( */
		d = new Date(year, month-1, day);
		if (d.getDate() == day && d.getMonth()+1 == month && d.getFullYear() == year)
			return true;
	}
    return false;
}

function isDateTime(str) {
	xplosed = str.split(' ');
	if (xplosed.length == 2)
		return isDate(xplosed[0]) && isTime(xplosed[1]);
	else if (xplosed.length == 1)
		return isDate(xplosed[0]);
	return false;
}

function isFloat(str) {
	var reg = /^(((\+|\-)?\d+(\.\d*)?)|((\+|\-)?(\d*\.)?\d+))$/;
	if (str.match(reg))
		return true;
    return false;
}

function isEmail(str) {
	var reg = /^.+\@.{2,}\..{2,4}$/;
	if (str.match(reg))
		return true;
    return false;
}

function isLogin(str) {
	var reg = /^(\w+)$/;
	if (str.match(reg))
		return true;
    return false;
}

/**
 * Shows or hides a div from id
 */
function toggleBox(szDivID, iState) { // 0 for hidden, 1 for visible
    if(document.layers) {	   //NN4+
       document.layers[szDivID].visibility = iState ? "show" : "hide";
    } else if(document.getElementById) {	  //gecko(NN6) + IE 5+
        var obj = document.getElementById(szDivID);
        obj.style.visibility = iState ? "visible" : "hidden";
    } else if(document.all)	{ // IE 4
        document.all[szDivID].style.visibility = iState ? "visible" : "hidden";
    }
}


/**
 * Swaps two values within a select input
 */
function swapOptions(select, index1, index2) {
	debug_msg("swapOptions : Swapping values " + index1 + " | " + index2 + " from " + select);

	if (index1 < 0 || index1 > select.length - 1 || index2 < 0 || index2 > select.length - 1 ) 
		return false;
	
	var v1 = new Option(select.options[index1].text, select.options[index1].value);
	var v2 = new Option(select.options[index2].text, select.options[index2].value);
	select.options[index1] = v2;
	select.options[index2] = v1;
	return true;
}


/**
 * for benchmarks
 */
function start_chrono() {
	var d = new Date();
	global_time = d.getTime();
	global_chrono = new Array();
}

function set_chrono(id) {
	if (!global_time)
		start_chrono();
	var d = new Date();
	global_chrono.push([id, d.getTime() - global_time]);
	global_time = d.getTime();
}

function print_chrono() {
	var txt = "";
	for (var i=0; i<global_chrono.length; ++i) {
		txt = txt + global_chrono[i][0] + ' : ' + global_chrono[i][1] + '\n';
	}
	return txt;
}

/**
 * format a phone number to french style
 * client side of python libcommon.common.format_fr_phone() function
 */

function format_fr_phone(sqltext) {
	if (sqltext.length == 0) return sqltext;
	var f_fr, begin;
	if (sqltext[0] == '+' && sqltext.length % 2 == 0) {
		f_fr = sqltext.substring(0, 3) + ' ' + sqltext.substring(3, 4);
		begin = 4;
	} else if (sqltext[0] == '+') {
		f_fr = sqltext.substring(0, 3);
		begin = 3;
	} else if (sqltext.length % 2 == 1){
		f_fr = sqltext.substring(0, 1);
		begin = 1;
	} else {
		f_fr = sqltext.substring(0, 2);
		begin = 2;
	}
	for (var i = begin; i<sqltext.length; i+=2) {
		f_fr += ' ' + sqltext.substring(i, i+2);
	}
	return f_fr;
}
function format_all_fr_phone(name) {
	els = document.getElementsByName(name);
	for (var i=0; i<els.length; i++) {
		els[i].value = format_fr_phone(els[i].value);
	}
}


/* true if the string is an object */
function objExists(name) {
	var ret = null;
	eval("if (typeof "+name+" != 'undefined') ret = "+name);
	return ret;
}

