/*!

* jQuery & Zepto Lazy - AV Plugin - v1.4
* http://jquery.eisbehr.de/lazy/
*
* Copyright 2012 - 2017, Daniel 'Eisbehr' Kern
*
* Dual licensed under the MIT and GPL-2.0 licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl-2.0.html
*/

;(function($) {

// loads audio and video tags including tracks by two ways, like:
// <audio>
//   <data-src src="audio.ogg" type="video/ogg"></data-src>
//   <data-src src="audio.mp3" type="video/mp3"></data-src>
// </audio>
// <video data-poster="poster.jpg">
//   <data-src src="video.ogv" type="video/ogv"></data-src>
//   <data-src src="video.webm" type="video/webm"></data-src>
//   <data-src src="video.mp4" type="video/mp4"></data-src>
//   <data-track kind="captions" src="captions.vtt" srclang="en"></data-track>
//   <data-track kind="descriptions" src="descriptions.vtt" srclang="en"></data-track>
//   <data-track kind="subtitles" src="subtitles.vtt" srclang="de"></data-track>
// </video>
//
// or:
// <audio data-src="audio.ogg|video/ogg,video.mp3|video/mp3"></video>
// <video data-poster="poster.jpg" data-src="video.ogv|video/ogv,video.webm|video/webm,video.mp4|video/mp4">
//   <data-track kind="captions" src="captions.vtt" srclang="en"></data-track>
//   <data-track kind="descriptions" src="descriptions.vtt" srclang="en"></data-track>
//   <data-track kind="subtitles" src="subtitles.vtt" srclang="de"></data-track>
// </video>
$.lazy(["av", "audio", "video"], ["audio", "video"], function(element, response) {
    var elementTagName = element[0].tagName.toLowerCase();
    if( elementTagName === "audio" || elementTagName === "video" ) {
        var srcAttr = "data-src",
            sources = element.find(srcAttr),
            tracks = element.find("data-track"),
            sourcesInError = 0,
        // create on error callback for sources
        onError = function() {
            if( ++sourcesInError === sources.length )
                response(false);
        },
        // create callback to handle a source or track entry
        handleSource = function() {
            var source = $(this),
                type = source[0].tagName.toLowerCase(),
                attributes = source.prop("attributes"),
                target = $(type === srcAttr ? "<source>" : "<track>");
            if( type === srcAttr )
                target.one("error", onError);
            $.each(attributes, function(index, attribute) {
                target.attr(attribute.name, attribute.value);
            });
            source.replaceWith(target);
        };
        // create event for successfull load
        element.one("loadedmetadata", function() {
            response(true);
        })
        // remove default callbacks to ignore loading poster image
        .off("load error")
        // load poster image
        .attr("poster", element.attr("data-poster"));
        // load by child tags
        if( sources.length )
            sources.each(handleSource);
        // load by attribute
        else if( element.attr(srcAttr) ) {
            // split for every entry by comma
            $.each(element.attr(srcAttr).split(","), function(index, value) {
                // split again for file and file type
                var parts = value.split("|");
                // create a source entry
                element.append($("<source>")
                       .one("error", onError)
                       .attr({src: parts[0].trim(), type: parts[1].trim()}));
            });
            // remove now obsolete attribute
            if( this.config("removeAttribute") )
                element.removeAttr(srcAttr);
        }
        else {
            // pass error state
            // use response function for Zepto
            response(false);
        }
        // load optional tracks
        if( tracks.length )
            tracks.each(handleSource);
    }
    else {
        // pass error state
        // use response function for Zepto
        response(false);
    }
});

})(window.jQuery || window.Zepto);