summaryrefslogtreecommitdiff
path: root/static/f/script.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/f/script.js')
-rw-r--r--static/f/script.js1758
1 files changed, 0 insertions, 1758 deletions
diff --git a/static/f/script.js b/static/f/script.js
deleted file mode 100644
index 07ad9866..00000000
--- a/static/f/script.js
+++ /dev/null
@@ -1,1758 +0,0 @@
-/* function/attribute prefixes:
- * date -> Date selector
- * dd -> dropdown
- * ds -> dropdown search
- * iv -> image viewer
- * jt -> Javascript Tabs
- * med -> Release media selector
- * rl -> Release List dropdown
- * rpr -> Release <-> producer linking
- * rvn -> Release <-> visual novel linking
- * scr -> VN screenshot uploader
- * tgl -> VN tag linking
- * tvs -> VN page tag spoilers
- * vnr -> VN relation editor
- */
-var expanded_icon = '▾';
-var collapsed_icon = '▸';
-
-/* M I N I M A L J A V A S C R I P T L I B R A R Y */
-
-var http_request = false;
-function ajax(url, func) {
- if(http_request)
- http_request.abort();
- http_request = (window.ActiveXObject) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
- if(http_request == null)
- return alert("Your browser does not support the functionality this website requires.");
- http_request.onreadystatechange = function() {
- if(!http_request || http_request.readyState != 4 || !http_request.responseText)
- return;
- if(http_request.status != 200)
- return alert('Whoops, error! :(');
- func(http_request);
- };
- url += (url.indexOf('?')>=0 ? ';' : '?')+(Math.floor(Math.random()*999)+1);
- http_request.open('GET', url, true);
- http_request.send(null);
-}
-
-function setCookie(n,v) {
- var date = new Date();
- date.setTime(date.getTime()+(365*24*60*60*1000));
- document.cookie = n+'='+v+'; expires='+date.toGMTString()+'; path=/';
-}
-function getCookie(n) {
- var l = document.cookie.split(';');
- for(var i=0; i<l.length; i++) {
- var c = l[i];
- while(c.charAt(0) == ' ')
- c = c.substring(1,c.length);
- if(c.indexOf(n+'=') == 0)
- return c.substring(n.length+1,c.length);
- }
- return null;
-}
-
-function x(y) { // deprecated
- return document.getElementById(y)
-}
-function byId(n) {
- return document.getElementById(n)
-}
-function byName(){
- var d = arguments.length > 1 ? arguments[0] : document;
- var n = arguments.length > 1 ? arguments[1] : arguments[0];
- return d.getElementsByTagName(n);
-}
-function byClass() { // [class], [parent, class], [tagname, class], [parent, tagname, class]
- var par = typeof arguments[0] == 'object' ? arguments[0] : document;
- var tag = arguments.length == 2 && typeof arguments[0] == 'string' ? arguments[0] : arguments.length == 3 ? arguments[1] : '*';
- var c = arguments[arguments.length-1];
- var l = byName(par, tag);
- var ret = [];
- for(var i=0; i<l.length; i++)
- if(hasClass(l[i], c))
- ret[ret.length] = l[i];
- return ret;
-}
-
-/* wrapper around DOM element creation
- * tag('string') -> createTextNode
- * tag('tagname', tag(), 'string', ..) -> createElement(), appendChild(), ..
- * tag('tagname', { class: 'meh', title: 'Title' }) -> createElement(), setAttribute()..
- * tag('tagname', { <attributes> }, <elements>) -> create, setattr, append */
-function tag() {
- if(arguments.length == 1)
- return typeof arguments[0] != 'object' ? document.createTextNode(arguments[0]) : arguments[0];
- var el = typeof document.createElementNS != 'undefined'
- ? document.createElementNS('http://www.w3.org/1999/xhtml', arguments[0])
- : document.createElement(arguments[0]);
- for(var i=1; i<arguments.length; i++) {
- if(arguments[i] == null)
- continue;
- if(typeof arguments[i] == 'object' && !arguments[i].appendChild) {
- for(attr in arguments[i]) {
- if(attr == 'style')
- el.setAttribute(attr, arguments[i][attr]);
- else
- el[ attr == 'class' ? 'className' : attr == 'for' ? 'htmlFor' : attr ] = arguments[i][attr];
- }
- } else
- el.appendChild(tag(arguments[i]));
- }
- return el;
-}
-function addBody(el) {
- if(document.body.appendChild)
- document.body.appendChild(el);
- else if(document.documentElement.appendChild)
- document.documentElement.appendChild(el);
- else if(document.appendChild)
- document.appendChild(el);
-}
-function setContent() {
- setText(arguments[0], '');
- for(var i=1; i<arguments.length; i++)
- arguments[0].appendChild(tag(arguments[i]));
-}
-function getText(obj) {
- return obj.textContent || obj.innerText || '';
-}
-function setText(obj, txt) {
- if(obj.textContent != null)
- obj.textContent = txt;
- else
- obj.innerText = txt;
-}
-
-function listClass(obj) {
- var n = obj.className;
- if(!n)
- return [];
- return n.split(/ /);
-}
-function hasClass(obj, c) {
- var l = listClass(obj);
- for(var i=0; i<l.length; i++)
- if(l[i] == c)
- return true;
- return false;
-}
-function setClass(obj, c, set) {
- var l = listClass(obj);
- var n = [];
- if(set) {
- n = l;
- if(!hasClass(obj, c))
- n[n.length] = c;
- } else {
- for(var i=0; i<l.length; i++)
- if(l[i] != c)
- n[n.length] = l[i];
- }
- obj.className = n.join(' ');
-}
-
-function shorten(v, l) {
- return v.length > l ? v.substr(0, l-3)+'...' : v;
-}
-
-
-
-
-/* I M A G E V I E W E R */
-
-function ivInit() {
- var init = 0;
- var l = byName('a');
- for(var i=0;i<l.length;i++)
- if(l[i].rel.substr(0,3) == 'iv:') {
- init++;
- l[i].onclick = ivView;
- }
- if(init && !byId('iv_view')) {
- addBody(tag('div', {id: 'iv_view'},
- tag('b', {id:'ivimg'}, ''),
- tag('br', null),
- tag('a', {href:'#', id:'ivfull'}, ''),
- tag('a', {href:'#', onclick: ivClose, id:'ivclose'}, 'close'),
- tag('a', {href:'#', onclick: ivView, id:'ivprev'}, '« previous'),
- tag('a', {href:'#', onclick: ivView, id:'ivnext'}, 'next »')
- ));
- addBody(tag('b', {id:'ivimgload'}, 'Loading...'));
- }
-}
-
-function ivView(what) {
- what = what && what.rel ? what : this;
- var u = what.href;
- var opt = what.rel.split(':');
- var view = byId('iv_view');
- var next = byId('ivnext');
- var prev = byId('ivprev');
- var full = byId('ivfull');
-
- // fix prev/next links (if any)
- if(opt[2]) {
- var ol = byName('a');
- var l=[];
- for(i=0;i<ol.length;i++)
- if(ol[i].rel.substr(0,3) == 'iv:' && ol[i].rel.indexOf(':'+opt[2]) > 4 && !hasClass(ol[i], 'hidden') && ol[i].id != 'ivprev' && ol[i].id != 'ivnext')
- l[l.length] = ol[i];
- for(i=0;i<l.length;i++)
- if(l[i].href == u) {
- next.style.visibility = l[i+1] ? 'visible' : 'hidden';
- next.href = l[i+1] ? l[i+1].href : '#';
- next.rel = l[i+1] ? l[i+1].rel : '';
- prev.style.visibility = l[i-1] ? 'visible' : 'hidden';
- prev.href = l[i-1] ? l[i-1].href : '#';
- prev.rel = l[i-1] ? l[i-1].rel : '';
- }
- } else
- next.style.visibility = prev.style.visibility = 'hidden';
-
- // calculate dimensions
- var w = Math.floor(opt[1].split('x')[0]);
- var h = Math.floor(opt[1].split('x')[1]);
- var ww = typeof(window.innerWidth) == 'number' ? window.innerWidth : document.documentElement.clientWidth;
- var wh = typeof(window.innerHeight) == 'number' ? window.innerHeight : document.documentElement.clientHeight;
- var st = typeof(window.pageYOffset) == 'number' ? window.pageYOffset : document.body && document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
- if(w+100 > ww || h+70 > wh) {
- full.href = u;
- setText(full, w+'x'+h);
- full.style.visibility = 'visible';
- if(w/h > ww/wh) { // width++
- h *= (ww-100)/w;
- w = ww-100;
- } else { // height++
- w *= (wh-70)/h;
- h = wh-70;
- }
- } else
- full.style.visibility = 'hidden';
- var dw = w;
- var dh = h+20;
- dw = dw < 200 ? 200 : dw;
-
- // update document
- view.style.display = 'block';
- setContent(byId('ivimg'), tag('img', {src:u, onclick:ivClose,
- onload: function() { byId('ivimgload').style.top='-400px'; },
- style: 'width: '+w+'px; height: '+h+'px'
- }));
- view.style.width = dw+'px';
- view.style.height = dh+'px';
- view.style.left = ((ww - dw) / 2 - 10)+'px';
- view.style.top = ((wh - dh) / 2 + st - 20)+'px';
- byId('ivimgload').style.left = ((ww - 100) / 2 - 10)+'px';
- byId('ivimgload').style.top = ((wh - 20) / 2 + st)+'px';
- return false;
-}
-
-function ivClose() {
- byId('iv_view').style.display = 'none';
- byId('iv_view').style.top = '-5000px';
- byId('ivimgload').style.top = '-400px';
- setText(byId('ivimg'), '');
- return false;
-}
-
-ivInit();
-
-
-
-
-/* D R O P D O W N */
-
-function ddInit(obj, align, contents) {
- obj.dd_align = align; // see ddRefresh for details
- obj.dd_contents = contents;
- document.onmousemove = ddMouseMove;
- document.onscroll = ddHide;
- if(!byId('dd_box'))
- addBody(tag('div', {id:'dd_box', dd_used: false}));
-}
-
-function ddHide() {
- var box = byId('dd_box');
- setText(box, '');
- box.style.left = '-500px';
- box.dd_used = false;
- box.dd_lnk = null;
-}
-
-function ddMouseMove(e) {
- e = e || window.event;
- var lnk = e.target || e.srcElement;
- while(lnk && (lnk.nodeType == 3 || !lnk.dd_align))
- lnk = lnk.parentNode;
- var box = byId('dd_box');
- if(!box.dd_used && !lnk)
- return;
-
- if(box.dd_used) {
- var mouseX = e.pageX || (e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft);
- var mouseY = e.pageY || (e.clientY + document.body.scrollTop + document.documentElement.scrollTop);
- if((mouseX < ddx-10 || mouseX > ddx+box.offsetWidth+10 || mouseY < ddy-10 || mouseY > ddy+box.offsetHeight+10)
- || (lnk && lnk == box.dd_lnk))
- ddHide();
- }
-
- if(!box.dd_used && lnk) {
- box.dd_lnk = lnk;
- box.dd_used = true;
- if(!ddRefresh())
- ddHide();
- }
-}
-
-function ddRefresh() {
- var box = byId('dd_box');
- if(!box.dd_used)
- return false;
- var lnk = box.dd_lnk;
- var content = lnk.dd_contents(lnk, box);
- if(content == null)
- return false;
- setContent(box, content);
-
- var o = lnk;
- ddx = ddy = 0;
- do {
- ddx += o.offsetLeft;
- ddy += o.offsetTop;
- } while(o = o.offsetParent);
-
- if(lnk.dd_align == 'left')
- ddx -= box.offsetWidth;
- if(lnk.dd_align == 'tagmod')
- ddx += lnk.offsetWidth-35;
- box.style.left = ddx+'px';
- box.style.top = ddy+'px';
- return true;
-}
-
-
-// release list dropdown on VN pages
-
-var rstat = [ 'Unknown', 'Pending', 'Obtained', 'On loan', 'Deleted' ];
-var vstat = [ 'Unknown', 'Playing', 'Finished', 'Stalled', 'Dropped' ];
-function rlDropDown(lnk) {
- var relid = lnk.id.substr(6);
- var st = getText(lnk).split(' / ');
- if(st[0].indexOf('loading') >= 0)
- return null;
-
- var rs = tag('ul', tag('li', tag('b', 'Release status')));
- var vs = tag('ul', tag('li', tag('b', 'Play status')));
- for(var i=0;i<rstat.length;i++) {
- if(st[0] && st[0].indexOf(rstat[i]) >= 0)
- rs.appendChild(tag('li', tag('i', rstat[i])));
- else
- rs.appendChild(tag('li', tag('a', {href:'#', rl_rid:relid, rl_act:'r'+i, onclick:rlMod}, rstat[i])));
- }
- for(var i=0;i<vstat.length;i++) {
- if(st[0] && st[0].indexOf(vstat[i]) >= 0)
- vs.appendChild(tag('li', tag('i', vstat[i])));
- else
- vs.appendChild(tag('li', tag('a', {href:'#', rl_rid:relid, rl_act:'v'+i, onclick:rlMod}, vstat[i])));
- }
-
- return tag('div', {'class':'vrdd'}, rs, vs, st[0] == '--' ? null :
- tag('ul', {'class':'full'}, tag('li', tag('a', {href:'#', rl_rid: relid, rl_act:'del', onclick:rlMod}, 'Remove from VN List')))
- );
-}
-
-function rlMod() {
- var lnk = byId('rlsel_'+this.rl_rid);
- ddHide();
- setContent(lnk, tag('b', {'class': 'patch'}, 'loading...'));
- ajax('/xml/rlist.xml?id='+this.rl_rid+';e='+this.rl_act, function(hr) {
- // TODO: get rid of innerHTML here...
- lnk.innerHTML = hr.responseXML.getElementsByTagName('rlist')[0].firstChild.nodeValue;
- });
- return false;
-}
-
-{
- var l = byClass('a', 'vnrlsel');
- for(var i=0;i<l.length;i++)
- ddInit(l[i], 'left', rlDropDown);
-}
-
-
-
-
-/* J A V A S C R I P T T A B S */
-
-function jtInit() {
- if(!byId('jt_select'))
- return;
- var sel = '';
- var first = '';
- var l = byName(byId('jt_select'), 'a');
- if(l.length < 1)
- return;
- for(var i=0; i<l.length; i++) {
- l[i].onclick = jtSel;
- if(!first)
- first = l[i].id;
- if(location.hash && l[i].id == 'jt_sel_'+location.hash.substr(1))
- sel = l[i].id;
- }
- if(!sel)
- sel = first;
- jtSel(sel, 1);
-}
-
-function jtSel(which, nolink) {
- which = typeof(which) == 'string' ? which : which && which.id ? which.id : this.id;
- which = which.substr(7);
-
- var l = byName(byId('jt_select'), 'a');
- for(var i=0;i<l.length;i++) {
- var name = l[i].id.substr(7);
- if(name != 'all')
- byId('jt_box_'+name).style.display = name == which || which == 'all' ? 'block' : 'none';
- var tab = l[i].parentNode;
- setClass(tab, 'tabselected', name == which);
- }
-
- if(!nolink)
- location.href = '#'+which;
- return false;
-}
-
-jtInit();
-
-
-
-
-/* V N P A G E T A G S P O I L E R S */
-
-function tvsInit() {
- if(!byId('tagops'))
- return;
- var l = byName(byId('tagops'), 'a');
- for(var i=0;i<l.length; i++)
- l[i].onclick = tvsClick;
- tvsSet(getCookie('tagspoil'), true);
-}
-
-function tvsClick() {
- var sel;
- var l = byName(byId('tagops'), 'a');
- for(var i=0; i<l.length; i++)
- if(l[i] == this) {
- if(i < 3) {
- tvsSet(i, null);
- setCookie('tagspoil', i);
- } else
- tvsSet(null, i == 3 ? true : false);
- }
- return false;
-}
-
-function tvsSet(lvl, lim) {
- /* set/get level and limit to/from the links */
- var l = byName(byId('tagops'), 'a');
- for(var i=0; i<l.length; i++) {
- if(i < 3) { /* spoiler level */
- if(lvl != null)
- setClass(l[i], 'tsel', i == lvl);
- if(lvl == null && hasClass(l[i], 'tsel'))
- lvl = i;
- } else { /* display limit (3 = summary) */
- if(lim != null)
- setClass(l[i], 'tsel', lim == (i == 3));
- if(lim == null && hasClass(l[i], 'tsel'))
- lim = i == 3;
- }
- }
-
- /* update tag visibility */
- l = byName(byId('vntags'), 'span');
- lim = lim ? 15 : 999;
- var s=0;
- for(i=0;i<l.length;i++) {
- var thislvl = l[i].className.substr(6, 1);
- if(thislvl <= lvl && s < lim) {
- setClass(l[i], 'hidden', false);
- s++;
- } else
- setClass(l[i], 'hidden', true);
- }
- return false;
-}
-
-tvsInit();
-
-
-
-
-/* D A T E I N P U T */
-
-var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
-
-function dateLoad(obj) {
- var val = Math.floor(obj.value) || 0;
- val = [ Math.floor(val/10000), Math.floor(val/100)%100, val%100 ];
-
- var year = tag('select', {style: 'width: 70px', onchange: dateSerialize}, tag('option', {value:0}, '-year-'));
- for(var i=1980; i<=(new Date()).getFullYear()+5; i++)
- year.appendChild(tag('option', {value: i, selected: i==val[0]}, i));
- year.appendChild(tag('option', {value: 9999, selected: val[0]==9999}, 'TBA'));
-
- var month = tag('select', {style: 'width: 100px', onchange: dateSerialize}, tag('option', {value:99}, '-month-'));
- for(var i=1; i<=12; i++)
- month.appendChild(tag('option', {value: i, selected: i==val[1]}, months[i-1]));
-
- var day = tag('select', {style: 'width: 70px', onchange: dateSerialize}, tag('option', {value:99}, '-day-'));
- for(var i=1; i<=31; i++)
- day.appendChild(tag('option', {value: i, selected: i==val[2]}, i));
-
- obj.parentNode.insertBefore(tag('div', {date_obj: obj}, year, month, day), obj);
-}
-
-function dateSerialize() {
- var div = this.parentNode;
- var sel = byName(div, 'select');
- var val = [
- sel[0].options[sel[0].selectedIndex].value*1,
- sel[1].options[sel[1].selectedIndex].value*1,
- sel[2].options[sel[2].selectedIndex].value*1
- ];
- div.date_obj.value = val[0] == 0 ? 0 : val[0] == 9999 ? 99999999 : val[0]*10000+val[1]*100+(val[1]==99?99:val[2]);
-}
-
-{
- var l = byClass('input', 'dateinput');
- for(i=0; i<l.length; i++)
- dateLoad(l[i]);
-}
-
-
-
-
-/* D R O P D O W N S E A R C H */
-
-function dsInit(obj, url, trfunc, serfunc, retfunc, parfunc) {
- obj.setAttribute('autocomplete', 'off');
- obj.onkeydown = dsKeyDown;
- obj.onblur = function() { setTimeout(function () { byId('ds_box').style.top = '-500px'; }, 500) };
- obj.ds_returnFunc = retfunc;
- obj.ds_trFunc = trfunc;
- obj.ds_serFunc = serfunc;
- obj.ds_parFunc = parfunc;
- obj.ds_searchURL = url;
- obj.ds_selectedId = 0;
- obj.ds_dosearch = null;
- if(!byId('ds_box'))
- addBody(tag('div', {id: 'ds_box', style: 'position: absolute; top: -500px'}, tag('b', 'Loading...')));
-}
-
-function dsKeyDown(ev) {
- var c = document.layers ? ev.which : document.all ? event.keyCode : ev.keyCode;
- var obj = this;
-
- if(c == 9) // tab
- return true;
-
- // do some processing when the enter key has been pressed
- if(c == 13) {
- var frm = obj;
- while(frm && frm.nodeName.toLowerCase() != 'form')
- frm = frm.parentNode;
- if(frm) {
- var oldsubmit = frm.onsubmit;
- frm.onsubmit = function() { return false };
- setTimeout(function() { frm.onsubmit = oldsubmit }, 100);
- }
-
- if(obj.ds_selectedId != 0)
- obj.value = obj.ds_serFunc(byId('ds_box_'+obj.ds_selectedId).ds_itemData, obj);
- if(obj.ds_returnFunc)
- obj.ds_returnFunc();
-
- byId('ds_box').style.top = '-500px';
- setContent(byId('ds_box'), tag('b', 'Loading...'));
- obj.ds_selectedId = 0;
- if(obj.ds_dosearch) {
- clearTimeout(obj.ds_dosearch);
- obj.ds_dosearch = null;
- }
-
- return false;
- }
-
- // process up/down keys
- if(c == 38 || c == 40) {
- var l = byName(byId('ds_box'), 'tr');
- if(l.length < 1)
- return true;
-
- // get new selected id
- if(obj.ds_selectedId == 0) {
- if(c == 38) // up
- obj.ds_selectedId = l[l.length-1].id.substr(7);
- else
- obj.ds_selectedId = l[0].id.substr(7);
- } else {
- var sel = null;
- for(var i=0; i<l.length; i++)
- if(l[i].id == 'ds_box_'+obj.ds_selectedId) {
- if(c == 38) // up
- sel = i>0 ? l[i-1] : l[l.length-1];
- else
- sel = l[i+1] ? l[i+1] : l[0];
- }
- obj.ds_selectedId = sel.id.substr(7);
- }
-
- // set selected class
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'selected', l[i].id == 'ds_box_'+obj.ds_selectedId);
- return true;
- }
-
- // perform search after a timeout
- if(obj.ds_dosearch)
- clearTimeout(obj.ds_dosearch);
- obj.ds_dosearch = setTimeout(function() {
- dsSearch(obj);
- }, 500);
-
- return true;
-}
-
-function dsSearch(obj) {
- var box = byId('ds_box');
- var val = obj.ds_parFunc ? obj.ds_parFunc(obj.value) : obj.value;
-
- clearTimeout(obj.ds_dosearch);
- obj.ds_dosearch = null;
-
- // hide the ds_box div
- if(val.length < 2) {
- box.style.top = '-500px';
- setContent(box, tag('b', 'Loading...'));
- obj.ds_selectedId = 0;
- return;
- }
-
- // position the div
- var ddx=0;
- var ddy=obj.offsetHeight;
- var o = obj;
- do {
- ddx += o.offsetLeft;
- ddy += o.offsetTop;
- } while(o = o.offsetParent);
-
- box.style.position = 'absolute';
- box.style.left = ddx+'px';
- box.style.top = ddy+'px';
- box.style.width = obj.offsetWidth+'px';
-
- // perform search
- ajax(obj.ds_searchURL + encodeURIComponent(val), function(hr) {
- dsResults(hr, obj);
- });
-}
-
-function dsResults(hr, obj) {
- var lst = hr.responseXML.getElementsByTagName('item');
- var box = byId('ds_box');
- if(lst.length < 1) {
- setContent(box, tag('b', 'No results...'));
- obj.selectedId = 0;
- return;
- }
-
- var tb = tag('tbody', null);
- for(var i=0; i<lst.length; i++) {
- var id = lst[i].getAttribute('id');
- var tr = tag('tr', {id: 'ds_box_'+id, ds_itemData: lst[i]} );
- setClass(tr, 'selected', obj.selectedId == id);
-
- tr.onmouseover = function() {
- obj.ds_selectedId = this.id.substr(7);
- var l = byName(box, 'tr');
- for(var j=0; j<l.length; j++)
- setClass(l[j], 'selected', l[j].id == 'ds_box_'+obj.ds_selectedId);
- };
- tr.onmousedown = function() {
- obj.value = obj.ds_serFunc(this.ds_itemData, obj);
- if(obj.ds_returnFunc)
- obj.ds_returnFunc();
- box.style.top = '-500px';
- obj.ds_selectedId = 0;
- };
-
- obj.ds_trFunc(lst[i], tr);
- tb.appendChild(tr);
- }
- setContent(box, tag('table', tb));
-
- if(obj.ds_selectedId != 0 && !byId('ds_box_'+obj.ds_selectedId))
- obj.ds_selectedId = 0;
-}
-
-
-
-
-/* V I S U A L N O V E L R E L A T I O N S (/v+/edit) */
-
-function vnrLoad() {
- // read the current relations
- var rels = byId('vnrelations').value.split('|||');
- for(var i=0; i<rels.length && rels[0].length>1; i++) {
- var rel = rels[i].split(',', 3);
- vnrAdd(rel[0], rel[1], rel[2]);
- }
- vnrEmpty();
-
- // make sure the title is up-to-date
- byId('title').onchange = function() {
- var l = byClass(byId('jt_box_vn_rel'), 'td', 'tc_title');
- for(i=0; i<l.length; i++)
- setText(l[i], shorten(this.value, 40));
- };
-
- // bind the add-link
- byName(byClass(byId('relation_new'), 'td', 'tc_add')[0], 'a')[0].onclick = vnrFormAdd;
-
- // dropdown
- dsInit(byName(byClass(byId('relation_new'), 'td', 'tc_vn')[0], 'input')[0], '/xml/vn.xml?q=', function(item, tr) {
- tr.appendChild(tag('td', { style: 'text-align: right; padding-right: 5px'}, 'v'+item.getAttribute('id')));
- tr.appendChild(tag('td', shorten(item.firstChild.nodeValue, 40)));
- }, function(item) {
- return 'v'+item.getAttribute('id')+':'+item.firstChild.nodeValue;
- }, vnrFormAdd);
-}
-
-function vnrAdd(rel, vid, title) {
- var sel = tag('select', {onchange: vnrSerialize});
- var ops = byName(byClass(byId('relation_new'), 'td', 'tc_rel')[0], 'select')[0].options;
- for(var i=0; i<ops.length; i++)
- sel.appendChild(tag('option', {value: ops[i].value, selected: ops[i].value==rel}, getText(ops[i])));
-
- byId('relation_tbl').appendChild(tag('tr', {id:'relation_tr_'+vid},
- tag('td', {'class':'tc_vn' }, 'v'+vid+':', tag('a', {href:'/v'+vid}, shorten(title, 40))),
- tag('td', {'class':'tc_rel' }, 'is a ', sel, ' of'),
- tag('td', {'class':'tc_title'}, shorten(byId('title').value, 40)),
- tag('td', {'class':'tc_add' }, tag('a', {href:'#', onclick:vnrDel}, 'del'))
- ));
-
- vnrEmpty();
-}
-
-function vnrEmpty() {
- var tbl = byId('relation_tbl');
- if(byName(tbl, 'tr').length < 1)
- tbl.appendChild(tag('tr', {id:'relation_tr_none'}, tag('td', {colspan:4}, 'No relations selected.')));
- else if(byId('relation_tr_none'))
- tbl.removeChild(byId('relation_tr_none'));
-}
-
-function vnrSerialize() {
- var r = [];
- var trs = byName(byId('relation_tbl'), 'tr');
- for(var i=0; i<trs.length; i++) {
- if(trs[i].id == 'relation_tr_none')
- continue;
- var rel = byName(byClass(trs[i], 'td', 'tc_rel')[0], 'select')[0];
- r[r.length] = [
- rel.options[rel.selectedIndex].value, // relation
- trs[i].id.substr(12), // vid
- getText(byName(byClass(trs[i], 'td', 'tc_vn')[0], 'a')[0]) // title
- ].join(',');
- }
- byId('vnrelations').value = r.join('|||');
-}
-
-function vnrDel() {
- var tr = this;
- while(tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
- byId('relation_tbl').removeChild(tr);
- vnrSerialize();
- vnrEmpty();
- return false;
-}
-
-function vnrFormAdd() {
- var relnew = byId('relation_new');
- var txt = byName(byClass(relnew, 'td', 'tc_vn')[0], 'input')[0];
- var sel = byName(byClass(relnew, 'td', 'tc_rel')[0], 'select')[0];
- var lnk = byName(byClass(relnew, 'td', 'tc_add')[0], 'a')[0];
- var input = txt.value;
-
- if(!input.match(/^v[0-9]+/)) {
- alert('Visual novel textbox must start with an ID (e.g. v17)');
- return false;
- }
-
- txt.disabled = sel.disabled = true;
- txt.value = 'loading...';
- setText(lnk, 'loading...');
-
- ajax('/xml/vn.xml?q='+encodeURIComponent(input), function(hr) {
- txt.disabled = sel.disabled = false;
- txt.value = '';
- setText(lnk, 'add');
-
- var items = hr.responseXML.getElementsByTagName('item');
- if(items.length < 1)
- return alert('Visual novel not found!');
-
- var id = items[0].getAttribute('id');
- if(byId('relation_tr_'+id))
- return alert('This visual novel has already been selected!');
-
- vnrAdd(sel.selectedIndex, id, items[0].firstChild.nodeValue);
- sel.selectedIndex = 0;
- vnrSerialize();
- });
- return false;
-}
-
-if(byId('vnrelations'))
- vnrLoad();
-
-
-
-
-/* R E L E A S E M E D I A (/r+/edit) */
-
-var medTypes = [ ];
-function medLoad() {
- // load the medTypes and clear the div
- var sel = byName(byId('media_div'), 'select')[0].options;
- for(var i=0; i<sel.length; i++)
- medTypes[medTypes.length] = [ sel[i].value, getText(sel[i]), !hasClass(sel[i], 'noqty') ];
- setText(byId('media_div'), '');
-
- // load the selected media
- var med = byId('media').value.split(',');
- for(var i=0; i<med.length && med[i].length > 1; i++)
- medAdd(med[i].split(' ')[0], Math.floor(med[i].split(' ')[1]));
-
- medAdd('', 0);
-}
-
-function medAdd(med, qty) {
- var qsel = tag('select', {'class':'qty', onchange:medSerialize}, tag('option', {value:0}, '- quantity -'));
- for(var i=1; i<=20; i++)
- qsel.appendChild(tag('option', {value:i, selected: qty==i}, i));
-
- var msel = tag('select', {'class':'medium', onchange: med == '' ? medFormAdd : medSerialize});
- if(med == '')
- msel.appendChild(tag('option', {value:''}, '- medium -'));
- for(var i=0; i<medTypes.length; i++)
- msel.appendChild(tag('option', {value:medTypes[i][0], selected: med==medTypes[i][0]}, medTypes[i][1]));
-
- byId('media_div').appendChild(tag('span', qsel, msel,
- med != '' ? tag('input', {type: 'button', 'class':'submit', onclick:medDel, value:'remove'}) : null
- ));
-}
-
-function medDel() {
- var span = this;
- while(span.nodeName.toLowerCase() != 'span')
- span = span.parentNode;
- byId('media_div').removeChild(span);
- medSerialize();
- return false;
-}
-
-function medFormAdd() {
- var span = this;
- while(span.nodeName.toLowerCase() != 'span')
- span = span.parentNode;
- var med = byClass(span, 'select', 'medium')[0];
- var qty = byClass(span, 'select', 'qty')[0];
- if(!med.selectedIndex)
- return;
- medAdd(med.options[med.selectedIndex].value, qty.options[qty.selectedIndex].value);
- byId('media_div').removeChild(span);
- medAdd('', 0);
- medSerialize();
-}
-
-function medSerialize() {
- var r = [];
- var meds = byName(byId('media_div'), 'span');
- for(var i=0; i<meds.length-1; i++) {
- var med = byClass(meds[i], 'select', 'medium')[0];
- var qty = byClass(meds[i], 'select', 'qty')[0];
-
- /* correct quantity if necessary */
- if(medTypes[med.selectedIndex][2] && !qty.selectedIndex)
- qty.selectedIndex = 1;
- if(!medTypes[med.selectedIndex][2] && qty.selectedIndex)
- qty.selectedIndex = 0;
-
- r[r.length] = medTypes[med.selectedIndex][0] + ' ' + qty.selectedIndex;
- }
- byId('media').value = r.join(',');
-}
-
-if(byId('jt_box_rel_format'))
- medLoad();
-
-
-
-
-/* V I S U A L N O V E L S C R E E N S H O T U P L O A D E R (/v+/edit) */
-
-var scrRel = [ [ 0, '-- select release --' ] ];
-var scrStaticURL;
-var scrUplNr = 0;
-
-function scrLoad() {
- // get scrRel and scrStaticURL
- var rel = byId('scr_rel');
- scrStaticURL = rel.className;
- for(var i=0; i<rel.options.length; i++)
- scrRel[scrRel.length] = [ rel.options[i].value, getText(rel.options[i]) ];
- rel.parentNode.removeChild(rel);
-
- // load the current screenshots
- var scr = byId('screenshots').value.split(' ');
- for(i=0; i<scr.length && scr[i].length>1; i++) {
- var r = scr[i].split(',');
- scrAdd(r[0], r[1], r[2]);
- }
-
- scrLast();
- scrCheckStatus();
- scrSetSubmit();
-}
-
-function scrSetSubmit() {
- var frm = byId('screenshots');
- while(frm.nodeName.toLowerCase() != 'form')
- frm = frm.parentNode;
- oldfunc = frm.onsubmit;
- frm.onsubmit = function() {
- var loading = 0;
- var norelease = 0;
- var l = byName(byId('scr_table'), 'tr');
- for(var i=0; i<l.length-1; i++) {
- if(l[i].scr_status > 0)
- loading = 1;
- else if(byName(l[i], 'select')[0].selectedIndex == 0)
- norelease = 1;
- }
- if(loading) {
- alert('Please wait for the screenshots to be uploaded before submitting the form.');
- return false;
- } else if(norelease) {
- alert('Please select the appropriate release for every screenshot');
- return false;
- } else if(oldfunc)
- return oldfunc();
- };
-}
-
-function scrURL(id, t) {
- return scrStaticURL+'/s'+t+'/'+(id%100<10?'0':'')+(id%100)+'/'+id+'.jpg';
-}
-
-function scrAdd(id, nsfw, rel) {
- // tr.scr_status = 0: done, 1: uploading, 2: waiting for thumbnail, 3: deleted
-
- var tr = tag('tr', { id:'scr_tr_'+id, scr_id: id, scr_status: id?2:1, scr_rel: rel, scr_nsfw: nsfw},
- tag('td', { 'class': 'thumb'}, 'loading...'),
- tag('td',
- tag('b', id ? 'Fetching thumbnail...' : 'Uploading screenshot'),
- tag('br', null),
- id ? null : 'This can take a while, depending on the file size and your upload speed.',
- tag('br', null),
- id ? null : tag('a', {href:'#', onclick:scrDel}, 'cancel')
- )
- );
- byId('scr_table').appendChild(tr);
- scrStripe();
- return tr;
-}
-
-function scrLast() {
- if(byId('scr_last'))
- byId('scr_table').removeChild(byId('scr_last'));
- var full = byName(byId('scr_table'), 'tr').length >= 10;
-
- byId('scr_table').appendChild(tag('tr', {id:'scr_last'},
- tag('td', {'class': 'thumb'}),
- full ? tag('td',
- tag('b', 'Enough screenshots'),
- tag('br', null),
- 'The limit of 10 screenshots per visual novel has been reached. ',
- 'If you want to add a new screenshot, please remove an existing one first.'
- ) : tag('td',
- tag('b', 'Add screenshot'),
- tag('br', null),
- 'Image must be smaller than 5MB and in PNG or JPEG format.',
- tag('br', null),
- tag('input', {name:'scr_upload', id:'scr_upload', type:'file', 'class':'text'}),
- tag('br', null),
- tag('input', {type:'button', value:'Upload!', 'class':'submit', onclick:scrUpload})
- )
- ));
- scrStripe();
-}
-
-function scrStripe() {
- var l = byName(byId('scr_table'), 'tr');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'odd', i%2==0);
-}
-
-function scrCheckStatus() {
- var ids = [];
- var trs = byName(byId('scr_table'), 'tr');
- for(var i=0; i<trs.length-1; i++)
- if(trs[i].scr_status == 2)
- ids[ids.length] = 'id='+trs[i].scr_id;
- if(!ids.length)
- return setTimeout(scrCheckStatus, 1000);
-
- var ti = setTimeout(scrCheckStatus, 10000);
- ajax('/xml/screenshots.xml?'+ids.join(';'), function(hr) {
- var ls = hr.responseXML.getElementsByTagName('item');
- for(var i=0; i<ls.length; i++) {
- var tr = byId('scr_tr_'+ls[i].getAttribute('id'));
- if(!tr || ls[i].getAttribute('processed') != '1')
- continue;
- tr.scr_status = 0; // ready
-
- // image
- var dim = ls[i].getAttribute('width')+'x'+ls[i].getAttribute('height');
- setContent(byName(tr, 'td')[0],
- tag('a', {href: scrURL(tr.scr_id, 'f'), rel:'iv:'+dim+':edit'},
- tag('img', {src: scrURL(tr.scr_id, 't')})
- )
- );
-
- // content
- var rel = tag('select', {onchange: scrSerialize, 'class':'scr_relsel'});
- for(var j=0; j<scrRel.length; j++)
- rel.appendChild(tag('option', {value: scrRel[j][0], selected: tr.scr_rel == scrRel[j][0]}, scrRel[j][1]));
- var nsfwid = 'scr_sfw_'+tr.scr_id;
- setContent(byName(tr, 'td')[1],
- tag('b', 'Screenshot #'+tr.scr_id),
- ' (', tag('a', {href: '#', onclick:scrDel}, 'remove'), ')',
- tag('br', null),
- 'Full size: '+dim,
- tag('br', null),
- tag('br', null),
- tag('input', {type:'checkbox', onclick:scrSerialize, id:nsfwid, name:nsfwid, checked: tr.scr_nsfw>0, 'class':'scr_nsfw'}),
- tag('label', {'for':nsfwid}, 'This screenshot is NSFW'),
- tag('br', null),
- rel
- );
- }
- scrSerialize();
- ivInit();
- clearTimeout(ti);
- setTimeout(scrCheckStatus, 1000);
- });
-}
-
-function scrDel(what) {
- var tr = what && what.scr_status != null ? what : this;
- while(tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
- tr.scr_status = 3;
- byId('scr_table').removeChild(tr);
- scrSerialize();
- scrLast();
- return false;
-}
-
-function scrUpload() {
- scrUplNr++;
-
- // create temporary form
- var ifid = 'scr_upl_'+scrUplNr;
- var frm = tag('form', {method: 'post', action:'/xml/screenshots.xml', target: ifid, enctype:'multipart/form-data'});
- var ifr = tag('iframe', {id:ifid, name:ifid, src:'about:blank', onload:scrUploadComplete});
- addBody(tag('div', {'class':'scr_uploader'}, ifr, frm));
-
- // submit form and delete it
- frm.appendChild(byId('scr_upload'));
- frm.submit();
- frm.parentNode.removeChild(frm);
- ifr.scr_tr = scrAdd(0, 0, 0);
- scrLast();
- return false;
-}
-
-function scrUploadComplete() {
- var ifr = this;
- var fr = window.frames[ifr.id];
- if(fr.location.href.indexOf('screenshots') < 0)
- return;
-
- var tr = ifr.scr_tr;
- if(!tr || tr.scr_status == 3)
- return;
-
- try {
- tr.scr_id = fr.window.document.getElementsByTagName('image')[0].getAttribute('id');
- } catch(e) {
- tr.scr_id = -10;
- }
- if(tr.scr_id < 0) {
- alert(
- tr.scr_id == -10 ?
- 'Oops! Seems like something went wrong...\n'
- +'Make sure the file you\'re uploading doesn\'t exceed 5MB in size.\n'
- +'If that isn\'t the problem, then please report a bug.' :
- tr.scr_id == -1 ?
- 'Upload failed!\nOnly JPEG or PNG images are accepted.' :
- 'Upload failed!\nNo file selected, or an empty file?'
- );
- return scrDel(tr);
- }
-
- tr.id = 'scr_tr_'+tr.scr_id;
- tr.scr_status = 2;
- setContent(byName(tr, 'td')[1],
- tag('b', 'Generating thumbnail...'),
- tag('br', null),
- 'Note: if this takes longer than 30 seconds, there\'s probably something wrong on our side. ',
- 'Please try again later or report a bug if that is the case.'
- );
-
- // remove the <div> in a timeout, otherwise some browsers think the page is still loading
- setTimeout(function() { ifr.parentNode.parentNode.removeChild(ifr.parentNode) }, 100);
-}
-
-function scrSerialize() {
- var r = [];
- var l = byName(byId('scr_table'), 'tr');
- for(var i=0; i<l.length-1; i++)
- if(l[i].scr_status == 0)
- r[r.length] = [
- l[i].scr_id,
- byClass(l[i], 'input', 'scr_nsfw')[0].checked ? 1 : 0,
- scrRel[byClass(l[i], 'select', 'scr_relsel')[0].selectedIndex][0]
- ].join(',');
- byId('screenshots').value = r.join(' ');
-}
-
-if(x('jt_box_vn_scr'))
- scrLoad();
-
-
-
-
-/* V I S U A L N O V E L T A G L I N K I N G (/v+/tagmod) */
-
-var tglSpoilers = [ 'neutral', 'no spoiler', 'minor spoiler', 'major spoiler' ];
-
-function tglLoad() {
- // tag dropdown search
- dsInit(byId('tagmod_tag'), '/xml/tags.xml?q=', function(item, tr) {
- tr.appendChild(tag('td',
- shorten(item.firstChild.nodeValue, 40),
- item.getAttribute('meta') == 'yes' ? tag('b', {'class':'grayedout'}, ' meta') :
- item.getAttribute('state') == 0 ? tag('b', {'class':'grayedout'}, ' awaiting moderation') : null
- ));
- }, function(item) {
- return item.firstChild.nodeValue;
- }, tglAdd);
- byId('tagmod_add').onclick = tglAdd;
-
- // JS'ify the voting bar and spoiler setting
- tglStripe();
- var trs = byName(byId('tagtable'), 'tr');
- for(var i=0; i<trs.length; i++) {
- var vote = byClass(trs[i], 'td', 'tc_myvote')[0];
- vote.tgl_vote = getText(vote)*1;
- tglVoteBar(vote);
-
- var spoil = byClass(trs[i], 'td', 'tc_myspoil')[0];
- spoil.tgl_spoil = getText(spoil)*1+1;
- setText(spoil, tglSpoilers[spoil.tgl_spoil]);
- ddInit(spoil, 'tagmod', tglSpoilDD);
- spoil.onclick = tglSpoilNext;
- }
- tglSerialize();
-}
-
-function tglSpoilNext() {
- if(++this.tgl_spoil >= tglSpoilers.length)
- this.tgl_spoil = 0;
- setText(this, tglSpoilers[this.tgl_spoil]);
- tglSerialize();
- ddRefresh();
-}
-
-function tglSpoilDD(lnk) {
- var lst = tag('ul', null);
- for(var i=0; i<tglSpoilers.length; i++)
- lst.appendChild(tag('li', i == lnk.tgl_spoil
- ? tag('i', tglSpoilers[i])
- : tag('a', {href: '#', onclick:tglSpoilSet, tgl_td:lnk, tgl_sp:i}, tglSpoilers[i])
- ));
- return lst;
-}
-
-function tglSpoilSet() {
- this.tgl_td.tgl_spoil = this.tgl_sp;
- setText(this.tgl_td, tglSpoilers[this.tgl_sp]);
- ddHide();
- tglSerialize();
- return false;
-}
-
-function tglVoteBar(td, vote) {
- setText(td, '');
- for(var i=-3; i<=3; i++)
- td.appendChild(tag('a', {
- 'class':'taglvl taglvl'+i, tgl_num: i,
- onmouseover:tglVoteBarSel, onmouseout:tglVoteBarSel, onclick:tglVoteBarSel
- }, ' '));
- tglVoteBarSel(td, td.tgl_vote);
- return false;
-}
-
-function tglVoteBarSel(td, vote) {
- // nasty trick to make this function multifunctional
- if(this && this.tgl_num != null) {
- var e = td || window.event;
- td = this.parentNode;
- vote = this.tgl_num;
- if(e.type.toLowerCase() == 'click') {
- td.tgl_vote = vote;
- tglSerialize();
- }
- if(e.type.toLowerCase() == 'mouseout')
- vote = td.tgl_vote;
- }
- var l = byName(td, 'a');
- var num;
- for(var i=0; i<l.length; i++) {
- num = l[i].tgl_num;
- if(num == 0)
- setText(l[i], vote || '-');
- else
- setClass(l[i], 'taglvlsel', num<0&&vote<=num || num>0&&vote>=num);
- }
-}
-
-function tglAdd() {
- var tg = byId('tagmod_tag');
- var add = byId('tagmod_add');
- tag.disabled = add.disabled = true;
- add.value = 'loading...';
-
- ajax('/xml/tags.xml?q=name:'+encodeURIComponent(tg.value), function(hr) {
- tg.disabled = add.disabled = false;
- tg.value = '';
- add.value = 'Add tag';
-
- var items = hr.responseXML.getElementsByTagName('item');
- if(items.length < 1)
- return alert('Item not found!');
- if(items[0].getAttribute('meta') == 'yes')
- return alert('Can\'t use meta tags here!');
-
- var name = items[0].firstChild.nodeValue;
- var id = items[0].getAttribute('id');
- if(byId('tgl_'+id))
- return alert('Tag is already present!');
-
- var vote = tag('td', {'class':'tc_myvote', tgl_vote: 2}, '');
- tglVoteBar(vote);
- var spoil = tag('td', {'class':'tc_myspoil', tgl_spoil: 0}, tglSpoilers[0]);
- ddInit(spoil, 'tagmod', tglSpoilDD);
- spoil.onclick = tglSpoilNext;
-
- byId('tagtable').appendChild(tag('tr', {id:'tgl_'+id},
- tag('td', {'class':'tc_tagname'}, tag('a', {href:'/g'+id}, name)),
- vote, spoil,
- tag('td', {'class':'tc_allvote'}, '-'),
- tag('td', {'class':'tc_allspoil'}, '-')
- ));
- tglStripe();
- tglSerialize();
- });
-}
-
-function tglStripe() {
- var l = byName(byId('tagtable'), 'tr');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'odd', i%2);
-}
-
-function tglSerialize() {
- var r = [];
- var l = byName(byId('tagtable'), 'tr');
- for(var i=0; i<l.length; i++) {
- var vote = byClass(l[i], 'td', 'tc_myvote')[0].tgl_vote;
- if(vote != 0)
- r[r.length] = [
- l[i].id.substr(4),
- vote,
- byClass(l[i], 'td', 'tc_myspoil')[0].tgl_spoil-1
- ].join(',');
- }
- byId('taglinks').value = r.join(' ');
-}
-
-if(byId('taglinks'))
- tglLoad();
-
-
-
-
-/* R E L E A S E -> V I S U A L N O V E L L I N K I N G (/r+/edit) */
-
-function rvnLoad() {
- var vns = byId('vn').value.split('|||');
- for(var i=0; i<vns.length && vns[i].length>1; i++)
- rvnAdd(vns[i].split(',',2)[0], vns[i].split(',',2)[1]);
- rvnEmpty();
-
- dsInit(byId('vn_input'), '/xml/vn.xml?q=',
- function(item, tr) {
- tr.appendChild(tag('td', {style:'text-align: right; padding-right: 5px'}, 'v'+item.getAttribute('id')));
- tr.appendChild(tag('td', shorten(item.firstChild.nodeValue, 40)));
- }, function(item) {
- return 'v'+item.getAttribute('id')+':'+item.firstChild.nodeValue;
- },
- rvnFormAdd
- );
- byId('vn_add').onclick = rvnFormAdd;
-}
-
-function rvnAdd(id, title) {
- x('vn_tbl').appendChild(tag('tr', {id:'rvn_'+id, rvn_id:id},
- tag('td', {'class':'tc_title'}, 'v'+id+':', tag('a', {href:'/v'+id}, shorten(title, 40))),
- tag('td', {'class':'tc_rm'}, tag('a', {href:'#', onclick:rvnDel}, 'remove'))
- ));
- rvnStripe();
- rvnEmpty();
-}
-
-function rvnDel() {
- var tr = this;
- while(tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
- tr.parentNode.removeChild(tr);
- rvnEmpty();
- rvnSerialize();
- rvnStripe();
- return false;
-}
-
-function rvnEmpty() {
- var tbl = byId('vn_tbl');
- if(byName(tbl, 'tr').length < 1)
- tbl.appendChild(tag('tr', {id:'rvn_tr_none'}, tag('td', {colspan:2}, 'Nothing selected.')));
- else if(byId('rvn_tr_none'))
- tbl.removeChild(byId('rvn_tr_none'));
-}
-
-function rvnStripe() {
- var l = byName(byId('vn_tbl'), 'tr');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'odd', i%2);
-}
-
-function rvnFormAdd() {
- var txt = byId('vn_input');
- var lnk = byId('vn_add');
- var val = txt.value;
-
- if(!val.match(/^v[0-9]+/)) {
- alert('Visual novel textbox must start with an ID (e.g. v17)');
- return false;
- }
-
- txt.disabled = true;
- txt.value = 'loading...';
- setText(lnk, 'loading...');
-
- ajax('/xml/vn.xml?q='+encodeURIComponent(val), function(hr) {
- txt.disabled = false;
- txt.value = '';
- setText(lnk, 'add');
-
- var items = hr.responseXML.getElementsByTagName('item');
- if(items.length < 1)
- return alert('Visual novel not found!');
-
- var id = items[0].getAttribute('id');
- if(byId('rvn_'+id))
- return alert('VN already selected!');
-
- rvnAdd(id, items[0].firstChild.nodeValue);
- rvnSerialize();
- });
- return false;
-}
-
-function rvnSerialize() {
- var r = [];
- var l = byName(byId('vn_tbl'), 'tr');
- for(var i=0; i<l.length; i++)
- if(l[i].rvn_id)
- r[r.length] = l[i].rvn_id + ',' + getText(byName(byClass(l[i], 'td', 'tc_title')[0], 'a')[0]);
- byId('vn').value = r.join('|||');
-}
-
-if(byId('jt_box_rel_vn'))
- rvnLoad();
-
-
-
-
-/* R E L E A S E -> P R O D U C E R L I N K I N G (/r+/edit) */
-
-function rprLoad() {
- var ps = byId('producers').value.split('|||');
- for(var i=0; i<ps.length && ps[i].length>1; i++)
- rprAdd(ps[i].split(',',2)[0], ps[i].split(',',2)[1]);
- rprEmpty();
-
- dsInit(byId('producer_input'), '/xml/producers.xml?q=',
- function(item, tr) {
- tr.appendChild(tag('td', {style:'text-align: right; padding-right: 5px'}, 'p'+item.getAttribute('id')));
- tr.appendChild(tag('td', shorten(item.firstChild.nodeValue, 40)));
- }, function(item) {
- return 'p'+item.getAttribute('id')+':'+item.firstChild.nodeValue;
- },
- rprFormAdd
- );
- byId('producer_add').onclick = rprFormAdd;
-}
-
-function rprAdd(id, name) {
- x('producer_tbl').appendChild(tag('tr', {id:'rpr_'+id, rpr_id:id},
- tag('td', {'class':'tc_name'}, 'p'+id+':', tag('a', {href:'/p'+id}, shorten(name, 40))),
- tag('td', {'class':'tc_rm'}, tag('a', {href:'#', onclick:rprDel}, 'remove'))
- ));
- rprStripe();
- rprEmpty();
-}
-
-function rprDel() {
- var tr = this;
- while(tr.nodeName.toLowerCase() != 'tr')
- tr = tr.parentNode;
- tr.parentNode.removeChild(tr);
- rprEmpty();
- rprSerialize();
- rprStripe();
- return false;
-}
-
-function rprEmpty() {
- var tbl = byId('producer_tbl');
- if(byName(tbl, 'tr').length < 1)
- tbl.appendChild(tag('tr', {id:'rpr_tr_none'}, tag('td', {colspan:2}, 'Nothing selected.')));
- else if(byId('rpr_tr_none'))
- tbl.removeChild(byId('rpr_tr_none'));
-}
-
-function rprStripe() {
- var l = byName(byId('producer_tbl'), 'tr');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'odd', i%2);
-}
-
-function rprFormAdd() {
- var txt = byId('producer_input');
- var lnk = byId('producer_add');
- var val = txt.value;
-
- if(!val.match(/^p[0-9]+/)) {
- alert('Producer textbox must start with an ID (e.g. p17)');
- return false;
- }
-
- txt.disabled = true;
- txt.value = 'loading...';
- setText(lnk, 'loading...');
-
- ajax('/xml/producers.xml?q='+encodeURIComponent(val), function(hr) {
- txt.disabled = false;
- txt.value = '';
- setText(lnk, 'add');
-
- var items = hr.responseXML.getElementsByTagName('item');
- if(items.length < 1)
- return alert('Producer not found!');
-
- var id = items[0].getAttribute('id');
- if(byId('rpr_'+id))
- return alert('Producer already selected!');
-
- rprAdd(id, items[0].firstChild.nodeValue);
- rprSerialize();
- });
- return false;
-}
-
-function rprSerialize() {
- var r = [];
- var l = byName(byId('producer_tbl'), 'tr');
- for(var i=0; i<l.length; i++)
- if(l[i].rpr_id)
- r[r.length] = l[i].rpr_id + ',' + getText(byName(byClass(l[i], 'td', 'tc_name')[0], 'a')[0]);
- byId('producers').value = r.join('|||');
-}
-
-if(byId('jt_box_rel_prod'))
- rprLoad();
-
-
-
-
-/* M I S C S T U F F */
-
-// search box
-{
- var i = byId('sq');
- i.onfocus = function () {
- if(this.value == 'search') {
- this.value = '';
- this.style.fontStyle = 'normal'
- }
- };
- i.onblur = function () {
- if(this.value.length < 1) {
- this.value = 'search';
- this.style.fontStyle = 'italic'
- }
- };
-}
-
-// VN Voting (/v+)
-if(byId('votesel')) {
- byId('votesel').onchange = function() {
- var s = this.options[this.selectedIndex].value;
- if(s == 1 && !confirm(
- "You are about to give this visual novel a 1 out of 10. This is a rather extreme rating, "
- +"meaning this game has absolutely nothing to offer, and that it's the worst game you have ever played.\n"
- +"Are you really sure this visual novel matches that description?"))
- return;
- if(s == 10 && !confirm(
- "You are about to give this visual novel a 10 out of 10. This is a rather extreme rating, "
- +"meaning this is one of the best visual novels you've ever played and it's unlikely "
- +"that any other game could ever be better than this one.\n"
- +"It is generally a bad idea to have more than three games in your vote list with this rating, choose carefully!"))
- return;
- if(s)
- location.href = location.href.replace(/\.[0-9]+/, '')+'/vote?v='+s;
- };
-}
-
-// Advanced search (/v/*, /r)
-if(byId('advselect')) {
- byId('advselect').onclick = function() {
- var box = byId('advoptions');
- var hidden = !hasClass(box, 'hidden');
- setClass(box, 'hidden', hidden);
- setText(byName(this, 'i')[0], hidden ? collapsed_icon : expanded_icon);
- return false;
- };
-}
-
-// Spoiler filters -> cookie (/v/*)
-if(byId('sp_0')) {
- byId('sp_0').onclick = function() { setCookie('tagspoil', 0) };
- byId('sp_1').onclick = function() { setCookie('tagspoil', 1) };
- byId('sp_2').onclick = function() { setCookie('tagspoil', 2) };
- var spoil = getCookie('tagspoil');
- byId('sp_'+(spoil == null ? 1 : spoil)).checked = true;
-}
-
-// NSFW VN image toggle (/v+)
-if(byId('nsfw_show')) {
- var msg = byId('nsfw_show');
- var img = byId('nsfw_hid');
- byName(msg, 'a')[0].onclick = function() {
- msg.style.display = 'none';
- img.style.display = 'block';
- return false;
- };
- img.onclick = function() {
- msg.style.display = 'block';
- img.style.display = 'none';
- };
-}
-
-// NSFW toggle for screenshots (/v+)
-if(byId('nsfwhide')) {
- byId('nsfwhide').onclick = function() {
- var shown = 0;
- var l = byName(byId('screenshots'), 'div');
- for(var i=0; i<l.length; i++) {
- if(hasClass(l[i], 'nsfw')) {
- var hidden = !hasClass(l[i], 'hidden');
- setClass(l[i], 'hidden', hidden);
- setClass(byName(l[i], 'a')[0], 'hidden', hidden); // for the image viewer
- if(!hidden)
- shown++;
- } else
- shown++;
- }
- setText(byId('nsfwshown'), shown);
- return false;
- };
-}
-
-// VN Wishlist dropdown box (/v+)
-if(byId('wishsel')) {
- byId('wishsel').onchange = function() {
- if(this.selectedIndex != 0)
- location.href = location.href.replace(/\.[0-9]+/, '')
- +'/wish?s='+this.options[this.selectedIndex].value;
- };
-}
-
-// Release list dropdown box (/r+)
-if(byId('listsel')) {
- byId('listsel').onchange = function() {
- if(this.selectedIndex != 0)
- location.href = location.href.replace(/\.[0-9]+/, '')
- +'/list?e='+this.options[this.selectedIndex].value;
- };
-}
-
-// BBCode spoiler tags
-{
- var l = byClass('b', 'spoiler');
- for(var i=0; i<l.length; i++) {
- l[i].onmouseover = function() { setClass(this, 'spoiler', false); setClass(this, 'spoiler_shown', true) };
- l[i].onmouseout = function() { setClass(this, 'spoiler', true); setClass(this, 'spoiler_shown', false) };
- }
-}
-
-// vndb.org domain check
-if(location.hostname != 'vndb.org') {
- addBody(tag('div', {id:'debug'},
- tag('h2', 'This is not VNDB!'),
- 'The real VNDB is ',
- tag('a', {href:'http://vndb.org/'}, 'here'),
- '.'
- ));
-}
-
-// make some fields readonly when patch flag is set (/r+/edit)
-if(byId('jt_box_rel_geninfo')) {
- var func = function() {
- byId('doujin').disabled =
- byId('resolution').disabled =
- byId('voiced').disabled =
- byId('ani_story').disabled =
- byId('ani_ero').disabled =
- byId('patch').checked;
- };
- func();
- byId('patch').onclick = func;
-}
-
-// Batch edit wishlist dropdown box (/u+/wish)
-if(byId('batchedit')) {
- byId('batchedit').onchange = function() {
- if(this.selectedIndex == 0)
- return true;
- var frm = this;
- while(frm.nodeName.toLowerCase() != 'form')
- frm = frm.parentNode;
- frm.submit();
- };
-}
-
-// expand/collapse listings (/*/hist, /u+/posts)
-if(byId('expandlist')) {
- var lnk = byId('expandlist');
- setexpand = function() {
- var exp = getCookie('histexpand') == 1;
- setText(lnk, exp ? 'collapse' : 'expand');
- var tbl = lnk;
- while(tbl.nodeName.toLowerCase() != 'table')
- tbl = tbl.parentNode;
- var l = byClass(tbl, 'tr', 'collapse');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'hidden', !exp);
- };
- setexpand();
- lnk.onclick = function () {
- setCookie('histexpand', getCookie('histexpand') == 1 ? 0 : 1);
- setexpand();
- return false;
- };
-}
-
-// collapse/expand row groups (/u+/tags, /u+/list) (limited to one table on a page)
-if(byId('expandall')) {
- var table = byId('expandall');
- while(table.nodeName.toLowerCase() != 'table')
- table = table.parentNode;
- var heads = byClass(table, 'td', 'collapse_but');
- var allhid = false;
-
- var alltoggle = function() {
- allhid = !allhid;
- var l = byClass(table, 'tr', 'collapse');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'hidden', allhid);
- setText(byName(byId('expandall'), 'i')[0], allhid ? collapsed_icon : expanded_icon);
- for(var i=0; i<heads.length; i++)
- setText(byName(heads[i], 'i')[0], allhid ? collapsed_icon : expanded_icon);
- return false;
- }
- byId('expandall').onclick = alltoggle;
- alltoggle();
-
- var singletoggle = function() {
- var l = byClass(table, 'tr', 'collapse_'+this.id);
- if(l.length < 1)
- return;
- var hid = !hasClass(l[0], 'hidden');
- for(var i=0; i<l.length; i++)
- setClass(l[i], 'hidden', hid);
- setText(byName(this, 'i')[0], hid ? collapsed_icon : expanded_icon);
- };
- for(var i=0; i<heads.length; i++)
- heads[i].onclick = singletoggle;
-}
-
-// auto-complete tag search (/v/*)
-if(byId('advselect') && byId('ti')) {
- var trfunc = function(item, tr) {
- tr.appendChild(tag('td', shorten(item.firstChild.nodeValue, 40),
- item.getAttribute('meta') == 'yes' ? tag('b', {'class': 'grayedout'}, ' meta') : null,
- item.getAttribute('state') == 0 ? tag('b', {'class': 'grayedout'}, ' awaiting moderation') : null
- ));
- };
- var serfunc = function(item, obj) {
- var tags = obj.value.split(/ *, */);
- tags[tags.length-1] = item.firstChild.nodeValue;
- return tags.join(', ');
- };
- var retfunc = function() { false; };
- var parfunc = function(val) {
- return (val.split(/, */))[val.split(/, */).length-1];
- };
- dsInit(byId('ti'), '/xml/tags.xml?q=', trfunc, serfunc, retfunc, parfunc);
- dsInit(byId('te'), '/xml/tags.xml?q=', trfunc, serfunc, retfunc, parfunc);
-}
-
-
-// spam protection on all forms
-setTimeout(function() {
- for(i=1; i<document.forms.length; i++)
- document.forms[i].action = document.forms[i].action.replace(/\/nospam\?/,'');
-}, 500);
-
-