// Thanks for doing your part to liber(IE)t the world from IE6!
// Here's to the "Support but Discourage" approach :)
// Original copy written by Jonathan Howard.
// jon@StaringIsPolite.com // twitter.com/staringispolite
//
// GNU LGPL License v3
// SevenUp is released into the wild under a GNU LGPL v3
//
// Browser sniffing technique lovingly adapted from http://www.thefutureoftheweb.com/
// Simple CSS Lightbox technique adapted equally lovingly from http://www.emanueleferonato.com/
// Go read their blogs :)

// Constructor technique advocated by Doug Crockford (of LSlint, JSON) in his recent Google tech talk.
var sevenUp = function() {
  // Define 'private vars' here.
	var osSupportsUpgrade = /(Windows NT 5.1|Windows NT 6.0|Windows NT 6.1|)/i.test(navigator.userAgent); // XP, Vista, Win7
  var options = {  // Change these to fit your color scheme via the 'options' arg for test().
    enableClosing: true,
    enableQuitBuggingMe: true,
    overlayColor: "#000000",  
    lightboxColor: "#ffffff",
    borderColor: "#6699ff",
    downloadLink: osSupportsUpgrade ? 
                    "http://www.microsoft.com/windows/internet-explorer" :
                    "http://getfirefox.com",
    overrideLightbox: false,
    lightboxHTML: null,
    showToAllBrowsers: false
  };
  // Hate to define CSS this way, but trying to keep to one file.
  // I'll keep it as pretty as possible.
  function overlayCSS() {
    return "display: block; position: absolute; top: 0%; left: 0%;" +
    "width: 100%; height: 100%; background-color: " + options.overlayColor + "; " +
    "filter: alpha(opacity: 80); z-index:1001;";
  }
  function lightboxCSS() {
    return "display: block; position: absolute; top: 25%; left: 25%; width: 50%; " +
    "padding: 16px; border: 8px solid " + options.borderColor + "; " +
    "background-color:" + options.lightboxColor + "; " +
    "z-index:1002; overflow: hidden;";
  }
  function lightboxContents() {
    if (!options.lightboxHTML) {
      var html =
      "<div style='width: 100%; height: 95%'>" +
        "<h2 style='text-align: center;'>Your web browser is outdated and unsupported</h2>" +
        "<div class='upgrade_msg' style='text-align: center;'>" +
          "You can easily upgrade to the latest version at<br> " +
          "<a style='color: #0000EE' href='" + options.downloadLink + "'>" +
            options.downloadLink +
          "</a>" +
        "</div>" +
        "<h3 style='margin-top: 40px'>Why should I upgrade?</h3>" +
        "<ul>" +
          "<li><b>Websites load faster</b>, often double the speed of this older version</li>" +
          "<li><b>Websites look better</b>, so you see sites they way they were intended</li>" +
          "<li><b>Tabs</b> let you view multiple sites in one window</li>" +
          "<li><b>Safer browsing</b> with phishing protection</li>" +
        "</ul>" +
      "</div>";
      if (options.enableClosing) {
        html += "<div style='font-size: 11px; text-align: right;'>";
        html += options.enableQuitBuggingMe ?
        ("<a href='#' onclick='sevenUp.quitBuggingMe();' " +
            "style='color: #0000EE'>" +
            "Quit bugging me" +
        "</a>") :
        ("<a href='#' onclick='sevenUp.close();' " +
            "style='color: #0000EE'>" +
            "close" +
          "</a>");
        html += "</div>";
      }
    }
    return (options.lightboxHTML = html);
  }
  function mergeInOptions(newOptions) {
    if (newOptions) {
      for (var i in options) {
        if (newOptions[i] !== undefined) {
          options[i] = newOptions[i];
        }
      }
    }
  }
  function isCookieSet() {
    if (document.cookie.length > 0) {
      var i = document.cookie.indexOf("sevenup=");
      return (i != -1);
    }
    return false;
  }
  
  // Return object literal and public methods here.
  return {
  	test: function(newOptions, callback) {
      mergeInOptions(newOptions);
  	  if (!isCookieSet()) {
  	    // Write layer into the document.
  	    var layerHTML = "<div id='sevenUpCallbackSignal'></div>";
        if (!options.overrideLightbox) {
          layerHTML += "<div id='sevenUpOverlay' style='" + overlayCSS() + "'>" +
  	        "</div>" +
            "<div id='sevenUpLightbox' style='" + lightboxCSS() + "'>" +
              lightboxContents() +
            "</div>";
        }
        if (options.showToAllBrowsers !== true) {
          layerHTML = "<!--[if lt IE 7]>" + layerHTML + "<![endif]-->";
        }
        var layer = document.createElement('div');
        layer.innerHTML = layerHTML;
  	    document.body.appendChild(layer);
        // Fire callback.
        // I don't like this hack but IE6 seems to restrict dynamically created <script> tags to <head> only, 
        // and I don't see a way to add conditional comments around the script tag or its contents.
        // So for now, we write a 'signal' div inside the CC. If anyone has a better way please let me know.
        if (callback && document.getElementById('sevenUpCallbackSignal')) {
          callback(options);
        }
  	  }  
  	},
    quitBuggingMe: function() {
      var exp = new Date();
      exp.setTime(exp.getTime()+(7*24*3600000));
      document.cookie = "sevenup=dontbugme; expires="+exp.toUTCString();
      this.close();
    },
    close: function() {
      var overlay = document.getElementById('sevenUpOverlay');
      var lightbox = document.getElementById('sevenUpLightbox');
      if (overlay) { overlay.style.display = 'none'; }
      if (lightbox) { lightbox.style.display = 'none'; }
    }
  };
}();

