summaryrefslogtreecommitdiff
path: root/static/f/forms.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/f/forms.js')
-rw-r--r--static/f/forms.js871
1 files changed, 871 insertions, 0 deletions
diff --git a/static/f/forms.js b/static/f/forms.js
new file mode 100644
index 00000000..190ddf66
--- /dev/null
+++ b/static/f/forms.js
@@ -0,0 +1,871 @@
+// various form functions
+// called by script.js
+
+function qq(v) {
+ return v.replace(/&/g,"&amp;").replace(/</,"&lt;").replace(/>/,"&gt;").replace(/"/g,'&quot;');
+}
+function shorten(v, l) {
+ return qq(v.length > l ? v.substr(0, l-3)+'...' : v);
+}
+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) {
+ alert("Your browse does not support the functionality this website requires.");
+ return;
+ }
+ 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);
+}
+
+
+
+
+ /************************\
+ * C A T E G O R I E S *
+ \************************/
+
+
+function catLoad() {
+ var i;
+ var cats=[];
+ var ct = x('categories');
+ var l = ct.value.split(',');
+ for(i=0;i<l.length;i++)
+ cats[l[i].substr(0,3)] = Math.floor(l[i].substr(3,1));
+
+ l = x('jt_box_categories').getElementsByTagName('a');
+ for(i=0;i<l.length;i++) {
+ if(l[i].id.substr(0, 4) != 'cat_')
+ continue;
+ catSet(l[i].id.substr(4), cats[l[i].id.substr(4)]||0);
+ l[i].onclick = function() {
+ var c = this.id.substr(4);
+ if(!cats[c]) cats[c] = 0;
+ if(c.substr(0,1) == 'p' || c == 'gaa' || c == 'gab' || c.substr(0,1) == 'h' || c.substr(0,1) == 'l' || c.substr(0,1) == 't') {
+ if(cats[c]++)
+ cats[c] = 0;
+ } else if(++cats[c] == 4)
+ cats[c] = 0;
+ catSet(c, cats[c]);
+
+ // has to be ordered before serializing!
+ var r;l=[];i=0;
+ for(r in cats)
+ l[i++] = r;
+ l = l.sort();
+ r='';
+ for(i=0;i<l.length;i++)
+ if(cats[l[i]] > 0)
+ r+=(r?',':'')+l[i]+cats[l[i]];
+ ct.value = r;
+ return false;
+ };
+ }
+}
+
+function catSet(id, rnk) {
+ // doesn't work very nice with skins...
+ var c = rnk == 0 ? '' :
+ rnk == 1 ? '#0c0' :
+ rnk == 2 ? '#cc0' : '#c00';
+ x('b_'+id).style.color = c;
+ x('cat_'+id).style.color = c;
+ x('b_'+id).innerHTML = rnk;
+}
+
+
+
+
+
+
+ /***********************************\
+ * D R O P D O W N S E A R C H *
+ \***********************************/
+
+
+function dsInit(obj, url, trfunc, serfunc, retfunc) {
+ obj.onkeydown = dsKeyDown;
+ obj.onblur = function() {
+ if(x('ds_box'))
+ x('ds_box').style.top = '-500px';
+ };
+ // all local data is stored in the DOM input object
+ obj.returnFunc = retfunc;
+ obj.trFunc = trfunc;
+ obj.serFunc = serfunc;
+ obj.searchURL = url;
+ obj.selectedId = 0;
+}
+
+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) {
+ if(obj.selectedId != 0)
+ obj.value = obj.serFunc(x('ds_box_'+obj.selectedId).itemData);
+ else if(obj.returnFunc)
+ obj.returnFunc();
+ else
+ return true;
+ x('ds_box').style.top = '-500px';
+ obj.selectedId = 0;
+
+ // opera hack: make sure to not send the form on the return key
+ while(obj && obj.nodeName.toLowerCase() != 'form')
+ obj = obj.parentNode;
+ if(obj) {
+ var oldsubmit = obj.onsubmit;
+ obj.onsubmit = function() { return false };
+ setTimeout(function() { obj.onsubmit = oldsubmit }, 100);
+ }
+
+ return false;
+ }
+
+ // process up/down keys
+ if(x('ds_box') && (c == 38 || c == 40)) {
+ var l = x('ds_box').getElementsByTagName('tr');
+ if(l.length < 1)
+ return true;
+
+ if(obj.selectedId == 0) {
+ if(c == 38) // up
+ obj.selectedId = l[l.length-1].id.substr(7);
+ else
+ obj.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.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.selectedId = sel.id.substr(7);
+ }
+
+ for(var i=0;i<l.length;i++)
+ l[i].className = l[i].id == 'ds_box_'+obj.selectedId ? 'selected' : '';
+ return true;
+ }
+
+ // this.value isn't available in a keydown event
+ setTimeout(function() {
+ dsSearch(obj);
+ }, 10);
+
+ return true;
+}
+
+function dsSearch(obj) {
+ var b = x('ds_box');
+
+ // show/hide the ds_box div
+ if(obj.value.length < 2) {
+ if(b)
+ b.style.top = '-500px';
+ obj.selectedId = 0;
+ return;
+ }
+ if(!b) {
+ b = document.createElement('div');
+ b.setAttribute('id', 'ds_box');
+ b.innerHTML = '<b>Loading...</b>';
+ document.body.appendChild(b);
+ }
+
+ // position the div
+ var ddx=0;
+ var ddy=obj.offsetHeight;
+ var o = obj;
+ do {
+ ddx += o.offsetLeft;
+ ddy += o.offsetTop;
+ } while(o = o.offsetParent);
+
+ b.style.position = 'absolute';
+ b.style.left = ddx+'px';
+ b.style.top = ddy+'px';
+ b.style.width = obj.offsetWidth+'px';
+
+ // perform search
+ ajax(obj.searchURL + encodeURIComponent(obj.value), function(hr) {
+ dsResults(hr, obj);
+ });
+}
+
+function dsResults(hr, obj) {
+ var l = hr.responseXML.getElementsByTagName('item');
+ var b = x('ds_box');
+ if(l.length < 1) {
+ b.innerHTML = '<b>No results...</b>';
+ obj.selectedId = 0;
+ return;
+ }
+
+ b.innerHTML = '<table><tbody></tbody></table>';
+ tb = b.getElementsByTagName('tbody')[0];
+ for(var i=0;i<l.length;i++) {
+ var id = l[i].getAttribute('id');
+ var tr = document.createElement('tr');
+ tr.setAttribute('id', 'ds_box_'+id);
+ tr.itemData = l[i];
+ if(obj.selectedId == id)
+ tr.setAttribute('class', 'selected');
+ obj.trFunc(l[i], tr);
+ tb.appendChild(tr);
+ }
+
+ if(obj.selectedId != 0 && !x('ds_box_'+obj.selectedId))
+ obj.selectedId = 0;
+}
+
+
+
+
+
+
+ /*****************************\
+ * V N R E L A T I O N S *
+ \*****************************/
+
+
+var relTypes = [];
+function relLoad() {
+ var i;var l;var o;
+
+ // fetch the relation types from the add new relation selectbox
+ l = x('relation_new').getElementsByTagName('select')[0].options;
+ for(i=0;i<l.length;i++)
+ relTypes[Math.floor(l[i].value)] = l[i].text;
+
+ // read the current relations
+ l = x('relations').value.split('|||');
+ if(l[0]) {
+ for(i=0;i<l.length;i++) {
+ var rel = l[i].split(',', 3);
+ relAdd(rel[0], rel[1], rel[2]);
+ }
+ }
+ relEmpty();
+
+ // make sure the title is up-to-date
+ x('title').onchange = function() {
+ l = x('jt_box_relations').getElementsByTagName('td');
+ for(i=0;i<l.length;i++)
+ if(l[i].className == 'tc3')
+ l[i].innerHTML = shorten(this.value, 40);
+ };
+
+ // bind the add-link
+ x('relation_new').getElementsByTagName('a')[0].onclick = relFormAdd;
+
+ // dropdown
+ dsInit(x('relation_new').getElementsByTagName('input')[0], '/xml/vn.xml?q=', function(item, tr) {
+ var td = document.createElement('td');
+ td.innerHTML = 'v'+item.getAttribute('id');
+ td.style.textAlign = 'right';
+ td.style.paddingRight = '5px';
+ tr.appendChild(td);
+ td = document.createElement('td');
+ td.innerHTML = shorten(item.firstChild.nodeValue, 40);
+ tr.appendChild(td);
+ }, function(item) {
+ return 'v'+item.getAttribute('id')+':'+item.firstChild.nodeValue;
+ }, relFormAdd);
+}
+
+function relAdd(rel, vid, title) {
+ var o = document.createElement('tr');
+ o.setAttribute('id', 'relation_tr_'+vid);
+
+ var t = document.createElement('td');
+ t.className = 'tc1';
+ t.innerHTML = 'v'+vid+':<a href="/v'+vid+'">'+shorten(title, 40)+'</a>';
+ o.appendChild(t);
+
+ var options = '';
+ for(var i=0;i<relTypes.length;i++)
+ options += '<option value="'+i+'"'+(i == rel ? ' selected="selected"' : '')+'>'+qq(relTypes[i])+'</option>';
+ t = document.createElement('td');
+ t.className = 'tc2';
+ t.innerHTML = 'is a <select onchange="relSerialize()">'+options+'</select> of';
+ o.appendChild(t);
+
+ t = document.createElement('td');
+ t.className = 'tc3';
+ t.innerHTML = shorten(x('title').value, 40);
+ o.appendChild(t);
+
+ t = document.createElement('td');
+ t.className = 'tc4';
+ t.innerHTML = '<a href="#" onclick="return relDel('+vid+')">del</a>';
+ o.appendChild(t);
+
+ x('relation_tbl').appendChild(o);
+ relEmpty();
+}
+
+function relEmpty() {
+ if(x('relation_tbl').getElementsByTagName('tr').length > 0) {
+ if(x('relation_tr_none'))
+ x('relation_tbl').removeChild(x('relation_tr_none'));
+ return;
+ }
+ var o = document.createElement('tr');
+ o.setAttribute('id', 'relation_tr_none');
+ var t = document.createElement('td');
+ t.colspan = 4;
+ t.innerHTML = 'No relations selected.';
+ o.appendChild(t);
+ x('relation_tbl').appendChild(o);
+}
+
+function relSerialize() {
+ var r='';
+ var i;
+ var l = x('relation_tbl').getElementsByTagName('tr');
+ for(i=0;i<l.length;i++) {
+ var title = l[i].getElementsByTagName('td')[0];
+ title = title.innerText || title.textContent;
+ title = title.substr(title.indexOf(':')+1);
+ r += (r ? '|||' : '')
+ +l[i].getElementsByTagName('select')[0].selectedIndex
+ +','+l[i].id.substr(12)+','+title;
+ }
+ x('relations').value = r;
+}
+
+function relDel(vid) {
+ x('relation_tbl').removeChild(x('relation_tr_'+vid));
+ relSerialize();
+ relEmpty();
+ return false;
+}
+
+function relFormAdd() {
+ var txt = x('relation_new').getElementsByTagName('input')[0];
+ var sel = x('relation_new').getElementsByTagName('select')[0];
+ var lnk = x('relation_new').getElementsByTagName('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 = true;
+ txt.value = 'loading...';
+ sel.disabled = true;
+ lnk.innerHTML = 'loading...';
+
+ ajax('/xml/vn.xml?q='+encodeURIComponent(input), function(hr) {
+ txt.disabled = false;
+ txt.value = '';
+ sel.disabled = false;
+ lnk.innerHTML = 'add';
+
+ var items = hr.responseXML.getElementsByTagName('item');
+ if(items.length < 1)
+ return alert('Visual novel not found!');
+
+ var id = items[0].getAttribute('id');
+ if(x('relation_tr_'+id))
+ return alert('This visual novel has already been selected!');
+
+ relAdd(sel.selectedIndex, id, items[0].firstChild.nodeValue);
+ sel.selectedIndex = 0;
+ relSerialize();
+ });
+ return false;
+}
+
+
+
+
+
+
+ /*********************************\
+ * V N S C R E E N S H O T S *
+ \*********************************/
+
+
+var scrRel = [ [ 0, '-- select release --' ] ];
+var scrStaticURL;
+function scrLoad() {
+ // load the releases
+ scrStaticURL = x('scr_rel').className;
+ var l = x('scr_rel').options;
+ for(var i=0;i<l.length;i++)
+ scrRel[i+1] = [ l[i].value, l[i].text ];
+ x('scr_rel').parentNode.removeChild(x('scr_rel'));
+
+ // load the current screenshots
+ l = x('screenshots').value.split(' ');
+ for(i=0;i<l.length;i++)
+ if(l[i].length > 2) {
+ var r = l[i].split(',');
+ scrAdd(r[0], r[1], r[2]);
+ }
+ scrLast();
+ scrCheckStatus();
+
+ scrSetSubmit();
+}
+
+// give an error when submitting the form while still uploading an image
+function scrSetSubmit() {
+ var o=x('screenshots');
+ while(o.nodeName.toLowerCase() != 'form')
+ o = o.parentNode;
+ oldfunc = o.onsubmit;
+ o.onsubmit = function() {
+ var c=0;var r=0;
+ var l = x('scr_table').getElementsByTagName('tr');
+ for(var i=0;i<l.length-1;i++) {
+ if(l[i].scrStatus > 0)
+ c=1;
+ else if(l[i].getElementsByTagName('select')[0].selectedIndex == 0)
+ r=1;
+ }
+ if(c) {
+ alert('Please wait for the screenshots to be uploaded before submitting the form.');
+ return false;
+ } else if(r) {
+ 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) {
+ var tr = document.createElement('tr');
+ tr.scrId = id;
+ tr.scrStatus = id ? 2 : 1; // 0: done, 1: uploading, 2: waiting for thumbnail
+ tr.scrRel = rel;
+ tr.scrNSFW = nsfw;
+
+ var td = document.createElement('td');
+ td.className = 'thumb';
+ td.innerHTML = 'loading...';
+ tr.appendChild(td);
+
+ td = document.createElement('td');
+ if(id)
+ td.innerHTML = '<b>Generating thumbnail...</b><br />'
+ +'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.';
+ else
+ td.innerHTML = '<b>Uploading screenshot...</b><br />'
+ +'This can take a while, depending on the file size and your upload speed.<br />'
+ +'<a href="#" onclick="return scrDel(this)">cancel</a>';
+ tr.appendChild(td);
+
+ x('scr_table').appendChild(tr);
+ scrStripe();
+ return tr;
+}
+
+function scrLast() {
+ if(x('scr_last'))
+ x('scr_table').removeChild(x('scr_last'));
+ var full = x('scr_table').getElementsByTagName('tr').length >= 10;
+
+ var tr = document.createElement('tr');
+ tr.setAttribute('id', 'scr_last');
+
+ var td = document.createElement('td');
+ td.className = 'thumb';
+ tr.appendChild(td);
+
+ var td = document.createElement('td');
+ if(full)
+ td.innerHTML = '<b>Enough screenshots</b><br />'
+ +'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.';
+ else
+ td.innerHTML = '<b>Add screenshot</b><br />'
+ +'Image must be smaller than 5MB and in PNG or JPEG format.<br />'
+ +'<input name="scr_upload" id="scr_upload" type="file" class="text" /><br />'
+ +'<input type="button" value="Upload!" class="submit" onclick="scrUpload()" />';
+
+ tr.appendChild(td);
+ x('scr_table').appendChild(tr);
+ scrStripe();
+}
+
+function scrStripe() {
+ var l = x('scr_table').getElementsByTagName('tr');
+ for(var i=0;i<l.length;i++)
+ l[i].className = i%2==0 ? 'odd' : '';
+}
+
+function scrCheckStatus() {
+ var ids = '';
+ var l = x('scr_table').getElementsByTagName('tr');
+ for(var i=0;i<l.length-1;i++)
+ if(l[i].scrStatus == 2)
+ ids += (ids ? ';' : '?')+'id='+l[i].scrId;
+ if(!ids)
+ return setTimeout(scrCheckStatus, 1000);
+
+ var ti = setTimeout(scrCheckStatus, 10000);
+ ajax('/xml/screenshots.xml'+ids, function(hr) {
+ var ls = hr.responseXML.getElementsByTagName('item');
+ var l = x('scr_table').getElementsByTagName('tr');
+ var tr;
+ for(var s=0;s<ls.length;s++) {
+ for(i=0;i<l.length-1;i++)
+ if(l[i].scrId == ls[s].getAttribute('id') && ls[s].getAttribute('status') > 0)
+ tr = l[i];
+ if(!tr)
+ continue;
+
+ tr.scrStatus = 0;
+ tr.getElementsByTagName('td')[0].innerHTML =
+ '<a href="'+scrURL(tr.scrId, 'f')+'" rel="iv:'+ls[s].getAttribute('width')+'x'+ls[s].getAttribute('height')+':edit">'
+ +'<img src="'+scrURL(tr.scrId, 't')+'" style="margin: 0; padding: 0; border: 0" /></a>';
+
+ var opt='';
+ for(var o=0;o<scrRel.length;o++)
+ opt += '<option value="'+scrRel[o][0]+'"'+(tr.scrRel && tr.scrRel == scrRel[o][0] ? ' selected="selected"' : '')+'>'+scrRel[o][1]+'</option>';
+
+ tr.getElementsByTagName('td')[1].innerHTML = '<b>Screenshot #'+tr.scrId+'</b>'
+ +' (<a href="#" onclick="return scrDel(this)">remove</a>)<br />'
+ +'Full size: '+ls[s].getAttribute('width')+'x'+ls[s].getAttribute('height')+'<br /><br />'
+ +'<input type="checkbox" onclick="scrSerialize()" id="scr_ser_'+tr.scrId+'" name="scr_ser_'+tr.scrId+'"'
+ +' '+(tr.scrNSFW > 0 ? 'checked = "checked"' : '')+' />'
+ +'<label for="scr_ser_'+tr.scrId+'">This screenshot is NSFW</label><br />'
+ +'<select onchange="scrSerialize()">'+opt+'</select>';
+ }
+ scrSerialize();
+ ivInit();
+ clearTimeout(ti);
+ setTimeout(scrCheckStatus, 1000);
+ });
+}
+
+function scrDel(what) {
+ while(what.nodeName.toLowerCase() != 'tr')
+ what = what.parentNode;
+ what.scrStatus = 3;
+ x('scr_table').removeChild(what);
+ scrSerialize();
+ scrLast();
+ return false;
+}
+
+var scrUplNr=0;
+function scrUpload() {
+ scrUplNr++;
+
+ // create temporary form
+ var d = document.createElement('div');
+ d.style.cssText = 'visibility: hidden; overflow: hidden; width: 1px; height: 1px; position: absolute; left: -500px; top: -500px';
+ d.innerHTML = '<iframe id="scr_upl_'+scrUplNr+'" name="scr_upl_'+scrUplNr+'" style="height: 0px; width: 0px; visibility: hidden"'
+ +' src="about:blank" onload="scrUploadComplete(this)"></iframe>'
+ +'<form method="post" action="/xml/screenshots.xml" target="scr_upl_'+scrUplNr+'" enctype="multipart/form-data" id="scr_frm_'+scrUplNr+'"></form>';
+ document.body.appendChild(d);
+
+ // submit form and delete it
+ d = x('scr_frm_'+scrUplNr);
+ d.appendChild(x('scr_upload'));
+ d.submit();
+ d.parentNode.removeChild(d);
+
+ d = scrAdd(0, 0, 0);
+ x('scr_upl_'+scrUplNr).theTR = d;
+ scrLast();
+
+ return false;
+}
+
+function scrUploadComplete(what) {
+ var f = window.frames[what.id];
+ if(f.location.href.indexOf('screenshots') < 0)
+ return;
+
+ var tr = what.theTR;
+ if(!tr || tr.scrStatus == 3)
+ return;
+
+ try {
+ tr.scrId = f.window.document.getElementsByTagName('image')[0].getAttribute('id');
+ } catch(e) {
+ tr.scrId = -10;
+ }
+ if(tr.scrId < 0) {
+ alert(
+ tr.scrId == -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.scrId == -1 ?
+ 'Upload failed!\nOnly JPEG or PNG images are accepted.' :
+ 'Upload failed!\nNo file selected, or an empty file?'
+ );
+ return scrDel(tr);
+ }
+
+ tr.scrStatus = 2;
+ tr.getElementsByTagName('td')[1].innerHTML =
+ '<b>Generating thumbnail...</b><br />'
+ +'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() { document.body.removeChild(what.parentNode) }, 100);
+}
+
+function scrSerialize() {
+ var r = '';
+ var l = x('scr_table').getElementsByTagName('tr');
+ for(var i=0;i<l.length-1;i++)
+ if(l[i].scrStatus == 0)
+ r += (r ? ' ' : '') + l[i].scrId + ','
+ + (l[i].getElementsByTagName('input')[0].checked ? 1 : 0) + ','
+ + scrRel[l[i].getElementsByTagName('select')[0].selectedIndex][0];
+ x('screenshots').value = r;
+}
+
+
+
+
+
+
+ /***************\
+ * M E D I A *
+ \***************/
+
+
+var medTypes = [ [ '', '- medium -', false ] ];
+function medLoad() {
+ // load the medTypes and clear the div
+ var l = x('media_div').getElementsByTagName('select')[0].options;
+ for(var i=0;i<l.length;i++)
+ medTypes[medTypes.length] = [ l[i].value, l[i].text, l[i].className.indexOf('noqty') ? false : true ];
+ x('media_div').innerHTML = '';
+
+ // load the selected media
+ l = x('media').value.split(',');
+ for(var i=0;i<l.length;i++)
+ if(l[i].length > 2)
+ medAddNew(l[i].split(' ')[0], Math.floor(l[i].split(' ')[1]));
+
+ medAddNew('', 0);
+ medSetSubmit();
+}
+
+function medSetSubmit() {
+ var o=x('media');
+ while(o.nodeName.toLowerCase() != 'form')
+ o = o.parentNode;
+ oldfunc = o.onsubmit;
+ o.onsubmit = function() {
+ var l = x('media_div').getElementsByTagName('span');
+ for(var i=0;i<l.length-1;i++) {
+ var s = l[i].getElementsByTagName('select');
+ if(!medTypes[s[1].selectedIndex][2] && s[0].selectedIndex == 0) {
+ alert('Media '+medTypes[s[1].selectedIndex][1]+' requires a quantity to be specified!');
+ return false;
+ }
+ }
+ return oldfunc ? oldfunc() : true;
+ };
+}
+
+function medAddNew(med, qty) {
+ var o = document.createElement('span');
+ var r = '<select class="qty" onchange="medSerialize()"><option value="0">- quantity -</option>';
+ for(var i=1;i<=10;i++)
+ r += '<option value="'+i+'"'+(qty == i ? ' selected="selected"' : '')+'>'+i+'</option>';
+ r += '</select><select class="medium" onchange="return medCheckNew(this)">';
+ for(i=0;i<medTypes.length;i++)
+ r += '<option value="'+medTypes[i][0]+'"'+(med == medTypes[i][0] ? ' selected="selected"' : '')+'>'+medTypes[i][1]+'</option>';
+ r += '</select>';
+ if(med != '')
+ r += '<input type="button" class="submit" onclick="return medDel(this)" value="remove" />';
+ o.innerHTML = r;
+ x('media_div').appendChild(o);
+}
+
+function medDel(what) {
+ what = what.nodeName ? what : this;
+ while(what.nodeName.toLowerCase() != 'span')
+ what = what.parentNode;
+ x('media_div').removeChild(what);
+ medSerialize();
+ return false;
+}
+
+function medCheckNew() {
+ // check for non-new items and add remove buttons
+ var l = x('media_div').getElementsByTagName('span');
+ var createnew=1;
+ for(var i=0;i<l.length;i++) {
+ var sel = l[i].getElementsByTagName('select')[1].selectedIndex;
+ if(sel == 0)
+ createnew = 0;
+ else if(l[i].getElementsByTagName('input').length < 1) {
+ var a = document.createElement('input');
+ a.type = 'button';
+ a.className = 'submit';
+ a.onclick = medDel;
+ a.value = 'remove';
+ l[i].appendChild(a);
+ }
+ }
+ if(createnew)
+ medAddNew('', 0);
+ medSerialize();
+
+ return true;
+}
+
+function medSerialize() {
+ var r = '';
+ var l = x('media_div').getElementsByTagName('span');
+ for(var i=0;i<l.length;i++) {
+ var sel = l[i].getElementsByTagName('select');
+ if(sel[1].selectedIndex != 0)
+ r += (r ? ',' : '') + medTypes[sel[1].selectedIndex][0] + ' ' + (medTypes[sel[1].selectedIndex][2] ? 0 : sel[0].selectedIndex);
+ }
+ x('media').value = r;
+}
+
+
+
+
+
+
+ /****************************************************\
+ * V I S U A L N O V E L S / P R O D U C E R S *
+ \****************************************************/
+
+
+function vnpLoad(type) {
+ // load currently selected VNs
+ var l = x(type).value.split('|||');
+ for(var i=0;i<l.length;i++)
+ if(l[i].length > 2)
+ vnpAdd(type, l[i].split(',',2)[0], l[i].split(',',2)[1]);
+ vnpCheckEmpty(type);
+
+ // dropdown
+ var n = x('jt_box_'+(type == 'vn' ? 'visual_novels' : type)).getElementsByTagName('div')[1];
+ dsInit(n.getElementsByTagName('input')[0], '/xml/'+type+'.xml?q=', function(item, tr) {
+ var td = document.createElement('td');
+ td.innerHTML = type.substr(0,1)+item.getAttribute('id');
+ td.style.textAlign = 'right';
+ td.style.paddingRight = '5px';
+ tr.appendChild(td);
+ td = document.createElement('td');
+ td.innerHTML = shorten(item.firstChild.nodeValue, 40);
+ tr.appendChild(td);
+ }, function(item) {
+ return type.substr(0,1)+item.getAttribute('id')+':'+item.firstChild.nodeValue;
+ }, function() { vnpFormAdd(type) });
+ n.getElementsByTagName('a')[0].onclick = function() { vnpFormAdd(type); return false };
+}
+
+function vnpAdd(type, id, title) {
+ var o = document.createElement('span');
+ o.innerHTML = '<i>'+type.substr(0,1)+id+':<a href="/'+type.substr(0,1)+id+'">'+shorten(title, 40)+'</a></i>'
+ +'<a href="#" onclick="return vnpDel(this, \''+type+'\')">remove</a>';
+ x(type+'sel').appendChild(o);
+ vnpStripe(type);
+ vnpCheckEmpty(type);
+}
+
+function vnpDel(what, type) {
+ what = what.nodeName ? what : this;
+ while(what.nodeName.toLowerCase() != 'span')
+ what = what.parentNode;
+ x(type+'sel').removeChild(what);
+ vnpCheckEmpty(type);
+ vnpSerialize(type);
+ return false;
+}
+
+function vnpCheckEmpty(type) {
+ var o = x(type+'sel');
+ if(o.getElementsByTagName('span').length < 1) {
+ if(o.getElementsByTagName('b').length < 1)
+ o.innerHTML = '<b>Nothing selected...</b>';
+ } else if(o.getElementsByTagName('b').length == 1)
+ o.removeChild(o.getElementsByTagName('b')[0]);
+}
+
+function vnpStripe(type) {
+ var l = x(type+'sel').getElementsByTagName('span');
+ for(var i=0;i<l.length;i++)
+ l[i].className = i%2 ? 'odd' : '';
+}
+
+function vnpFormAdd(type) {
+ var n = x('jt_box_'+(type == 'vn' ? 'visual_novels' : type)).getElementsByTagName('div')[1];
+ var txt = n.getElementsByTagName('input')[0];
+ var lnk = n.getElementsByTagName('a')[0];
+ var input = txt.value;
+
+ if(type == 'vn' && !input.match(/^v[0-9]+/)) {
+ alert('Visual novel textbox must start with an ID (e.g. v17)');
+ return false;
+ }
+ if(type == 'producers' && !input.match(/^p[0-9]+/)) {
+ alert('Producer textbox must start with an ID (e.g. p5)');
+ return false;
+ }
+
+ txt.disabled = true;
+ txt.value = 'loading...';
+ lnk.innerHTML = 'loading...';
+
+ ajax('/xml/'+type+'.xml?q='+encodeURIComponent(input), function(hr) {
+ txt.disabled = false;
+ txt.value = '';
+ lnk.innerHTML = 'add';
+
+ var items = hr.responseXML.getElementsByTagName('item');
+ if(items.length < 1)
+ return alert('Item not found!');
+
+ vnpAdd(type, items[0].getAttribute('id'), items[0].firstChild.nodeValue);
+ vnpSerialize(type);
+ });
+ return false;
+}
+
+function vnpSerialize(type) {
+ var r = '';
+ var l = x(type+'sel').getElementsByTagName('span');
+ for(var i=0;i<l.length;i++)
+ r += (r ? '|||' : '') + l[i].getElementsByTagName('i')[0].innerHTML.substr(1, l[i].getElementsByTagName('i')[0].innerHTML.indexOf(':')-1)
+ + ',' + l[i].getElementsByTagName('a')[0].innerHTML;
+ x(type).value = r;
+}
+
+