﻿lightplayer.MediaElement = {
    create: function (options) {
        var mode = options.mode;
        var sources = options.sources;

        var extension = lightplayer.utilies.getExtension(sources[0]);
        var media, index = lightplayer.MediaElement.mediaIndex++;
        if (mode == 'video' || mode == 'auto' || mode === undefined) {
            if (lightplayer.VideoElement.supportTypes.indexOf('video/' + extension) >= 0 || extension == 'ogv') {
                if (extension == 'ogv') {
                    media = new lightplayer.VideoElement($.extend({ format: 'video/ogg' }, $.extend(options, {index:index})));
                } else {
                    media = new lightplayer.VideoElement($.extend({ format: 'video/' + extension }, $.extend(options, { index: index })));
                }
            }
        } else if (mode == 'audio' || mode == 'auto' || mode === undefined) {
            if (lightplayer.AudioElement.supportTypes.indexOf('audio/' + extension) >= 0) {
                media = new lightplayer.AudioElement($.extend(options, { index: index }));
            }
        } else if (mode == 'flash' || mode == 'auto' || mode === undefined) {
            if (lightplayer.FlashElement.supportTypes.indexOf('video/' + extension) >= 0 || lightplayer.FlashElement.supportTypes.indexOf('audio/' + extension) >= 0) {
                media = new lightplayer.FlashElement($.extend(options, { index: index }));
            }

        } else if (mode == 'silverlight' || mode == 'auto' || mode === undefined) {
            if (lightplayer.SilverlightElement.supportTypes.indexOf('video/' + extension) >= 0 || lightplayer.SilverlightElement.supportTypes.indexOf('audio/' + extension) >= 0) {
                media = new lightplayer.SilverlightElement($.extend(options, { index: index }));
            }
        }
        lightplayer.MediaElement.mediaElements[index] = media;
        return media;
    },
    fireEvent: function (id, eventName, values) {
        var e, i, bufferedTime, media = lightplayer.MediaElement.mediaElements[id];

        media.ended = false;
        media.paused = true;

        // fake event object to mimic real HTML media event.
        e = {
            type: eventName,
            target: media
        };

        // attach all values to element and event object
        for (i in values) {
            media[i] = values[i];
            e[i] = values[i];
        }

        // fake the newer W3C buffered TimeRange (loaded and total have been removed)
        bufferedTime = values.bufferedTime || 0;

        e.target.buffered = e.buffered = {
            start: function (index) {
                return 0;
            },
            end: function (index) {
                return bufferedTime;
            },
            length: 1
        };

        media.dispatchEvent(e.type, e);
    }
};
lightplayer.MediaElement.mediaElements = [];
lightplayer.MediaElement.mediaIndex = 0;
