var toggleEnabled = 1;

function toggleUpload(n) {
	if (toggleEnabled === 0) { return false; }
	else if (n == 0) {
		$('tog0').checked = true;
		$('tog1').checked = false;
		$('tog2').checked = false;
		$('tog3').checked = false;
		$('tog4').checked = false;
		$('tog5').checked = false;
		$('uc').update('<script type="text/javascript">extArray = new Array(".jpg", ".jpeg", ".png", ".gif");</script><form action="/upload_image" method="post" enctype="multipart/form-data" id="theForm"><input type="hidden" name="MAX_FILE_SIZE" value="10485760" /> Upload Image: <input type="file" name="file" size="40" id="upload" /><br /><br /><br /><span id="btn"><input type="submit" value="Upload Image" id="button" /></span></form><p id="notice" class="notice"><br /></p><p>Allowed File Extensions: .jpg .jpeg .png .gif</p><script type="text/javascript">$(\'btn\').innerHTML = \'<input type="button" value="Upload Image" onclick="return doSubmit(extArray);" id="button" />\';</script>');
	}
	else if (n == 1) {
		$('tog0').checked = false;
		$('tog1').checked = true;
		$('tog2').checked = false;
		$('tog3').checked = false;
		$('tog4').checked = false;
		$('tog5').checked = false;
		$('uc').update('<form action="/image_from_url" method="post" id="theForm">Image URL: <input type="text" name="file" size="60" id="upload" value="http://" onclick="this.value=\'\';" /><br /><br /><br /><input type="submit" value="Upload Image" onclick="return checkURL();" id="button" /></span></form><p id="notice" class="notice"><br /></p><p>Allowed File Extensions: .jpg .jpeg .png .gif</p>');
	}
	else if (n == 2) {
		$('tog0').checked = false;
		$('tog1').checked = false;
		$('tog2').checked = true;
		$('tog3').checked = false;
		$('tog4').checked = false;
		$('tog5').checked = false;
		$('uc').update('<script type="text/javascript">extArray = 0;</script><form action="/upload_video" method="post" enctype="multipart/form-data" id="theForm">Upload Video: <input type="file" name="file" size="40" id="upload" /><br /><br /><br /><span id="btn"><input type="submit" value="Upload Video" id="button" /></span></form><p id="notice" class="notice"><br /></p><p>Max File Size: 500 MB</p><script type="text/javascript">$(\'btn\').innerHTML = \'<input type="button" value="Upload Video" onclick="return doSubmit(extArray);" id="button" />\';</script>');
	}
	else if (n == 3) {
		$('tog0').checked = false;
		$('tog1').checked = false;
		$('tog2').checked = false;
		$('tog3').checked = true;
		$('tog4').checked = false;
		$('tog5').checked = false;
		//$('uc').update('<script type="text/javascript">extArray = new Array(".jpg", ".jpeg", ".png", ".gif");</script><form action="/upload_file" method="post" enctype="multipart/form-data" id="theForm"><input type="hidden" name="MAX_FILE_SIZE" value="10485760" /> Upload File: <input type="file" name="file" size="40" id="upload" /><br /><br /><br /><input type="submit" value="Upload File" id="button" onclick="doSubmit(extArray);" /></form><p id="notice" class="notice"><br /></p><p>Max File Size: 500 MB</p>');
		$('uc').update('<script type="text/javascript">extArray = 0;</script><form action="/upload_file" method="post" enctype="multipart/form-data" id="theForm">Upload File: <input type="file" name="file" size="40" id="upload" /><br /><br /><br /><span id="btn"><input type="submit" value="Upload File" id="button" /></span></form><p id="notice" class="notice"><br /></p><p>Max File Size: 500 MB</p><script type="text/javascript">$(\'btn\').innerHTML = \'<input type="button" value="Upload File" onclick="return doSubmit(extArray);" id="button" />\';</script>');
	}
	else if (n == 4) {
		$('tog0').checked = false;
		$('tog1').checked = false;
		$('tog2').checked = false;
		$('tog3').checked = false;
		$('tog4').checked = true;
		$('tog5').checked = false;
		$('uc').update('Uploading audio is still being worked on!');
	}
	else if (n == 5) {
		$('tog0').checked = false;
		$('tog1').checked = false;
		$('tog2').checked = false;
		$('tog3').checked = false;
		$('tog4').checked = false;
		$('tog5').checked = true;
		$('uc').update('<form action="/get_youtube_video" method="post" id="theForm">YouTube URL: <input type="text" name="file" size="60" id="upload" value="http://" onclick="this.value=\'\';" /><br /><br /><br /><input type="submit" value="Get YouTube Video" id="button" /></span></form><p id="notice" class="notice"><br /></p><p>Please wait a minute after submitting!</p>');
	}
}
function checkURL() {
        var file = $('upload').value;
        if ((file !== "") && (file.length > 20) && (file.startsWith('http://'))) {
                if ((file.endsWith('.jpg')) || (file.endsWith('.jpeg')) || (file.endsWith('.png')) || (file.endsWith('.gif'))) {
				toggleEnabled = 0;
                                $('button').disable();
                                $('button').value='Please wait . . .';
                                $('theForm').submit();
                                return true;
                }
                $('notice').innerHTML = 'Please only upload files with valid extensions: .jpg .jpeg .png .gif';
                return false;
        }
        else {
                $('notice').innerHTML = 'Please enter a URL to the image you would like to upload.';
                return false;
        }
}
function doSubmit(extArray) {
	var file = $('upload').value;
	if (file != "") {
		if (extArray != "0") {
		ext = file.slice(file.indexOf(".")).toLowerCase();
        	for (var i = 0; i < extArray.length; i++) {
                	if (extArray[i] == ext) {
				toggleEnabled = 0;
				openProgressBar();
		                return true;
	                        break;
	                }
	        }
		}
		else {
			toggleEnabled = 0;
                        openProgressBar();
                        return true;
		}
	        $('notice').innerHTML = 'Please only upload valid file extensions: ' + (extArray.join(' '));
	        return false;
	}
	else {
		$('notice').innerHTML = 'Please browse for a file before clicking upload.';
		return false;
	}
}
function selectLink(num) {
        $('l' + num).select();
}
function regForm() {
	var user = $('user').value;
	var email = $('email').value;
	var pass = $('pass').value;
	var illegalChars = /\W/;
	if ((user.length < 4) || (user.length > 12)) {
		$('notice').innerHTML = 'Username must be between 4 and 12 characters.';
		$('user').focus();
	}
	else if ((illegalChars.test(user)) || (user.indexOf('__') != -1)) {
		$('notice').innerHTML = 'Username contains invalid characters.';
		$('user').focus();
	}
	else if ((pass.length < 6) || (pass.length > 20)) {
		$('notice').innerHTML = 'Password must be between 6 and 20 characters.';
		$('pass').focus();
	}
	else if (email.length < 6) {
		$('notice').innerHTML = 'You must enter an email address.';
		$('email').focus();
	}
	else if ((email.indexOf('.') < 5) || (email.indexOf('@') < 2)) {
		$('notice').innerHTML = 'Invalid email address entered.';
		$('email').focus();
	}
	else {
		$('notice').innerHTML = ' ';
		$('button').disable();
		$('theForm').submit();
	}
}
function loginForm() {
	var user = $('user').value;
	var pass = $('pass').value;
	if (user.length < 1) {
		$('notice').innerHTML = 'You must enter a username.';
		$('user').focus();
	}
	else if (pass.length < 1) {
		$('notice').innerHTML = 'You must enter a password.';
		$('pass').focus();
	}
	else {
		$('notice').innerHTML = ' ';
		$('button').disable();
		$('theForm').submit();
	}
}
function checkForEnter(e, t) {
	if (e.keyCode == 13) {
		if (t == 1) regForm();
		else if (t == 2) loginForm();
	}
}
function showPopup(i,e,u) {
	hp = $('hover');
	i = $('tbl' + i);
	hp.style.top = i.offsetTop + $('test').offsetTop + 'pt';
	hp.style.left = parseInt(i.offsetLeft) + parseInt($('test').offsetLeft) + 'pt';
	//hp.style.top = (e.clientY + 20) + 'pt';
	//hp.style.left = (e.clientX - 10) + 'pt';
	hp.style.visibility = "Visible";
	hp.innerHTML = '<table><tr><td class="h">Email &amp; IM<br />Direct Link<br />HTML Code<br />IMG Code</td>' +
'<td><input class="txt" type="text" value="http://s1.moooo.org/img/' + u + '/' + i + '.' + e + '" size="20" readonly="readonly" onclick="this.select();" />' + 
'<br /><input class="txt" type="text" value="http://s1.moooo.org/img/' + u + '/' + i + '.' + e + '" size="20" readonly="readonly" onclick="this.select();" />' +
'<br /><input class="txt" type="text" value="&lt;a href=&quot;http://s1.moooo.org/img/' + u + '/' + i + '.' + e + '&quot;&gt;' + i + '&lt;/a&gt;" size="20" readonly="readonly" onclick="this.select();" />' +
'<br /><input class="txt" type="text" value="[IMG]http://s1.moooo.org/img/' + u + '/' + i + '.' + e + '[/IMG]" size="20" readonly="readonly" onclick="this.select();" /></td></tr></table>';
}
function hidePopup() {
	hp = $('hover');
	hp.style.visibility = "Hidden";	
}
function resizeImage(i, w, h, pw) {
	if (pw == i.width) {
	i.width = w;
	i.height = h;
	//$('overlay').style.visibility = 'visible';
	}
	else {
	var r = pw / w;
	i.height = h * r;
	i.width = pw;
	//$('overlay').style.visibility = 'hidden';
	}
}
if (typeof Number.prototype.toFixed != "undefined") {
    (function(){
        /*  see http://www.jibbering.com/faq/#FAQ4_6 for details  */
        function Stretch(Q, L, c) {
            var S = Q
            if (c.length > 0)
                while (S.length < L)
                    S = c+S;
            return S;
        }
        function StrU(X, M, N) { /* X >= 0.0 */
            var T, S;
            S = new String(Math.round(X * Number("1e"+N)));
            if (S.search && S.search(/\D/) != -1)
                return ''+X;
            with (new String(Stretch(S, M+N, '0')))
                return substring(0, T=(length-N)) + '.' + substring(T);
        }
        function Sign(X) {
            return X < 0 ? '-' : '';
        }
        function StrS(X, M, N) {
            return Sign(X)+StrU(Math.abs(X), M, N);
        }
        Number.prototype.toFixed = function (n) { return StrS(this, 1, n) };
    })();
}

/*  the sprintf() function  */
sprintf = function () {
    /*  argument sanity checking  */
    if (!arguments || arguments.length < 1)
        alert("sprintf:ERROR: not enough arguments");

    /*  initialize processing queue  */
    var argumentnum = 0;
    var done = "", todo = arguments[argumentnum++];

    /*  parse still to be done format string  */
    var m;
    while (m = /^([^%]*)%(\d+$)?([#0 +'-]+)?(\*|\d+)?(\.\*|\.\d+)?([%diouxXfFcs])(.*)$/.exec(todo)) {
        var pProlog    = m[1],
            pAccess    = m[2],
            pFlags     = m[3],
            pMinLength = m[4],
            pPrecision = m[5],
            pType      = m[6],
            pEpilog    = m[7];

        /*  determine substitution  */
        var subst;
        if (pType == '%')
            /*  special case: escaped percent character  */
            subst = '%';
        else {
            /*  parse padding and justify aspects of flags  */
            var padWith = ' ';
            var justifyRight = true;
            if (pFlags) {
                if (pFlags.indexOf('0') >= 0)
                    padWith = '0';
                if (pFlags.indexOf('-') >= 0) {
                    padWith = ' ';
                    justifyRight = false;
                }
            }
            else
                pFlags = "";

            /*  determine minimum length  */
            var minLength = -1;
            if (pMinLength) {
                if (pMinLength == "*") {
                    var access = argumentnum++;
                    if (access >= arguments.length)
                        alert("sprintf:ERROR: not enough arguments");
                    minLength = arguments[access];
                }
                else
                    minLength = parseInt(pMinLength, 10);
            }

            /*  determine precision  */
            var precision = -1;
            if (pPrecision) {
                if (pPrecision == ".*") {
                    var access = argumentnum++;
                    if (access >= arguments.length)
                        alert("sprintf:ERROR: not enough arguments");
                    precision = arguments[access];
                }
                else
                    precision = parseInt(pPrecision.substring(1), 10);
            }

            /*  determine how to fetch argument  */
            var access = argumentnum++;
            if (pAccess)
                access = parseInt(pAccess.substring(0, pAccess.length - 1), 10);
            if (access >= arguments.length)
                alert("sprintf:ERROR: not enough arguments");

            /*  dispatch into expansions according to type  */
            var prefix = "";
            switch (pType) {
                case 'd':
                case 'i':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = subst.toString(10);
                    if (pFlags.indexOf('#') >= 0 && subst >= 0)
                        subst = "+" + subst;
                    if (pFlags.indexOf(' ') >= 0 && subst >= 0)
                        subst = " " + subst;
                    break;
                case 'o':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = subst.toString(8);
                    break;
                case 'u':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = Math.abs(subst);
                    subst = subst.toString(10);
                    break;
                case 'x':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = subst.toString(16).toLowerCase();
                    if (pFlags.indexOf('#') >= 0)
                        prefix = "0x";
                    break;
                case 'X':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = subst.toString(16).toUpperCase();
                    if (pFlags.indexOf('#') >= 0)
                        prefix = "0X";
                    break;
                case 'f':
                case 'F':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0.0;
                    subst = 0.0 + subst;
                    if (precision > -1) {
                        if (subst.toFixed)
                            subst = subst.toFixed(precision);
                        else {
                            subst = (Math.round(subst * Math.pow(10, precision)) / Math.pow(10, precision));
                            subst += "0000000000";
                            subst = subst.substr(0, subst.indexOf(".")+precision+1);
                        }
                    }
                    subst = '' + subst;
                    if (pFlags.indexOf("'") >= 0) {
                        var k = 0;
                        for (var i = (subst.length - 1) - 3; i >= 0; i -= 3) {
                            subst = subst.substring(0, i) + (k == 0 ? "." : ",") + subst.substring(i);
                            k = (k + 1) % 2;
                        }
                    }
                    break;
                case 'c':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = String.fromCharCode(subst);
                    break;
                case 's':
                    subst = arguments[access];
                    if (precision > -1)
                        subst = subst.substr(0, precision);
                    if (typeof subst != "string")
                        subst = "";
                    break;
            }

            /*  apply optional padding  */
            var padding = minLength - subst.toString().length - prefix.toString().length;
            if (padding > 0) {
                var arrTmp = new Array(padding + 1);
                if (justifyRight)
                    subst = arrTmp.join(padWith) + subst;
                else
                    subst = subst + arrTmp.join(padWith);
            }

            /*  add optional prefix  */
            subst = prefix + subst;
        }

        /*  update the processing queue  */
        done = done + pProlog + subst;
        todo = pEpilog;
    }
    return (done + todo);
}
interval = null;
interval_msec = 1000;
last_received = 0;
is_zero = 0;
is_started = 0;
time_since_start = 0;
last_ts = 0;
file_size = 0;
function fetch(uuid) {
    time_since_start += interval_msec;
    if (is_started) return;
    req = false;
    // basic object checking - forked from apple's xhr docs
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
      try {
        req = new XMLHttpRequest();
      } catch(e) {
        req = false;
      }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
      try {
        req = new ActiveXObject("Msxml2.XMLHTTP");
      } catch(e) {
        try {
          req = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
          req = false;
        } 
      }
    }
    if(!req) return;

    req.open("GET", "/progress", 1);
    req.setRequestHeader("X-Progress-Id", uuid);
    req.onreadystatechange = function () {
      if (!req) {
        window.clearTimeout(interval);
        return;
      }

      if (req.readyState == 1) {
        is_started = 1;
      }
	else if (req.readyState == 4) {
        is_started = 0;
        if (req.status == 200) {
          var upload = eval(req.responseText);

	  if (upload.state == 'error') {
	    document.getElementById('tp').innerHTML = "Upload failed - file too big!";
	  } else if (upload.size == 0) {
            window.clearTimeout(interval);

	    upload.size = file_size;
	    upload.received = file_size;
	  }

	  if (!file_size) file_size = upload.size;

          suffix = "";
	  delta_bytes = upload.received - last_received;
	  last_received = upload.received;
	  if (delta_bytes) {
	    is_zero = 0;
	    throughput = delta_bytes / (time_since_start - last_ts) * 1000;
	    last_ts = time_since_start;
	    left_bytes = upload.size - upload.received;
            left_time = left_bytes / throughput;            
            if (throughput > 10240) { throughput /= 1024; suffix = "k"; }
            if (throughput > 10240) { throughput /= 1024; suffix = "M"; }
            document.getElementById('tp').innerHTML = sprintf("Speed: %.2f %sB/s. Time Remaining: %.2fsec", throughput, suffix, left_time);
	  }
	else {
	    is_zero++;
	    if (is_zero > 3) {
              document.getElementById('tp').innerHTML = "Upload failed - stopped by user!";
              window.clearTimeout(interval);
	    }
	  }
          if (upload.state == 'done') {
            bar = document.getElementById('progressbar');
            w = 400;
            bar.style.width = w + 'px';
	  } else if (upload.state == 'uploading') {
            bar = document.getElementById('progressbar');
            w = 400 * upload.received / upload.size;
            bar.style.width = w + 'px';
          }
          if (upload.state == 'done' || upload.state == 'error') {
            window.clearTimeout(interval);
          }
        } else {
          window.clearTimeout(interval);
	}
      } else {

      }
    }
    req.send(null);
}
function openProgressBar() {
toggleEnabled = 0;
var uuid = "";
for (i = 0; i < 32; i++) {
	uuid += Math.floor(Math.random() * 16).toString(16);
}
$('theForm').action = $('theForm').action + '?X-Progress-ID=' + uuid;
$('theForm').submit();
$('uc').update('<center><div><div id="progress" style="width:400px;border:1px solid #000;text-align:left;"><div id="progressbar" style="width: 1px; background-color: black; border: 1px solid white">&nbsp;</div></div><div id="tp">(throughput)</div></div></center>');
document.getElementById('tp').innerHTML = 'Starting upload . . .';
interval = window.setInterval( function () {
     fetch(uuid);
   },
   2000
 );
}
function editFile(i,f,n,e) {
	$('files').hide();
	$('editbox').show();
	var maxlen = 23 - e.length;
	$('editbox').update('<b>Editing File <u>'+n+'</u></b><br /><br /><br />File Name: <input type="text" class="text" value="'+n+'" id="fname" maxlength="'+maxlen+'" />.'+e+
	'<br /><br /><br /><a href="#" onclick="cancelEditFile();return false;" class="abtn" style="color:#fff;">Cancel</a> <a href="#" onclick="doEditFile(\''+i+'\',\''+n+'\',\''+e+'\');return false;" onclick="return false;" class="abtn" style="color:#fff;">Update</a><br /><br />');
}
function editVideo(i,n) {
        $('files').hide();
        $('editbox').show();
        $('editbox').update('<b>Editing Video <u>'+n+'</u></b><br /><br /><br /><input size="44" type="text" class="text" value="'+n+'" id="fname" maxlength="60" />'+
        '<br /><br /><br /><a href="#" onclick="cancelEditFile();return false;" class="abtn" style="color:#fff;">Cancel</a> <a href="#" onclick="doEditVideo(\''+i+'\',\''+n+'\');return false;" onclick="return false;" class="abtn" style="color:#fff;">Update</a><br /><br />');
}
function editImage(i,n,e) {
        $('files').hide();
        $('editbox').show();
        $('editbox').update('<b>Editing Image <u>'+n+'</u></b><br /><br /><br /><input size="44" type="text" class="text" value="'+n+'" id="fname" maxlength="24" />'+
        '<br /><br /><br /><a href="#" onclick="cancelEditFile();return false;" class="abtn" style="color:#fff;">Cancel</a> <a href="#" onclick="doEditImage(\''+i+'\',\''+n+'\',\''+e+'\');return false;" onclick="return false;" class="abtn" style="color:#fff;">Update</a><br /><br />');
}
function cancelEditFile() {
	$('editbox').hide();
	$('files').show();
}
function doEditFile(i,oldName,e) {
	var newName = $('fname').value;
	if (newName == oldName) {
		cancelEditFile();
	}
	else {
		$('editbox').update('<br /><br /><img src="/inc/loading.gif" alt="Loading" /><br /><br />');
		new Ajax.Request('/ajax_edit_file', {
			method:'get',
			parameters:'id='+i+'&name='+escape(newName)+'.'+e,
			onSuccess: function(transport) {
			var rtn = transport.responseText;
			if (rtn == '1') {
			$('id'+i).update('<a href="/download/'+i+'">'+newName+'.'+e+'</a>');
			}
			cancelEditFile();
			}
		});
	}
}
function doEditVideo(i,oldName) {
        var newName = $('fname').value;
        if (newName == oldName) {
                cancelEditFile();
        }
        else {
                $('editbox').update('<br /><br /><img src="/inc/loading.gif" alt="Loading" /><br /><br />');
                new Ajax.Request('/ajax_edit_video', {
                        method:'get',
                        parameters:'id='+i+'&name='+escape(newName),
                        onSuccess: function(transport) {
                        var rtn = transport.responseText;
                        if (rtn == '1') {
                        $('id'+i).update('<a href="/video/'+i+'">'+newName+'</a>');
                        }
                        cancelEditFile();
                        }
                });
        }
}
function doEditImage(i,oldName,e) {
        var newName = $('fname').value;
        if (newName == oldName) {
                cancelEditFile();
        }
        else {
                $('editbox').update('<br /><br /><img src="/inc/loading.gif" alt="Loading" /><br /><br />');
                new Ajax.Request('/ajax_edit_image', {
                        method:'get',
                        parameters:'id='+i+'&name='+escape(newName),
                        onSuccess: function(transport) {
                        var rtn = transport.responseText;
                        if (rtn == '1') {
                        $('id'+i).update('<a href="/image/'+i+'">'+newName+'.'+e+'</a>');
                        }
                        cancelEditFile();
                        }
                });
        }
}
