var texts = {
    'FavoriteAdd':      "Add to favorites",
    'FavoriteRemove':   "Remove from favorites",
    'FavoriteDisabled': "Add to favorites",
    
    'Name':             "Name",
    'Category':         "Category",
    'LastReload':       "Last Reloaded",
    
    'NextReload':       "Next reload",
    'DocumentPath':     "Document path",
    'Filesize':         "File size",
//    'HasImage':         "Has Image",
    'OpenWith':         "Open with",
    
    'Plugin':           "IE Plugin",
    'Ajax':             "AJAX zero footprint",
    'Download':         "Download",
    'QlikView':         "QlikView",
    
//    'Yes':              "Yes",
//    'No':               "No"
    
    'LastModified':     "Last Modified",
    'ClearState':       "Remove last document state",
    
    '': ""
};

function CreateOpenDocUrl(id, client) {
    try {
        window.external.AvqInitServer("", function () { });
        return qva.Remote + "?open=&id=" + escape(id) + "&client=" + escape("Plugin");
    } catch (e) {
        return qva.Remote + "?open=&id=" + escape(id) + "&client=" + escape(client);
    }
}

function Set_Favorite(doc, action) { 
    // close clients menu
    hideMenu();
    // action in ["Add", "Remove"]
    qva.Set("AccessPoint.Favorites." + action, "action", doc, true);
}
function Clear_State(doc) {
    // close clients menu
    hideMenu();
    qva.Set("AccessPoint.ClearState", "action", doc, true);
}

function UpdateClientsLinks(id, clients, is_favorite, plugin, ajax, download, favorite, clearstate, target) {
    try {
        window.external.AvqInitServer("", function () { });

        // In QV, Plugin means QV :)
        plugin.className = "Menu_Enabled";
        plugin.href = CreateOpenDocUrl(id, "Plugin");
        plugin.innerText = texts['QlikView'];
        plugin.target = target;

        ajax.className = "Menu_Disabled";
        ajax.href = "#";
        ajax.innerText = "";
        //        ajax.target = target;

        download.className = "Menu_Disabled";
        download.href = "#";
        download.innerText = "";

        favorite.className = "Menu_Disabled";
        favorite.innerText = "";
        favorite.onclick = null;

        clearstate.className = "Menu_Disabled"
        clearstate.innerText = "";
        clearstate.onclick = null;
    } catch (e) {
        var can_use_plugin = pluginEnabled && /Plugin/i.test(clients);
        plugin.className = can_use_plugin ? "Menu_Enabled" : "Menu_Disabled";
        plugin.href = can_use_plugin ? CreateOpenDocUrl(id, "Plugin") : "#";
        plugin.innerText = texts['Plugin'];
        plugin.target = target;

        var can_use_ajax = /Ajax/i.test(clients);
        ajax.className = can_use_ajax ? "Menu_Enabled" : "Menu_Disabled";
        ajax.href = can_use_ajax ? CreateOpenDocUrl(id, "Ajax") : "#";
        ajax.innerText = texts['Ajax'];
        ajax.target = target;

        var can_download = /Download/i.test(clients);
        download.className = can_download ? "Menu_Enabled" : "Menu_Disabled";
        download.href = can_download ? CreateOpenDocUrl(id, "Download") : "#";
        download.innerText = texts['Download'];

        var fav_text = (is_favorite ? "Remove" : "Add");
        favorite.className = is_favorite != null ? "Menu_Enabled" : "Menu_Disabled";
        favorite.innerText = texts[is_favorite == null ? 'FavoriteDisabled' : is_favorite ? 'FavoriteRemove' : 'FavoriteAdd'];
        favorite.onclick = is_favorite == null ? null : function () { Set_Favorite(id, fav_text); }

        clearstate.className = "Menu_Enabled"
        clearstate.innerText = texts['ClearState'];
        clearstate.onclick = function () { Clear_State(id); };
    }
}
var clientsMenu = null;
function hideMenu() {
    if(clientsMenu && clientsMenu.icon && clientsMenu.icon.onclick) { clientsMenu.icon.onclick(); }
}

function chooseClientMenu(event, self) {
    var clients = self.clients;
    var id = self.doc_id;
    var is_favorite = self.is_favorite;
    var target = self.target;
    
    event.cancelBubble = true;
    if (clientsMenu == null) { 
        clientsMenu = document.getElementById("APClientMenu");
    }
    hideMenu();
    
    document.getElementById("Menu_OpenWith").innerText = texts['OpenWith'];
    var plugin = document.getElementById("Menu_Client_Plugin");
    var ajax = document.getElementById("Menu_Client_Ajax");
    var download = document.getElementById("Menu_Download");
    var favorite = document.getElementById("Menu_Favorite");
    var clearstate = document.getElementById("Menu_Clear");
    UpdateClientsLinks(id, clients, is_favorite, plugin, ajax, download, favorite, clearstate, target);
    
    var pos = Qva.GetAbsolutePageCoords(self);
    var X = pos.x + 20 - 170;
    var Y = pos.y + 20;
    clientsMenu.style.left = X + "px";
    clientsMenu.style.top = Y + "px";
    
    clientsMenu.icon = self;
    self.src = "up.png";
    var old_onclick = self.onclick;
    self.onclick = function() {
        clientsMenu.style.display = "none";
        clientsMenu.icon = null;
        self.src = "down.png";
        self.onclick = old_onclick;
    }
    
    clientsMenu.style.display = "";
    return false;
}

Qva.Mgr.aplist = function (owner, elem, name, prefix) {
    if (!Qva.MgrSplit (this, name, prefix)) return;
    owner.AddManager(this);
    this.Element = elem;
}
Qva.Mgr.aplist.prototype.Paint = function(mode, node) {
    hideMenu();

    this.Touched = true;
    var view = node.getAttribute("view");

    var error = node.getAttribute("error");
    if (error) {
        this.Element.innerHTML = '<table class="AP_Error"><tr><td valign="center" align="center"></td></tr></table>';
        var table = this.Element.firstChild
        table.rows[0].cells[0].innerText = error;
        var help = node.getAttribute("help");
        if (help && help == "True") {
            table.rows[0].cells[0].innerHTML += '<br/><a style="font-size:10pt" href="help.htm">Click here for possible solutions</a>';
        }
    } else if (view == "Details") {
        //var startTime = new Date ().valueOf ();
        this.Paint_Details(node);
        //var time = new Date ().valueOf () - startTime;
        //alert ("Time: " + time);
    } else {
        this.Paint_Thumbnails(node);
    }
}
Qva.Mgr.aplist.prototype.Paint_Thumbnails = function(node) {
    //var cols = Math.max(1, Math.min(4, Math.floor(document.body.clientWidth / 220)));
    var cols = 3;
    
    var elems = node.getElementsByTagName("element");
    var pref_client = node.getAttribute("pref_client");
    var target = node.getAttribute("target");
    
    this.Element.innerHTML = '<table cellspacing="10" class="AP_Grid"></table>';
    var grid = this.Element.firstChild.cloneNode(true);
    
    var row = grid.insertRow(-1);
    for(var i = 0; i < elems.length; ++i) {
        var is_favorite = elems[i].getAttribute("favorite") === "true";
        if(elems[i].getAttribute("favorite") === "disabled") is_favorite = null;
        
        var clients = elems[i].getAttribute("clients");
        var can_use_client = (new RegExp(pref_client, "i")).test(clients);
        if(!pluginEnabled && pref_client == "Plugin") can_use_client = false;
        
        var id = elems[i].getAttribute("value");
        var name = elems[i].getAttribute("text") || '';
        var server = elems[i].getAttribute("server") || 'Server';
        var path = elems[i].getAttribute("path") || 'Path';
        var total_path = '//' + server + '/' + path;
        
        if(i > 0 && (i % cols) == 0) { row = grid.insertRow(-1); }
        var cell = row.insertCell(-1);
        cell.width = "25%";
        //cell.valign = "top";
        cell.valign = "center";
        cell.align= "center";
        cell.className = can_use_client ? "Menu_Enabled" : "Menu_Disabled";
        
        cell.innerHTML = '<table class="AP_Doc">' + 
            '<tr><td align="left"><div  class="header"></div></td><td align="right"><img src="down.png" alt="" okclick="..."</td></tr>' + 
            '<tr style="background-color: White;"><td colspan="2" align="center"></td></tr>' + 
            '<tr><td colspan="2" align="center"></td></tr>' + 
            '</table>'
        var table = cell.firstChild;
        table.rows[0].cells[0].firstChild.innerText = name;
        table.rows[0].cells[0].firstChild.title = name;
        
        var img = table.rows[0].cells[1].firstChild;
        img.clients = clients;
        img.doc_id = id;
        img.is_favorite = is_favorite;
        img.target = target;
        img.onclick = function(event) {
            if(!event) event = window.event;
            return chooseClientMenu(event, this)
        }
        
        var x = table.rows[1].cells[0];
        x.innerHTML = '<a href="#"></a>';
        x = x.firstChild;
        if(can_use_client) {
            x.href = CreateOpenDocUrl(id, pref_client);
            x.target = target;
        } else {
            x.onclick = function(event) {
                if(!event) event = window.event;
                var img = this.parentNode.parentNode.parentNode.rows[0].cells[1].firstChild;
                return chooseClientMenu(event, img)
            }
        }
        var imgHash = elems[i].getAttribute("imgHash");
        var imgUrl = imgHash ? this.PageBinder.BuildBinaryUrl(null, imgHash, id) : 'Missing.jpg'
        x.innerHTML = '<img height="108" width="192" />';
        x.firstChild.src = imgUrl;
        x.firstChild.alt = total_path;
        
        var lastUpdate = elems[i].getAttribute("lastUpdate");
        lastUpdate = ToDateTime(lastUpdate, YYYY_MM_DD_HH_mm); // convert form utc to local
        var nextUpdate = elems[i].getAttribute("nextUpdate");
        nextUpdate = ToDateTime(nextUpdate, YYYY_MM_DD_HH_mm); // convert form utc to local
        table.rows[2].cells[0].innerText = lastUpdate + (nextUpdate ? ' / ' + nextUpdate : '');
    }
    for(; 0 < i && i < cols; ++i) {
        cell = row.insertCell(-1);
        cell.width = "25%";
        cell.valign = "top";
        cell.align= "center";
        cell.style.backgroundColor = "Transparent";
    }
    
    this.Element.replaceChild (grid, this.Element.firstChild);
}
//function ExpandCollapse() {
//    var node = this.parentNode.parentNode.nextSibling;
//    var img = this;
//    var d = node.style.display;
//    if(d == 'none') {
//        img.alt = 'collapse';
//        img.src = 'minus.png';
//        node.style.display = '';
//    } else {
//        img.alt = 'expand';
//        img.src = 'plus.png';
//        node.style.display = 'none';
//    }
//}
function ExpandCollapse() {
    var img = this;
    var start_d = this.parentNode.parentNode.depth;
    var row = this.parentNode.parentNode;
    if(img.alt == 'expand') {
        img.alt = 'collapse';
        img.src = 'minus.png';
        
        var expand = [];
        expand[start_d + 1] = true;
        for(var child = row.nextSibling; child && child.depth > start_d; child = child.nextSibling) {
            if(expand[child.depth])
                child.style.display = '';
            var img = child.cells[child.depth].firstChild;
            expand[child.depth + 1] = expand[child.depth] && img && img.alt == 'collapse';
        }
    } else {
        img.alt = 'expand';
        img.src = 'plus.png';
        for(var child = row.nextSibling; child && child.depth > start_d; child = child.nextSibling)
            child.style.display = 'none';
    }
}

Qva.Mgr.aplist.prototype.Paint_Details = function(node) {
    var elems = node.getElementsByTagName("element");
    var pref_client = node.getAttribute("pref_client");
    var target = node.getAttribute("target");
    var max_depth = parseInt(node.getAttribute("max_depth"));
    
    var tableText = '<table class="AP_List"><colgroup>';
    for(var i = 0; i < max_depth + 1; ++i) {
        tableText += '<col width="15px" />';
    }
    tableText += '<col /><col width="180px"/><col width="200px"/></colgroup><tr class="header">'
    tableText += '<td colspan="' + (max_depth + 1) + '"></td>';
    tableText += '<td>Name</td><td>Category</td><td>Last Reloaded</td></tr></table>';
    this.Element.innerHTML = tableText;
    
    var table = this.Element.firstChild.cloneNode(true);
    //var table = this.Element.firstChild;
    table.rows[0].cells[1].innerText = texts['Name'];
    table.rows[0].cells[2].innerText = texts['Category'];
    table.rows[0].cells[3].innerText = texts['LastReload'];
    
    for(var i = 0; i < elems.length; ++i) {
        var name = elems[i].getAttribute("text");
        var depth = parseInt(elems[i].getAttribute("depth"));
        
        // main row
        var row = table.insertRow(-1);
        row.depth = depth;
        row.className = i % 2 == 0 ? "even" : "odd";
        for(var ii = 0; ii < depth; ++ii)
            row.insertCell(-1);
        
        if(elems[i].getAttribute("header") === "true") {
            row.className += " folder";
            
            // expand collapse icon
            var cell = row.insertCell(-1);
            cell.innerHTML = '<img src="minus.png" alt="collapse">';
            cell.firstChild.onclick = ExpandCollapse;
            
            // document (name) link
            cell = row.insertCell(-1);
            cell.innerText = name;
            cell.colSpan = 5 + max_depth - depth;
            
        } else {
            var is_favorite = elems[i].getAttribute("favorite") === "true";
            if(elems[i].getAttribute("favorite") === "disabled") is_favorite = null;
            
            var clients = elems[i].getAttribute("clients");
            var can_use_client = (new RegExp(pref_client, "i")).test(clients);
            if(!pluginEnabled && pref_client == "Plugin") can_use_client = false;
            
            var id = elems[i].getAttribute("value");
            var category = elems[i].getAttribute("category") || '';
            
            // expand collapse icon
            var cell = row.insertCell(-1);
            cell.innerHTML = '<img src="plus.png" alt="expand">';
            cell.firstChild.onclick = ExpandCollapse;
            
            // document (name) link
            cell = row.insertCell(-1);
            cell.colSpan = 1 + max_depth - depth;
            if(can_use_client) {
                cell.innerHTML = '<a href="#"></a>';
                cell = cell.firstChild;
                cell.href = CreateOpenDocUrl(id, pref_client);
                cell.target = target;
            }
            cell.innerText = name;
            // category
            cell = row.insertCell(-1);
            cell.innerText = category;
            // last reloaded
            cell = row.insertCell(-1);
            var lastUpdate = elems[i].getAttribute("lastUpdate");
            lastUpdate = ToDateTime(lastUpdate, YYYY_MM_DD_HH_mm); // convert form utc to local
            cell.innerText = lastUpdate;
            
            // hidden row
            row = table.insertRow(-1);
            row.depth = depth + 1;
            row.className = "details " + (i % 2 == 0 ? "even" : "odd");
            row.style.display = 'none';
            for(var ii = 0; ii < depth + 1; ++ii)
                row.insertCell(-1);
            
            var nextUpdate = elems[i].getAttribute("nextUpdate");
            nextUpdate = ToDateTime(nextUpdate, YYYY_MM_DD_HH_mm); // convert form utc to local
            var server = elems[i].getAttribute("server") || 'Server';
            var path = elems[i].getAttribute("path") || 'Path';
            var hasImg = elems[i].getAttribute("imgHash") ? "Yes" : "No";
            var filesize = elems[i].getAttribute("filesize") || "N/A";
            var lastModified = elems[i].getAttribute("lastModified");
            lastModified = ToDateTime(lastModified, YYYY_MM_DD_HH_mm); // convert form utc to local
            
            var total_path = '//' + server + '/' + path;
            cell = row.insertCell(-1);
            cell.colSpan = 1 + max_depth - depth;
            cell.innerHTML = '<table><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr></table>';

            cell.firstChild.rows[0].cells[0].innerText = texts['NextReload'] + ": " + nextUpdate;
            cell.firstChild.rows[1].cells[0].innerText = texts['DocumentPath'] + ": " + total_path;
            cell.firstChild.rows[2].cells[0].innerText = texts['Filesize'] + ": " + filesize;
            cell.firstChild.rows[3].cells[0].innerText = texts['LastModified'] + ": " + lastModified;
            
            cell = row.insertCell(-1);
            cell.innerHTML = '<span>Open with</span>:<ul><li><a href="#">IE Plugin</a></li><li><a href="#">AJAX zero footprint</a></li></ul>';
            cell.getElementsByTagName('span')[0].innerText = texts['OpenWith'];
            var links = cell.getElementsByTagName('a')
            var plugin = links[0];
            var ajax = links[1];
            
            cell = row.insertCell(-1);
            cell.style.paddingLeft = "10px";
            
//            cell.innerHTML = '<table><tr><td></td></tr><tr><td>&nbsp;</td></tr><tr><td></td></tr><tr><td>&nbsp;</td></tr><tr><td></td></tr></table>';
//            cell.firstChild.rows[0].cells[0].innerHTML = '<a href="#">Download</a>';
//            var download = cell.firstChild.rows[0].cells[0].firstChild;
//            cell.firstChild.rows[2].cells[0].innerHTML = '<a href="#"></a>';
//            var favorite = cell.firstChild.rows[2].cells[0].firstChild;
//            cell.firstChild.rows[4].cells[0].innerHTML = '<a href="#"></a>';
//            var clearstate = cell.firstChild.rows[4].cells[0].firstChild;

            cell.innerHTML = '<table><tr><td></td></tr><tr><td></td></tr><tr><td></td></tr></table>';
            cell.firstChild.rows[0].cells[0].innerHTML = '<a href="#">Download</a>';
            var download = cell.firstChild.rows[0].cells[0].firstChild;
            cell.firstChild.rows[1].cells[0].innerHTML = '<a href="#"></a>';
            var favorite = cell.firstChild.rows[1].cells[0].firstChild;
            cell.firstChild.rows[2].cells[0].innerHTML = '<a href="#"></a>';
            var clearstate = cell.firstChild.rows[2].cells[0].firstChild;
            UpdateClientsLinks(id, clients, is_favorite, plugin, ajax, download, favorite, clearstate, target);
        }
    }
    
    this.Element.replaceChild (table, this.Element.firstChild);
}

function ToInt(str) {
    if(!str) return null;
    while(str.length > 1 && str.charAt(0) === "0") str = str.substr(1);
    return parseInt(str);
}
function ToDateTime(str, format) {
    var re = /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/;
    var r = re.exec(str);
    if(r) {
        var year = ToInt(r[1]);
        var month = ToInt(r[2]);
        var date = ToInt(r[3]);
        var hours = ToInt(r[4]);
        var minutes = ToInt(r[5]);
        var seconds = ToInt(r[6]);
        var d = new Date(Date.UTC(year, month - 1, date, hours, minutes, seconds));
        if(format) {
            return format(d);
        } else {
            return d.toLocaleString();
        }
    } else {
        return str;
    }
}
function PadNumStr(num, length) {
    num = ("" + num);
    while(num.length < length) {
        num = "0" + num;
    }
    return num;
}
function YYYY_MM_DD_HH_mm(d) {
    return PadNumStr(d.getFullYear(), 4) + "-" + PadNumStr(d.getMonth() + 1, 2) + "-" + PadNumStr(d.getDate(), 2) + " " + 
            PadNumStr(d.getHours(), 2) + ":" + PadNumStr(d.getMinutes(), 2);
}

Qva.Mgr.utcdate = function (owner, elem, name, prefix) {
    if (!Qva.MgrSplit (this, name, prefix)) return;
    owner.AddManager(this);
    this.Element = elem;
}
Qva.Mgr.utcdate.prototype.Paint = function(mode, node) {
    this.Touched = true;
    var element = this.Element;

    var text = node.getAttribute ('text');
    element.innerText = ToDateTime(text);
    element.style.display = Qva.MgrGetDisplayFromMode (this, mode);
}

Qva.Mgr.hrefaction = function (owner, elem, name, prefix) {
    if (!Qva.MgrSplit (this, name, prefix)) return;
    owner.AddManager(this);
    this.Element = elem;
    elem.Action = this.Name;
    elem.binderid = owner.ID;
}
Qva.Mgr.hrefaction.prototype.Paint = function(mode, node) {
    this.Touched = true;
    var element = this.Element;
    var val = node.getAttribute('value');
    if(val) {
        element.onclick = null;
        element.href = val;
    } else {
        element.onclick = onclick_action;
        element.href = "#";
    }
    element.style.display = Qva.MgrGetDisplayFromMode (this, mode);
}

function escapeHTML(str) {
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);
   return div.innerHTML;
}
Qva.Mgr.pages = function (owner, elem, name, prefix) {
    if (!Qva.MgrSplit (this, name, prefix)) return;
    owner.AddManager(this);
    this.Element = elem;
}

Qva.Mgr.pages.prototype.Paint = function(mode, node) {
    this.Touched = true;
    var element = this.Element;

    element.style.display = Qva.MgrGetDisplayFromMode (this, mode);
    if(element.style.display != 'none') {
        var current = parseInt(node.getAttribute('current'));
        var min = parseInt(node.getAttribute('min'));
        var max = parseInt(node.getAttribute('max'));
        
        var first    = node.getAttribute('first');
        var previous = node.getAttribute('previous');
        var next     = node.getAttribute('next');
        var last     = node.getAttribute('last');
        
        var text = node.getAttribute('text');
        
        function link(page, text) {
            if(page < 0 || page > max) {
                return '<a>' + text + '</a>';
            } else {
                var f = "qva.Set('AccessPoint.Pages.Current', 'value', '" + page + "', true)";
                return '<a href="#" onclick="' + f + '">' + text + '</a>';
            }
        }
        
        var html = '<span>' + escapeHTML(text) + '</span>&nbsp;&nbsp;&nbsp;';
        if(true /* has prev */) html += '&nbsp;' + link(current - 1, escapeHTML(previous));
        for(var i = 0; i <= max; ++i) {
            if(i == current) {
                html += '&nbsp;' + (i + 1);
            } else {
                html += '&nbsp;' + link(i, (i + 1));
            }
        }
        if(true /* has next */) html += '&nbsp;<a ' + link(current + 1, escapeHTML(next));
        element.innerHTML = html;
    }
}

var pluginEnabled;
function CheckPlugin() {
    pluginEnabled = false
    try {
        if(ActiveXObject) {
            var _ = new ActiveXObject("QlikTech.QlikOcxCtrl");
            pluginEnabled = true;
        }
    } catch(e) {
    }
}

Qva.LabelClick = false;
var qva = new Qva.PageBinding();
qva.Ident = "AccessPoint";
qva.Kind = "AccessPoint";
qva.Remote = "/QvAJAXZfc/AccessPoint.aspx";
new Qva.Scanner(qva);
qva.AddManager({
    'Name': "AccessPoint.Refresh",
    'Paint': function () { qva.Refresh(); }
});
qva.AddManager({
    'Name': "AccessPoint.Redirect",
    'Paint': function (mode, node) { 
        //document.location = node.getAttribute('value');
        document.getElementById("LoginFrame").src = node.getAttribute('value');
    }
});

qva.AddManager({
    'Name': "AccessPoint.Text",
    'Paint': function (mode, node) { texts[node.getAttribute('value')] = node.getAttribute('text'); }
});

qva.Set("AccessPoint.Update", "action", "", false);

