define(["dojo/_base/declare", "dojo/_base/lang", "dojo/_base/connect", "dojo/dom-construct", "dojo/dom-style", "dojo/sniff",

"dijit/_WidgetBase", "dijit/_TemplatedMixin", "dijit/_Container"], function(declare, lang, connect, domConstruct, domStyle, sniff, _WidgetBase, _TemplatedMixin, _Container) {

  var _browserValidatorPadBrowser = declare("parus._browserValidatorPadBrowser", [_WidgetBase, _TemplatedMixin], {

    templateString: "<div style='display:inline-block;*display:inline;zoom:1'>" + "  <a style='display:inline-block;*display:inline;zoom:1' href='${href}' target='_blank'>" + "    <div style='display:inline-block;*display:inline;zoom:1;width:48px;height:48px;background-image:url(${imgSrc});*background:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"${imgSrc}\");cursor:pointer' title='${title}'></div>" + "  </a>" + "</div>",

    browser: null,

    imgSrc: null,

    href: "",

    title: "",

    postMixInProperties: function() {
      this.inherited(arguments);
      switch (this.browser) {
      case "chrome":
        this.imgSrc = this.imgSrc + "chrome.png";
        this.href = "http://google.com/chrome";
        this.title = "Google Chrome";
        break;
      case "ff":
        this.imgSrc = this.imgSrc + "firefox.png";
        this.href = "http://mozilla.org";
        this.title = "Mozilla Firefox";
        break;
      case "opera":
        this.imgSrc = this.imgSrc + "opera.png";
        this.href = "http://opera.com";
        this.title = "Opera";
        break;
      case "ie":
        this.imgSrc = this.imgSrc + "edge.png";
        this.href = "https://www.microsoft.com/download/internet-explorer-11-for-windows-7-details.aspx";
        this.title = "Internet Explorer 11";
        break;
      }
    }
  });

  var _browserValidatorPad = declare("mill._browserValidatorPad", [_WidgetBase, _TemplatedMixin, _Container], {

    templateString: "<div><div data-dojo-attach-point='textValueNode'></div><div style='margin: 10px 0' data-dojo-attach-point='containerNode'></div></div>",

    style: {
      padding: "10px",
      textAlign: "center",
      backgroundColor: "f9f7ba",
      zIndex: "10001"
    },

    invalidBrowser: null,

    offerBrowsers: null,

    imgSrc: null,

    textValue: null,

    attributeMap: {
      textValue: {
        node: "textValueNode",
        type: "innerHTML"
      }
    },

    postMixInProperties: function() {
      this.inherited(arguments);

      lang.mixin(this.style, {
        position: this.invalidBrowser ? "relative" : "absolute",
        font: "bold " + (this.invalidBrowser ? "14" : "10") + "px Tahoma, Verdana, sans-serif"
      });

      if (!this.invalidBrowser) lang.mixin(this.style, {
        bottom: "20px",
        right: "25px",
        width: "300px",
        border: "solid 2px #b8b69a"
      });


      this.textValue = (this.invalidBrowser ? "Похоже, ваш браузер сильно устарел!<br/>В целях безопасности для работы с\r\nэтим ресурсом необходимо обновить браузер. Разработчик рекомендует сделать\r\nвыбор из следующих вариантов:" : "Ваш браузер, вероятно, устарел.<br/>Если вам позволяют обстоятельства, обновите его. Разработчик рекомендует сделать выбор из следующих вариантов:") || "";
    },

    buildRendering: function() {
      this.inherited(arguments);

      var handler;
      this.invalidBrowser ? domStyle.set(document.body, {
        backgroundColor: this.style.backgroundColor
      }) : handler = connect.connect(domConstruct.create("div", {
        innerHTML: "&#215;",
        style: {
          fontSize: "14px",
          cursor: "pointer",
          position: "absolute",
          top: "1px",
          right: "5px"
        }
      }, this.domNode), "onclick", lang.hitch(this, function() {
        connect.disconnect(handler);
        this.destroyRecursive();
      }));
    },

    startup: function() {
      this.inherited(arguments);

      for (var key in this.offerBrowsers)(this.offerBrowsers[key] === true) && this.addChild(new _browserValidatorPadBrowser({
        browser: key,
        imgSrc: this.imgSrc
      }));
    }
  });

  return declare("parus.browserValidator", _WidgetBase, {

    imgSrc: "/support/",

    autoValidate: true,

    /*** [Object]
     * Можно переопределить браузер и его версию, с которой он перестает быть "не годится совсем".
     * По умолчанию к категории "не годится совсем" относятся IE < 8.
     * Например, validBrowserVersion: {ie: 11, ff: 24} */
    validBrowserVersion: null,

    postCreate: function() {
      this.autoValidate && this.validate();
    },

    validate: function() {
      var userAgent = window.navigator.userAgent,
          is7 = userAgent.indexOf("Windows NT 6.1") !== -1,
          is8 = userAgent.indexOf("Windows NT 6.2") !== -1,
          isEdge = userAgent.indexOf("Edge") !== -1,
          invalidBrowser = sniff("ie") < 8;

      if (this.validBrowserVersion !== null && lang.isObject(this.validBrowserVersion)) for (var key in this.validBrowserVersion) if (sniff(key) && sniff(key) < this.validBrowserVersion[key]) invalidBrowser = true;

      if (!invalidBrowser) if (sniff("webkit") >= 537 // последняя версия Chrome и Opera в XP
      || sniff("chrome") >= 49 // последняя версия Chrome в XP
      || sniff("ff") >= 52 // последняя версия FF в XP
      || (!sniff("ie") && sniff("trident")) // IE 11
      || (isEdge) // Edge
      || (sniff("mac") && sniff("safari"))) // Safari на Mac
      return 1;

      new _browserValidatorPad({
        invalidBrowser: invalidBrowser,
        offerBrowsers: {
          chrome: sniff("ie") ? sniff("ie") >= 8 : true,
          ff: true,
          opera: true,
          ie: (is7 || is8) ? sniff("ie") >= 8 : false
        },
        imgSrc: this.imgSrc
      }, domConstruct.create("div", {}, document.body, invalidBrowser ? "only" : "last")).startup();

      return invalidBrowser ? -1 : 0;
    }
  });
});