define([], function() {
  // 定义引用元素
  var requireScript = document.getElementById('require');

  // 定义资源目录
  var assetsDir = 'assets/advance/';

  // 定义页面模块
  var pageModule = (requireScript && requireScript.getAttribute('data-module')) || 'main';

  /**
   * 获取模板相对路径
   * 
   * @returns {string} 模板路径
   * 
   */
  var templatePath = (function() {
    if (!requireScript) return '';

    var src = requireScript.getAttribute('src');
    var corePathIndex = src.indexOf('js/core/');

    if (corePathIndex > -1) {
      var basePath = src.substring(0, corePathIndex);

      if (basePath && basePath.charAt(basePath.length - 1) !== '/') {
        basePath += '/';
      }

      return basePath;
    }

    var lastSlashIndex = src.lastIndexOf('/');
    return lastSlashIndex > -1 ? src.substring(0, lastSlashIndex + 1) : '';
  })();

  /**
   * 获取浏览器信息
   * 
   * @returns {{isIE: boolean, version: number|string, name: string, fullInfo: string}} 信息对象
   * 
   */
  var browserInfo = (function() {
    var ua = navigator.userAgent.toLowerCase();
    var originalUA = navigator.userAgent;
    var isOpera = originalUA.indexOf('Opera') > -1 || originalUA.indexOf('OPR/') > -1;

    var browserInfo = {
      isIE: false,
      version: null,
      name: null,
      fullInfo: ua
    };

    if (originalUA.indexOf('Trident/') > -1 && originalUA.indexOf('rv:') > -1) {
      var rvMatch = /rv:(\d+(?:\.\d+)?)/.exec(originalUA);

      if (rvMatch) {
        browserInfo.isIE = true;
        browserInfo.name = 'Internet Explorer';
        browserInfo.version = parseInt(rvMatch[1], 10);
        return browserInfo;
      }
    }

    if (originalUA.indexOf('MSIE ') > -1 && !isOpera) {
      var msieMatch = /MSIE\s(\d+(?:\.\d+)?)/.exec(originalUA);

      if (msieMatch) {
        browserInfo.isIE = true;
        browserInfo.name = 'Internet Explorer';
        browserInfo.version = parseInt(msieMatch[1], 10);
        return browserInfo;
      }
    }

    var browserMatchers = [
      { name: '360 Browser', regex: /(?:360se|360ee)/ },
      { name: 'QQ Browser', regex: /(?:qq|mqqb)browser\/(\d+)/ },
      { name: 'UC Browser', regex: /(?:ucbrowser|uc)\/(\d+)/ },
      { name: 'Baidu Browser', regex: /baidu(?:hd|mobile)?\/(\d+)/ },
      { name: 'Samsung Browser', regex: /samsungbrowser\/(\d+)/ },
      { name: 'Edge-legacy', regex: /edge\/(\d+)/ },
      { name: 'Edge', regex: /edg\/(\d+)/ },
      { name: 'Opera', regex: /(?:opr|opera)\/(\d+)/ },
      { name: 'Chrome', regex: /chrome\/(\d+)/ },
      { name: 'Firefox', regex: /firefox\/(\d+)/ },
      { name: 'Safari', regex: /version\/(\d+).*?safari/ }
    ];

    for (var i = 0; i < browserMatchers.length; i++) {
      var match = ua.match(browserMatchers[i].regex);
      
      if (match) {
        browserInfo.name = browserMatchers[i].name;
        browserInfo.version = parseInt(match[1], 10);
        break;
      }
    }

    return browserInfo;
  })();

  /**
   * 监听页面加载事件
   * 
   * @param {Function} callback - 事件的回调函数
   * @returns {{remove: Function}|undefined} 提供移除监听器方法
   * 
   */
  function executePageLoaded(callback) {
    var isLegacy = !window.addEventListener;

    if (document.readyState === 'complete') {
      setTimeout(callback, 0);
      return;
    }

    if (isLegacy) {
      window.attachEvent('onload', callback);
    } else {
      window.addEventListener('load', callback, false);
    }

    return {
      remove: function() {
        if (isLegacy) {
          window.detachEvent('onload', callback);
        } else {
          window.removeEventListener('load', callback, false);
        }
      }
    };
  }

  /**
   * 渲染浏览器升级提示
   * 
   * @returns {void} 无返回值
   * 
   */
  function createUpdatePrompt() {
    var style = document.createElement('style');

    var cssText = 
      'html, body {position: relative; height: 100%; overflow: hidden; background-color: #f5faff; font-size: 16px; *height: 100%;}' +
      '.clearfix {*zoom: 1;}' +
      '.clearfix:after, .clearfix::after {content: ""; display: table; clear: both;}' +
      '.browser-compat {position: absolute; top: 50%; left: 50%; width: 920px; height: 320px; margin: -160px 0 0 -460px; -ms-user-select: none; user-select: none; *zoom: 1;}' +
      '.browser-compat__cover {float: left; padding: .625em 0; *display: inline;}' +
      '.browser-compat__cover img {width: 100%; max-width: 350px; *width: 350px; vertical-align: middle; -webkit-user-drag: none;}' +
      '.browser-compat__content {float: right; *display: inline;}' +
      '.browser-compat__title {font-size: 2.5em; line-height: 1.75; color: #042164; margin-bottom: .5em; *font-weight: 400;}' +
      '.browser-compat__text {font-size: 1.125em; line-height: 2; color: #585858;}' +
      '.browser-compat__highlight {display: inline-block; color: #002CCC; *display: inline; *zoom: 1;}' +
      '.browser-compat__list {margin: 1.5em -1.5em 0;}' +
      '.browser-compat__item {float: left; padding: 0 1.5em; *display: inline;}' +
      '.browser-compat__item a {display: block; text-align: center; text-decoration: none; color: #585858;}' +
      '.browser-compat__item a:hover {color: #002CCC;}' +
      '.browser-compat__item img {width: 100%; max-width: 68px; *width: 68px; margin-bottom: .375em;}' +
      '.browser-compat__item h4 {font-size: 1em; line-height: 1.5;}';

    document.getElementsByTagName('head')[0].appendChild(style);

    if (style.styleSheet) {
      style.styleSheet.cssText = cssText;
    } else {
      style.appendChild(document.createTextNode(cssText));
    }
    
    var browsers = [
      { name: 'Chrome', url: 'https://www.google.cn/intl/zh-CN/chrome', icon: 'chrome' },
      { name: 'Firefox', url: 'https://www.firefox.com/zh-CN', icon: 'firefox' },
      { name: 'Opera', url: 'https://www.opera.com/zh-cn/opera', icon: 'opera' },
      { name: 'Edge', url: 'https://www.microsoft.com/edge', icon: 'edge' }
    ];

    var browserListHTML = '';

    for (var i = 0; i < browsers.length; i++) {
      var browser = browsers[i];
      
      browserListHTML += 
        '<div class="browser-compat__item">' +
        '  <a rel="noreferrer" href="' + browser.url + '" target="_blank">' +
        '    <img src="' + templatePath + assetsDir + browser.icon + '.png" draggable="false" width="68" height="68" alt="' + browser.name + '" />' +
        '    <h4>' + browser.name + '</h4>' +
        '  </a>' +
        '</div>';
    }

    var modalHTML = 
      '<div class="browser-compat clearfix">' +
        '<div class="browser-compat__cover">' +
          '<img src="' + templatePath + assetsDir + 'compat.png" draggable="false" width="350" height="300" alt="Compat" />' +
        '</div>' +
        '<div class="browser-compat__content">' +
          '<div class="browser-compat__description">' +
            '<h3 class="browser-compat__title">您的浏览器不受支持</h3>' +
            '<p class="browser-compat__text">' +
              '您当前使用的浏览器版本' +
              '<span class="browser-compat__highlight">已过时或不再受支持。</span>' +
              '<br />' +
              '<span class="browser-compat__highlight">本网站的部分功能</span>' +
              '依赖现代浏览器技术才能正常运行。' +
              '<br />' +
              '请使用' +
              '<span class="browser-compat__highlight">现代浏览器</span>' +
              '，以确保完整使用网站服务。' +
            '</p>' +
          '</div>' +
          '<div class="browser-compat__list clearfix">' +
            browserListHTML +
          '</div>' +
        '</div>' +
      '</div>';

    document.body.innerHTML = modalHTML;
  }

  return {
    assetsDir: assetsDir,
    pageModule: pageModule,
    templatePath: templatePath,
    browserInfo: browserInfo,
    executePageLoaded: executePageLoaded,
    createUpdatePrompt: createUpdatePrompt
  };

});
