var TPM = (function (name) {return name;}(TPM || {}));
TPM.Core = (function(){
    var locale = $('html').attr('lang');

	return {
        getLocale:function(){
            return locale;
        }
    };
})();

TPM.UI = {};
TPM.UI.Modal = (function(){
    var modalObject = {
        init:function(o){
            this.trigger = o.trigger;
            this.target = o.target;
            this.zIndex = o.zIndex || 99999;
            this.mask = Object.create(modalMask).init({target:this.target,zIndex:this.zIndex,callee:this});
            this.addListeners();
        },
        addListeners:function(){
            var that = this;
            $(this.trigger).click(function(e){
                e.stopPropagation();
                that.setPosition();
                that.show();
            });
            $(window).resize(function(){
                that.setPosition();
            });
            $(this.target+' .close-it').die().live( 'click', function (e) {
            	that.hide();
            	e.preventDefault();
            });
        },
        show:function(){         
            $(this.target).show();
            this.mask.show();
        },
        hide:function(){
            this.mask.hide();
            $(this.target).hide();
        },
        setPosition:function(){
            var lft = Math.round(($(window).width() - $(this.target).width())/2); 
            !TPM.Browser.isIE() ? lft -= 20 : 0; // 20 is padding...
            var tp = Math.round(($(window).height() - $(this.target).height())/2);
            !TPM.Browser.isIE() ? tp -= 20 : 0; // 20 is padding...
            tp < 0 ? tp = 0 : 0;
            $(this.target).css({left:lft, top:tp});
        }
    };
    var modalMask = {
        init:function(o){
            this.mask = document.createElement('div');
            $(this.mask).addClass('mask');
            $(this.mask).attr('id',o.target+"_mask");
            this.zIndex = o.zIndex - 10;
            this.setSize();
            this.top = 0;
            this.callee = o.callee;
            this.maskOpacity = o.maskOpacity || 0.35;
            $(this.mask).css({background:'#000',opacity:this.maskOpacity,position:'fixed',left:0,top:this.top,'z-index':this.zIndex,cursor:'pointer'});
            $('body').append(this.mask);
            this.hide();
            this.addListeners();
            return this;
        },
        addListeners:function(){
            var self = this;
            $(this.mask).click(function(){self.callee.hide();});
            $(window).resize(function(){
                self.setSize();
            });
        },
        setSize:function(){
            this.width = $(window).width();
            this.height = $(window).height();
            $(this.mask).css({width:this.width,height:this.height});
        },
        show:function(){$(this.mask).show();},
        hide:function(){$(this.mask).hide();}
    };
    return{
        create:function(o){
            return Object.create(modalObject).init(o);
        }
    };
}());


/*
 * FlashFromMarkup
 *
 * Takes an element that contains HTML5 data attributes and builds a Flash Element.
 * Object can create a standard SWF or a video using TPM Player jQuery plugin
 *
 * Example DOM Element for SWFs:
 * <div class="flash_from_markup" data-swf-url="/path/to/my.swf" data-swf-width="576" data-swf-height="346" />
 *
 * Example DOM Element for FLVs:
 * <div class="flash_from_markup" data-flv-url="/path/to/my.flv" data-flv-width="480" data-flv-height="272" />
 *
 * @author Tyler Rooney
 * @version 0.1
 * @requires jQuery.TPMPlayer
 *
 * @constructor
 * @param {Object} opts Options object
 */
TPM.Core.FlashFromMarkup = function (opts) {

    var defaults = {
        target: '.flash_from_markup',
        prefix: 'flash_from_markup',
        swfAttrs: {
            url: 'data-swf-url',
            width: 'data-swf-width',
            height: 'data-swf-height'
        },
        flvAttrs: {
            url: 'data-flv-url',
            width: 'data-flv-width',
            height: 'data-flv-height'
        }
    };

    this.o = $.extend(true, {}, defaults, opts);

    this.flashEls = [];

    this.init();

};

/*
 * TPM.Core.FlashFromMarkup.init
 *
 * Initialization method
 *
 * @member FlashFromMarkup
 */
TPM.Core.FlashFromMarkup.prototype.init = function () {

    var self = this, o = this.o, containerEls = $(o.target);

    containerEls.each(function () {

        var containerEl = $(this),
            flashEl = null,
            randomFlashId = null,
            flashOpts = null;

        randomFlashId = TPM.GenerateRandomID(o.prefix);

        flashEl = $('<div />').addClass(o.prefix).attr('id', randomFlashId).appendTo(containerEl.empty());

        if (containerEl.attr(o.flvAttrs.url) !== undefined) {
            var flvOpts = TPM.Core.FlashFromMarkup.readAttrs(containerEl, o.flvAttrs);
            TPM.Core.FlashFromMarkup.applyFlashVideo(flashEl, flvOpts);
            self.flashEls.push(flashEl[0]);
        }

        if (containerEl.attr(o.swfAttrs.url) !== undefined) {
            var swfOpts = TPM.Core.FlashFromMarkup.readAttrs(containerEl, o.swfAttrs);
            TPM.Core.FlashFromMarkup.applyFlash(flashEl, swfOpts);
            self.flashEls.push(flashEl[0]);
        }

    });

};
/*
 * TPM.Core.FlashFromMarkup.readAttrs
 *
 * Reads attributes from a specified DOM Element
 *
 * @member FlashFromMarkup
 * @param {Object} el DOM Element
 * @param {Object} attrObj List of key/values attributes to lookup
 * @return {Object} attrData Data object containing the values on the specified element
 */
TPM.Core.FlashFromMarkup.readAttrs = function (el, attrObj) {
    var attrData = {};

    el = $(el);

    $.each(attrObj, function (key, attr) {
        if (el && el.attr(attr) !== undefined) {
            attrData[key] = el.attr(attr);
        }
    });

    return attrData;
};

/*
 * TPM.Core.FlashFromMarkup.applyFlashVideo
 *
 * Applies the jQuery TPM Player plugin, using the FLV specified in the options object, onto a specified DOM element
 *
 * @member FlashFromMarkup
 * @param {Object} el DOM Element
 * @param {Object} opts Options object
 * @return
 */
TPM.Core.FlashFromMarkup.applyFlashVideo = function (el, opts) {
    $(el).TPMPlayer({
        width: opts.width,
        height: opts.height,
        flashVars: {
            singleVideoPath: opts.url
        }
    });
};

/*
 * TPM.Core.FlashFromMarkup.applyFlash
 *
 * Applies SWF specified in the options object onto the specified DOM element
 *
 * @member FlashFromMarkup
 * @param {Object} el DOM Element
 * @param {Object} opts Options object
 */
TPM.Core.FlashFromMarkup.applyFlash = function (el, opts) {
    swfobject.embedSWF(opts.url, el.attr('id'), opts.width, opts.height, '9.0.0.', 'expressInstall.swf',  opts.params, opts.flashVars,  opts.attribs);
};

/*
 * TPM.Core.FlashFromMarkup.getEls
 *
 * Gets the elements to which FlashFromMarkup was applied
 *
 * @member FlashFromMarkup
 * @return {Object} els jQuery elements
 */
TPM.Core.FlashFromMarkup.prototype.getEls = function() {
    return this.flashEls;
};

/*
 * TPM.GenerateRandomID
 *
 * Generates a guaranteed-unique hash. Ex:
 *
 * TPM.GenerateRandomID();                     // Could return 'dyn_cd3zA'
 * TPM.GenerateRandomID('myPrefix');            // Could return 'myPrefix_H9z0r'
 * TPM.GenerateRandomID('myPrefix',10');        // Could return 'myPrefix_Jp39zcQemc'
 *
 * @author Tyler Rooney
 * @constructor
 * @version 0.1
 */
TPM.GenerateRandomID = (function() {

    var idCache = []; // Stores any IDs created by GenerateRandomID

    function createHash(hash_length) {
        var chars = null, rnum = null, out = '';
        chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
        for (var i =0; i < hash_length; i++) {
            var r = Math.floor(Math.random() * chars.length);
            out += chars.substring(r,r+1);
        }
        return out;
    };
    function indexOf (array, obj, start) {
        for (var i = (start || 0); i < array.length; i++) {
            if (array[i] == obj) {
            return i;
            }
        }
        return -1;
    };
    /*
     * Anonymous function returned to TPM.GenerateRandomID
     */
    return function(prefix,hash_length) {
        var p = null, l = null, chars = null, randomId = null;
        p = prefix || 'dyn';
        l = hash_length || 5;
        do {
            randomId = p + '_' + createHash(l);
            if (indexOf(idCache, randomId) === -1) { // Hack for IE, which does not support array.indexOf -- yet!
                idCache.push(randomId);
                return randomId;
            }
        } while (idCache.indexOf(randomId) === -1);
    };
})();

TPM.Browser = (function(){
    var browser = 'other';
    var setup = function(){
        if(document.all){
                if(navigator.appVersion.indexOf("MSIE 7.")!=-1){browser='ie7';return;} //could be better..!
                if(document.documentMode == 8){browser='ie8';return;}
            }
        if(navigator.userAgent.indexOf("iPhone")!=-1){
            browser="iphone safari";
            return;
        }    
        browser = 'other'; // add other browser functionality tests here...
    };
    return{
        is:function(b){
            if(b == browser){return true;}
            return false;
        },
        isIE:function(){
            if(document.all){return true;}
            return false;
        },
        isIE7:function(){
        	return this.is('ie7');
        },
        init:function(){
            setup();
        }
    };
})();
TPM.Browser.init();
