/*
    Getme Ltd reserve all intellectual property rights of this source code.
    
    EXCEPT AS OTHERWISE EXPRESSLY PROVIDED IN A WRITTEN AGREEMENT BETWEEN YOU 
    AND GETME LTD, THIS SOURCE CODE IS PROVIDED "AS IS" AND WITHOUT ANY 
    WARRANTIES OF ANY KIND, INCLUDING WARRANTIES OF MERCHANTABILITY OR FITNESS 
    FOR A PARTICULAR PURPOSE.

    IN NO EVENT SHALL GETME LTD BE LIABLE FOR ANY DIRECT, INDIRECT, 
    INCIDENTIAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR DAMAGES FROM BUSINESS 
    INTERRUPTION OR LOSS OF PROFITS, REVENUE, DATA OR USE, INCURRED BY YOU OR 
    ANY THIRD PARTY, WHETHER IN CONTRACT OR TORT, ARISING FROM YOUR ACCESS TO, 
    OR USE OF, THIS SOURCE CODE EVEN IF GETME LTD HAS BEEN ADVISED OF THE 
    POSSIBILITY OF SUCH DAMAGES.
    
    Copyright (c)2009 Getme Ltd.
 */

/**
 * @fileoverview    Movie support within page.
 * @version         0.0.1
 * @author          Anthony Blackshaw ant@getme.co.uk
 */

// IMPORTANT! This library is designed to be compatible with output from the 
// editable.js library.

// Dependency check(s)
if (window.jQuery===undefined) {
    throw Error('JQuery JavaScript framework (http://jquery.com/) is required.');
}

/**
 * The MOVIE namespace.
 * The movie library uses MOVIE to namespace it's classes and functions.
 *
 * @final
 * @type Namespace
 */  
var MOVIE = {};

/**
 * Create a base movie provider class. 
 *
 * @class A base class to manage movie providers.
 * @param {String} url The URL to the movie.
 * @constructor
 */
MOVIE.Provider = function(url) {
    this.url = url;
}

/**
 * Return a URL to the movie data.
 *
 * @return URL to movie data.
 * @string
 */
MOVIE.Provider.prototype.get_movie_url = function() { return ''; }

/**
 * Return a URL to the movie page.
 *
 * @return URL to movie page.
 * @string
 */
MOVIE.Provider.prototype.get_link_url = function() { return ''; }
MOVIE.Provider.ID = 'Base';


/**
 * Create a youtube movie provider class. 
 *
 * @class A class to manage youtube movies.
 * @param {String} url The URL to the movie.
 * @constructor
 */
MOVIE.YouTube = function(url) {
    MOVIE.Provider.call(this, url);
}

// Inheritance
MOVIE.YouTube.prototype = new MOVIE.Provider;
MOVIE.YouTube.ID = 'YouTube';

/**
 * Return a URL to the movie data.
 *
 * @return URL to movie data.
 * @string
 */
MOVIE.YouTube.prototype.get_movie_url = function() {
    jQuery.url.setUrl(this.url);
    if (jQuery.url.param('v')) {
        return 'http://www.youtube.com/v/' + jQuery.url.param('v');
    } else if (jQuery.url.segment(0) == 'v' && jQuery.url.segment(1)) {
        return this.url;
    }
    return ''
}

/**
 * Return a URL to the movie page.
 *
 * @return URL to movie page.
 * @string
 */
MOVIE.YouTube.prototype.get_link_url = function() {
    jQuery.url.setUrl(this.url);
    if (jQuery.url.segment(0) == 'v' && jQuery.url.segment(1)) {
        return 'http://www.youtube.com/watch?v=' + jQuery.url.segment(1);
    } else if (jQuery.url.param('v')) {
        return this.url;
    }
    return ''    
}


/**
 * A map of movie providers by domain.
 *
 * @final
 * @type Object
 */
MOVIE.PROVIDER_MAP = {'www.youtube.com': MOVIE.YouTube}

/**
 * Convert a link to a movie.
 *
 * @param {Element} link The HTML DOM link node.
 */
MOVIE.link_to_movie = function(link) {
    // Exreact information from the link
    var alt = $(link).html();
    var url = $(link).attr('href');
    var style = $(link).attr('style');
    var css = $(link).attr('class');
    var width = parseInt(style.match(/(^|\s+)width:\s*(\d+)\s*px(;|$)/i)[2]);
    var height = parseInt(style.match(/(^|\s+)height:\s*(\d+)\s*px(;|$)/i)[2]);
    $(link).attr('id', 'temp-movie-id');
    jQuery.url.setUrl(url);
    if (MOVIE.PROVIDER_MAP[jQuery.url.attr('host')]) {
        var provider = new MOVIE.PROVIDER_MAP[jQuery.url.attr('host')](url);
        url = provider.get_movie_url();
    }    
    swfobject.embedSWF(url, 'temp-movie-id', width, height, '9.0', null, null, null, {title: alt});
    $('#temp-movie-id').attr('style', style);
    $('#temp-movie-id').attr('class', css);
    $('#temp-movie-id').removeAttr('id');
}

/**
 * Convert a movie to a link.
 *
 * @param {Element} movie The HTML DOM movie node.
 */
MOVIE.movie_to_link = function(movie) {
    var alt = $(movie).attr('title');
    var url = $(movie).attr('data');
    var style = $(movie).attr('style');
    var css = $(movie).attr('class');
    jQuery.url.setUrl(url);
    if (MOVIE.PROVIDER_MAP[jQuery.url.attr('host')]) {
        var provider = new MOVIE.PROVIDER_MAP[jQuery.url.attr('host')](url);
        url = provider.get_link_url();
    }    
    $(movie).replaceWith("<a id='temp-link-id'>" + alt + "</a>");
    $('#temp-link-id').attr('href', url);
    $('#temp-link-id').attr('style', style);
    $('#temp-link-id').attr('class', css);
    $('#temp-link-id').removeAttr('id');    
}

/**
 * Query a URL to a movie for information about the movie.
 *
 * @param {String} url The URL to the movie.
 * @return An object with information about the movie.
 * @type Object
 */
MOVIE.get_provider = function(url) {
    // Extract the provider
    jQuery.url.setUrl(url);
    if (MOVIE.PROVIDER_MAP[jQuery.url.attr('host')]) {
        return new MOVIE.PROVIDER_MAP[jQuery.url.attr('host')](url);
    }
}   

/**
 * Convert links to movies within the page to SWF movies. 
 */
MOVIE.links_to_movies = function() {
    var link_list = $('a.edit-movie');
    for (var i = 0; i < link_list.length; i++) {
        var link = link_list[i];
        MOVIE.link_to_movie(link);
    }
}

/**
 * Convert SWF movies within the page to links to movies. 
 */
MOVIE.movies_to_links = function() {
    var movie_list = $('object.edit-movie');
    for (var i = 0; i < movie_list.length; i++) {
        var movie = movie_list[i];
        MOVIE.movie_to_link(movie);
    }
}
