var ie = document.all ? 1 : 0;

// Prototypes
Array.prototype.find = function(searchStr, searchField){
    var returnArray = false;
    for(i = 0; i < this.length; i++){
        if(typeof(searchStr) == 'function'){
            if(searchStr.test(this[i])){
                returnArray = returnArray || [];
                returnArray.push(i);
            }
        }else{
            if((typeof(searchField) != 'undefined' && this[i][searchField] == searchStr) || this[i] === searchStr){
                returnArray = returnArray || [];
                returnArray.push(i);
            }
        }
    }

    return returnArray;
};

RegExp.escape = function(text){
    if(!arguments.callee.sRE){
        var specials = [
            '/', '.', '*', '+', '?', '|', '$',
            '(', ')', '[', ']', '{', '}', '\\'
        ];
        arguments.callee.sRE = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
    }

    return text.replace(arguments.callee.sRE, '\\$1');
}



// Onload function
var winView = {width:0, height:0};
var centeredElements = new Array();

function init(){
    // start the clock
    if(typeof(start_clock) == 'function'){
        start_clock('clock');
    }

    // resize the textarea, if possible
    if(typeof(resizeTextArea) == 'function'){
        resizeTextArea();
    }

    // make buttons interactive
    animateButtons(document);

    // capture mouse movement
    if(typeof(mouseMove) == 'function'){
        document.onmousemove = mouseMove;
        document.onmouseup = mouseUp;
    }

    // override showAnimations if cookie is set
    if(readCookie('showAnimations') !== null){
        showAnimations = readCookie('showAnimations') * 1;
    }

    // load the directory and get the window size
    if(typeof(loadDir) == 'function'){
        showSpinner2();
        loadDir();
    }
    getWinSize();

    // initialize the autocomplete field(s)
    if($('path') && typeof(AutoSuggest) != 'undefined'){
        new AutoSuggest($('path'), auto_path_list);
    }

    // re-get the window size when the window is resized
    if(window.addEventListener){
        window.addEventListener('resize', getWinSize, false);
    }else if(window.attachEvent){
        window.attachEvent('onresize', getWinSize);
    }

    document.onkeydown = function(ev){
        var ENTER = 13;
        var ESC = 27;
        var TILDE = 192;
        var DEL = 46;

        ev = ev || window.event;
        var key = ev.keyCode || ev.which;

        if($('overlayBG')){
            switch(key){
                case ESC:
                    closeOverlay(false);
                    return false;
                break;
                case ENTER:
                    if($("dialog_submit")){
                        $("dialog_submit").onclick();
                        return false;
                    }
                break;
            }
        }else if(defaultMenu && !pathFocused){
            if($('menu') && key >= 48 && key <= 57){
                key = (key > 48) ? key - 49 : 9;
                if($('menu').getElementsByTagName('A')[key]){
                    var link = $('menu').getElementsByTagName('A')[key];
                    if(link.onclick){
                        link.onclick();
                        return false;
                    }else{
                        document.location.href = link.href;
                    }
                    return false;
                }

                return;
            }
            switch(key){
                case ESC:
                    return false;   // So animated gifs don't stop
                break;
                case TILDE:
                    if($('consoleMenuLink')){
                        $('consoleMenuLink').onclick();
                    }
                    return false;
                break;
                case DEL:
                    if(AUTH){
                        confirmDelete(checkList);
                    }
                break;
            } 
        }
    };
}

// Center an element, and re-center when winView changes
function centerElement(elem){
    if(!elem){
        return false;
    }

    elem.style.position = 'absolute';
    elem.style.top = (winView.height - elem.offsetHeight) / 2 + 'px';
    elem.style.left = (winView.width - elem.offsetWidth) / 2 + 'px';
    if(centeredElements.find(elem) === false){
        centeredElements[centeredElements.length] = elem;
    }
    return true;
}

// Make buttons interactive
function animateButtons(elem){
    if(!elem){
        return false;
    }

    var buttons = elem.getElementsByTagName('INPUT');
    for(i = 0; i < buttons.length; i++){
        if(buttons[i].type == 'button' || buttons[i].type == 'submit' || buttons[i].type == 'reset'){
            buttons[i].onmouseover = function(){this.style.backgroundPosition = '0px -22px';};
            buttons[i].onmousedown = function(){this.style.backgroundPosition = '0px -44px';};
            buttons[i].onmouseup = function(){this.style.backgroundPosition = '0px -22px';};
            buttons[i].onmouseout = function(){this.style.backgroundPosition = '0px 0px';};
            buttons[i].onfocus = function(){this.blur();};
        }
    }
}

// Preload images
var spinner = document.createElement('IMG');
spinner.src = imgDir + '/loading2.gif';
spinner.style.height = '24px';
spinner.style.width = '24px';

var okImg = document.createElement('IMG');
var xImg = document.createElement('IMG');
okImg.src = imgDir + '/ok.png';
xImg.src = imgDir + '/x.png';

// Overlay functions
function createDialog(text, title, callback, submitButtonText, cancelButtonText, resetButtonText, onLoad){
    var fg = document.createElement('DIV');
        fg.className = 'overlayFG';
    var fgTitle = document.createElement('DIV');
        fgTitle.className = 'overlayTitle';
    var titleText = document.createElement('SPAN');
        titleText.id = 'overlayTitle';
        titleText.innerHTML = title;
    var close = document.createElement('A');
        close.href = 'javascript:void(0)';
        close.onclick = function(){closeOverlay(false)};
        close.id = 'closeButton';
        close.innerHTML = "close ";
        close.appendChild(xImg);
    var textBox = document.createElement('FIELDSET');
        textBox.innerHTML = text;
    var buttons = document.createElement('CENTER');
    var submit = document.createElement('INPUT');
        submit.type = 'submit';
        submit.id = 'dialog_submit';
        submit.onclick = function(){closeOverlay(true);return false;};
        submit.value = submitButtonText || "OK";
        submit.className = (submit.value.length < 4) ? 'buttonSmall' : ((submit.value.length > 6) ? 'buttonBig' : 'button');

    fgTitle.appendChild(close);
    fgTitle.appendChild(titleText);
    buttons.appendChild(submit);
    if(typeof(resetButtonText) == 'string'){
        var reset = document.createElement('INPUT');
        reset.type = 'reset';
        reset.value = resetButtonText || "Reset";
        reset.className = (reset.value.length < 4) ? 'buttonSmall' : ((reset.value.length > 6) ? 'buttonBig' : 'button');
        buttons.appendChild(document.createTextNode(" "));
        buttons.appendChild(reset);
    }
    if(typeof(cancelButtonText) == 'string'){
        var cancel = document.createElement('INPUT');
        cancel.type = 'button';
        cancel.onclick = function(){closeOverlay(false);};
        cancel.value = cancelButtonText || "Cancel";
        cancel.className = (cancel.value.length < 4) ? 'buttonSmall' : ((cancel.value.length > 6) ? 'buttonBig' : 'button');
        buttons.appendChild(document.createTextNode(" "));
        buttons.appendChild(cancel);
    }
    fg.appendChild(fgTitle);

    var form = document.createElement('FORM');
    form.id = "fgForm";
    form.onsubmit = function(){closeOverlay(true);return false;};
    form.appendChild(textBox);
    form.appendChild(buttons);
    fg.appendChild(form);

    createOverlay(fg, null, null, callback, true, onLoad);
}

function createOverlay(body, onload, opacity, onclose, dialog, onLoad){
    if($('overlayBG') || $('overlayFG')){
        //if(findActive('overlayBGFade')){
            setTimeout(function(){createOverlay(body, onload, opacity, onclose, dialog, onLoad);}, animationInterval);
        //}
        return false;
    }

    var opacity;
    var bg = createOverlayBG();

    var fg = document.createElement('DIV');
    fg.style.position = 'fixed';
    fg.style.top = '0';
    fg.style.left = '0';
    fg.style.padding = '0';
    fg.style.margin = '0';
    fg.style.width = '100%';
    fg.style.height = '100%';
    fg.style.overflow = 'hidden';
    fg.style.background = 'transparent';
    fg.style.zIndex = 21;
    fg.style.textAlign = 'center';
    fg.id = 'overlayFG';
    if(typeof(onclose) == 'function'){
        fg.onclose = onclose;
    }

    document.body.appendChild(fg);
    document.body.appendChild(bg);

    showSpinner(opacity);
    if(!dialog){
        doCallback(body, fgLoad);
    }else{
        bg.innerHTML = '';
        fg.appendChild(body);

        if(showAnimations){
            fg.style.display = 'none';
        }
        fg.style.overflowY = 'auto';
        animateButtons(fg);

        if(typeof(onLoad) == 'function'){
            onLoad();
        }

        makeDraggable(document.getElementsByClassName("overlayTitle")[0], fg.getElementsByTagName("DIV")[0], null, null, null, null, true);
        if(showAnimations){
            fade('overlayFG', 1, .05, 0, function(){$(fg).setStyle({opacity: ''});focus('overlayFG');});
        }else{
            $(fg).setStyle({opacity: ''});
            focus('overlayFG');
        }
        centerElement(fg.getElementsByTagName("DIV")[0]);
    }

    function fgLoad(response){
        bg.innerHTML = '';
        fg.innerHTML = response;

        if(typeof(onload) == 'function'){
            onload();
        }else{
            if(showAnimations){
                fg.style.display = 'none';
            }
            fg.style.overflowY = 'auto';
            animateButtons(fg);

            makeDraggable(document.getElementsByClassName("overlayTitle")[0], fg.getElementsByTagName("DIV")[0], null, null, null, null, true);
            if(showAnimations){
                fade('overlayFG', 1, .05, 0, function(){$(fg).setStyle({opacity: ''});focus('overlayFG');});
            }else{
                $(fg).setStyle({opacity: ''});
                focus('overlayFG');
            }
            centerElement(fg.getElementsByTagName("DIV")[0]);
        }
    }
}

function createOverlayBG(){
    if($('overlayBG')){
        return false;
    }

    var bg = document.createElement('DIV');
    bg.style.position = 'fixed';
    bg.style.top = '0';
    bg.style.left = '0';
    bg.style.width = '100%';
    bg.style.height = '100%';
    bg.style.background = '#000000';
    bg.style.display = 'none';
    bg.style.zIndex = 20;
    bg.style.textAlign = 'center';
    bg.id = 'overlayBG';

    return bg;
}

function closeOverlay(response){
    var dragObject = null;
    bg = $('overlayBG');
    fg = $('overlayFG');

    if(bg){
        if(showAnimations){
            fade('overlayBG', 0, .05, 0, function(){document.body.removeChild(bg);});
        }else{
            document.body.removeChild(bg);
        }
    }
    if(fg){
        if(typeof(fg.onclose) == 'function'){
            fg.onclose(response);
        }

        if(showAnimations){
            fade('overlayFG', 0, .05, 0, function(){document.body.removeChild(fg);});
        }else{
            document.body.removeChild(fg);
        }
    }
    if(centeredElements.find(bg) !== false){
        centeredElements.splice(centeredElements.find(bg), 1);
    }
}

function showSpinner(opacity){
    var opacity = opacity || .6;

    spinner.style.position = 'absolute';
    spinner.style.top = (Math.round(winView.height / 2) - 15) + 'px';
    var bg = $('overlayBG');
    if(!bg){
        var bg = createOverlayBG();
        bg.appendChild(spinner);
        document.body.appendChild(bg);
    }else{
        bg.appendChild(spinner);
    }
    if(bg.getStyle('opacity') != opacity){
        if(showAnimations){
            fade('overlayBG', opacity, .05);
        }else{
            bg.style.display = '';
            bg.setStyle({opacity: opacity});
        }
    }
}

// Abbreviate a path
function shortenPath(path, length, displayElipses){
    path2 = path.substr(1, path.length - 1).split('/');
    if(path2.length - 1 > length){
        path2 = path2.splice(path2.length - length - 1, length);
        return (displayElipses ? '.../' : '/') + path2.join('/') + '/';
    }
    return(path != '//' ? path : '/');
}

function parentDir(path){
    if(path.charAt(path.length - 1) == '/'){
        path = path.substr(0, path.length - 1);
    }
    path = path.split('/');
    return (path.splice(0, path.length - 1).join('/') + '/');
}

// Convert bytes to human-readable units
function byteUnit(bytes, decimals){
    if(bytes == '?'){
        return bytes;
    }

    if(decimals === undefined){
        var decimals = 2;
    }

    bytes *= 1;

    if(bytes >= 1073741824){
        return (bytes / 1073741824).toFixed(decimals) + " GiB";
    }

    if(bytes >= 1048576){
        return (bytes / 1048576).toFixed(decimals) + " MiB";
    }

    if(bytes >= 1024){
        return (bytes / 1024).toFixed(decimals) + " KiB";
    }

    return bytes.toFixed(decimals) + " B";
}

// Convert octal permissions to string
function readPerm(perm){
    var let = '';

    let = ((perm & 0x0100) ? 'r' : '-');

    let += ((perm & 0x0080) ? 'w' : '-');

    let += ((perm & 0x0040) ? 'x' : '-');

    let += ((perm & 0x0020) ? 'r' : '-');

    let += ((perm & 0x0010) ? 'w' : '-');

    let += ((perm & 0x0008) ? 'x' : '-');

    let += ((perm & 0x0004) ? 'r' : '-');

    let += ((perm & 0x0002) ? 'w' : '-');

    let += ((perm & 0x0001) ? 'x' : '-');

    return let;
}

// Focus a text element
function focus(id){
    elem = $(id);
    if(elem.tagName == 'TEXTAREA' || (elem.tagName == 'INPUT' && (elem.type == 'text' || elem.type == 'password'))){
        elem.focus();
    }else{
        var elements = elem.getElementsByTagName('INPUT');
        for(var i = 0; i < elements.length; i++){
            elem = elements[i];
            if(elem.type == 'text' || elem.type == 'password'){
                elem.select();
                return true;
            }
        }
    }
}

// Display a status message for three seconds
var lastStatusMsg = '';
function setStatus(message, error, clear){
    if(!statusBar || !message){
        return false;
    }

    window.clearTimeout(window.statusTimer);

    var delay = (error) ? 2 : 1.2;
    var id = new Date();
    id = 'mesg_' + (id.getTime() + delay * 1000);

    var box = document.createElement("span");
    box.innerHTML = '&nbsp;&nbsp;' + message + '&nbsp;&nbsp;';
    box.className = (error) ? 'errormsg ' + id : id;    
    box.id = id;
    if(id.substr(5) > lastStatusMsg){
         lastStatusMsg = id.substr(5);
    }
    statusBar.style.zIndex = 50;
    if(clear){
        statusBar.innerHTML = '';
    }
    statusBar.appendChild(box);
    statusBar.appendChild(document.createElement('BR'));

    fade(id, 0, .25, delay, function(){$(box).setStyle({opacity: 0.0}); if(this.id == "mesg_" + lastStatusMsg + "Fade"){statusBar.innerHTML = '';statusBar.style.zIndex = -10;}});
}

// Don't send a plaintext password!
function hash_pw(pw, seed){
    if(seed){
        return MD5(MD5(pw) + seed);
    }else{
        elem = $(pw);
        if(!elem || !elem.value){
            return false;
        }

        elem.value = MD5(MD5(elem.value) + seed);
    }
}

// Checks to see if the string is a valid email address
function validEmail(e){
    var ok = "1234567890qwertyuiop[]asdfghjklzxcvbnm.@-_QWERTYUIOPASDFGHJKLZXCVBNM";

    for(var i = 0; i < e.length; i++){
        if(ok.indexOf(e.charAt(i)) < 0){
            return false;
        }
    }

    if(document.images){
        var re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/;
        var re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
        if(e.match(re) || !e.match(re_two)){
            return false;
        }
    }

    return true;
}



// Ajax dialog functions
function login(form){
    var username = form.username.value;
    var password = form.password.value;
    var seed = form.seed.value;
    var remember = form.remember.checked * 1;
    if(!username || !password){
        setStatus("Please complete the form.", true);
        focus('overlayFG');
        return false;
    }

    doCallback(WEB_ROOT + "/login.php?username=" + escape(username) + "&password=" + hash_pw(password, seed) + "&remember=" + remember, loginCallback, 'POST');

    function loginCallback(response){
        if(response.substr(0, 2) != "OK"){
            setStatus(response, true);
            form.password.value = password;
            focus('password');
            return false;
        }else{
            response = response.split("\n");

            if(typeof(getURLPath) == 'function'){
                createCookie('last_path', getURLPath(), 30);
            }
            closeOverlay(true);
            setStatus(response[1], false, true);
            doCallback(WEB_ROOT + "/ajax.php?mode=vars", reloadVars2);
            if(defaultMenu == true){
                doCallback(WEB_ROOT + "/ajax.php?mode=menu", function(response){$('menu').innerHTML = response;});
            }
            doCallback(WEB_ROOT + "/ajax.php?mode=footer", function(response){$('footer').innerHTML = response;});
            if(typeof(loadDir) == 'function'){
                loadDir(response[2]);
            }
        }
    }
}

function logout(){
    doCallback(WEB_ROOT + "/logout.php", function(response){
        if(response == "OK"){
            window.clearInterval(window.checkWaitingUsers);
            doCallback(WEB_ROOT + "/ajax.php?mode=vars", reloadVars);
            if(readCookie('showAnimations') !== null){
                showAnimations = readCookie('showAnimations') * 1;
            }
            if(defaultMenu == true){
                doCallback(WEB_ROOT + "/ajax.php?mode=menu", function(response){$('menu').innerHTML = response;});
            }
            doCallback(WEB_ROOT + "/ajax.php?mode=footer", function(response){$('footer').innerHTML = response;if(typeof(loadDir) == 'function')loadDir();});
            setStatus("Goodbye.");
        }else{
            setStatus("Error logging out.", true);
        }
    });
}

function reloadFooter(){
    doCallback(WEB_ROOT + "/ajax.php?mode=footer", function(response){$('footer').innerHTML = response;});
}

function reloadVars(response){
    if(!response){
        return false;
    }

    response = response.split("\n");
    $('themeCSS').href = response[0];
    for(var i = 1; i < response.length; i++){
        eval(response[i]);
    }

    if(readCookie('showAnimations') !== null){
        showAnimations = readCookie('showAnimations') * 1;
    }

    if(typeof(start_clock) == 'function'){
        start_clock('clock');
    }
    if(typeof(loadDir) == 'function'){
        loadDir();
    }
}

function reloadVars2(response){
    if(!response){
        return false;
    }

    response = response.split("\n");
    $('themeCSS').href = response[0];
    for(var i = 1; i < response.length; i++){
        eval(response[i]);
    }

    if(readCookie('showAnimations') !== null){
        showAnimations = readCookie('showAnimations') * 1;
    }

    if(typeof(start_clock) == 'function'){
        start_clock('clock');
    }
}

function saveUserSettings(form){
    options = form.elements;
    var newOpt = new Array();
    var request = "";

    for(var i = 0; i < options.length; i++){
        var option = options[i];
        var value = null;

        if(option.name){
            switch(option.type){
                case 'text':
                    value = option.value;
                break;
                case 'select-one':
                    value = option.options[option.selectedIndex].value;
                break;
                case 'checkbox':
                    if(option.name.indexOf('cookie_') == 0){
                        if(eval('options.' + option.name.substr(7) + '.checked') != option.checked){
                            createCookie(option.name.substr(7), option.checked * 1, 30);
                        }else{
                            eraseCookie(option.name.substr(7));
                        }
                    }else{
                        value = option.checked * 1;
                    }
                break;
                case 'radio':
                break;
                case 'text':
                    value = option.value;
                break;
            }
        }

        if(value !== null){
            if(typeof(value) == 'string'){
                var nvalue = '"' + escape(value) + '"';
            }else{
                var nvalue = value + 0;
                value += 0;
            }

            eval(option.name + ' = ' + nvalue + '');

            if(!AUTH){
                if(value != eval(option.name + '_default') || option.name == 'showAnimations'){
                    createCookie(option.name, value, 30);
                }else{
                    eraseCookie(option.name);
                }
            }else{
                request += "&opt[]=" + escape(option.name) + "&value[]=" + escape(value);
            }
        }
    }

    if(AUTH){
        doCallback(WEB_ROOT + "/settings.php?" + request, callback, 'POST');
    }else{
        doCallback(WEB_ROOT + "/ajax.php?mode=vars", reloadVars);
    }

    function callback(response){
        if(response){
            if(response == 1){
                setStatus("Preferences saved.");
                doCallback(WEB_ROOT + "/ajax.php?mode=vars", reloadVars);
            }else{
                if(response == 'AUTH'){
                    setStatus("You are not logged in!", true);
                }else{
                    setStatus("Error saving preferences!", true);
                }
            }
        }else{
            setStatus("Communication error!", true);
        }
    }
}

// Set a user preference
function setOpt(opt, value){
    if(typeof(value) == 'string'){
        var nvalue = '"' + escape(value) + '"';
    }else{
        var nvalue = value + 0;
        value += 0;
    }

    eval(opt + ' = ' + nvalue + '');

    if(!AUTH){
        if(value != eval(opt+'_default') || opt == 'showAnimations'){
            createCookie(opt, value, 30);
        }else{
            eraseCookie(opt);
        }

        return false;
    }

    doCallback((WEB_ROOT + "/settings.php?opt=" + escape(opt) + "&value=" + escape(value)), callback, 'POST');

    function callback(response){
        if(response == 1){
            setStatus("Preferences saved.");
        }else{
            if(response == 'AUTH'){
                setStatus("You are not logged in!", true);
            }else{
                setStatus("Error saving preferences!", true);
            }
        }
    }
}

function newPassword(form, reset){
    if(reset){
        var username = form.username.value;
        var email = form.email.value;
        if(!username || !email){
            setStatus("Please complete the form.", true);
            focus('overlayFG');
            return false;
        }
        if(!validEmail(email)){
            setStatus("Please enter a valid email address.", true);
            focus('email');
            return false;
        }

        doCallback(WEB_ROOT + "/newpw.php?username=" + escape(username) + "&email=" + escape(email), genericCallback, 'POST');
    }else{
        var oldPassword = form.password.value;
        var newPassword = form.password1.value;
        var newPassword2 = form.password2.value;
        var seed = form.seed.value;
        if(!oldPassword || !newPassword || !newPassword2){
            setStatus("Please complete the form.", true);
            focus('overlayFG');
            return false;
        }
        if(newPassword !== newPassword2){
            setStatus("The new passwords don't match.", true);
            focus('password2');
            return false;
        }
        if(oldPassword == newPassword){
            setStatus("The new password is the same as the current.", true);
            focus('password1');
            return false;
        }
        if(newPassword.length < 7){
            setStatus("The new password must be greater than six characters long.", true);
            focus('password1');
            return false;
        }

        doCallback(WEB_ROOT + "/newpw.php?a=" + MD5(newPassword) + "&b=" + hash_pw(oldPassword, seed), genericCallback, 'POST');
    }
}

function newEmail(form){
    var password = form.password.value;
    var email = form.email1.value;
    var email2 = form.email2.value;
    var seed = form.seed.value;
    if(!password || !email || !email2){
        setStatus("Please complete the form.", true);
        focus('overlayFG');
        return false;
    }
    if(email !== email2){
        setStatus("The new email addresses don't match.", true);
        focus('email2');
        return false;
    }
    if(!validEmail(email)){
        setStatus("Please enter a valid email address.", true);
        focus('email1');
        return false;
    }

    doCallback(WEB_ROOT + "/newemail.php?password=" + hash_pw(password, seed) + "&email=" + escape(email), genericCallback, 'POST');
}

function authUser(username){
    doCallback(WEB_ROOT + "/adduser.php?userauth=" + escape(username), addUserCallback, 'POST');
}

function newUser(form){
    var username = form.username.value;
    var email = form.email.value;
    var email2 = form.email2.value;

    if(!ADMIN){
        var password = form.password.value;
        var password2 = form.password2.value;

        if(!username || !email || !email2 || !password || !password2){
            setStatus("Please complete the form.", true);
            focus('overlayFG');
            return false;
        }else if(password != password2){
            setStatus("The passwords don't match.", true);
            focus('password');
            return false;
        }
    }else{
        var admin = form.admin.checked * 1;

        if(!username || !email || !email2){
            setStatus("Please complete the form.", true);
            focus('overlayFG');
            return false;
        }
    }

    if(!validEmail(email)){
        setStatus("Please enter a valid email address.", true);
        focus('email');
        return false;
    }else if(email != email2){
        setStatus("The email addresses don't match", true);
        focus('email2');
        return false;
    }

    if(ADMIN){
        doCallback(WEB_ROOT + "/adduser.php?username=" + escape(username) + "&email=" + escape(email) + "&admin=" + admin, addUserCallback, 'POST');
    }else{
        doCallback(WEB_ROOT + "/adduser.php?username=" + escape(username) + "&password=" + MD5(password) + "&email=" + escape(email), addUserCallback, 'POST');
    }
}

function addUserCallback(response){
    if(response.substr(0, 2) == "OK"){
        setStatus(response.substr(3));
        if(ADMIN){
            doCallback(WEB_ROOT + "/ajax.php?mode=footer", function(response){$('footer').innerHTML = response;});
        }else{
            closeOverlay();
        }

        if(typeof(loadDir) == 'function'){
            loadDir();
        }
        return true;
    }else if(response){
        setStatus(response, true);
        focus('overlayFG');
        return false;
    }else{
        setStatus("Communication error!", true);
        focus('overlayFG');
        return false;
    }
}

function genericCallback(response){
    if(response.substr(0, 2) == "OK"){
        setStatus(response.substr(3));
        closeOverlay();
        return true;
    }else if(response){
        setStatus(response, true);
        focus('overlayFG');
        return false;
    }else{
        setStatus("Communication error!", true);
        focus('overlayFG');
        return false;
    }
}



// XMLHttpRequest Wrapper
function getHTTPRequest(){
    http_request = false;
    if(window.XMLHttpRequest){      // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
    }else if(window.ActiveXObject){ // IE
        try{
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e){
            try{
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e){}
        }
    }
    return http_request;
}

function doCallback(url, callbackFunction, method){
    if(!method || method.toUpperCase() != 'POST'){
        var method = 'GET';
    }
    method = method.toUpperCase();

    var xmlObj = getHTTPRequest();

    if(!xmlObj){
        setStatus("Ajax is unavailable!", true);
        return false;
    }

    xmlObj.onreadystatechange = function(){
        if(xmlObj.readyState == 4){
            if(xmlObj.status == 200){
                callbackFunction(xmlObj.responseText);
            }else{
                setStatus("Communication error " + xmlObj.status + "!", true);
                return false;
            }
        }
    };

    var request = '';
    if(method == 'POST'){
        url = url.split('?');
        request = url[1];
        url = url[0];
    }

    xmlObj.open(method, url, true);
    if(method == 'POST'){
        xmlObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
    xmlObj.send(request);
    
    return true;
}



// Cookie functions
function createCookie(name, value, days){
    if(days){
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        var expires = "; expires=" + date.toGMTString();
    }else{
        var expires = "";
    }

    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name){
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i = 0; i < ca.length; i++){
        var c = ca[i];
        while(c.charAt(0) == ' '){
            c = c.substring(1, c.length);
        }

        if(c.indexOf(nameEQ) == 0){
            return c.substring(nameEQ.length, c.length);
        }
    }

    return null;
}

function eraseCookie(name){
    createCookie(name, "", -1);
}

function toggleCookie(name, value, days){
    if(readCookie(name)){
        eraseCookie(name);
    }else{
        createCookie(name, value, days);
    }
}



// Get and Set cursor position in text fields
function getCursorPos(field, end){
    var cursorPos = 0;
    
    // IE Support
    if(document.selection){
        field.focus();
        var sel = document.selection.createRange();
        sel.moveStart ('character', -field.value.length);
        cursorPos = sel.text.length;
    }else if(field.selectionStart !== undefined){
    // Firefox support
        cursorPos = !end ? field.selectionStart : field.selectionEnd;
    }

    return cursorPos;
}

function setCursorPos(field, cursorPos, cursorEnd){
    var cursorEnd = cursorEnd || cursorPos;

    // IE Support
    if(document.selection){
        field.focus();
        var sel = document.selection.createRange();
        sel.moveStart('character', -field.value.length);
        sel.moveStart('character', cursorPos);
        sel.moveEnd('character', -field.value.length);
        sel.moveEnd('character', cursorEnd);
        sel.select();
        field.focus();
    }else if(field.selectionStart !== undefined){
    // Firefox support
        field.selectionStart = cursorPos;
        field.selectionEnd = cursorEnd;
        field.focus();
    }
}



// Get the window size and recenter any elements centered absolutely
function getWinSize(){
    if(typeof(window.innerWidth) == 'number'){
        //Non-IE
        winView.width = window.innerWidth;
        winView.height = window.innerHeight;
    }else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)){
        //IE 6+ in 'standards compliant mode'
        winView.width = document.documentElement.clientWidth;
        winView.height = document.documentElement.clientHeight;
    }else if(document.body && (document.body.clientWidth || document.body.clientHeight)){
        //IE 4 compatible
        winView.width = document.body.clientWidth;
        winView.height = document.body.clientHeight;
    }

    for(var i = 0; i < centeredElements.length; i++){
        if(centerElement(centeredElements[i]) === false){
            centeredElements.splice(i, 1);
            i--;
        }
    }
}



/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

var MD5 = function (string){

	function RotateLeft(lValue, iShiftBits){
		return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
	};

	function AddUnsigned(lX,lY){
		var lX4,lY4,lX8,lY8,lResult;
		lX8 = (lX & 0x80000000);
		lY8 = (lY & 0x80000000);
		lX4 = (lX & 0x40000000);
		lY4 = (lY & 0x40000000);
		lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
		if(lX4 & lY4){
			return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
		}
		if(lX4 | lY4){
			if(lResult & 0x40000000){
				return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
			} else {
				return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
			}
		} else {
			return (lResult ^ lX8 ^ lY8);
		}
 	}

 	function F(x,y,z){ return (x & y) | ((~x) & z); }
 	function G(x,y,z){ return (x & z) | (y & (~z)); }
 	function H(x,y,z){ return (x ^ y ^ z); }
	function I(x,y,z){ return (y ^ (x | (~z))); }

	function FF(a,b,c,d,x,s,ac){
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function GG(a,b,c,d,x,s,ac){
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function HH(a,b,c,d,x,s,ac){
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function II(a,b,c,d,x,s,ac){
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function ConvertToWordArray(string){
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1=lMessageLength + 8;
		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
		var lWordArray=Array(lNumberOfWords-1);
		var lBytePosition = 0;
		var lByteCount = 0;
		while ( lByteCount < lMessageLength ){
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
			lByteCount++;
		}
		lWordCount = (lByteCount-(lByteCount % 4))/4;
		lBytePosition = (lByteCount % 4)*8;
		lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
		lWordArray[lNumberOfWords-2] = lMessageLength<<3;
		lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
		return lWordArray;
	};

	function WordToHex(lValue){
		var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
		for(lCount = 0;lCount<=3;lCount++){
			lByte = (lValue>>>(lCount*8)) & 255;
			WordToHexValue_temp = "0" + lByte.toString(16);
			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
		}
		return WordToHexValue;
	};

	function Utf8Encode(string){
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for(var n = 0; n < string.length; n++){

			var c = string.charCodeAt(n);

			if(c < 128){
				utftext += String.fromCharCode(c);
			}else if((c > 127) && (c < 2048)){
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}else{
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	};

	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;

	string = Utf8Encode(string);

	x = ConvertToWordArray(string);

	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

	for(k=0;k<x.length;k+=16){
		AA=a; BB=b; CC=c; DD=d;
		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
		b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
		a=AddUnsigned(a,AA);
		b=AddUnsigned(b,BB);
		c=AddUnsigned(c,CC);
		d=AddUnsigned(d,DD);
	}

	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

	return temp.toLowerCase();
}
