diff options
Diffstat (limited to 'static/files/dyna.js')
-rw-r--r-- | static/files/dyna.js | 579 |
1 files changed, 579 insertions, 0 deletions
diff --git a/static/files/dyna.js b/static/files/dyna.js new file mode 100644 index 00000000..b4d64203 --- /dev/null +++ b/static/files/dyna.js @@ -0,0 +1,579 @@ +var med = { + cd: 'CD', + dvd: 'DVD', + gdr: 'GD-ROM', + blr: 'Blu-Ray disk', + 'in':'Internet download', + pa: 'Patch', + otc: 'Other (console)' +}; +var vrel = [ + 'Sequel', + 'Prequel', + 'Same setting', + 'Alternative setting', + 'Alternative version', + 'Same characters', + 'Side story', + 'Parent story', + 'Summary', + 'Full story', + 'Other' +]; + +var md;var pd;var rl;var vn;var ct; + +function dInit() { + md = x('md_select'); + if(md) { + md.onclick = mdChangeSel; + mdLoad(); + md.selectedIndex = 0; + mdChangeSel(); + } + + pd = x('pd_select'); + if(pd) { + pd.onclick = pdChangeSel; + pdLoad(); + pd.selectedIndex = 0; + pdChangeSel(); + } + + rl = x('rl_select'); + if(rl) { + rl.onclick = rlChangeSel; + rlLoad(); + rl.selectedIndex = 0; + rlChangeSel(); + } + + vn = x('vn_select'); + if(vn) { + vn.onclick = vnChangeSel; + vnLoad(); + vn.selectedIndex = 0; + vnChangeSel(); + } + + ct = x('categories'); + if(ct) + catLoad(); +} + +function qq(v) { + return v.replace(/&/g,"&").replace(/</,"<").replace(/>/,">").replace(/'/g,/*'*/ "\\'").replace(/"/g,/*"*/'"'); +} + +// small AJAX wapper +var hr = false; +function ajax(url, func) { + if(hr) + hr.abort(); + hr = (window.ActiveXObject) ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); + if(hr == null) { + alert("Your browse does not support the functionality this website requires."); + return; + } + hr.onreadystatechange = func; + hr.open('GET', url, true); + hr.send(null); +} + + + + + /************************\ + * M E D I A * + \************************/ + + +function mdChangeSel() { + var sel = md.options[md.selectedIndex || 0]; + var o = x('md_conts'); + var i; + if(sel.value == '0_new') { + var l = ''; var q = '<option value="0">Qty</option>'; + for(i in med) + l += '<option value="'+i+'">'+med[i]+'</option>'; + for(i=1;i<10;i++) + q += '<option value="'+i+'">'+i+'</option>'; + o.innerHTML = '<select id="md_Q" name="md_Q" style="width: 50px;">'+q+'</select>' + + '<select id="md_S" name="md_S" style="width: 150px;">'+l+'</select>' + + '<br style="clear: both" />' + + '<button type="button" onclick="mdAddRem()">add/remove</button>' + + '<br />Qty is only required for CD & DVD'; + } else { + o.innerHTML = 'Selected "' + sel.text + '"<br />' + + '<button type="button" onclick="mdAddRem(\'' + sel.value + '\')">remove</button>'; + } +} + +function mdAddRem(id) { + var i; + var d = 0; + var o = id ? null : x('md_S').options[x('md_S').selectedIndex]; + var qty = id ? null : x('md_Q').options[x('md_Q').selectedIndex].value; + var v = id ? id : (o.value != 'cd' && o.value != 'dvd' && o.value != 'gdr' && o.value != 'blr' ? o.value : (o.value + '_' + qty)); + for(i=0;i<md.options.length;i++) + if(md.options[i].value == v) { + md.options[i] = null; + d = 1; + } + if(!d && !id) { + if(v.indexOf('_') >= 0 && qty == 0) { + alert('Please specify the quantity'); + return; + } + md.options[md.options.length] = new Option(mdString(qty, o.value), v); + } + else if(id) { + md.options[0].selected = true; + mdChangeSel(); + } + mdSerialize(); +} + +function mdSerialize() { + var dest = x('media'); + var str = ''; + var i; + for(i=0;i<md.options.length;i++) + md.options[i].value != '0_new' && (str += (str.length>0 ? ',' : '') + md.options[i].value); + dest.value = str; +} + +function mdLoad() { + var me = x('media').value.split(','); + var i, j; + for(i=0;i<me.length;i++) { + var m = me[i].split('_'); + if(med[m[0]]) + md.options[md.options.length] = new Option(mdString(m[1], m[0]), me[i]); + } +} + +function mdString(qty, medium) { + if(medium != 'cd' && medium != 'dvd' && medium != 'gdr' && medium != 'blr') + return med[medium]; + else + return qty + ' ' + med[medium] + (qty > 1 ? 's' : ''); +} + + + + + + + /************************\ + * P R O D U C E R S * + \************************/ + + +function pdChangeSel() { + var sel = pd.options[pd.selectedIndex || 0]; + var o = x('pd_conts'); + var i; + if(sel.value == '0_new') { + o.innerHTML = '<input type="text" name="pd_S" id="pd_S" onkeyup="pdDoSearch(0)" onkeydown="return pdEnter(event)" style="width: 150px;" />' + + '<button type="button" onclick="pdDoSearch(1)" style="width: 55px;">Search!</button><br style="clear: both" />' + + '<span id="pd_R" style="display: block; width: 220px; height: 70px; overflow: auto"></span>' + + '<a href="/p/add" target="_blank">Add new producer</a>'; + pdDoSearch(''); + } else { + o.innerHTML = 'Selected "' + sel.text + '"<br />' + + '<button type="button" onclick="pdAddRem(\'' + sel.value + '\')">remove</button>'; + } +} + +function pdEnter(ev) { + var c = document.layers ? ev.which : document.all ? event.keyCode : ev.keyCode; + if(c == 13) { + pdDoSearch(0); + return false; + } + return true; +} + +function pdDoSearch(f) { + var v = x('pd_S').value; + var d = x('pd_R'); + if(v.length < 1) + d.innerHTML = 'Hint: type pX if you know the producer id.'; + else { + if(f) + d.innerHTML = '...searching...'; + ajax('/xml/producers.xml?q='+escape(v)+'&r='+(Math.floor(Math.random()*999)+1), function () { + if(!hr || hr.readyState != 4 || !hr.responseText) + return; + if(hr.status != 200) + return alert('Whoops, error! :('); + var items = hr.responseXML.getElementsByTagName('item'); + if(!items || items.length < 1) { + d.innerHTML = 'No results'; + return false; + } + var res = ''; + var i,j; + for(i=0; i<items.length; i++) { + var id = items[i].getElementsByTagName('id')[0].firstChild.nodeValue; + var name = items[i].getElementsByTagName('name')[0].firstChild.nodeValue; + var cid = id + ',' + name; + var s = ''; + for(j=0; j<pd.options.length; j++) + if(pd.options[j].value == cid) + s = ' checked="checked"'; + res += '<input type="checkbox" id="pd_I'+id+'"'+s+' onclick="pdAddRem(\''+qq(cid)+'\', \''+qq(name)+'\')" />' + + '<label style="width: auto" for="pd_I'+id+'">'+name+'</label><br style="clear: left" />'; + } + d.innerHTML = res; + }); + } +} + +function pdAddRem(id, name) { + var i; + var d = 0; + for(i=0;i<pd.options.length;i++) + if(pd.options[i].value == id) { + pd.options[i] = null; + d = 1; + } + if(!d && name) + pd.options[pd.options.length] = new Option(name, id); + else if(!name) { + pd.options[0].selected = true; + pdChangeSel(); + } + pdSerialize(); +} + +// id,name|||id,name +function pdSerialize() { + var dest = x('producers'); + var str = ''; + var i; + for(i=0;i<pd.options.length;i++) + pd.options[i].value != '0_new' && (str += (str.length>0 ? '|||' : '') + pd.options[i].value); + dest.value = str; +} + +function pdLoad() { + var pds = x('producers').value.split('|||'); + if(!pds[0]) + return; + var i; + for(i=0;i<pds.length;i++) + pd.options[pd.options.length] = new Option(pds[i].split(',',2)[1], pds[i]); +} + + + + + + + + + /************************\ + * R E L A T I O N S * + \************************/ + + +var rlsel = ''; var rlname = ''; +function rlChangeSel() { + var sel = rl.options[rl.selectedIndex || 0]; + var o = x('rl_conts'); + var i; + rlsel = ''; + var ops=''; + for(i=0;i<vrel.length;i++) + ops += '<option value="'+i+'">'+vrel[i]+'</option>'; + if(sel.value == '0_new') { + o.innerHTML = '<input type="text" name="rl_S" id="rl_S" onkeyup="rlDoSearch(0)" onkeydown="return rlEnter(event)" style="width: 150px;" />' + + '<button type="button" onclick="rlDoSearch(1)" style="width: 60px;">Search!</button><br style="clear: both" />' + + '<span id="rl_R" style="display: block; width: 250px; height: 70px; overflow: auto"></span>' + + '<select id="rl_L" name="rl_L" onchange="rlAddRem(0)"><option value="-1">...is a [..] of this visual novel</option>'+ops+'</select>'; + rlDoSearch(''); + } else { + o.innerHTML = sel.value.split(',', 3)[2] + '<br />' + + '<select id="rl_L" name="rl_L" onchange="rlAddRem(\''+qq(sel.value)+'\')">' + + '<option value="-1"> - change - </option>'+ops+'<option value="-2"> - remove relation - </option></select>'; + } +} + +function rlEnter(ev) { + var c = document.layers ? ev.which : document.all ? event.keyCode : ev.keyCode; + if(c == 13) { + rlDoSearch(0); + return false; + } + return true; +} + +function rlDoSearch(f) { + var v = x('rl_S').value; + var d = x('rl_R'); + if(v.length < 1) + d.innerHTML = 'Search for a visual novel to add a relation.<br /><br />' + + 'Hint: type vX if you know the VN id.'; + else { + if(f) + d.innerHTML = '...searching...'; + ajax('/xml/vn.xml?q='+escape(v)+'&r='+(Math.floor(Math.random()*999)+1), function () { + if(!hr || hr.readyState != 4 || !hr.responseText) + return; + if(hr.status != 200) + return alert('Whoops, error! :('); + rlsel = ''; + var items = hr.responseXML.getElementsByTagName('item'); + if(!items || items.length < 1) { + d.innerHTML = 'No results'; + return false; + } + var res = ''; + var i,j; + for(i=0; i<items.length; i++) { + var id = items[i].getElementsByTagName('id')[0].firstChild.nodeValue; + var title = items[i].getElementsByTagName('title')[0].firstChild.nodeValue; + var cid = id + ',' + title; + res += '<input type="radio" name="rl_rad" id="pd_I'+id+'" value="rl_I'+id+'" onclick="rlAddRem(\''+qq(cid)+'\', \''+qq(title)+'\')" />' + + '<label style="width: auto" for="rl_I'+id+'">'+title+'</label><br style="clear: left" />'; + } + d.innerHTML = res; + }); + } +} + +function rlAddRem(id, name) { + var i; + var rs = x('rl_L').selectedIndex; + if(id && name) { + rlsel = id; + rlname = name; + } else if(id) { + if(!rs) + return; + if(rs == x('rl_L').options.length-1) { // remove + for(i=0;i<rl.options.length;i++) + if(rl.options[i].value == id) + rl.options[i] = null; + rl.options[0].selected = true; + } else { + var cur = id.split(',', 3); + i = rl.selectedIndex; + rs--; + rl.options[i] = new Option(vrel[rs]+': '+cur[2], (rs)+','+cur[1]+','+cur[2]); + rl.options[i].selected = true; + } + rlChangeSel(); + rlSerialize(); + return; + } else if(!rlsel) { + alert('No visual novel selected'); + return; + } + + if(!id && rlsel && !rs) { // remove + for(i=0;i<rl.options.length;i++) + if(rl.options[i].value.indexOf(rlsel) != -1) + rl.options[i] = null; + rlSerialize(); + return; + } + if(!rs) + return; + + // add/edit + var mod = rl.options.length; + rs--; + for(i=0;i<rl.options.length;i++) + if(rl.options[i].value.indexOf(rlsel) != -1) + mod = i; + rl.options[mod] = new Option(vrel[rs]+': '+rlname, rs+','+rlsel); + + rlSerialize(); +} + +// rel,id,name|||rel,id,name +function rlSerialize() { + var dest = x('relations'); + var str = ''; + var i; + for(i=0;i<rl.options.length;i++) + rl.options[i].value != '0_new' && (str += (str.length>0 ? '|||' : '') + rl.options[i].value); + dest.value = str; +} + +function rlLoad() { + var rls = x('relations').value.split('|||'); + if(!rls[0]) + return; + var i; + for(i=0;i<rls.length;i++) + rl.options[rl.options.length] = new Option(vrel[rls[i].split(',',3)[0]]+': '+rls[i].split(',',3)[2], rls[i]); +} + + + + + + + + + /************************\ + * VISUAL NOVELS * + \************************/ + + +function vnChangeSel() { + var sel = vn.options[vn.selectedIndex || 0]; + var o = x('vn_conts'); + var i; + var ops=''; + for(i=0;i<vrel.length;i++) + ops += '<option value="'+i+'">'+vrel[i]+'</option>'; + if(sel.value == '0_new') { + o.innerHTML = '<input type="text" name="vn_S" id="vn_S" onkeyup="vnDoSearch(0)" onkeydown="return vnEnter(event)" style="width: 150px;" />' + + '<button type="button" onclick="vnDoSearch(1)" style="width: 60px;">Search!</button><br style="clear: both" />' + + '<span id="vn_R" style="display: block; width: 250px; height: 90px; overflow: auto"></span>'; + vnDoSearch(''); + } else { + o.innerHTML = 'Selected "' + sel.text + '"<br />' + + '<button type="button" onclick="vnAddRem(\'' + sel.value + '\')">remove</button>'; + } +} + +function vnEnter(ev) { + var c = document.layers ? ev.which : document.all ? event.keyCode : ev.keyCode; + if(c == 13) { + vnDoSearch(0); + return false; + } + return true; +} + +function vnDoSearch(f) { + var v = x('vn_S').value; + var d = x('vn_R'); + if(v.length < 1) + d.innerHTML = 'Hint: type vX if you know the visual novel id.'; + else { + if(f) + d.innerHTML = '...searching...'; + ajax('/xml/vn.xml?q='+escape(v)+'&r='+(Math.floor(Math.random()*999)+1), function () { + if(!hr || hr.readyState != 4 || !hr.responseText) + return; + if(hr.status != 200) + return alert('Whoops, error! :('); + var items = hr.responseXML.getElementsByTagName('item'); + if(!items || items.length < 1) { + d.innerHTML = 'No results'; + return false; + } + var res = ''; + var i,j; + for(i=0; i<items.length; i++) { + var id = items[i].getElementsByTagName('id')[0].firstChild.nodeValue; + var title = items[i].getElementsByTagName('title')[0].firstChild.nodeValue; + var s = ''; + for(j=0; j<vn.options.length; j++) + if(vn.options[j].value == id) + s = ' checked="checked"'; + res += '<input type="checkbox" id="vn_I'+id+'"'+s+' onclick="vnAddRem(\''+qq(id)+'\', \''+qq(title)+'\')" />' + + '<label style="width: auto" for="vn_I'+id+'">'+title+'</label><br style="clear: left" />'; + } + d.innerHTML = res; + }); + } +} + +function vnAddRem(id, title) { + var i; + var d = 0; + for(i=0;i<vn.options.length;i++) + if(vn.options[i].value == id) { + vn.options[i] = null; + d = 1; + } + if(!d && title) + vn.options[vn.options.length] = new Option(title, id); + else if(!title) { + vn.options[0].selected = true; + vnChangeSel(); + } + vnSerialize(); +} + +// id,title|||id,title +function vnSerialize() { + var dest = x('vn'); + var str = ''; + var i; + for(i=0;i<vn.options.length;i++) + vn.options[i].value != '0_new' && (str += (str.length>0 ? '|||' : '') + vn.options[i].value + ',' + vn.options[i].text); + dest.value = str; +} + +function vnLoad() { + var vns = x('vn').value.split('|||'); + if(!vns[0]) + return; + var i; + for(i=0;i<vns.length;i++) + vn.options[vn.options.length] = new Option(vns[i].split(',',2)[1], vns[i].split(',',2)[0]); +} + + + + + + + /************************\ + * C A T E G O R I E S * + \************************/ + + +function catLoad() { + var i;var cats=[]; + 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)); + + var l=x('cat').getElementsByTagName('a'); + for(i=0;i<l.length;i++) { + 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') { + 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) { + var c = rnk == 0 ? '#000' : + rnk == 1 ? '#090' : + rnk == 2 ? '#990' : '#900'; + x('b_'+id).style.color = c; + x('cat_'+id).style.color = c; + x('b_'+id).innerHTML = rnk; +} + + |