/* Js for , Version=1778995492 */
 if(typeof(v) != "object") v = {};v.theme = {"template":"default","theme":"wide","device":"desktop"};;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":"\u6267\u884c\u51fa\u9519\uff1a","continueShopping":"\u7ee7\u7eed\u8d2d\u7269","required":"\u5fc5\u586b","back":"\u8fd4\u56de","continue":"\u7ee7\u7eed","bindWechatTip":"\u53d1\u5e16\u529f\u80fd\u8bbe\u7f6e\u4e86\u7ed1\u5b9a\u5fae\u4fe1\u7684\u9650\u5236\uff0c\u8bf7\u5148\u7ed1\u5b9a\u5fae\u4fe1\u4f1a\u5458\u3002","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"};;v.pageID = 67;;
;v.pageLayout = "object";;$('#block288').insertAfter('#header');;/*
* Stacked Cards v1.1
* Created: Dec 2016
* Author: Juned Chhipa
*/

(function(){
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }

    this.stackedCards = (function() {
        stackedCards.prototype.defaults = {
            layout: 'slide',                     // slide, fanOut
            onClick: undefined,                 // onclick event provided
            transformOrigin: "center",          // css transformOrigin
        };

        function stackedCards(options) {
            if (options == null) {
                options = {};
            }

            this.draw = bind(this.draw, this);
            this.config = this.extend(options, this.defaults);
        }

        stackedCards.prototype.init = function () {
            this.element = window.document.documentElement;
            if ((ref = document.readyState) === "interactive" || ref === "complete") {
                this.draw();
            } else {
                document.addEventListener('DOMContentLoaded', this.draw);
            }
        }

        stackedCards.prototype.draw = function () {

            var me = this;

            var selector = this.config.selector;

            this.els = document.querySelectorAll(selector + " li");
            var els = this.els;

            this.parent = els[0].parentNode;

            // Sets height of cards adjusted to the height of the content of the tallest card
            var getItemHeight = me.getHeight().max; 
            els.forEach(item => item.style.height = parseInt(getItemHeight) + "px");
            
            // to get the active element's position, we will have to know if elements are in even/odd count
            var lenAdjust = (els.length%2==0 ? -2 : -1)
            
            // oneHalf if the centerPoint - things go left and right from here
            var oneHalf = (els.length+lenAdjust)/2;

            var activeTransform = "translate("+ -50 +"%, 0%)  scale(1)";

            this.detectSwipe(); 


            Array.prototype.forEach.call(els, function(el) {

                el.style.transformOrigin = me.config.transformOrigin;

                el.addEventListener("click", function() {

                    var clickedEl = el;
                    var nextCnt = 0;
                    var prevCnt = 0;

                    do  {
                        // While there is a next sibling, loop
                        var next = clickedEl.nextElementSibling;
                        nextCnt = nextCnt + 1;
                        
                    } while(clickedEl = clickedEl.nextElementSibling);
                    
                    // re-initialize the clickedEl to do the same for prev elements
                    clickedEl = el;

                    do {
                        // While there is a prev sibling, loop
                        var prev = clickedEl.previousElementSibling;
                        prevCnt = prevCnt + 1; 
                    } while(clickedEl = clickedEl.previousElementSibling);
                    
                    me.reCalculateTransformsOnClick(nextCnt - 1, prevCnt - 1)

                    me.loopNodeList(els, function(el) {
                        el.classList.remove("active");
                    })

                    el.classList.add("active");
                    el.classList.add(me.config.layout)

                    

                    el.style.zIndex = els.length*5;
                    el.style.transform = activeTransform;

                    if (me.config.onClick !== undefined) {
                         me.config.onClick(el);
                    }

                });
            });

            els[oneHalf].click();
              
        }

        stackedCards.prototype.getHeight = function() {

            var es = this.nodelistToArray(this.els);

            var elHeights = els.map(item => item.scrollHeight).sort((a, b)=>b-a);
            var maxHeight = elHeights[0];

            return { heights: elHeights, max: maxHeight };
        }

        stackedCards.prototype.reCalculateTransformsOnClick = function(nextCnt, prevCnt) {
            var me = this;
            var maxHeight = me.getHeight().max;
            var vertOffsets = me.getHeight().heights.map(item=> Math.round((( 1 - ( item / maxHeight )) * -100) ));
            
            var z = 10;

            var els = this.nodelistToArray(this.els);

            els[0].parentNode.style.height = parseInt(me.getHeight().max) + "px";

            var scale = 1, translateX = 0, rotateVal=0, rotate="";
            var rotateNegStart = 0// ((75 / els.length) * (oneHalf))*-1;

            var transformArr = [];
            var zIndexArr = [];
            var relArr = [];

            var layout = this.config.layout; 

            var maxCntDivisor = Math.max(prevCnt, nextCnt);
            var prevDivisor = 100 / (maxCntDivisor);
            var nextDivisor = 100 / (maxCntDivisor);
            
            if(prevCnt>nextCnt) {
                scale = 0 + (100 / (prevCnt+1))/100;
            }
            else {
                scale = 1 - ((prevCnt) *(1/(nextCnt+1)));
            }
                        
            var rotatePrevStart = ((prevCnt*10 / (prevCnt) * prevCnt))*-1;
            var rotateNextStart = ((nextCnt*10 / (nextCnt)));

            for(var i=0; i<prevCnt; i++) {
                switch(layout) {
                    case "slide":                        
                        if(i>0) {
                            scale = scale + (100 / (maxCntDivisor+1))/100;
                        }
                        
                        translateX = (-50 - ((prevDivisor)*(prevCnt-i)));
                        translateY = vertOffsets[i] / 2;

                        rotate = "rotate(0deg)";
                        break;
                    case "fanOut":
                        rotateVal = rotatePrevStart;

                        if(i>0) {
                            scale = scale + (100 / (maxCntDivisor+1))/100;
                        }
                        translateX = (-50 - ((prevDivisor)*(prevCnt-i)));
                        rotate = "rotate("+rotateVal+"deg)";

                        rotatePrevStart = rotatePrevStart + ((prevCnt*10) / prevCnt);

                        break;
                    default:
                        translateX = (150 - ((prevDivisor*2)*i)) * -1;
                        rotate = "rotate(0deg)";

                }

                var styleStr = "translate("+ translateX +"%, 0%)  scale("+scale+") " + rotate;
                
                z = z + 1;

                els[i].style.transform = styleStr;
                els[i].style.zIndex = z;

            }
            
            // we are going for active element, so make it higher
            z = z - 1;
            
            var j = 0;

            rotateNegStart = 0;
            scale = 1;
            for(var i=prevCnt+1; i<nextCnt+prevCnt+1; i++) {
                j = j + 1;
                switch(layout) {
                    case "slide":
                        scale = scale - (100 / (maxCntDivisor+1))/100;
                        translateX = (50 - ((nextDivisor)*(j))) * -1;
                        translateY = vertOffsets[i] / 2;

                        rotate = "rotate(0deg)";
                        break;
                    case "fanOut":
                        rotateVal = rotateNextStart;

                        scale = scale - (100 / (maxCntDivisor+1))/100;
                        translateX = (50 - ((nextDivisor)*(j))) * -1;
                        rotate = "rotate("+rotateVal+"deg)";

                        rotateNextStart = rotateNextStart + ((nextCnt*10) / nextCnt);
                        break;
                    default:
                        translateX = (50 - ((prevDivisor*2)*i)) * -1;
                        rotate = "rotate(0deg)";

                }

                z = z - 1;

                var styleStr = "translate("+ translateX +"%, 0%)  scale("+scale+") " + rotate;

                els[i].style.transform = styleStr;
                els[i].style.zIndex = z;
            }

    

        }

        stackedCards.prototype.detectSwipe = function() {
            var me = this;
            var regionEl = document.querySelector(me.config.selector);

            me.detectSwipeDir(regionEl, function(swipedir){
                var activeEl = document.querySelector(me.config.selector + " li.active");
                if (swipedir =='left') {
                    activeEl.nextElementSibling.click();
                }
                else if(swipedir=="right") {
                    activeEl.previousElementSibling.click();
                }
            })

        }

        stackedCards.prototype.extend = function(custom, defaults) {
            var key, value;
            for (key in defaults) {
                value = defaults[key];
                if (custom[key] == null) {
                  custom[key] = value;
                }
            }
            return custom;
        }

        stackedCards.prototype.nodelistToArray = function(nodelist) {
            var results = [];
            var i, element;
            for(i=0; i < nodelist.length; i++) {
                element = nodelist[i];
                results.push(element);
            }
            return results;
        }

        stackedCards.prototype.loopNodeList = function(els, callback, scope) {
            for (var i = 0; i < els.length; i++) {
                callback.call(scope, els[i])
            }
        }


        stackedCards.prototype.scrolledIn = function(el, offset) {
            if(typeof el == 'undefined') return;
  
            var elemTop = el.getBoundingClientRect().top;
            var elemBottom = el.getBoundingClientRect().bottom;

            var scrolledInEl = (elemTop >= 0) && (elemTop <= window.innerHeight);
            return scrolledInEl;

        }

        stackedCards.prototype.detectSwipeDir = function(el, callback) {
            
            //credits: http://www.javascriptkit.com/javatutors/touchevents2.shtml

            var touchsurface = el,
            swipedir,
            startX,
            startY,
            distX,
            distY,
            threshold = 75, //required min distance traveled to be considered swipe
            restraint = 100, // maximum distance allowed at the same time in perpendicular direction
            allowedTime = 300, // maximum time allowed to travel that distance
            elapsedTime,
            startTime,
            handleswipe = callback || function(swipedir){}
          
            touchsurface.addEventListener('touchstart', function(e){
                var touchobj = e.changedTouches[0]
                swipedir = 'none'
                dist = 0
                startX = touchobj.pageX
                startY = touchobj.pageY
                startTime = new Date().getTime() // record time when finger first makes contact with surface
                e.preventDefault()
            }, false)
          
            touchsurface.addEventListener('touchmove', function(e){
               // e.preventDefault() // prevent scrolling when inside DIV
            }, false)
          
            touchsurface.addEventListener('touchend', function(e){
                var touchobj = e.changedTouches[0]
                distX = touchobj.pageX - startX // get horizontal dist traveled by finger while in contact with surface
                distY = touchobj.pageY - startY // get vertical dist traveled by finger while in contact with surface
                elapsedTime = new Date().getTime() - startTime // get time elapsed
                if (elapsedTime <= allowedTime){ // first condition for awipe met
                    if (Math.abs(distX) >= threshold && Math.abs(distY) <= restraint){ // 2nd condition for horizontal swipe met
                        swipedir = (distX < 0)? 'left' : 'right' // if dist traveled is negative, it indicates left swipe
                    }
                    else if (Math.abs(distY) >= threshold && Math.abs(distX) <= restraint){ // 2nd condition for vertical swipe met
                        swipedir = (distY < 0)? 'up' : 'down' // if dist traveled is negative, it indicates up swipe
                    }
                }
                handleswipe(swipedir)
                e.preventDefault()
            }, false)

        }

        return stackedCards;

    })();
}).call(this);;$('#block284').insertBefore('#footer');;$().ready(function() { $('#execIcon').tooltip({title:$('#execInfoBar').html(), html:true, placement:'right'}); }); ;$(document).ready(function()
{
    $('.nav-page-' + v.pageID + ':first').addClass('active');
    $('#navbar li.active').parents('li').addClass('active');

    function basename(str)
    {
        var pos = str.lastIndexOf('/');
        return str.substring(pos + 1,str.length);
    }

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

;
$(document).ready(function()
{
    $('a[data-download=1]').each(function()
    {   
        link = window.btoa(window.encodeURIComponent($(this).attr('href')));
        fileName = window.btoa(window.encodeURIComponent($(this).text()));
        $(this).attr('data-toggle', 'modal').attr('href', createLink('misc', 'download', 'link=' + link + '&fileName=' + fileName));
    }); 
})
;
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});
