var myFiles = [];
var myLinks = [];
var myFolders = [];
var serverUrl = "";
var startTime;
var endTime;
var loginStartTimel
var loginEndTime;

function Share(_email, _password, _remember_me, _url) {
    this.remember_me = _remember_me;
    this.email = _email;
    this.password = _password;
    this.serverUrl = _url;
    this.sessionId = null;
    this.secret = null;
    this.name = null;
    this.home = null;
    this.files = new Array();
    this.links = new Array();
    this.folders = new Array();
}

Share.prototype.email;
Share.prototype.password;
Share.prototype.serverUrl;
Share.prototype.sessionId;
Share.prototype.secret;
Share.prototype.name;
Share.prototype.home;
Share.prototype.files;
Share.prototype.folders;
Share.prototype.links;

Share.prototype.signIn = function () {
    loginStartTime=new Date().getTime();
    var request = new XMLHttpRequest();
    request.share = this;
    request.open("POST", this.serverUrl+"share-login.cgi", true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Accept", "application/xml");
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            if (request.status == 200) {
                if (request.responseXML) {
                    var x=request.responseXML.documentElement.childNodes;
                    var sessionid = x[0].childNodes[0].nodeValue;
                    var secret = x[1].childNodes[0].nodeValue;
                    var name = x[2].childNodes[0].nodeValue;
                    request.share.signInCallback(sessionid, secret, name);
                }
            } else {
                document.getElementById("loginError").innerHTML = "Invalid email / password";
                var stackLayout = document.getElementById('stackLayout').object;
                stackLayout.setCurrentView('loginPage');    
            }
        }
    };
    request.send("email=" + this.email + "&password=" + this.password + "&rememberme=" + this.remember_me);
    document.getElementById("lowLevelStatusText").innerText = "Starting session...";
}

Share.prototype.signInCallback = function(_sessionid, _secret, _name) {
    this.sessionId = _sessionid;
    this.secret = _secret;
    this.name = _name;
    currentUser.name = _name;
    updateUserInDatabase();
    setStatus("Welcome back " + this.name);
    loginEndTime=new Date().getTime();
    var et = loginEndTime - loginStartTime;
    document.getElementById("loginElapsedTime").innerHTML = et + " ms to login.";
    this.getMyFilesList();
}

Share.prototype.getMyFilesList = function() {
    startTime=new Date().getTime();

    var request = new XMLHttpRequest();
    this.files = new Array();
    this.links = new Array();
    this.folders = new Array();
    request.share = this;
    request.open("POST", this.serverUrl + "share-files-list.cgi", true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Accept", "application/xml");
    request.onreadystatechange = function() {
        if (request.status == 200) {
            if (request.responseXML) {
                request.share.getMyFilesListCallback(request.responseXML);
            }
        } else {
            alert("error: " + request.status);
        }
    };
    request.send("sessionid=" + this.sessionId + "&secret=" + this.secret);
    document.getElementById("lowLevelStatusText").innerText = "Getting list of files...";
}

Share.prototype.getMyFilesListCallback = function(xml) {
    document.getElementById("lowLevelStatusText").innerText = "Got the list of files. Processing the list...";
    var x = xml.documentElement.childNodes;
    var homeNode = new ShareNode(x[0]);
    var children = x[1].childNodes;
    var adobeDocs = 0;
    var prefix = "";
    for (var i = 0; i < children.length; i++) { 
        var node = new ShareNode(children[i]);
        if (node.directory) {
            var f = new Array();
            node.thumbnailUrl = this.get_doc_request_url(node.nodeId,"thumbnail");
            var html = "<img src='" + node.thumbnailUrl + "' height='30'>" + node.name;
            f[0]= html;
            f[1] = node;
            this.folders.push(f);
        } else if (node.link) {
            var f = new Array();
            node.thumbnailUrl = this.get_doc_request_url(node.nodeId,"thumbnail");
            var html = "<img src='" + node.thumbnailUrl + "' height='30'>" + node.name;
            f[0]= html;
            f[1] = node;
            this.links.push(f);
        } else {
            var f = new Array();
            node.thumbnailUrl = this.get_doc_request_url(node.nodeId,"thumbnail");
            var html = "<img src='" + node.thumbnailUrl + "' height='30'>" + node.name;
            f[0]= html;
            f[1] = node;
            if (node.adobeDoc) adobeDocs++;
            this.files.push(f);
        }
    }
    myFiles = this.files.sort(sortNodes);
    myLinks = this.links.sort(sortNodes);
    myFolders = this.folders.sort(sortNodes);
    setStatus("Files for: " + this.name);  
    document.getElementById("activityIndicator").style.visibility = "hidden";
    var stackLayout = document.getElementById('stackLayout').object;
    stackLayout.setCurrentView('myOrganizer');
    document.getElementById("summary").innerHTML = "<b>" + this.name + "</b><br/><FONT SIZE='-4'> " + myFiles.length + " Files (" + adobeDocs + " Adobe Docs), " + myLinks.length + " Links, " + myFolders.length + " Folders.</font>";
    
    endTime=new Date().getTime();
    var et = endTime - startTime;
    document.getElementById("elapsedTime").innerHTML = et + " ms to get the list of files.";
    document.getElementById("stats").innerHTML = myFiles.length + " Files (" + adobeDocs + " Adobe Docs), " + myLinks.length + " Links, " + myFolders.length + " Folders.";
}

function sortNodes(node1, node2) {
    var name1 = node1[1].name.toUpperCase();
    var name2 = node2[1].name.toUpperCase();
    if (name1 > name2) return 1;
    else if (name1 < name2) return -1;
    else return 1;
}

Share.prototype.get_doc_request_url = function (_docid, _rendition, _name) {
    return this.serverUrl+"share-get-file.cgi" 
        + "?sessionid=" + this.sessionId + "&secret=" + this.secret 
        + "&docid=" + _docid + "&rendition=" + _rendition + "&name=" + _name;
}

Share.prototype.get_delete_url = function (_docid) {
    return this.serverUrl+"share-delete-file.cgi" 
        + "?sessionid=" + this.sessionId + "&secret=" + this.secret 
        + "&docid=" + _docid;
}

Share.prototype.delete_doc = function(_doc, _part_of_multi_delete) {
    var request = new XMLHttpRequest();
    request.share = this;
    request.open("POST", this.serverUrl + "share-delete-file.cgi", true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Accept", "application/xml");
    request.onreadystatechange = function() {
        if (request.status == 200) {
            if (request.responseXML) {
                request.share.deleteFileCallback(request.responseXML, _doc, _part_of_multi_delete);
            }
        } else {
            alert("error: " + request.responseText);
        }
    };
    request.send("sessionid=" + this.sessionId + "&secret=" + this.secret + "&docid=" + _doc.nodeId);
    document.getElementById("activityIndicator").style.visibility = "visible";
    document.getElementById("lowLevelStatusText").innerText = "Deleting document...";
}

Share.prototype.deleteFileCallback = function(xml, _doc, _part_of_multi_delete) {
    var x = xml.documentElement.getAttribute("status");
    _part_of_multi_delete = (typeof _part_of_multi_delete == "undefined") ? false : _part_of_multi_delete;
    if (x == "ok") {
        if (_part_of_multi_delete) {
            document.getElementById("lowLevelStatusText").innerText = "File [" + _doc.name + "] was successfully deleted.";
        } else {
            setStatus("Updating list of files... ");
            this.getMyFilesList();
        }
    } else {
        document.getElementById("lowLevelStatusText").innerText = "Failed to delete file [" + _doc.name + "], reason: ";
        if (!_part_of_multi_delete) {
            setStatus("Updating list of files... ");
            this.getMyFilesList();
        }
    }
}

Share.prototype.rename_doc = function(_docid, _newname) {
    var request = new XMLHttpRequest();
    request.share = this;
    request.open("POST", this.serverUrl + "share-rename-file.cgi", true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Accept", "application/xml");
    request.onreadystatechange = function() {
        if (request.status == 200) {
            if (request.responseXML) {
                request.share.renameFileCallback(request.responseXML);
            }
        } else {
            alert("error: " + request.responseText);
        }
    };
    request.send("sessionid=" + this.sessionId + "&secret=" + this.secret + "&docid=" + _docid + "&newname=" + escape(_newname));
    document.getElementById("activityIndicator").style.visibility = "visible";
    document.getElementById("lowLevelStatusText").innerText = "Renaming document...";
}

Share.prototype.renameFileCallback = function(xml) {
    var x = xml.documentElement.getAttribute("status");
    if (x == "ok") {
        setStatus("Updating list of files... ");
        this.files = new Array();
        this.links = new Array();
        this.folders = new Array();
        this.getMyFilesList();
    } else {
        setStatus("Updating list of files... ");
        this.files = new Array();
        this.links = new Array();
        this.folders = new Array();
        this.getMyFilesList();
        alert("Unable to rename document: " + x);
    }
}

Share.prototype.add_share = function(_docid, _level, _message, _email) {
    var request = new XMLHttpRequest();
    request.share = this;
    request.open("POST", this.serverUrl + "share-add-share.cgi", true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.setRequestHeader("Accept", "application/xml");
    request.onreadystatechange = function() {
        if (request.status == 200) {
            if (request.responseXML) {
                request.share.addShareCallback(request.responseXML);
            }
        } else {
            alert("error: " + request.responseText);
        }
    };
    request.send("sessionid=" + this.sessionId + "&secret=" + this.secret + "&docid=" + _docid + "&email=" + escape(_email) + "&level=" + _level + "&message=" + escape(_message));
    document.getElementById("activityIndicator").style.visibility = "visible";
    document.getElementById("lowLevelStatusText").innerText = "Sharing document...";
}

Share.prototype.addShareCallback = function(xml) {
    var x = xml.documentElement.getAttribute("status");
    if (x == "ok") {
        setStatus("Updating list of files... ");
        this.files = new Array();
        this.links = new Array();
        this.folders = new Array();
        this.getMyFilesList();
    } else {
        setStatus("Updating list of files... ");
        this.files = new Array();
        this.links = new Array();
        this.folders = new Array();
        this.getMyFilesList();
        alert("Unable to share the document: " + x);
    }
}


