// Scripts de déplacement des modules comme sur iGoogle, en javascript intuitif pour l'utilisateur (pas pour le programmeur :D )
var id;					// id du module dans la table user_module

var html_module;			// contenu du module en milieu de page
var current_module;

var dragging;				// indique si on est en train de déplacer un module ou pas
var modules_y;				// hauteur de tous les modules de la page

var original_width;
var original_height;


$(document).ready(function(){
	// Initialisation :
	$("body").append('<div id="ghost_modules"></div>');
	// Génération d'un panneau de débug :
	
	
	// On cache les flèches de déplacement javascript
	init();
	$("body").mousedown(function(e) {
	   if(dragging)
	       disable_selection();
	});
	$("body").mousemove(function(e){
		if(dragging){
			// Le module fantôme suit au pixel près le curseur :
			$("#ghost_modules").css('top',e.pageY+2).css('left',e.pageX-deltax);
			// La colonne est déterminée de façon asynchrone, donc maintenant on positionne le bloc dans la colonne désirée selon l'emplacement
			// des autres blocs :
			move_current_place = find_place(move_current_column,e.pageY);
			if(move_current_place != -1){
				$("#shadow_module").show();
				if(old_column != move_current_column || old_place != move_current_place)
				{
                    // Insertion de l'ombre à la place déterminée
                    insert_at_current_place($("#shadow_module"),move_current_column,move_current_place);
                    // L'ombre de ce module se positionne là où il faudra positionner le module si l'utilisateur clique
                    // Mémorisation des anciens paramètres pour ne pas répéter des actions inutiles :
                    old_column = move_current_column;
                    old_place = move_current_place;
				}
			}
			else
                $("#shadow_module").hide();
		}
	});
	
	// On active des effets de hover sur les colonnes pour déterminer quelle colonne est survolée par le curseur
	$("#modules_topbar").hover(function(){set_column(0);},function(){});
	$("#modules_col1").hover(function(){set_column(1);},function(){});
	$("#modules_col2").hover(function(){set_column(2);},function(){});
	$("#rightmenu").hover(function(){set_column(3);},function(){});

	// On active l'évènement de lâché :
	$("body").mouseup(function(){
		if(dragging && move_current_place != -1){
	       $("#modules_topbar").css({'background-color' :topbar_anscolor});
	       $("#modules_col1").css({'background-color' : col1_anscolor});
	       $("#modules_col2").css({'background-color' : col2_anscolor});
	       $("#rightmenu").css({'background-color' :rightmenu_anscolor});
		
            enable_selection();
			dragging = false;
			// On applique les modifications :
			//$("#shadow_module").html('loading...');
            		
			if((move_current_column == original_column && move_current_place<original_place) || move_current_column != original_column )
                new_place = move_current_place +1;
            else
                new_place = move_current_place;
			
			if(original_place != move_current_place || move_current_column != original_column)
                $.get("index.php?a=move_module_ajax&light_page=true&id_module="+recuperer_id(id)+"&new_column="+move_current_column+"&new_place="+new_place,update);
            else
                update('');
		}
	});
});
// Fonction d'initialisation des modules qu'il faut appeler au chargement de la page mais aussi à chaque fois qu'on a déplacé un module car les modules sont regénérés
function init(){
	dragging=false;
	old_column = -1;
	old_place = -1;
	move_current_column = -1;
	move_current_place = -1;
	deltax = 0;
	deltay = 0;
	$("body").append('<div id="shadow_module"></div>');
	$("#shadow_module").hide();
	$(".module_move > .move").hide();
	// On signale cette possibilité en rajoutant un effet de hover
	//
	
    $(".module_anchor").css('cursor','move');
	// Action principale


	$(".module_anchor").mousedown(function(e){
		if(!dragging){
            topbar_anscolor = $("#modules_topbar").css('background-color');
            col1_anscolor = $("#modules_col1").css('background-color');
            col2_anscolor = $("#modules_col2").css('background-color');
            rightmenu_anscolor = $("#rightmenu").css('background-color');
	       $("#modules_topbar").css({'background-color' : 'lightblue'});
	       $("#modules_col1").css({'background-color' : 'lightblue'});
	       $("#modules_col2").css({'background-color' : 'lightblue'});
	       $("#rightmenu").css({'background-color' : 'lightblue'});
		
			// On récupère l'élement de la page correspondant au module, son chemin relatif par rapport à module_anchor n'est pas le même pour un module_middle et un module_top.
			module_selected = this.parentNode;
			if(this.parentNode.id.length == 0)
				module_selected = module_selected.parentNode;

			// On récupère le code HTML du module :
			id = module_selected.id;					// id dans la table user_module
			
			selected_div = $("#"+id);
			
			
			
			
			id_module = recuperer_id(module_selected.className);	// id dans la table modules
			original_width = $(this).width();
            
			class_module = module_selected.className;
			current_module = selected_div.clone();
			html_module = selected_div.clone();
			html_module.css('margin',0);
			// On le duplique :
			$("#ghost_modules").show();
			$("#ghost_modules").html(html_module);
			//alert(html_module);
			
			var offset = $(this).offset();
			deltay = e.pageY-offset.top;
			deltax = e.pageX-offset.left;
			
			$("#ghost_modules").css('top',e.pageY+2).css('left',e.pageX-deltax);
			// On le masque et on le remplace par une "ombre" :

			selected_div.hide();

			// On copie le contenu des colonnes dans des variables pour réinjecter plus rapidement :
			// On met en cache les positions de tous les modules dans toutes les colonnes pour diminuer les calculs à effectuer lors du déplacement du module ghost
			modules_y = new Array(new Array(),new Array(),new Array(),new Array());
			var j,n,i;
			var list_modules;
			var str = '';
			minimal_content = new Array('','','','');
			for(j = 0;j<4;j++){
				minimal_content[j] = $("#" + column_name(j)).html(); // contenu des modules
				list_modules = $("#"+column_name(j)+" > div");
				n = list_modules.length;
				for(i = 0;i<n;i++){
					if($(list_modules[i]).css('display')!='none'){
						modules_y[j][i] = getY(list_modules[i])+$(list_modules[i]).height()/2;
					}
				}
			}

            move_current_place = find_place(move_current_column,e.pageY);
            insert_at_current_place($("#shadow_module"),move_current_column,move_current_place);
			if(move_current_column >= 0)
				$("#shadow_module").show();
            
            old_column = original_column = move_current_column;
            old_place = original_place =  move_current_place;
            

			// On le fait suivre le curseur :
			dragging=true;


            set_column(move_current_column);
		}
	});
}

function update(data){
    // On réactualise les colonnes :
    /*columns_loaded = 0;
    for(var j = 0;j<4;j++){
        $("#"+column_name(j)).load("index.php?a=view_modules_columns&light_page=true&col="+j,null,function(data){
            columns_loaded++;
            if(columns_loaded == 4)
            {
                init();
                init_ajax_modules();
            }
        });
    }
    // On remontre le module déplacé :
    $("#"+id).hide();*/
    
                /*init();
                
                insert_at_current_place($("#shadow_module"),move_current_column,move_current_place);*/
                $("#"+id).remove();
                $("#shadow_module").hide();
                $("#ghost_modules").hide();
                $("#shadow_module").after(current_module);
                $("#shadow_module").remove();
                init();
    			callback_calendar_updated();
}

function recuperer_id(str){
        var n = str.length;
        var r = '';
        var j;
        for(j=0;j<n;j++){
                var c = str.charCodeAt(j);
                if(c>=48 && c<=57){
                        r = r.concat(String.fromCharCode(c));
                }
        }
        return r;
}
function set_column(new_value){
	if(dragging && new_value != -1){
	
		// Affichage du shadow si la colonne est correcte
        column = $("#"+column_name(new_value));
        var width = column.width();
        $("#ghost_modules").width(width);
        $("#shadow_module").show();
        $("#shadow_module").height($("#ghost_modules").height());
	}

	if(new_value >= 0)
		move_current_column = new_value;
}

function find_place(column,ymouse){
	var str;
	var offset_shadow = 0;

	if(column == -1)
		return -1;
	var n = modules_y[column].length;
	for(var i = 0;i<n;i++){
		if(old_place != -1 && i >= old_place)
			offset_shadow = $("#shadow_module").height();
		if(modules_y[column][i]+offset_shadow > ymouse)
			return i;
	}
	return i;
}
function column_name(column_number){
	if(column_number==0)
		return "modules_topbar";
	else
		return "modules_col"+column_number;
}
function getY( oElement ){
	var iReturnValue = 0;
	while( oElement != null ) {
		iReturnValue += oElement.offsetTop;
		oElement = oElement.offsetParent;
	}
	return iReturnValue;
}
function insert_at_current_place(obj,column,place){
	var i;
	// Distinction between modules from the topbar and the others
	var list_modules = $("#"+column_name(column)+" > .module");
	var n = list_modules.length;

	var col = $("#"+column_name(column));
    var list_modules2 = new Array();

    for(i=0 ; i<n ; i++)
    {
        list_modules2.push($(list_modules[i]).clone());
    }

	if(place > n)
	   place = n;
	
	for(i = 0;i<4;i++){
		$("#" + column_name(i)).html(minimal_content[i]);
	}
	if(n == 0 || place == n){
		col.append(obj);
		return(true);
	}
	else{
		var dstr = '';
		col.html('');
		for(i = 0;i<n;i++){
			if(i == place)
				col.append(obj);
			col.append(list_modules2[i]);
		}
	}
	return(true);
}

function disable_selection() {
    document.onselectstart=new Function ("return false");
}
function enable_selection() {
    document.onselectstart=new Function ("return true");
}


