/* 
vPIP version 1.13i Beta 
    * vPIP changed constructDiv to using the link parentNode innerHTML to construct it's hVlog DIV 
    
* Next:
*   * 
	 
Installation and usage page starts at:  http://vpip.org/videos-playing-in-place/

vPIP generates code from the hVlog format:
   <div class="hVlog">
      <a href="{url to videoblog file}" rel="enclosure" title="{title}" {type="video/{mime type}}" {class="hVlogTarget"} onclick=?vPIPPlay(this, {...})?> 
	  	<img src="{url to image file}" />
	</a>...
    <a href="{url to videoblog file}" rel="enclosure" title="{title}" {type="video/{mime type}}" onclick=?vPIPPlay(this, {...})?> 
	  	{Text description of movie type}
	</a>...
	<p>{Text on videoblog}</p>
   </div>
Note:  <a has the "onclick=..." to run vPIP:
      <a href="{url to videoblog file}" rel="enclosure" title="{title}" {type="video/{mime type}} 
	       onclick=onclick="vPIPShow({'width={width number including controller}, height={height number including controller},controller={true/false}, revert={true/false}...'})"> 

Acknowledgements
----------------
vPIP was originaly inspired in August, 2005 on seeing videos that popped into the location on 
Steve Garfields, http://stevegarfield.blogs.com/, vlog site.  The current version is partially 
based on input from Andreas Haugstrup, http://www.solitude.dk/ ,  and his script, video-link.js, 
and input from Josh Kinberg, http://fireant.tv/ .  Encouragement, testing and usage comes from 
the members of the videoblogging yahoo group, http://groups.yahoo.com/group/videoblogging/ .

March 2006

 * License (X11 License)
 * ===================================================================
 *  Copyright 2006-2007  Enric Teller  (email: enric@vpip.org)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy 
 * of this software and associated documentation files (the "Software"), to 
 * deal in the Software without restriction, including without limitation the 
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
 * sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in 
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.

 * Except as contained in this notice, the name of the author or copyright 
 * holders shall not be used in advertising or otherwise to promote the sale, 
 * use or other dealings in this Software without prior written authorization 
 * from the author or copyright holders.
 * 
 * ===================================================================
 *
 *  
ThickBox
--------
	
 Thickbox - One box to rule them all.
 By Cody Lindley (http://www.codylindley.com)
 Under an Attribution, Share Alike License
 Thickbox is built on top of the very light weight jquery library.

*/

/*
 * Replace the link with an embed of the media file (video or audio) 
 * 
 * @param oLink
 * 			The link that called vPIPPlay
 * @param sParam
 * 			The embed parameters
 * @param sFlashVars
 * 			Variables passed to flash video player (either included -- cineViewer.swf -- or specified)
 * @param sThickBox
 * 			ThickBox parameters
 * @param sJump
 * 			Time location to jump in movie
 * 
 */
function vPIPPlay(_oLink, _sParams, _sFlashVars, _sThickBox, _sJump, _byDebug) {
	
	if (vpipPlayerRef == undefined || vpipPlayerRef == null) {
		var vpipPlayer = new vPIPPlayer(_oLink, _sParams, _sFlashVars, _sThickBox, _sJump, _byDebug);
		//Allow vpipPlayer to be accessed from external functions
		vpipPlayerRef = vpipPlayer;
	}
	else {
		// Get the existing vPIPPlayer that can hold multiple vPIP containers.
		var vpipPlayer = vpipPlayerRef;
		vpipPlayer.setStartup(_oLink, _sParams, _sFlashVars, _sThickBox, _sJump, _byDebug);
	}
	
	if (vpipPlayer.init()){
		vpipPlayer.show();
		
		return false;
	}
	else {
		if (vpipPlayer.oLink.href.toLowerCase().indexOf("http://") > -1)
			window.open(vpipPlayer.oLink.href, "_self");
		
		return true;	
	}
}

/* aDIV's array holds the DIVs that have been activated.
 * structure:
	[0]... divs
		[0] oDiv
		[1] DIVid
		[2] OrigHTML
		[3]... links
			[0] Open/Close
			[1] HREF
			[2] Width
			[3] Height
			[4] Autostart
			[5] Controller
			[6] Name
			[7] KioskMode
			[8] Target
			[9] Loop
			[10] Quality
			[11] BGColor
			[12] FlashMedia
			[13] Scale
			[14] AddControlHeight
		 	[15] Revert
		 	[16] ShowCloseBtn
		 	[17] LinkID
*/
//Constants for aDIV Array positions for accessing array elements
vPIPPlayer.DIVPOS = 0; 
vPIPPlayer.DIVIDPOS = 1;
vPIPPlayer.ORIGHTMLPOS = 2;
vPIPPlayer.LINKSARRAYPOS = 3;

//Link Array position constants
vPIPPlayer.OPENPOS = 0;
vPIPPlayer.HREFPOS = 1;
vPIPPlayer.WIDTHPOS = 2;
vPIPPlayer.HEIGHTPOS = 3;
vPIPPlayer.FLASHWIDTH = 320; 		     //Internal Flash Player width
vPIPPlayer.FLASHHEIGHT  = 240; 		     //Internal Flash Player height
vPIPPlayer.FLASHCONTROLBARHEIGHT  = 20;  //Height of the internal Flash Player control bar
vPIPPlayer.QTCONTROLBARHEIGHT  = 16;     //Height of the quicktime control bar
vPIPPlayer.WMCONTROLBARHEIGHT  = 16;     //Height of the windows media control bar
vPIPPlayer.AUTOSTARTPOS = 4;
vPIPPlayer.CONTROLLERPOS = 5;
vPIPPlayer.NAMEPOS = 6;
vPIPPlayer.KIOSKMODEPOS = 7;
vPIPPlayer.TARGETPOS = 8;
vPIPPlayer.LOOPPOS = 9;
vPIPPlayer.QUALITYPOS = 10;
vPIPPlayer.BGCOLORPOS = 11;
vPIPPlayer.FLASHMEDIAPOS = 12;
vPIPPlayer.SCALEPOS = 13;
vPIPPlayer.ADDCONTROLHEIGHTPOS = 14;
vPIPPlayer.REVERTPOS = 15;
vPIPPlayer.SHOWCLOSEBTNPOS = 16;
vPIPPlayer.LINKIDPOS = 17;

//Movie embed default constants
vPIPPlayer.WIDTH = 320; 			//Movie width
vPIPPlayer.HEIGHT  = 240; 			//Movie height with controller (if enabled)
vPIPPlayer.AUTOSTART = "true"; 		//Whether the movie automaticaly plays on initiation
vPIPPlayer.CONTROLLER = "true";		//Whether the movie controller is active
vPIPPlayer.NAME = "" 				//Name and ID of movie
vPIPPlayer.KIOSKMODE = "false" 		//Quicktime kioskmode parameter
vPIPPlayer.TARGET = "embed" 		//Quicktime target parameter
vPIPPlayer.LOOP = "false" 			//Quicktime loop parameter
vPIPPlayer.QUALITY = "high" 		//Flash quality parameter
vPIPPlayer.BGCOLOR = "#FFFFFF";		//Flash background color parameter
vPIPPlayer.FLASHMEDIA = "false"		//Whether the movie is a Flash Media.  If true, the internal Flash video player is used.
vPIPPlayer.SCALE = "noScale"		//The scaling method for the embedded flash video player
vPIPPlayer.ADDCONTROLHEIGHT = "true"; //Whether to add the height of the control to the embed
vPIPPlayer.REVERT = "true"; 		//Whether to revert to original elements in DIV container when another movie is selected
vPIPPlayer.SHOWCLOSEBTN = "true";	// Whether the Close button appears above the movie

//Internal Flash video Player
vPIPPlayer.FLASHMEDIAPLAYER = "cineViewer-002a.swf";

//The Safari build where releasing an embedded movie works.
vPIPPlayer.WORKINGSAFARIBUILD = 420;

//Whether the vPIPPlayer has been opened to embed
vPIPPlayer.prototype.isOpen = false;

vPIPPlayer.glDivs;                 // Global divs array

//Global reference to vPIPPlayer object
var vpipPlayerRef;

//The item (text, image, etc.) that displays to activate closing the ThickBox instance.
var vPIPThickBoxCloseItem = "close";

function vPIPPlayer(_oLink, _sParams, _sFlashVars, _sThickBox, _sJump, _byDebug) {

	this.setStartup(_oLink, _sParams, _sFlashVars, _sThickBox, _sJump, _byDebug);
	
	this.aDIVs = new Array();
	//Current link array position
	this.iInitiator = 0;

	aParams = _sParams.split(",");
	iIDPos = aParams.findFirst(/id=/i);
	if (iIDPos != null) 
	{
		sID = aParams[iIDPos];
		var iPos = sID.indexOf("=");
		if (iPos > -1)
		{
			sID = sID.substr(iPos+1);
		}	
	}
	else
		sID = null;
	// Get path to vPIP.js
	this.vPIPpath = vPIP_getPath(sID);
			
}

vPIPPlayer.prototype.setStartup = function(_oLink, _sParams, _sFlashVars, _sThickBox, _sJump, _byDebug) {
	// Record parameters in vPIPPlayer properties
	this.oLink = _oLink;
	this.sParams = _sParams;
	this.sFlashVars = _sFlashVars;
	this.sThickBox = _sThickBox;
	this.sJump = _sJump;
	//Wether in Debug mode
	if (_byDebug != undefined)
		this.byDebug = _byDebug
	else if (this.byDebug == undefined)
		this.byDebug = false
	
	if (this.byDebug)
	{
		if (this.sFlashVars.length == 0)
			this.sFlashVars += "byDebug=true";
		else
			this.sFlashVars += "&byDebug=false";
		
	}
}

vPIPPlayer.prototype.init = function() {
		
	//Get the DIV container of the link to 
	this.oDiv = vPIP_getContainer("hVlog", this.oLink);
	
	/*= this.oLink.parentNode;
	while (this.oDiv != undefined && this.oDiv != null && 
			this.oDiv.nodeName.toLowerCase() != "div" &&
			(vPIPPlayer.findAttribute(this.oDiv, "class") == null || 
			vPIPPlayer.findAttribute(this.oDiv, "class").toLowerCase() != "hvlog")) {
		this.oDiv = this.oDiv.parentNode;
	}*/
	
	//If anchor link is missing container div, create it.
	if (this.oDiv == undefined || this.oDiv == null || 
		this.oDiv.nodeName.toLowerCase() != "div" || 
		vPIPPlayer.findAttribute(this.oDiv, "class") == null ||
		vPIPPlayer.findAttribute(this.oDiv, "class").toLowerCase() != "hvlog") {
		
		this.oDiv = this.constructDiv(this.oLink);
		
		if (this.oDiv != undefined && this.oDiv != null && 
			this.oDiv.nodeName.toLowerCase() == "div" && 
			vPIPPlayer.findAttribute(this.oDiv, "class") != null &&
			vPIPPlayer.findAttribute(this.oDiv, "class").toLowerCase() == "hvlog") {
			
			this.oLink.parentNode.replaceChild(this.oDiv, this.oLink);
			this.oLink = this.oDiv.firstChild;
		}
	}
	
	if (this.oDiv == undefined || this.oDiv == null || 
		this.oDiv.nodeName.toLowerCase() != "div" || 
		vPIPPlayer.findAttribute(this.oDiv, "class") == null ||
		vPIPPlayer.findAttribute(this.oDiv, "class").toLowerCase() != "hvlog")
		
		this.byDivExists = false;
	else
		this.byDivExists = true;
	
	if (this.byDivExists) {
		var byDivFound = false;
		
		//If viewing notication object exists, create local object
		//  (**to be implemented**)
		//if (typeof _vPIP_NotifyViewing == "function") {
		//	vpip_NotifyViewing = new _vPIP_NotifyViewing();
		//}
		
		// Locate the current DIV in the aDIVs array of DIVs
		this.iNextPos = this.findDIV(this.oDiv);
		// If DIV not found set to create a new entry in the aDIVs array of DIVs
		if (this.iNextPos == -1) 
			this.iNextPos = this.aDIVs.length;
		else
			byDivFound = true;
		
		// The ID value of the LINK	
		this.sLinkid = "";
		
		this.sHREF = vPIPPlayer.toAlphaNum(this.oLink.href, "~");
		if (! byDivFound) {	
			this.oDiv.setAttribute("id", "vPIP" + this.iNextPos);
			this.sOnClick = vPIPPlayer.toAlphaNum(this.oLink.onclick.toString());
			this.sLinkid = "vPIPMovie" + this.iInitiator;
			this.oLink.setAttribute("id", this.sLinkid);
			
			this.aDIVs[this.iNextPos] = new Array(3);
			this.aDIVs[this.iNextPos][vPIPPlayer.DIVPOS] = this.oDiv;
			this.aDIVs[this.iNextPos][vPIPPlayer.DIVIDPOS] = "vPIP" + this.iNextPos;
			
			this.aDIVs[this.iNextPos][3] = new Array(vPIPPlayer.LINKIDPOS+1);
			this.aDIVs[this.iNextPos][3][vPIPPlayer.OPENPOS] = false;
			this.aDIVs[this.iNextPos][3][vPIPPlayer.HREFPOS] = this.sHREF;
			this.aDIVs[this.iNextPos][3][vPIPPlayer.LINKIDPOS] = parseInt(this.sLinkid.substring(9));;
			
			this.iInitiator++;
		}
		else {
		
			this.byLinkFound = false;
			this.iNextLinkPos = -1;
			
			this.sLinkid = this.oLink.id;
			
			if (this.sLinkid != undefined && this.sLinkid != null && this.sLinkid.length > 9) {
				this.iLinkid = parseInt(this.sLinkid.substring(9));
				this.iNextLinkPos = this.findLinkInDiv(this.aDIVs[this.iNextPos], this.iLinkid);
				if (this.iNextLinkPos < 3) 
					this.iNextLinkPos = 3;
				else 
					this.byLinkFound = true;
			}
			else {
				this.iNextLinkPos = this.aDIVs[this.iNextPos].length;
				if (this.iNextLinkPos < 3) 
					this.iNextLinkPos = 3;
				this.sLinkid = "vPIPMovie" + this.iInitiator;
             	this.oLink.setAttribute("id", this.sLinkid);
             	
   				this.iInitiator++;
			}
			
			if (! this.byLinkFound) {
				this.aDIVs[this.iNextPos][this.iNextLinkPos] = new Array(vPIPPlayer.LINKIDPOS+1);
				this.aDIVs[this.iNextPos][this.iNextLinkPos][vPIPPlayer.OPENPOS] = false;
				this.aDIVs[this.iNextPos][this.iNextLinkPos][vPIPPlayer.HREFPOS] = this.sHREF;
				this.aDIVs[this.iNextPos][this.iNextLinkPos][vPIPPlayer.LINKIDPOS] = parseInt(this.sLinkid.substring(9));;
			}
			
		}
		
	}
	
	return true;
	
}

vPIPPlayer.prototype.show = function() {
	
	//Initialize the embed parameters
	this.iWidth = vPIPPlayer.WIDTH;					//Movie width
	this.iHeight  = vPIPPlayer.HEIGHT; 				//Movie height with controller (if enabled)
	this.byAutostart = vPIPPlayer.AUTOSTART; 		//Whether the movie automaticaly plays on initiation
	this.byController = vPIPPlayer.CONTROLLER; 		//Whether the movie controller is active
	this.sName = vPIPPlayer.NAME; 					//Name and ID of movie
	this.sKioskMode = vPIPPlayer.KIOSKMODE; 		//Quicktime kioskmode parameter
	this.sTarget = vPIPPlayer.TARGET; 				//Quicktime target parameter
	this.sLoop = vPIPPlayer.Loop; 					//Quicktime loop parameter
	this.sQuality = vPIPPlayer.QUALITY; 			//Flash quality parameter
	this.sBGColor = vPIPPlayer.BGCOLOR; 			//Flash background color parameter
	this.byFlashMedia = vPIPPlayer.FLASHMEDIA;		//Whether the movie is a Flash Media.  If true, the internal Flash video player is used.
	this.sScale = vPIPPlayer.SCALE;					//Scaling method for the embedded flash player
	this.byAddControlHeight = vPIPPlayer.ADDCONTROLHEIGHT; //Whether to add the height of the control to the embed
	this.byRevert = vPIPPlayer.REVERT; 				//Whether to revert to original elements in DIV container when another movie is selected
    
    // Whether the Close button appears above the movie
    this.byShowCloseBtn = vPIPPlayer.SHOWCLOSEBTN;	
    
    // General purpose variable for holding an array or string position.
	var iPos;   
	
	if (this.byDivExists) {
		if (this.oLink != undefined && this.oLink != null && this.oLink.nodeName.toLowerCase() == "a") {
		
			this.iCurrDIVid = parseInt(this.oDiv.id.substring(4));
			this.iCurrLinkid = parseInt(this.oLink.id.substring(9));
			this.iCurrLink = this.findLinkID(this.aDIVs[this.iCurrDIVid], this.iCurrLinkid);
	
			this.sHREF = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.HREFPOS];
			
			if (this.sHREF == undefined || this.sHREF == null)
				this.sHREF = this.oLink.href;
			
			if (this.sHREF != undefined && this.sHREF != null) {
	
				var movieType = vPIPPlayer.isMovieFile(this.oLink);
				this.sMimeType = movieType.sMimeType;
				this.sType = movieType.sType;
				this.sMediaFormat = movieType.sMediaFormat;
				this.sFileExt = movieType.sFileExt;
				
				//Set default Flash parameters
				if (this.sMediaFormat == "flash") {
					this.iWidth = vPIPPlayer.FLASHWIDTH;
					if (this.byAddControlHeight == "true")
					{
						this.iHeight = vPIPPlayer.FLASHHEIGHT + vPIPPlayer.FLASHCONTROLBARHEIGHT;
					}
					else 
					{
						this.iHeight = vPIPPlayer.FLASHHEIGHT;
					}
					if (this.sFileExt == ".flv")
						this.byFlashMedia = "true";
				}
				
				// Get movie parameters
				var byInitArray = true;
				//If movie operation settings already loaded
				if (this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.WIDTHPOS] != undefined) {
				  this.iWidth = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.WIDTHPOS];
				  this.iHeight = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.HEIGHTPOS];
				  this.byAutostart = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.AUTOSTARTPOS];
				  this.byController = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.CONTROLLERPOS];
				  this.sName = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.NAMEPOS];
				  this.sKioskMode = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.KIOSKMODEPOS];
				  this.sTarget = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.TARGETPOS];
				  this.sLoop = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.LOOPPOS];
				  this.sQuality = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.QUALITYPOS];
				  this.sBGColor = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.BGCOLORPOS];
				  this.byFlashMedia = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.FLASHMEDIAPOS];
				  this.sScale = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.SCALEPOS];
				  this.byAddControlHeight = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.ADDCONTROLHEIGHTPOS];
				  this.byRevert = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.REVERTPOS];
				  this.byShowCloseBtn = this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.SHOWCLOSEBTNPOS];
				  byInitArray = false;
				}
				// Load user movie operation settings
				else {
					if (this.sParams != undefined && this.sParams != null) {
						var aParams = this.sParams.split(",");
						var aMatch;
						for (var i=0; i < aParams.length; i++) {
							if (aMatch = aParams[i].match(/(\bwidth\b\s*=\s*)(\d*)/i)) {
							  this.iWidth = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bheight\b\s*=\s*)(\d*)/i)) {
							  this.iHeight = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bautostart\b\s*=\s*)(\w*)/i)) {
							  this.byAutostart = (aMatch[2].toLowerCase() === "true");
							}
							else if (aMatch = aParams[i].match(/(\bcontroller\b\s*=\s*)(\w*)/i)) {
							  this.byController = (aMatch[2].toLowerCase() === "true");
							}
							else if (aMatch = aParams[i].match(/(\bname\b\s*=\s*)(\w*)/i)) {
								this.sName = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bkioskmode\b\s*=\s*)(\w*)/i)) {
							  this.sKioskMode = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\btarget\b\s*=\s*)(\w*)/i)) {
							  this.sTarget = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bloop\b\s*=\s*)(\w*)/i)) {
							  this.sLoop = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bquality\b\s*=\s*)(\w*)/i)) {
							  this.sQuality = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bbgcolor\b\s*=\s*)(\w*)/i)) {
							  this.sBGColor = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bflv\b\s*=\s*)(\w*)/i)) {
							  this.byFlashMedia = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\bscale\b\s*=\s*)(\w*)/i)) {
							  this.sScale = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\baddcontrolheight\b\s*=\s*)(\w*)/i)) {
							  this.byAddControlHeight = aMatch[2];
							}
							else if (aMatch = aParams[i].match(/(\brevert\b\s*=\s*)(\w*)/i)) {
							  this.byRevert = (aMatch[2].toLowerCase() === "true");
							}
							else if (aMatch = aParams[i].match(/(\bshowclose\b\s*=\s*)(\w*)/i)) {
							  this.byShowCloseBtn = (aMatch[2].toLowerCase() === "true");
							}
						}
						//Add control bar height to display height
						if (this.sType == "video" || this.sType == "application") 
						{
							if (this.byAddControlHeight == "true")
							{
								if (this.sMediaFormat == "quicktime") 
								{
									this.iHeight = (Number(this.iHeight) + vPIPPlayer.QTCONTROLBARHEIGHT).toString();
								}
								else if (this.sMediaFormat == "windowsmedia") 
								{
									this.iHeight = (Number(this.iHeight) + vPIPPlayer.WMCONTROLBARHEIGHT).toString();
								}
								else if (this.sMediaFormat == "flash") 
								{
									this.iHeight = (Number(this.iHeight) + vPIPPlayer.FLASHCONTROLBARHEIGHT).toString();
								}
							}
						}
					}
				}
	
				//If this DIV is already open from a link, close it
				this.closeThisDiv(this.aDIVs, this.iCurrDIVid);
				
				var sInnerHTML = this.oDiv.innerHTML;
				//Add the 2nd dimension
				this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.OPENPOS] = false;  // default to embed not opened.
				//If no id Name specified for embed, assign the link's number
				if (this.sName == undefined || this.sName == null || this.sName == "") {
					this.sName = "Embed" + this.iCurrLinkid;
				}
				
				// If array already initialized, don't init.
				if (byInitArray) {
					this.aDIVs[this.iCurrDIVid][vPIPPlayer.ORIGHTMLPOS] = sInnerHTML;
					
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.WIDTHPOS] = 			this.iWidth;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.HEIGHTPOS] = 		this.iHeight;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.AUTOSTARTPOS] = 		this.byAutostart;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.CONTROLLERPOS] = 	this.byController;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.NAMEPOS] = 			this.sName;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.KIOSKMODEPOS] = 		this.sKioskMode;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.TARGETPOS] = 		this.sTarget;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.LOOPPOS] = 			this.sLoop;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.QUALITYPOS] = 		this.sQuality;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.BGCOLORPOS] = 		this.sBGColor;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.FLASHMEDIAPOS] = 	this.byFlashMedia;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.SCALEPOS] = 			this.sScale;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.ADDCONTROLHEIGHTPOS] = this.byAddControlHeight;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.REVERTPOS] = 		this.byRevert;
					this.aDIVs[this.iCurrDIVid][this.iCurrLink][vPIPPlayer.SHOWCLOSEBTNPOS] = 	this.byShowCloseBtn;
				}
				
				// Replacement text 
				this.sReplace = "";
				if (this.sType == "video" || this.sType == "application") {
					if (this.sMediaFormat == "quicktime") {
						this.sReplace = "<object class='vPIPEmbed' width='" + this.iWidth + "' height='" + this.iHeight  + "' id='" + this.sName + "' classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B' ";
						if (this.sMimeType == "smil")
						{
							if (this.sTarget.toLowerCase() == "quicktimeplayer")
							{
								this.sReplace += "codebase='http://www.apple.com/qtactivex/qtplugin.cab'> <param name='src' value='" + this.vPIPpath + "InitSMIL.mov'><param name='qtsrc' value='" +  this.sHREF;
								this.sReplace += "'><param name='href' value='" + this.sHREF + "' /><param name='autohref' value='true";
							}
							else
								this.sReplace += "codebase='http://www.apple.com/qtactivex/qtplugin.cab'> <param name='src' value='" + this.vPIPpath + "InitSMIL.mov'><param name='qtsrc' value='" +  this.sHREF;
						}
						else
						{
							if (this.sTarget.toLowerCase() == "quicktimeplayer")
							{
								this.sReplace += "codebase='http://www.apple.com/qtactivex/qtplugin.cab'> <param name='src' value='" + this.vPIPpath + "InitSMIL.mov' >";
								this.sReplace += "<param name='href' value='" + this.sHREF + "' /><param name='autohref' value='true";
							}
							else
								this.sReplace += "codebase='http://www.apple.com/qtactivex/qtplugin.cab'> <param name='src' value='" + this.sHREF;
						}
						this.sReplace += "'><param name='autoplay' value='" + this.byAutostart + "'><param name='scale' value='tofit' />";
						if (this.sTarget.toLowerCase() == "quicktimeplayer")
							this.sReplace += "<param name='target' value='quicktimeplayer'><param name='loop' value='" + this.sLoop + "'>";
						else
							this.sReplace += "<param name='loop' value='" + this.sLoop + "'>";
						this.sReplace += "<param name='kioskmode' value='" + this.sKioskMode + "'><param name='controller' value='";
						if (this.sMimeType == "smil")
							if (this.sTarget.toLowerCase() == "quicktimeplayer")
							{
								this.sReplace += this.byController + "'><embed src='" + this.vPIPpath + "InitSMIL.mov' width='"+ this.iWidth + "' height='" + this.iHeight;
								this.sReplace += "' href='" + this.sHREF + "' autohref='true";
							}
							else
								this.sReplace += this.byController + "'><embed src='" + this.vPIPpath + "InitSMIL.mov' qtsrc='" + this.sHREF + "' width='"+ this.iWidth + "' height='" + this.iHeight;
						else
						{
							if (this.sTarget.toLowerCase() == "quicktimeplayer")
							{
								this.sReplace += this.byController + "'><embed src='" + this.vPIPpath + "InitSMIL.mov' width='"+ this.iWidth + "' height='" + this.iHeight;
								this.sReplace += "' href='" + this.sHREF + "' autohref='true";
							}
							else
								this.sReplace += this.byController + "'><embed src='" + this.sHREF + "' width='"+ this.iWidth + "' height='" + this.iHeight;
						}
						this.sReplace += "' name='" + this.sName + "' autoplay='" + this.byAutostart + "' controller='" + this.byController; 
						if (this.sTarget.toLowerCase() == "quicktimeplayer")
							this.sReplace += "' target='quicktimeplayer'  loop='" + this.sLoop;
						else
							this.sReplace += "' loop='" + this.sLoop;
						this.sReplace += "' kioskmode='" + this.sKioskMode + "' scale='tofit' pluginspage='http://www.apple.com/quicktime/download/'></embed></object>";
					}
					else if (this.sMediaFormat == "windowsmedia") {
							
						this.sReplace = "<OBJECT class='vPIPEmbed' CLASSID='CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95'  ";
						this.sReplace += "codebase='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701' ";
						this.sReplace += "standby='Loading Microsoft Windows Media Player components...' type='application/x-oleobject'  ";
						this.sReplace += "width='" + this.iWidth + "' height='" + this.iHeight + "' id='" + this.sName + "' >";
						this.sReplace += "<PARAM NAME='fileName' VALUE='" + this.sHREF + "' ><PARAM NAME='autoStart' VALUE='" + this.byAutostart;
						this.sReplace += "'><PARAM NAME='showControls' VALUE='" + this.byController + "'>";
						this.sReplace += "<EMBED type='application/x-mplayer2' pluginspage='http://www.microsoft.com/Windows/MediaPlayer/' id='";
						this.sReplace += this.sName + "' name='" + this.sName + "' showcontrols='" + this.byController + "' width='" + this.iWidth + "' height='"; 
						this.sReplace += this.iHeight + "' src='" + this.sHREF + "' autostart='" + this.byAutostart + "'></EMBED></OBJECT>";
					}
					else if (this.sMediaFormat == "flash") {
						this.sReplace = "<OBJECT class=\"vPIPEmbed\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" ";
						this.sReplace += "codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\" ";
						this.sReplace += "WIDTH=\"" + this.iWidth + "\" HEIGHT=\"" + this.iHeight + "\" id=\"" + this.sName + "\" >";
						this.sReplace += "<PARAM NAME=\"movie\" VALUE=\"";
						//Use a Flash video viewer to play the designated Flash Media
						if (this.byFlashMedia == "true") {
							 //  Set Flash type and location
						    this.sFlashMediaPlayer = this.vPIPpath + vPIPPlayer.FLASHMEDIAPLAYER;

							//Construct sJump for flashvars send
							var sJumpFlashVars= "";
							if (this.sJump != null && this.sJump.length > 0) {
								var aParams = this.sJump.split(",");
								var aMatch;
								for (var i=0; i < aParams.length; i++) {
									if (aMatch = aParams[i].match(/(\w*)(\s*=\s*)(.*)/)) 
										sJumpFlashVars += "&" + aMatch[1] + "=" + aMatch[3];
								}
							}
							
							this.sReplace += this.sFlashMediaPlayer + "\"> <PARAM NAME=\"quality\" VALUE=\"" + this.sQuality + "\" > <PARAM NAME=\"bgcolor\" VALUE=\"" + this.sBGColor + "\"> ";
							this.sReplace += "<param name=\"scale\" value=\"" + this.sScale + "\" ><param name=\"salign\" value=\"TL\" ><param name=\"allowfullscreen\" value=\"true\" >";
							this.sReplace += "<PARAM NAME=\"FlashVars\" VALUE=\"file=" + this.sHREF + "&cvhome=" + this.vPIPpath + "&width=" + this.iWidth + "&height=" + this.iHeight;
							this.sReplace += "&autostart=" + this.byAutostart;
							if (this.sFlashVars != undefined && this.sFlashVars != null && this.sFlashVars.length > 0)
								this.sReplace += "&" + this.sFlashVars;
							this.sReplace += sJumpFlashVars + "\" > <EMBED src=\"" + this.sFlashMediaPlayer + "\" quality=\"" + this.sQuality + "\" bgcolor=\"" + this.sBGColor + "\" width=\"" + this.iWidth + "\" height=\"" + this.iHeight + "\" ";
							this.sReplace += "  scale=\"" + this.sScale + "\" salign=\"TL\" allowfullscreen=\"true\" FlashVars=\"file=" + this.sHREF + "&cvhome=" + this.vPIPpath + "&width=" + this.iWidth + "&height=" + this.iHeight + "&autostart=" + this.byAutostart;
							if (this.sFlashVars != undefined && this.sFlashVars != null && this.sFlashVars.length > 0) {
								this.sReplace += "&" + this.sFlashVars;
							}
							this.sReplace += sJumpFlashVars + "\" NAME=\"" + this.sName + "\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\"> ";
						}
						else {
							this.sReplace += this.sHREF + "\"> <PARAM NAME=\"quality\" VALUE=\"" + this.sQuality + "\" > <PARAM NAME=\"bgcolor\" VALUE=\"" + this.sBGColor + "\"> ";
							if (this.sFlashVars != undefined && this.sFlashVars != null && this.sFlashVars.length > 0)
								this.sReplace += "<param name=\"scale\" value=\"" + this.sScale + "\" ><param name=\"salign\" value=\"TL\" ><param name=\"allowfullscreen\" value=\"true\" >";
								this.sReplace += "<PARAM NAME=\"FlashVars\" VALUE=\"" + this.sFlashVars + "\" > "; //Why?: + "&embdWidth=" + this.iWidth + "&embdHeight=" + this.iHeight + "\" > ";
							this.sReplace += "<EMBED src=\"" + this.sHREF + "\" quality=\"" + this.sQuality + "\" bgcolor=\"" + this.sBGColor + "\" width=\"" + this.iWidth + "\" height=\"" + this.iHeight + "\"";
							if (this.sFlashVars != undefined && this.sFlashVars != null && this.sFlashVars.length > 0)
								this.sReplace += "  scale=\"" + this.sScale + "\" salign=\"TL\" allowfullscreen=\"true\" FlashVars=\"" + this.sFlashVars + "\" "; //Why?: + "&embdWidth=" + this.iWidth + "&embdHeight=" + this.iHeight + "\" ";
							this.sReplace += "NAME=\"" + this.sName + "\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\"> ";
						}
						this.sReplace += "</EMBED> </OBJECT>";
					}
			         else if (this.sMediaFormat == "ogg") {
			
			          this.sReplace += "<applet code='com.fluendo.player.Cortado.class'  \n";
			          this.sReplace += "   archive='" + this.vPIPpath + "cortado.jar' \n";
			          this.sReplace += "   width='" + this.iWidth + "' height='" + this.iHeight + "'>\n";
			          this.sReplace += " <PARAM NAME='url' VALUE='" + this.sHREF + "' />\n";
			          this.sReplace += " <param name='local' value='false' />\n";
			          this.sReplace += " <PARAM NAME='keepAspect' VALUE='true' />\n";
			          this.sReplace += " <PARAM NAME='video' VALUE='true' />\n";
			          this.sReplace += " <PARAM NAME='audio' VALUE='true' />\n";
			          this.sReplace += " <PARAM NAME='bufferSize' VALUE='200' />\n";
			          this.sReplace += "</applet>\n";
					}
					
					if (this.sReplace.length > 0) {
						if (this.byDebug)
							alert( this.sReplace);
	
						var sUserAgent = navigator.userAgent;
						this.bySafari = sUserAgent.indexOf('Safari') > -1;
						this.byOpera = sUserAgent.indexOf('Opera') > -1;
						this.byIE7 = sUserAgent.indexOf("MSIE 7") > -1;
						this.byIE6 = sUserAgent.indexOf("MSIE 6") > -1;
						this.nSafariBuild = -1;
						if (this.bySafari) {
							this.nSafariBuild = Number(sUserAgent.substring(sUserAgent.indexOf('Safari')+7));
						}
						//Get any Thickbox parameters
						this.byThickBox = false;
						//Setup ThickBox parameters
						if (this.sThickBox != undefined && this.sThickBox != null && this.sThickBox.length > 0) { // See if it works on Safari & IE6 && ! this.bySafari && ! this.byIE6) {
							var aParams = this.sThickBox.split(",");
							var aMatch;
							var sThickBoxActive = "true";
							var sThickBoxCaption = "";
							var sThickBoxBackground = "#E1E1E1";
							for (var i=0; i < aParams.length; i++) {
								if (aMatch = aParams[i].match(/(active\s*=\s*)(\w*)/i)) {
								  sThickBoxActive = aMatch[2];
								}
								else if (aMatch = aParams[i].match(/(caption\s*=\s*)(.*)/i)) {
								  sThickBoxCaption = unescape(aMatch[2]);
								}
								else if (aMatch = aParams[i].match(/(background\s*=\s*)(\d*)/i)) {
								  sThickBoxBackground = aMatch[2];
	