(function($){
$(document).ready(function() {
    //On fix les soucis de la balise ABBR
    //Code repris de IE7.js de Dean Edwards celui-ci n'étant pas inclus sur la page de l'agenda
    //Pour IE6 et si le JS IE7 n'est pas présent
    if(!window.IE7 && $.browser.msie && $.browser.version == '6.0') {
        var $PREFIX = (appVersion < 5.5) ? "HTML:" : "";
        var appVersion = navigator.appVersion.match(/MSIE (\d\.\d)/)[1];
        function _fixElement($element) {
        	var $fixedElement = document.createElement("<" + $PREFIX + $element.outerHTML.slice(1));
        	if ($element.outerHTML.slice(-2) != "/>") {
        		// remove child nodes and copy them to the new $element
        		var $$endTag = "</"+ $element.tagName + ">", $nextSibling;
        		while (($nextSibling = $element.nextSibling) && $nextSibling.outerHTML != $$endTag) {
        			$fixedElement.appendChild($nextSibling);
        		}
        		// remove the closing tag
        		if ($nextSibling) $nextSibling.removeNode();
        	}
        	// replace the broken tag with the namespaced version
        	$element.parentNode.replaceChild($fixedElement, $element);
        };

        $("abbr").each(function(){
            _fixElement(this);
        });
    }

    //Draggable : Evenement
    $(".evenement")
    .filter(".editable")
    .Draggable({
        zIndex : 1000,
        ghosting : true,
	    opacity : 0.5,
	    fx : 300,
	    revert : true,
        //Quand le drag de l'élémént commence
        onStart : function(el,x,y) {
            //On calcule la limite en fonction de la durée de l'événement déplacé
            //Pour éviter de déplacer à 19H un événement qui dure 12H alors qu'on ne va que jusqu'à 20H
            var limit = 24 - $(el).data().duree;
            
            //On masque la tooltip
            $("div.tooltip").hide();

            //On parcours les lignes de l'agenda en ignorant les deux premières
            $("#agenda tr:gt(4)").each(function(i){
                //Si on n'a pas dépassé la limite
                if(i <= limit) {
                    //Pour chaque celulle de la ligne exceptée la première, on la définie droppable
                    $(this).find("td").not(".first-child").Droppable({
                        accept : "editable",
                		hoverclass:	"dropzone-hover",
                        tolerance: "intersect",
                        //Quand l'élément déplacé est droppé sur la cellule
                		ondrop:	function(drag) {
                            var dropZone = this;
                            var parentTimestamp = $(drag).parent().data().timestamp;
                            var dropZoneTimestamp = $(dropZone).data().timestamp;
                            var dropZoneTableMap = $(dropZone).data().tableMap;
                    
                            //On vérifie qu'il a bien été dropé dans une autre cellule que celle d'origine
                            if(parentTimestamp != dropZoneTimestamp) {
                                //On fait disparaitre l'objet d'origine
                                $(drag).fadeOut("normal",function(){
                                    //On détermine l'url de mise à jour
                                    var majUrl = HTTP_MAIN + 'agenda/ajaxModifierEvenement/id/';
                                    majUrl += $(this).data().id + '/date_debut/' + dropZoneTimestamp;

                                    //On bloque l'UI
                                    $.blockUI();

                                    //On met à jour l'événement dans la base de donnée
                                    $.ajax({
                                        url : majUrl,
                                        type : "GET",
                                        dataType : "json",
                                        success : function(success){
                                            $.unblockUI();
                                            //Si la maj est un succès
                                            if(success) {
                                                $(drag).remove().prependTo(dropZone).show();

                                                //On détermine les nouveaux horaires
                                                var heureTextStart = $("#agenda tr:eq(" + (dropZoneTableMap.line + 5) + ") td:first").text();
                                                var heureHcalStart = $("#agenda tr:eq(" + (dropZoneTableMap.line + 5) + ") td:eq(" + (dropZoneTableMap.cell + 1) + ")").data().hcalTime;
                                                var heureTextEnd = $("#agenda tr:eq(" + (dropZoneTableMap.line + 5 + $(drag).data().duree) + ") td:first").text();
                                                var heureHcalEnd = $("#agenda tr:eq(" + (dropZoneTableMap.line + 5 + $(drag).data().duree) + ") td:eq(" + (dropZoneTableMap.cell + 1) + ")").data().hcalTime;

                                                //On met à jour
                                                $("abbr.dtstart",drag).text(heureTextStart).attr("title",heureHcalStart);
                                                $("abbr.dtend",drag).text(heureTextEnd).attr("title",heureHcalEnd);

                                                //On recréer la tooltip avec les nouvelles infos
                                                createTooltip(drag);
                                            } else {
                                                $(drag).show();
                                                setTimeout(function(){
                                                    alertDialog();
                                                },800);
                                            }
                                        }
                                    });
                                });
                            }
                        }
                    });
                }
            });
        },
        //Quand le drag de l'élément se termine
        onStop : function() {
            $("#agenda td").DroppableDestroy();
            $("div.tooltip").show();
            $("div.prototip").hide();
        }
    });
    
    //Gestion du double click
    //On définit un namespace pour que ctrl_down n'ai aucun risque d'être écrasée
    (function() {
        var ctrl_down = false;

        //On gère l'appuie de la touche CTRL
        $(document).keydown(function(e){
            if(e.keyCode == 17) {
                ctrl_down = true;
            }
        }).keyup(function(e){
            if(e.keyCode == 17) {
                ctrl_down = false;
            }
        });
        
        //Suppression
        $("div.supprimable")
        .dblclick(function(){
            if(!ctrl_down) {
                if(confirm("Êtes-vous sûre de vouloir supprimer : " + $("h2:first",this).text())) {
                    var id = $(this).attr("id");
                    
                    do {
                        $("#" + id).unbind("dblclick").remove();
                    } while($("#" + id).size() > 0);
                    
                    $.ajax({url:HTTP_MAIN + 'agenda/ajaxSupprimerEvenement/id/' + $(this).data().id,type:"GET"});
                }

                ctrl_down = false;
            }
        });

        //Validation
        $("div.validable")
        .dblclick(function(){
            if(ctrl_down) {
                if(confirm("Êtes-vous sûre de vouloir valider : " + $("h2:first",this).text())) {
                    $(this).unbind("dblclick");
                    
                    //Gestion de l'action a effectué sur la validation
                    if($(this).data().onValidate == 'remove') {
                        $(this).DraggableDestroy().remove();
                    } else {
                        $(this).removeClass("editable").addClass("valider").DraggableDestroy();
                    }
                    
                    $.ajax({url:HTTP_MAIN + 'agenda/ajaxValiderEvenement/id/' + $(this).data().id,type:"GET"});
                }

            ctrl_down = false;
            }
        });
    })();

    //Fonction pour créer la tooltip
    function createTooltip(element) {
        var content = jQuery("div.information", element).html();

        if(content) {
            new Tip(element,content, {
                className: 'agenda',
                delay: 0,
                effect: "appear",
                duration: 0.3,
                title: false,
                viewport: true
        });
        }
    }

    //Tooltip
    $("div.evenement")
    .add("div.ressource")
    .add("div.evenement-demi-journee")
    .add("div.evenement-jours")
    .each(function() {
        createTooltip(this);
    });
});
})(jQuery);

