
function showEvent(id) {
  myWin = window.open('/Calendar/eventDetails.aspx?id='+id,'eventWin','height=300,width=360,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showRemoteEvent(id, host) {
  myWin = window.open('http://' + host + '/Calendar/eventDetails.aspx?id='+id,'eventWin','height=300,width=360,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showBirthday(id) {
  myWin = window.open('/Calendar/BirthdayMessage.aspx?id='+id,'birthdayWin','height=340,width=440,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showUser(id) {
  myWin = window.open('/Address/Details.aspx?user_id=' + id,'AddressWin','height=480,width=620,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showUserAndStaffRoleNotes(id, role_id) {
  myWin = window.open('/Address/Details.aspx?user_id=' + id + '&role_id=' + role_id,'AddressWin','height=480,width=620,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showOrg(id) {
  myWin = window.open('/Modules/FrontPage/Directory/OrgDetailsPopUp.aspx?org_id='+id,'AddressWin','height=600,width=500,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showUserWebOffice(id, enforce_readonly) {
  myWin = window.open('/Admin/Users/UserDetails/Details.aspx?user_id='+id+'&enforce_readonly='+(enforce_readonly ? 'true' : 'false'),'UserWin','height=550,width=770,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showOrgWebOffice(id) {
  myWin = window.open('/Admin/Organisations/OrganisationEdit.aspx?org_id='+id+'&org=true','UserWin','height=550,width=770,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showFamilyWebOffice(id) {
  myWin = window.open('/Admin/Users/UserDetails/Details.aspx?family_id='+id,'UserWin','height=480,width=620,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();  
}
function showFamily(id) {
  myWin = window.open('/Address/Details.aspx?family_id='+id,'AddressWin','height=480,width=620,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  myWin.focus();
}
function showRegistration(registration_id) {
  myWin = window.open('/Admin/PaymentGroups/EditRegistration.aspx?registration_id=' + registration_id,'RegWin','resizable=yes,scrollbars=yes,status=yes,width=850,height=650');
  myWin.focus();	
}
function showReceivable(receivable_id) {
  myWin = window.open("/Admin/PaymentGroups/EditReceivable.aspx?receivable_id="+receivable_id, "RxWin", "width=900,height=600,resizable=yes,scrollbars=yes");
  myWin.focus();
}
function showPaymentGroup(payment_group_id) {
  myWin = window.open("/Admin/PaymentGroups/PaymentGroup.aspx?payment_group_id="+payment_group_id, "PGWin", "width=900,height=600,resizable=yes,scrollbars=yes");
  myWin.focus();
}
function showShopOrderByShopOrderID(shop_order_id) {
  myWin = window.open("/Shop/Admin/Orders/EditOrder.aspx?shop_order_id="+shop_order_id+"&from_list_mode=unshipped", "ShopOrderWin", "width=900,height=600,resizable=yes,scrollbars=yes");
  myWin.focus();
}
function showShopOrderByLineID(line_id) {
  myWin = window.open("/Shop/Admin/Orders/EditOrder.aspx?line_id="+line_id+"&from_list_mode=unshipped", "ShopOrderWin", "width=900,height=600,resizable=yes,scrollbars=yes");
  myWin.focus();
}
function showShopOrder(order_id) {
  myWin = window.open("/Shop/Admin/Orders/EditOrder.aspx?order_id="+order_id+"&from_list_mode=unshipped", "ShopOrderWin", "width=900,height=600,resizable=yes,scrollbars=yes");
  myWin.focus();
}
function showShopItem(item_id) {
  myWin = window.open("/Shop/Admin/Sections/Items/ItemEdit.aspx?item_id="+item_id, "ShopItemWin", "width=900,height=600,resizable=yes,scrollbars=yes");
  myWin.focus();
}

function playShopMedia(file_id) {
  if (winMedia && !winMedia.closed) {winMedia.close()}
     var winMedia = window.open('/Media/Player.aspx?source=shop&file_id=' + file_id,'WinMedia','height=600,width=600,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
     winMedia.focus()
}

function insertMP3Button(mp3_url, div_id, size){
	loadJS('/Common/ThirdParty/swfobject.js');
	var rand = Math.floor(Math.random()*1000000);
	var swf_url = '/images/mp3_button.swf';
	var so = new SWFObject(swf_url+'?theFile='+escape(mp3_url), 'wimpy_button_' + rand, size, size, '9.0.115', '#006666');
	so.addParam("classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
	so.addParam("wmode", "transparent");
	so.addParam("quality", "high");
	so.write(div_id);
}

function isInstalledFlashAtLeast(major, minor, revision){
	loadJS('/Common/ThirdParty/swfobject.js');
	
	var version = deconcept.SWFObjectUtil.getPlayerVersion();
	if (version['major'] < major) return false;
	if (version['major'] > major) return true;
	if (version['minor'] < minor) return false;
	if (version['minor'] > minor) return true;
	if (version['rev'] < revision) return false;
	return true;
}

function linkToSignupSheet(id) {
  document.location.href = '/Rotas/SignupSheet.aspx?sheet_id=' + id;
}

function loadJS(url) {
	if(!scriptSrcPresent(url)) {
		var head = document.getElementsByTagName("head")[0];
		script = document.createElement('script');
		script.type = 'text/javascript';
		script.src = url;
		head.appendChild(script);
	}
}

function scriptSrcPresent(url) {
	var scripts = document.getElementsByTagName("script");
	for (i=0; i<scripts.length; i++){
		if (scripts[i].src.match(url)) return true;
	}
	return false;
}

function loadLightBoxJS() {
	if(typeof( window[ 'myLightbox' ] ) == "undefined") {
		loadJS('/Common/ThirdParty/prototype.js');
		loadJS('/Common/ThirdParty/lightbox/js/effects.js');
		loadJS('/Common/ThirdParty/lightbox/js/lightbox.js');
	}
}

function executeWhenObjDefined(fun, objName) {
	if(typeof( window[ objName ]) == "undefined") {
		var delayedFun = function() {
			executeWhenObjDefined(fun, objName);
		};
		setTimeout(delayedFun, 50);
	} else {
		fun();
	}
}

function linkToImage(id) {
	//check if we can use lightbox
	if(typeof( window[ 'myLightbox' ] ) != "undefined" || !scriptSrcPresent('http://206.55.127.196/endis/IHOP/dashboard/mootools.compressed.83.js')) {
		loadLightBoxJS();
		var url = '/Media/AjaxImageData.aspx?image_id=' + id;
		var fun = function(doc) {
			var delayedFun = function() {
				var strSplit = doc.split(",");
				var strImageURL = strSplit[1];
				var strImageDescr = strSplit[2];
				var strImageCaption = strSplit[3];
				myLightbox.showEndisImage(strImageURL, '<i>' + strImageDescr + '</i><br />' + strImageCaption);
			};
			executeWhenObjDefined(delayedFun, 'myLightbox');
		};
		loadXMLDocAndCall(url, fun);
	} else {
		document.location.href = '/Publisher/Image.aspx?ID=' + id;
	}
}

function linkToImageURL(url, description) {
	//check if we can use lightbox
	if(!scriptSrcPresent('http://206.55.127.196/endis/IHOP/dashboard/mootools.compressed.83.js')) {
		loadLightBoxJS();
		var delayedFun = function() {
			myLightbox.showEndisImage(url, description);	
		};
		executeWhenObjDefined(delayedFun, 'myLightbox');
	} else {
		linkToImageURLPopup(url);
	}
}

function linkToImageURLPopup(url) {
	myWin = window.open(url,'ImagePopUp','height=480,width=620,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
  	myWin.focus();
}

function linkToFile(id) {
  document.location.href = '/Publisher/File.aspx?ID=' + id;
}

//For AJAX calls

function getXMLHttpRequest() {
	var thisXMLHttpRequest = false;
	// branch for native XMLHttpRequest object
	if(window.XMLHttpRequest && !(window.ActiveXObject)) {
    	try {
			thisXMLHttpRequest = new XMLHttpRequest();
		} catch(e) {
			thisXMLHttpRequest = false;
		}
	// branch for IE/Windows ActiveX version
	} else if(window.ActiveXObject) {
    	try {
    		thisXMLHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    	} catch(e) {
    		try {
    			thisXMLHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    		} catch(e) {
    			thisXMLHttpRequest = false;
    		}
		}
	}
	return thisXMLHttpRequest;
}

function loadXMLDocAndCall(url, fun, errFun) {
	var thisXMLHttpRequest = getXMLHttpRequest();
	if(thisXMLHttpRequest) {
		thisXMLHttpRequest.onreadystatechange = processReqChange(fun, errFun, thisXMLHttpRequest);
		thisXMLHttpRequest.open("GET", url, true);
		thisXMLHttpRequest.send("");
	}
}

function loadXMLDocAndCallPost(url, fun, errFun, strPostData) {
	var thisXMLHttpRequest = getXMLHttpRequest();
	if(thisXMLHttpRequest) {
		thisXMLHttpRequest.onreadystatechange = processReqChange(fun, errFun, thisXMLHttpRequest);
		thisXMLHttpRequest.open("POST", url, true);
		thisXMLHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		thisXMLHttpRequest.setRequestHeader("Content-length", strPostData.length);
		thisXMLHttpRequest.setRequestHeader("Connection", "close");
		thisXMLHttpRequest.send(strPostData);
	}
}

function urlEncodeCharacter(c) {
	return '%' + c.charCodeAt(0).toString(16);
}

//Full url encoding should properly encode all special characters.
//This function should be used for preparing text to be sent as a querystring or post value.
function urlEncode(s) {
    return encodeURIComponent( s ).replace( /\%20/g, '+' ).replace( /[!'()*~]/g, urlEncodeCharacter );
}

function processReqChange(fun, errFun, xmlHTTP) {
	return function() {
		// only if req shows "loaded"
		if (xmlHTTP.readyState == 4) {
			// only if "OK"
			if (xmlHTTP.status == 200) {
				var strResponse = xmlHTTP.responseText;
				if(fun) fun(strResponse);
			} else {
				if(errFun) {
					errFun(xmlHTTP.statusText);
				} else {
					alert("There was a problem retrieving the XML data:\n" + xmlHTTP.statusText);
				}
			}
		}
	}
}

function loadURLToInnerHTML(url, eName, loadingEl) {
	setElemDisplay(el(loadingEl), true);
	setElemDisplay(el(eName), false);
	var fun = function(doc) {
		setElemDisplay(el(loadingEl), false);
		setElemDisplay(el(eName), true);
		el(eName).innerHTML = doc;
	};
	loadXMLDocAndCall(url, fun);
}

function MarkAbuseAJAXCall(queryString, fun) {
	var errorFun = function(text) {alert('An error was encountered:\n' + text); };
	loadXMLDocAndCall('/Modules/UserControls/Comments/MarkAsAbusive.aspx?' + queryString, fun, errorFun);
}

function MarkCommentAsAbusive(cid, elToHideID1, elToHideID2) {
	if (confirm('REPORT THIS TO A MODERATOR \n\n\If you feel this comment is inappropriate you can report it to a \n\moderator, who will then review the comment and can remove it if necessary.\n\The comment will be hidden from view until a moderator reviews it. \n\n\Are you sure you want to report this comment to a moderator?')) {
		MarkAbuseAJAXCall('mark=comment&cid=' + cid);
		if(elToHideID1) {setElemDisplay(el(elToHideID1), false);}
		if(elToHideID2) {setElemDisplay(el(elToHideID2), false);}
	}
}
function MarkThreadAsAbusive(tid, fid) {
	if (confirm('REPORT THIS TO A MODERATOR \n\n\If you feel this discussion topic is inappropriate you can report it to a \n\moderator, who will then review the message and can remove it if necessary.\n\The discussion topic will be hidden from view until a moderator reviews it. \n\n\Are you sure you want to report this topic to a moderator?')) {
		MarkAbuseAJAXCall('mark=thread&tid=' + tid, function() {document.location.href = '/Forums/Threads.aspx?ForumID=' + fid;});
	} 
}
function SubscribeToComments(eid, et, a, elToHideID, elToShowID) {
	var errorFun = function(text) {alert('An error was encountered:\n' + text); };
	loadXMLDocAndCall('/Modules/UserControls/Comments/Subscribe.aspx?eid=' + eid + '&et=' + et + '&a=' + a, undefined , errorFun);
	if(elToHideID) {setElemDisplay(el(elToHideID), false);}
	if(elToShowID) {setElemDisplay(el(elToShowID), true);}
}

 var leftPos = (screen.availWidth-600) / 2;
 var topPos = (screen.availHeight-450) / 2;

function OpenChat() {
  myWin = window.open('/Chat/Default.aspx','chatWin','height=380,width=620,status=no,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=yes,top='+topPos+',left='+leftPos);
  myWin.focus();  
}

var bShowSelectBoxes = false;

function showSelectBoxes(status) {
	// If using something other than IE, just exit
	// since IE is the only dodgy browser needing this trick
    if(!browserIsIE()) return;
	
	var elems = document.getElementsByTagName("SELECT");
	for(var i = 0; i < elems.length; i++)
		elems[i].style.visibility = (status ? 'visible' : 'hidden');
}

function OpenShopTermsAndConds() {
	window.open("/Shop/TermsAndConditions.aspx", "", "width=780,height=550,resizable=yes,scrollbars=yes");
}

function el(id) {
	return document.getElementById(id);
}

function eltn(name, parent) {
	return (parent?parent.getElementsByTagName(name):document.getElementsByTagName(name));
}

function getParentWithTagName(elem, tagName) {
	var parent = elem.parentNode;
	if(parent) {
		if(parent.tagName.toUpperCase() == tagName.toUpperCase()) {
			return parent;
		} else {
			return getParentWithTagName(parent, tagName);
		}
	}
}

function browserIsIE() {
	return (navigator.userAgent.indexOf("MSIE") >= 0) && (navigator.userAgent.indexOf("Opera") <  0);
}

function toggleDisplay(id) {
	toggleElemDisplay(el(id));
}

function toggleElemDisplay(elem) {
	setElemDisplay(elem, elem.style.display == "none");
}

function setElemDisplay(elem, blnDisplay, forceDisplayType) {
	if(elem) {
		if(forceDisplayType) {
			elem.style.display = (blnDisplay ? forceDisplayType : "none");
		} else {
			elem.style.display = (blnDisplay ? "" : "none");
		}
	}
}

function getCssStyle(elem, styleProp) {
	if (elem.currentStyle) {
		return elem.currentStyle[styleProp];
	} else if (window.getComputedStyle) {
		return document.defaultView.getComputedStyle(elem, null).getPropertyValue(styleProp);
	}
}

function setOpenAccordion(headerID, accordionConfig) {
	var accordionParts = accordionConfig.items;
	for (var i = 0; i < accordionParts.length; i++) {
		var selected = accordionParts[i].headerID == headerID;
		var currentHeader = el(accordionParts[i].headerID);
		// Make sure this header exists
		if(currentHeader) {
			var currentBody = el(accordionParts[i].bodyID);
			var alreadyOpen = getCssStyle(currentBody, "display") != "none";
			
			setElemDisplay(currentBody, selected && !alreadyOpen, "block");
			currentHeader.className = (selected && !alreadyOpen) ? accordionConfig.selectedHeaderClass : accordionConfig.unselectedHeaderClass;
		}
	}
}

function accordionIsOpen(headerID, accordionConfig) {
	var accordionParts = accordionConfig.items;
	for (var i = 0; i < accordionParts.length; i++) {
		if(accordionParts[i].headerID == headerID) {
			var selectedBody = el(accordionParts[i].bodyID);
			return selectedBody && selectedBody.style.display != 'none';
		}
	}
}

function elemAbsoluteX(eElement) {
	// initialize var to store calculations
	var nTopPos = eElement.offsetLeft; 
 	var eParElement = eElement.offsetParent; 

	// identify first offset parent element 
	while (eParElement != null) { 
		// move up through element hierarchy 
		nTopPos += eParElement.offsetLeft; 
		// appending top offset of each parent 
		eParElement = eParElement.offsetParent; 
		// until no more offset parents exist 
	}

	return nTopPos; 	
}

function elemAbsoluteY(eElement) {
	// initialize var to store calculations
	var nTopPos = eElement.offsetTop; 
 	var eParElement = eElement.offsetParent; 

	// identify first offset parent element 
	while (eParElement != null) { 
		// move up through element hierarchy 
		nTopPos += eParElement.offsetTop; 
		// appending top offset of each parent 
		eParElement = eParElement.offsetParent; 
		// until no more offset parents exist 
	}

	return nTopPos; 	
}

function setQSVal(strQS, key, val){
	var iKey = strQS.indexOf(key);
	if (iKey !== -1){
		var oldVal = '';
		var iAmp = strQS.indexOf('&', iKey);
		if (iAmp != -1){
			oldVal = strQS.substring(iKey, iAmp);
		}else{
			oldVal = strQS.substr(iKey);
		}
		if(val !== ''){
			return strQS.replace(oldVal, key + '=' + val);
		}else{
			var rep = (iKey == 1) ?	((iAmp != -1) ? oldVal + '&' : oldVal) : '&' + oldVal;
			return strQS.replace(rep, '');
		}
	}else{
		if(val !== ''){
			if(strQS !== ''){
				return strQS + '&' + key + '=' + val;
			}else{
				return '?' + key + '=' + val;
			}
		}else{
			return strQS;
		}
	}
}

var bIsModified = false;

function setModified(bAddOnBeforeUnload) {
	if (bAddOnBeforeUnload){
		window.onbeforeunload = WarnUser;
	}
	bIsModified = true;				
}

//IE treats javscript fired from <a> tags as if we were leaving the page, so we need a mechanism to side-step that
// We call NoWarningThisClick in the onclick of the offending <a> tags.
var bAllowWarning = true;
function WarnUser() {
	if (bAllowWarning)
		return "You have made changes that will be lost." ;
	else
		bAllowWarning = true;
}

function NoWarningThisClick(){
	if (browserIsIE())
		bAllowWarning = false;
}

function resetOnBeforeUnload(){
	window.onbeforeunload = null;
	bIsModified = false;
}

function isModified(){
	return bIsModified;
}

function addModificationNotifiers(bAddOnBeforeUnload, bAlsoSetForDocEditorIFrames) {
	//We need to keep the old onchange behavior
	//We put the actual setting of the onchange inside this local function to limit the scope of the old onchange function
	var setOnchange = function(el, oldOnChange) {
		if (oldOnChange) {
			el.onchange = function () {setModified(bAddOnBeforeUnload); this.oldonchange = oldOnChange; this.oldonchange();}
		} else {
			el.onchange = function () {setModified(bAddOnBeforeUnload);}
		}
	};

	for (var i = 0; i < document.forms.length; i++) {
		for (var j = 0; j < document.forms[i].elements.length; j++) {
			setOnchange(document.forms[i].elements[j], document.forms[i].elements[j].onchange);
		}
	}
	
	if (bAlsoSetForDocEditorIFrames) {
		SetModificationNotifiersForDocEditorIFrames(window, false);
	}  
}

function SetModificationNotifiersForDocEditorIFrames(targetWindow, bSetForThisFrameToo) {
	if (targetWindow == null)
		return ;

	if (bSetForThisFrameToo) {
		if (targetWindow.document.addEventListener) {
			targetWindow.document.addEventListener('keydown', function(){setModified(true);}, false);
			targetWindow.document.addEventListener('click', function(){setModified(true);}, false);
		} else if (targetWindow.document.attachEvent) {
			targetWindow.document.attachEvent('onkeydown', function(){setModified(true);});
			targetWindow.document.attachEvent('onclick', function(){setModified(true);});
		}
	}
	
	//Iterate down through any iframes (e.g. document editor) on the page
	for ( var i = 0 ; i < targetWindow.frames.length ; i++ ) {
		SetModificationNotifiersForDocEditorIFrames(targetWindow.frames[i], true) ;
	}
}

function openFinancialGlossary() {
    var win = window.open("/Admin/Reports/SiteWideFinancialReports/Glossary.aspx?PopUp=true", "FG", "width=800,height=600,resizable=yes,scrollbars=yes,status=no,toolbar=no,menubar=no,location=no");
    win.focus();
}

function TrimString(str) {
	return str.replace(/^\s+|\s+$/g,"");
}

function LTrimString(str) {
	return str.replace(/^\s+/,"");
}

function RTrimString(str) {
	return str.replace(/\s+$/,"");
}

function loadFlashMedia(strPlayerID, strMediaID, strFileID, bPlay, intFileFormat, strImageURL) {
	var objMediaPlayer = jwplayer(strPlayerID);
	var objMedia;

	intFileFormat = parseInt(intFileFormat);
	switch(intFileFormat) {
		case 29: //29 = VIDEO_SMIL
			objMedia = {provider:'rtmp', 'rtmp.loadbalance':'true'};
			break;
		case 0: //0 = AUDIO_MP3
			objMedia = {provider:'sound'};
			break;
		default:
			objMedia = {provider:'video'};
	}
	
	objMedia.file = '/Media/PlayMedia.aspx?download=False&file_id=' + strFileID + '&media_id=' + strMediaID;
	objMedia.image = strImageURL;
	
	objMediaPlayer.load(objMedia).play(bPlay);
	
	var objMediaList = getMediaList(el(strPlayerID));
	if (objMediaList) {
		highlightPlayingRow(objMediaList.id, strFileID);
	}
}

var arrMediaLists = new Array();

function registerMediaList(strListTitle, strListID, objPlaylist) {
	var objMediaList = new Object();
	objMediaList.list_title = strListTitle;
	objMediaList.id = strListID;
	objMediaList.playlist = objPlaylist;
	arrMediaLists.push(objMediaList);
}

var arrMediaPlayersListening = new Array();

function registerPlayerListener(strPlayerID, strListTitle, bPlayNext) {
	var objPlayer = new Object();
	objPlayer.player_id = strPlayerID;
	objPlayer.play_next = bPlayNext;
	objPlayer.list_title = strListTitle;
	arrMediaPlayersListening.push(objPlayer);
	
	el(strPlayerID).list_title = strListTitle;
}

function playMedia(media_id, file_id, intFileFormat, strListTitle, strImageURL) {
	var bFoundPlayer = false;
	//find the title
	if (intFileFormat == 0 || intFileFormat == 12 || intFileFormat == 13 || intFileFormat == 29) { //0 = AUDIO_MP3, 12 = VIDEO_MP4, 13 = VIDEO_FLV, 29 = VIDEO_SMIL => can play in the flash player
		//run through playerlisteners and if any are listening then play the flash media...
		for (var i = 0; i < arrMediaPlayersListening.length; i++) {
			 if (arrMediaPlayersListening[i].list_title == strListTitle || arrMediaPlayersListening[i].list_title == '') {
				loadFlashMedia(arrMediaPlayersListening[i].player_id, media_id, file_id, true, intFileFormat, strImageURL);
				bFoundPlayer = true;
			 }
		}	
	}
	
	if (!bFoundPlayer) {
		if (winMedia && !winMedia.closed) {winMedia.close()}
		var winMedia = window.open('/Media/Player.aspx?media_id=' + media_id + '&file_id=' + file_id,'WinMedia','height=600,width=600,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
		winMedia.focus()
	}
}

//This function is called by jwPlayer as documented at http://developer.longtailvideo.com/trac/wiki/Player4Api
function playerReady(objMediaPlayerInfo) {
	//oddly the media player object passed to this function isn't actually a media player...
	//We have to get the real player from the page.
	var objMediaPlayer = el(objMediaPlayerInfo.id);
	var objCurrPlayList = objMediaPlayer.getPlaylist();
	if (objCurrPlayList.length == 0) {
		playNextMedia(objMediaPlayer, objMediaPlayer.getConfig().autostart);
	} else {
		highlightPlayingRow(getMediaList(objMediaPlayer).id, getFileID(objCurrPlayList[0].file));
	}
	
	for (var i = 0; i < arrMediaPlayersListening.length; i++) {
		if (arrMediaPlayersListening[i].player_id == objMediaPlayerInfo.id && arrMediaPlayersListening[i].play_next) {
			objMediaPlayer.addModelListener('STATE', 'videoFinishedListener');
			break;
		}
	}
}

function videoFinishedListener(objEvent) {
	if (objEvent.newstate == 'COMPLETED') {
		playNextMedia(el(objEvent.id), true);
	}
}

function playNextMedia(objMediaPlayer, bPlay){
	var objMediaList = getMediaList(objMediaPlayer);
	if (objMediaList) {
		var objPlaylist = objMediaList.playlist;
		var intNextFileIndex = 0;
		var objCurrPlayingFiles = objMediaPlayer.getPlaylist();
		if (objCurrPlayingFiles.length > 0) {
			var strCurrentFile = objCurrPlayingFiles[0].file;
			if (strCurrentFile != '') {
				var intCurrentFileID = getFileID(strCurrentFile);
				for (var k = 0; k < objPlaylist.length; k++) {
					if (objPlaylist[k].file_id == intCurrentFileID) {
						intNextFileIndex = k + 1;
						break;
					}
				}
			}
		}
		var objNextFile = objPlaylist[intNextFileIndex];
		loadFlashMedia(objMediaPlayer.id, objNextFile.media_id, objNextFile.file_id, bPlay, objNextFile.file_format, objNextFile.summary_image_url);
	}
}

function getMediaList(objMediaPlayer) {
	if (objMediaPlayer.list_title !== undefined) {
		for (var j = 0; j < arrMediaLists.length; j++) {
			if (arrMediaLists[j].list_title == objMediaPlayer.list_title || objMediaPlayer.list_title == '') {
				return arrMediaLists[j];
			}
		}
	}
	return false;
}

function getFileID(strPath) {
	var intStartOfFileID = strPath.indexOf('file_id=');
	if (intStartOfFileID < 0) {
		return '';
	}
	strPath = strPath.substring(intStartOfFileID + 8); //8 = length of 'file_id='
	var intAmpersand = strPath.indexOf('&');
	if (intAmpersand >= 0) {	
		strPath = strPath.substring(0, intAmpersand);	
	}
	return strPath;
}

function highlightPlayingRow(strPlaylistID, intFileID) {
	var objPlaylist = el(strPlaylistID);
	var arrSpans = objPlaylist.getElementsByTagName('span');
	if (arrSpans.length > 0) {
		for (var i = 0; i < arrSpans.length; i++) {
			var objSpan = arrSpans[i];
			var arrTable = objSpan.childNodes[0];
			if (arrSpans[i].id.indexOf('_' + intFileID) > -1) {
				arrTable.className = 'selected_media_box_cell';
			} else if (arrTable.className == 'selected_media_box_cell') {
				arrTable.className = 'media_box_cell';
			}
		}
	} else {
		var arrTRs = objPlaylist.getElementsByTagName('tr');
		for (var i = 0; i < arrTRs.length; i++) {
			var objTR = arrTRs[i];
			var arrTDs = objTR.childNodes;
			if (objTR.id.indexOf('_' + intFileID) > -1) {
				for (var j = 0; j < arrTDs.length; j++) {
					arrTDs[j].className = 'selected_media_box_cell';
				}
			} else {
				for (var j = 0; j < arrTDs.length; j++) {
					if (arrTDs[j].className == 'selected_media_box_cell') {
						arrTDs[j].className = 'media_box_cell';
					}
				}
			}
		}
	}
}

function EnforceTextBoxMaxLength(event, tb, intLength) {
	var allowed = {8: true, 37: true, 38: true, 39: true, 40: true, 46: true};
	if(allowed[event.keyCode]) {return true;} //Always allow delete, backspace and cursor keys
	return (tb.value.length <= intLength);
}

