function remove_accents(s) {
    var ko = 'ÀÁÂÃÄÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÇçàáâãèéêëîïòôõöùúûü';
    var ok = 'AAAAAEEEEIIIIOOOOOUUUUCcaaaaeeeeiioooouuuu';
    var len = s.length;
    var p;
    var c;
    var result = "";
    for (var i = 0; i < len; i++) {
        c = s.charAt(i);
        p = ko.indexOf(c);
        result += p == -1 ? c : ok.charAt(p);
    }
    return result;
}

function current_date() {
	var dt = new Date();
	var d = dt.getDate();
	if (d < 10) d = "0" + d;
	var m = dt.getMonth() + 1;
	if (m < 10) m = "0" + m;
	var y = dt.getFullYear();
    return d + "/" + m + "/" + y;
}

function current_date_and_time() {
	var dt = new Date();
	var d = dt.getDate();
	if (d < 10) d = "0" + d;
	var m = dt.getMonth() + 1;
	if (m < 10) m = "0" + m;
	var y = dt.getFullYear();
    
    var h = dt.getHours();
    if (h < 10) h = "0" + h;
    var min = dt.getMinutes();
    if (min < 10) min = "0" + min;
    return d + "/" + m + "/" + y + " " + h + ":" + min;
}

function recalculate_datesets(formname, fieldname, count) {
    var check_field;
    var date_field;
    var now = current_date();
    var hidden_field = $('#id_hidden_field_' + formname + '_' + fieldname);
    var values = [];
    for (var i = 1; i <= count; i++) {
        check_field = $('#id_field_check_' + i + '_' + formname + '_' + fieldname);
        date_field = $('#id_field_date_' + i + '_' + formname + '_' + fieldname);
        if (check_field.is(':checked')) {
            //Coché
            if (date_field.is(':disabled')) date_field.attr('disabled', false);
            if (date_field.val() == "") date_field.val(now);
            values.push(date_field.val());
        }
        else {
            //Non coché
            if (!date_field.is(':disabled')) date_field.attr('disabled', true);
            if (date_field.val() != "") date_field.val("");
            values.push("");
        }
    }
    hidden_field.val(values.join("|"));
}


function fab_hint(element_id, html) {
    $('#fab_hint').remove();
    $('body').append('<div id="fab_hint"></div>');
	var o = $('#' + element_id).offset();
	var h = $('#' + element_id).outerHeight();
	$('#fab_hint').css('left', o.left).css('top', o.top + h + 5).html(html).show();
	return false;
}
function fab_hide() {
	$('#fab_hint').hide();
	return false;
}

function parse_comment(s) {
    //Date
	var dt = s.substr(0, 10);
	if (!dt.match(/^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]$/)) return ['', '', s];
	s = s.substr(11);

    //Heure ?
    var time = s.substr(0, 5);
    if (time.match(/^[0-9][0-9][:][0-9][0-9]$/)) {
        dt += " " + time;
        s = s.substr(6);
    }

    //User
	var p = s.indexOf(" ");
	if (p == -1) return [dt, '', s];
	var user = s.substr(0, p);
	if (!s.toLowerCase().match(/[a-z0-9_]+/)) return [dt, '', s];
	s = s.substr(p + 1);
	return [dt, user, s];
}

function prefix_comment(s) {
    var dt = current_date_and_time();
	var user_login = $('#id_user_login').text();
	return dt + " " + user_login + " " + s;
}

function draw_comments(formname, fieldname) {
	var field = $('#id_comment_field_' + formname + "_" + fieldname);
	var div = $('#id_comment_div_' + formname + "_" + fieldname);
	var value = field.val();
	
	var values = value ? value.split('|') : [];
	var len = values.length;
	var data = '';
	for (var i = 0; i < len; i++) {
		value = values[i];
		data += '<a href="#" onclick="edit_comment(\''+formname+'\', \''+fieldname+'\', '+i+');" id="id_comment_'+formname+'_'+fieldname+'_'+i+'" onmouseover="see_comment(\''+formname+'\', \''+fieldname+'\', '+i+');" onmouseout="fab_hide();" style="display: block; padding: 3px; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">';
		value = parse_comment(value);
		data += '<b>' + value[0].substr(0, 5) + '</b> ' + value[2];
		data += '</div>';
	}
	div.html(data);
	return false;
}


function send_add_comment(value, names) {
    value = value.replace('|', ' ');
	value = prefix_comment(value);
	names = names.split("|");
	var field = $('#id_comment_field_' + names[0] + "_" + names[1]);
	var values = field.val();
	values = values ? values = value + "|" + values : value;
	field.val(values);
	draw_comments(names[0], names[1]);
	return false;
}

function send_modify_comment(value, names) {
    value = value.replace('|', ' ');
	names = names.split("|");
	var index = parseInt(names[2], 10);
	if (!value) return delete_comment(names[0], names[1], index);
	value = prefix_comment(value);
	var field = $('#id_comment_field_' + names[0] + "_" + names[1]);
	var values = field.val().split("|");
	values[index] = value;
	field.val(values.join("|"));
	draw_comments(names[0], names[1]);
	return false;
}

function add_comment(formname, fieldname) {
	multiline_input_box("Ajouter un commentaire", "Saisissez un commentaire à ajouter à la liste", "", send_add_comment, formname + "|" + fieldname);
}

function edit_comment(formname, fieldname, index) {
	var field = $('#id_comment_field_' + formname + "_" + fieldname);
	var values = field.val().split('|');
	var value = parse_comment(values[index]);
	multiline_input_box("Modifier le commentaire", "Effacez tout le texte pour supprimer le commentaire", value[2], send_modify_comment, formname + "|" + fieldname + "|" + index);
}

function see_comment(formname, fieldname, index) {
	var element_id = 'id_comment_'+formname+'_'+fieldname+'_'+index;
	var field = $('#id_comment_field_' + formname + "_" + fieldname);
	var values = field.val().split('|');
	var value = parse_comment(values[index]);
	var date = value[0];
	var user = value[1];
	var comment = value[2];
	value = "";
	if (date) value += '<span class="comment_date">'+date+'</span> ';
	if (user) value += '<span class="comment_user">par '+user+'</span>';
	if (date || user) value += '<br/>';
	value += comment.replace("\n", "\n<br/>");
	fab_hint(element_id, value);
	return false;
}

function delete_comment(formname, fieldname, index) {
	var field = $('#id_comment_field_' + formname + "_" + fieldname);
	var values = field.val().split('|');
	values.splice(index, 1);
	field.val(values.join('|'));
	draw_comments(formname, fieldname);
	return false;
}

function mark_fields(form_id, fields) {
	fields = fields.split(",");
	var len = fields.length;
	var object_id;
	for (var i = 0; i < len; i++) {
		object_id = '#' + form_id + " [name=" + fields[i] + "]";
		$(object_id).addClass('field_in_error');
		$(object_id).change(function() {
			$(this).removeClass('field_in_error');
		});
	}
}

function go_home() {
	top.location.href = 'index.php';
}

function list_set_update(field_name) {
    $('#id_display_field_' + field_name).val($('#id_listset_field_' + field_name + ' input:checked').map(function() {return this.title;}).get().join(', '));
}

function display_below(f1, f2) {
    var dim = $('#' + f2).position();
    var height = $('#' + f2).height();
    $('#' + f1).css('left', dim.left).css('top', dim.top + height + 10).toggle();
}

function display_below_absolute(f1, f2) {
    var dim = $('#' + f2).offset();
    var height = $('#' + f2).height();
    $('#' + f1).css('left', dim.left).css('top', dim.top + height + 10).toggle();
}

function enc(s) {
  var len = s.length;
  var s2 = "";
  var ascii = 0;
  var c = "";
  for (var i = 0; i < len; i++) {
    c = s.charAt(i);
    ascii = s.charCodeAt(i);
    if ( (ascii >= 48 && ascii <= 57) || (ascii >= 65 && ascii <= 90) || (ascii >= 97 && ascii <= 122) ) s2 += c;
    else {
      if (ascii < 10) ascii = "00" + ascii;
      else ascii = ascii < 100 ? "0" + ascii : ascii;
      s2 += "_" + ascii;
    }
  }
  return s2;
}

function dec(s) {
  if (s == "" || s == undefined) return "";
  var len = s.length;
  var s2 = "";
  var c = "";
  var code = "";
  for (var i = 0; i < len; i++) {
    c = s.charAt(i);
    if (c == "_") {
      code = s.charAt(i + 1) + s.charAt(i + 2) + s.charAt(i + 3);
      c = String.fromCharCode(parseInt(code, 10));
      i += 3;
    }
    s2 += c;
  }
  return s2;
}

/**
 * Affiche une boite de saisie
 * @param title Titre de la boîte de dialogue
 * @param html Code HTML à afficher avant le champ de saisie
 * @param default_value Valeur à placer dans le champ de saisie
 * @param function_if_ok Fonction de callback à appeler si l'utilisateur clique sur OK
 * @param param2 Paramètre supplémentaire à passer à function_if_ok
*/
function input_box(title, html, default_value, function_if_ok, param2) {
    $('#dialog').remove()
    $('body').append('<div id="dialog"></div>');
    $('#dialog').dialog({
        autoOpen: false,
        modal: true,
        width: 600,
        buttons: {}
    });
    var dialog_buttons = $('#dialog').dialog('option', 'buttons');
    dialog_buttons["Annuler"] = function() {$(this).dialog("close");};
    dialog_buttons["OK"] = function() {var input_value = document.getElementById('id_input_box_value').value;$(this).dialog("close");function_if_ok(input_value, param2)};
    $('#dialog').dialog('option', 'buttons', dialog_buttons);
    html = '<div style="float: left; margin: 10px"><img src="images/icon_question.png"></div><div style="margin: 10px 10px 10px 80px">' + html + '<br/><input type="text" style="width: 90%" id="id_input_box_value" name="input_box_value" value="'+default_value+'" /></div><div style="clear: both"></div>';
    $('#dialog').dialog("option", "title", title).html(html).dialog('open');
}

/**
 * Affiche une boite de saisie
 * @param title Titre de la boîte de dialogue
 * @param html Code HTML à afficher avant le champ de saisie
 * @param default_value Valeur à placer dans le champ de saisie
 * @param function_if_ok Fonction de callback à appeler si l'utilisateur clique sur OK
 * @param param2 Paramètre supplémentaire à passer à function_if_ok
*/
function multiline_input_box(title, html, default_value, function_if_ok, param2) {
    $('#dialog').remove();
    $('body').append('<div id="dialog"></div>');
    $('#dialog').dialog({
        autoOpen: false,
        modal: true,
        width: 600,
        buttons: {}
    });
    var dialog_buttons = $('#dialog').dialog('option', 'buttons');
    dialog_buttons["Annuler"] = function() {$(this).dialog("close");};
    dialog_buttons["OK"] = function() {var input_value = document.getElementById('id_input_box_value').value;$(this).dialog("close");function_if_ok(input_value, param2)};
    $('#dialog').dialog('option', 'buttons', dialog_buttons);
    html = '<div style="float: left; margin: 10px"><img src="images/icon_question.png"></div><div style="margin: 10px 10px 10px 80px">' + html + '<br/><textarea style="width: 90%; height: 200px" id="id_input_box_value" name="input_box_value">'+default_value+'</textarea></div><div style="clear: both"></div>';
    $('#dialog').dialog("option", "title", title).html(html).dialog('open');
}


/**
 * Affiche une boite de dialogue
 * @param title Titre de la boîte de dialogue
 * @param html Code HTML à afficher dans la boîte de dialogue
 * @param icon Nom de l'icône à afficher ("" ou question ou info ou warning)
*/
function msg_box(title, html, icon) {
    $('#dialog').remove();
    $('body').append('<div id="dialog"></div>');
    $('#dialog').dialog({
        autoOpen: false,
        modal: true,
        width: 600,
        buttons: {}
    });
    var args = msg_box.arguments;
    var len = args.length;
    var dialog_buttons = $('#dialog').dialog('option', 'buttons');

    if (len == 3) {
        dialog_buttons["OK"] = function() {$(this).dialog("close");};
    }
    else if (len == 4) {
        dialog_buttons["OK"] = function() {$(this).dialog("close");args[3]()};
    }
    else {
        var parameter = args[len - 1];
        if (len >= 6) {
            var button_name = args[3];
            dialog_buttons[button_name] = function() {$(this).dialog("close");if (args[4] != "") args[4](parameter)};
        }
        if (len >= 8) {
            button_name = args[5];
            dialog_buttons[button_name] = function() {$(this).dialog("close");if (args[6] != "") args[6](parameter)};
        }
        if (len >= 10) {
            button_name = args[7];
            dialog_buttons[button_name] = function() {$(this).dialog("close");if (args[8] != "") args[8](parameter)};
        }
        if (len >= 12) {
            button_name = args[9];
            dialog_buttons[button_name] = function() {$(this).dialog("close");if (args[10] != "") args[10](parameter)};
        }
    }

   $('#dialog').dialog('option', 'buttons', dialog_buttons);
    if (icon != "") html = '<div style="float: left; margin: 10px"><img src="images/icon_' + icon + '.png"></div><div style="margin: 10px 10px 10px 80px">' + html + '</div><div style="clear: both"></div>';
    $('#dialog').dialog("option", "title", title).html(html).dialog('open');
}

function check_disconnected(data) {
    if (data == '0-disconnected') {
        msg_box("Vous n'êtes plus connecté", "Il n'y a pas eu d'action de votre part depuis plus de 20 minutes.<br/>Pour des raisons de sécurité, merci de vous identifier à nouveau", "info", go_home);
        return true;
    }
    return false;
}

/**
 * Affichage d'un message de type "warning"
 * @param title titre du message (dans la barre de titre)
 * @param html contenu du message
 */
function WarningBox(title, html) {
    msg_box(title, html, "warning");
}

function string_replace(string, text, by) {
	string = string + "";
	var result = "";
	var slen = string.length;
	var len = text.length;
	var pos = string.indexOf(text);
	while (pos > -1) {
		result += string.substring(0, pos) + by;
		string = string.substring(pos + len, slen);
		pos = string.indexOf(text);
	}
	if (string != "") result += string;
	return result;
}

function numberIsZero(v) {
	return Math.abs(v) < 0.000001;
}

function forCalc(v) {
  v = string_replace(v, " ", "");
  v = string_replace(v, ",", ".");
  v = parseFloat(v);
  if (isNaN(v)) return 0;
  else return v;
}

function ltrim(s, chars) {
	s = s.toString();
	var len = s.length;
	if (!len) return "";
	var p = 0;
	var c;
	while (p < len) {
		c = s.charAt(p);
		if (chars.indexOf(c) == -1) break;
		p++;
	}
	return s.substr(p);
}

function rtrim(s, chars) {
	s = s.toString();
	var len = s.length;
	if (!len) return "";
	var p = len - 1;
	var c;
	while (p >= 0) {
		c = s.charAt(p);
		if (chars.indexOf(c) == -1) break;
		p--;
	}
	return s.substr(0, p + 1);
}

function trim(s) {
	return ltrim(rtrim(s));
}


function forDisplay(num) {
    num = num.toString();
	var negative = num.indexOf("-") > -1;
    num = string_replace(num, ",", ".");
    num = num.replace(/[^0-9.]+/, '');
    if (isNaN(num) || !num) return "0,00";

	var p = num.lastIndexOf(".");
	var ipart;
	var fpart;
	if (p > -1) {
		//Séparateur décimal
		ipart = num.substr(0, p);
		fpart = num.substr(p + 1);
	}
	else {
		ipart = num;
		fpart = "00";
	}
	ipart = ltrim(string_replace(ipart, '.', ''), "0");

	if (fpart.length > 2) {
		fpart = rtrim(fpart, "0");
	}
	while (fpart.length < 2) fpart += "0";
	if (ipart == "") ipart = "0";

	//On sépare par blocs de 3 chiffres
    for (var i = 0; i < Math.floor((ipart.length - (1 + i)) / 3); i++)
        ipart = ipart.substring(0, ipart.length - (4 * i + 3)) + ' ' + ipart.substring(ipart.length-(4 * i + 3));
    return ((negative) ? '-' : '') + ipart + ',' + fpart;
}

function check_float(field) {
    field.value = forDisplay(forCalc(field.value));
}

function check_int(field) {
    var i = parseInt(field.value, 10);
    if (isNaN(i)) field.value = "0";
    else field.value = i + "";
}

function format_phone(jq_field) {
    var v = jq_field.val();
    v = string_replace(v, '.', ' ');
    v = string_replace(v, ',', ' ');
    v = string_replace(v, '-', ' ');
    if (v.length == 10)
        v = v.substr(0, 2) + " " + v.substr(2, 2) + " " + v.substr(4, 2) + " " + v.substr(6, 2) + " " + v.substr(8, 2);
    jq_field.val(v);
}

function format_time(field) {
    var v = field.value;
    v = v.replace(/[^0-9:.h]/gi, '');
    var parts;
    if (v.match(/^[0-2]*[0-9][0-5][0-9]$/)) {
        parts = new Array();
        if (v.length == 4) {
            parts[0] = v.substr(0, 2);
            parts[1] = v.substr(2);
        }
        else {
            parts[0] = v.substr(0, 1);
            parts[1] = v.substr(1);}
    }
    else {
        v = v.replace(/[.h]/gi, ':');
        parts = v.split(':');
    }
    var h = parseInt(parts[0], 10);
    var m = parseInt(parts[1], 10);
    if (isNaN(h)) h = 0;
    if (isNaN(m)) m = 0;
    if (h > 23) h = 23;
    if (m > 59) m = 59;
    h = h < 10 ? "0" + h : h + "";
    m = m < 10 ? "0" + m : m + "";
    field.value = h + ":" + m;
    return false;
}

function format_date(field) {
    var v = field.value;
    if (v == '') return false;
    var CurrentDate = new Date();
    var current_day = CurrentDate.getDate();
    var current_month = CurrentDate.getMonth() + 1;
    var current_year = CurrentDate.getFullYear();
    var century = 100 * Math.round(current_year / 100);

    v = string_replace(v, '.', '/');
    v = string_replace(v, ' ', '/');
    v = string_replace(v, '-', '/');
    v = v.split("/");
    var d = parseInt(v[0], 10);
    var m = parseInt(v[1], 10);
    var y = parseInt(v[2], 10);
    if (y < 100) y += century;
    if (isNaN(d) || d < 1 || d > 31) d = current_day;
    if (isNaN(m) || m < 1 || m > 12) m = current_month;
    if (isNaN(y) || y < 1900 || y > 999999) y = current_year;
    d = d < 10 ? "0" + d : d + "";
    m = m < 10 ? "0" + m : m + "";
    y += "";
    field.value = d + "/" + m + "/" + y;
    return false;
}

function parse_json(data) {
    return typeof JSON != 'undefined' ? JSON.parse(data) : eval('('+data+')');
}

/**
*
*  AJAX IFRAME METHOD (AIM)
*  http://www.webtoolkit.info/
*
**/
 
AIM = {
 
	frame : function(c) {
 
		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		document.body.appendChild(d);
 
		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}
 
		return n;
	},
 
	form : function(f, name) {
		f.setAttribute('target', name);
	},
 
	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},
 
	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}
 
		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
 
}

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
//Adds indexOf to arrays in Internet Explorer
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
