<!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 and 3.5 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",
            "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
          }
        }
      };

      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) {
          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) {
        if (ua.indexOf("rv:1.9") != -1) {
          id = 'firefox';
        } else {
          id = 'firefox-old';
        }
      }
      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.
      However, 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>

