﻿var FileBrowser = function(id) {
    this.ID = id;
    this.URL = "/Global/filebrowser/process.aspx";
    this.Timer = "";
    var self = this;

    this.AJAXCall = function(callBack, postData) {
        //setup the callback
        var out = callBack;
        if (!out) {
            out = function(text) { return; }
        }

        if (!postData) {
            postData = "";
        }

        //setup the request
        var request = null;
        if (window.XMLHttpRequest) {
            request = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            request = new ActiveXObject("Microsoft.XMLHTTP");
        }
        else {
            return false;
        }

        //true for async..
        request.open("POST", self.URL, true);

        //setup the handle of the request when the status changes
        request.onreadystatechange = function() {
            if (request.readyState == 4) {
                switch (request.status) {
                    case 200:
                        out(request.responseText);
                        break;
                    case 404:
                        out("Access denied.");
                        break;
                    case 404:
                        out("Requested URL was not found.");
                        break;
                    default:
                        out("Error: Status Code " + request.status);
                        break;
                }
            }
        }
        //setup the request headers
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

        //send the request
        request.send(postData);
    };

    this.GetX = function(obj) {
        var curleft = 0;
        if (obj.offsetParent) {
            while (obj.offsetParent) {
                curleft += obj.offsetLeft
                obj = obj.offsetParent;
            }
        }
        else if (obj.x)
            curleft += obj.x;
        return curleft;
    };

    this.GetFile = function(file) {
        self.CloseUploadBox();
        window.location = self.URL + "?id=" + escape(self.ID) + "&file=" + escape(file);
    };

    this.Load = function(dir) {

        self.CloseUploadBox();

        if (dir == null) {
            dir = "";
        }
        else {
            dir = "&dir=" + escape(dir);
        }

        var fileDiv = document.getElementById(id + "_Files");
        var pathDiv = document.getElementById(id + "_Path");

        if (!fileDiv || !pathDiv) {
            return;
        }

        fileDiv.innerHTML = "Loading...";

        var done1 = function(info1) {
            pathDiv.innerHTML = info1;
        }
        var done2 = function(info2) {
            fileDiv.innerHTML = info2;
        }

        self.AJAXCall(done1, "a=0&id=" + escape(self.ID) + dir);
        self.AJAXCall(done2, "a=1&id=" + escape(self.ID) + dir);
    };

    this.ShowUploadBox = function() {
        var div = document.getElementById(self.ID + "_FileUploadBox");
        var link = document.getElementById(self.ID + "_FileUploadLink");
        var frame = document.getElementById(self.ID + "_FileUploadFrame");

        if (!div || !link || !frame) {
            return;
        }
        if (div.style.visibility == "visible") {
            self.CloseUploadBox();
        }
        else {
            div.style.left = self.GetX(link) - div.offsetWidth - 2 + "px";
            div.style.visibility = "visible";
            frame.src = "/Global/filebrowser/upload.aspx?id=" + self.ID;
            link.innerHTML = "<img src='/Global/filebrowser/images/cancel.gif' alt='' style='border:none;' />";
            link.title = "Cancel Upload";
        }
        link.blur();

        self.Timer = window.setInterval(function() {
            try {
                var text = frame.contentWindow.document.body.innerHTML;
            }
            catch (e) {
                if (div.style.visibility == "visible") {
                    window.clearInterval(self.Timer);
                    self.Timer = "";
                    self.CloseUploadBox();
                    alert("Error Uploading.\n\nThe file may have been too large.");
                }
            }
        }, 500);
    };

    this.CloseUploadBox = function() {
        var div = document.getElementById(self.ID + "_FileUploadBox");
        var link = document.getElementById(self.ID + "_FileUploadLink");
        if (!div || !link) {
            return;
        }
        if (div.style.visibility == "visible") {
            div.style.visibility = "hidden";
            link.innerHTML = "<img src='/Global/filebrowser/images/disk.gif' alt='' style='border:none;' />";
            link.title = "Upload File";
        }
    };

    this.NewFolder = function() {
        self.CloseUploadBox();
        var newf = prompt("Create New Folder", "New Folder", "Create New Folder");
        if (newf == null || newf == "") {
            return;
        }

        var t = "/\\:*?\"<>+";

        for (var i = 0; i < t.length; i++) {
            if (newf.indexOf(t.charAt(i)) >= 0) {
                alert("Invalid folder name.\n\n" + t + " can't be in a folder name.");
                return;
            }
        }

        var done = function(txt) {
            if (txt.indexOf("Error: ") == 0) {
                alert(txt);
            }
            else {
                self.Load();
            }
        }
        self.AJAXCall(done, "a=2&id=" + escape(self.ID) + "&name=" + escape(newf));
    };

    this.DeleteFile = function(file) {
        self.CloseUploadBox();
        if (!confirm("Are you sure you want to delete \"" + file + "\"?\n\n" +
            "This action can't be un-done.\n\nDelete file?")) {
            return;
        }

        var done = function(txt) {
            if (txt.indexOf("Error: ") == 0) {
                alert(txt);
            }
            else {
                self.Load();
            }
        }

        self.AJAXCall(done, "a=5&id=" + escape(self.ID) + "&file=" + escape(file));
    };

    this.DeleteFolder = function(folder) {
        self.CloseUploadBox();
        if (!confirm("Are you sure you want to delete \"" + folder + "\"?\n\n" +
            "This action can't be un-done.\n\nDelete folder?")) {
            return;
        }

        var done = function(txt) {
            if (txt.indexOf("Error: ") == 0) {
                alert(txt);
            }
            else {
                self.Load();
            }
        }

        self.AJAXCall(done, "a=6&id=" + escape(self.ID) + "&folder=" + escape(folder));
    };

    this.RenameFile = function(file) {
        self.CloseUploadBox();
        var ext = "";
        if (file.lastIndexOf('.') >= 0) {
            ext = file.substring(file.lastIndexOf('.'));
            file = file.substring(0, file.lastIndexOf('.'));
        }
        var newf = prompt("Rename \"" + file + ext + "\":", file, "Rename File");
        if (newf == null || newf == "") {
            return;
        }

        var t = "/\\:*?\"<>+";

        for (var i = 0; i < t.length; i++) {
            if (newf.indexOf(t.charAt(i)) >= 0) {
                alert("Invalid file name.\n\n" + t + " can't be in a file name.");
                self.RenameFile(file + ext);
                return;
            }
        }

        if (!confirm("This will rename \"" + file + ext + "\" to \"" + newf + ext + "\"\n\nContinue?")) {
            return;
        }

        var done = function(txt) {
            if (txt.indexOf("Error: ") == 0) {
                alert(txt);
            }
            else {
                self.Load();
            }
        }
        self.AJAXCall(done, "a=3&id=" + escape(self.ID) + "&oldFile=" + escape(file + ext) + "&newFile=" + escape(newf + ext));
    };

    this.RenameFolder = function(folder) {
        self.CloseUploadBox();
        var newf = prompt("Rename \"" + folder + "\":", folder, "Rename Folder");
        if (newf == null || newf == "") {
            return;
        }

        var t = "/\\:*?\"<>+";

        for (var i = 0; i < t.length; i++) {
            if (newf.indexOf(t.charAt(i)) >= 0) {
                alert("Invalid folder name.\n\n" + t + " can't be in a folder name.");
                self.RenameFolder(folder);
                return;
            }
        }

        if (!confirm("This will rename \"" + folder + "\" to \"" + newf + "\"\n\nContinue?")) {
            return;
        }

        var done = function(txt) {
            if (txt.indexOf("Error: ") == 0) {
                alert(txt);
            }
            else {
                self.Load();
            }
        }
        self.AJAXCall(done, "a=4&id=" + escape(self.ID) + "&oldFolder=" + escape(folder) + "&newFolder=" + escape(newf));
    };

    this.LinkHover = function(link) {
        link.style.backgroundColor = "#ededed";
        var inputs = link.getElementsByTagName("INPUT");
        for (var i = 0; i < inputs.length; i++) {
            inputs[i].style.display = "block";
        }
    };

    this.LinkOut = function(link) {
        link.style.backgroundColor = "";
        var inputs = link.getElementsByTagName("INPUT");
        for (var i = 0; i < inputs.length; i++) {
            inputs[i].style.display = "none";
        }
    }
}