/www/jssrc/lib/blergmedia.js
var BlergMedia = {
    audioExtensions: [],
    videoExtensions: [],
    imageExtensions: ['jpg', 'jpeg', 'gif', 'png']
};

BlergMedia.media_init = function() {
    var e = document.createElement('audio');
    if (!!e.canPlayType) {
        BlergMedia.has_audio = true;
        if (e.canPlayType('audio/mpeg; codecs="mp3"')) {
            BlergMedia.has_mp3 = true;
            BlergMedia.audioExtensions.push('mp3');
        }
        if (e.canPlayType('audio/ogg; codecs="vorbis"')) {
            BlergMedia.has_vorbis = true;
            BlergMedia.audioExtensions.push('ogg', 'oga');
        }
        if (e.canPlayType('audio/wav')) {
            BlergMedia.has_wav = true;
            BlergMedia.audioExtensions.push('wav');
        }
        BlergMedia.audioTypeRegex =      new RegExp("audio:(" + BlergMedia.audioExtensions.join('|') + ")$");
        BlergMedia.audioExtensionRegex = new RegExp("\\.(" + BlergMedia.audioExtensions.join('|') + ")$");
    }

    var e = document.createElement('video');
    if (!!e.canPlayType) {
        BlergMedia.has_video = true;
        if (e.canPlayType('video/mp4; codecs="avc"')) {
            BlergMedia.has_h264 = true;
            BlergMedia.videoExtensions.push('mp4');
        }
        if (e.canPlayType('video/ogg; codecs="theora, vorbis"')) {
            BlergMedia.has_theora = true;
            BlergMedia.videoExtensions.push('ogv');
        }
        if (e.canPlayType('video/webm; codecs="vp8, vorbis"')) {
            BlergMedia.has_webm = true;
            BlergMedia.videoExtensions.push('webm');
        }
        BlergMedia.videoTypeRegex =      new RegExp("video:(" + BlergMedia.videoExtensions.join('|') + ")$");
        BlergMedia.videoExtensionRegex = new RegExp("\\.(" + BlergMedia.videoExtensions.join('|') + ")$");
    }

    BlergMedia.imageTypeRegex      = new RegExp("image:(" + BlergMedia.imageExtensions.join('|') + ")$");
    BlergMedia.imageExtensionRegex = new RegExp("\\.(" + BlergMedia.imageExtensions.join('|') + ")$");
}

BlergMedia.play_audio = function(ev) {
    var e = ev.target.parentElement;
    var url = ev.target.parentElement.href;
    var audio_element = document.createElement('audio');
    audio_element.src = url;
    audio_element.controls = 1;
    audio_element.autoplay = 1;
    e.parentElement.replaceChild(audio_element, e);
}

BlergMedia.play_video = function(ev) {
    var e = ev.target.parentElement;
    var url = ev.target.parentElement.href;
    var p = document.createElement('p');
    var video_element = document.createElement('video');
    video_element.src = url;
    video_element.controls = 1;
    video_element.autoplay = 1;
    p.appendChild(video_element);
    e.parentElement.replaceChild(video_element, e);
}

BlergMedia.show_image = function(ev) {
    var img = ev.target;
    var medialink = img.parentElement;
    var url = medialink.href;
    var anchor = medialink.previousElementSibling;
    var title = anchor.firstChild.data;
    img.src = url;
    img.title = img.alt = title;
    // Get rid of whitespace between anchor and medialink
    medialink.parentElement.removeChild(medialink.previousSibling);
    anchor.parentElement.removeChild(anchor);
}

BlergMedia.process = function(data) {
    if (BlergMedia.imageExtensionRegex.test(data.url) ||
        (data.extra && BlergMedia.imageExtensionRegex.test(data.extra))) {
        data.widget = '<a href="' + data.url + '" onclick="BlergMedia.show_image(event); return false"><img src="/images/play.png"></a>';
    } else if (BlergMedia.audioExtensionRegex.test(data.url) ||
               (data.extra && BlergMedia.audioTypeRegex.test(data.extra))) {
        data.widget = '<a href="' + data.url + '" onclick="BlergMedia.play_audio(event); return false"><img src="/images/play.png"></a>';
    } else if (BlergMedia.videoExtensionRegex.test(data.url) ||
               (data.extra && BlergMedia.videoTypeRegex.test(data.extra))) {
        data.widget = '<a href="' + data.url + '" onclick="BlergMedia.play_video(event); return false"><img src="/images/play.png"></a>';
    }

    return data;
}