/**
 * 
 * Copyright 2007
 * 
 * Paulius Uza
 * http://www.uza.lt
 * 
 * Dan Florio
 * http://www.polygeek.com
 * 
 * Project website:
 * http://code.google.com/p/custom-context-menu/
 * 
 * --
 * RightClick for Flash Player. 
 * Version 0.6.2
 * 
 */

var RightClick = {
	/**
	 *  Constructor
	 */ 
	init: function () { 
		this.FlashObjectID = "Captivate";
		this.FlashContainerID = "CaptivateContent";
		this.Cache = this.FlashObjectID;
		if(window.addEventListener){
			 window.addEventListener("mousedown", this.onGeckoMouse(), true);
		} else {
			document.getElementById(this.FlashContainerID).onmouseup = function() { document.getElementById(RightClick.FlashContainerID).releaseCapture(); }
			document.oncontextmenu = function(){ if(window.event.srcElement.id == RightClick.FlashObjectID) { return false; } else { RightClick.Cache = "nan"; }}
			document.getElementById(this.FlashContainerID).onmousedown = RightClick.onIEMouse;
		}
	},
	/**
	 * GECKO / WEBKIT event overkill
	 * @param {Object} eventObject
	 */
	killEvents: function(eventObject) {
		if(eventObject) {
			if (eventObject.stopPropagation) eventObject.stopPropagation();
			if (eventObject.preventDefault) eventObject.preventDefault();
			if (eventObject.preventCapture) eventObject.preventCapture();
	   		if (eventObject.preventBubble) eventObject.preventBubble();
		}
	},
	/**
	 * GECKO / WEBKIT call right click
	 * @param {Object} ev
	 */
	onGeckoMouse: function(ev) {
	  	return function(ev) {
	    if (ev.button == 2) {
			RightClick.killEvents(ev);
			if(ev.target.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
	    		RightClick.call();
			}
			RightClick.Cache = ev.target.id;
		}
	  }
	},
	/**
	 * IE call right click
	 * @param {Object} ev
	 */
	onIEMouse: function() {
	  	if (event.button == 2) {
			if(window.event.srcElement.id == RightClick.FlashObjectID && RightClick.Cache == RightClick.FlashObjectID) {
				RightClick.call(); 
			}
			document.getElementById(RightClick.FlashContainerID).setCapture();
			if(window.event.srcElement.id)
			RightClick.Cache = window.event.srcElement.id;
		}
	},
	/**
	 * Main call to Flash External Interface
	 */
	call: function() {
		document.getElementById(this.FlashObjectID).rightClick();
	}
}

/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */


if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;



//Copyright 2006 Adobe Systems, Inc. All rights reserved.
//
//This is the base class for implementing an Active Content extension -- a piece of code that knows how to rewrite OBJECT tags so that they comply to the Eolas patent without making the browser display the "Press OK to continue loading the content of this page" message box.
//
// When the user hovers the mouse over an ActiveX control in Internet Explorer 6 updated with (April 2006) Cumulative Security Update (912812) or Internet Explorer 7, the following message is displayed:
// “Press Spacebar or Enter to activate and use this control.”
// The user can now click the mouse anywhere inside the ActiveX control area, or press the Spacebar or Enter key to activate the control.
// The standard.js file has been introduced to retain the earlier behavior where the control remains interactive from the first click to the last.

function writeDocument(s){document.write(s);}

//These two variables should be present on the window object so that this interface is available for Execute JS workflow also.
window.cpAPIInterface = undefined;
window.cpAPIEventEmitter = undefined;

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function indexOf(array, obj) {
	if(!array)
		return -1;

	if (!Array.prototype.indexOf){
		for (var i = 0; i < array.length; ++i) {
	        if (array[i] === obj) { return i; }
	    }
	    return -1;
	}
	else
		return array.indexOf(obj);
}

function emitEvent(iEvent)
{
    if(!cpAPIInterface)
    {
    	cpAPIInterface = new CPAPIInterfaceClass();
    	if(!cpAPIEventEmitter)
    		cpAPIEventEmitter = cpAPIInterface.getEventEmitter();

    	if(iEvent.Name == "moduleReadyEvent" && 
    		document.createEvent)
		{
			var evt = document.createEvent("Events");
			evt.initEvent(iEvent.Name, true, true, null );

			var lEventHandlerWin = window.parent;
			evt.Data = cpAPIInterface;
			
			if(strURLParams && strURLParams.length > 0)
			{			
				var lParamPairs = strURLParams.split("&");
				for(var i = 0; i < lParamPairs.length; ++i)
				{
					var lParamPair = lParamPairs[i];
					if(lParamPair.length > 0)
					{
						var lParamPairArr = lParamPair.split("=");
						cpAPIInterface.setVariableValue(lParamPairArr[0],lParamPairArr[1]);
					}
				}
			}
			
			if(lEventHandlerWin)
				lEventHandlerWin.dispatchEvent(evt);
		}
    }    
    
    cpAPIEventEmitter.trigger(iEvent);
}

var EventEmitterClass = function()
{
	this.callbackFns = {};
}

EventEmitterClass.prototype.getGenericEventName = function(eventName)
{
	var leftRegExp = new RegExp("^CP");
	var rightRegExp = new RegExp("EVENT$");

	eventName = eventName.toUpperCase();
	
	eventName = eventName.replace(leftRegExp,"");
	eventName = eventName.replace(rightRegExp,"");

	return eventName;
}

EventEmitterClass.prototype.getCPEventName = function(eventName)
{
	var leftRegExp = new RegExp("^CPAPI_");
	
	eventName = eventName.replace(leftRegExp,"CP");
	
	eventName += "EVENT";

	return eventName.toUpperCase();
}

EventEmitterClass.prototype.addEventListener = function(eventName,fn,varName)
{
	var key = eventName;
	if(eventName == undefined)
	{
		eventName = "Default";	
	}
	else
		eventName = this.getCPEventName(eventName);
	
	var lCallbacks = [];
	if(key == "CPAPI_VARIABLEVALUECHANGED")
	{
		document.Captivate.cpEIJSAddEventListener(eventName,varName);
		if(this.callbackFns[key] == undefined)
			this.callbackFns[key] = new Object();
		if(this.callbackFns[key][varName] == undefined)
			this.callbackFns[key][varName] = new Array();

		lCallbacks = this.callbackFns[key][varName];
	}
	else
	{
		document.Captivate.cpEIJSAddEventListener(eventName);
		if(this.callbackFns[key] == undefined)
			this.callbackFns[key] = new Array();

		lCallbacks = this.callbackFns[key];
	}

	var index = indexOf(lCallbacks, fn);
	if( index < 0)
		lCallbacks.push(fn);
}

EventEmitterClass.prototype.removeEventListener = function(eventName,fn,varName)
{
	var key = eventName;
	if(eventName == undefined)
	{
		eventName = "Default";	
	}
	else
		eventName = this.getCPEventName(eventName);

	var lCallbacks = [];
	if(key == "CPAPI_VARIABLEVALUECHANGED")
	{
		document.Captivate.cpEIJSRemoveEventListener(eventName,varName);
		if(this.callbackFns[key] == undefined)
			return;
		if(this.callbackFns[key][varName] == undefined)
			return;
		lCallbacks = this.callbackFns[key][varName];
	}
	else
	{
		document.Captivate.cpEIJSRemoveEventListener(eventName);	
		if(this.callbackFns[key] == undefined)
			return;
		lCallbacks = this.callbackFns[key];
	}
	
	var index = indexOf(lCallbacks, fn);
	if( index > -1){
		lCallbacks.splice(index, 1);
	}
}

EventEmitterClass.prototype.trigger = function(event)
{	
	var lEvent = Object(event);
	lEvent.Name = "CPAPI_" + this.getGenericEventName(lEvent.Name);
	var lCallbacks = this.callbackFns[lEvent.Name.toUpperCase()];
	if(lEvent.Name == "CPAPI_VARIABLEVALUECHANGED")
	{
		if(!lCallbacks)
			return;
		var lVarName = lEvent.Data.varName;
		lCallbacks = lCallbacks[lVarName];
	}
	
	if(!lCallbacks)
		return;
	for (var i = 0; i < lCallbacks.length; i++) {
		lCallbacks[i](lEvent);
	}
}

var CPAPIInterfaceClass = function()
{
	this.m_eventEmitter = undefined;
	this.objCP = document.Captivate;
}

CPAPIInterfaceClass.prototype = 
{
	play : function()
	{
	    this.setVariableValue("cpCmndResume", 1);
	},
	pause : function()
	{
	    this.setVariableValue("cpCmndPause", 1);
	},
	rewind : function()
	{
	    this.setVariableValue("rdcmndRewindAndPlay", true);
	},
	next : function()
	{
	    this.setVariableValue("cpCmndNext", true);
	},
	previous :function()
	{
	    this.setVariableValue("cpCmndPrevious", true);
	},
	fastFoward :function()
	{
	    this.setVariableValue("cpCmndFastForward", true);
	},
	getPlaySpeed : function()
	{
	    return this.getVariableValue("cpInfoFPS");
	},
	getDurationInFrames : function()
	{
	    return this.getVariableValue("cpInfoFrameCount");
	},
	getDurationInSeconds : function()
	{	
		return this.getDurationInFrames() / this.getPlaySpeed();
	},
	getVolume : function()
	{
	    return this.getVariableValue("cpCmndVolume");
	},		
	setVolume : function(vol)
	{
	    this.setVariableValue("cpCmndVolume", vol);
	},
	navigateToTime : function(timeinmilliseconds)
	{
		//convert time to frame and 
	    var frame = timeinmilliseconds * this.getPlaySpeed() / 1000;
		this.setVariableValue("cpCmndGotoFrameAndResume",frame);
	},
	canNavigateToTime : function(timeinmilliseconds)
	{
	    var frame = timeinmilliseconds * this.getPlaySpeed() / 1000;	
		return this.objCP.cpEIJSAllowedToGoToTime(frame);
	},
	getCurrentFrame : function()
	{
	    return this.getVariableValue("cpInfoCurrentFrame");
	},
	getCurrentSlideIndex : function()
	{
	    return this.getVariableValue("cpInfoCurrentSlide");
	},
	getVariableValue: function(varName)
	{
		var retValue = this.objCP.cpEIGetValue("m_VarHandle." + varName);
		if(isNumber(retValue))
			return parseFloat(retValue);
		else
			return retValue;
	},
	setVariableValue: function(varName,val)
	{
		this.objCP.cpEISetValue("m_VarHandle." + varName,val);
	},
	gotoSlide: function(val)
	{
		this.setVariableValue("cpCmndGotoSlide",val);
	},
	getEventEmitter : function()
	{
		if(this.m_eventEmitter == undefined)
			this.m_eventEmitter = new EventEmitterClass();
		return this.m_eventEmitter;
	},
	isSWFOrHTMLContent: function()
	{
		return 'swf';
	}
};