/***
 * Media Player Functions
 * Version 2.0.1
 * Many improvements over the previous version.
 * Requires:
 * Most recent version of media player
 * SWFObject
 * YUI 2.x: YAHOO, Event, Dom
 ***/

meltmedia.widget.MediaPlaya = function(el, userConfig) {
    if(el) {
	this.init(el, userConfig);
    }
};

meltmedia.widget.MediaPlaya.prototype = {
    version: "2.0.1",
    onready: function() {},
    toString: function() {
	return "meltmedia-playa Object " + this.id;
    }
};

meltmedia.widget.MediaPlaya.prototype.init = function(el, userConfig) {
    if(typeof el == "string") {
	el = document.getElementById(el);
    }
    
    // Copy the config to the MediaPlayer object
    this.copyConfig(this, userConfig);

    // Get the flash fail code from the containing div
    this.flashFail = this.getFlashFail(el);

    try {
	// Create the container for the flash video.
	this.element = this.generateContainer();
	// Append the flash fail to the container element (this will be overwritten with the swfobject if flash is available)
	this.element.innerHTML = this.flashFail;
	// Create the SWFObject
	this.so = new SWFObject(this.player, 
				this.swapDashForCap(this.id+"-video"), 
				"100%", "100%", "9", this.style.color);
	// Add params
	this.addParams();
	// Add variables
	this.addVariables();

	// Flag for testing the flash fail
	if(!this.testMode) {
	    this.so.write(this.element);
	}
	this.flash = this.element.firstChild;
	el.appendChild(this.element);
	this.onready();
    } catch (e) {
	//alert("Invalid Element.\nError: " + e);
    }
};

meltmedia.widget.MediaPlaya.prototype.generateContainer = function() {
    var div = document.createElement("DIV");
    div.id = this.properties.video;
    if(this.properties["default"] == "true") {
	div.className = "enabled";
	this.isActive = true;
	this.onready = function() {
	    if(this.metadata) this.enableMetaData();
	}
    } else {
	div.className = "disabled";
	this.isActive = false;
    }

    // Set style properties
    this.setStyle(div);

    return div;
};

meltmedia.widget.MediaPlaya.prototype.toggleVideo = function(ev) {
    YAHOO.util.Event.preventDefault(ev);

    if(this.isActive) {
	alert("active");
	this.disable();
    } else {
	alert("inactive");
	this.enable();
    }
};

meltmedia.widget.MediaPlaya.prototype.enable = function() {
    var c = this.element.className.toString();
    var _this = this;
    var startPlayback = function() {
	try {
	    _this.flash.startPlayback();
	} catch(e) { /*Fail Silently*/ };
    };

    if(!this.isActive){
	if(this.metadata) this.enableMetaData();
	this.element.className = c.replace("disabled", "enabled");
	if(this.flash.nodeName.toLowerCase() == "object" ||
	   this.flash.nodeName.toLowerCase() == "embed") {
	    try {
		//setTimeout(startPlayback, 1000);
		if(this.element.innerHTML == "") {
		    this.so.write(this.element);
		}
	    } catch (e) { /*Fail Silently*/ }
	}
	this.isActive = true;
    }
};

meltmedia.widget.MediaPlaya.prototype.disable = function() {
    var c = this.element.className.toString();
    if(this.isActive) {
	this.element.className = c.replace("enabled", "disabled");
	if(this.flash.nodeName.toLowerCase() == "object" ||
	   this.flash.nodeName.toLowerCase() == "embed") {
	    try {
		this.flash.stopPlayback();
	    } catch (e) { this.element.innerHTML = ""; }
	}
	this.isActive = false;
    }
};

meltmedia.widget.MediaPlaya.prototype.enableMetaData = function() {
    this.metadata.titleEl.innerHTML = this.metadata.title;
    this.metadata.titleEl.className = this.metadata.titleEl.className.replace("disabled", "enabled");

    var anchors = this.metadata.mediaEl.getElementsByTagName("A");
    for ( var i=0; i<anchors.length; i++ ) {
	if(anchors.item(i).href.indexOf("wmv") > -1) {
	    anchors.item(i).href = this.metadata.wmv;
	} else if (anchors.item(i).href.indexOf("mov") > -1 ||
		   anchors.item(i).href.indexOf("mp4") > -1) {   
	    anchors.item(i).href = this.metadata.mov;
	}
    }
    this.metadata.mediaEl.className = this.metadata.mediaEl.className.replace("disabled", "enabled");
};

meltmedia.widget.MediaPlaya.prototype.disableMetaData = function() {
    this.metadata.titleEl.className = this.metadata.titleEl.className.replace("enabled", "disabled");
    this.metadata.mediaEl.className = this.metadata.mediaEl.className.replace("enabled", "disabled");
    var anchors = this.metadata.mediaEl.getElementsByTagName("A");
    for ( var i=0; i<anchors.length; i++ ) {
	if(anchors.item(i).href.indexOf("wmv") > -1) {
	    anchors.item(i).href = "?file=wmv";
	} else if (anchors.item(i).href.indexOf("mov") > -1 ||
		   anchors.item(i).href.indexOf("mp4") > -1) {
	    anchors.item(i).href = "?file=mov";
	}
    }
};

meltmedia.widget.MediaPlaya.prototype.getFlashFail = function(el) {
    var node = el.firstChild;
    while(node) {
	//scan the parent level of elements to find one with the matching CSS class
	if(node.className) {
	    if(node.className.indexOf("flash-fail") > -1) {
		// copy the contents of the node and return it
		var newNode = node.innerHTML;
		return newNode;
	    }
	}
	node = node.nextSibling;
    }
    return null;
};

meltmedia.widget.MediaPlaya.prototype.setStyle = function(el) {
    for (var k in this.style) {
	el.style[k] = this.style[k];
    }
};

meltmedia.widget.MediaPlaya.prototype.copyConfig = function(o, p) {
    for (var k in p) {
	o[k] = p[k];
    }
};

meltmedia.widget.MediaPlaya.prototype.addParams = function() {
    for(var key in this.params) {
	this.so.addParam(key, this.params[key]);
    }
};

meltmedia.widget.MediaPlaya.prototype.addVariables = function() {
    for(var key in this.variables) {
	this.so.addVariable(key, this.variables[key]);
    }
};

meltmedia.widget.MediaPlaya.prototype.swapDashForCap = function(s) {
    while(s.indexOf("-") > -1) {
	var i = s.indexOf("-");
	var a = s.substring(0, i);
	var b = s.substring(i+1, i+2).toUpperCase();
	var c = s.substring(i+2, s.length);
	s = a + b + c;
    }
    return s;
};
