diff options
author | Yorhel <git@yorhel.nl> | 2009-03-22 10:55:48 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2009-03-22 10:55:48 +0100 |
commit | 09f80833cef287a5a4f5cf1018b19f8c2db3341e (patch) | |
tree | 000e757f9b11a6ce069c13da9b648751d6b453b3 /static | |
parent | 5f744cdcc18e0d67df8162ffb76e752a6f7a4a9c (diff) | |
parent | 1b99dd8701ce572c8ac20b71b3eb9b471b69d788 (diff) |
Merge branch 'tagging' into beta
Conflicts:
lib/VNDB/DB/Discussions.pm
util/updates/update_2.3.sql
Diffstat (limited to 'static')
-rw-r--r-- | static/f/forms.js | 194 | ||||
-rw-r--r-- | static/f/script.js | 62 |
2 files changed, 202 insertions, 54 deletions
diff --git a/static/f/forms.js b/static/f/forms.js index 3a09dc88..193b36d8 100644 --- a/static/f/forms.js +++ b/static/f/forms.js @@ -11,57 +11,6 @@ function shorten(v, l) { - /************************\ - * 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) { - x('cat_'+id).className = 'catlvl_'+rnk; - x('b_'+id).innerHTML = rnk; -} - - - - /***********************************\ @@ -156,8 +105,10 @@ function dsSearch(obj) { // show/hide the ds_box div if(obj.value.length < 2) { - if(b) + if(b) { b.style.top = '-500px'; + b.innerHTML = '<b>Loading...</b>'; + } obj.selectedId = 0; return; } @@ -860,3 +811,142 @@ function vnpSerialize(type) { } + + + + + /****************************************************\ + * V I S U A L N O V E L T A G L I N K I N G * + \****************************************************/ + + +function tglLoad() { + var n = x('tagtable').getElementsByTagName('tfoot')[0].getElementsByTagName('input'); + dsInit(n[0], '/xml/tags.xml?q=', function(item, tr) { + var td = document.createElement('td'); + td.innerHTML = shorten(item.firstChild.nodeValue, 40); + if(item.getAttribute('meta') == 'yes') + td.innerHTML += ' <b class="grayedout">meta</b>'; + else if(item.getAttribute('state') == 0) + td.innerHTML += ' <b class="grayedout">awaiting moderation</b>'; + tr.appendChild(td); + }, function(item) { + return item.firstChild.nodeValue; + }, tglAdd); + n[1].onclick = tglAdd; + + tglStripe(); + var l = x('tagtable').getElementsByTagName('tbody')[0].getElementsByTagName('tr'); + for(var i=0; i<l.length;i++) { + var o = l[i].getElementsByTagName('td'); + tglSpoiler(o[4], parseInt(o[4].innerHTML)); + tglVoteBar(o[3], parseInt(o[3].innerHTML)); + } +} + +function tglSpoiler(obj, spoil) { + var r = '<select onchange="tglSerialize()">'; + for(var i=-1; i<=2; i++) + r += '<option value="'+i+'"'+(spoil==i?' selected="selected"':'')+'>' + +(i == -1 ? 'neutral' : i == 0 ? 'no spoiler' : i == 1 ? 'minor spoiler' : 'major spoiler') + +' </option>'; + obj.innerHTML = r+'</select>'; +} + +function tglVoteBar(obj, vote) { + var r = ''; + for(var i=-3;i<=3;i++) + r += '<a href="#" class="taglvl taglvl'+i+'" onmouseover="tglVoteBarSel(this, '+i+')"' + + ' onmouseout="tglVoteBarSel(this, '+vote+')" onclick="return tglVoteBar(this.parentNode, '+i+')"> </a>'; + obj.innerHTML = r; + tglVoteBarSel(obj, vote); + tglSerialize(); + return false; +} + +function tglVoteBarSel(obj, vote) { + if(obj.className.indexOf('taglvl') >= 0) + obj = obj.parentNode; + var l = obj.getElementsByTagName('a'); + var num; + for(var i=0; i<l.length; i++) { + if((num = l[i].className.replace(/^.*taglvl(-?[0-3]).*$/, "$1")) == l[i].className) + continue; + if(num == 0) + l[i].innerHTML = vote == 0 ? '-' : vote; + else if(num<0&&vote<=num || num>0&&vote>=num) { + if(l[i].className.indexOf('taglvlsel') < 0) + l[i].className += ' taglvlsel'; + } else + if(l[i].className.indexOf('taglvlsel') >= 0) + l[i].className = l[i].className.replace(/taglvlsel/, ''); + } +} + +function tglAdd() { + var n = x('tagtable').getElementsByTagName('tfoot')[0].getElementsByTagName('input'); + n[0].disabled = n[1].disabled = true; + n[1].value = 'loading...'; + ajax('/xml/tags.xml?q=name:'+encodeURIComponent(n[0].value), function(hr) { + n[0].disabled = n[1].disabled = false; + n[1].value = 'Add tag'; + n[0].value = ''; + + 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 l = x('tagtable').getElementsByTagName('a'); + for(var i=0; i<l.length; i++) + if(l[i].innerHTML == shorten(name, 40)) + return alert('Tag is already present!'); + + var tr = document.createElement('tr'); + var td = document.createElement('td'); + td.innerHTML = '<a href="/g'+items[0].getAttribute('id')+'">'+name+'</a>'; + td.className = 'tc1'; + tr.appendChild(td); + td = document.createElement('td'); + td.className = 'tc2'; + td.innerHTML = '-'; + tr.appendChild(td); + td = document.createElement('td'); + td.innerHTML = '-'; + td.className = 'tc3'; + tr.appendChild(td); + td = document.createElement('td'); + tglVoteBar(td, 2); + td.className = 'tc4'; + tr.appendChild(td); + td = document.createElement('td'); + tglSpoiler(td, -1); + td.className = 'tc5'; + tr.appendChild(td); + x('tagtable').getElementsByTagName('tbody')[0].appendChild(tr); + tglStripe(); + tglSerialize(); + }); +} + +function tglStripe() { + var l = x('tagtable').getElementsByTagName('tbody')[0].getElementsByTagName('tr'); + for(var i=0;i<l.length;i++) + l[i].className = i%2 ? 'odd' : ''; +} + +function tglSerialize() { + var r = ''; + var l = x('tagtable').getElementsByTagName('tbody')[0].getElementsByTagName('tr'); + for(var i=0; i<l.length;i++) { + var lnk = l[i].getElementsByTagName('a')[0].href; + var vt = l[i].getElementsByTagName('td')[3].getElementsByTagName('a'); + var id; + if((id = lnk.replace(/^.*g([1-9][0-9]*)$/, "$1")) != lnk && vt.length > 3 && vt[3].innerHTML != '-') + r += (r?' ':'')+id+','+vt[3].innerHTML+','+(l[i].getElementsByTagName('select')[0].selectedIndex-1); + } + x('taglinks').value = r; +} + + diff --git a/static/f/script.js b/static/f/script.js index e434eede..6a08f3cb 100644 --- a/static/f/script.js +++ b/static/f/script.js @@ -33,6 +33,24 @@ function ajax(url, func) { 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 readCookie(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; +} + + @@ -328,6 +346,28 @@ function jtSel(which, nolink) { +/* Tag VN spoilers */ +function tvsSet(lvl) { + var l = x('tagops').getElementsByTagName('a'); + for(var i=0;i<l.length;i++) { + if(i == lvl && l[i].className.indexOf('tsel') < 0) + l[i].className += ' tsel'; + else if(i != lvl && l[i].className.indexOf('tsel') >= 0) + l[i].className = l[i].className.replace(/tsel/, ''); + } + l = x('vntags').getElementsByTagName('span'); + for(i=0;i<l.length;i++) { + if(lvl < l[i].className.substr(6, 1) && l[i].className.indexOf('hidden') < 0) + l[i].className += ' hidden'; + else if(lvl >= l[i].className.substr(6, 1) && l[i].className.indexOf('hidden') >= 0) + l[i].className = l[i].className.replace(/hidden/, ''); + } + return false; +} + + + + /* O N L O A D E V E N T */ DOMLoad(function() { @@ -394,7 +434,9 @@ DOMLoad(function() { if(this.selectedIndex != 0) location.href = location.href.replace(/\.[0-9]+/, '')+'/list?e='+this.options[this.selectedIndex].value; }; + // User VN list + // (might want to make this a bit more generic, as it's now also used for the user tag list) i = x('relhidall'); if(i) { var l = document.getElementsByTagName('tr'); @@ -475,6 +517,22 @@ DOMLoad(function() { break; } + // VN tag spoiler options + if(x('tagops')) { + l = x('tagops').getElementsByTagName('a'); + for(i=0;i<l.length;i++) + l[i].onclick = function() { + var l = x('tagops').getElementsByTagName('a'); + for(var i=0;i<l.length;i++) + if(l[i] == this) { + tvsSet(i); + setCookie('tagspoil', i); + } + return false; + }; + tvsSet(readCookie('tagspoil')||0); + } + // Javascript tabs if(x('jt_select')) jtInit(); @@ -496,8 +554,6 @@ DOMLoad(function() { } // forms.js - if(x('categories')) - catLoad(); if(x('relations')) relLoad(); if(x('jt_box_screenshots')) @@ -508,6 +564,8 @@ DOMLoad(function() { vnpLoad('vn'); if(x('jt_box_producers')) vnpLoad('producers'); + if(x('taglinks')) + tglLoad(); // spam protection on all forms if(document.forms.length >= 1) |