draggable_DC

Make DC's windows draggable

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name		draggable_DC
// @author		Ladoria
// @version		0.31
// @grant       none
// @description	Make DC's windows draggable
// @match		http://www.dreadcast.net/Main
// @require     http://code.jquery.com/jquery-latest.min.js
// @copyright	2012+, Ladoria
// @namespace InGame
// ==/UserScript==

/* DEBUG Don't touch those damn things! */

var global_debug = false;
var event_debug = (global_debug) ? true : false;
var loading_debug = (global_debug) ? true : false;
var setting_debug = (global_debug) ? true : false;
// /DEBUG

/* VARIABLES Don't touch those damn things! */
var zIndex = 310000;
var dragging = false;
var DC_draggable = new Array();
var background_draggable;
var coockie_prefix = 'DC_draggable_';
var preset_count;
var preset_aliases = new Array();
var preset;
// / VARIABLES

/* 	How to :
	- NE PAS RENDRE LA CARTE DÉPLAÇABLE. JAMAIS. OU SUBISSEZ UN TAS DE PROBLÈMES.

	- Chaque indice du tableau DC_draggable doit être l'identifiant unique de l'élément à rendre déplaçable sur l'interface de DC.
	
	- Créer un indice du tableau DC_draggable contenant un tableau vide afin faire remonter l'élément au premier plan suite à un appuie sur le clic gauche de votre souris. (CF ligne pour 'zone_centre')
	
	- Créer un indice du tableau DC_draggable contenant un tableau lui-même contentant un indice 'checkbox' afin d'activer la possibilité de déplacement de l'élément. Il faudra, bien-sûr et également, renseigner le code HTML afin qu'il soit rajouter sur l'interface.
	-- le style suivant est obligatoire pour toute div afin d'éviter qu'elle soit cachée ou explose l'apparence normale de la page.
	-- style : "height:0px;width:0px;z-index:999999;"
	-- Vous êtes libre de le compléter ensuite. Ne faites que -modifier le positionnement la div- et/ou -modifier l'apparence de la checkbox-.
	-- Une checkbox avec pour attribut "name" -l'identifiant unique de l'élément à déplacer- et "class" "DC_draggable" est obligatoire (CF code existant).
	
	Enjoy!
	
	Commentaires à envoyer à Ladoria IG.
*/

/* SETTABLE Touch those nice things as you like! (pervert!) */
preset_count = 5;
preset = 0;

background_draggable = 'rgba(172, 0, 0, 0.6)';

DC_draggable['zone_centre'] = new Array();

DC_draggable['zone_gauche'] = new Array();
DC_draggable['zone_gauche']['checkbox'] = '<div style="height:0px;width:0px;z-index:999999;margin-right:-13px;"><input type="checkbox" name="zone_gauche" class="DC_draggable"></div>';

DC_draggable['zone_droite'] = new Array();
DC_draggable['zone_droite']['checkbox'] = '<div style="height:0px;width:0px;z-index:999999;margin-right:-13px;"><input type="checkbox" name="zone_droite" class="DC_draggable"></div>';

DC_draggable['zone_informations_lieu'] = new Array();
DC_draggable['zone_informations_lieu']['checkbox'] = '<div style="height:0px;width:0px;z-index:999999;top:-11px;left:-15px;"><input type="checkbox" name="zone_informations_lieu" class="DC_draggable"></div>';
DC_draggable['zone_informations_lieu']['css_initial_optionnal'] = {'top': 'auto'};

DC_draggable['zone_informations_combat'] = new Array();
DC_draggable['zone_informations_combat']['checkbox'] = '<div style="height:0px;width:0px;z-index:999999;top:-11px;left:-15px;"><input type="checkbox" name="zone_informations_combat" class="DC_draggable"></div>';
DC_draggable['zone_informations_combat']['css_initial_optionnal'] = {'top': 'auto'};

DC_draggable['db_combat'] = new Array();
DC_draggable['db_combat']['checkbox'] = '<div style="height:0px;width:0px;z-index:999999;top:-36px;left:-10px;"><input type="checkbox" name="db_combat" class="DC_draggable"></div>';
// /SETTABLE

jQuery.noConflict();

$(document).ready( function() {
	if(undefined != getCookie('background'))
		background_draggable = getCookie('background');
	if(undefined != getCookie('preset'))
		preset = parseInt(getCookie('preset'));
	
	for(var i = 1; i < preset_count + 1; i++) {
		if(undefined != getCookie('preset_aliases_' + i))
			preset_aliases.push(getCookie('preset_aliases_' + i));
	}
	
	// make the element in given array (DC_draggabele model) draggables
	function set_DC_draggable(make_draggable) {
		var to_drag = Object.keys(make_draggable);
		
		if(setting_debug) console.log('setting draggable options for: ' + to_drag);
	
		for(var i = 0; i < to_drag.length; i++) {
			var element = to_drag[i];
			var selector = '#' + element;
			
			load_from_cookie(element);
			
			if(loading_debug) console.log('\n' + element + ': ' + ((0 != $(selector).length) ? 'founded, process...' : 'missing, skip...'));
			
			if(0 != $(selector).length) {
				DC_draggable[element]['draggable'] = false;
				DC_draggable[element]['offset_initial'] = $(selector).offset();
				DC_draggable[element]['css_initial'] = {'bottom': $(selector).css('bottom')};
				
				// ici l'offset dernièrement en mémoire
				reinitalize(element, preset, true);
				
				$(selector).addClass('DC_draggable');
				
				if(undefined != DC_draggable[element]['checkbox']) {
					$(selector + ' div').first().before(DC_draggable[element]['checkbox']);
					
					// enable or disable element's drag at checkbox click
					$('input[type=checkbox][name=' + element +'].DC_draggable').click( function() {
						if($(this).is(':checked'))
							enableDrag($(this).attr('name'));
						else
							disableDrag($(this).attr('name'));
						
						if(event_debug) console.log('checked: ' + $(this).attr('name'));
					});
					if(loading_debug) console.log('event:click:checkbox: done');
					
					// place the element to its original area
					$(selector).dblclick( function() {
						reinitalize($(this).attr('id'), 'initial', false);
						
						if(event_debug) console.log('doubleclick: ' + $(this).attr('id'));
					});
					if(loading_debug) console.log('event:doubleclick: done');
					
					// set size end background of element while dragging
					$(selector).bind('drag', function(event) {
						if(true == DC_draggable[$(this).attr('id')]['draggable']) {
							if(!dragging) {
								dragging = true;
								if("" != background_draggable)
									$('#' + $(this).attr('id')).css('backgroundColor',background_draggable);
								
								$('#' + $(this).attr('id')).css('bottom','auto'); // 'cause of weird unfixed height
								
								if(event_debug) console.log('dragging: ' + $(this).attr('id'));
							}
						}
					});
					if(loading_debug) console.log('event:drag: done');
					
					// a placer sur $(document) et un .each sur les element pour retirer tout BG à la fin de totu mouse up (réglant le problème du drag & drop d'objet)
					// set original background of element at the end of drag
					$(selector).mouseup( function() {
						if(dragging) {
							dragging = false;
							
							$('#' + $(this).attr('id')).css('backgroundColor', DC_draggable[$(this).attr('id')]['backgroundColor']);
							
							if('initial' != preset) {
								DC_draggable[$(this).attr('id')]['offset_' + preset] = $('#' + $(this).attr('id')).offset();
								save_to_cookie($(this).attr('id'));
							}
							
							if(event_debug) if(!dragging) console.log('end of drag: ' + $(this).attr('id'));
						}
					});
					if(loading_debug) console.log('event:mouseup: done');
				}
				
				// puts the element on foreground
				$(selector).mousedown( function() {
					zIndex++;
					$('#' + $(this).attr('id')).zIndex(zIndex);
					
					if(event_debug) console.log('foregrounded: ' + $(this).attr('id'));
				});
				if(loading_debug) console.log('event:mousedown: done');
			}
		}
	}
	
	// need that to let the javascript display all element after the 'ready' state of the DOM
	setTimeout( function() {
		if(setting_debug) console.log('first delayed loading.');
	
		set_DC_draggable(DC_draggable);
	}, 1000);
	
	// enabling dragging of element
	function enableDrag(id) {
		$('#' + id).draggable();
		$('#' + id).css('cursor','move');
		DC_draggable[id]['draggable'] = true;
		DC_draggable[id]['backgroundColor'] = $('#' + id).css('backgroundColor');
		
		if(setting_debug) console.log('drag enabled: ' + id);
	}
	
	// disable dragging of element
	function disableDrag(id) {
		$('#' + id).draggable('destroy');
		$('#' + id).addClass('');
		$('#' + id).css('cursor','auto');
		DC_draggable[id]['draggable'] = false;
		
		if(setting_debug) console.log('drag disabled: ' + id);
	}
	
	// disable dragging of element
	function reinitalize(id, offset, forced) {
		if((true == forced
		|| true == DC_draggable[id]['draggable'])
		&& 0 != $('#' + id).length) {
			if(global_debug) console.log('offset_' + offset + ':');
			if(global_debug) console.log(DC_draggable[id]['offset_' + offset]);
		
			if(	undefined == DC_draggable[id]['offset_' + offset]
			|| 0 == offset
			|| 	(DC_draggable[id]['offset_' + offset].top == DC_draggable[id]['offset_initial'].top
				&& DC_draggable[id]['offset_' + offset].left == DC_draggable[id]['offset_initial'].left)
			) {
				if(global_debug) console.log('Setting initial offset');
				$('#' + id).offset(DC_draggable[id]['offset_initial']);
				$('#' + id).css(DC_draggable[id]['css_initial']);
				
				if(undefined != DC_draggable[id]['css_initial_optionnal'])
					$('#' + id).css(DC_draggable[id]['css_initial_optionnal']);
			}
			else {
				if(global_debug) console.log('Setting offset ' + offset);
				$('#' + id).offset(DC_draggable[id]['offset_' + offset]);
				$('#' + id).css('bottom','auto'); // 'cause of weird unfixed height
			}
		}
		
		if(setting_debug) console.log('reinitialized: ' + id);
	}
	
	// set draggable element 'after' combat's interface loading
	$(document).ajaxComplete( function(a,b,c) {
		if(c.url == '/Interface/Fight') {
			if(event_debug) console.log('fight\'s interface is requesting.');
				
			var DC_draggable_fight = new Array();
			DC_draggable_fight['zone_informations_combat'] = DC_draggable['zone_informations_combat'];
			DC_draggable_fight['db_combat'] = DC_draggable['db_combat'];
			
			set_DC_draggable(DC_draggable_fight);
		}
	});
	
	// menu
	$('#bandeau .menus > li').first().before('<li id="DC_draggable" class="couleur5"><img src="http://image.noelshack.com/fichiers/2014/23/1401993008-lado-head.png" class="infoAide" title="Une Ladoria" alt="Une Ladoria"><ul><li class="separator">Couleur de fond lors du drag:<input type="text" name="backgroundColor" class="textbox backgroundColor" value="' + background_draggable + '"></li><li name="enable" class="button">Tout activer</li><li>Configurations<div class="presetContainer">' + build_preset_html() + '</div></li><li name="bug_report" class="button separator">Signaler un bug</li><li name="suggest" class="button">Suggérer un truc</li><li class="button"><a target="_blank" href="https://greasyfork.org/scripts/2035-draggable-dc"><div>Mettre à jour</div></a></li></ul></li><li class="separator"></li>');
	
	// global style
	$('head').append('<style>#DC_draggable {padding-top: 0px !important;padding-bottom: 0px !important;}#DC_draggable ul {margin-top: 28px !important;width: 168px !important;}#DC_draggable li {padding-right: 7px !important;}#DC_draggable:hover > ul {display: block !important;}#DC_draggable .button {cursor: pointer;}#DC_draggable .textbox {width: 150px;background-color: #ffffff;}#DC_draggable .textbox.backgroundColor {margin-top: 3px;}#DC_draggable .center {text-align: center;width: 168px;color: white;font-size: 1.4em;}#DC_draggable .presetContainer {overflow: hidden;}#DC_draggable .preset {float: left;overflow: hidden;color: #000000;border: 1px solid black;padding: 1px 1px 1px 1px;width: 73px;}#DC_draggable .preset .btnTxt {margin: 1px 1px 1px 1px;padding: 1px 3px;cursor: pointer;}#DC_draggable .preset .btnTxt {width: 26px;}#DC_draggable .preset .load {float: left;}#DC_draggable .preset .save {float: right;}#DC_draggable .preset .base {width: 64px;height: 38px;}#DC_draggable .preset .base div {top: 50%;margin-top: -0.7em;}#DC_draggable .preset.selected {border-color: green;}#DC_draggable .preset .textbox {width: 69px;margin-bottom: 1px;}</style>/* to minimize [\n\t\r] */');
	
	// swtich element's offset's preset
	$('#DC_draggable input[type=checkbox][name=preset]').click( function() {
		moveTo($(this).val());
	});
	
	// display a message box to send a bug report, IG
	$('#DC_draggable [name=bug_report]').click( function() {
		nav.getMessagerie().newMessage();
		$('#db_new_message:last').zIndex('1000');
		$('#db_new_message:last .head .title').html('Reporter un BUG sur DC Draggable');
		$('#db_new_message:last #nm_cible input').val('Ladoria');
		$('#db_new_message:last #nm_sujet input').val('[HRP][DC Draggable][Bug]');
		$('#db_new_message:last #nm_texte textarea').focus();
	});
	
	// Suggeste something, IG
	$('#DC_draggable [name=suggest]').click( function() {
		nav.getMessagerie().newMessage();
		$('#db_new_message:last').zIndex('1000');
		$('#db_new_message:last .head .title').html('Suggérer un truc pour DC Draggable');
		$('#db_new_message:last #nm_cible input').val('Ladoria');
		$('#db_new_message:last #nm_sujet input').val('[HRP][DC Draggable][Suggestion]');
		$('#db_new_message:last #nm_texte textarea').focus();
	});

	// change background color when dragging
	$('#DC_draggable input[name=backgroundColor]').keyup( function (e) {
		if(e.keyCode == 13) {
			background_draggable = $(this).val();
			saveCookie('background', background_draggable);
		}
	});

	// enable/disable all drag
	$('#DC_draggable [name=enable]').click( function() {
		var enable;
		
		if($(this).html() == 'Tout activer') {
			enable = true;
			$(this).html('Tout désactiver');
		}
		else {
			$(this).html('Tout activer');
			enable = false;
		}
		
		$('input[type=checkbox].DC_draggable').each( function() {
			$(this).prop('checked', enable);
			
			if(enable)
				enableDrag($(this).attr('name'));
			else
				disableDrag($(this).attr('name'));
		});
	});

	// load preset positions
	$('#DC_draggable .preset .btnTxt').click( function() {
		if(global_debug) console.log('setting for preset: ' + $(this).attr('name'));
		
		if($(this).hasClass('load')) {
			preset = $(this).attr('name');
			saveCookie('preset',preset);
			
			$('#DC_draggable .preset.selected').removeClass('selected');
			$(this).parent().addClass('selected');
		
			var to_load = Object.keys(DC_draggable);
			
			for (var i = 0; i < to_load.length; i++) {
				reinitalize(to_load[i], preset, true);
			}
		}
		else if($(this).hasClass('save')) {
			if('0' == $(this).attr('name')) return;
		
			var to_save = Object.keys(DC_draggable);
			
			for (var i = 0; i < to_save.length; i++) {
				DC_draggable[to_save[i]]['offset_' + $(this).attr('name')] = $('#' + to_save[i]).offset();
				save_to_cookie(to_save[i]);
			}
			
			saveCookie('preset_aliases_' + $(this).attr('name'), $('#preset_aliases_' + $(this).attr('name')).val());
		}
	});
	
	$('.preset_aliases').keyup( function (e) {
		if(e.keyCode == 13) {
			preset_aliases[parseInt($(this).attr('name'))] = $(this).val();
			saveCookie('preset_aliases_' + $(this).attr('name'), preset_aliases[parseInt($(this).attr('name'))]);
		}
	});
});

function saveCookie(name,val) {
	name = coockie_prefix + name;
	
	if(!navigator.cookieEnabled) return;
		document.cookie = name + '=' + val + ';expires=Wed, 01 Jan 2020 00:00:00 GMT; path=/';
}

function getCookie(var_name) {
	name = coockie_prefix + var_name;
	
	if(!navigator.cookieEnabled) return undefined;
	
	var start = document.cookie.indexOf(name + '=')
	if(start == -1) return undefined;
	start += name.length + 1;
	
	var end = document.cookie.indexOf(';',start);
	if (end == -1) end = document.cookie.lenght;
	
	if(global_debug) console.log(var_name + ': ' + document.cookie.substring(start,end));
	
	return document.cookie.substring(start,end);
};

// load element's options from cookie
function load_from_cookie(element) {
	if(undefined == DC_draggable[element]['checkbox']) return;

	var variables = ['offset'];
	
	for(var i = 0; i < variables.length; i++) {
		var variable_name = element + '_' + variables[i];
		
		switch(variables[i]) {
			case 'offset' :
				for(var j = 1; j < preset_count + 1; j++) {
					if(	 undefined != getCookie(variable_name + '_top_' + j)
					&& 	undefined != getCookie(variable_name + '_left_' + j)) {
						if(global_debug) console.log('Loading: ' + variable_name + '_' + j);
						
						var offset = new Object();
						offset.top = parseInt(getCookie(variable_name + '_top_' + j));
						offset.left = parseInt(getCookie(variable_name + '_left_' + j));
						DC_draggable[element]['offset_' + j] = offset;
					}
				}
				break;
			default: break;
		}
	}
}

// save element's options to cookie
function save_to_cookie(element) {
	if(undefined == DC_draggable[element]['checkbox']) return;

	var variables = ['offset'];
	if(global_debug) console.log('Saving: ' + element);
	
	for(var i = 0; i < variables.length; i++) {
		var variable_name = element + '_' + variables[i];
		
		switch(variables[i]) {
			case 'offset' :
				for(var j = 1; j < preset_count + 1; j++) {
					if(global_debug) console.log('Saving: ' + variable_name + '_' + j);
					
					if(undefined != DC_draggable[element]['offset_' + j]) {
						saveCookie(variable_name + '_top_' + j, DC_draggable[element]['offset_' + j].top);
						saveCookie(variable_name + '_left_' + j, DC_draggable[element]['offset_' + j].left);
					}
				}
				break;
			default: break;
		}
	}
}

function build_preset_html() {
	var preset_html = '';
	
	for(var i = 0; i < preset_count + 1; i++) {
		preset_html += '<div class="DC_draggable preset';
		
		if(preset == i) preset_html += ' selected';
		
		preset_html += '">';
		
		if(0 == i) {
			preset_html += '<div class="DC_draggable btnTxt load base" name="' + i + '"><div>Initiale</div></div>';
		}
		else {
			preset_html += '<div class="DC_draggable"><input type="text" id="preset_aliases_' + i + '" class="DC_draggable textbox preset_aliases" name="' + i + '" value="' + ((undefined != preset_aliases[i - 1]) ? preset_aliases[i - 1] : ('Conf. ' + i)) + '" onclick="this.select();"></div>';
		
			preset_html += '<div class="DC_draggable btnTxt save" name="' + i + '">Save</div>';
			preset_html += '<div class="DC_draggable btnTxt load" name="' + i + '">Load</div>';
		}
		preset_html += '</div>';
	}
	
	return preset_html;
};