<!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://dl-ssl.google.com/gwt/plugins/chrome/gwt-dev-plugin.crx",
            "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"];
        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>
