/*============================================================================
#
#          Copyright (C) 2008 Matti Tukiainen, http://ktmatu.com/mt/
#
# Program name  : RatesFX Read News, rfxrn.js
# Version       : 1.00
# Purpose       : Adds functionality to aggregated news pages.
# Date          : 2008-04-16
# Updates       : 1.00 Initial release. (2008-04-16)
#
# References    : -
#
# Notes         : -
#============================================================================*/


var MESSAGES = {};


function get_msg (msg) {
    return MESSAGES [msg] || undefined;
};


function set_elements_classname (element, className) {
    element.className = className;
};


function event_handler (
    element,
    class_name_a,
    class_name_b,
    delay,

    element_2,
    class_name_2a,
    class_name_2b,

    event_type
) {
    var self = this;

    if (event_type === 2) {
        // onclick
        if (typeof (self.timeout_id) == "number") {
            clearTimeout (self.timeout_id);
            //delete (self.timeout_id);
            self.timeout_id = null;
        };

        swap_elements_classname (element, class_name_a, class_name_b);
    }
    else {
        if (event_type === 0) {
            // onmouseout
            if (typeof (self.timeout_id) == "number") {
                clearTimeout (self.timeout_id);
                //delete (self.timeout_id);
                self.timeout_id = null;
            };
        };
    
        swap_elements_classname (element_2, class_name_2a, class_name_2b);

        // Ramon Leon: http://www.west-wind.com/WebLog/posts/5033.aspx
        self.timeout_id = setTimeout (
            function () {
                if (self.mouse_over) {
                    swap_elements_classname (element, class_name_a, class_name_b);
                };
            },
            delay
        );
        self.mouse_over = event_type;
    };
};


function swap_elements_classname (element, class_name_a, class_name_b) {
    if (element.className == class_name_a) {
        element.className = class_name_b;
    }
    else {
        element.className = class_name_a;
    };
};


//http://www.ejball.com/EdAtWork/PermaLink.aspx?guid=14c020c7-20a6-47d7-b445-9c3ecda153b2
//http://www.hunlock.com/blogs/Functional_Javascript
function bind_arguments (fn) {
    var args = [];
    for (var n = 1; n < arguments.length; n++) {
        args.push (arguments [n]);
    };
    return function () { return fn.apply (this, args); };
};


// http://matthom.com/archive/2007/05/03/removing-all-child-nodes-from-an-element
function remove_all_child_nodes (element) {
    if (element.hasChildNodes ()) {
        while (element.childNodes.length >= 1) {
            element.removeChild (element.firstChild);
        };
    };
};


function get_cookie (name) {
    var start = document.cookie.indexOf (name + "=");
    var len = start + name.length + 1;

    if ((!start) && (name != document.cookie.substring (0, name.length))) return null;
    if (start == -1) return null;
    var end = document.cookie.indexOf (";", len);
    if (end == -1) end = document.cookie.length;
    return unescape (document.cookie.substring (len, end));
};


function set_cookie (name, value, expires, path, domain, secure) {
    document.cookie = name + "=" + escape (value) +
        ( (expires) ? ";expires=" + expires.toGMTString() : "") +
        ( (path) ? ";path=" + path : "") + 
        ( (domain) ? ";domain=" + domain : "") +
        ( (secure) ? ";secure" : "");
};


function value_to_selected_index (value_str, select_obj) {
    var index = -1;
    for (var i = 0; i < select_obj.length; i++) {
        if (select_obj.options [i].value === value_str) {
          index = i;
          break;
        };
    };
    return index;
};


function init_links (
    new_window_arg,
    show_description_arg,
    show_similar_arg
) {
    var settings_form_id = get_msg ("settings_form_id");
    var settings_form = document.forms [settings_form_id];

    var new_window       = new_window_arg || get_cookie (escape ("open-new-links")) || settings_form.elements['open_links'].value || "new_window";
    var show_description = show_description_arg || get_cookie (escape ("show-details")) || settings_form.elements['show_details'].value || "no";
    var show_similar     = show_similar_arg || get_cookie (escape ("show-similar")) || settings_form.elements['show_similar'].value || "no";
    var close_msg        = get_msg ("close_msg") || "CloSE";
    var showdsrbtnv_msg  = get_msg ("showdsrbtn_msg") || " ... ";
    var showdsrbtn_msg   = get_msg ("showdsrbtn_title_msg") || "";

    var window_name = "_self";
    if (new_window === "new_window") {
        window_name = "_blank";
    };

    var tbodies = document.getElementById ("news").getElementsByTagName ("tbody");
    for (var i = 0; i < tbodies.length; i++) {
        if (tbodies [i].className === "tnispcad") {
            continue; // skip ads
        };
        //alert ("tbody n:o " + i + " " + tbodies [i].className);

        var similar_class = "tnish";
        if (show_similar === "yes") {
            similar_class = "tnis";
        };
        if (
            (tbodies [i].className === "tnis")
            ||
            (tbodies [i].className === "tnish")
        ) {
            set_elements_classname (
                tbodies [i],
                similar_class
            );
        };

        var rows = tbodies [i].getElementsByTagName ("tr");
        var headline_row = undefined;
        var description_row = undefined;
        for (var j = 0; j < rows.length; j++) {
            if (
                (rows [j].className === "niin")
                ||
                (rows [j].className === "niinhover")
            ) {
                headline_row = rows [j];
            }
            else if (
                (rows [j].className === "dsrh")
                ||
                (rows [j].className === "dsrv")
            ) {
                description_row = rows [j];
            };
        };

        var description_divs = tbodies [i].getElementsByTagName ("div");
        for (var j = 0; j < description_divs.length; j++) {
            if (description_divs [j].className === "closedsrbtn") {
                description_divs [j].onclick = bind_arguments (
                    set_elements_classname,
                        description_row,
                        "dsrh"
                );

                remove_all_child_nodes (description_divs [j]);
                var txt = document.createTextNode (close_msg);
                description_divs [j].appendChild (txt);
            };
        };

        var anchor_tags = tbodies [i].getElementsByTagName ("a");
        for (var j = 0; j < anchor_tags.length; j++) {
            if (anchor_tags[j].className === "ttl") {
                anchor_tags[j].target = window_name;
                //anchor_tags[j].onclick = function () { alert (this.href); };
            };
        };

        var span_tags = tbodies [i].getElementsByTagName ("span");
        for (var j = 0; j < span_tags.length; j++) {
            //alert (i + " " + span_tags[j].nodeName + " " + span_tags[j].className);
            if (show_description === "yes") {
                set_elements_classname (
                    description_row,
                    "dsrv"
                );
            }
            else {
                set_elements_classname (
                    description_row,
                    "dsrh"
                );
            };

            if (
                (span_tags[j].className === "showdsrbtnv")
                ||
                (span_tags[j].className === "showdsrbtnh")
            ) {
                if (show_description === "yes") {
                    set_elements_classname (
                        span_tags [j],
                        "showdsrbtnh"
                    );
                }
                else {
                    span_tags [j].firstChild.nodeValue = showdsrbtnv_msg;

                    set_elements_classname (
                        span_tags [j],
                        "showdsrbtnv"
                    );

                    span_tags[j].setAttribute ("title", showdsrbtn_msg);

                    span_tags[j].onmouseover = bind_arguments (
                        event_handler,
                            description_row,
                            "dsrv",
                            "dsrh",
                            750,

                            headline_row,
                            "niin",
                            "niinhover",

                            1
                    );
                    span_tags[j].onmouseout  = bind_arguments (
                        event_handler,
                            description_row,
                            "dsrh",
                            "dsrv",
                            0,

                            headline_row,
                            "niinhover",
                            "niin",

                            0
                    );

                    span_tags[j].onclick = bind_arguments (
                        event_handler,
                            description_row,
                            "dsrv",
                            "dsrh",
                            0,

                            undefined,
                            undefined,
                            undefined,

                            2
                    );
                };
            };
        };

    };

    settings_form.elements['open_links'].selectedIndex =
        value_to_selected_index (new_window, settings_form.elements['open_links']);
    settings_form.elements['show_details'].selectedIndex =
        value_to_selected_index (show_description, settings_form.elements['show_details']);
    settings_form.elements['show_similar'].selectedIndex =
        value_to_selected_index (show_similar, settings_form.elements['show_similar']);

    var today = new Date ();
    var expires = new Date (
        today.getTime () + (365 * 86400000)
    );
    set_cookie (escape ("open-new-links"), escape (new_window), expires);
    set_cookie (escape ("show-details"), escape (show_description), expires);
    set_cookie (escape ("show-similar"), escape (show_similar), expires);
};


function init_page (msges) {
    MESSAGES = msges;

    if (document.getElementById) {
        var settings_form = document.forms [msges.settings_form_id];
        if (settings_form) {
            var settings_style =
                document.getElementById (msges.settings_form_id).style;
            settings_style.display = "block";

            init_links (undefined, undefined, undefined);
        }
        else {
            alert ("init_page: error");
        };
    };
};
