﻿$(function() {
    var vddElements    = $('.vdd-element');
    var vddKey         = $('meta[name="vdd-key"]').attr('content');
    var vddMode        = $('meta[name="vdd-mode"]').attr('content');
    var vddUrl         = '//res43.traffer.net/code/video-steam/?id='+ vddKey;
    if (!vddKey) vddUrl='';
    var vddMovie       = false;
    var vddInterval = {};

    var vddImpressions = [];
    var vddError = false;
    
    var vddSkipoffset = 10;

    var vddTrackEvents = {
        creativeView  : [],
        start         : [],
        firstQuartile : [],
        midpoint      : [],
        thirdQuartile : [],
        complete      : [],
        skip          : [],
        mute          : [],
        unmute        : [],
        pause         : [],
        resume        : [],
        fullscreen    : []
    };

    var vddEventsStatuses = {
        impressions   : 0,
        creativeView  : 0,
        start         : 0,
        firstQuartile : 0,
        midpoint      : 0,
        thirdQuartile : 0,
        complete      : 0,
        skip          : 0,
        mute          : 0,
        unmute        : 0,
        pause         : 0,
        resume        : 0,
        fullscreen    : 0
    };

    var addText = '<div class="vdd-addtext" style="box-sizing: border-box; position: absolute; top: 0; left: 0; z-index: 555557; font-size: 12px; color: #fff; background: #000; background: rgba(0,0,0,0.7); padding: 10px;"> </div>';

    var skipText = '<div class="vdd-skip" style="display:none; box-sizing: border-box; cursor: pointer; position: absolute; bottom:5px; left:5px; z-index: 555557; font-size: 24px; color: #fff; background: #000; background: rgba(0,0,0,0.7); padding:20px; box-shadow:0 0 5px #000; border:1px solid #000; border-radius:3px;"> Pular </div>';

    var countdownText = '<div class="vdd-countdown" style="box-sizing: border-box; cursor: pointer; position: absolute; bottom:5px; left:5px; z-index: 555557; font-size: 24px; color: #fff; background: #000; background: rgba(0,0,0,0.7); padding:20px; box-shadow:0 0 5px #000; border:1px solid #000; border-radius:3px;">10</div>';

    var muteButton = '<div class="vdd-mute" style="position:absolute;bottom:14px;right:10px;z-index:55557;background-color:rgba(0,0,0,0.5);padding:8px 6px 7px;cursor:pointer;border-radius:50%;opacity:0.8;background-image:url(https://res43.traffer.net/img/mute.png);width:20px;height:18px;background-repeat:no-repeat;background-position:center;transition:0.3s"></div>';

    var vddXml;

    function vddVastRequest(sel) {
        $.ajax({
            url: vddUrl,
            xhrFields: {withCredentials: true},
            crossDomain: true,
            dataType: 'xml',
            context: this,
            cache: false,
            success: function(vddResponse) {
                vddXml = $(vddResponse);
                if (vddXml.find('Impression').length) {
                    vddEventsStatuses.impressions = 1;
                    vddXml.find('Impression').each(function () {
                        vddImpressions.push($(this).text().trim());
                    });
                }
                let skipoffsetElements = vddXml.find('Extension[type="skipTime"]');
                if (skipoffsetElements.length) {
                    skipoffsetElements.each(function () {
                        let strSkipoffset = $(this).text();
                        if (!strSkipoffset) return;
                        let arrSkipoffset = strSkipoffset.split(':', 2);
                        let skipoffset = 0;
                        if (arrSkipoffset.length==2)
                            skipoffset = parseInt(arrSkipoffset[0])*60+parseInt(arrSkipoffset[1]);
                        if (!skipoffset) return;
                        if (5 > skipoffset) skipoffset = 5;
                        vddSkipoffset = skipoffset;
                    });
                }
                
                skipoffsetElements = vddXml.find('Linear[skipoffset]');
                if (skipoffsetElements.length) {
                    skipoffsetElements.each(function () {
                        let strSkipoffset = $(this).attr('skipoffset');
                        if (!strSkipoffset) return;
                        let arrSkipoffset = strSkipoffset.split(':', 3);
                        let skipoffset = 0;
                        if (arrSkipoffset.length==3)
                            skipoffset = (parseInt(arrSkipoffset[0])*60+parseInt(arrSkipoffset[1]))*60+parseInt(arrSkipoffset[2]);
                        if (!skipoffset) return;
                        if (5 > skipoffset) skipoffset = 5;
                        vddSkipoffset = skipoffset;
                    });
                }

                if (vddXml.find('Error').length) {
                    vddError = vddXml.find('Error').text().trim();
                }

                for (var vddTrackEvent in vddTrackEvents) {
                    if (vddXml.find('Tracking[event="' + vddTrackEvent + '"]').length) {
                        vddEventsStatuses[vddTrackEvent] = 1;
                        vddXml.find('Tracking[event="' + vddTrackEvent + '"]').each(function () {
                            vddTrackEvents[vddTrackEvent].push($(this).text().trim());
                        });
                    }
                    if (vddEventsStatuses[vddTrackEvent] != 1 && vddTrackEvent=='skip') {
                        if (vddXml.find('Extension[type="skipAd"]').length) {
                            vddEventsStatuses[vddTrackEvent] = 1;
                            vddXml.find('Extension[type="skipAd"]').each(function () {
                                vddTrackEvents[vddTrackEvent].push($(this).text().trim());
                            });
                        }
                    }
                    if (vddEventsStatuses[vddTrackEvent] != 1 && vddTrackEvent.indexOf('mute')!=-1) {
                        let name = vddTrackEvent[0].toUpperCase() + vddTrackEvent.substring(1);
                        if (vddXml.find('Tracking[event="' + name + '"]').length) {
                            vddEventsStatuses[vddTrackEvent] = 1;
                            vddXml.find('Tracking[event="' + name + '"]').each(function () {
                                vddTrackEvents[vddTrackEvent].push($(this).text().trim());
                            });
                        }
                    }
                }

                var vddXmlWrapper = vddXml.find('Wrapper:first-child');

                if (vddXmlWrapper.length) {
                    for (var vddEventsStatus in vddEventsStatuses) {
                        vddEventsStatuses[vddEventsStatus] = 0;
                    }

                    var vddNewUrl = vddXmlWrapper.find('VASTAdTagURI').text();

                    if (typeof vddNewUrl !== 'undefined' && vddNewUrl) {
                        vddUrl = vddNewUrl;
                        vddVastRequest(sel);
                    } else {
                        if (sel) parseVastRequest(sel);
                    }
                } else {
                    var mediaElementUrl = vddXml.find('MediaFile:first-child').text();
                    if (typeof mediaElementUrl !== 'undefined' && mediaElementUrl) {
                        vddMovie = '<video></video>';
                        vddMovie = $(vddMovie);
                        vddMovie.attr('webkit-playsinline', '');
                        vddMovie.attr('playsinline', '');

                        vddMovie.css({
                            'position': 'absolute',
                            'top': '0',
                            'left': '0',
                            'width': '100%',
                            'height': '100%',
                            'z-index': '55556'
                        });

                        vddMovie.append('<source src="'+ mediaElementUrl +'" type="video/mp4">');
                    } else {
                        $('.vdd-overlay').remove();
                    }

                    if (
                        ((vddMode === undefined || vddMode !== 'non-imp-bind') && (typeof mediaElementUrl === 'undefined' || !mediaElementUrl))
                        || (vddMode !== undefined && vddMode === 'non-imp-bind' && typeof mediaElementUrl !== 'undefined' && mediaElementUrl)
                    ) {
                        // No-impression
                        if (typeof vddError !== 'undefined' && vddError) {
                            $('body').append('<img style="display: none;" src="' + vddError + '&line=214" alt="">');
                        }
                    }
                    if (sel) parseVastRequest(sel);
                }
            }
        });
    }

    function vddTrackRequest(url) {
        $.ajax({
            url: url,
            xhrFields: {withCredentials: true},
            crossDomain: true,
            dataType: 'xml',
            cache: false
        });
    }

    if (vddElements.length && vddKey !== undefined && vddKey && vddUrl) {
        window.vddElementsCnt = 0;
        vddElements.each(function () {
            window.vddElementsCnt++;
            $(this).wrap('<div class="vdd-wrapper" style="position: relative; width: ' + $(this).width() + 'px;" data-cnt="' + window.vddElementsCnt + '"></div>');
            $(this).before('<div class="vdd-overlay" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 55555;"></div>');
            
            $(this).parent().on('click', function() {
                if ($(this).hasClass('nextClick')) return;
                $(this).addClass('nextClick');
                vddVastRequest($(this).find('.vdd-element'));
            });
        });
    }
    
    function parseVastRequest(el) {
        $(el).parent().find('.vdd-overlay').each(function () {
            if (typeof vddXml === 'undefined') {
                $(this).remove();
                return false;
            }

            var vddWrapper = $(this).parent();
            var vddOverlay = $(this);
            var duration = vddXml.find('Duration');
            
            
            var dataId = $(el).parent().attr('data-cnt');
            if (vddInterval[dataId]!=undefined) clearInterval(vddInterval[dataId]);

            if (vddMovie && duration) {
                // Prepare to play pre-roll
                $(el).parent().find('.vdd-roll').remove();

                vddOverlay.before('<div class="vdd-roll" style="position: absolute;width:100%;height: 100%;top:0;left: 0;background: #000;"></div>');

                var vddRoll = vddWrapper.find('.vdd-roll');
                vddRoll.append(addText).append(countdownText).append(muteButton).append(vddMovie.clone());

                // Pre-roll click event
                var vddClickUrl = vddXml.find('VideoClicks ClickThrough:first-child').text();

                if (typeof vddClickUrl !== 'undefined' && vddClickUrl) {
                    vddRoll.bind('click', function () {
                        window.open(vddClickUrl, '_blank');
                    });
                }

                // Mute button
                vddWrapper.find('.vdd-mute').bind('click', function (e) {
                    e.stopPropagation();
                    if (!vddVideoItem.muted) {
                        vddVideoItem.muted = true;
                        $(this).css('background-color', 'rgba(32, 185, 44, 0.5)');

                        // Tracking mute
                        if (vddEventsStatuses.mute && vddTrackEvents.mute.length) {
                            for (ei = 0; vddTrackEvents.mute.length > ei; ++ei) {
                                vddTrackRequest(vddTrackEvents.mute[ei]);
                            }
                        }
                    } else {
                        vddVideoItem.muted = false;
                        $(this).css('background-color', 'rgba(0, 0, 0, 0.5)');

                        // Tracking unmute
                        if (vddEventsStatuses.unmute && vddTrackEvents.unmute.length) {
                            for (ei = 0; vddTrackEvents.unmute.length > ei; ++ei) {
                                vddTrackRequest(vddTrackEvents.unmute[ei]);
                            }
                        }
                    }
                });

                // Start playing pre-roll
                var vddVideoItem = vddWrapper.find('video').get(0);

                try {
                    vddVideoItem.volume = 0.8;
                    vddVideoItem.play();
                }
                catch(error) {
                    console.log(error);
                    return;
                }

                // Impressions
                if (vddEventsStatuses.impressions && vddImpressions.length) {
                    for (i = 0; vddImpressions.length > i; ++i) {
                        $('body').append('<img style="display: none;" src="' + vddImpressions[i] + '" alt="">');
                    }
                }
                
                // creativeView
                if (vddEventsStatuses.creativeView && vddTrackEvents.creativeView.length) {
                    for (ei = 0; vddTrackEvents.creativeView.length > ei; ++ei) {
                        vddTrackRequest(vddTrackEvents.creativeView[ei]);
                    }
                }

                // Duration handler
                if (duration.length) {
                    var durationS = 0;
                    var durationArr = duration.text().split(':');

                    if (durationArr[0] > 0) {
                        durationS += parseInt(durationArr[1]) * 3600;
                    }

                    if (durationArr[1] > 0) {
                        durationS += parseInt(durationArr[1]) * 60;
                    }

                    if (durationArr[2] > 0) {
                        durationS += parseInt(durationArr[2]);
                    }
                    if (durationS>4 && vddSkipoffset-2 > durationS)
                        vddSkipoffset = durationS + 2;

                    var i = -1;
                    
                    let countdownText = '';
                    if (10 > vddSkipoffset) countdownText = '0' + vddSkipoffset.toString();
                    else countdownText = vddSkipoffset.toString();
                    vddWrapper.find('.vdd-countdown').text(countdownText);

                    vddInterval[dataId] = setInterval(function () {
                        ++i;
                        let vddVideoItemCurrentTime = 0;
                        if (vddVideoItem.currentTime != undefined) {
                            vddVideoItemCurrentTime = parseFloat(vddVideoItem.currentTime);
                            if (vddVideoItemCurrentTime > 0 && durationS>vddVideoItemCurrentTime) i = Math.ceil(vddVideoItemCurrentTime);
                        }

                        let countdownText = '';
                        let countdown = vddSkipoffset - i;
                        if (10 > countdown) countdownText = '0' + countdown.toString();
                        else countdownText = countdown.toString();
                        vddWrapper.find('.vdd-countdown').text(countdownText);

                        // Show skip button after vddSkipoffset second
                        if (i === vddSkipoffset) {
                            vddWrapper.find('.vdd-countdown').fadeOut(function () {
                                vddWrapper.find('.vdd-countdown').remove();
                                vddRoll.prepend(skipText);
                                vddWrapper.find('.vdd-skip').fadeIn();

                                vddWrapper.find('.vdd-skip').bind('click', function (e) {
                                    e.stopPropagation();
                                    vddRoll.remove();
                                    vddOverlay.remove();

                                    // Tracking skip
                                    if (vddEventsStatuses.skip && vddTrackEvents.skip.length) {
                                        for (ei = 0; vddTrackEvents.skip.length > ei; ++ei) {
                                            vddTrackRequest(vddTrackEvents.skip[ei]);
                                        }
                                    }

                                    if (vddInterval[dataId]!=undefined) clearInterval(vddInterval[dataId]);
                                })
                            });
                        }

                        // Tracking start
                        if (i === 1 && vddEventsStatuses.start && vddTrackEvents.start.length) {
                            for (ei = 0; vddTrackEvents.start.length > ei; ++ei) {
                                vddTrackRequest(vddTrackEvents.start[ei]);
                            }
                        }

                        // Tracking 25%
                        if (i === Math.round(durationS / 4) && vddEventsStatuses.firstQuartile && vddTrackEvents.firstQuartile) {
                            for (ei = 0; vddTrackEvents.firstQuartile.length > ei; ++ei) {
                                vddTrackRequest(vddTrackEvents.firstQuartile[ei]);
                            }
                        }

                        // Tracking half
                        if (i === Math.round(durationS / 2) && vddEventsStatuses.midpoint && vddTrackEvents.midpoint) {
                            for (ei = 0; vddTrackEvents.midpoint.length > ei; ++ei) {
                                vddTrackRequest(vddTrackEvents.midpoint[ei]);
                            }
                        }

                        // Tracking 75%
                        if (i === Math.round(durationS * 75 / 100) && vddEventsStatuses.thirdQuartile && vddTrackEvents.thirdQuartile) {
                            for (ei = 0; vddTrackEvents.thirdQuartile.length > ei; ++ei) {
                                vddTrackRequest(vddTrackEvents.thirdQuartile[ei]);
                            }
                        }

                        // End of pre-roll
                        if (durationS === i - 2) {
                            vddRoll.slideUp(function() {
                                vddRoll.remove();
                                vddOverlay.remove();
                            });

                            // Tracking complete
                            if (vddEventsStatuses.complete && vddTrackEvents.complete.length) {
                                for (ei = 0; vddTrackEvents.complete.length > ei; ++ei) {
                                    vddTrackRequest(vddTrackEvents.complete[ei]);
                                }
                            }

                            if (vddInterval[dataId]!=undefined) clearInterval(vddInterval[dataId]);
                        }
                    }, 1000);
                }
            } else {
                $(this).remove();
            }
        });
    }
});
