diff options
Diffstat (limited to 'static')
-rw-r--r-- | static/files/blank.css | 0 | ||||
-rw-r--r-- | static/files/def.js | 110 | ||||
-rw-r--r-- | static/files/dyna.js | 196 | ||||
-rw-r--r-- | static/files/style.css | 47 |
4 files changed, 353 insertions, 0 deletions
diff --git a/static/files/blank.css b/static/files/blank.css new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/static/files/blank.css diff --git a/static/files/def.js b/static/files/def.js index d377bf09..7e7e46d9 100644 --- a/static/files/def.js +++ b/static/files/def.js @@ -43,9 +43,14 @@ function formhid() { formsubs[i] = !formsubs[i]; } } + if(x('screenshots') && !formsubs['scr']) + scrLoad(); } function formtoggle(n) { formsubs[n] = !formsubs[n]; + if(x('screenshots') && !formsubs['scr'] && !x('scrTbl')) + scrLoad(); + var i; var l = document.forms[1].getElementsByTagName('a'); for(i=0; i<l.length; i++) @@ -208,6 +213,102 @@ function ad_dosearch() { +/* S C R E E N S H O T S */ + +var scrNsfwEnabled = null; +function scrNsfwHid() { + var l=x('screenshots').getElementsByTagName('a'); + var i; + if(scrNsfwEnabled == null) + scrNsfwEnabled = 0; + else { + for(i=0;i<l.length;i++) + if(l[i].className.indexOf('scr_nsfw')>=0) + l[i].style.display = scrNsfwEnabled ? 'block' : 'none'; + scrNsfwEnabled = scrNsfwEnabled ? 0 : 1; + } + + var t=0;var n=0; + for(i=0;i<l.length;i++) { + t++; + if(l[i].className.indexOf('scr_nsfw')>=0) + n++; + if(l[i].style.display == 'none') + scrNsfwEnabled = 1; + } + x('scrNsfwHid').innerHTML = 'Showing '+(t-(scrNsfwEnabled?n:0))+' out of '+t+' items. ' + +(scrNsfwEnabled ? '<a href="javascript:scrNsfwHid()">Show</a> / hide' : 'Show / <a href="javascript:scrNsfwHid()">hide</a>') + +' nsfw.'; +} +var scrInt; +function scrView() { + var u=this.href; + var ol=x('screenshots').getElementsByTagName('a'); + var l=[]; + + // remove NSFW + for(i=0;i<ol.length;i++) + if(!scrNsfwEnabled || ol[i].className.indexOf('scr_nsfw')<0) + l[l.length] = ol[i]; + + // fix prev/next links + for(i=0;i<l.length;i++) + if(l[i].href == u) { + x('scrnext').style.visibility = l[i+1] ? 'visible' : 'hidden'; + x('scrnext').href = l[i+1] ? l[i+1].href : '#'; + x('scrprev').style.visibility = l[i-1] ? 'visible' : 'hidden'; + x('scrprev').href = l[i-1] ? l[i-1].href : '#'; + } + + // show image + x('preload').src = u; + x('scrimg').innerHTML = 'Loading...'; + x('scrView').style.display = 'block'; + scrPosition(1); + return false; +} +function scrPosition(act) { + d = x('scrView'); + m = x('preload'); + // why don't all browsers use the same DOM... + 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; + var h=20;var w=200; + if(act != 1) { + w = m.offsetWidth; + h = m.offsetHeight; + if(w+100 > ww || h+100 > wh) { + if(w/h > ww/wh) { // width++ + h *= (ww-100)/w; + w = ww-100; + } else { // height++ + w *= (wh-100)/h; + h = wh-100; + } + } + } + var dw = w; + var dh = h+20; + dw = dw < 200 ? 200 : dw; + d.style.width = dw+'px'; + d.style.height = dh+'px'; + d.style.left = ((ww - dw) / 2 - 10)+'px'; + d.style.top = ((wh - dh) / 2 + st)+'px'; + if(act != 1) + x('scrimg').innerHTML = '<img src="'+x('preload').src+'" onclick="scrClose()" style="width: '+w+'px; height: '+h+'px" />'; +} +function scrClose() { + clearInterval(scrInt); + scrInt = null; + x('scrView').style.display = 'none'; + x('scrView').style.top = '-5000px'; + x('scrimg').innerHTML = ''; + return false; +} + + + /* O N L O A D */ @@ -301,6 +402,15 @@ DOMLoad(function() { } } + // screenshots + if(x('scrNsfwHid')) + scrNsfwHid(); + if(x('scrView')) { + l=x('screenshots').getElementsByTagName('a'); + for(i=0;i<l.length;i++) + l[i].onclick=scrView; + x('scrnext').onclick = x('scrprev').onclick = scrView; + } // spam protection on all forms if(document.forms.length > 1) diff --git a/static/files/dyna.js b/static/files/dyna.js index 1c9c262d..639acfa9 100644 --- a/static/files/dyna.js +++ b/static/files/dyna.js @@ -59,6 +59,10 @@ function dInit() { ct = x('categories'); if(ct) catLoad(); + +/* scrLoad() is called by the form sub functions in def.js + if(x('scrfrm')) + scrLoad();*/ } function qq(v) { @@ -579,3 +583,195 @@ function catSet(id, rnk) { } + + + + + + /***************************\ + * S C R E E N S H O T S * + \***************************/ + + +var scrL = []; // id, load, nsfw, obj +function scrLoad() { + // 'screenshots' format: id,nsfw id,nsfw .. + var l=x('screenshots').value.split(' '); + for(var i=0;i<l.length;i++) + if(l[i].length > 2) + scrL[i] = { load: 0, id: l[i].split(',')[0], nsfw: l[i].split(',')[1]>0?1:0 }; + + // <tbody> because IE can't operate on <table> + x('scrfrm').innerHTML = '<table><tbody id="scrTbl"></tbody></table>'; + for(i=0;i<scrL.length;i++) + scrGenerateTR(i); + scrGenerateTR(i); + + setTimeout(scrSetSubmit, 1000); +} + +// give an error when submitting the form while still uploading an image +function scrSetSubmit() { + var o=document.forms[1].onsubmit; + document.forms[1].onsubmit = function() { + var c=0; + for(var i=0;i<scrL.length;i++) + if(scrL[i] && scrL[i].load) + c=1; + if(!c) + return o(); + alert('Please wait for the screenshots to be uploaded before submitting the form.'); + return false; + }; +} + +function scrURL(id, t) { + return x('scrfrm').className+'/s'+t+'/'+(id%100<10?'0':'')+(id%100)+'/'+id+'.jpg'; +} + +function scrGenerateTR(i) { + if(!scrL[i]) + scrL[i] = { id: 0, load: 0 }; + var r = '<b style="width: auto; float: none;margin: 0; padding: 0; font-weight: bold">'; + if(!scrL[i].id && !scrL[i].load) { + var c=0; + for(var j=0,c=0; j<scrL.length; j++) + if(scrL[j] && (scrL[j].load || scrL[j].id)) + c++; + if(c >= 10) + r += 'Enough screenshots</b>' + +'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 + r += 'Add screenshot</b>' + +'<input type="file" name="scrAddFile'+i+'" id="scrAddFile'+i+'" style="float: none; height: auto; width: auto;" />' + +'<input type="button" value="Upload!" style="float: none; height: auto; width: auto; display: inline;" onclick="scrUpload('+i+')" />'; + } + if(scrL[i].load && scrL[i].load == 1) + r += 'Uploading...</b>This could take a while, depending on the file size and your upload speed.<br />' + +'<a href="javascript:scrDel('+i+')">cancel</a>'; + if(scrL[i].load && scrL[i].load == 2) + r += 'Generating thumbnail...</b>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.'; + if(scrL[i].id && !scrL[i].load) + r += 'Screenshot #'+scrL[i].id+'</b>' + +'<input type="checkbox" name="scrNSFW'+i+'" id="scrNSFW'+i+'"'+(scrL[i].nsfw?' checked="checked"':'')+' style="float: left" onclick="scrSer()" /> ' + +'<label for="scrNSFW'+i+'" class="checkbox"> This screenshot is NSFW.</label>' + +'<input type="button" value="remove" onclick="scrDel('+i+')" style="float: right; width: auto; height: auto" />'; + + if(scrL[i].obj) { + x('scrTr'+i).getElementsByTagName('td')[1].innerHTML = r; + return; + } + + // the slow and tedious way, because we need to use DOM functions to manipulate the table contents... + var o = document.createElement('tr'); + o.setAttribute('id', 'scrTr'+i); + o.style.cssText = 'border-top: 1px solid #ccc'; + var d = document.createElement('td'); + d.style.cssText = 'width: 141px; height: 102px; padding: 0;'; + d.innerHTML = scrL[i].id && !scrL[i].load ? '<img src="'+scrURL(scrL[i].id, 't')+'" style="margin: 0; padding: 0; border: 0" />' : ' '; + var e = document.createElement('td'); + e.innerHTML = r; + o.appendChild(d); + o.appendChild(e); + x('scrTbl').appendChild(o); + scrL[i].obj = o; + scrStripe(); +} + +function scrUpload(i) { + scrL[i].load = 1; + // move the file selection box into a temporary form and post it into a temporary iframe + var d = document.createElement('div'); + d.id = 'scrUpl'+i; + d.style.cssText = 'visibility: hidden; overflow: hidden; width: 1px; height: 1px; position: absolute; left: -500px; top: -500px'; + d.innerHTML = '<iframe name="scrIframe'+i+'" id="scrIframe'+i+'" style="height: 0px; width: 0px; visibility: hidden"' + +' src="about:blank" onload="scrUploadComplete('+i+')"></iframe>' + +'<form method="post" action="/xml/screenshots.xml" target="scrIframe'+i+'" enctype="multipart/form-data" id="scrUplFrm'+i+'" name="scrUplFrm'+i+'">' + +'<input type="hidden" name="itemnumber" value="'+i+'" />' + +'</form>'; + document.body.appendChild(d); + x('scrUplFrm'+i).appendChild(x('scrAddFile'+i)); + x('scrUplFrm'+i).submit(); + scrGenerateTR(i); + scrGenerateTR(i+1); + return false; +} + +function scrStripe() { + var l = x('scrTbl').getElementsByTagName('tr'); + for(var j=0; j<l.length; j++) + l[j].style.backgroundColor = j%2==0 ? '#fff' : '#f5f5f5'; +} + +function scrUploadComplete(i) { + if(window.frames['scrIframe'+i].location.href.indexOf('screenshots') > 0) { + try { + scrL[i].id = window.frames['scrIframe'+i].window.document.getElementsByTagName('image')[0].getAttribute('id'); + } catch(e) { + scrL[i].id = -10; + } + if(scrL[i].id < 0) { + alert( + scrL[i].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.' : + scrL[i].id == -1 ? + 'Upload failed!\nOnly JPEG or PNG images are accepted.' : + 'Upload failed!\nNo file selected, or an empty file?'); + return scrDel(i); + } + scrL[i].load = 2; + scrGenerateTR(i); + scrImageFail(i); + } +} + +function scrImageFail(i) { + if(scrL[i].timer) + clearTimeout(scrL[i].timer); + if(!scrL[i].load) + return; + scrL[i].timer = setTimeout(function() { + if(!scrL[i].load) + return; + x('scrTr'+i).getElementsByTagName('td')[0].innerHTML = + '<img src="'+scrURL(scrL[i].id, 't')+'?'+(Math.floor(Math.random()*999)+1)+'" onload="scrImageSuccess('+i+')"' + +' onerror="scrImageFail('+i+')" style="visibility: hidden; width: 0px; height: 0px;" id="scrImage'+i+'" />'; + setTimeout('scrImageFail('+i+')', 7000); + }, 2000); +} + +function scrImageSuccess(i) { + scrL[i].load = 0; + x('scrImage'+i).style.cssText = 'margin: 0; padding: 0; border: 0;'; + scrGenerateTR(i); + scrSer(); +} + +function scrDel(i) { + x('scrTbl').removeChild(x('scrTr'+i)); + if(scrL[i].load) + document.body.removeChild(x('scrUpl'+i)); + scrL[i]=null; + scrGenerateTR(scrL.length-1); + scrSer(); + scrStripe(); +} + +function scrSer() { + var r=''; + for(var i=0;i<scrL.length;i++) { + if(scrL[i] && scrL[i].id && !scrL[i].load) { + scrL[i].nsfw = x('scrNSFW'+i).checked ? '1' : '0'; + r += ' '+scrL[i].id+','+scrL[i].nsfw; + } + } + x('screenshots').value = r; +} + + + + diff --git a/static/files/style.css b/static/files/style.css index ded407bd..65e02102 100644 --- a/static/files/style.css +++ b/static/files/style.css @@ -606,6 +606,53 @@ i.crgn3 { font-style: normal; font-weight: bold; } #dpage .retired { text-decoration: line-through; } #dpage dt b { color: #999; font-weight: normal; font-style: normal; font-size: 12px; } +/* Screenshots */ +div#screenshots { + display: block; + width: 700px; + margin: 0; + padding: 0; +} +div#screenshots a { + display: block; + float: left; + width: 136px; + height: 102px; + margin: 0; + padding: 2px; + text-decoration: none; + text-align: center; +} +div#screenshots a:hover { + background-color: #ccc; +} +div#screenshots a b { + display: block; + margin: -16px 0 0 0; + padding: 0; + height: 14px; + width: 136px; + text-align: right; + font-size: 12px; + color: #f00; +} +div#screenshots img { border: 0; padding: 0; } +div#scrView { + position: absolute; + display: none; + top: -5000px; + left: -5000px; + background-color: #fff; + border: 2px solid #ccc; + padding: 10px; + text-align: center; +} +#scrView img { cursor: pointer } +#scrclose { float: right; padding-left: 10px; } +#scrnext { padding-left: 5px; } +#scrprev { padding-right: 5px; } +#preload { visibility: hidden; position: absolute; left: -9000px; top: -9000px } + #content input.right, #content select.right { |