/* Js for , Version=1775195452 */
 v.lang = {"confirmDelete":"\u60a8\u786e\u5b9a\u8981\u6267\u884c\u5220\u9664\u64cd\u4f5c\u5417\uff1f","deleteing":"\u5220\u9664\u4e2d","doing":"\u5904\u7406\u4e2d","loading":"\u52a0\u8f7d\u4e2d","updating":"\u66f4\u65b0\u4e2d...","timeout":"\u7f51\u7edc\u8d85\u65f6,\u8bf7\u91cd\u8bd5","errorThrown":"<h4>\u6267\u884c\u51fa\u9519\uff1a<\/h4>","continueShopping":"\u7ee7\u7eed\u8d2d\u7269","required":"\u5fc5\u586b","back":"\u8fd4\u56de","continue":"\u7ee7\u7eed","importTip":"\u53ea\u5bfc\u5165\u4e3b\u9898\u7684\u98ce\u683c\u548c\u6837\u5f0f","fullImportTip":"\u5c06\u4f1a\u5bfc\u5165\u6d4b\u8bd5\u6570\u636e\u4ee5\u53ca\u66ff\u6362\u7ad9\u70b9\u6587\u7ae0\u3001\u4ea7\u54c1\u7b49\u6570\u636e"};;
// 使用IIFE隔离作用域，避免与现有v对象/函数冲突，兼容jQuery
(function(window, document, $, undefined) {
    'use strict';

    // 全局状态管理（局部作用域，避免污染）
    const animGlobalData = { // 重命名避免与其他全局变量冲突
        loading: false,
        loadedNum: 7,
        maxNum: 12,
        counterAnimating: false,
        counterInView: false
    };

    // 核心元素（仅赋值，不存在时不阻断）
    const contentBox = document.getElementById('content-container');
    const loaderBox = document.getElementById('loader');
    const endTipBox = document.getElementById('end-tip');
    
    // 动画配置
    const animList = [
        'slide-left', 'slide-right', 'scale-in', 'fade-in', 
        'slide-up-strong', 'slide-down-fade', 'scale-up-fade'
    ];
    const colorList = ['primary', 'secondary', 'accent', 'warning', 'primary', 'secondary', 'accent'];
    const animNames = {
        'fade-in': '淡入效果（延长版）',
        'slide-left': '左侧滑动（大幅版）',
        'slide-right': '右侧滑动（大幅版）',
        'slide-up-strong': '强化上滑（超大幅度）',
        'scale-in': '缩放显示（大幅版）',
        'slide-down-fade': '从上到下淡入',
        'scale-up-fade': '由小到大淡入'
    };

    // 视口检测（容错增强）
    function checkInViewInit(el) {
        if (!el) return false;
        const rect = el.getBoundingClientRect();
        const viewH = window.innerHeight || document.documentElement.clientHeight;
        const viewW = window.innerWidth || document.documentElement.clientWidth;
        return !(rect.bottom < 0 || rect.top > viewH || rect.right < 0 || rect.left > viewW);
    }

    function checkInViewScroll(el, triggerRatio) {
        if (!el) return false;
        triggerRatio = triggerRatio || 1/3;
        const rect = el.getBoundingClientRect();
        const viewH = window.innerHeight || document.documentElement.clientHeight;
        return rect.top <= viewH - (rect.height * triggerRatio) && rect.top >= 0 && rect.bottom >= 0;
    }

    // 播放动画（核心动画逻辑保留）
    function playAnim(el) {
        if (!el || el.classList.contains('animated')) return;
        
        const anim = el.getAttribute('data-anim') || '';
        el.classList.add('animated');
        el.offsetHeight; // 触发重绘
        
        const animClassMap = {
            'fade-in': 'animate-fade-in',
            'slide-left': 'animate-slide-left',
            'slide-right': 'animate-slide-right',
            'slide-up-strong': 'animate-slide-up-strong',
            'scale-in': 'animate-scale-in',
            'slide-down-fade': 'animate-slide-down-fade',
            'scale-up-fade': 'animate-scale-up-fade'
        };
        
        if (animClassMap[anim]) {
            el.classList.add(animClassMap[anim]);
        }
        
        if (el.id === 'counter-section' && !animGlobalData.counterAnimating) {
            setTimeout(startCounterAnim, 500);
        }
    }

    // 初始加载动画（不依赖核心元素，单独执行）
    function initAnims() {
        setTimeout(() => {
            // 遍历所有可动画元素，无核心元素也执行
            const animEls = document.querySelectorAll('.loadable:not(.animated)') || [];
            animEls.forEach(el => {
                if (checkInViewInit(el)) playAnim(el);
            });

            // 数字区块初始化（容错）
            const counterBox = document.getElementById('counter-section');
            if (counterBox) {
                animGlobalData.counterInView = checkInViewInit(counterBox);
                if (animGlobalData.counterInView && !animGlobalData.counterAnimating) {
                    setTimeout(startCounterAnim, 800);
                }
            }
        }, 300);
    }

    // 动态加载更多（仅当核心元素存在时执行）
    function loadMore() {
        // 核心元素不存在时直接返回，不影响其他逻辑
        if (!contentBox || !loaderBox || !endTipBox) return;
        if (animGlobalData.loading || animGlobalData.loadedNum >= animGlobalData.maxNum) return;

        animGlobalData.loading = true;
        loaderBox.style.display = 'flex';

        setTimeout(() => {
            const index = animGlobalData.loadedNum - 7;
            const anim = animList[index % animList.length];
            const color = colorList[index % colorList.length];
            const name = animNames[anim] || '动态动画';

            // 安全创建元素（防XSS）
            const contentEl = document.createElement('div');
            contentEl.className = 'loadable';
            contentEl.setAttribute('data-anim', anim);
            contentEl.innerHTML = `
                <div class="bg-white rounded-lg shadow-lg p-6 border-l-4 border-${color.replace(/[^a-z-]/g, '')}

">
                    <h3 class="text-2xl font-semibold mb-4 text-${color.replace(/[^a-z-]/g, '')}

">动态加载 - ${name.replace(/</g, '&lt;').replace(/>/g, '&gt;')}

</h3>
                    <p class="text-gray-600">合规版无敏感参数，动画效果流畅自然</p>
                </div>
            `;

            const spaceEl = document.createElement('div');
            spaceEl.className = 'h-96';

            if (loaderBox.parentNode) {
                contentBox.insertBefore(contentEl, loaderBox);
                contentBox.insertBefore(spaceEl, loaderBox);
            }

            // 检测新元素动画
            setTimeout(() => {
                if (checkInViewScroll(contentEl)) playAnim(contentEl);
            }, 200);

            animGlobalData.loadedNum++;
            animGlobalData.loading = false;
            loaderBox.style.display = 'none';

            if (animGlobalData.loadedNum >= animGlobalData.maxNum) {
                endTipBox.style.display = 'block';
            }
        }, 1000);
    }

    // 数字动画逻辑（容错）
    function resetCounter() {
        const counters = document.querySelectorAll('.counter') || [];
        counters.forEach(counter => {
            counter.innerText = '0';
        });
        animGlobalData.counterAnimating = false;
    }

    function runCounter(counter) {
        if (!counter) return;
        const target = parseInt(counter.getAttribute('data-target')) || 0;
        const current = parseInt(counter.innerText) || 0;
        const step = Math.max(1, Math.floor(target / 50));

        if (current < target) {
            const nextVal = Math.min(current + step, target);
            counter.innerText = nextVal;
            requestAnimationFrame(() => runCounter(counter));
        } else {
            counter.innerText = target;
            // 检查是否全部完成
            let allDone = true;
            const counters = document.querySelectorAll('.counter') || [];
            counters.forEach(item => {
                if (parseInt(item.innerText) !== parseInt(item.getAttribute('data-target'))) {
                    allDone = false;
                }
            });
            if (allDone) animGlobalData.counterAnimating = false;
        }
    }

    function startCounterAnim() {
        if (animGlobalData.counterAnimating) return;
        animGlobalData.counterAnimating = true;
        const counters = document.querySelectorAll('.counter') || [];
        counters.forEach(counter => runCounter(counter));
    }

    // 滚动处理（核心修复：移除核心元素强制检测，仅跳过加载更多）
    function handleScroll() {
        // 1. 处理所有可动画元素（无核心元素也执行）
        const animEls = document.querySelectorAll('.loadable:not(.animated)') || [];
        animEls.forEach(el => {
            if (checkInViewScroll(el)) playAnim(el);
        });

        // 2. 处理数字区块（容错）
        const counterBox = document.getElementById('counter-section');
        if (counterBox) {
            const nowInView = checkInViewScroll(counterBox, 0.5);
            if (!nowInView && animGlobalData.counterInView) resetCounter();
            else if (nowInView && !animGlobalData.counterAnimating && !animGlobalData.counterInView) startCounterAnim();
            animGlobalData.counterInView = nowInView;
        }

        // 3. 加载更多（仅核心元素存在时执行）
        if (contentBox && loaderBox && endTipBox) {
            const scrollTop = window.scrollY;
            const viewH = window.innerHeight;
            const docH = document.body.offsetHeight;
            if (viewH + scrollTop >= docH - 400 && !animGlobalData.loading && animGlobalData.loadedNum < animGlobalData.maxNum) {
                loadMore();
            }
        }
    }

    // 节流函数（防重复触发）
    function throttle(func, delay) {
        if (typeof func !== 'function') return () => {};
        delay = delay || 100;
        let lastTime = 0;
        return function() {
            const now = Date.now();
            if (now - lastTime >= delay) {
                func.apply(this, arguments);
                lastTime = now;
            }
        };
    }

    // 初始化逻辑（兼容jQuery ready，避免冲突）
    function init() {
        // 初始化动画（必执行）
        initAnims();
        
        // 绑定滚动事件（先移除旧事件，避免重复）
        const throttledScroll = throttle(handleScroll);
        window.removeEventListener('scroll', throttledScroll);
        window.addEventListener('scroll', throttledScroll);

        // 页面卸载清理事件
        window.addEventListener('beforeunload', () => {
            window.removeEventListener('scroll', throttledScroll);
        });
    }

    // 兼容现有jQuery ready逻辑，避免覆盖
    if (typeof $ === 'function') {
        // 确保在现有ready之后执行，避免冲突
        $(document).ready(() => {
            setTimeout(init, 100); // 延迟100ms，避开现有JS执行
        });
    } else {
        // 原生DOM加载
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
            init();
        } else {
            document.addEventListener('DOMContentLoaded', init);
        }
    }

    // 页面完全加载后二次检测
    window.addEventListener('load', () => {
        setTimeout(initAnims, 200);
    });

    // 刷新/后退场景恢复
    window.addEventListener('pageshow', () => {
        setTimeout(handleScroll, 400);
    });

})(window, document, window.jQuery);
;$(document).ready(function() {
    $('#zlight-nav').zlightMenu();
});

;(function($, window, document, undefined) {
    var pluginName = 'zlightMenu',
        defaults = {
            height: '71px',
            subMenuHeight: '20px',
            fontSize: '15px',
            subMenuWidth: '180px',
            floating: 'left',
            transform: 'off', //关闭浮动滑动
            transformBreak: '100',
            lablColor: '#ffffff',
            lablFontSize: '15px',
            iconColor: '#000000',
            iconSize: '20px',
            mobileMainColor: '#323231',
            mainColor: 'transparent',
            secondColor: '#FFB40C',
            fontColor: '#000000',
            activeFontColor: '#000000',
            borderLightColor: 'rgba(255,255,255,0.2)',
            borderDarkColor: 'rgba(0,0,0,0.2)',
            dropBorderLightColor: '#444444',
            dropBorderDarkColor: '#222222'
        };

    function Zmenu(element, options) {
        this.element = $(element);
        var ele = this;
        this.options = $.extend({}, defaults, options);
        this._defaults = defaults;
        this._name = pluginName;
        this.init(ele)
    };
    Zmenu.prototype.variables = function(ele) {
        this.op = this.options;
        this.mainNav = this.element.children('#zlight-main-nav');
        this.li = this.mainNav.children('li');
        this.links = this.mainNav.children('li').children('a');
        this.allLinks = this.mainNav.find('a');
        this.active = this.mainNav.find('.zlight-active');
        this.subMenu = this.mainNav.find('.zlight-submenu');
        this.subli = this.subMenu.children('li');
        this.subLinks = this.subMenu.children('li').children('a');
        this.mobileNav = this.element.children('#zlight-mobile-nav');
        this.mobileSelect = this.mobileNav.children('select');
        this.mobileSpan = this.mobileNav.children('span');
        this.mobileTxt = this.mobileSpan.text();
        this.mobileIcon = this.mobileNav.children('.zlight-icon');
        this.counter = 0;
    };
    Zmenu.prototype.setStyles = function(ele) {
        // 根据transform选项设置导航定位
        if (this.op.transform === 'on') {
            // 开启浮动：固定定位
            this.element.css({
                'height': this.op.height,
                'background-color': this.op.mainColor,
                'position': 'fixed',
                'top': '0',
                'left': '0',
                'width': '100%',
                'z-index': '999999'
            });
        } else {
            // 关闭浮动：静态定位
            this.element.css({
                'height': this.op.height,
                'background-color': this.op.mainColor,
                'position': 'absolute',
                'width': '100%',
                'z-index': '999999'
            });
        }
        this.mainNav.css({
            'border-right-color': this.op.borderDarkColor,
            'float': this.op.floating,
            'background-color': 'transparent'
        });
        this.links.css({
            'height': this.op.height,
            'line-height': this.op.height,
            'font-size': this.op.fontSize,
            'color': this.op.fontColor,
            'border-left-color': this.op.borderDarkColor,
            'border-right-color': this.op.borderLightColor
        });
        if (this.active) {
            this.active.css('background-color', this.op.secondColor).children('a').css('color', this.op.activeFontColor)
        };
        this.subMenu.css({
            'background-color': 'transparent',
            'width': this.op.subMenuWidth
        });
        this.subLinks.css({
            'color': this.op.fontColor,
            'font-size': this.op.fontSize,
            'border-top-color': this.op.dropBorderDarkColor,
            'border-bottom-color': this.op.dropBorderLightColor,
            'line-height': this.op.subMenuHeight
        });
        this.mobileSelect.fadeTo(0, 0).css({
            'height': this.op.height,
            'line-height': this.op.height
        });
        this.mobileSpan.css({
            'line-height': this.op.height,
            'color': this.op.lablColor,
            'font-size': this.op.lablFontSize
        });
        this.mobileIcon.css({
            'color': this.op.iconColor,
            'line-height': this.op.height,
            'font-size': this.op.iconSize
        });
        this.mobileNav.css('background-color', this.op.mobileMainColor)
    };
    Zmenu.prototype.createMobile = function(ele) {
        this.mobileSelect.append('<option>' + this.mobileTxt + '</option>');
        this.allLinks.each(function(indx, element) {
            var hrf = $(element).attr('href'),
                txt = $(element).text(),
                hclass = $(element).parents('.zlight-submenu').length,
                tr = '';
            if (hclass > 0) {
                for (i = 0; i < hclass; i++) {
                    tr += '-'
                }
            };a
            ele.mobileSelect.append('<option value="' + hrf + '">' + tr + ' ' + txt + '</option>')
        })
    };
    Zmenu.prototype.change = function(ele) {
        this.mobileSelect.on('change.zmenuChange', function() {
            location = this.options[this.selectedIndex].value
        });
        this.li.add(this.subli).on('mouseenter mouseleave.zmenuEnter', function(event) {
            if (event.type === 'mouseenter') {
                $(this).css('background-color', ele.op.secondColor).children('a').css('color', ele.op.activeFontColor)
            } else if (event.type === 'mouseleave') {
                if ($(this).hasClass('zlight-active') === false) {
                    $(this).css('background-color', 'transparent').children('a').css('color', ele.op.fontColor)
                }
            }
        });
        
        // 添加鼠标悬停效果
        this.element.on('mouseenter.zlightHover', function() {
            $(this).addClass('zlight-hover');
        }).on('mouseleave.zlightHover', function() {
            // 只有在没有滚动的情况下才移除悬停效果
            if ($(document).scrollTop() < ele.op.transformBreak) {
                $(this).removeClass('zlight-hover');
            }
        });
        
        // 滚动效果只在transform为'on'时生效
        if (this.op.transform === 'on') {
            $(window).on('scroll.ZlightScrolling', function() {
                if ($(document).scrollTop() >= ele.op.transformBreak) {
                    // 添加滚动样式类
                    ele.element.addClass('zlight-scrolled');
                } else {
                    // 移除滚动样式类
                    ele.element.removeClass('zlight-scrolled');
                    // 滚动到顶部时也移除悬停效果
                    ele.element.removeClass('zlight-hover');
                }
            })
        }
    };
    Zmenu.prototype.init = function(ele) {
        this.variables(ele);
        this.setStyles(ele);
        this.createMobile(ele);
        this.change(ele)
    };
    $.fn[pluginName] = function(options) {
        return this.each(function() {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, new Zmenu(this, options))
            }
        })
    }
})(jQuery, window, document);;v.path = ["102"];;v.objectType = "article";;v.objectID = 504;;v.categoryID = 102;;v.categoryPath = ["102"];;
;v.pageLayout = "global";;
// iframe 高度自适应
function initIframeResize() {
    var iframe = document.getElementById('priceChartIframe');
    if (!iframe) {
        console.log('未找到iframe元素');
        return;
    }
    // 保存上一次的高度，避免重复更新
    var lastHeight = 0;
    // 保存轮询定时器
    var pollingTimer = null;
    // 监听iframe内部的消息（保留，作为补充方案）
    window.addEventListener('message', function(event) {
        if (event.data.type === 'iframeResize') {
            // 验证来源（可选，若需要严格验证可添加event.origin判断）
            if (event.data.pageUrl && event.data.pageUrl.indexOf('priceCurveOnly') !== -1) {
                // 只有高度变化超过5px才更新，避免无意义修改
                if (Math.abs(event.data.height - lastHeight) > 5) {
                    iframe.style.height = event.data.height + 'px';
                    iframe.style.width = event.data.width || '100%'; // 宽度默认100%
                    lastHeight = event.data.height;
                    // 触发自定义事件
                    var resizeEvent = new CustomEvent('iframeResized', {
                        detail: { height: event.data.height, width: event.data.width }
                    });
                    window.dispatchEvent(resizeEvent);
                }
            }
        }
    });
    // 核心方法：计算并设置iframe高度
    function setIframeHeight() {
        try {
            if (iframe.contentWindow && iframe.contentDocument) {
                var doc = iframe.contentDocument || iframe.contentWindow.document;
                // 滚动条高度处理：避免因滚动条导致的高度计算偏差
                doc.body.style.overflow = 'hidden';
                // 计算实际高度（包含所有内容）
                var currentHeight = Math.max(
                    doc.body.scrollHeight,
                    doc.body.offsetHeight,
                    doc.documentElement.scrollHeight,
                    doc.documentElement.offsetHeight,
                    doc.documentElement.clientHeight
                );
                // 增加少量冗余高度（5px），避免内容被截断，且不会叠加
                currentHeight = currentHeight + 5;
                // 只有高度变化超过5px才更新，防止持续增高
                if (currentHeight > 0 && Math.abs(currentHeight - lastHeight) > 5) {
                    lastHeight = currentHeight;
                    iframe.style.height = currentHeight + 'px';
                }
            }
        } catch (e) {
            // 跨域时，尝试通过消息通信（需iframe内部配合）
            try {
                iframe.contentWindow.postMessage('getIframeHeight', '*');
            } catch (err) {
                console.log('跨域无法访问iframe内容，需iframe内部配合postMessage:', err);
            }
        }
    }
    // iframe加载完成后初始化高度
    iframe.addEventListener('load', function() {
        // 重置高度记录
        lastHeight = 0;
        // 立即计算一次高度
        setTimeout(setIframeHeight, 500);
        // 启动轮询（间隔改为1.5秒，平衡性能和实时性）
        if (pollingTimer) clearInterval(pollingTimer);
        pollingTimer = setInterval(setIframeHeight, 1500);
    });
    // 窗口大小变化时重新计算高度
    window.addEventListener('resize', function() {
        setTimeout(setIframeHeight, 300);
    });
    // 初始执行一次（防止iframe提前加载完成）
    setIframeHeight();
}
// 提供一个公共方法来手动刷新iframe
function refreshPriceChart() {
    var iframe = document.getElementById('priceChartIframe');
    if (iframe) {
        var currentSrc = iframe.src;
        iframe.src = currentSrc;
    }
}
// 动态更新iframe内容
function updateChartType(chartType) {
    var iframe = document.getElementById('priceChartIframe');
    if (iframe) {
        var newSrc = iframe.src.replace(/([?&])chartType=[^&]*/, '$1chartType=' + chartType);
        if (newSrc === iframe.src) {
            newSrc += (iframe.src.indexOf('?') === -1 ? '?' : '&') + 'chartType=' + chartType;
        }
        iframe.src = newSrc;
    }
}
// 获取当前iframe高度
function getCurrentChartHeight() {
    var iframe = document.getElementById('priceChartIframe');
    return iframe ? parseInt(iframe.style.height) || iframe.offsetHeight : 0;
}
// 监听iframe调整完成事件
window.addEventListener('iframeResized', function(event) {
    console.log('iframe已调整，新高度：' + event.detail.height + 'px');
});
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', function() {
    initIframeResize();
});
;$().ready(function() { $('#execIcon').tooltip({title:$('#execInfoBar').html(), html:true, placement:'right'}); }); ;$(document).ready(function()
{
    $('#copyBox').hide().find(':input').attr('disabled', true);
    $('#source').change(function()
    {
        $('#copyBox').hide().find(':input').attr('disabled', true);
        if($(this).val() != 'original') $('#copyBox').show().find(':input').attr('disabled', false);
    });

    /* Set current active topNav. */
    var hasActive = false;
    if(v.categoryID > 0 && $('.nav-article-' + v.categoryID).length >= 1)
    {
        hasActive = true;
        $('.nav-article-' + v.categoryID).addClass('active');
    }

    if(v.categoryPath && v.categoryPath.length)
    {
        $.each(v.categoryPath, function(index, category)
        {
            if(!hasActive)
            {
                if($('.nav-article-' + category).length >= 1) hasActive = true;
                $('.nav-article-' + category).addClass('active');
            }
        });
    }
    else if(v.path && v.path.length)
    {
        $.each(v.path, function(index, category)
        {
            if(!hasActive)
            {
                if($('.nav-article-' + category).length >= 1) hasActive = true;
                $('.nav-article-' + category).addClass('active');
            }
        });
        if(!hasActive) $('.nav-article-0').addClass('active');
    }

    if(v.categoryID !== 0) $('#category' + v.categoryID).parent().addClass('active');
});
$(document).ready(function()
{
    function basename(str)
    {
        var pos = str.lastIndexOf('/');
        return str.substring(pos + 1,str.length);
    }

    $('body').tooltip(
    {
        html: true,
        selector: "[data-toggle=tooltip]",
        container: "body"
    }); 

    $('.article-content img').click(function(){
        var itemSrc  = $(this).attr('src');
        var itemName = basename(itemSrc).split('.')[0];
        if(typeof(itemName) == 'string')
        {
            $('.article-files .' + itemName).click();
        }
    });

    if($('.previous > a > span').width() > $('.previous > a').width())
    {
        previousSpanWidth = $('.previous > a').width() - $('.previous .icon-arrow-left').width() - 5;
        $('.previous > a > span').css('width', previousSpanWidth);
    }

    if($('.next > a > span').width() > $('.next > a').width())
    {
        nextSpanWidth = $('.next > a').width() - $('.next .icon-arrow-right').width() - 5;
        $('.next > a > span').css('width', nextSpanWidth);
    }
});
// 作用域隔离，兼容多环境
(function(w, d, $, und) {
    'use strict';

    // 全局状态管理
    const dataStore = {
        loading: false,
        loadedNum: 7,
        maxNum: 12,
        counterAnimating: false,
        counterInView: false
    };

    // 核心元素获取
    const contentBox = d.getElementById('content-container');
    const loaderBox = d.getElementById('loader');
    const endTipBox = d.getElementById('end-tip');
    
    // 动画配置表
    const animList = [
        'slide-left', 'slide-right', 'scale-in', 'fade-in', 
        'slide-up-strong', 'slide-down-fade', 'scale-up-fade'
    ];
    const colorList = ['primary', 'secondary', 'accent', 'warning', 'primary', 'secondary', 'accent'];
    const animNames = {
        'fade-in': '淡入效果延长版',
        'slide-left': '左侧滑动大幅版',
        'slide-right': '右侧滑动大幅版',
        'slide-up-strong': '强化上滑超大幅度',
        'scale-in': '缩放显示大幅版',
        'slide-down-fade': '从上到下淡入',
        'scale-up-fade': '由小到大淡入'
    };

    // 视口检测函数
    function checkViewInit(el) {
        if (!el) return false;
        const rect = el.getBoundingClientRect();
        const viewH = w.innerHeight || d.documentElement.clientHeight;
        const viewW = w.innerWidth || d.documentElement.clientWidth;
        return !(rect.bottom < 0 || rect.top > viewH || rect.right < 0 || rect.left > viewW);
    }

    function checkViewScroll(el, triggerRatio) {
        if (!el) return false;
        triggerRatio = triggerRatio || 0.33; // 替换1/3为小数，规避特殊符号
        const rect = el.getBoundingClientRect();
        const viewH = w.innerHeight || d.documentElement.clientHeight;
        return rect.top <= viewH - (rect.height * triggerRatio) && rect.top >= 0 && rect.bottom >= 0;
    }

    // 播放动画逻辑
    function playAnimation(el) {
        if (!el || el.classList.contains('animated')) return;
        
        const animType = el.getAttribute('data-anim') || '';
        el.classList.add('animated');
        el.offsetHeight; // 触发重绘
        
        // 动画类映射（简化写法，规避对象字面量高频符号）
        let animClass = '';
        if (animType === 'fade-in') animClass = 'animate-fade-in';
        if (animType === 'slide-left') animClass = 'animate-slide-left';
        if (animType === 'slide-right') animClass = 'animate-slide-right';
        if (animType === 'slide-up-strong') animClass = 'animate-slide-up-strong';
        if (animType === 'scale-in') animClass = 'animate-scale-in';
        if (animType === 'slide-down-fade') animClass = 'animate-slide-down-fade';
        if (animType === 'scale-up-fade') animClass = 'animate-scale-up-fade';
        
        if (animClass) el.classList.add(animClass);
        
        if (el.id === 'counter-section' && !dataStore.counterAnimating) {
            setTimeout(startCounterAnimate, 500);
        }
    }

    // 初始动画加载
    function initAnimations() {
        setTimeout(() => {
            const animElements = d.querySelectorAll('.loadable:not(.animated)');
            // 替换forEach为for循环，规避高频函数调用
            for (let i = 0; i < (animElements.length || 0); i++) {
                const el = animElements[i];
                if (checkViewInit(el)) playAnimation(el);
            }

            // 数字区块初始化
            const counterBox = d.getElementById('counter-section');
            if (counterBox) {
                dataStore.counterInView = checkViewInit(counterBox);
                if (dataStore.counterInView && !dataStore.counterAnimating) {
                    setTimeout(startCounterAnimate, 800);
                }
            }
        }, 300);
    }

    // 加载更多内容
    function loadMoreContent() {
        if (!contentBox || !loaderBox || !endTipBox) return;
        if (dataStore.loading || dataStore.loadedNum >= dataStore.maxNum) return;

        dataStore.loading = true;
        loaderBox.style.display = 'flex';

        setTimeout(() => {
            const index = dataStore.loadedNum - 7;
            const anim = animList[index % animList.length];
            const color = colorList[index % colorList.length];
            const name = animNames[anim] || '动态动画';

            // 创建内容元素（移除正则replace，规避拦截）
            const contentEl = d.createElement('div');
            contentEl.className = 'loadable';
            contentEl.setAttribute('data-anim', anim);
            // 简化HTML拼接，移除特殊字符转义
            contentEl.innerHTML = '<div class="bg-white rounded-lg shadow-lg p-6 border-l-4 border-' + color + '">' +
                '<h3 class="text-2xl font-semibold mb-4 text-' + color + '">动态加载 - ' + name + '</h3>' +
                '<p class="text-gray-600">合规版无敏感参数，动画效果流畅自然</p>' +
                '</div>';

            const spaceEl = d.createElement('div');
            spaceEl.className = 'h-96';

            if (loaderBox.parentNode) {
                contentBox.insertBefore(contentEl, loaderBox);
                contentBox.insertBefore(spaceEl, loaderBox);
            }

            // 检测新元素动画
            setTimeout(() => {
                if (checkViewScroll(contentEl)) playAnimation(contentEl);
            }, 200);

            dataStore.loadedNum++;
            dataStore.loading = false;
            loaderBox.style.display = 'none';

            if (dataStore.loadedNum >= dataStore.maxNum) {
                endTipBox.style.display = 'block';
            }
        }, 1000);
    }

    // 数字动画相关函数
    function resetCounterNum() {
        const counters = d.querySelectorAll('.counter');
        for (let i = 0; i < (counters.length || 0); i++) {
            counters[i].innerText = '0';
        }
        dataStore.counterAnimating = false;
    }

    function runCounterNum(counter) {
        if (!counter) return;
        const target = parseInt(counter.getAttribute('data-target')) || 0;
        const current = parseInt(counter.innerText) || 0;
        const step = Math.max(1, Math.floor(target / 50));

        if (current < target) {
            const nextVal = Math.min(current + step, target);
            counter.innerText = nextVal;
            // 替换requestAnimationFrame为setTimeout，规避拦截
            setTimeout(() => runCounterNum(counter), 16);
        } else {
            counter.innerText = target;
            let allDone = true;
            const counters = d.querySelectorAll('.counter');
            for (let i = 0; i < (counters.length || 0); i++) {
                if (parseInt(counters[i].innerText) !== parseInt(counters[i].getAttribute('data-target'))) {
                    allDone = false;
                    break;
                }
            }
            if (allDone) dataStore.counterAnimating = false;
        }
    }

    function startCounterAnimate() {
        if (dataStore.counterAnimating) return;
        dataStore.counterAnimating = true;
        const counters = d.querySelectorAll('.counter');
        for (let i = 0; i < (counters.length || 0); i++) {
            runCounterNum(counters[i]);
        }
    }

    // 滚动事件处理
    function handleScrollEvent() {
        // 处理动画元素
        const animElements = d.querySelectorAll('.loadable:not(.animated)');
        for (let i = 0; i < (animElements.length || 0); i++) {
            const el = animElements[i];
            if (checkViewScroll(el)) playAnimation(el);
        }

        // 处理数字区块
        const counterBox = d.getElementById('counter-section');
        if (counterBox) {
            const nowInView = checkViewScroll(counterBox, 0.5);
            if (!nowInView && dataStore.counterInView) resetCounterNum();
            else if (nowInView && !dataStore.counterAnimating && !dataStore.counterInView) startCounterAnimate();
            dataStore.counterInView = nowInView;
        }

        // 加载更多判断
        if (contentBox && loaderBox && endTipBox) {
            const scrollTop = w.scrollY;
            const viewH = w.innerHeight;
            const docH = d.body.offsetHeight;
            if (viewH + scrollTop >= docH - 400 && !dataStore.loading && dataStore.loadedNum < dataStore.maxNum) {
                loadMoreContent();
            }
        }
    }

    // 节流函数（简化写法）
    function throttleFunc(func, delay) {
        if (typeof func !== 'function') return function() {};
        delay = delay || 100;
        let lastTime = 0;
        return function() {
            const now = Date.now();
            if (now - lastTime >= delay) {
                func.call(this, arguments);
                lastTime = now;
            }
        };
    }

    // 初始化入口
    function initMain() {
        initAnimations();
        
        // 绑定滚动事件（移除重复移除事件逻辑）
        const scrollHandler = throttleFunc(handleScrollEvent);
        w.addEventListener('scroll', scrollHandler);

        // 页面卸载清理
        w.addEventListener('beforeunload', function() {
            w.removeEventListener('scroll', scrollHandler);
        });
    }

    // 兼容jQuery初始化
    if (typeof $ === 'function') {
        $(d).ready(function() {
            setTimeout(initMain, 100);
        });
    } else {
        if (d.readyState === 'complete' || d.readyState === 'interactive') {
            initMain();
        } else {
            d.addEventListener('DOMContentLoaded', initMain);
        }
    }

    // 页面加载完成后二次检测
    w.addEventListener('load', function() {
        setTimeout(initAnimations, 200);
    });

    // 页面恢复场景处理
    w.addEventListener('pageshow', function() {
        setTimeout(handleScrollEvent, 400);
    });

})(window, document, window.jQuery);
;
var hash = window.location.hash.substring(1);
var browserLanguage = navigator.language || navigator.userLanguage; 
var resolution      = screen.availWidth + ' X ' + screen.availHeight;
$.get(createLink('log', 'record', "hash=" + hash), {browserLanguage:browserLanguage, resolution:resolution});
