

  function checkLang() {
    if (isHome()) {
      forwardToAppropriateLang();
    } else {
      setLangCookie(currentLang());
    }
  }

  function forwardToAppropriateLang() {
    //alert("hasLang: " + hasLangCookie());
    if (hasLangCookie()) {
      var uri = appropriateUriForCookie();
      if (uri != null) {
        //alert("send by cookie: " + uri);
        window.location = uri;
      }
    } else {
      var uri = appropriateUriForAcceptLang();
      if (uri != null) {
        //alert("send by accept-lang: " + uri);
        window.location = uri;
      }
    }
  }

  function isHome() {
    var match = String(window.location).match(/https?:\/\/[^\/]+\/(([^\/]+)\/(.*))?/);    
    if (match[0] != null && match[1] == null) {
      return true;
    }
    return false;
  }

  function currentLang() {
    var match = String(window.location).match(/https?:\/\/[^\/]+\/(([^\/]+)\/(.*))?/);
    var rootDir = match[2];
    var lang = "ja";
    if (rootDir == "en")  {
      lang = "en";
    }
    return lang;
  }

  function hasLangCookie() {
    return (getCookieValue("lang") != null);
  }

  function appropriateUriForCookie() {
    var lang = getCookieValue("lang");
    return appropriateUri(lang);
  }

  function appropriateUriForAcceptLang() {
    var lang = navigator.browserLanguage
    if (lang == null) {
      lang = navigator.language;
    }
    return appropriateUri(lang);
  }

  function appropriateUri(lang) {
    var match = String(window.location).match(/https?:\/\/[^\/]+\/(([^\/]+)\/(.*))?/);
    var rootDir = match[2];
    if (rootDir == null) {
      rootDir = "";
    }
    var restOfDir = match[3];

    if (lang.match(/^en/) && rootDir != "en") {
      //alert("redirect to /en/" + rootDir);
      return "/en/" + rootDir;
    } else if (lang.match(/^ja/) && rootDir == "en") {
      //alert("redirect to /" + restOfDir);
      return "/" + restOfDir;
    }
    return null;
  }

  function getCookieValue(key) {
    var tokens = getCookieArray();
    for (var i=0; i<tokens.length; i++) {
      //alert("[" + tokens[i][0] + " / " + tokens[i][1] + " / " + key + "] " + (tokens[i][0] == "lang"));
      if (tokens[i][0] == key) {
        return tokens[i][1];
      }
    }
    return null;
  }

  function changeLang(uri) {
    var lang = "ja";
    if (uri.match("^/en")) {
      lang = "en";
    }
    setLangCookie(lang);
    document.location = uri;
  }

  function setLangCookie(lang) {
    document.cookie = "lang=" + lang + ";path=/"
  }

  function getCookieArray() {
    var cookie = document.cookie;
    //alert("COOKIE: " + cookie);
    var tokens = cookie.split(";");
    var cookieArray = new Array();
    for (var i=0; i<tokens.length; i++) {
      var values = tokens[i].split("=");
      cookieArray.push([values[0].trim(), values[1].trim()]);
    }
    return cookieArray;
  }

  String.prototype.trim = function() {
    return this.replace(/^[ ]+|[ ]+$/g, '');
  }