var otm = otm ? otm : {};
otm.widget = otm.widget ? otm.widget : {};
otm.widget.embed = otm.widget.embed ? otm.widget.embed : {};

otm.widget.embed.FlashEmbed = function(flashDivIdArg, flashIdArg, widthArg, heightArg, styleArg, flashSrcArg, wmodeArg, bgcolorArg, scaleArg, flashVarsArg) {
	var flashDivId = flashDivIdArg;
	var flashId = flashIdArg;
	var width = widthArg;
	var height = heightArg;
	var style = styleArg;
	var flashSrc = flashSrcArg;
	var wmode = wmodeArg;
	var bgcolor = bgcolorArg;
	var scale = scaleArg;
	var flashVars = flashVarsArg;
	
	var parentDiv = null;
	var externalCallList = new Array();
	var processingExternalCall = false;

	function getFlashObject() {
		return document[flashId];
	}

	this.getFlashDiv = function() {
		return parentDiv;
	}

	this.render = function() {
		if(wmode == null || wmode == '')
			wmode = 'window';

		var params = {
			bgcolor: bgcolor,
			quality: "high",
			menu: "false",
			salign: "LT",
			scale: scale,
			allowscriptaccess: "sameDomain",
			wmode: wmode,
			flashvars: flashVars
		};

		var attributes = {
			id: flashId,
			name: flashId,
			align: "middle"
		};

		var flashDiv = document.createElement('div');
		flashDiv.setAttribute('id', flashId);

		var upgradeContent =  '<p align="center" style="padding : 5px;">Adobe Flash Plugin required. <a href="http://www.adobe.com/go/getflashplayer">Install or Upgrade</a> your version of Adobe Flash Player.<br/><br/>';
		upgradeContent += '<a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a>';
		upgradeContent += '</p>';

		flashDiv.innerHTML = upgradeContent;

		// Append the new div to the existing div
		parentDiv = document.getElementById(flashDivId);
		if(style != null && style != '') {
			parentDiv.setAttribute('style', style);
		}
		parentDiv.appendChild(flashDiv);

		swfobject.embedSWF(flashSrc, flashId, width, height, '8.0', false, flashVars, params, attributes);
	}

	function processCall() {
		var flashObject = getFlashObject();

		var delay = 500;

		if(flashObject == null) {
			setTimeout( function() { processCall() }, delay );
			return;
		}

		var callObject = externalCallList[0];

		var command = callObject.command;
		var arg = callObject.arg;
		var execCall = 'flashObject.' + command + '(arg);';

		var callbackMethod = callObject.callbackMethod;
		var callbackArg = null;

//		console.log("Calling:" + execCall + " on:" + flashObject + " flashId:" + flashId);
		try {
			callbackArg = eval(execCall);
		} catch(error) {
			setTimeout( function() { processCall() }, delay );
			return;
		}

		if(callbackMethod != null) {
			callbackMethod(callbackArg);
		}
		
		externalCallList.shift();
		processCallList();
	}

	function processCallList() {
		if(externalCallList.length < 1) {
			processingExternalCall = false;
			return;
		}

		processingExternalCall = true;

		processCall();
	}

	this.call = function(command, arg, callbackMethod) {
		externalCallList.push({command : command, arg : arg, callbackMethod : callbackMethod});

		if(processingExternalCall)
			return;

		processCallList();
    }

	this.callWithReturnValue = function(commandArg, argArg) {
		var flashObject = getFlashObject();
		var command = commandArg;
		var arg = argArg;

		var execCall = 'flashObject.' + command + '(arg);'

		var returnValue = null;
		try {
			returnValue = eval(execCall);
		} catch(error) { }
		
		return returnValue;
    }

	this.cleanup = function() {
		document.getElementById(flashDivId).innerHTML = '';
	}
}

otm.widget.embed.VideoPlayer = function(flashDivId, flashId, width, height, style, flashSrc, wmode, bgcolor, scale, flashVars) {
	var flashEmbed = new otm.widget.embed.FlashEmbed(flashDivId, flashId, width, height, style, flashSrc, wmode, bgcolor, scale, flashVars);

	this.pauseVideo = function() {
		flashEmbed.call("externalPauseVideo");
	}

	this.getCurrentVideoTime = function() {
		return flashEmbed.callWithReturnValue("getCurrentVideoTime");
	}

	this.call = function(command, arg, callbackMethod) {
		flashEmbed.call(command, arg, callbackMethod);
	}

	this.cleanup = function() {
		flashEmbed.call("externalCloseVideoStream");
		flashEmbed.cleanup();
	}

	this.render = function() {
		flashEmbed.render();
	}

}

var FlashEmbed = new Object();

FlashEmbed.embedAndRenderFlashObject = function(divId, width, height, src, wmode, bgcolor, scale, flashVars) {
	var flashObjId = 'swf_' + divId;
	var flashObj =  new otm.widget.embed.VideoPlayer(divId, flashObjId, width, height, null, src, wmode, bgcolor, scale, flashVars);
	flashObj.render();
	return flashObj;
}

FlashEmbed.playPreview = function(divId, flashVars) {
	return FlashEmbed.embedAndRenderFlashObject(divId, 368, 341, 'media/auth/PlayerAuth.swf?v=1.23', 'transparent', '#ffffff', 'noscale', flashVars);
}

FlashEmbed.playQuickAd = function(divId, flashVars) {
	return FlashEmbed.embedAndRenderFlashObject(divId, 320, 270, 'media/auth/PlayerSpotMixer.swf?v=1.02', '', '#ffffff', 'noscale', flashVars);
}

FlashEmbed.playThemePreview = function(divId, flashVars) {
	return FlashEmbed.embedAndRenderFlashObject(divId, 320, 240, 'media/auth/PlayerEcard.swf?v=0.02', '', '#000000', 'noscale', flashVars);
}

FlashEmbed.playEffectPreview = function(divId, flashVars) {
	return FlashEmbed.embedAndRenderFlashObject(divId, 100, 75, 'media/fxTransThumbs/EffectPreviewVideoPlayer.swf?v=0.02', 'transparent', '#ffffff', 'noscale', flashVars);
}

FlashEmbed.onRotatePreviewSelect = function(input, direction, previewAreaDivId, flashDisplayObj) {
	var directionString = new String(direction);
	if(directionString.toUpperCase() == "L") {
		if(input.value == 0) {
			input.value = 270
		} else if(input.value == 270) {
			input.value = 180;
		} else if(input.value == 180) {
			input.value = 90;
		} else if(input.value == 90) {
			input.value = 0;
		}
	} else if(directionString.toUpperCase() == "R") {
		if(input.value == 0) {
			input.value = 90;
		} else if(input.value == 90) {
			input.value = 180;
		} else if(input.value == 180) {
			input.value = 270;
		} else if(input.value == 270) {
			input.value = 0
		}
	}

    var previewAreaDiv = document.getElementById(previewAreaDivId); 
    var videoPreviewVisible = previewAreaDiv.style.display != 'none';

	var instanceMethod = videoPreviewVisible ? 'updateVRotation' : 'updateVStripRotation';
	flashDisplayObj.call( instanceMethod, input.value)
}
