summaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
Diffstat (limited to 'static')
-rw-r--r--static/files/blank.css0
-rw-r--r--static/files/def.js110
-rw-r--r--static/files/dyna.js196
-rw-r--r--static/files/style.css47
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">&nbsp;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" />' : '&nbsp;';
+ 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 {