//some Flags to indicate the environment
var isFF  = (navigator.userAgent.toLowerCase().indexOf("gecko") > -1) ? true : false;
var isIE  = (navigator.appVersion.toLowerCase().indexOf("msie") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1) ? true : false;

function callback(id){
	alert(id);
}

FlashMoviePlayerInstances_ = [];
function getFlashMoviePlayer(idVal){
	var ret = null;
	if ( idVal != null ) {
		for ( var i = 0; i < FlashMoviePlayerInstances_.length; i++ ) {
			var nextInst = FlashMoviePlayerInstances_[i];
			if ( nextInst.getId() == idVal ) {
				ret = nextInst;
				break;
			}
		}
	}
	else {
		if ( FlashMoviePlayerInstances_.length > 0 ) 
			ret = FlashMoviePlayerInstances_[0];
	}
	return ret;
}

/**
	Constructor of the flash media player.
	Configuration values are set in the xml file. 
	Its name can be given, default filename is playlist.xml
	@param htmlElement The parent node to hang the flash object in. Must not be null.
	@param string/integer The x-position of the flash object. Can be null.
	@param string/integer The y-position of the flash object. Can be null.
	@param string Does not work now! The name of the xml configuration file. Can be null.
	@param string The name of the company to be displayed. Can be null. 

*/
function FlashMoviePlayer(parentHtmlElem, xmlConfig, posX, posY, companyName) {

	if ( parentHtmlElem == null )
		throw "Given parent element must not be null in constructor of FlashMoviePlayer!";
	if ( posX == null )	posX = "0px";
	if ( posY == null )	posY = "0px";
	if ( ! isNaN(posX) ) posX = posX + "px";
	if ( ! isNaN(posY) ) posY = posY + "px";
	if ( xmlConfig == null ) xmlConfig = "Resource/SiteGuide/playlist.xml";
	if ( companyName == null ) companyName = "";
		
	FlashMoviePlayerInstances_.push(this);

	var _posY = posY;
	var _posX = posX;
	var _htmlElem = parentHtmlElem;
	var _htmlObject = null;
	var _elemId = generateRandomString();
	
	//Array of necessary configuration parameter	
	var callParameter = [
		"src", "Resource/SiteGuide/invenitSiteguide.swf",
		"wmode", "transparent",		
		"companyName", companyName,		
		"style", "position: absolute; top: " + _posY + "; left: " + _posX + ";",
		"id",_elemId,
		"align", "middle",
		"FlashVars", "xmlConfig="+xmlConfig+"&id="+_elemId+"&companyName="+companyName,
		"quality", "high",
		"name", "VideoPlayer",
		"allowScriptAccess","sameDomain",
		"type", "application/x-shockwave-flash",
		"pluginspage", "http://www.adobe.com/go/getflashplayer"];
		
	//attach the html source of the flash object to the parent element	
	_htmlElem.innerHTML += _getHtmlSource();
	_htmlObject = _htmlElem.childNodes[0];

/*	var newElem = document.createElement("div");
	newElem.innerHTML += _getHtmlSource();
	_htmlObject = newElem.firstChild;
	document.body.appendChild(newElem.firstChild);
	_htmlObject.style.zIndex = 3000;*/
	
	//produces the html source of the flash object
	function _getHtmlSource(){
	  var ret = 
	    _GenerateArgs
	    (  callParameter, "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
	     , "application/x-shockwave-flash"
	    );
	  return _GenerateHtmlSource(ret.objAttrs, ret.params, ret.embedAttrs);
	}
	
	this.getHtmlElem = function()
	{
	    return document.getElementById(this.getId());
	}
	
	//Returns an object holding the configuration arguments of the html object
	function _GenerateArgs(args, srcParamName, classid, mimeType){
	  var ret = new Object();
	  ret.embedAttrs = new Object();
	  ret.params = new Object();
	  ret.objAttrs = new Object();
	  for (var i=0; i < args.length; i=i+2){
	    var currArg = args[i].toLowerCase();    
	
	    switch (currArg){	
	      case "classid":
	        break;
	      case "pluginspage":
	        ret.embedAttrs[args[i]] = args[i+1];
	        break;
	      case "src":
	      case "movie":	
	        ret.embedAttrs["src"] = args[i+1];
	        ret.params[srcParamName] = args[i+1];
	        break;
	      case "onafterupdate":
	      case "onbeforeupdate":
	      case "onblur":
	      case "oncellchange":
	      case "onclick":
	      case "ondblClick":
	      case "ondrag":
	      case "ondragend":
	      case "ondragenter":
	      case "ondragleave":
	      case "ondragover":
	      case "ondrop":
	      case "onfinish":
	      case "onfocus":
	      case "onhelp":
	      case "onmousedown":
	      case "onmouseup":
	      case "onmouseover":
	      case "onmousemove":
	      case "onmouseout":
	      case "onkeypress":
	      case "onkeydown":
	      case "onkeyup":
	      case "onload":
	      case "onlosecapture":
	      case "onpropertychange":
	      case "onreadystatechange":
	      case "onrowsdelete":
	      case "onrowenter":
	      case "onrowexit":
	      case "onrowsinserted":
	      case "onstart":
	      case "onscroll":
	      case "onbeforeeditfocus":
	      case "onactivate":
	      case "onbeforedeactivate":
	      case "ondeactivate":
	      case "type":
	      case "codebase":
	        ret.objAttrs[args[i]] = args[i+1];
	        break;
	      case "id":
   	      case "style":
	      case "align":
	      case "vspace": 
	      case "hspace":
	      case "class":
	      case "title":
	      case "accesskey":
	      case "name":
	      case "tabindex":
	        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
	        break;
	      default:
	        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
	    }
	  }
	  ret.objAttrs["classid"] = classid;
	  if (mimeType) ret.embedAttrs["type"] = mimeType;
	  return ret;
	}
	
	//Generates the html source of the html element depending to the browser environment
	function _GenerateHtmlSource(objAttrs, params, embedAttrs) {
		var ret = '';
	    if (isIE && isWin && !isOpera)
	    {
			ret += '<object ';
	  		for (var i in objAttrs)
	  			ret += i + '="' + objAttrs[i] + '" ';
	  		ret += ">";
	  		for (var i in params)
	  			ret += '<param name="' + i + '" value="' + params[i] + '" /> ';
	  		ret += '</object>';
	    } else {
	  		ret += '<embed ';
	  		for (var i in embedAttrs)
	  			ret += i + '="' + embedAttrs[i] + '" ';
	  		ret += '> </embed>';
	    }
	    return ret;
	}
	
	this.playNextTrack = function() {
		document.getElementById(this.getId()).playNextTrack();
	}
	
	//Moves the html element representing the flash object to the given coordinates
	this.moveTo = function(posX, posY) {
		var objectElem = document.getElementById(_elemId);
		if ( objectElem != null ) {			
			objectElem.style.left = posX+"px";
			objectElem.style.top = posY+"px";
		}
	}
	
	//Closes the player
	this.closePlayer = function(){
		var objectElem = document.getElementById(_elemId);
		if ( objectElem != null ) {	
			if ( ! isFF ) {
				//this line crashes Firefox!!
				if ( objectElem.parentNode )
					objectElem.parentNode.removeChild(objectElem); 
			}
			else {
				objectElem.style.display = "none";
			}
		}
	}
	//Zooms the html element representing the flash object by given percent
	this.zoomPercent = function(percent) {
		var objectElem = document.getElementById(_elemId);
		if ( objectElem != null ) {
			var oldWidth = objectElem.clientWidth;
			var oldHeight = objectElem.clientHeight;
			objectElem.style.width = (oldWidth * percent/100) + "px";
			objectElem.style.height = (oldHeight * percent/100) + "px";
		}
	}
	
	//Sets the width of the html element representing the flash object by given values
	this.setSize = function(width, height) {
		if ( ! isNaN(width) ) width = width + "px"; 
		if ( ! isNaN(height) ) height = height + "px";
		var objectElem = document.getElementById(_elemId);
		if ( objectElem != null ) {
			objectElem.style.width = width;
			objectElem.style.height = height;
		}
	}	
	
	this.getId = function(){
		return _elemId;
	}
	
	this.getHtmlElem = function() {
	    return document.getElementById(this.getId());
	}
	
}



var debug = new Object();
var _debugWindow;
/**
	Writes the given string to an element named "stdOut".
	Usefull for debug-outputs.
	@param string The text to be written.
	@param bool If true, the current content will be deleted.
*/
debug.writeToStdOut = function(string, empty) 
{
    if ( _debugWindow == null 
      || _debugWindow.closed ) {
	    _debugWindow = window.open("","debugFenster","width=300,resizable=yes,height=700,left=0,top=0,scrollbars=yes");
	    try {
		    _debugWindow.document.body.style.overflow = "scroll";		
		    _debugWindow.document.body.scrollTop = _debugWindow.document.body.scrollHeight + 30;		
	    }
	    catch ( e ) {}
	    self.focus();
    }	

    try {
        if ( empty ) {
            util.removeAllChildren(_debugWindow.document.body);
        }
        
	    var pChild = _debugWindow.document.createElement("p");
	    pChild.appendChild(_debugWindow.document.createTextNode(string));		
	    _debugWindow.document.body.appendChild(pChild);
    }
    catch ( e ) {}
}

function ControlVersion()
{
	var version;
	var axo;
	var e;

	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful. 
			
			// default to the first public version
			version = "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";

			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;			
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			if ( descArray[3] != "" ) {
				tempArrayMinor = descArray[3].split("r");
			} else {
				tempArrayMinor = descArray[4].split("r");
			}
			var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function removePlayerFromDomTree(playerId){
	getFlashMoviePlayer(playerId).closePlayer();
}

/** Generates a likely guid based on a random seed. */
function generateRandomString()
{
    var result, i, j;
    result = '';
    for(j=0; j<6; j++)
    {
        i = (Math.floor(Math.random()*6)+10).toString(16).toUpperCase();
        result = result + i;
    }
    return result;
}
