﻿google.load("language", "1");

var google_translate_initialized = false;

function translate_elements(target_language) {

    if (!target_language || target_language == "") return;

    function initialize() {

        google_translate_initialized = true;

        $(".translate").each(function(i, element) {

            var $e = $(element);

            if (!$e.data("is_translated")) {

                var is_viewing_original = false;

                if (!$e.is(".no_translation_switch")) {

                    $e.bind("language_detected", function(event, args) {

                        if ($e.data("is_switch_ready")) return;

                        $(this).unbind(event);

                        $e.data("is_switch_ready", true);

                        //TODO:

                        if (args.language != "en" && args.language != "es" && args.language != "fr") return;

                        var orig_button_html = '<div class="translation_switch"><img src="images/translate_to_' + args.language + '.png" /></div>';

                        $e.append(orig_button_html);

                        $translation_switch = $e.find(".translation_switch");

                        $e.css("position", "relative");
                        $translation_switch.css("position", "absolute");

                        var switch_position = { "bottom": 0, "right": 0 };

                        var translate_switch_location = $e.attr("epg:translation_switch_location");

                        if (translate_switch_location) {
                            switch (translate_switch_location) {
                                case "top_left": switch_position = { "top": 0, "left": 0 }; break;
                                case "top_right": switch_position = { "top": 0, "right": 0 }; break;
                                case "bottom_left": switch_position = { "bottom": 0, "left": 0 }; break;
                            }
                        }

                        $translation_switch.css(switch_position);

                        $translation_switch.click(function(event) {

                            restore_element($e, is_viewing_original);

                            is_viewing_original = !is_viewing_original;

                            $(this).find("img").attr("src", "images/translate_to_" + (is_viewing_original ? target_language : args.language) + ".png");

                        });

                        $e.mouseenter(function() {

                            $translation_switch = $e.find(".translation_switch");

                            if ($translation_switch.is(":hidden")) {

                                $translation_switch.fadeIn();
                            }
                        });

                        $e.mouseleave(function() {
                            $translation_switch = $e.find(".translation_switch");
                            $translation_switch.hide();
                        });

                    });
                }
                translate_children($e, target_language);

                $e.data("is_translated", true);
            }
        });
    }
    
    if (!google_translate_initialized) google.setOnLoadCallback(initialize);
    else initialize();
}

//$.fn.setFirstRealTextNode = function(txt) { return this.each(function() { var $ = jQuery, c = $(this).contents().filter(function() { return this.nodeType == 3 && $.trim(this.nodeValue).length > 0; })[0]; if (c) c.nodeValue = txt; }) };

function translate_children($e, target_language) {

    translate_element($e, $e, target_language);

}

function translate_element($root, $e, target_language) {

    var $children = $e.children();

    if ($children.length > 0) {
        $e.contents().filter(function() { return this.nodeType == 3 && $.trim($(this).text()).length > 0; }).each(function(i) {

            $(this).wrap("<span></span>");

        });

        $children = $e.children();
    
        $children.each(function(i, child) {
            $current_child = $(child);
            if (!$current_child.is (".do_not_translate")) translate_element($root, $current_child, target_language);
        });
    }
    else {

        if (!$e.is(".do_not_translate")) {

            if ($e.is(".translate")) {
                $e.contents().filter(function() { return this.nodeType == 3 && $.trim($(this).text()).length > 0; }).each(function(i) {

                    $(this).wrap("<span></span>");

                });

                if ($e.children().length > 0) $e = $e.children(":first");
            }

            translate_text($root, $e, target_language);
        }
    }
}

function repeat (ch, len) {
    var arr = [];
    arr.length = len + 1;
    return arr.join(ch);
}

function custom_trim(str) {

    var start = -1, end = str.length;

    while (str.charCodeAt(--end) < 33);
    while (str.charCodeAt(++start) < 33);

    return { "result": str.slice(start, end + 1), "trim_left_count": start, "trim_right_count": str.length - end - 1 };
};

function translate_text($root, $e, target_language) {

    var trimmed = custom_trim ($e.text ().replace ("&nbsp;", " "));

    if (trimmed.result.length < 1 || $e.is(".translation_switch")) return;

    google.language.detect(trimmed.result, function(result) {

        var detected_language = result.language;

        if (!result.error && detected_language && target_language != detected_language) {
            google.language.translate($e.text(), "", target_language,
                function(result) {
                    if (!result.error) {

                        var translated_text = result.translation.replace(/&#39;/g, "'").replace(/&quot;/g, "\"").replace(/&amp;/g, "&");

                        translated_text = repeat(" ", trimmed.trim_left_count) + translated_text + repeat(" ", trimmed.trim_right_count);

                        $e.data("src_text", $e.text());
                        $e.data("trans_text", translated_text);
                        $e.text(translated_text);

                        $root.trigger("language_detected", [{ "language": detected_language}]);
                    }
                });
        }
    });
}

function restore_element($e, is_viewing_original) {

    var $children = $e.children();

    if ($children.length > 0) {
        $children.each(function(i, child) {
            $current_child = $(child);
            if (!$current_child.is(".do_not_translate")) restore_element($current_child, is_viewing_original);
        });

        return;
    }

    if ($.trim($e.text()).length < 1 || $e.is(".translation_switch")) return;

    if (!$e.is(".do_not_translate")) $e.text(is_viewing_original ? $e.data("trans_text") : $e.data("src_text"));
}

function translate_query(query, callback) {
    var json_result = $.getJSON(
            "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + encodeURI(query) + "&langpair=en|es&langpair=en|fr&callback=?",
            function(data) {
                var translated_query = query;

                $.each(data.responseData, function(i, item) {
                    translated_query += " " + item.responseData.translatedText;
                });

                callback(translated_query);
            }
        );
}