Skip to content

Instantly share code, notes, and snippets.

@Milly
Created June 25, 2010 14:38
Show Gist options
  • Save Milly/452937 to your computer and use it in GitHub Desktop.
Save Milly/452937 to your computer and use it in GitHub Desktop.
allunofficial.net extender
// ==UserScript==
// @name allunofficial.net extender
// @namespace http://d.hatena.ne.jp/MillyC/
// @include http://allunofficial.net/trpg/action.php*
// @include http://allunofficial.net/trpg/arianrhod_pc_making.html
// ==/UserScript==
// Sortable skill table {{{1
if ('addLineSkill' in unsafeWindow) {
// add style {{{2
GM_addStyle([
'a.spin-button { display:block; height:0.8em; font-size:0.8em; padding:0 0.2em; line-height:1em; }',
'#skill_disp tr.focus input { background-color:#ddf; }',
'#skill_disp tr input:focus { background-color:#bbd; }'
].join(''));
// create elements {{{2
var skill_disp = document.getElementById('skill_disp');
var rows = skill_disp.getElementsByTagName('tr');
for (var i = 0; i < rows.length; ++i) {
var th_ary = rows[i].getElementsByTagName('th');
if (1 == th_ary.length) {
var col = document.createElement('td');
if (th_ary[0].innerHTML.match(/<input/)) {
col.innerHTML =
'<a href="#" class="spin-button up" onclick="moveUpLineSkill(event);return false;">▲</a>' +
'<a href="#" class="spin-button down" onclick="moveDownLineSkill(event);return false;">▼</a>';
} else {
col.innerHTML = '&nbsp;';
rows[i].setAttribute('type', 'fixed');
}
} else {
var col = document.createElement('th');
col.innerHTML = '&nbsp;';
}
rows[i].appendChild(col);
}
// unsafe functions {{{2
function find(element, nodeName, propName) {
propName = propName || 'firstChild';
while (element = element[propName]) {
if (nodeName == element.nodeName)
return element;
}
}
var moveUpLineSkill = unsafeWindow.moveUpLineSkill = function(event) {
var target = event.target || event;
var row = find(target, 'TR', 'parentNode');
var prev_row = find(row, 'TR', 'previousSibling');
if (prev_row && 'fixed' != prev_row.getAttribute('type'))
row.parentNode.insertBefore(row, prev_row);
target.focus();
}
var moveDownLineSkill = unsafeWindow.moveDownLineSkill = function(event) {
var target = event.target || event;
var row = find(target, 'TR', 'parentNode');
var next_row = find(row, 'TR', 'nextSibling');
if (next_row && 'fixed' != next_row.getAttribute('type'))
row.parentNode.insertBefore(next_row, row);
target.focus();
}
// functions {{{2
function hasClass(element, className) {
return -1 != (' ' + element.className + ' ').indexOf(' ' + className + ' ');
}
function addClass(element, className) {
if (!hasClass(element, className))
element.className += ' ' + className;
}
function removeClass(element, className) {
if (hasClass(element, className)) {
var all = element.className.split(/\s+/);
for (var i = all.length; 0 <= --i;) {
if (all[i] == className)
delete all[i];
}
element.className = all.join(' ').replace(/ +/g, ' ');
}
}
// events {{{2
function updownKeyListener(event) {
var target = event.target;
var keycode = event.which;
var keychar = String.fromCharCode(keycode).toUpperCase();
if (event.ctrlKey && (38 == keycode || 40 == keycode)) {
event.stopPropagation();
event.preventDefault();
setTimeout(function() {
target.blur();
if (38 == event.which) {
moveUpLineSkill(event);
} else {
moveDownLineSkill(event);
}
}, 50);
}
}
skill_disp.addEventListener('keydown', updownKeyListener, true);
function rowFocusListener(event) {
var target = event.target;
var row = find(target, 'TR', 'parentNode');
if ('focus' == event.type) {
addClass(row, 'focus');
} else {
removeClass(row, 'focus');
}
}
skill_disp.addEventListener('focus', rowFocusListener, true);
skill_disp.addEventListener('blur', rowFocusListener, true);
// }}}2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment