/*
	Audio and Video player scripts. 
	Based on ABC News scripts by Andrew Kesper.
	created by: Geoff Pack, August 2007
	last modified by: GP, March 2010
*/

// Add new string functions
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

function classAdd(element, theclass) {
	// Add a CSS class to the specified element (will not add the class if it already exists)
	if (!element) return;
	if (!element.className) element.className = '';
	var reg = new RegExp('(^| )'+theclass+'( |$)', 'g');
	if (element.className.search(reg) == -1) element.className = (element.className + ' ' + theclass).trim();
}

function classRemove(element, theclass) {
	// Remove a CSS class from the specified element
	if (!element) return;
	if (!element.className) return;
	var reg = new RegExp('(^| )'+theclass+'( |$)', 'g');
	element.className = element.className.replace(reg, ' ').trim();
}

// Media Player functions

var player = 'player'; // id of in-page player (Flash container)
var bigfeaturePlay = false; // dummy to make work without big feature script

var html5Audio = {};
html5Audio.ogg = false;
html5Audio.mp3 = false;	

var html5Video = {}
html5Video.ogg = false;
html5Video.mp4 = false;	

function checkHTML5Audio() {
	var myAudio = document.createElement('audio');

	if (!!(myAudio.canPlayType)) {  
		// Currently canPlayType(type) returns: "", "no", "maybe" or "probably"
		html5Audio.mp3 = ((myAudio.canPlayType("audio/mpeg") == "maybe") || (myAudio.canPlayType("audio/mpeg") == "probably")) ? true : false;
		html5Audio.ogg = ((myAudio.canPlayType("audio/ogg; codecs=\"vorbis\"") == "maybe") || (myAudio.canPlayType("audio/ogg; codecs=\"vorbis\"") == "probably")) ? true : false;
	}
	//alert("Audio:\nmp3: " + html5Audio.mp3 + "\nogg: " + html5Audio.ogg);
}
function checkHTML5Video() {
	var myVideo = document.createElement('video');

	if (!!(myVideo.canPlayType)) {  
		// Currently canPlayType(type) returns: "", "no", "maybe" or "probably"
		html5Video.mp4 = ((myVideo.canPlayType("video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"") == "maybe") || (myVideo.canPlayType("video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"") == "probably")) ? true : false;
		html5Video.ogg = ((myVideo.canPlayType("video/ogg; codecs=\"theora, vorbis\"") == "maybe") || (myVideo.canPlayType("video/ogg; codecs=\"theora, vorbis\"") == "probably")) ? true : false;
	}
	//alert("Video:\nmp4: " + html5Video.mp4 + "\nogg: " + html5Video.ogg);
}

function hideExistingPlayer() {
	if (temp = document.getElementById(player)) {
		if (temp.previousSibling != null) classRemove(temp.previousSibling, 'active');
		temp.parentNode.removeChild(temp);
		delete temp;
	}
}

function playAudio(linkObj) {	
	hideExistingPlayer();
	var div = document.createElement('DIV');
	div.id = player;
	linkObj.parentNode.insertBefore(div, linkObj.nextSibling);
	window.onresize = function () {};
	
	if (html5Audio.mp3) {
		//div.innerHTML = '<audio style="width:100%; max-width:315px; margin:3px 0" controls autobuffer autoplay><source src="' + linkObj.href + '"></audio>';		
		div.innerHTML = '<audio src="' + linkObj.href + '" style="width:100%; max-width:315px; margin:3px 0" controls autobuffer autoplay></audio>';		
	} else {	
		/*var swfurl = 'http://www.abc.net.au/news/swf/mp3player.swf';
		var so = new SWFObject(swfurl, player+'Object', 220, 36, '8', '#ececec', true); // orig size: 285x40		
		so.addParam('allowFullScreen', 'true');
		so.addVariable('mediaURL', linkObj.href);
		so.addVariable('autoPlay', 'true');
		so.write(player);*/
		
		div.innerHTML = '<embed type="application/x-shockwave-flash" src="http://www.abc.net.au/res/players/player_mp3.swf" id="playerObject" name="playerObject" bgcolor="#ececec" quality="high" allowfullscreen="true" flashvars="mediaURL='+ linkObj.href +'&amp;autoPlay=true" height="36" width="220"></embed>';
	}
	classAdd(linkObj, 'active');
}

function playVideo(linkObj, useLightBox) {
	hideExistingPlayer();
	width=400;
	height=285; // = 225 + 60 for title and controls
	var url = linkObj.href;
	var div = document.createElement('DIV');
	div.id = player;


	if (linkObj.title == "") {
		// find title for video player - crawl up DOM tree to find a heading...
		
		var parent = linkObj.parentNode;
		while ((parent.nodeName != 'DIV') && (parent.nodeName != 'BODY')) {
			// climb up tree until you find the parent Div
			parent = parent.parentNode;
		}
		
		// check siblings to find a heading
		var children = parent.childNodes
		for (var i=0; i<children.length; i++) {
			if ((children[i].nodeName == 'H1') || (children[i].nodeName == 'H2') || (children[i].nodeName == 'H3') || (children[i].nodeName == 'H4')) {
				child = children[i];
				
				// drill down to find the heading text...
				while ((child != null) && (child.nodeType != 3)) {
					child = child.firstChild;
				}				
				if (child != null) linkObj.title = child.nodeValue;
				break;
			}
		}
	}
			
	if (useLightBox) {
		showLightbox(this, width, height);
		lb = document.getElementById('lightbox');
		lb.insertBefore(div, lb.firstChild);
	} else {
		linkObj.parentNode.insertBefore(div, linkObj.nextSibling);
	}

	if ((html5Video.mp4) && (url.indexOf('.mp4') != -1)) {
		div.innerHTML = '<h3 style="margin:0; padding:3px 5px; color:#333; font-weight:normal;">'+linkObj.title+'</h3><video src="' + linkObj.href + '" style="width:' + width + 'px;  margin:0; padding:0;" controls autobuffer autoplay></video>';		
	} else { 
		/*
		swfurl = 'http://www.abc.net.au/tv/cinerama/swf/singleclip_player_08.swf';
		var so = new SWFObject(swfurl, player+'Object', width, height, '8', '#000000', true);
		so.addVariable('imageURL', '');
		so.addVariable('videoURL', url);
		so.addVariable('mrssURL', '');	
		so.addVariable('videoTitle', linkObj.title);
		so.addVariable('screenWidth', 400);
		so.addVariable('screenHeight', 225);
		so.addVariable('autoStart', true);
		so.addVariable('stageColor', "#000000");
		so.addVariable('textColor', "#408409");
		so.addParam('allowFullScreen', 'true');
		so.addParam('allowScriptAccess', 'always');
		so.write(player);
		*/
		
		div.innerHTML = '<embed type="application/x-shockwave-flash" src="http://www.abc.net.au/tv/cinerama/swf/singleclip_player_08.swf" id="playerObject" name="playerObject" bgcolor="#000000" quality="high" allowfullscreen="true" allowscriptaccess="always" flashvars="imageURL=&amp;videoURL=' + linkObj.href + '&amp;videoTitle=' + linkObj.title + '&amp;screenWidth=400&amp;screenHeight=225&amp;autoStart=true&amp;stageColor=#000000&amp;textColor=#408409" width="400" height="285"></embed>';
	}			
	classAdd(linkObj, 'active');
}

function playYouTubeVideo(linkObj, useLightBox) {
	hideExistingPlayer();
	width = 425;
	height = 350;
	var div = document.createElement('DIV');
	div.id = player;
	
	if (useLightBox) {
		showLightbox(this, width, height);
		// insert player into lightbox
		lb = document.getElementById('lightbox');
		lb.insertBefore(div, lb.firstChild);
	} else {
		linkObj.parentNode.insertBefore(div, linkObj.nextSibling);
	}
	var so = new SWFObject(linkObj.href, player+'Object', width, height, '8', '#000000', true);
	so.write(player);
	classAdd(linkObj, 'active');
}

function playForaVideo(linkObj, useLightBox) {
	hideExistingPlayer();
	width = 640;
	height = 520;
	var div = document.createElement('DIV');
	div.id = player;
	
	if (useLightBox) {
		showLightbox(this, width, height);
		// insert player into lightbox
		lb = document.getElementById('lightbox');
		lb.insertBefore(div, lb.firstChild);
	} else {
		linkObj.parentNode.insertBefore(div, linkObj.nextSibling);
	}
	// add iframe to div
	var iframe = document.createElement('IFRAME');
	iframe.id = 'foraTvVideo';
	iframe.src = linkObj;
	iframe.scrolling = 'no';

	div.appendChild(iframe);	
	classAdd(linkObj, 'active');
}

function showMedia(linkObj) {
	if (!linkObj) return true;

	// if mobile device (except iPad), send raw link to native player
	if ((navigator.userAgent.toLowerCase().indexOf('mobile') != -1) && (navigator.userAgent.toLowerCase().indexOf('ipad') == -1)) {
		return true;
	}
	
	var url = linkObj.href;	

	if (linkObj.nextSibling != null && linkObj.nextSibling.id == player) {
		// collapse media player if already open		
		hideExistingPlayer();
	} else if (url.indexOf('.mp3') != -1) {
		// mp3 audio
		playAudio(linkObj);	
	} else if ((url.indexOf('.mp4') != -1) || (url.indexOf('.flv') != -1) || (url.indexOf('.f4v') != -1)) {	
		// video
		var useLightBox = true;
		playVideo(linkObj, useLightBox);
	} else if (url.indexOf('youtube.com/v/') != -1) {
		// youTube video
		var useLightBox = true;
		playYouTubeVideo(linkObj, useLightBox);
	} else if (url.indexOf('fora.tv/fora/fora_player.php') != -1){
		// fora.tv video
		var useLightBox = true;
		playForaVideo(linkObj, useLightBox);
	} else {
		// assume we are directly linking to another type of media file (e.g. asx, ram)
		location = url;
	}

	if (linkObj.blur) linkObj.blur();  // removes dotted outline from link in Mozilla browsers
	return false;
}

function findMediaLinks(obj) {
	// Add an onclick event to all links to audio, video and image files
	// searches whole document if no argument received
	
	var links;
	
	if (obj) {
		links = obj.getElementsByTagName('A');	
		//alert('Links added by ' + obj.id + ': ' + links.length);
	} else {
		links = document.getElementsByTagName('A');
		//alert('Links in page: ' + links.length);
	}
	
	for (var i=0, j=links.length; i<j; i++) {
		var link = links[i];
		if ((link.href.indexOf('.mp3') != -1) || (link.href.indexOf('.mp4') != -1) || (link.href.indexOf('.flv') != -1) || (link.href.indexOf('.f4v') != -1) || (link.href.indexOf('youtube.com/v/') != -1)) {
			// audio, video
			link.onclick = function(){return showMedia(this)}
			link.onmouseup = function(){return trackMediaLinks(this);}
		} else if (link.href.indexOf('fora.tv/fora/fora_player.php') != -1){
			// fora.tv video
			link.onclick = function(){return showMedia(this)}
		} else if ((link.href.indexOf('.jpeg') != -1) || (link.href.indexOf('.jpg') != -1) || (link.href.indexOf('.gif') != -1) || (link.href.indexOf('.png') != -1)) {
			// images
			link.onclick = function (){showLightbox(this); return false;}
			var imgText = ((link.innerHTML.indexOf('<img') == 0)||(link.innerHTML.indexOf('<IMG') == 0))? link.firstChild.getAttribute('alt') : link.innerHTML;
			link.setAttribute('title',imgText);
		} else {
			// track other links (on homepage only)
			if (document.getElementsByTagName('body')[0].id == 'home') {
				link.onmouseup = function(){return trackLinks(this);}
				//link.onmouseover = function(){return trackLinks(this);}				
			}
		}
	}
	
}

function trackMediaLinks(linkObj) {
	var linkText = ((linkObj.innerHTML.indexOf('<img') == 0)||(linkObj.innerHTML.indexOf('<IMG') == 0))? linkObj.firstChild.getAttribute('alt') : linkObj.innerHTML;
	var location = document.location.href;
	
	var parent = linkObj.parentNode;
	var parentId = parent.id;

	while (parentId == '') {
		// climb up tree until you find a parent with an id
		parent = parent.parentNode;
		parentId = parent.id;
	}
	
	//alert(linkText + '\n' + location + '\n' + parentId);
	if (typeof(DCS)!="undefined") dcsMultiTrack('DCS.uri', location, 'WT.ti', linkText, 'WT.cg_n', parentId, 'WT.cg_s', linkText);

	return false;
}

function trackLinks(linkObj) {
	// add webtrends page section tracking
	// webtrends smart view requires '&WT.svl=SectionID' on each link	

	var parent = linkObj.parentNode;
	var parentId = parent.id;
	var wallaceID = /[0-9]{7}/; // matches a Wallace StoryID
	var footerID = /abcFooter[a-zA-Z]/; // matches any of the footer div ids

	while ((parentId == '') || (wallaceID.test(parentId)) || (footerID.test(parentId))) {
		// climb up tree until you find a parent with an id
		parent = parent.parentNode;
		parentId = parent.id;
	}
	
	if ((linkObj.href.indexOf('WT.svl') == -1)) {
		if (linkObj.search == '') {
			linkObj.search = '?WT.svl=' + parentId;	
		} else {
			linkObj.search += '&WT.svl=' + parentId;				
		}
	}
	return true;
}

addLoadEvent(findMediaLinks);
addLoadEvent(checkHTML5Audio);
addLoadEvent(checkHTML5Video);


