var abstractFileManager = function() { };

abstractFileManager.prototype.getPath = function (filename) {

var j = filename.lastIndexOf('?');
if (j > 0) {
    filename = filename.slice(0, j);
}
j = filename.lastIndexOf('/');
if (j < 0) {
    j = filename.lastIndexOf('\\');
}
if (j < 0) {
    return "";
}
return filename.slice(0, j + 1);

};

abstractFileManager.prototype.tryAppendExtension = function(path, ext) {

return /(\.[a-z]*$)|([\?;].*)$/.test(path) ? path : path + ext;

};

abstractFileManager.prototype.tryAppendLessExtension = function(path) {

return this.tryAppendExtension(path, '.less');

};

abstractFileManager.prototype.supportsSync = function() {

return false;

};

abstractFileManager.prototype.alwaysMakePathsAbsolute = function() {

return false;

};

abstractFileManager.prototype.isPathAbsolute = function(filename) {

return (/^(?:[a-z-]+:|\/|\\|#)/i).test(filename);

};

abstractFileManager.prototype.join = function(basePath, laterPath) {

if (!basePath) {
    return laterPath;
}
return basePath + laterPath;

}; abstractFileManager.prototype.pathDiff = function pathDiff(url, baseUrl) {

// diff between two paths to create a relative path

var urlParts = this.extractUrlParts(url),
    baseUrlParts = this.extractUrlParts(baseUrl),
    i, max, urlDirectories, baseUrlDirectories, diff = "";
if (urlParts.hostPart !== baseUrlParts.hostPart) {
    return "";
}
max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);
for (i = 0; i < max; i++) {
    if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }
}
baseUrlDirectories = baseUrlParts.directories.slice(i);
urlDirectories = urlParts.directories.slice(i);
for (i = 0; i < baseUrlDirectories.length - 1; i++) {
    diff += "../";
}
for (i = 0; i < urlDirectories.length - 1; i++) {
    diff += urlDirectories[i] + "/";
}
return diff;

}; // helper function, not part of API abstractFileManager.prototype.extractUrlParts = function extractUrlParts(url, baseUrl) {

// urlParts[1] = protocol&hostname || /
// urlParts[2] = / if path relative to host base
// urlParts[3] = directories
// urlParts[4] = filename
// urlParts[5] = parameters

var urlPartsRegex = /^((?:[a-z-]+:)?\/+?(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i,
    urlParts = url.match(urlPartsRegex),
    returner = {}, directories = [], i, baseUrlParts;

if (!urlParts) {
    throw new Error("Could not parse sheet href - '" + url + "'");
}

// Stylesheets in IE don't always return the full path
if (baseUrl && (!urlParts[1] || urlParts[2])) {
    baseUrlParts = baseUrl.match(urlPartsRegex);
    if (!baseUrlParts) {
        throw new Error("Could not parse page url - '" + baseUrl + "'");
    }
    urlParts[1] = urlParts[1] || baseUrlParts[1] || "";
    if (!urlParts[2]) {
        urlParts[3] = baseUrlParts[3] + urlParts[3];
    }
}

if (urlParts[3]) {
    directories = urlParts[3].replace(/\\/g, "/").split("/");

    // extract out . before .. so .. doesn't absorb a non-directory
    for (i = 0; i < directories.length; i++) {
        if (directories[i] === ".") {
            directories.splice(i, 1);
            i -= 1;
        }
    }

    for (i = 0; i < directories.length; i++) {
        if (directories[i] === ".." && i > 0) {
            directories.splice(i - 1, 2);
            i -= 2;
        }
    }
}

returner.hostPart = urlParts[1];
returner.directories = directories;
returner.path = (urlParts[1] || "") + directories.join("/");
returner.fileUrl = returner.path + (urlParts[4] || "");
returner.url = returner.fileUrl + (urlParts[5] || "");
return returner;

};

module.exports = abstractFileManager;