﻿var Translate = (function() {
    var prefix = parent.location.protocol + '//';
    var URL = prefix + "api.microsofttranslator.com/V2/Ajax.svc/",
        appID, dropDownDiv, 
        splitSentences = function(string) {
            var sentences = [];
            var lastPositionFound;
            while (string != '') {
                var found = false;
                var index = null;

                var results = [];
                var characterGroups = string.split(' ').reverse();

                var position = 1,
                    //skip the first one since we know that's the end anyway
                    elements = characterGroups.length,
                    element = null,
                    prevHadUpper = false,
                    last = null,
                    lookFor = '';

                while (!found && position < elements) {
                    element = characterGroups[position].split('');

                    if (element.length > 0) {
                        last = element[element.length - 1];

                        // test last character rule
                        if (
                        last == '.' || // ends in '.'
                        last == '!' || // ends in '!'
                        last == '?' || // ends in '?'
                        (last == '"' && prevHadUpper) // ends in '"' and previous started [A-Z]
                        ) {
                            found = true;
                            index = position - 1;
                            lookFor = last + ' ' + characterGroups[position - 1];

                        } else {
                            if (element[0] == element[0].toUpperCase()) {
                                prevHadUpper = true;
                            } else {
                                prevHadUpper = false;
                            }
                        }
                    } else {
                        prevHadUpper = false;
                    }
                    position++;
                }


                var trimPosition = string.lastIndexOf(lookFor) + 1;
                if (trimPosition == lastPositionFound) {
                    trimPosition = 0;
                }
                else {
                    lastPositionFound = trimPosition;
                }
                var sentence = string.substring(trimPosition);
                string = string.substr(0, trimPosition);
                if (sentence != "") {
                    sentences.push(sentence);
                }

            }
            sentences.reverse();
            return sentences;
        },

        //Function that just converts arrays into strings for JSON
        serialize = function(_obj) {
            // Let Gecko browsers do this the easy way
            if (typeof _obj.toSource !== 'undefined' && typeof _obj.callee === 'undefined') {
                return _obj.toSource();
            }
            // Other browsers must do it the hard way
            switch (typeof _obj) {
                // numbers, booleans, and functions are trivial:                                                                              
                // just return the object itself since its default .toString()                                                                              
                // gives us exactly what we want                                                                              
            case 'number':
            case 'boolean':
            case 'function':
                return _obj;
                break;

                // for JSON format, strings need to be wrapped in quotes                                                                              
            case 'string':
                return '\'' + escape(_obj) + '\'';
                break;

            case 'object':
                var str;
                if (_obj.constructor === Array || typeof _obj.callee !== 'undefined') {
                    str = '[';
                    var i, len = _obj.length;
                    for (i = 0; i < len - 1; i++) {
                        str += serialize(_obj[i]) + ',';
                    }
                    str += serialize(_obj[i]) + ']';
                }
                else {
                    str = '{';
                    var key;
                    for (key in _obj) {
                        str += key + ':' + serialize(_obj[key]) + ',';
                    }
                    str = str.replace(/\,$/, '') + '}';
                }
                return str;
                break;

            default:
                return 'UNKNOWN';
                break;
            }
        },
        //Hack that lets me put the arrays into Bing's expected querystring format
        queryStringSerialize = function(array) {
            return serialize(array).replace(/'/g, "%22").replace(/\\/g, "");;
        },
	    getTranslatableNodes = function(parent){
		    return parent.nodesContainingText({
		        not: "#lang_dropdown, .selectBox, #otherDiv, #trExpDate, #trCCV, #user_bar_lang select option"
		    });
		},
        breakDocumentSentences = function (parent) {
            var textNodes = getTranslatableNodes(parent);
            textNodes.each(function (key, value) {
                var sentences = splitSentences($(value).text());
                if (sentences.length > 1) {
                    $(value).empty();
                    for (i = 0; i < sentences.length; i++) {
                        $(value).append('<span class="wowweTranslation">' + sentences[i] + '</span>');
                    }

                }
            });
        },
        translatePage = function (translateFrom, translateTo) {
            breakDocumentSentences($('body'));
            //We get all the text nodes from the page into an array.
            var texts = [];
            var length = 0;
            var values = [];
	        
            textNodes = getTranslatableNodes($('body'));

            //we must replace the quotes and ampersands or we'll get an error.
            textNodes.each(function(key, value) {

                if ((length + $(value).text().length) >= 2083) {
                    //translate what we have thus far
                    translateItems(translateFrom, translateTo, texts, values);

                    //re-initiate our variables
                    texts = [];
                    values = [];
                    length = 0;
                }
                var convertedText = $(value).text().replace(/\s+/g, " ").replace(/\"+/g, "~").replace(/\'+/g, "^").replace(/\&+/g, "@@@");
                texts.push(convertedText);
                values.push(value);
                length += $(value).text().length;
            });

            //translate anything under 2083
            if (length > 0) {
                translateItems(translateFrom, translateTo, texts, values);
            }

        },
        translateItems = function(translateFrom, translateTo, texts, nodes) {
            $.getJSON(URL + "TranslateArray?oncomplete=?&from=" + translateFrom + "&to=" + translateTo + "&appId=" + appID + "&texts=" + queryStringSerialize(texts), function(data) {
                if (data.Errors != null) {
                    alert(data.Errors);
                }
                //We receive back an array of text nodes in the same order as the original. 
                //We need to replace the HTML for each node with the returned text
                for (i = 0; i < nodes.length; i++) {
                    $(nodes[i]).text(data[i].TranslatedText.replace(/\~+/g, '\"').replace(/\^+/g, "\'").replace(/\@@@+/g, "&"));
                }
            });
        }

        return {
            //Expose this so the other tools can use it
            getTranslatableNodes: function(parent) {
                return getTranslatableNodes(parent);
            },
            //Expose this so the other tools can use it
            queryStringSerialize: function (array) {
                return queryStringSerialize(array);
            },
            breakDocumentSentences: function (parent) {
                breakDocumentSentences(parent);
            },
            init: function (dropDown) {
                breakDocumentSentences($('body'));
                $.ajax({
                    url: "/Token.aspx",
                    success: function(data) {
                        appID = data;
                        dropDownDiv = dropDown;

                        //get the last selected language
                        var currentLanguage = $.cookie("translateFrom");
                        if (currentLanguage != null) {
                            dropDownDiv.val(currentLanguage);
                        }

                        if (currentLanguage != "en") {
                            translatePage("en", currentLanguage);
                        }

                        if(typeof VOenvironment != 'undefined'){
                            var sUrl = "https://" + VOenvironment.getEnvironment() + ".videocontrolpanel.net/";
                            $('<iframe />', { name: 'myFrame', id: 'myFrame', width: '0px', height: '0px',
                                src: sUrl + "SetLanguageCookie.ASPX?lang=" + currentLanguage
                            }).appendTo('body');
                        }
                        dropDownDiv.change(function() {
                            var to = dropDownDiv.val();
                            $.cookie('translateFrom', to, {
                                expires: 365,
                                path: '/'
                            });
                            location.href = location.href;
                        });
                    }
                })
            }
        }
})();


$(document).ready(function() {
    Translate.init($("#user_bar_lang select"));
});

