require("content-policy.js");
require("favicon");

theme_load_paths.push("/home/slash/.conkerorrc/themes/");

define_browser_object_class(
    "history-url", null,
    function (I, prompt) {
        check_buffer(I.buffer, content_buffer);
        var result = yield I.buffer.window.minibuffer.read_url(
            $prompt = prompt, $use_webjumps = false, $use_history = true,
            $use_bookmarks = false, $sort_order = 'date_descending'
        );
        yield co_return(result);
    }
);

function oni_before_quit_func() {
    var w = get_recent_conkeror_window();
    var result = (w == null) ||
            "y" == (yield w.minibuffer.read_single_character_option(
                $prompt="Quit Conkeror? (y/n)",
                $options=["y", "n"]));
    yield co_return(result);
}

function oni_block_flash(content_type, content_location) {
    var Y = content_policy_accept, N = content_policy_reject;
    var action = ({ "youtube.com": Y }
                  [content_location.host] || N);

    if (action == N)
        dumpln("blocked flash: " + content_location.spec);

    return action;
}

function oni_escape(str) {
    return str.replace(/(["$`])/g, '\\$1');
}

function oni_linkwave_add(I) {
    check_buffer(I.buffer, content_buffer);
    let url =
            load_spec_uri_string(load_spec(I.buffer.top_frame));
    let title = escape(yield I.minibuffer.read(
        $prompt = "name (required): ",
        $initial_value = I.buffer.title));
    let tags = escape(yield I.minibuffer.read(
        $prompt = "tags (space delimited): "));
    let description = escape(yield I.minibuffer.read(
        $prompt = "extended description: "));
    let command =
            '/home/slash/development/projects/linkwave/src/linkwave "'
            + url + '" "' + title + '" "' + description + '"';
    I.window.minibuffer.message(command);
}
interactive("linkwave-add", "Bookmark the page in linkwave",
            oni_linkwave_add);

function oni_linkwave_add_link(I) {
    bo = yield read_browser_object(I);
    let url = load_spec_uri_string(
        load_spec(encodeURIComponent(bo)));
    check_buffer(I.buffer, content_buffer);
    let title = escape(yield I.minibuffer.read(
        $prompt = "name (required): ",
        $initial_value = bo.textContent));
    let tags = escape(yield I.minibuffer.read(
        $prompt = "tags (space delimited): "));
    let description = escape(yield I.minibuffer.read(
        $prompt = "extended description: "));
    let command =
            '/home/slash/development/projects/linkwave/src/linkwave "'
            + url + '" "' + title + '" "' + description + '"';
    let result = yield shell_command(command);

    if (!result)
        I.window.minibuffer.message('Added to linkwave');
    else
        I.window.minibuffer.message('Couldn\'t add to linkwave');
}
interactive("linkwave-add-link", "Bookmark the a link in linkwave",
            oni_linkwave_add_link);

function oni_org_store_link(I) {
    var cmd_str = 'emacsclient \"org-protocol://store-link://'
            + encodeURIComponent(I.buffer.display_uri_string) + '/'
            + encodeURIComponent(I.buffer.document.title) + '\"';

    if (I.window != null) {
        window.minibuffer.message('Issuing ' + cmd_str);
    }

    shell_command_blind(cmd_str);
}
interactive("org-store-link",
            "Stores [[url][title]] as org link and copies url to emacs "
            + "kill ring",
            oni_org_store_link);

interactive("find-url-from-history",
            "Find a page from history in the current buffer",
            "find-url",
            $browser_object = browser_object_history_url);
interactive("find-url-from-history-new-buffer",
            "Find a page from history in a new buffer",
            "find-url-new-buffer",
            $browser_object = browser_object_history_url);

define_webjump("emacswiki",
               "http://www.google.com/cse?cx=004774160799092323420%3A6-ff2s0o6yi&q=%s",
               $alternative="http://www.emacswiki.org");
define_webjump("php",
               "http://www.php.net/manual-lookup.php?pattern=%s&scope=quickref",
               $alternative="http://www.php.net");
define_webjump("python",
               "http://docs.python.org/search.html?q=%s&check_keywords=yes&area=default",
               $alternative="http://www.python.org");
define_webjump("ddg",
               "https://duckduckgo.com/?q=%s",
               $alternative="https://duckduckgo.com");
define_webjump("metal-archives",
               "http://www.metal-archives.com/search?searchString=%s&type=band_name",
               $alternative="http://www.metal-archives.com");
define_webjump("djangodocs",
               "https://docs.djangoproject.com/search/?q=%s&release=5",
               $alternative="https://docs.djangoproject.com/");
define_webjump("google",
               "https://duckduckgo.com?q=!google%%20%s");
define_webjump("github",
               "https://github.com/search?q=%s&type=Everything&repo=&langOverride=&start_value=1",
               $alternative="https://github.com");
define_webjump("mdn",
               "https://developer.mozilla.org/en-US/search?q=%s",
               $alternative="https://developer.mozilla.org/");
// Archlinux
define_webjump("arch/wiki",
               "https://wiki.archlinux.org/index.php?search=%s",
               $alternative="https://wiki.archlinux.org");
define_webjump("arch/aur",
               "https://aur.archlinux.org/packages.php?O=0&K=%s&do_Search=Go",
               $alternative="https://aur.archlinux.org");
define_webjump("arch/packages",
               "https://www.archlinux.org/packages/?sort=&q=%s&limit=50",
               $alternative="https://packages.archlinux.org");

content_policy_bytype_table.object = oni_block_flash;
cwd = make_file("/home/slash/downloads/");
hint_digits = "arstdhneio";
read_buffer_show_icons = true;
url_remoting_fn = load_url_in_new_buffer;

define_key(content_buffer_normal_keymap, "h",
           "find-url-from-history-new-buffer");
define_key(content_buffer_normal_keymap, "H",
           "find-url-from-history");
define_key(default_base_keymap, "C-x f", "follow-new-buffer");

add_hook("before_quit_hook", oni_before_quit_func);
add_hook("content_policy_hook", content_policy_bytype);
add_hook("mode_line_hook", mode_line_adder(buffer_count_widget, true));
add_hook("mode_line_hook", mode_line_adder(buffer_icon_widget, true));
add_hook("mode_line_hook", mode_line_adder(downloads_status_widget));

remove_hook("download_added_hook", open_download_buffer_automatically);

hints_minibuffer_annotation_mode(true);
theme_load("naquadah");

var gh_url = "http://github.com/";
function read_url_github_ad_command_handler(input)
{
    var m = /^gh\s+@(\S+)(?:\s+((?:un)?follow))?/.exec(input);
    if (m) {
        if (m[2])
            return gh_url + "users/follow?target=";
        return gh_url + m[1];
    }

    return null;
}

function read_url_github_my_command_handler(input)
{
    var m = /^gh\s+my\s+(dashboard|issues|notifications|profile|pulls|stars)/.exec(input);

    if (m) {
        switch (m[1]) {
        case "dashboard":
        case "notifications":
        case "stars":
            return gh_url + m[1];
        case "issues":
        case "pulls":
            return gh_url + "dashboard/" + m[1];
        case "profile":
            return gh_url + "settings/" + m[1];
        }
    }

    return null;
}

function read_url_github_repo_command_handler(input)
{
    var m = /^gh\s+(\S+\/\S+)(?:\s+(\#\d+|\@\S+|issues|pulls|wiki|graphs|network|admin)(?:\s+(\#\d+|new))?)?$/.exec(input);

    if (m) {
        repo_url = gh_url + m[1] + "/";

        switch (m[2]) {
        case "issues":
            issues_url = repo_url + m[2] + "/";

            if (m[3]) {
                if (m[3][0] == '#')
                    return issues_url + m[3].substring(1);
                else if (m[3] == "new")
                    return issues_url + m[3];
                else
                    break;
            }

            return issues_url;
        case "pulls":
        case "wiki":
        case "graphs":
        case "network":
        case "admin":
            return repo_url + m[2];
        default:
            // Still need watch and unwatch
            if (m[2]) {
                if (m[2][0] == '#')
                    return repo_url + "issues/" + m[2].substring(1);
                else if (m[2][0] == '@')
                    return repo_url + "tree/" + m[2].substring(1);
                else
                    break;
            }

            return repo_url;
        }
    }

    return null;
}

function read_url_github_command_handler(input)
{
    return read_url_github_ad_command_handler(input)
        || read_url_github_my_command_handler(input)
        || read_url_github_repo_command_handler(input);
}

function read_url_local_port_handler(input)
{
    var m = /^lh (\d{1,5})$/.exec(input);

    if (m) {
        return "http://localhost:" + m[1];
    }

    return null;
}

read_url_handler_list = [read_url_local_port_handler,
                         read_url_github_command_handler];
