<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- The HTML 4.01 Transitional DOCTYPE declaration-->
<!-- above set at the top of the file will set     -->
<!-- the browser's rendering engine into           -->
<!-- "Quirks Mode". Replacing this declaration     -->
<!-- with a "Standards Mode" doctype is supported, -->
<!-- but may lead to some differences in layout.   -->

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Google Web Toolkit Developer Plugin Not Installed</title>
    <style>
      body {
        margin: 0;
        padding: 0;
      }
    </style>

    <script>
      var troubleshootingUrl = "http://groups.google.com/group/google-web-toolkit";

      // The missing plugin module expects downloadInfo.inferredDownloadId to contain the key to use
      // in allDownloads field.
      var downloadInfo = {
        "inferredDownloadId" : null,
        "troubleshootingUrl" : troubleshootingUrl,
        "allDownloads" : {
          "unknown" :
          {
            "caption" : "Regrettably, this browser is currently unsupported :-(",
            "url" : troubleshootingUrl,
            "supported" : false
          },

          "firefox-old" :
          {
            "caption" : "Sorry, the GWT Developer Plugin only supports Firefox 3.0 - 15.0 at present",
            "url" : "http://www.getfirefox.com",
            "supported" : false
          },

          "opera" :
          {
            "caption" : "Sorry, there is currently no GWT Developer Plugin for Opera",
            // TODO(you): If you are reading this, maybe you would be interested in contributing an Opera version?
            "url" : "http://code.google.com/webtoolkit/makinggwtbetter.html#contributingcode",
            "supported" : false
          },

          "safari-iphone" :
          {
            "caption" : "Sorry, there is currently no GWT Developer Plugin for mobile Safari",
            "url" : troubleshootingUrl,
            "supported" : false
          },

          "webkit-android" :
          {
            "caption" : "Sorry, there is currently no GWT Developer Plugin for mobile WebKit",
            "url" : troubleshootingUrl,
            "supported" : false
          },

          "chrome" :
          {
            "caption" : "Download the GWT Developer Plugin<br>For Chrome",
            "url" : "https://chrome.google.com/webstore/detail/gwt-developer-plugin/jpjpnpmbddbjkfaccnmhnkdgjideieim",
            "platforms" : "Win x86, Linux x86/x86_64, Mac x86",
            "supported" : true
          },

          "safari-win" :
          {
            "caption" : "Sorry, there is currently no GWT Developer Plugin for Safari on Windows",
            "url" : troubleshootingUrl,
            "supported" : false
          },

          "firefox" :
          {
            "caption" : "Download the GWT Developer Plugin<br>For Firefox",
            "url" : "https://dl-ssl.google.com/gwt/plugins/firefox/gwt-dev-plugin.xpi",
            "platforms" : "Win x86, Linux x86/x86_64, Mac x86/PPC(3.x only)/x86_64",
            "supported" : true
          },

          "ie" :
          {
            "caption" : "Download the GWT Developer Plugin<br>For Internet Explorer",
            "url" : "https://dl-ssl.google.com/tag/s/appguid%3D%7B9a5e649a-ec63-4c7d-99bf-75adb345e7e5%7D%26lang%3Den%26appname%3DGWT%2520Developer%2520Plugin%2520for%2520IE%2520%2528x86%2529%26needsadmin%3Dfalse/gwt/plugins/ie/GwtDevPluginSetup.exe",
            "platforms" : "Win x86",
            "supported" : true
          },

          "ie-x64" :
          {
            "caption" : "Download the GWT Developer Plugin<br>For Internet Explorer (64-bit)",
            "url" : "https://dl-ssl.google.com/tag/s/appguid%3D%7B53dae7d2-8c28-440f-920b-b2d665ce73b2%7D%26lang%3Den%26appname%3DGWT%2520Developer%2520Plugin%2520for%2520IE%2520%2528x64%2529%26needsadmin%3Dfalse/gwt/plugins/ie/GwtDevPluginSetup.exe",
            "platforms" : "Win x64",
            "supported" : true
          },

          "safari-mac" :
          {
            "caption" : "Download the GWT Developer Plugin<br>For Safari",
            "url" : "https://dl-ssl.google.com/gwt/plugins/safari/gwt-dev-plugin.dmg",
            "platforms" : "Mac x86/x86_64/PPC",
            "supported" : true
          },

          "safari-mac-late" :
          {
            "caption" : "Sorry, there is currently no GWT Developer Plugin for Safari 5.1<br>"
              + "or later, due to major changes in the Safari plugin API. <br><br>"
              + "In the meantime, <a href='http://www.omnigroup.com/products/omniweb/'>OmniWeb 5.11</a> is similar to Safari 5.0 and <br>"
              + "known to work.",
            "url" : troubleshootingUrl,
            "supported" : false
          }
        }
      };

      function leadingDigits(s) {
         var suffix = s.search(/[^\d]/g);
         if (suffix != -1) {
           s = s.substring(0, suffix);
         }
         return s;
      }

      function isSafariLate(ua) {
        // Distinguish Safari from something "like Safari", e.g. OmniWeb
        // "Version/" comes after "like"
        var versionAndBeyond = ua.substring(ua.indexOf("version/"));
        if (versionAndBeyond.indexOf("safari/") == -1) {
          return false;
        }

        var componentsAfterVersion =
          ua.substring(ua.indexOf("version/") + "version/".length).split(" ");
        var version = componentsAfterVersion[0].split(".");

        var major = Number(version[0]);
        // Sometimes minor has a suffix like "dp1"
        var minor = Number(leadingDigits(version[1]));

        return major > 5 || major == 5 && minor > 0;
      }

      var ua = navigator.userAgent.toLowerCase();
      var id = 'unknown';
      if (ua.indexOf("webkit") != -1) {
        if ( (ua.indexOf("iphone") != -1) || (ua.indexOf("ipod") != -1) ) {
          id = 'safari-iphone';
        } else if (ua.indexOf("android") != -1) {
          id = 'webkit-android';
        } else if (ua.indexOf("chrome") != -1) {
            id = 'chrome';
        } else if (ua.indexOf("macintosh") != -1) {
          if (isSafariLate(ua)) {
            id = 'safari-mac-late';
          } else {
            id = 'safari-mac';
          }
        } else if (ua.indexOf("windows") != -1) {
          id = 'safari-win';
        }
      } else if (ua.indexOf("msie") != -1) {
        id = (ua.indexOf("win64") == -1) ? 'ie' : 'ie-x64';
      } else if (ua.indexOf("opera") != -1) {
        id = 'opera';
      } else if (ua.indexOf("gecko") != -1) {
        // Note: Gecko version != Firefox version before 5.0.
        // See: https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference
        var gecko_versions = ["1.9", "2.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0"];
        id = 'firefox-old';
        for (var i = 0; i < gecko_versions.length; i++) {
          if (ua.indexOf("rv:" + gecko_versions[i]) != -1) {
            id = 'firefox';
            break;
          }
        }
      }
      downloadInfo.inferredDownloadId = id;
    </script>

    <script type="text/javascript" language="javascript" src="missingplugin/missingplugin.nocache.js"></script>
  </head>

  <noscript>
    <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
      The Google Web Toolkit Developer Plugin does not appear to be installed.
      Also, you also don't seem to have a browser that is willing to run JavaScript.
      Please enable JavaScript or switch to a browser that supports JavaScript and try again.
    </div>
  </noscript>
  </body>
</html>
