$(function() {

    var str_cellule = "";

    function calendrier(mois, an) {
        var str_calendar = "";
        nom_mois = new Array("Janvier", "F&eacute;vrier", "Mars", "Avril", "Mai", "Juin", "Juillet",
            "Ao&ucirc;t", "Septembre", "Octobre", "Novembre", "D&eacute;cembre");
        jour = new Array("Lu", "Ma", "Me", "Je", "Ve", "Sa", "Di");

        var police_entete = "Verdana,Arial"; /* police entête de calendrier  */
        var taille_pol_entete = 3; /* taille de police 1-7 entête de calendrier  */
        var couleur_pol_entete = "BLACK"; /* couleur de police entête de calendrier  */
        var arrplan_entete = "#FFFFFF"; /* couleur d'arrière plan entête de calendrier  */
        var police_jours = "Verdana,Arial"; /* police affichage des jours  */
        var taille_pol_jours = 3; /* taille de police 1-7 affichage des jours  */
        var coul_pol_jours = "#000000"; /* couleur de police affichage des jours  */
        var arrplan_jours = "#FFFFFF"; /* couleur d'arrière plan affichage des jours  */
        var couleur_dim = "red"; /* couleur de police pour dimanches  */
        var couleur_cejour = "#FFFF00"; /* couleur d'arrière plan pour aujourd'hui  */

        var maintenant = new Date();
        var ce_mois = maintenant.getMonth();
        var cette_annee = maintenant.getYear();
        if (ce_mois != 11) {
            ce_mois = maintenant.getMonth() + 1;
        } else {
            ce_mois = 1;
            cette_annee = maintenant.getYear() + 1;
        }
        if (cette_annee < 999) cette_annee += 1900;
        var ce_jour = maintenant.getDate();
        var temps = new Date(an, mois - 1, 1);
        var Start = temps.getDay();
        if (Start > 0) Start--;
        else Start = 6;
        var Stop = 31;
        if (mois == 4 || mois == 6 || mois == 9 || mois == 11) --Stop;
        if (mois == 2) {
            Stop = Stop - 3;
            if (an % 4 == 0) Stop++;
            if (an % 100 == 0) Stop--;
            if (an % 400 == 0) Stop++;
        }
        str_calendar += '<table class="calendrier" cellpadding="1" cellspacing="0" width="100%">';
        var entete_mois = nom_mois[mois - 1] + " " + an;
        str_calendar += inscrit_entete(entete_mois, arrplan_entete, couleur_pol_entete, taille_pol_entete, police_entete, mois, an);
        var nombre_jours = 1;
        for (var i = 0; i <= 5; i++) {
            str_calendar += "<tr>";
            for (var j = 0; j <= 5; j++) {
                if ((i == 0) && (j < Start))
                    str_calendar += inscrit_cellule("&#160;", arrplan_jours, coul_pol_jours, taille_pol_jours, police_jours, mois, an);
                else {
                    if (nombre_jours > Stop)
                        str_calendar += inscrit_cellule("&#160;", arrplan_jours, coul_pol_jours, taille_pol_jours, police_jours, mois, an);
                    else {
                        if ((an == cette_annee) && (mois == ce_mois) && (nombre_jours == ce_jour))
                            str_calendar += inscrit_cellule(nombre_jours, couleur_cejour, coul_pol_jours, taille_pol_jours, police_jours, mois, an);
                        else
                            str_calendar += inscrit_cellule(nombre_jours, arrplan_jours, coul_pol_jours, taille_pol_jours, police_jours, mois, an);
                        nombre_jours++;
                    }
                }
            }
            if (nombre_jours > Stop)
                str_calendar += inscrit_cellule("&#160;", arrplan_jours, couleur_dim, taille_pol_jours, police_jours, mois, an);
            else {
                if ((an == cette_annee) && (mois == ce_mois) && (nombre_jours == ce_jour))
                    str_calendar += inscrit_cellule(nombre_jours, couleur_cejour, couleur_dim, taille_pol_jours, police_jours, mois, an);
                else
                    str_calendar += inscrit_cellule(nombre_jours, arrplan_jours, couleur_dim, taille_pol_jours, police_jours, mois, an);
                nombre_jours++;
            }
            str_calendar += "</tr>";
        }
        str_calendar += "</table>";
        return str_calendar;
    } //end function calendrier.

    function inscrit_entete(titre_mois, couleurAP, couleurpolice, taillepolice, police, mois, an) {
        var str_entete = ""
        str_entete += "<tr>";
        str_entete += '<td align="center" colspan="7" valign="top" bgcolor="' + couleurAP + '">';
        str_entete += '<font size="' + taillepolice + '" color="' + couleurpolice + '" face="' + police + '"><b>';
        str_entete += titre_mois;
        str_entete += "</b></font></td></tr>";
        str_entete += "<tr>";
        for (var i = 0; i <= 6; i++)
            str_entete += inscrit_cellule(jour[i], couleurAP, couleurpolice, taillepolice, police, mois, an);
        str_entete += "</tr>";
        return str_entete;
    }

    function inscrit_cellule(contenu, couleurAP, couleurpolice, taillepolice, police, mois, an) {
        var str_cell = "";
        str_cell += '<td style="border:1px solid #FFFFFF;background-color:#f7f4fb" class="jour" align="left" valign="top" bgcolor="' + couleurAP + '" td_date="' + format_chiffre(contenu) + '-' + format_chiffre(mois) + '-' + an + '">';
        str_cell += '<font size="' + taillepolice + '" color="' + couleurpolice + '" face="' + police + '"><b>';
        str_cell += contenu;
        str_cell += "</b></font></td>";
        return str_cell;
    }

    function format_chiffre(nombre) {
        var zero = "";
        if (nombre < 10) {
            zero = "0";
        }
        return zero + nombre;
    }

    /*Pour supprimer des dates de la selection*/
    var click_rm_date = function(event) {
        $(this).parent().remove()
        var $textarea = event.data.obj;
        var currdate = event.data.currdate;
        $textarea.val($textarea.val().replace(currdate + ",", ""));
    }

    // General method to get elements thanks to regex !
    // sample : $('div:regex(class,jqTable[0-9]_.*)'); */
    $.expr[':'].regex = function(elem, index, match) {
        var matchParams = match[3].split(','),
            validLabels = /^(data|css):/,
            attr = {
                method: matchParams[0].match(validLabels) ?
                    matchParams[0].split(':')[0] : 'attr',
                property: matchParams.shift().replace(validLabels, '')
            },
            regexFlags = 'ig',
            regex = new RegExp(matchParams.join('').replace(/^s+|s+$/g, ''), regexFlags);
        return regex.test(jQuery(elem)[attr.method](attr.property));
    }
    // End of General method to get elements thanks to regex!
    function escapeRegExp(text) {
        return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    }
    var $items = $("div.calendrier ul li");
    var d = new Date();
    var dm = d.getMonth();
    var dan = d.getYear();
    if (dm != 11) {
        dm = d.getMonth() + 2;
    } else {
        dm = 1;
        dan = d.getYear() + 1;
    }
    if (dan < 999) dan += 1900;
    var $calendar = calendrier(dm, dan);
    $('div.calendrier').append($calendar);
    $items.each(function() {
        var span = ("span", $(this)).html();
        span = span.replace(/;/g, "<br>");
        span = span.replace(/\[/g, "<b style='white-space:nowrap;background-color:transparent;display:inline-block;margin-left:-10px'>");
        span = span.replace(/\]/g, "</b>");
        $(this).html(span)
        $(this).css("display", "block");
        var $input = $("input", this);
        var allow_mult = $input.attr('id').indexOf('mult');
        // if we don't find mult in id so we can select only ONE item per date.
        if (allow_mult == -1) {
            if ($input.prop('checked') == true) {
                // set background-color if they are already checked items
                $(this).css("background-color", "#def6db");
            }
            $input.bind('click', {
                test: $(this)
            }, function(event) {
                var str_date = $(this).attr('name').split('_')[1];
                var $inputs = ('input', $items).find(':regex(name,.*' + str_date + '.*)');
                $inputs.each(function() {
                    $(this).prop("checked", false);
                    $(this).closest("li").css("background-color", "transparent");
                });
                $(this).prop("checked", true);
                $(this).closest("li").css("background-color", "#def6db");
            });
        }
        var item_date = $input.attr("id").split('_')[2];
        $("table.calendrier td[td_date='" + item_date + "']").append($(this));
        if ($input.attr("id").indexOf("exception") != -1) {
            $(this).css({
                'color': 'red',
                'margin-top': '0.5em',
                'text-align': 'center'
            });
            $input.remove();
        }
    });
}); /* end */
