var mediaplayerDebug = "mediaplayer";

var players 			= [];
var maxDimTries			= 5;
var maxDimByteWait 		= 4000000;
var mediaInWaiting 		= [];
var mediaContainer		= '#body';
var mediaOverrideHeight = true;
var currentSrc			= false;

//video max dimensions
var mediaMaxHeight 		= 540;
var mediaMaxWidth 		= 720;
var mediaMaxHeight 		= 1080;
var mediaMaxWidth 		= 1440;

//on swf embedded
function onMediaPlayerEmbeddedResponse(e)
{	
	if(!e.success)
	{
		//no flash?
		debug(mediaplayerDebug, "swf embedding error");
		mediaInWaiting.push(e);
		//queueVideoLoaded++;
	}
	else
	{
		//on success
		var player = getOMSFPlayer(e.id);
		if(player)
		{
			//if player has already been stored
			//add to media waiting list
			mediaInWaiting.push(e);
			debug(mediaplayerDebug, "connection already bridged add to inwaiting");
		}

	}
	debug(mediaplayerDebug,  "e.success = " + e.success +", e.id = "+ e.id +", e.ref = "+ e.ref);
}

//called when queue intialisation finished
function checkMediaQueue()
{
	//check if any media waiting
	if(mediaInWaiting.length)
	{
		debug(mediaplayerDebug, "media in waiting: "+mediaInWaiting.length+" item(s)");
		
		//loop through all waiting objects
		for(var i=0; i < mediaInWaiting.length; i++)
		{
			//if embedding was success
			var e = mediaInWaiting[i];
			playerId = e.id;
			if(e.success)
			{
				//get player
				var player = getOMSFPlayer(playerId);
				if(player)
				{
					debug(mediaplayerDebug, "found player, id:"+playerId);
					
					//loop through media and update dimensions that are all video elements
					var playable = getOMSFAtt(playerId, 'playable');
					if(playable)
					{
						var srclist 	= getOMSFAtt(playerId, 'srclist');
						if(srclist.length > 0)
						{
							//this would be the first item of the vidoe gallery
							players[playerId]['index'] = 0;
							if(areDimensionsSet(playerId))
							{
								//if dimensions are set
								queueVideoLoaded++;
								setDimensions(playerId);
							}
						}
					}
				}
			}
			else
			{
				debug(mediaplayerDebug, "failed player, id:"+playerId);
				$('#'+playerId).parent().height('auto');
				queueVideoLoaded++;
			}
		}
		mediaInWaiting = [];
		isQueueCompleted();
	}
}

//on media player bridged with js
//this fires on most video events, e.g. state changed
function onOMSFBridgeCreated(playerId)
{
	//debug(mediaplayerDebug, "connecting to: "+playerId);
	var player = getOMSFPlayer(playerId);
	if(player) 
	{
		var playable = getOMSFAtt(playerId, 'playable');
		if(playable)
		{
			//var state = player.getState();
			//has player got dimensions
			if(!areDimensionsSet(playerId))
			{
				//debug(mediaplayerDebug, "checking for dimensions");
				
				//if not ry and get from flash widget
				var mw = player.getMediaWidth();
				var mh = player.getMediaHeight();
				if(mw+'' != 'NaN' && mh+'' != 'NaN')
				{
					//pause video
					//player.pause();
					debug(mediaplayerDebug, "dimensions recieved:"+mw+", "+mh);
					
					//if recieved dimensions store
					//and resize video to scaled size
					queueVideoLoaded++;
					setDimensions(playerId, mw, mh);
				}
				else
				{
					var tries = incrementDimensionsTrys(playerId);
					var bytes = player.getBytesLoaded();
					if(bytes >= maxDimByteWait)
					{
						//if not reecieved dimensions after max wait
						//then show player as it is
						debug(mediaplayerDebug, "no dimensions, max bytes loaded: "+player.getBytesLoaded());
						queueVideoLoaded++;
						setDimensions(playerId, mediaMaxWidth, mediaMaxHeight);
					}
					else if(tries > maxDimTries)
					{
						//if no of tries to get dimensions goes over max set
						//then show video anyway
						debug(mediaplayerDebug, "no dimension, max getter tries: "+trys);
						queueVideoLoaded++;
						setDimensions(playerId, mediaMaxWidth, mediaMaxHeight);
					}
				}

				//check now if queue is completed
				isQueueCompleted();
			}
			else if(!getOMSFAtt(playerId, 'connected'))
			{
				//if player is not connect then re-connect
				players[playerId]['player']		= document.getElementById(playerId);
				players[playerId]['connected'] 	= true;
				debug(mediaplayerDebug, "player connected");
			}
			else
			{
				currentSrc = player.getCurrentSrc();
			}
		}
		else
		{
			//then its audio
			if(players[playerId]['forcePlay'])
			{
				player.play2();
				debug(mediaplayerDebug, "player.state:"+player.getState());
				if(player.getState() == "playing")
				{
					players[playerId]['forcePlay'] = false;
				}
			}
		}
	}
	else
	{
		//store player for first time
		player = document.getElementById(playerId);		
		players[playerId] = {
			'player': player, 
			'srclist': [], 
			'data': [],
			'index':0,
			'playable': player.getCanPlay(), 
			'connected':true,
			'forcePlay':false
		};
		
		//set src index
		setSrcIndex(playerId, player.getCurrentSrc());
		debug(mediaplayerDebug, "bridged player: "+playerId+", media playable:"+players[playerId]['playable']);
	}

}

function setSrcIndex(playerId, src)
{
	var player = getOMSFPlayer(playerId);
	if(player) 
	{
		var filename 	= lastSeg(src);	
		var srclist 	= players[playerId]['srclist'];
		var srcindex	= getSrcIndex(playerId, src);
		if(srcindex < 0)
		{
			debug(mediaplayerDebug, "new src added: "+filename);
			srclist.push(filename);
			
			var dlist 	= players[playerId]['data'];
			var din		= {"width":false, "height":false, "trys":0};
			dlist.push(din);
			
			players[playerId]['srclist'] 	= srclist;
			players[playerId]['index']		= srclist.length - 1;
		}
		else
		{
			players[playerId]['index']		= srcindex;
		}
		debug(mediaplayerDebug, "new src index set: "+players[playerId]['index']);
	}
	
}

function getSrcIndex(playerId, src)
{
	var srca = src.split('/');
	var src = srca[srca.length-1];
	
	var srclist 	= players[playerId]['srclist'];
	debug(mediaplayerDebug, playerId+" srclist: "+srclist);
	for(var i=0; i < srclist.length; i++)
	{
		var s = srclist[i];
		if(s == src)
		{
			return i;
		}
	}
	return -1;
}

//set dimensions for a src file
function setDimensions(playerId, w, h)
{
	if(w != null && h != null)
	{
		players[playerId]['data'][players[playerId]['index']] = {"width":w, "height":h, "trys":0};
	}
	else
	{
		w = players[playerId]['data'][players[playerId]['index']]['width'];
		h = players[playerId]['data'][players[playerId]['index']]['height'];
	}
	
	updateDimensionRatio(playerId, w, h);
}

function incrementDimensionsTrys(playerId)
{
	var trys = players[playerId]['data'][players[playerId]['index']]['trys'];
	trys++;
	
	players[playerId]['data'][players[playerId]['index']]['trys'] = trys;
	return trys;
}

//check to see if dimensions are set
function areDimensionsSet(playerId)
{
	var index = players[playerId]['index'];
	var dlist 	= players[playerId]['data'];
	var din 	= dlist[index];
	if(!din['width'] || !din['height'])
	{
		return false;
	}
	else
	{
		return true;
	}
}

//update video dimensions
function updateDimensionRatio(playerId, nw, nh)
{
	$('#'+playerId).parent().css('max-width', nw).css('max-height', nh);
	$('#'+playerId).closest('.videocontainer').css('max-width', nw).css('max-height', nh);
	
	resizeVideoGallery($('#'+playerId).parent());
}

function resizeVideoGallery(vw)
{
	//these are set when video is loaded
	//it represents the vidoe dimensions
	var nw 	= vw.css('max-width');
	var nh 	= vw.css('max-height');
	if(nh != 'none' && nw != 'none')
	{		
		//convert to numeric format
		nw 	= pixelToNum(vw.css('max-width'));
		nh 	= pixelToNum(vw.css('max-height'));
		
		//set dimensions of container
		var cw 	= $(mediaContainer).width();
		var ch	= $(mediaContainer).height();
		
		//video container
		var vc	= vw.parent();
		if(is_mobile)
		{
			//if mobile video container must be the full width
			vc.width(cw);
		}

		if(type != "videolist")
		{
			//if page type is multimedia, then dimensions
			//are respective of the column width
			cw 	= actualWidth(vc);
			ch 	= actualHeight(vc);
		}
		
		//this is usually only for mobiles
		if(mediaOverrideHeight)
		{
			setActualHeight($(mediaContainer), nh);
			ch 	= nh;
		}

		//get correct dimensions for video
		//container, against video dimensions
	    var dims = ratio(cw, ch, nw, nh);
	    w = dims[0];
	    h = dims[1];
	    debug(mediaplayerDebug, "video container dimensions:"+cw+","+ch+", video dimensions:"+nw+", "+nh+", resize video to:"+w+", "+h);
	    
	    contentHeight = h;
	    
	    //set dimensions
		vc.width(w).height(h).css('padding-left', (cw-w)/2);
		vw.width(w).height(h);
	}
}


//is a mobile function,
//sets the source and index by currentSrc
//and then updates dimensions
function defineSource(playerId)
{
	playerId = "video_"+playerId;
	debug(mediaplayerDebug, "search player id: "+playerId);
	if(players[playerId] != null)
	{
		var srclist = players[playerId]['srclist'];
		if(srclist != null && srclist && srclist.length > 0 && currentSrc)
		{
			setSrcIndex(playerId, currentSrc);
			setDimensions(playerId);
		}
	}
}

//update source
function updateSource(selector, source)
{
	if(selector != null && source != null)
	{
		var playerId = selector.attr('id');
		var player = getOMSFPlayer(playerId);
		if(player)
		{
			if(!getOMSFAtt(playerId, 'connected'))
			{
				player = document.getElementById(playerId);
			}
			if(player)
			{
				players[playerId]['connected'] = true;
				var srcindex = getSrcIndex(playerId, source);
				if((srcindex >= 0 && srcindex != players[playerId]['index']) || srcindex < 0)
				{
					//set source of media player
					//only if its not the current src
					debug(mediaplayerDebug, "media item src set to:"+source);
					player.setMediaResourceURL(source);
				}
				
				if(!players[playerId]['playable'])
				{
					players[playerId]['forcePlay'] = true;
				}
				player.play2();
				setSrcIndex(playerId, source);
				queueVideoLoaded--;
				$('#'+playerId).show();
			}
		}
	}
}

function stopAllPlayers()
{
	for(playerId in players)
	{
		var player = getOMSFPlayer(playerId);
		if(player)
		{
			var playable = getOMSFAtt(playerId, 'playable');
			if(playable)
			{
				//player.pause();
				//$('#'+playerId).height(0);
				players[playerId]['connected'] = false;
				//players[playerId] = null;
			}
		}
	}
}

function getOMSFPlayer(playerId)
{
	return getOMSFAtt(playerId, 'player');
}

function getOMSFAtt(playerId, att)
{
	if(players[playerId] != undefined && players[playerId][att] != undefined && players[playerId] != null)
	{
		return players[playerId][att];
	}
	return false;
}




