draggable_DC

Make DC's windows draggable

  1. // ==UserScript==
  2. // @name draggable_DC
  3. // @author Ladoria
  4. // @version 0.31
  5. // @grant none
  6. // @description Make DC's windows draggable
  7. // @match http://www.dreadcast.net/Main
  8. // @require http://code.jquery.com/jquery-latest.min.js
  9. // @copyright 2012+, Ladoria
  10. // @namespace InGame
  11. // ==/UserScript==
  12.  
  13. /* DEBUG Don't touch those damn things! */
  14.  
  15. var global_debug = false;
  16. var event_debug = (global_debug) ? true : false;
  17. var loading_debug = (global_debug) ? true : false;
  18. var setting_debug = (global_debug) ? true : false;
  19. // /DEBUG
  20.  
  21. /* VARIABLES Don't touch those damn things! */
  22. var zIndex = 310000;
  23. var dragging = false;
  24. var DC_draggable = new Array();
  25. var background_draggable;
  26. var coockie_prefix = 'DC_draggable_';
  27. var preset_count;
  28. var preset_aliases = new Array();
  29. var preset;
  30. // / VARIABLES
  31.  
  32. /* How to :
  33. - NE PAS RENDRE LA CARTE DÉPLAÇABLE. JAMAIS. OU SUBISSEZ UN TAS DE PROBLÈMES.
  34.  
  35. - Chaque indice du tableau DC_draggable doit être l'identifiant unique de l'élément à rendre déplaçable sur l'interface de DC.
  36. - 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')
  37. - 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.
  38. -- le style suivant est obligatoire pour toute div afin d'éviter qu'elle soit cachée ou explose l'apparence normale de la page.
  39. -- style : "height:0px;width:0px;z-index:999999;"
  40. -- Vous êtes libre de le compléter ensuite. Ne faites que -modifier le positionnement la div- et/ou -modifier l'apparence de la checkbox-.
  41. -- Une checkbox avec pour attribut "name" -l'identifiant unique de l'élément à déplacer- et "class" "DC_draggable" est obligatoire (CF code existant).
  42. Enjoy!
  43. Commentaires à envoyer à Ladoria IG.
  44. */
  45.  
  46. /* SETTABLE Touch those nice things as you like! (pervert!) */
  47. preset_count = 5;
  48. preset = 0;
  49.  
  50. background_draggable = 'rgba(172, 0, 0, 0.6)';
  51.  
  52. DC_draggable['zone_centre'] = new Array();
  53.  
  54. DC_draggable['zone_gauche'] = new Array();
  55. 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>';
  56.  
  57. DC_draggable['zone_droite'] = new Array();
  58. 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>';
  59.  
  60. DC_draggable['zone_informations_lieu'] = new Array();
  61. 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>';
  62. DC_draggable['zone_informations_lieu']['css_initial_optionnal'] = {'top': 'auto'};
  63.  
  64. DC_draggable['zone_informations_combat'] = new Array();
  65. 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>';
  66. DC_draggable['zone_informations_combat']['css_initial_optionnal'] = {'top': 'auto'};
  67.  
  68. DC_draggable['db_combat'] = new Array();
  69. 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>';
  70. // /SETTABLE
  71.  
  72. jQuery.noConflict();
  73.  
  74. $(document).ready( function() {
  75. if(undefined != getCookie('background'))
  76. background_draggable = getCookie('background');
  77. if(undefined != getCookie('preset'))
  78. preset = parseInt(getCookie('preset'));
  79. for(var i = 1; i < preset_count + 1; i++) {
  80. if(undefined != getCookie('preset_aliases_' + i))
  81. preset_aliases.push(getCookie('preset_aliases_' + i));
  82. }
  83. // make the element in given array (DC_draggabele model) draggables
  84. function set_DC_draggable(make_draggable) {
  85. var to_drag = Object.keys(make_draggable);
  86. if(setting_debug) console.log('setting draggable options for: ' + to_drag);
  87. for(var i = 0; i < to_drag.length; i++) {
  88. var element = to_drag[i];
  89. var selector = '#' + element;
  90. load_from_cookie(element);
  91. if(loading_debug) console.log('\n' + element + ': ' + ((0 != $(selector).length) ? 'founded, process...' : 'missing, skip...'));
  92. if(0 != $(selector).length) {
  93. DC_draggable[element]['draggable'] = false;
  94. DC_draggable[element]['offset_initial'] = $(selector).offset();
  95. DC_draggable[element]['css_initial'] = {'bottom': $(selector).css('bottom')};
  96. // ici l'offset dernièrement en mémoire
  97. reinitalize(element, preset, true);
  98. $(selector).addClass('DC_draggable');
  99. if(undefined != DC_draggable[element]['checkbox']) {
  100. $(selector + ' div').first().before(DC_draggable[element]['checkbox']);
  101. // enable or disable element's drag at checkbox click
  102. $('input[type=checkbox][name=' + element +'].DC_draggable').click( function() {
  103. if($(this).is(':checked'))
  104. enableDrag($(this).attr('name'));
  105. else
  106. disableDrag($(this).attr('name'));
  107. if(event_debug) console.log('checked: ' + $(this).attr('name'));
  108. });
  109. if(loading_debug) console.log('event:click:checkbox: done');
  110. // place the element to its original area
  111. $(selector).dblclick( function() {
  112. reinitalize($(this).attr('id'), 'initial', false);
  113. if(event_debug) console.log('doubleclick: ' + $(this).attr('id'));
  114. });
  115. if(loading_debug) console.log('event:doubleclick: done');
  116. // set size end background of element while dragging
  117. $(selector).bind('drag', function(event) {
  118. if(true == DC_draggable[$(this).attr('id')]['draggable']) {
  119. if(!dragging) {
  120. dragging = true;
  121. if("" != background_draggable)
  122. $('#' + $(this).attr('id')).css('backgroundColor',background_draggable);
  123. $('#' + $(this).attr('id')).css('bottom','auto'); // 'cause of weird unfixed height
  124. if(event_debug) console.log('dragging: ' + $(this).attr('id'));
  125. }
  126. }
  127. });
  128. if(loading_debug) console.log('event:drag: done');
  129. // 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)
  130. // set original background of element at the end of drag
  131. $(selector).mouseup( function() {
  132. if(dragging) {
  133. dragging = false;
  134. $('#' + $(this).attr('id')).css('backgroundColor', DC_draggable[$(this).attr('id')]['backgroundColor']);
  135. if('initial' != preset) {
  136. DC_draggable[$(this).attr('id')]['offset_' + preset] = $('#' + $(this).attr('id')).offset();
  137. save_to_cookie($(this).attr('id'));
  138. }
  139. if(event_debug) if(!dragging) console.log('end of drag: ' + $(this).attr('id'));
  140. }
  141. });
  142. if(loading_debug) console.log('event:mouseup: done');
  143. }
  144. // puts the element on foreground
  145. $(selector).mousedown( function() {
  146. zIndex++;
  147. $('#' + $(this).attr('id')).zIndex(zIndex);
  148. if(event_debug) console.log('foregrounded: ' + $(this).attr('id'));
  149. });
  150. if(loading_debug) console.log('event:mousedown: done');
  151. }
  152. }
  153. }
  154. // need that to let the javascript display all element after the 'ready' state of the DOM
  155. setTimeout( function() {
  156. if(setting_debug) console.log('first delayed loading.');
  157. set_DC_draggable(DC_draggable);
  158. }, 1000);
  159. // enabling dragging of element
  160. function enableDrag(id) {
  161. $('#' + id).draggable();
  162. $('#' + id).css('cursor','move');
  163. DC_draggable[id]['draggable'] = true;
  164. DC_draggable[id]['backgroundColor'] = $('#' + id).css('backgroundColor');
  165. if(setting_debug) console.log('drag enabled: ' + id);
  166. }
  167. // disable dragging of element
  168. function disableDrag(id) {
  169. $('#' + id).draggable('destroy');
  170. $('#' + id).addClass('');
  171. $('#' + id).css('cursor','auto');
  172. DC_draggable[id]['draggable'] = false;
  173. if(setting_debug) console.log('drag disabled: ' + id);
  174. }
  175. // disable dragging of element
  176. function reinitalize(id, offset, forced) {
  177. if((true == forced
  178. || true == DC_draggable[id]['draggable'])
  179. && 0 != $('#' + id).length) {
  180. if(global_debug) console.log('offset_' + offset + ':');
  181. if(global_debug) console.log(DC_draggable[id]['offset_' + offset]);
  182. if( undefined == DC_draggable[id]['offset_' + offset]
  183. || 0 == offset
  184. || (DC_draggable[id]['offset_' + offset].top == DC_draggable[id]['offset_initial'].top
  185. && DC_draggable[id]['offset_' + offset].left == DC_draggable[id]['offset_initial'].left)
  186. ) {
  187. if(global_debug) console.log('Setting initial offset');
  188. $('#' + id).offset(DC_draggable[id]['offset_initial']);
  189. $('#' + id).css(DC_draggable[id]['css_initial']);
  190. if(undefined != DC_draggable[id]['css_initial_optionnal'])
  191. $('#' + id).css(DC_draggable[id]['css_initial_optionnal']);
  192. }
  193. else {
  194. if(global_debug) console.log('Setting offset ' + offset);
  195. $('#' + id).offset(DC_draggable[id]['offset_' + offset]);
  196. $('#' + id).css('bottom','auto'); // 'cause of weird unfixed height
  197. }
  198. }
  199. if(setting_debug) console.log('reinitialized: ' + id);
  200. }
  201. // set draggable element 'after' combat's interface loading
  202. $(document).ajaxComplete( function(a,b,c) {
  203. if(c.url == '/Interface/Fight') {
  204. if(event_debug) console.log('fight\'s interface is requesting.');
  205. var DC_draggable_fight = new Array();
  206. DC_draggable_fight['zone_informations_combat'] = DC_draggable['zone_informations_combat'];
  207. DC_draggable_fight['db_combat'] = DC_draggable['db_combat'];
  208. set_DC_draggable(DC_draggable_fight);
  209. }
  210. });
  211. // menu
  212. $('#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>');
  213. // global style
  214. $('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] */');
  215. // swtich element's offset's preset
  216. $('#DC_draggable input[type=checkbox][name=preset]').click( function() {
  217. moveTo($(this).val());
  218. });
  219. // display a message box to send a bug report, IG
  220. $('#DC_draggable [name=bug_report]').click( function() {
  221. nav.getMessagerie().newMessage();
  222. $('#db_new_message:last').zIndex('1000');
  223. $('#db_new_message:last .head .title').html('Reporter un BUG sur DC Draggable');
  224. $('#db_new_message:last #nm_cible input').val('Ladoria');
  225. $('#db_new_message:last #nm_sujet input').val('[HRP][DC Draggable][Bug]');
  226. $('#db_new_message:last #nm_texte textarea').focus();
  227. });
  228. // Suggeste something, IG
  229. $('#DC_draggable [name=suggest]').click( function() {
  230. nav.getMessagerie().newMessage();
  231. $('#db_new_message:last').zIndex('1000');
  232. $('#db_new_message:last .head .title').html('Suggérer un truc pour DC Draggable');
  233. $('#db_new_message:last #nm_cible input').val('Ladoria');
  234. $('#db_new_message:last #nm_sujet input').val('[HRP][DC Draggable][Suggestion]');
  235. $('#db_new_message:last #nm_texte textarea').focus();
  236. });
  237.  
  238. // change background color when dragging
  239. $('#DC_draggable input[name=backgroundColor]').keyup( function (e) {
  240. if(e.keyCode == 13) {
  241. background_draggable = $(this).val();
  242. saveCookie('background', background_draggable);
  243. }
  244. });
  245.  
  246. // enable/disable all drag
  247. $('#DC_draggable [name=enable]').click( function() {
  248. var enable;
  249. if($(this).html() == 'Tout activer') {
  250. enable = true;
  251. $(this).html('Tout désactiver');
  252. }
  253. else {
  254. $(this).html('Tout activer');
  255. enable = false;
  256. }
  257. $('input[type=checkbox].DC_draggable').each( function() {
  258. $(this).prop('checked', enable);
  259. if(enable)
  260. enableDrag($(this).attr('name'));
  261. else
  262. disableDrag($(this).attr('name'));
  263. });
  264. });
  265.  
  266. // load preset positions
  267. $('#DC_draggable .preset .btnTxt').click( function() {
  268. if(global_debug) console.log('setting for preset: ' + $(this).attr('name'));
  269. if($(this).hasClass('load')) {
  270. preset = $(this).attr('name');
  271. saveCookie('preset',preset);
  272. $('#DC_draggable .preset.selected').removeClass('selected');
  273. $(this).parent().addClass('selected');
  274. var to_load = Object.keys(DC_draggable);
  275. for (var i = 0; i < to_load.length; i++) {
  276. reinitalize(to_load[i], preset, true);
  277. }
  278. }
  279. else if($(this).hasClass('save')) {
  280. if('0' == $(this).attr('name')) return;
  281. var to_save = Object.keys(DC_draggable);
  282. for (var i = 0; i < to_save.length; i++) {
  283. DC_draggable[to_save[i]]['offset_' + $(this).attr('name')] = $('#' + to_save[i]).offset();
  284. save_to_cookie(to_save[i]);
  285. }
  286. saveCookie('preset_aliases_' + $(this).attr('name'), $('#preset_aliases_' + $(this).attr('name')).val());
  287. }
  288. });
  289. $('.preset_aliases').keyup( function (e) {
  290. if(e.keyCode == 13) {
  291. preset_aliases[parseInt($(this).attr('name'))] = $(this).val();
  292. saveCookie('preset_aliases_' + $(this).attr('name'), preset_aliases[parseInt($(this).attr('name'))]);
  293. }
  294. });
  295. });
  296.  
  297. function saveCookie(name,val) {
  298. name = coockie_prefix + name;
  299. if(!navigator.cookieEnabled) return;
  300. document.cookie = name + '=' + val + ';expires=Wed, 01 Jan 2020 00:00:00 GMT; path=/';
  301. }
  302.  
  303. function getCookie(var_name) {
  304. name = coockie_prefix + var_name;
  305. if(!navigator.cookieEnabled) return undefined;
  306. var start = document.cookie.indexOf(name + '=')
  307. if(start == -1) return undefined;
  308. start += name.length + 1;
  309. var end = document.cookie.indexOf(';',start);
  310. if (end == -1) end = document.cookie.lenght;
  311. if(global_debug) console.log(var_name + ': ' + document.cookie.substring(start,end));
  312. return document.cookie.substring(start,end);
  313. };
  314.  
  315. // load element's options from cookie
  316. function load_from_cookie(element) {
  317. if(undefined == DC_draggable[element]['checkbox']) return;
  318.  
  319. var variables = ['offset'];
  320. for(var i = 0; i < variables.length; i++) {
  321. var variable_name = element + '_' + variables[i];
  322. switch(variables[i]) {
  323. case 'offset' :
  324. for(var j = 1; j < preset_count + 1; j++) {
  325. if( undefined != getCookie(variable_name + '_top_' + j)
  326. && undefined != getCookie(variable_name + '_left_' + j)) {
  327. if(global_debug) console.log('Loading: ' + variable_name + '_' + j);
  328. var offset = new Object();
  329. offset.top = parseInt(getCookie(variable_name + '_top_' + j));
  330. offset.left = parseInt(getCookie(variable_name + '_left_' + j));
  331. DC_draggable[element]['offset_' + j] = offset;
  332. }
  333. }
  334. break;
  335. default: break;
  336. }
  337. }
  338. }
  339.  
  340. // save element's options to cookie
  341. function save_to_cookie(element) {
  342. if(undefined == DC_draggable[element]['checkbox']) return;
  343.  
  344. var variables = ['offset'];
  345. if(global_debug) console.log('Saving: ' + element);
  346. for(var i = 0; i < variables.length; i++) {
  347. var variable_name = element + '_' + variables[i];
  348. switch(variables[i]) {
  349. case 'offset' :
  350. for(var j = 1; j < preset_count + 1; j++) {
  351. if(global_debug) console.log('Saving: ' + variable_name + '_' + j);
  352. if(undefined != DC_draggable[element]['offset_' + j]) {
  353. saveCookie(variable_name + '_top_' + j, DC_draggable[element]['offset_' + j].top);
  354. saveCookie(variable_name + '_left_' + j, DC_draggable[element]['offset_' + j].left);
  355. }
  356. }
  357. break;
  358. default: break;
  359. }
  360. }
  361. }
  362.  
  363. function build_preset_html() {
  364. var preset_html = '';
  365. for(var i = 0; i < preset_count + 1; i++) {
  366. preset_html += '<div class="DC_draggable preset';
  367. if(preset == i) preset_html += ' selected';
  368. preset_html += '">';
  369. if(0 == i) {
  370. preset_html += '<div class="DC_draggable btnTxt load base" name="' + i + '"><div>Initiale</div></div>';
  371. }
  372. else {
  373. 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>';
  374. preset_html += '<div class="DC_draggable btnTxt save" name="' + i + '">Save</div>';
  375. preset_html += '<div class="DC_draggable btnTxt load" name="' + i + '">Load</div>';
  376. }
  377. preset_html += '</div>';
  378. }
  379. return preset_html;
  380. };