// Switch Express preview interface module
// All rights reserved


// Constructor - provide siteID, channel ID and category IDs as provided.
// slots: the number of preview slots defined on the page.
// step: the step size used for next/previous navigation - usually step by 1 or by page size
var ___siteID;
function PreviewManager(siteID,channelID,categoryID,slots,step,playerProfileID)
{
	var ___siteID=siteID;
	var m_version = '1.1.0.2';
	var m_siteID = siteID;
	var m_channelID = channelID;
	var m_categoryID = categoryID;
	var m_numSlots = slots;
	var m_stepSize = step;
	
	var m_sortOrder = '-published';
	
	var m_httpRequest = undefined;
	var m_firstVideoID = 0;
	var m_searchFirstVideoID = true;
	var m_videoIDs = undefined;
	var m_numVideos = 0;
	var m_url = 'http://www.switchmedia.asia/plugin/preview.php';
	var m_videoUrl;
	var m_videoMetaDataUrl;
	var m_videoOnLoadCallback;
	var m_videoPlayer = true;
	var m_smgPlayer;
	var m_skip = 0;
	var m_playerProfileID = playerProfileID;
	var m_fields = "";
	var m_aFields;
	var m_generateOnClickFns = Array();
	
	var m_slotData = new Object();
	var m_useProxy = true;
	this.UseProxy = _UseProxy;
	
	var m_useVBox = false;
	var m_loadPlayer = true;
	var m_playerFields = "";
	var m_previewOnNext = false;
	
	var m_pageTotal = 0;
	var m_pageCurrent = 0;
	var m_wmode = "transparent";
	
	var m_specialOnly = false;
	var m_specials = Array();
	
	this.Update = _Update;
	this.onNext = _onNext;
	this.onPrevious = _onPrevious;
	
	m_PreviewUpdateCallBack = undefined;
	this.SetPreviewUpdateCallBack = _SetPreviewUpdateCallBack;
	
	m_MorePreviousCB = undefined;
	this.SetMorePreviousCallBack = _SetMorePreviousCallBack;
	// allow the definition of the morePrevious callback function
	function _SetMorePreviousCallBack(callback)
	{
		m_MorePreviousCB = callback;
	}
	
	m_MoreNext = undefined;
	this.SetMoreNextCallBack = _SetMoreNextCallBack;
	// allow the definition of the morePrevious callback function
	function _SetMoreNextCallBack(callback)
	{
		m_MoreNext = callback;
	}
	
	// TODO sorting parameter
	//this.sortBy = sort;
	
	_attachNavOnClicks();
	
	// working variables
	var m_offset = 0;
	
	/* default error handler, override with something on main page */
	function Error(str)
	{
		alert('error: '+str);
	}
	
	function getHttpRequestObj()
	{
		if (window.XMLHttpRequest) // Mozilla, Safari, ... 
		{
			req = new XMLHttpRequest(); 
		}
		else if (window.ActiveXObject) // IE
		{
			req = new ActiveXObject("Microsoft.XMLHTTP");
		}
		return req;
	}
	

	this.Init = function (loadPlayer)
	{
		if(loadPlayer != null)
			m_loadPlayer = loadPlayer;
			
		this._Init();
	}
	this._Init = _Init;
	function _Init(loadPlayer)
	{
	
		// using siteID, channelID and categoryIDs
		// get the list of videos in the appropriate order.
		
		if(!SMGWaitForProxy({callback: "_Init"},{obj: this}))
			return;
			
		if(m_loadPlayer && m_videoPlayer)
		{
			_trace("setting up player");
			m_playerProfileID = playerProfileID;
			m_smgPlayer = new SMGPlayer(m_siteID,m_playerProfileID);
			m_smgPlayer.SetContext(m_channelID,m_categoryID);
			m_smgPlayer.SetWmode(m_wmode);
			
			//alert('meta: '+m_videoMetaDataUrl	);
			if(typeof m_videoMetaDataUrl != "undefined" )
			{
				m_smgPlayer.SetMetaDataUrl(m_videoMetaDataUrl);
			}

			if(typeof m_videoDomain != "undefined" )
			{
				m_smgPlayer.SetVideoDomain(m_videoDomain);
			}
			if(typeof m_videoOnLoadCallback != "undefined" )
			{
				m_smgPlayer.SetOnLoadCallback(m_videoOnLoadCallback);
			}
			
			m_smgPlayer.SetFields(m_playerFields);
			m_smgPlayer.PreviewOnNext(m_previewOnNext);
			m_smgPlayer.SetDimensions(m_width_43,m_height_43,m_width_169,m_height_169);
		}
		
		if(m_specialOnly)
		{
			_InitSpecials();
			return; 
		}
		url=m_url;
		
		query='siteID='+m_siteID+'&channelID='+m_channelID+'&categoryID='+m_categoryID+'&sort='+m_sortOrder+'&rnd='+Math.random();
		if(m_skip>0)
		{
			query+='&skip='+m_skip;
		}
		
		//alert(url);
		if(!m_useProxy)
		{
			m_httpRequest = getHttpRequestObj();
			m_httpRequest.open('GET', url+'?'+query,true);		
			m_httpRequest.onreadystatechange = function() 
			{
				if (m_httpRequest.readyState==4 && m_httpRequest.status==200)
				{
					//alert('ajax1: ' + m_httpRequest.responseText);
					eval(m_httpRequest.responseText);

					 _InitSuccess();
				}
				else if (m_httpRequest.readyState==4 )
					Error('Error requesting video list');
			}     
			m_httpRequest.send(null);
		}
		else
		{
			_SMGSend('GET',url,query);
		}
	}
	
	this.InitSuccess = _InitSuccess;
	function _InitSuccess()
	{
		
		// check for video list
		m_numVideos=0;
		var firstIndex = -1;
		
		m_numVideos = m_videoIDs.length;
		if(m_searchFirstVideoID)
		{
			for(var i=0;i<m_numVideos;i++)
			{
				if(m_videoIDs[i] == m_firstVideoID)
				{
					firstIndex = i; //parseInt(m_videoIDs[i]);
					break;
				}
			}
		}
		else
			firstIndex=0;
		
		if(m_numVideos!=0)
		{
			
			if(firstIndex==-1 && m_searchFirstVideoID)		// pick first video in list if requested is not part of the list provided we are looking for it.
				m_firstVideoID = m_videoIDs[0];
			else
			{
				m_offset = Math.floor(firstIndex / m_numSlots)*m_numSlots; // adjust offset to start of page that first videoid is on
			}	
			if(m_loadPlayer && m_videoPlayer)
			{
				m_smgPlayer.LoadVideoDetails(m_firstVideoID,'smg-player');
				m_currentVideoID = m_smgPlayer.GetVideoID();
			}
				
			_trace('init success function');
			if(typeof m_InitialiseCallBack != "undefined")
				m_InitialiseCallBack(); // allow main page to setup next/previous elements
			
			_Update();
			_NoResults(true);
			
		}
		else
		{
			// clean up page
			for(var i=0;i<m_numSlots;i++)
			{
				var slot = {};
				slot.empty=true;
				_PreviewUpdateCallBack(i,slot); 
			}
			if(m_loadPlayer && m_videoPlayer)
				m_smgPlayer.Clear();
			
			_NoResults(false);
		}
		
		_MoreNotice(); // notify main page about next/previous states
	}
	
	this.InitSpecials = _InitSpecials;
	function _InitSpecials()
	{
		
		if(m_loadPlayer && m_videoPlayer)
		{
			m_smgPlayer.LoadVideoDetails(m_firstVideoID,'smg-player');
			m_currentVideoID = m_smgPlayer.GetVideoID();
		}
		var i=0;
		qs="";
		for(i=0;i<m_specials.length;i++)
		{
			//alert(m_specials[id].order);
			qs = qs+"ch"+i+"="+m_specials[i].channelID+"&cat"+i+"="+m_specials[i].categoryID+"&order"+i+"="+m_specials[i].order+"&";
		}
		var d = new Date();
		query = qs+'fields='+m_fields+"&siteID="+m_siteID+"&ms="+d.getTime();

		_trace('requesting special slots: '+m_url+ '?' +query);
		
		_SMGSend('GET',m_url,query);
	}
	
	
	var aFields;
	var aClickables;
	var aNodeList;
	var aPreviewNodes
	// set the fields to get
	this.SetFields = _SetFields;
	function _SetFields(fields)
	{
		m_fields = fields;
		m_aFields = m_fields.split(',');
		_BuildNodeArrays();
		_CheckNodes();
	}
	
	this.SetSortOrder = _SetSortOrder;
	function _SetSortOrder(order)
	{
		m_sortOrder = order;
	}
	
	function _BuildNodeArrays()
	{
		
		// check if corresponding nodes exist for each preview slot
				
		aPreviewNodes = new Array();
		
		_trace('scanning for '+m_numSlots+' preview areas');
		for(i=0;i<m_numSlots;i++)
		{
			
			rootName = 'smg-preview-'+i;
			
			rootNode = document.getElementById(rootName)

			if(!rootNode)
				_trace('DOM element not found - '+rootName,'error');
			else
			{	
				_trace('scanning area: '+rootName);
				
				aNodeList = new Array();
				aFields = new Object();
				aFields.length = 0;
				aClickables = new Array();
				
				
				eles = rootNode.getElementsByTagName('*');
				for(j=0;j<eles.length;j++)
				{
					//_trace('node: '+eles[j].className);
					if(eles[j].className.match('smg-clickable'))
						aClickables.push(eles[j]);
					
					for(k=0;k<m_aFields.length;k++)
					{
						var name = 'smg-'+m_aFields[k];
						//_trace('checking '+name);
						if(eles[j].className.match(name))
						{
							
							aFields[name] = eles[j];
							aFields.length = aFields.length+1;
							
							//_trace('found '+name);
							break;  // stop scanning, should only be one.
						}
					}
				}
				aNodeList['fields']=aFields;
				aNodeList['clickables']=aClickables;
				aPreviewNodes[i]=aNodeList;
			}
		}
	}
	
	function _CheckNodes()
	{
		
		for(j=0;j<m_numSlots;j++)
		{
			if(!aPreviewNodes[j])
				_trace('Root node not found for preview slot '+j,'error');
			else
			{	
				for(i=0;i<m_aFields.length;i++)
				{
					var name = 'smg-'+m_aFields[i];
					
					
					if(!aPreviewNodes[j]['fields'][name])
					{
						if(m_aFields[i]!='thumbnail_title')
						{
							_trace('Slot '+j+': Node not found for field '+name,'error');
						}
					}
					if(m_aFields[i]=='thumbnail')
						if(aPreviewNodes[j]['fields'][name].tagName.toLowerCase()!='img')
							_trace('Slot '+j+': Node is not an image node - '+name,'error');	
				}
				
			}
		}
	}

	function processChildren(root)
	{
		for(i=0;i<root.childNodes.length;i++)
		{
			//alert(node.nodeType);
			_trace('got node type' + root.childNodes[i].nodeType);
			if(root.childNodes[i].nodeType == 1)
			{
				_trace('going in');
				processChildren(root.childNodes[i]);
				_trace('got class - '+root.className);
			}
		}
	}
	// set the fields to get
	this.SetPlayerFields = _SetPlayerFields;
	function _SetPlayerFields(fields)
	{
		m_playerFields = fields;
	}
	
	var m_width_43 = 512;
	var	m_height_43 = 419;
	var m_width_169 = 512;
	var	m_height_169 = 323;
	
	this.SetPlayerDimensions43 = _SetPlayerDimensions43
	function _SetPlayerDimensions43(wdt,hgt)
	{
		m_width_43 = wdt;
		m_height_43 = hgt;
	}
	
	this.SetPlayerDimensions169 = _SetPlayerDimensions169
	function _SetPlayerDimensions169(wdt,hgt)
	{
		m_width_169 = wdt;
		m_height_169 = hgt;
	}
	
	this.SetPlayerDimensions = _SetPlayerDimensions
	function _SetPlayerDimensions(wdt43,hgt43,wdt169,hgt169)
	{
		_SetPlayerDimensions43(wdt43,hgt43);
		_SetPlayerDimensions169(wdt169,hgt169);
	}
	
	this.GetCurrentHeight = _GetCurrentHeight
	function _GetCurrentHeight()
	{
		return m_smgPlayer.GetCurrentHeight();
	}
	
	this.PreviewOnNext = _PreviewOnNext;
	function _PreviewOnNext(state)
	{
		m_previewOnNext = state;
	}
	
	
	function _SMGSend(mode,url,query) 
    {	
		_SMGProxy("smgproxy").sendHTTP(mode,url,query);
	}
	var __smgProxyElement=null;
	function _SMGProxy(movieName)
	{
		// cache handle to proxy component - faster and for some reason can be returned as the wrong element.
		if(__smgProxyElement==null)
		{
			var isIE = navigator.appName.indexOf("Microsoft") != -1;
			__smgProxyElement = (isIE) ? window[movieName] : document[movieName];
		}
		return __smgProxyElement;
    }
    
    this.SetFirstVideoID = _SetFirstVideoID;
	function _SetFirstVideoID(id,search)
	{
		if(typeof search != "undefined")
		{
			m_searchFirstVideoID = search;
			if(typeof __smgplf != "undefined")
			{
				__smgplf=id;	
			}
		}
		else
			m_searchFirstVideoID = true;
			
		m_firstVideoID = id;	
	}
	this.GetFirstVideoID = _GetFirstVideoID;
	function _GetFirstVideoID()
	{
		//return m_firstVideoID;
		return m_videoIDs[0];
	}
	this.GetCurrentVideoID = _GetCurrentVideoID;
	function _GetCurrentVideoID()
	{
		return m_currentVideoID;
	}
	this.GetSlotData = _GetSlotData;
	function _GetSlotData(id)
	{
		return m_slotData[id];
	}
	this.GetSlotData = _GetSlotData;
	function _GetSlotData(id)
	{
		return m_slotData[id];
	}
	
	this.SetVideoID = _SetVideoID;
	function _SetVideoID(index,id)
	{
		m_videoIDs[index] = id;	
		//alert('m_vid: '+m_videoIDs[index]);
	}
	
	this.SetVideoIDs = _SetVideoIDs;
	function _SetVideoIDs(aryIds)
	{
		m_videoIDs = aryIds;	
	}
	
	this.NoVideoPlayer = _NoVideoPlayer;
	function _NoVideoPlayer()
	{
		m_videoPlayer = false;
		m_loadPlayer = false;
	}
	this.UseVBox = _UseVBox;
	function _UseVBox()
	{
		m_videoPlayer = false;
		m_loadPlayer = false;
		m_useVBox = true;
	}
	// allow the initialisation callback function to be overridden
	this.SetInitialiseCallBack = _SetInitialiseCallBack;
	function _SetInitialiseCallBack(callback)
	{
		// We have a list of videoIDs, so we should populate the 	
		m_InitialiseCallBack = callback;
	}
	
	// allow the initialisation callback function to be overridden
	function _SetPreviewUpdateCallBack(callback)
	{
		// We have a list of videoIDs, so we should populate the 	
		m_PreviewUpdateCallBack = callback;
	}
	
	this.PreviewUpdateCallBack = _PreviewUpdateCallBack;
	function _PreviewUpdateCallBack(slot,obj)
	{	
		_trace('internal updating preview slot '+slot);
		m_slotData[slot] = obj;
		var ele = document.getElementById('smg-preview-'+slot);
		if(typeof __smgpl != "undefined")
		{
			__smgpl[slot]=obj['videoID'];	
		}
			
		if(obj.empty)
		{	
			_addReplaceClass(ele,'smg-preview-available','smg-preview-empty');
			_addReplaceClass(ele,'smg-selected-yes','smg-selected-no');
			return;
		}
		else
		{
			_addReplaceClass(ele,'smg-preview-empty','smg-preview-available');
			if(obj.videoID == m_currentVideoID)
				_addReplaceClass(ele,'smg-selected-no','smg-selected-yes');
			else
				_addReplaceClass(ele,'smg-selected-yes','smg-selected-no');
				
			_addReplaceClass(ele,'smg-media-video','smg-media-'+obj.media_type);
			_addReplaceClass(ele,'smg-media-audio','smg-media-'+obj.media_type);
		}
		
		var videoID;
		for(var field in obj)
		{
			//alert(field+': '+obj[field]);
			name = 'smg-'+field;
			switch(field)
			{
				case 'videoID':
					// do something with it, 
					_trace('updating videoID = '+obj[field]);	
					videoID = obj[field];
					break;
				case 'thumbnail':
					// do something with it, 
					_trace('updating thumbnail image = '+obj[field]);
					aPreviewNodes[slot]['fields'][name].src = obj[field];
					if(typeof obj[field+'_title'] != "undefined")
					{
						aPreviewNodes[slot]['fields'][name].title = obj[field+'_title'];
						aPreviewNodes[slot]['fields'][name].alt = obj[field+'_title'];
					}
					break;
				case 'thumbnail_title':
					break; // do nothing.
				default:
					
					_trace('updating '+name+' = '+obj[field]);		
					if(typeof aPreviewNodes[slot]['fields'][name] != "undefined")
						aPreviewNodes[slot]['fields'][name].innerHTML = obj[field];	
			}
		}
		
		// can't pass parameters so dynamically write and compile function
		var oldFn = m_generateOnClickFns[slot];
		if(m_videoPlayer)
		{
			eval('m_generateOnClickFns[slot] = function(e){var videoID='+videoID+';m_currentVideoID=videoID;m_smgPlayer.LoadVideoDetails(videoID,\'smg-player\');_Update();_onClick(e);}');
		}
		else
		{
			eval('m_generateOnClickFns[slot] = function (e){m_clickableHandler('+videoID+','+m_channelID+','+m_categoryID+');_onClick(e);}');
		}
		
		for(var i=0;i<aPreviewNodes[slot]['clickables'].length;i++)
		{
			_trace('applying onclicks - videoID'+videoID);
			
			_removeEvent(aPreviewNodes[slot]['clickables'][i],'click',oldFn);
			_addEvent(aPreviewNodes[slot]['clickables'][i],'click',m_generateOnClickFns[slot]);
			
			// could change the cursor style of the clickable element, but this will override
			// any specific non default style used on the these elements
		}
		
		if(m_PreviewUpdateCallBack)
			m_PreviewUpdateCallBack(slot,obj);
	}
	
	this.SetClickHandler = _SetClickHandler;
	function _SetClickHandler(fn)
	{
		m_clickableHandler = fn;
	}
	var m_clickableHandler = _stub;
	function _stub(videoID,channelID,categoryID)
	{
		//alert('stub: '+videoID+','+channelID+','+categoryID);
	}
	function _onClick(e)
	{
		if( e.preventDefault ) { e.preventDefault(); }
		e.returnValue = false;
	}
	function _Update()
	{
		if(m_specialOnly)
			return;	// don't update thumbnails
			
		// We have a list of videoIDs, so we should populate the screen elements given the current
		// page id and number of slots.
		_trace('building request list');	
		var requestingIDs = new Array();
		// work out which videoIDs to request info for.
		var i=0;
		var j=0;
		while(j<m_numSlots && m_numVideos > 0)
		{
			if(!m_skipCurrentVideo || m_videoIDs[m_offset+i]!= m_currentVideoID)
			{
				if(typeof m_videoIDs[m_offset+i] == "undefined")
					requestingIDs.push(0);
				else
					requestingIDs.push(m_videoIDs[m_offset+i]);	
				
				j++;
			}
			i++;
		}
		_RequestDetails(requestingIDs);
	}
	
	function _RequestDetails(ids)
	{
		var str = "";
		var first = true;
		for(id in ids)
		{
			
			if(typeof ids[id] == "number")
			{
				if(!first)
					str += ',';
				else
					first=false;
				
				str += ids[id];
			}
		}
		
		query = 'ids='+str+'&fields='+m_fields;

		_trace('requesting preview info: '+m_url+ '   ' +query);
		
		if(!m_useProxy)
		{
			m_httpRequest = getHttpRequestObj();
			m_httpRequest.open('GET', m_url+'?'+query,true);
			m_httpRequest.onreadystatechange = function()
			{
				if (m_httpRequest.readyState==4 && m_httpRequest.status==200)
				{
					//alert(m_httpRequest.responseText);
					eval(m_httpRequest.responseText);
				}
				else if (m_httpRequest.readyState==4 )
				{
					Error('Error requesting video data');
				}
			}
			m_httpRequest.send(null);
		}
		else
		{
			_SMGSend('GET',m_url,query);
		}
	}
	
	// go back one page
	function _onPrevious(e)
	{
		if(e)
		{
			if( e.preventDefault ) { e.preventDefault(); }
			e.returnValue = false;
		}
		
		var next = m_offset-m_stepSize;
		
		if(next <= 0)
			m_offset=0;
		else
			m_offset=next;
		
		// request new data
		_Update();
		_MoreNotice();
	}
	
	// go forward one page
	function _onNext(e)
	{
		if(e)
		{
			if( e.preventDefault ) { e.preventDefault(); }
			e.returnValue = false;
		}
		
		var next = m_offset+m_stepSize;
		
		if(next >= m_numVideos)
		{
			//do nothing
		}
		else
		{
			m_offset=next;
		}
		
		// request new data
		_Update();
		
		// send moreNext / morePrevious notifications
		_MoreNotice();
	}
	function _NoResults(state)
	{
		_trace("no results? = "+state);
		var ele = document.getElementById('smg-results-msg');
		
		if(state)
			_addReplaceClass(ele,'smg-results-no','smg-results-yes');
		else
			_addReplaceClass(ele,'smg-results-yes','smg-results-no');
	}
	
	function _MorePrevious(state)
	{
		_trace("more previous = "+state);
		var ele = document.getElementById('smg-more-previous');
		
		if(state)
			_addReplaceClass(ele,'smg-more-no','smg-more-yes');
		else
			_addReplaceClass(ele,'smg-more-yes','smg-more-no');
			
		if(typeof m_MorePreviousCB != "undefined")
			m_MorePreviousCB(state);
	}
	
	function _MoreNext(state)
	{
		_trace("more next = "+state);
		var ele = document.getElementById('smg-more-next');
		
		if(state)
			_addReplaceClass(ele,'smg-more-no','smg-more-yes');
		else
			_addReplaceClass(ele,'smg-more-yes','smg-more-no');
			
		if(typeof m_MoreNextCB != "undefined")
			m_MoreNextCB(state);
	}
	
	// replace the class for the given element.
	function _addReplaceClass(ele,orig,subst)
	{	
		if(!ele)
			return;
			
		if(ele.className.match(subst))
			return; // already there
		
		if(ele.className.match(orig))
			ele.className = ele.className.replace(orig,subst); // replace
		else
			ele.className = ele.className + ' ' + subst;	// add it.
	}
	function _MoreNotice()
	{
		// refresh page info
		m_pageCurrent = Math.floor(m_offset / m_numSlots)+1;
		m_pageTotal = Math.ceil(m_numVideos / m_numSlots);
		
		if(m_pageTotal == 0)
			m_pageCurrent = 0;
		var ele = document.getElementById('smg-page-current');
		if(ele!=undefined)
			ele.innerHTML = m_pageCurrent;
			
		ele = document.getElementById('smg-page-total');
		if(ele!=undefined)
			ele.innerHTML = m_pageTotal;
			
		// more backwards ?
		if(m_offset - m_stepSize < 0)
			_MorePrevious(false);
		else
			_MorePrevious(true);
		
		// more forwards ?
		if(m_offset + m_stepSize >= m_numVideos)
			_MoreNext(false);
		else
			_MoreNext(true);
	}
	
	this.SetUrl = _SetUrl;
	function _SetUrl(url)
	{
		m_url = url;
	}
	
	this.SetVideoOnLoadCallback = _SetVideoOnLoadCallback;
	function _SetVideoOnLoadCallback(func)
	{
		m_videoOnLoadCallback = func;	
	}
	
	this.SetVideoMetaDataUrl = _SetVideoMetaDataUrl;
	function _SetVideoMetaDataUrl(url)
	{
		m_videoMetaDataUrl = url;
	}
	
	this.SetVideoDomain = _SetVideoDomain;
	function _SetVideoDomain(url)
	{
		m_videoDomain = url;
	}
	
	
	// Special slot functions
	this.SpecialOnly = _SpecialOnly;
	function _SpecialOnly(state)
	{
		m_specialOnly = state;
	}
	this.SetSpecialSlot = _SetSpecialSlot;
	function _SetSpecialSlot(slot,ch,cat,ordr)
	{
		m_specials[slot] = { channelID: ch,
							 categoryID: cat,
							 order: ordr,
							 mode: 'always'};
		
		//alert(m_siteID);
		//if(m_siteID==18)
		//	alert(m_specials[slot].channelID + " " + m_specials[slot].categoryID + " " + m_specials[slot].mode);
	}
	
	this.TestMode = _TestMode;
	function _TestMode()
	{
		m_url = "http://test.switch-media-group.com/plugin/preview.php";
	}
	
	
	function _UseProxy(_proxy)
	{
		m_useProxy = _proxy;
	}

	
	// ****************          Functions to control screen elements
	
	var __SMGTrace;
	function _trace(msg,state)
	{
		if(!_SMGDebug) return;
		
		if(typeof __SMGTrace == "undefined")
			__SMGTrace = document.getElementById("SMGTrace");

		if(__SMGTrace != null)
		{
			if(state=='error')
				msg = '<p style="font-weight:bold;color:red;">'+msg+'</p>';
			else if(state=='warn')
				msg = '<p style="font-weight:bold;color:orange;">'+msg+'</p>';
			
			__SMGTrace.innerHTML = __SMGTrace.innerHTML + '<br />Preview: ' +msg;	
		}
	}
	
	this.UpdateHREF = _updateHREF;
	function _updateHREF(id,url)
	{
		if(document.getElementById(id)!=undefined )
		{
			document.getElementById(id).href = url;
		}
		else if(_SMGDebug)
			_SMGElementPopUp(id);
	}
	
	this.UpdateHTML = _updateHTML;
	function _updateHTML(id,obj,property)
	{
		if(document.getElementById(id)!=undefined && obj[property]!=undefined)
		{
			document.getElementById(id).innerHTML = obj[property];	
		}
		else if(_SMGDebug)
			_SMGElementPopUp(id);
	}
	
	this.UpdateIMG = _updateIMG;
	function _updateIMG(id,obj,property)
	{
		if(document.getElementById(id)!=undefined && obj[property]!=undefined)
		{
			document.getElementById(id).src = obj[property];	
		}
		else if(_SMGDebug)
			_SMGElementPopUp(id);
	}
	
	
	// I think this is old and not used
	this.Show = _show;
	function _show(id)
	{
		if(document.getElementById(id)!=undefined)
		{
			document.getElementById(id).style.visibility = "visible";
		}
		else if(_SMGDebug)
			alert("element "+id+" does not exist - can't show it");
	}
	
	// I think this is old and not used
	this.Hide = _hide;
	function _hide(id)
	{
		if(document.getElementById(id)!=undefined )
		{
			document.getElementById(id).style.visibility = "hidden";
		}
		else if(_SMGDebug)
			alert("element "+id+" does not exist - can't hide it");
	}
	
	function _SMGElementPopUp(id)
	{
		alert('Element "'+id+'" was not found in document\n(call SetDebug(false) to disable these popups)');
	}
	
	var m_currentVideoID = 0;
	var m_skipCurrentVideo;
	this.SkipCurrentVideo = _SkipCurrentVideo;
	function _SkipCurrentVideo(val)
	{
		if(typeof(val) != "undefined")
			m_skipCurrentVideo = val;
		else
			m_skipCurrentVideo = true;
	}
	
	function _addEvent( obj, type, fn )
	{
		if (obj.addEventListener)
			obj.addEventListener( type, fn, false );
		else if (obj.attachEvent)
		{
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
		}
	}

	function _removeEvent( obj, type, fn )
	{
		if (obj.removeEventListener)
			obj.removeEventListener( type, fn, false );
		else if (obj.detachEvent)
		{
			if(typeof obj[type+fn] != "undefined")
				obj.detachEvent( "on"+type, obj[type+fn] );
			
			obj[type+fn] = null;
			obj["e"+type+fn] = null;
		}
	}
	
	function _attachNavOnClicks()
	{
		var ele;
		ele = document.getElementById("smg-more-next")
		if(ele)
		{
			_removeEvent(ele,'click',__oldOnNext);
			_addEvent(ele,'click',_onNext);
			__oldOnNext = _onNext;
		}
		else
			_trace("smg-more-next element not found",'warn');
		
		ele = document.getElementById("smg-more-previous")
		if(ele)
		{
			_removeEvent(ele,'click',__oldOnPrevious);
			_addEvent(ele,'click',_onPrevious);
			__oldOnPrevious = _onPrevious;
		}
		else
			_trace("smg-more-previous element not found",'warn');
	}
	
	this.clearEvents = _clearEvents;		
	function _clearEvents() 
	{
		var ele = document.getElementById("smg-more-next")
		if(ele)
			_removeEvent(ele,'click',__oldOnNext);
		ele = document.getElementById("smg-more-previous")
		if(ele)
			_removeEvent(ele,'click',__oldOnPrevious);
		
		for(var slot=0;slot<m_numSlots;slot++)
		{
			var oldFn = m_generateOnClickFns[slot];
			for(var i=0;i<aPreviewNodes[slot]['clickables'].length;i++)
			{
				//alert('removing event: '+ oldFn);
				_removeEvent(aPreviewNodes[slot]['clickables'][i],'click',oldFn);
			}
		}
	}
	
	this.SetWmode = _SetWmode;
	function _SetWmode(mode)
	{
		m_wmode = mode;
	}
	
	function _findIndex(ary,value)
	{
		for (var i=0; i < ary.length; i++) {
			if (ary[i] === value) {
				return i;
			}
		}
		return null;
	};
	m_currentVideoIndex = 0;
	this.NextItem = _NextItem;
	function _NextItem()
	{

		if(m_currentVideoIndex == 0)
			m_currentVideoIndex = _findIndex(m_videoIDs,m_currentVideoID);

		if(m_currentVideoIndex==null)
			return;
			
		var nextIndex = m_currentVideoIndex+1
		if(nextIndex < m_numVideos)
		{
			m_currentVideoIndex = nextIndex;
			
			_trace("Next video: "+m_videoIDs[nextIndex]);
			m_currentVideoID = m_videoIDs[nextIndex];
			m_smgPlayer.LoadVideoDetails(m_videoIDs[nextIndex],'smg-player');
			
			if(nextIndex >= m_offset+m_stepSize)
				_onNext();
				
			_Update();
			_MoreNotice();
		}
		else
			_trace("Next video: none");
		
	}
	
	this.PreviousItem = _PreviousItem;
	function _PreviousItem()
	{
		if(m_currentVideoIndex == 0)
			m_currentVideoIndex = _findIndex(m_videoIDs,m_currentVideoID);
		
		if(m_currentVideoIndex==null)
			return;
		
		var nextIndex = m_currentVideoIndex-1
		if(nextIndex >= 0)
		{
			m_currentVideoIndex = nextIndex;
			m_currentVideoID = m_videoIDs[nextIndex];
			_trace("Previous item: "+m_videoIDs[nextIndex]);
			m_smgPlayer.LoadVideoDetails(m_videoIDs[nextIndex],'smg-player');
			if(nextIndex < m_offset)
				_onPrevious();
			_Update();
			_MoreNotice();
		}
		else
			_trace("Previous item: none");
	}
}
var __oldOnNext;
var __oldOnPrevious;

var SMGPreviewScriptLoaded = true;
if(typeof smg_callback_expected != "undefined" || typeof smg_waitPreview != "undefined")
{
	if(typeof smg_onload_callback != "undefined")
		smg_onload_callback('preview');
	
	if(typeof smg_readyBound != "undefined" && typeof smg_DomReady != "undefined")
		smg_DomReady();	
}



