var Froogaloop = (function () {
    function Froogaloop(iframe) { return new Froogaloop.fn.init(iframe); }
    var eventCallbacks = {}, hasWindowEvent = false, isReady = false, slice = Array.prototype.slice, playerDomain = ''; Froogaloop.fn = Froogaloop.prototype = { element: null, init: function (iframe) {
        if (typeof iframe === "string") { iframe = document.getElementById(iframe); }
        this.element = iframe; playerDomain = getDomainFromUrl(this.element.getAttribute('src')); return this;
    }, api: function (method, valueOrCallback) {
        if (!this.element || !method) { return false; }
        var self = this, element = self.element, target_id = element.id !== '' ? element.id : null, params = !isFunction(valueOrCallback) ? valueOrCallback : null, callback = isFunction(valueOrCallback) ? valueOrCallback : null; if (callback) { storeCallback(method, callback, target_id); }
        postMessage(method, params, element); return self;
    }, addEvent: function (eventName, callback) {
        if (!this.element) { return false; }
        var self = this, element = self.element, target_id = element.id !== '' ? element.id : null; storeCallback(eventName, callback, target_id); if (eventName != 'ready') { postMessage('addEventListener', eventName, element); }
        else if (eventName == 'ready' && isReady) { callback.call(null, target_id); }
        return self;
    }, removeEvent: function (eventName) {
        if (!this.element) { return false; }
        var self = this, element = self.element, target_id = element.id !== '' ? element.id : null, removed = removeCallback(eventName, target_id); if (eventName != 'ready' && removed) { postMessage('removeEventListener', eventName, element); } 
    } 
    }; function postMessage(method, params, target) {
        if (!target.contentWindow.postMessage) { return false; }
        var url = target.getAttribute('src').split('?')[0], data = JSON.stringify({ method: method, value: params }); target.contentWindow.postMessage(data, url);
    }
    function onMessageReceived(event) {
        var data, method; try { data = JSON.parse(event.data); method = data.event || data.method; }
        catch (e) { }
        if (method == 'ready' && !isReady) { isReady = true; }
        if (event.origin != playerDomain) { return false; }
        var value = data.value, eventData = data.data, target_id = target_id === '' ? null : data.player_id, callback = getCallback(method, target_id), params = []; if (!callback) { return false; }
        if (value !== undefined) { params.push(value); }
        if (eventData) { params.push(eventData); }
        if (target_id) { params.push(target_id); }
        return params.length > 0 ? callback.apply(null, params) : callback.call();
    }
    function storeCallback(eventName, callback, target_id) {
        if (target_id) {
            if (!eventCallbacks[target_id]) { eventCallbacks[target_id] = {}; }
            eventCallbacks[target_id][eventName] = callback;
        }
        else { eventCallbacks[eventName] = callback; } 
    }
    function getCallback(eventName, target_id) {
        if (target_id) { return eventCallbacks[target_id][eventName]; }
        else { return eventCallbacks[eventName]; } 
    }
    function removeCallback(eventName, target_id) {
        if (target_id && eventCallbacks[target_id]) {
            if (!eventCallbacks[target_id][eventName]) { return false; }
            eventCallbacks[target_id][eventName] = null;
        }
        else {
            if (!eventCallbacks[eventName]) { return false; }
            eventCallbacks[eventName] = null;
        }
        return true;
    }
    function getDomainFromUrl(url) {
        var url_pieces = url.split('/'), domain_str = ''; for (var i = 0, length = url_pieces.length; i < length; i++) {
            if (i < 3) { domain_str += url_pieces[i]; }
            else { break; }
            if (i < 2) { domain_str += '/'; } 
        }
        return domain_str;
    }
    function isFunction(obj) { return !!(obj && obj.constructor && obj.call && obj.apply); }
    function isArray(obj) { return toString.call(obj) === '[object Array]'; }
    Froogaloop.fn.init.prototype = Froogaloop.fn; if (window.addEventListener) { window.addEventListener('message', onMessageReceived, false); }
    else { window.attachEvent('onmessage', onMessageReceived, false); }
    return (window.Froogaloop = window.$f = Froogaloop);
})();
