///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2000-2017 Ericsson Telecom AB                               //
//                                                                           //
// All rights reserved. This program and the accompanying materials          //
// are made available under the terms of the Eclipse Public License v2.0     //
// which accompanies this distribution, and is available at                  //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
///////////////////////////////////////////////////////////////////////////////
function FileHandler() {

    ////////////////////////// MOCK OF FILE OPERATIONS //////////////////////////

    var fileCache = {};

    // The existing directories and files, this must be updated when there is a change
    var contentOnDisc = [
        REPLACETHIS
    ];

    /**
        Since saving is not allowed by the browsers, we use a hashmap with the ulrs as keys
     */
    this.putFile = function (url, data, callback) {
        fileCache[url] = data;
        callback(true, data);
    };

    /**
        A function to remove duplicate items from a list
     */
    function uniq(list) {
        var seen = {};
        return list.filter(function (item) {
            return seen.hasOwnProperty(item) ? false : (seen[item] = true);
        });
    }

    /**
        Since there is no list dir command in a local browser, we have to return contentOnDisc from a predefined list
     */
    this.getDirectory = function (url, callback) {
        var contentList = [];

        if (url != "/" && url.startsWith("/")) {
            url = url.substr(1);
        }
        
        // find the contentOnDisc in the directory
        for (var i = 0; i < contentOnDisc.length; ++i) {
            if (contentOnDisc[i].substr(0, url.length) == url && contentOnDisc[i].length != url.length) {
                var index = contentOnDisc[i].indexOf("/", url.length + 1);
                if (index != -1) {
                    contentList.push(contentOnDisc[i].substring(0, index));
                } else {
                    contentList.push(contentOnDisc[i]);
                }
            }
            
            if (url == "/" && contentOnDisc[i].indexOf("/") == -1) {
                contentList.push(contentOnDisc[i]);
            }
        }
        
        // find the fileCache in the directory
        for (var key in fileCache) {
            if (fileCache.hasOwnProperty(key) && key.substr(0, url.length) == url) {
                var index = key.indexOf("/", url.length + 1);
                if (index != -1) {
                    contentList.push(key.substring(0, index));
                } else {
                    contentList.push(key);
                }
            }
        }
        
        var fileList = [];
        var listOfNames = uniq(contentList);
        for (var i = 0; i < listOfNames.length; ++i) {
            var contentType;
            if (listOfNames[i].indexOf('.') == -1) {
                contentType = "-d"
            } else {
                contentType = "-f"
            }
            fileList.push({
                "contentType" : contentType,
                "fileName" : listOfNames[i],
                "size" : 0,
                "timeStamp" : 0
            });
        }
        
        callback(fileList);
    };

    this.createDirectory = function (url, callback) {
        if (contentOnDisc.indexOf(url) == -1) {
            contentOnDisc.push(url);
        }
        callback(true);
    };

    this.delDirectory = function (url, callback) {
        var i = 0;
        while (i < contentOnDisc.length) {
            if (contentOnDisc[i].substr(0, url.length) == url) {
                contentOnDisc.splice(i, 1);
            } else {
                ++i;
            }
        }

        var todelete = [];
        for (var key in fileCache) {
            if (fileCache.hasOwnProperty(key) && key.substr(0, url.length) == url) {
                todelete.push(key);
            }
        }

        for (var j = 0; j < todelete.length; ++j) {
            delete fileCache[todelete[j]];
        }

        callback(true);
    };

    this.loadFile = function (url, callback) {

        if (fileCache.hasOwnProperty(url)) {
            callback(true, fileCache[url]);
            return;
        }

        function success(data, textStatus, jqXHR) {
            callback(true, data);
        }

        function error(data, textStatus, jqXHR) {
            callback(false, "Loading: " + textStatus + " " + jqXHR);
        }

        return $.ajax({
            url : url,
            type : 'GET',
            success : success,
            error : error,
            dataType : "text",
            data : "",
            async : false
        });
    };

    this.importJsFile = function (file, p_callback) {
        var v_callback = p_callback;
        function success(data, textStatus, jqXHR) {
            v_callback(true);
        }

        function error(data, textStatus, jqXHR) {
            v_callback(false, "Loading: " + textStatus + " " + jqXHR + " " + file);
        }

        $.ajax({
            url : file,
            dataType : "script",
            success : success,
            error : error,
            async : false
        });
    };    
    
    
    this.loadCss = function(hmtlContentId, cssFile, callback) {
        $("#" + hmtlContentId).load(cssFile, callback);
    };
    
    this.loadCssFiles = function(cssFiles, id) {
        for (var i = 0; i < cssFiles.length; ++i) {
            // html ids should not contain / and . so we replace them with _
            var cssId = cssFiles[i].replace(/[\/\.]/gi, "_");
            $("#" + id).prepend('<style id="' + cssId + '" type="text/css"></style>');
            this.loadCss(cssId, cssFiles[i]);
        }
    };
}