﻿/* 
  jQuery "translator" plug-in, written by Ron Tornambe and distributed under the Open Source Initiative OSI - The MIT License 
*/

(function ($) {

  var settings = {
    'sourceLanguage': "",
    'languageListNode': null,
    'brandingNode': null
  };
  var gvars = {
    $this: null,
    langLoaded: false,
    branded: false
  };

  function translator() {
    function showBranding(callback) {
      var gbElement = null;
      gbElement = document.getElementById('_googleBranding');
      gvars.branded = true;
      google.language.getBranding(gbElement);
      if (settings.brandingNode) settings.brandingNode.appendChild(gbElement)
      else gbElement.style.backgroundColor = 'white';
      return callback();
    }
    function xlatext() {
      try {
        var src_text = null;
        var jelem = null;
        gvars.$this.each(function (index, jelem) {
          if (!jelem) return;
          src_text = $(jelem).attr("src_text");
          if (!src_text) return;
          var tolang = $("#_supportedLanguagesList")[0].value;
          google.language.translate({ text: src_text, type: google.language.ContentType.HTML }, settings.sourceLanguage, tolang,
            function (result) {
              if (result.error) return alert(result.error.message)
              else {
                if ('value' in $(jelem)[0]) $(jelem)[0].value = result.translation
                else $(jelem).html(result.translation);
              }
            }
          );
        });
      } catch (e) { alert(e.messsage); }
    }
    if (!gvars.langLoaded) return;
    return !gvars.branded ? showBranding(xlatext) : xlatext();
  }
  function setupTranslation() {
    function setupLangList(status) {
      function getLanguagesList() {
        function isFontSupported(lang) {
          try {
            if (!google.language.isTranslatable(lang) || !lang.length) return false;
            return google.language.isFontRenderingSupported(lang);
          } catch (e) { return false }
        }
        var list = document.createElement('select');
        for (var l in google.language.Languages) {
          if (isFontSupported(google.language.Languages[l]) && (google.language.Languages[l]=='no'|| google.language.Languages[l]=='en')) {
            var opt = document.createElement('option');
            opt.innerHTML = l;
            opt.value = google.language.Languages[l];
            if (opt.value == settings.sourceLanguage) opt.selected = "selected";
            list.appendChild(opt);
          }
        }
        return list;
      }
      gvars.$this.each(function (index, jelem) { // create a new property to hold the original language text
        src_text = 'value' in $(jelem)[0] ? $(jelem)[0].value : $(jelem).html();
        $(jelem).attr("src_text", src_text);
      });
      function ll() {
        var langList = getLanguagesList();
        if (langList) {
          var listroot = document.createElement('div');
          listroot.id = "_translateElements";
          listroot.style.cssText = 'position:relative;overflow:hidden;z-index:3;';
          langList.id = "_supportedLanguagesList";
          langList.onchange = translator;
          langList.style.cssText = 'margin:0; padding:0;';
          listroot.appendChild(langList);
          var glogo = document.createElement('div');
          glogo.id = "_googleBranding";
          glogo.style.cssText = 'text-align:center;padding-top:2px;display:none;'
          listroot.appendChild(glogo);
          if (!settings.languageListNode) {
            settings.languageListNode = document.body;
            listroot.style.top = '8px';
            listroot.style.right = '12px';
            listroot.style.position = 'absolute';
          }
          var appnode = settings.languageListNode;
          appnode.appendChild(listroot);
        }
      }
      gvars.$this.each(function (index, jelem) { // detect source language 
        src_text = $(jelem).attr("src_text");
        if (!settings.sourceLanguage && src_text) {
          google.language.detect(src_text,
            function (result) {
              if (settings.sourceLanguage) return;
              if (result.isReliable) {
                settings.sourceLanguage = result.language;
                return ll();
              }
            }
          );
        }
      });

    }
    google.load("language", "1", { "callback":
        function () {
          gvars.langLoaded = true;
          setupLangList(true);
        }
    }
    );
  }

  var methods = {
    init: function (options) {
      gvars.$this = this;
      function initialize() {
        if (options) $.extend(settings, options);
        setupTranslation();
        return this;
      }
      function getScript() {
        $.getScript(((document.location.protocol == "https:") ? "https://" : "http://") +
						"www.google.com/jsapi", initialize);
      }
      try {
        if (google && google.load) initialize()
        else getScript();
      } catch (e) {
        getScript()
      }
    },
    destroy: function () {
      return this.each(function () {
        $(window).unbind('.translator');
      })
    }
  };

  $.fn.translator = function (method) {
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
      return methods.init.apply(this, arguments);
    } else {
      $.error('Method ' + method + ' does not exist on jQuery.translator');
    }
  };

})(jQuery);

