/** 
 * 浏览器兼容性，特性检查
 * 参考列表: http://kangax.github.io/compat-table/es6/
 * 同内核的不同的浏览器需要处理，比如qq浏览器登陆成功后，ie浏览器登陆页面会自动跳转到项目管理页面。因此项目管理页面也需要检测
*/
function checkSyntax() {
    'use strict';
    try {
        // 一些在词法、语法分析阶段就会报错的代码，必须要用window.Function或者eval包裹，否则直接报错且无法被捕获
        // 不使用eval的原因：https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval
        if (typeof window.Function === 'undefined') {
            return false;
        }

        // 声明
        Function('let a = 1;')();
        Function('const b = 1;')();
        Function('class A {}')();

        // 模板字符串
        Function('var a = 1; var str = `${a}`;')();

        // 对象简单表示
        Function("var foo = 'foo'; var simple = { foo, t() {} };")();

        // 对象属性表示
        Function("var attr = 'a'; var obj = {[attr]: 1}")();

        // 对象super
        Function('var proto = { p: 1 }; var obj = { superF() { return super.p } }; Object.setPrototypeOf(obj, proto)')();

        // 对象getter setter
        Function('var tObj = { get a() {}, set a(v) {} }')();

        // 扩展运算符
        Function('var obj = { foo: 1 }; var obj1 = { ...obj }; var arr = [1]; var arr1 = [...arr];')();

        // 解构
        Function('var obj = { foo: 1 }; var { foo } = obj; var arr = [1]; var [one] = arr;')();

        // 可选链 ?. es2020
        //Function('var obj = { a: { b: 1 } }; obj?.a?.b')();

        // of迭代
        Function('for (var i of [1]) {}')();

        // 默认参数
        Function('function defaultParams(a = 1) {}')();

        // rest参数
        Function('function restParams(...args) {}')();

        // arrow function
        Function('var arrowF = () => {};')();

        // generator function
        Function('function* gen() {}')();

        // async function es2017
        Function('async function tAsync() {}')();

        // Symbol Promise Set Map Proxy Reflect
        if (typeof Symbol === 'undefined' ||
            typeof Promise === 'undefined' ||
            typeof Set === 'undefined' ||
            typeof Map === 'undefined' ||
            typeof Proxy === 'undefined' ||
            typeof Reflect === 'undefined') {
            return false;
        }
        // buffer相关
        if (typeof ArrayBuffer === 'undefined' ||
            typeof Uint8Array === 'undefined' ||
            typeof DataView === 'undefined') {
            return false;
        }

        // 部分字符串方法
        var stringPrototypeFuncs = [
            'includes',
            'codePointAt',
            'normalize',
            'repeat',
            //'matchAll', es2020
            'padStart',
            'padEnd',
            //'trimStart', es2019
            //'trimEnd'
        ];
        var stringStaticFuncs = [
            'fromCodePoint',
            'raw'
        ];
        for (var i = 0; i < stringPrototypeFuncs.length; i++) {
            var f = stringPrototypeFuncs[i];
            if (!String.prototype[f]) {
                throw new SyntaxError('String.prototype ' + f);
            }
        }
        for (var i = 0; i < stringStaticFuncs.length; i++) {
            var f = stringStaticFuncs[i];
            if (!String[f]) {
                throw new SyntaxError('String ' + f);
            }
        }

        // 部分数组方法
        var arrayPrototypeFuncs = [
            'find',
            'findIndex',
            'fill',
            'keys',
            'values',
            'entries',
            //'flat', // es2019
            //'flatMap',
            'includes'
        ];
        var arrayStaticFuncs = [
            'from',
            'of'
        ];
        for (var i = 0; i < arrayPrototypeFuncs.length; i++) {
            var f = arrayPrototypeFuncs[i];
            if (!Array.prototype[f]) {
                throw new SyntaxError('Array.prototyp ' + f);
            }
        }
        for (var i = 0; i < arrayStaticFuncs.length; i++) {
            var f = arrayStaticFuncs[i];
            if (!Array[f]) {
                throw new SyntaxError('Array ' + f);
            }
        }

        // 对象部分方法
        var objectStaticFuncs = [
            'is',
            'assign',
            'getOwnPropertyDescriptors',
            'setPrototypeOf',
            'values',
            'entries',
            //'fromEntries' // es2020
        ];
        for (var i = 0; i < objectStaticFuncs.length; i++) {
            var f = objectStaticFuncs[i];
            if (!Object[f]) {
                throw new SyntaxError('Object ' + f);
            }
        }

        // DOM
        if (typeof document.documentElement.requestFullscreen !== 'function') {
            throw new TypeError('document.documentElement.requestFullscreen is not a function');
        }

    } catch (err) {
        console.log(err);
        return false;
    }
    return true;
}

function showBrowserTip() {
    var html = '<div class="modal fade" id="browser" data-backdrop="static">' +
        '<div class="modal-dialog modal-lg" role="document">' +
        '<div class="modal-content">' +
        '<div class="modal-body">' +
        '<h5>浏览器版本过低，可能会有安全风险；</h5>' +
        '<h5>请更新 「浏览器」 或者 使用 「纵横Z+造价工作平台」 登录。</h5>' +
        '<div class="row my-4">' +
        '<div class="col-6">' +
        '<div class="text-center"><a href="https://www.microsoft.com/zh-cn/edge" class="btn btn-primary" target="_blank">下载 Microsoft Edge</a></div>' +
        '</div>' +
        '<div class="col-6">' +
        '<div class="text-center"><a href="https://smartcost.com.cn/downloadzplus" class="btn btn-primary" target="_blank">下载 纵横Z+造价工作平台</a></div>' +
        '</div></div></div></div></div></div>';
    $('body').append(html);
    $('#browser').modal('show');
}

$(document).ready(function () {
    // 浏览器兼容性
    var isCompat = checkSyntax();
    if (!isCompat) {
        $('#inputEmail').blur();
        showBrowserTip();
        return false;
    }
});