/*****************************************************************************/
/* Changes as on 9/14/2007 per below:
/* 1) Cyama's Album id variale added for use in GetMusic() function where    */
/* the api call has been changed to send cyama's user id and its default     */
/* music album id															 */
/* 2) If condition added in GetAds function to prevent ads being placed in	 */
/* users gallery at level 4
/*****************************************************************************/

//Flux.js
var browser = null;
var context = null;
var listenersSetup = false;
var sceneLoadSense_observer = null;
var messageWall_observer = null;
var messageWallLoaded_observer = null;
var prayerWall_observer = null;
var gallery_observers = new Array();
var lazySusan_observer = null;
var musicShow_observer = null;
var	musicPlay1_observer = null;
var	musicPlay2_observer = null;
var	musicPlay3_observer = null;
var	musicPlay4_observer = null;
var	musicPrev_observer = null;
var	musicNext_observer = null;
var	musicUp_observer   = null;
var	musicDown_observer = null;
var messageDlgShow_observer = null;
var messagePost_observer = null;
var	messagePrev_observer = null;
var	messageNext_observer = null;
var userGalleryShow_observer = null;
var userGalleryAddEdit_observer = null;
var userGalleryRemoveImage_observer = null;
var userGalleryOpenFriend_observer = null;
var userGalleryMine_observer = null;
var editUserGalleryLocation_observer = null;
var editUserGalleryShow_observer = null;
var editUserGalleryPick1_observer = null;
var editUserGalleryPick2_observer = null;
var editUserGalleryPick3_observer = null;
var editUserGalleryPageUp_observer = null;
var editUserGalleryPageDown_observer = null;
var editUserGallerySave_observer = null;
var	selUserGalleryHelp_observer		= null;
var	selUserGalleryMySelect_observer	= null;
var selUserGallerySel1_observer		= null;
var selUserGallerySel2_observer		= null;
var selUserGallerySel3_observer		= null;
var selUserGallerySel4_observer		= null;
var selUserGalleryNext_observer		= null;
var selUserGalleryPrev_observer		= null;
var selUserGalleryShow_observer		= null;
var tour_observer					= null;

var albums = new Array();
var userList = new Array();
var friendList = new Array();
var auth = "";
var userName = '';
var passwd = '';
var userId = '';
var	currentGalleryImage = -1;
var currentFriendPageStart = 0;	// select friend gallery dialog 'top of page' index
var currentGalleryPageStart = 0;	// edit gallery dialog 'top of page' index
var currentMusicAlbumIndex = 0;
var currentSpeakerPos = 0;
var currentSpeakerPlaying = -1; // the position of the playing speaker (since it's one song per speaker now)
var currentMessageWall = 0;		// prayer or messages (for prev/next)
var currentMessagePos = -1; 	// current message showing (for next/prev functionality)

var maxPanelWidth = 8;	//  limit images/ads to this size (in half-meters)
var maxPanelHeight = 8;
var numPanelsOnLevel = new Array (23, 29, 7, 15, 6); // how many media panels on each level (MUST be in sync with church.x3d!)
var numPanelsToLevel = new Array();
var acc = 0;
for (i=0; i < 5; i++)
{
	numPanelsToLevel[i] = acc;
	acc += numPanelsOnLevel[i];
}

var numImagesInGallery = 0; // how many pictures/movies (up to 10)

var xmlhttp = createXMLHttpRequest();
var scripturl = "/api/xml/peopleaggregator/";
var messages = MultiDimensionalArray(2,40);
var galleryImages = new Array(); // 1-based index
var userGallery = new Array();
var musicAlbums = new Array();

//1) Bani:9/14/2007 - cyama's music album id
var cyamaAlbumID = 14;
var LinesLeft = 0;


function getURLParameters()
{
	var sURL = window.document.URL.toString();

	if (sURL.indexOf("?") > 0)
	{
		var arrParams = sURL.split("?");

		var arrURLParams = arrParams[1].split("&");

		var arrParamNames = new Array(arrURLParams.length);
		var arrParamValues = new Array(arrURLParams.length);

		var i = 0;
		for (i=0; i < arrURLParams.length; i++)
		{
			var sParam =  arrURLParams[i].split("=");
			arrParamNames[i] = sParam[0];
			if (sParam[1] != "")
				arrParamValues[i] = unescape(sParam[1]);
			else
				arrParamValues[i] = "No Value";
		}

		for (i=0; i < arrURLParams.length; i++)
		{
			if (arrParamNames[i] == 'user')
				userName = arrParamValues[i];
			if (arrParamNames[i] == 'pass')
				passwd = arrParamValues[i];
			if (arrParamNames[i] == 'auth_token')
			{
				auth = arrParamValues[i];
				return;
			}
		}
	}
	else
	{
		alert("No parameters.");
	}
	// if we get here, no params, or user/pass not given (and no auth either)
	if (userName == '' || passwd == '')
		AskLogin();
	if (userName == null || userName == '' || passwd == null || passwd == '')
	{
		userName = '';
		passwd = '';
	}
}

function MultiDimensionalArray(iRows,iCols)
{
	var i;
	var j;
	var a = new Array(iRows);
	for (i=0; i < iRows; i++)
	{
		a[i] = new Array(iCols);
		for (j=0; j < iCols; j++)
		{
			a[i][j] = new message (-1,'','','','',-1,-1);
		}
	}
	return(a);
}

function wordwrap (s, maxlen)
{
	var as = s.split ("\n"); // get array if newlines are embedded
	var strings = new Array();
	var lineindex = 0;
	for (var i=0; i < as.length; i++)
	{
		if (as[i].length < maxlen)
			strings[lineindex++] = as[i];
		else
		{
			while (as[i].length > maxlen)
			{
				var j = maxlen;
				// look for white space before max
				while (j > 0  && as[i].charAt(j) != ' ')
					j--;
				strings[lineindex++] = as[i].substr(0, j);
				as[i] = as[i].substr(j+1, as[i].length);
			}
			strings[lineindex++] = as[i];
		}
	}
	return strings;
}

// These funcs should move to another JS file
function message (id,title,name,userid,url,body,location)
{
	this.id = id;
	this.name = name;
	this.title = title;
	this.url = url;
	this.body = body;
	this.userid = userid;
	this.location = location;
}

function album (type, id, title)
{
	this.id = id;
	this.type = type;
	this.title = title;
}

function image (id,url,w,h,album,location,desc)
{
	this.id = id;
	this.album = album;
	if (desc != null)
		this.desc = desc;
	else
		this.desc = "";
	this.url = url;
	this.w = w;
	this.h = h;
	this.location = location;
}

function musicAlbum (id, bandName, picUrl)
{
	this.id = id;
	this.bandName = bandName;
	this.picUrl = picUrl;
	this.songs = new Array (new song('', '', ''));
}

function song (title, desc, url)
{
	this.title = title;
	this.desc = desc;
	this.url = url;
}

function user (id,name,image)
{
	this.id = id;
	this.name = name;
	this.image = image;
}

function friend (id,name)
{
	this.id = id;
	this.name = name;
}

function FindUserById (id)
{
	for (var i = 0; i < userList.length; i++)
		if (userList[i].id == id)
			return i;
	return -1;
}

function FindUserByName (name)
{
	for (var i = 0; i < userList.length; i++)
		if (userList[i].name == name)
			return i;
	return -1;
}

function InitData() // just get the bible passage
{
	// Take down 'load' screen
	setNodeEventIn ('SplashSwitch', 'whichChoice', -1);

	// Turn on the menu
	setNodeEventIn ('HUD', 'visible', 1);

	// Move to 'ground floor'
	setNodeEventIn ('GroundFloorVP', 'set_bind', true);

	// make empty galleries
	for (var i = 0; i <= 40; i++)
	{
		galleryImages[i] = new image (-1,'',2,3,'',i,'');
		userGallery[i] = galleryImages[i];
	}
	for (var i = 0; i < 20; i++)
	{
		musicAlbums[i] = new musicAlbum('', '');
	}

	for (var j=0; j < 2; j++)
		for (i = 0; i < 40; i++)
			messages[j][i] = new message (-1,'','','','','',-1);

	if (auth == '')
		LogIn();
	if (auth != '')
	{
		GetUserList2();
		GetBibleMessage();
		GetGeneralMessages() // get general messages
		GetPrayerMessages() // get prayer messages
		GetUserAlbums() // get user's albums
		for (i = 1; i <= 10; i++)
			SetUserImageEnabled(i, false); // late kluge: disable clicking on user gallery images
		GetUserImages('image');
		GetAds();
		GetUserImages('video');
		GetMusic();
		//  Two below commented out by ggreg
		//  Not used by app
		//GetFriendList();
		//GetUserMusic();
	}
}

function GetUserList()
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "";
	if (xmlhttp)
	{
		var url = scripturl + "getUserList?profileImageSize=127x135";
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		for (var i = 0; i < items.length; i++)
		{
			var itemnode = items[i]; // users[i].getElementsByTagName('item')[0];
			var id = getAJAXNodeValue(itemnode,'id');
			var name = getAJAXNodeValue(itemnode,'login');
			var imagenode = itemnode.childNodes[2];
			var img = null;
			if (imagenode)
			{
				var url = getAJAXNodeValue(imagenode,'url');
				var w = getAJAXNodeValue(imagenode,'width');
				var h = getAJAXNodeValue(imagenode,'height');
				img = new image (0,url,'',0,'');
			}
			userList[i] = new user (id, name, img );
		}
	}
	else
	{
		alert("Cannot call server to get users");
		return ("");
	}
}


function GetUserList2()
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "";
	if (xmlhttp)
	{
		var url = scripturl + "getUserList?profileImageSize=127x135";
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		//get the total number of pages
		var totalpagesNode= xmlhttp.responseXML.getElementsByTagName("totalPages");
		totalpages = totalpagesNode[0].childNodes[0].nodeValue;
		// now extract the data based on the response
		for (var pagectr = 1; pagectr <= totalpages; pagectr++ )
		{
			var url = scripturl + "getUserList?profileImageSize=127x135&page="+pagectr;
			xmlhttp.open("GET", url, false);
			// synchronous for simplicity, could be made async
			xmlhttp.send(null);
			var items = xmlhttp.responseXML.getElementsByTagName("item");
			for (var i = 0; i < items.length; i++)
			{
				var itemnode = items[i]; // users[i].getElementsByTagName('item')[0];
				var id = getAJAXNodeValue(itemnode,'id');
				var name = getAJAXNodeValue(itemnode,'login');
				var imagenode = itemnode.childNodes[2];
				var img = null;
				if (imagenode)
				{
					var url = getAJAXNodeValue(imagenode,'url');
					var w = getAJAXNodeValue(imagenode,'width');
					var h = getAJAXNodeValue(imagenode,'height');
					img = new image (0,url,'',0,'');
				}
				userList[i] = new user (id, name, img );
			}
		}
	}
	else
	{
		alert("Cannot call server to get users");
		return ("");
	}
}


function GetFriendList()
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "";
	if (xmlhttp)
	{
		var url = scripturl + "getUserRelations?profileImageSize=50x50&login="+userName+"&resultsPerPage=100&page=1";
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		for (var i = 0; i < items.length; i++)
		{
			var itemnode = items[i]; // users[i].getElementsByTagName('item')[0];
			var login = getAJAXNodeValue(itemnode,'login');
			var id = getAJAXNodeValue(itemnode,'id');
			friendList[i] = new friend (id, login);
		}
	}
	else
	{
		alert("Cannot call server to get friends");
		return ("");
	}
}

function AskLogin()
{
	while (userName == '')
		userName = prompt ('What is your user name?');
	passwd = prompt ('What is your password?');
}

function LogIn()
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "login="+userName+"&password="+passwd;
	if (xmlhttp)
	{
		var url = scripturl + "login";
		url += "?"+req;
		xmlhttp.open("POST", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		var resp = xmlhttp.responseXML.getElementsByTagName("response");
		var success = getAJAXNodeValue(resp[0],'success');
		if (success == 'true')
		{
			auth = getAJAXNodeValue(resp[0],'authToken');
		}
	}
	return auth;
}

function GetBibleMessage() // just get the bible passage
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "hey";
	if (xmlhttp)
	{
		var url;
		url = scripturl + 'getGroups?context=user:1';
		xmlhttp.open("GET", url, false);
		xmlhttp.send(null);
		// get the groups, look for the 'admin' group
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		if (items.length > 0)
		{
			for (var i=0; i < items.length; i++)
			{
				var name = getAJAXNodeValue(items[i],'name');
				if (name == 'Admin')
				{
					var adminGroupId = getAJAXNodeValue(items[i],'id');
					url = scripturl + 'getBoardMessages?authToken='+auth+'&context='+adminGroupId;
					xmlhttp.open("GET", url, false);
					xmlhttp.send(null);
					// now extract the forums, look for 'Bible Wall Forum'
					var items = xmlhttp.responseXML.getElementsByTagName("item");
					if (items.length > 0)
					{
						var j;
						for (j=0; j < items.length; j++)
						{
							var forumTitle = getAJAXNodeValue(items[j],'title');
							if (forumTitle == 'Bible Wall')
							{
								var msgId = getAJAXNodeValue(items[j],'id');
								url = scripturl + 'getBoardMessages?authToken='+auth+'&context='+msgId;
								xmlhttp.open("GET", url, false);
								xmlhttp.send(null);
								var items = xmlhttp.responseXML.getElementsByTagName("item");
								if (items.length > 1)
								{
									// skip the first, as it is the 'kickoff', 2nd is most recent
									// get random quote
									var quoteId = Math.floor(Math.random()*(items.length-1)) + 1;
									//xquoteId = 9; // for testing, as this will crash -- removed by ggreg
									var msgTitle = getAJAXNodeValue(items[quoteId],'title');
									var msgContent = getAJAXNodeValue(items[quoteId],'content');
									if (msgContent != null)
										SetBibleMessage(msgContent);
								}
							}
						}
					}
				}
			}
		}
	}
	else
	{
		alert("Cannot call server to get bible msg");
		return ("The Word");
	}
}

function SetBibleMessage(msg)
{
	setMFStringWrap ('BibleText', 'string', msg, 40);
}

function setMFStringWrap (node, field, string, wrap)
{
	var s = clean (string); // clean it up
	var strs = wordwrap (s, wrap);
// 	for (var i = 0; i < strs.length; i++)
//		setNodeEventInIndex (node, field, i, strs[i]);

setNodeEventArray( node, field, strs );

//		setNodeEventInIndex (node, field, 0, 'THis is my first attempt to write bible text 0');
//		setNodeEventInIndex (node, field, 1, 'THis is my first attempt to write bible text 1');
//		setNodeEventInIndex (node, field, 2, 'THis is my first attempt to write bible text 2');
//		setNodeEventInIndex (node, field, 3, 'THis is my first attempt to write bible text 3');
}

function clean (s)
{
	var cs = s;
	cs.replace ('"', '\"');
	cs.replace ("'", "\'");
	cs.replace ("\\x1C", "'");
	cs.replace ("\\x1D", "'");
	return cs;
}

function GetGeneralMessages() // get general messages
{
	GetMessages(0, '3D Message Wall', '3D Message Board');
	var wallloaded = getNodeField('MessageWall', 'loaded');
	if (wallloaded)
	{
		for (i = 0; i < 40; i++)
		{
			var sm = 'setMessage("MessageWall",'+i+',"'+messages[0][i].url+'")';
			setTimeout (sm, 500);
//			showMessageDlg(0,i)
		}
	}
	else alert ('wall not loaded');
}

function GetPrayerMessages() // get prayer messages
{
	GetMessages(1, '3D Prayer Wall', '3D Prayer Wall');
	var wallloaded = getNodeField('PrayerWall', 'loaded');
	if (wallloaded)
	{
		for (i = 0; i < 40; i++)
		{
			var sm = 'setMessage("PrayerWall",'+i+',"'+messages[1][i].url+'")';
			setTimeout (sm, 500);
//			showMessageDlg(1,i)
		}
	}
	else alert ('wall not loaded');
}

function setMessage (wallname, location, url)
{
	setNodeEventInIndex (wallname, "Messageurl"+(location+1), 0, url);
}

function GetMessages(whichwall, groupName, boardName) // get  messages
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "";
	if (xmlhttp)
	{
		var url;
		url = scripturl + 'getGroups?authToken='+auth;
		xmlhttp.open("GET", url, false);
		xmlhttp.send(null);
		// get the groups, look for the 'group'
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		if (items.length > 0)
		{
			for (var i=0; i < items.length; i++)
			{
				var name = getAJAXNodeValue(items[i],'name');
				if (name == groupName)
				{
					var groupId = getAJAXNodeValue(items[i],'id');
					url = scripturl + 'getBoardMessages?context='+groupId;
					xmlhttp.open("GET", url, false);
					xmlhttp.send(null);
					// now extract the forums, look for the 'board'
					var items = xmlhttp.responseXML.getElementsByTagName("item");
					if (items.length > 0)
					{
						var j;
						for (j=0; j < items.length; j++)
						{
							var forumTitle = getAJAXNodeValue(items[j],'title');
							if (forumTitle == boardName)
							{
								var msgId = getAJAXNodeValue(items[j],'id');
								url = scripturl + 'getBoardMessages?context='+msgId;
								xmlhttp.open("GET", url, false);
								xmlhttp.send(null);
								//get the total number of pages
								//var totalpagesNode= xmlhttp.responseXML.getElementsByTagName("totalPages");
								//totalpages = totalpagesNode[0].childNodes[0].nodeValue;
								// now extract the data based on the response
								var locationctr = 0;
								//for (var pagectr = 1; pagectr <= totalpages; pagectr++ )
								//{
									var items = xmlhttp.responseXML.getElementsByTagName("item");
									for (var k = 0; k < items.length; k++)
									{
										var id = getAJAXNodeValue(items[k],'id');
										var location = locationctr;
										var body = getAJAXNodeValue(items[k],'content');
										var title = getAJAXNodeValue(items[k],'title');
										var authnode = items[k].getElementsByTagName('author')[0];
										var name = getAJAXNodeValue(items[k],'name');
										var userid = getAJAXNodeValue(authnode,'id');
										//var userIdx = FindUserById (userid);
										var url = '';
										//if (userIdx >= 0)
										//{
											if (getAJAXNodeValue(authnode,'imageurl'))
											{
												url = getAJAXNodeValue(authnode,'imageurl');
											}
											else
												url = 'GalleryPlaceholder.jpg';
										//}
							//			var url = GetUserUrl(name);
										messages[whichwall][location] = new message (id,groupName,name,userid,url,title + ':\n' + body,location);
										locationctr++;
									} // for msg items
								//}
							} // if board found
						} // for group items
					} // if boards exist
				} // if found group
			} // for each group
		} // if any groups
	}
	else
	{
		alert("Cannot call server to get messages");
		return ("");
	}
}

function PostNewMessage (title,msg)
{
	if (title != null && msg != null && title != '' && msg != '')
	{
		var xmlhttp = createXMLHttpRequest();
		title = title.replace (' ', '+');
		msg = msg.replace (' ', '+');
		var	req = "authToken="+auth+'&content='+msg+'&title='+title+'&context=msg:10&allowAnonymous=true';
		if (xmlhttp)
		{
			var url = scripturl + "newBoardMessage?"+req;
			xmlhttp.open("POST", url, false);
			xmlhttp.send(req);
			setTimeout ('GetGeneralMessages()', 3000); // refresh display of general messages
		}
	}
}

function GetUserUrl(name)
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "hey";
	if (xmlhttp)
	{
		var url = scripturl + "getUserProfile?login="+name;
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var urlnode = xmlhttp.responseXML.getElementsByTagName("url");
		var url = urlnode[0].firstChild.nodeValue;
		return url;
	}
	else
	{
		alert("Cannot call server to get user url");
		return ("");
	}
}

function GetUserAlbums() // get user's images
{
	GetAlbums ('user');
}

function GetAlbums(userId) // get a user's images into global 'albums' array
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "";
	if (xmlhttp)
	{
		var url = scripturl + "getAlbums?authToken="+auth+"&context="+userId;
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var albumnodes = xmlhttp.responseXML.getElementsByTagName("albums");
		if (albumnodes.length > 0)
		{
			var items = albumnodes[0].getElementsByTagName('item');

			for (var i = 0; i < items.length; i+=2)
			{
				var id = getAJAXNodeValue(items[i],'id');
				var type = items[i+1].firstChild.nodeValue;
				var title = getAJAXNodeValue(items[i],'title');
				albums[i/2] = new album (type, id, title);
			}
		}
	}
	else
	{
		alert("Cannot call server to get messages");
		return ("");
	}
}

function GetUserImages(imageType) // get user's images
{
	// find user album for 'images'
	var i;
	for (i=0; i < albums.length; i++)
	{
		if (albums[i].type == imageType)
			break;
	}
	if (i >= albums.length)
		return;

	var xmlhttp = createXMLHttpRequest();
	var	req = "hey";
	if (xmlhttp)
	{
		var url = scripturl + "getFiles?authToken="+auth+"&context="+albums[i].id;
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		var numItemsAdded = 0;
		for (i = 0; i < items.length && (i+numImagesInGallery) < 10; i++)
		{
			var location = i+numImagesInGallery+1;
			var type = getAJAXNodeValue(items[i],'type');
			if (type == imageType)
			{
				var url = getAJAXNodeValue(items[i],'url');
				var w = getAJAXNodeValue(items[i],'width');
				var h = getAJAXNodeValue(items[i],'height');

				if (w != null && h != null)
				{
					w /= 100;
					h /= 100;
					if (w > maxPanelWidth)
					{
						h = h * (maxPanelWidth / w);
						w = maxPanelWidth;
					}
					if (h > maxPanelHeight)
					{
						w = w * (maxPanelHeight / h);
						h = maxPanelHeight;
					}
				}
				else
				{
					w = maxPanelWidth * .8;
					h = maxPanelHeight * .8;
				}
				userGallery[location] = new image (0,url,w,h,'',location,'me');
				galleryImages[location] = userGallery[location];
				var si = 'SetUserImage("'+url+'",'+location+','+w+','+h+')';
				setTimeout (si, 500 + i * 500);
				numItemsAdded++;
			}
		}
		numImagesInGallery += numItemsAdded;
	}
	else
	{
		alert("Cannot call server to get images");
		return ("");
	}
}

function GetMusic()
{
//Songs will be pulled from either the CVNLive admin user’s audio gallery OR from the Admin group audio gallery
// – whichever is easier for you to pull from.
	var adminIdx = -1;

	var xmlhttp = createXMLHttpRequest();
	if (xmlhttp)
	{
		var url;
		url = scripturl + 'getGroups?context=user:1';
		xmlhttp.open("GET", url, false);
		xmlhttp.send(null);
		// get the groups, look for the 'admin' group
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		if (items.length > 0)
		{
			for (var g = 0; g < items.length; g++)
			{
				var name = getAJAXNodeValue(items[g],'name');
				if (name == 'Admin')
				{
					var adminGroupId = getAJAXNodeValue(items[g],'id');

					if (adminGroupId != '')
					{
						if (1 || albums.length > 0)
						{
							var	req = "hey";
							if (xmlhttp)
							{
								//1) var url = scripturl + "getFiles?authToken="+auth+"&context="+adminGroupId;
								//commented above - Bani:9/10/2007 to add the call below. This is done to get cyama's music for any
								//user who logs in to the 3D space.
								var url = scripturl + "getFiles?authToken="+auth+"&context=user:1:album:"+cyamaAlbumID;

								xmlhttp.open("GET", url, false);
								// synchronous for simplicity, could be made async
								xmlhttp.send(null);
								// now extract the data based on the response
								var items = xmlhttp.responseXML.getElementsByTagName("item");
								var numItemsAdded = 0;
								for (i = 0;  i < 20; i++)
								{
									if(i < items.length )
									{
										var type = getAJAXNodeValue(items[i],'type');
									}
									if (type == 'audio')
									{
										if(i < items.length )
										{
											var url = getAJAXNodeValue(items[i],'url');
											var title = getAJAXNodeValue(items[i],'title');
											var author = getAJAXNodeValue(items[i],'author');
											var content = getAJAXNodeValue(items[i],'content');
										}
																	
										if(i >= items.length )
										{
											var url = getAJAXNodeValue(items[0],'url');
											var title = getAJAXNodeValue(items[0],'title');
											var author = getAJAXNodeValue(items[0],'author');
											var content = getAJAXNodeValue(items[0],'content');
										}


										var userIdx = FindUserById (author);
										if (userIdx >= 0)
										{
											musicAlbums[currentMusicAlbumIndex].bandName = userList[userIdx].name;
											if (userList[userIdx].image != null)
												musicAlbums[currentMusicAlbumIndex].pic = userList[userIdx].image.url;
										}
										else
											musicAlbums[currentMusicAlbumIndex].bandName = author;
										musicAlbums[currentMusicAlbumIndex++].songs[0] = new song (title, content, url);
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

function GetUserMusic(albumId) // get user's music (albumId contains userId user:N:album:M
{
	// find user album for 'audio'
	var i;
	for (i=0; i < albums.length && currentMusicAlbumIndex < 20; i++)
	{
		if (albums[i].type == 'audio')
		{
			GetSongs (i);
			currentMusicAlbumIndex++;
		}
	}
}

function GetSongs(albumIndex) // get album's music
{
	var xmlhttp = createXMLHttpRequest();
	var	req = "hey";
	if (xmlhttp)
	{
		var url = scripturl + "getFiles?authToken="+auth+"&context="+albums[albumIndex].id;
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		if (items.length > 0)
		{
			musicAlbums[currentMusicAlbumIndex].id = albums[albumIndex].id;
// TO DO			musicAlbum[currentMusicAlbumIndex].picUrl =
			for (i = 0; i < items.length; i++)
			{
				var location = i+1;
				var type = getAJAXNodeValue(items[i],'type');
				if (type == 'audio')
				{
					var url = getAJAXNodeValue(items[i],'url');
					var title = getAJAXNodeValue(items[i],'title');
					var author = getAJAXNodeValue(items[i],'author');
					var content = getAJAXNodeValue(items[i],'content');
					musicAlbums[currentMusicAlbumIndex].songs[i] = new song (title, content, url);
		//				setTimeout (si, 1000);
				}
			}
		}
	}
	else
	{
		alert("Cannot call server to get audio");
		return ("");
	}
}

function GetAds() // get user's images
{
	// find user album for 'images'
	var i;

	var xmlhttp = createXMLHttpRequest();
	var	req = "hey";
	if (xmlhttp)
	{
		var url = scripturl + "listAds?page_type=cyama_3d";
		xmlhttp.open("GET", url, false);
		// synchronous for simplicity, could be made async
		xmlhttp.send(null);
		// now extract the data based on the response
		var items = xmlhttp.responseXML.getElementsByTagName("item");
		for (i = 0; i < items.length; i++)
		{

			var item = items[i];
			var ids = getAJAXNodeValue(item,'id');
			var idsa = ids.split(':');
			var id = parseInt(idsa[1]);
			var orient = getAJAXNodeValue(item,'orientation');
			var imagenode = item.getElementsByTagName("image")[0];
			if (imagenode)
			{
				var url = getAJAXNodeValue(imagenode,'url');
				var w = getAJAXNodeValue(imagenode,'width');
				var h = getAJAXNodeValue(imagenode,'height');

				if (w != null && h != null)
				{
					w /= 100;
					h /= 100;
					if (w > maxPanelWidth)
					{
						h = h * (maxPanelWidth / w);
						w = maxPanelWidth;
					}
					if (h > maxPanelHeight)
					{
						w = w * (maxPanelHeight / h);
						h = maxPanelHeight;
					}
				}
				else
				{
					w = maxPanelWidth * .8;
					h = maxPanelHeight * .8;
				}

				// determine ad placement
				var orientstrs = orient.split(',');
				var level = 1 + parseInt (orientstrs[0]);
				//2) Bani:9/14/2007 - added this level check below since when level gets to 4 it tends to place images in the users gallery.
				//which should not happen
				if(level != 4)
				{
					var panelNum = 1 + parseInt (orientstrs[1]);
					var si = 'SetImage("'+url+'",'+level+','+panelNum+','+w+','+h+')';
					setTimeout (si, 500 + 500 * i);
				}
			}
		}
	}
	else
	{
		alert("Cannot call server to get images");
		return ("");
	}
}

function SetUserImage(url,num,w,h)
{
	SetImage(url,4,num,w,h);
}

function SetUserImageEnabled(num,val)
{
	var nodename = "L4Mediapanel" + num+"a";
	setNodeEventIn (nodename, "enabled", val);
}

function SetImage(url,level,num,w,h)
{
	var nodename = "L" + level + "Mediapanel" + num+"a";
	if (getNodeField (nodename, 'loaded'))
	{
		if (url.indexOf('.avi') > 0 || url.indexOf('.mpg') > 0 || url.indexOf('.gif') > 0 || url.indexOf('.wmv') > 0)
		{
			setNodeEventIn (nodename, "isMovie", true);
		}
		else
		{
			setNodeEventIn (nodename, "isMovie", false);
		}
		//alert(num+"==" +url);
		setNodeEventInIndex (nodename, "url", 0, url);
		setNodeEventInXY (nodename, "size", w,h); // adjust size for the fudge scale on the model itself. would be nice to get that factor from the model
	}
	else alert ('panel '+num+' not yet loaded');
}

function SetMusic (num, url)
{
	setNodeEventIn ("Speaker"+num+"a", "play", false);
	setNodeEventInIndex ("Speaker"+num+"a", "url", 0, url);
	setNodeEventIn ("Speaker"+num+"a", "play", true);
}

function GetUserImageUrl()
{
	var num = document.getElementById('UserImageNum').value;
	var url = document.getElementById('UserImageUrl').value;
	if (num != '')
	{
		SetUserImage(url,num,2,3);
		setNodeEventInIndex ('MovieTexture_TestBox', "url", 0, url);
	}
}

function GetMusicUrl()
{
	var num = document.getElementById('AudioNum').value;
	var url = document.getElementById('AudioUrl').value;
	if (num != '')
	{
		SetMusic (num, url);
	}
}
// End of these funcs should move to another JS file

function PauseMilliseconds(Amount)
{
	var d = new Date(); //today's date
	while (1)
	{
		var mill = new Date(); // Date Now
		var diff = mill - d; //difference in milliseconds
		if (diff > Amount)
		{
			break;
		}
	}
}

function createXMLHttpRequest()
{
   try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
   try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
   try { return new XMLHttpRequest(); } catch(e) {}
   alert("XMLHttpRequest not supported but needed");
   return null;
}

function initFlux(filename)
{
	browser = null;
	context = null;
	listenersSetup = false;
//alert ('debug now');
//PauseMilliseconds(5000); // prevents load-timing errors in Flux
	getURLParameters();
    browser = document.FLUX.getBrowser();
    if (browser != null)
	{
	    listener = new Object();
	    listener.browserChanged = browserChanged;
	    browser.addBrowserListener(listener);
		var dir = location.href.substring(0,location.href.lastIndexOf('/')+1);
		if (dir.indexOf("file:///") == 0) // if it's there...
			dir = dir.substring(8,dir.length);
		var pathparam = dir + filename;
		browser.loadUrlS (pathparam);
	}
}

function browserChanged(evt)
{
	if (evt == 0)
	{
	    setupListeners();
	}
}

function setupListeners()
{
    if (context != null)
		return;
    context = browser.getExecutionContext();
    if (context != null)
    {
		// set up listeners
		// for the message wall
		messageWallLoaded_observer = setListenerObserver("MessageWall", "loaded_changed", onMessageWallLoaded);
		messageWall_observer = setListenerObserver("MessageWall", "messageId", onMessageWall);
		prayerWall_observer = setListenerObserver("PrayerWall", "messageId", onPrayerWall);

		messageDlgShow_observer = setListenerObserver("MessageDlg", "show_changed", onMessageShow);
		messagePost_observer = setListenerObserver("MessageDlg", "postMessage", onMessagePost);
		messagePrev_observer = setListenerObserver("MessageDlg", "prevMessage", onMessagePrev);
		messageNext_observer = setListenerObserver("MessageDlg", "nextMessage", onMessageNext);

		// User gallery image panels
		var i;
		for (i=0; i < 10; i++)
		{
			var nodename = "L4Mediapanel" + (i+1) +"a";
			gallery_observers[i] = setListenerObserver(nodename, "idout", onUserGalleryPick);
		}

		// Start Tour
		tour_observer = setListenerObserver("HUD", "view", onStartTour);

		// Speaker picker
		lazySusan_observer = setListenerObserver("LazySusan", "curSlot_changed", onSpeakerChosen);

		// User image gallery dialogs
		userGalleryHelp_observer = setListenerObserver("GalleryDlg", "help", onUserGalleryHelp);
		userGalleryShow_observer = setListenerObserver("GalleryDlg", "show_changed", onUserGalleryShow);
		userGalleryFlag_observer = setListenerObserver("GalleryDlg", "flag", onUserGalleryFlag);
		userGalleryAddEdit_observer = setListenerObserver("GalleryDlg", "addedit", onUserGalleryAddEdit);
		userGalleryRemoveImage_observer = setListenerObserver("GalleryDlg", "removeimage", onUserGalleryRemoveImage);
		userGalleryOpenFriend_observer = setListenerObserver("GalleryDlg", "openfriendgallery", onUserGalleryOpenFriend);
		userGalleryMine_observer = setListenerObserver("GalleryDlg", "mygallery", onUserGalleryMine);

		editUserGalleryLocation_observer = setListenerObserver("EditGalleryDlg", "GalleryLocation_changed", onEditUserGalleryLocation);
		editUserGalleryShow_observer = setListenerObserver("EditGalleryDlg", "show_changed", onEditUserGalleryShow);
		editUserGalleryPick1_observer = setListenerObserver("EditGalleryDlg", "pick1", onEditUserGalleryPick1);
		editUserGalleryPick2_observer = setListenerObserver("EditGalleryDlg", "pick2", onEditUserGalleryPick2);
		editUserGalleryPick3_observer = setListenerObserver("EditGalleryDlg", "pick3", onEditUserGalleryPick3);
		editUserGalleryPageUp_observer = setListenerObserver("EditGalleryDlg", "pageup", onEditUserGalleryPageUp);
		editUserGalleryPageDown_observer = setListenerObserver("EditGalleryDlg", "pagedown", onEditUserGalleryPageDown);
		editUserGallerySave_observer = setListenerObserver("EditGalleryDlg", "savegallery", onEditUserGallerySave);

		selUserGalleryHelp_observer		= setListenerObserver("SelectFriendGalleryDlg", "help", onSelUserGalleryHelp);
		selUserGalleryMySelect_observer	= setListenerObserver("SelectFriendGalleryDlg", "myselect", onSelUserGalleryMySelect);
		selUserGallerySel1_observer		= setListenerObserver("SelectFriendGalleryDlg", "select1", onSelUserGallerySel1);
		selUserGallerySel2_observer		= setListenerObserver("SelectFriendGalleryDlg", "select2", onSelUserGallerySel2);
		selUserGallerySel3_observer		= setListenerObserver("SelectFriendGalleryDlg", "select3", onSelUserGallerySel3);
		selUserGallerySel4_observer		= setListenerObserver("SelectFriendGalleryDlg", "select4", onSelUserGallerySel4);
		selUserGalleryNext_observer		= setListenerObserver("SelectFriendGalleryDlg", "next", onSelUserGalleryNext);
		selUserGalleryPrev_observer		= setListenerObserver("SelectFriendGalleryDlg", "previous", onSelUserGalleryPrev);
		selUserGalleryShow_observer		= setListenerObserver("SelectFriendGalleryDlg", "show_changed", onSelUserGalleryShow);

		// Music dialog
		musicHelp_observer = setListenerObserver("MusicDlg", "help", onMusicHelp);
		musicFlag_observer = setListenerObserver("MusicDlg", "flag", onMusicFlag);
		musicShow_observer = setListenerObserver("MusicDlg", "show_changed", onMusicShow);

		musicPlay1_observer = setListenerObserver("MusicDlg", "songplay1_changed", onMusicPlay1);
		musicPlay2_observer = setListenerObserver("MusicDlg", "songplay2_changed", onMusicPlay2);
		musicPlay3_observer = setListenerObserver("MusicDlg", "songplay3_changed", onMusicPlay3);
		musicPlay4_observer = setListenerObserver("MusicDlg", "songplay4_changed", onMusicPlay4);

		musicPrev_observer = setListenerObserver("MusicDlg", "previous", onMusicPrev);
		musicNext_observer = setListenerObserver("MusicDlg", "next", onMusicNext);
		musicUp_observer = setListenerObserver("MusicDlg", "up", onMusicUp);
		musicDown_observer = setListenerObserver("MusicDlg", "down", onMusicDown);

	}
}

function testinit()
{
	InitData();
}

function onMessageWallLoaded()
{
	var loaded = messageWallLoaded_observer.field.getValue();
	if (loaded)
		setTimeout ('InitData()', 50); // don't make a direct call, as we're in a callback function
}

function onStartTour()
{
	var start = tour_observer.field.getValue();
	//  just queue up some 'bind' events
	if (start)
	{
		setTimeout ('BindViewpoint("StartVP")', 10);
		setTimeout ('BindViewpoint("ChapelVP")', 5000);
		setTimeout ('BindViewpoint("PrayersVP")', 10000);
		setTimeout ('BindViewpoint("GalleryVP")', 15000);
		setTimeout ('BindViewpoint("MusicVP")', 20000);
		setTimeout ('BindViewpoint("MessageWallVP")', 25000);
		setTimeout ('BindViewpoint("GroundFloorVP")', 30000);
	}
}

function BindViewpoint (vpnodename)
{
	setNodeEventIn (vpnodename, "set_bind", true);
}

function showMessageDlg(action)
{

	if (messages[currentMessageWall][currentMessagePos].url != "")
	{
		var startat, endat;
		var strings = wordwrap (messages[currentMessageWall][currentMessagePos].body, 30);
		var linectr = 0;
		//alert(action)
		if(action == 'next')
		{
			if(LinesLeft > 0)
				{
					startat = strings.length - LinesLeft;
					if(startat + 9 < strings.length )
						endat = startat + 8;
					else
						endat = strings.length -1;
					LinesLeft = (LinesLeft - 9);
				}
			else
				{
					startat = 0;
					if(strings.length < 9)
						endat = strings.length -1;
					else
						endat = 8;
					LinesLeft = (strings.length - (endat +1));
				}
			
		}
		else if(action == 'prev')
		{
		
			if(strings.length < 9)
				{
			
					startat = 0;
					endat = strings.length - 1;
					LinesLeft = (strings.length - (endat + 1));
					
				}
			else 
				{
					endat = strings.length - (LinesLeft + 10);
					startat = endat - 8 ;
					LinesLeft = (LinesLeft + 9);
					if(startat < 8)
					{
						startat = 0;
						if(strings.length < 9)
						{
							endat = strings.length -1;
						}
						else
						{
							endat = 8;
						}
						LinesLeft = (strings.length - (endat + 1));
					}

					
				}
		}
		else if(action == '')
		{
				startat = 0;
				if(strings.length < 9)
					endat = strings.length - 1;
				else
					endat = 8;
				LinesLeft = (strings.length - (endat + 1));
		}
		setNodeEventInIndex ("MessageDlg", "url", 0, messages[currentMessageWall][currentMessagePos].url);
		setNodeEventInIndex ("MessageDlg", "title", 0, messages[currentMessageWall][currentMessagePos].title);
		setNodeEventInIndex ("MessageDlg", "user", 0, messages[currentMessageWall][currentMessagePos].name);
		//var strings = wordwrap (messages[currentMessageWall][currentMessagePos].body, 30);
		// set new message strings
		var text ;
		for (var i = startat; i <= endat; i++)
		{
			
			if( i == (endat) && (strings.length -1) > endat)
				text = strings[i] + ' (more...)';
			else
				text = strings[i];
		
			setNodeEventInIndex ("MessageDlg", "messageBody", linectr, text);
			linectr++;
		}
		// clear any existing slack ...
		for (i=linectr; i <= 8; i++)
			setNodeEventInIndex ("MessageDlg", "messageBody", i, '');
		setNodeEventIn ("NavigationInfoNone", "set_bind", true);
		setNodeEventIn ("MessageDlg", "show", 1);
	}
}

function onMessageShow()
{
	var val = messageDlgShow_observer.field.getValue();
	if (val < 1)
	{
		// 'message' dialog was just closed, re-enable walking/flying
		setNodeEventIn ("NavigationInfoNone", "set_bind", false);
	}
}

function onMessagePost()
{
	var val = messagePost_observer.field.getValue();
	if (val)
	{
		var title = prompt("Enter a title for your message", "");
		var msg = prompt("Enter your message", "");
		PostNewMessage (title,msg);
	}
}

function onMessagePrev()
{
	var val = messagePrev_observer.field.getValue();
	if (val)
	{
	//	if (currentMessagePos > 0)
	//		currentMessagePos--;
		//nextClickCtr = nextClickCtr - 1;
		showMessageDlg('prev');
	}
}

function onMessageNext()
{
	var val = messageNext_observer.field.getValue();
	if (val)
	{
		//if (messages[currentMessageWall][currentMessagePos+1].url != "")
		//	currentMessagePos++;
		//nextClickCtr = nextClickCtr + 1;
		showMessageDlg('next');
	}
}

function onMessageWall()
{
	currentMessageWall = 0;
	currentMessagePos = messageWall_observer.field.getValue() - 1;
	showMessageDlg('');
}

function onPrayerWall()
{
	currentMessageWall = 1;
	currentMessagePos = prayerWall_observer.field.getValue() - 1;
	showMessageDlg('');
}

function setGalleryImage (location)
{
	SetUserImage(galleryImages[location].url,location,galleryImages[location].w,galleryImages[location].h);
}

function setGalleryDlgFields (location)
{
//	setNodeEventInIndex ("GalleryDlg", "friendsname", 0, galleryImages[location].name);
	setNodeEventInIndex ("GalleryDlg", "url", 0, galleryImages[location].url);
	setNodeEventInIndex ("GalleryDlg", "description", 0, galleryImages[location].desc);
	setNodeEventInIndex ("GalleryDlg", "title", 0, galleryImages[location].desc);
}

function setEditGalleryDlgFields (location)
{
	setNodeEventInIndex ("EditGalleryDlg", "Thumbnailurl", 0, galleryImages[location].url);
	setNodeEventInIndex ("EditGalleryDlg", "thumbnailtitle", 0, galleryImages[location].desc);
	setNodeEventIn ("EditGalleryDlg", "GalleryLocation", location);
}

function onUserGalleryPick(f,t)
{
	var wallpos = f.getValue();
	currentGalleryImage = wallpos;
	setGalleryDlgFields (currentGalleryImage);
	// no nav while in dialog
	setNodeEventIn ("NavigationInfoNone", "set_bind", true);
	setNodeEventIn ("GalleryDlg", "show", 1);
}


function onUserGalleryHelp()
{
	var val = userGalleryHelp_observer.field.getValue();
}

function onUserGalleryFlag()
{
	var val = userGalleryFlag_observer.field.getValue();
	if (val)
	{
		// request to flag as inappropriate
	}
}

function onUserGalleryShow()
{
	var val = userGalleryShow_observer.field.getValue();
	if (val < 1)
	{
		// 'Gallery' dialog was just closed, re-enable walking/flying
		setNodeEventIn ("NavigationInfoNone", "set_bind", false);
	}
}

function setUserGalleryChoices()
{
	setNodeEventInIndex ("EditGalleryDlg", "url1", 0, userGallery[currentGalleryPageStart+1].url);
	setNodeEventInIndex ("EditGalleryDlg", "url2", 0, userGallery[currentGalleryPageStart+2].url);
	setNodeEventInIndex ("EditGalleryDlg", "url3", 0, userGallery[currentGalleryPageStart+3].url);
	setNodeEventInIndex ("EditGalleryDlg", "title1", 0, userGallery[currentGalleryPageStart+1].desc);
	setNodeEventInIndex ("EditGalleryDlg", "title2", 0, userGallery[currentGalleryPageStart+2].desc);
	setNodeEventInIndex ("EditGalleryDlg", "title3", 0, userGallery[currentGalleryPageStart+3].desc);
}

function onUserGalleryAddEdit()
{
	var val = userGalleryAddEdit_observer.field.getValue();
	if (val && currentGalleryImage != -1)
	{
		currentGalleryPageStart = 0;	 // 'top of page' index
		// Set up dialog fields
		setEditGalleryDlgFields (currentGalleryImage);

		// set up the gallery images/titles
		setUserGalleryChoices()

		// close this dialog
		setNodeEventIn ("GalleryDlg", "show", 0);
		// Show 'edit' dialog
		setNodeEventIn ("EditGalleryDlg", "show", 1);
	}
}

function onUserGalleryRemoveImage()
{
	var val = userGalleryRemoveImage_observer.field.getValue();
	if (val)
	{
		// remove from gallery
		galleryImages[currentGalleryImage].name = '';	// clear from local data
		galleryImages[currentGalleryImage].url = '';	// clear from local data
		galleryImages[currentGalleryImage].desc = '';	// clear from local data
		SetUserImage('',currentGalleryImage,1,1);		// clear from 3d scene
	}
}

function setSelUserGalleryChoice(friendIdx, fld)
{
	var url = '';
	var name = '';
	if (friendIdx >=0 && friendIdx < friendList.length)
	{
		var userIdx = FindUserById (friendList[friendIdx].id);
		name = friendList[friendIdx].name;
		if (userIdx >= 0)
		{
			if (userList[userIdx].image)
				url = userList[userIdx].image.url;
			else
				url = 'GalleryPlaceholder.jpg';
		}
	}
	setNodeEventInIndex ("SelectFriendGalleryDlg", "url"+fld, 0, url);
	setNodeEventInIndex ("SelectFriendGalleryDlg", "title"+fld, 0, name);
}

function setSelUserGalleryChoices()
{
	setSelUserGalleryChoice(currentFriendPageStart, '1')
	setSelUserGalleryChoice(currentFriendPageStart+1, '2')
	setSelUserGalleryChoice(currentFriendPageStart+2, '3')
	setSelUserGalleryChoice(currentFriendPageStart+3, '4')
}

function onUserGalleryOpenFriend()
{
	var val = userGalleryOpenFriend_observer.field.getValue();
	if (val)
	{
		setSelUserGalleryChoices();
		var userIdx = FindUserById (userId);
		if (userIdx >= 0)
		{
			var url = userList[userIdx].image.url;
			setNodeEventInIndex ("SelectFriendGalleryDlg", "url", 0, url);
		}
		setNodeEventIn ("GalleryDlg", "show", 0);
		setNodeEventIn ("SelectFriendGalleryDlg", "show", 1);
	}
}

function onUserGalleryMine()
{
	var val = userGalleryMine_observer.field.getValue();
}


function onEditUserGalleryLocation()
{
	var val = editUserGalleryLocation_observer.field.getValue();
	// 'edit gallery' 'which location' box chosen
	currentGalleryImage = val;
	setEditGalleryDlgFields (currentGalleryImage);
}

function onEditUserGalleryShow()
{
	var val = editUserGalleryShow_observer.field.getValue();
	if (val < 1)
	{
		// 'Edit' dialog was just closed, reopen the general gallery dialog
		// Set these (again) as the Edit may have changed it
		setGalleryDlgFields (currentGalleryImage);
		setNodeEventIn ("GalleryDlg", "show", 1);
	}
}

function onEditUserGalleryPick1()
{
	var val = editUserGalleryPick1_observer.field.getValue();
	if (val)
	{
		// set from received gallery 'page'
		// NOTE: Need to get this from an actual response! Using hard-coded number for now
		galleryImages[currentGalleryImage] = userGallery[currentGalleryPageStart+1];
		// set image/description in 'edit' dialog
		setEditGalleryDlgFields (currentGalleryImage);
		// set image in 3d scene
		setGalleryImage (currentGalleryImage);
	}
}

function onEditUserGalleryPick2()
{
	var val = editUserGalleryPick2_observer.field.getValue();
	if (val)
	{
		// set from received gallery 'page'
		// NOTE: Need to get this from an actual response! Using hard-coded number for now
		galleryImages[currentGalleryImage] = userGallery[currentGalleryPageStart+2];
		// set image/description in 'edit' dialog
		setEditGalleryDlgFields (currentGalleryImage);
		// set image in 3d scene
		setGalleryImage (currentGalleryImage);
	}
}

function onEditUserGalleryPick3()
{
	var val = editUserGalleryPick3_observer.field.getValue();
	if (val)
	{
		// set from received gallery 'page'
		// NOTE: Need to get this from an actual response! Using hard-coded number for now
		galleryImages[currentGalleryImage] = userGallery[currentGalleryPageStart+3];
		// set image/description in 'edit' dialog
		setEditGalleryDlgFields (currentGalleryImage);
		// set image in 3d scene
		setGalleryImage (currentGalleryImage);
	}
}

function onEditUserGalleryPageUp()
{
	var val = editUserGalleryPageUp_observer.field.getValue();
	if (val && currentGalleryPageStart >= 3)
	{
		currentGalleryPageStart -= 3;
		// set up the gallery images/titles
		setUserGalleryChoices()
	}
}

function onEditUserGalleryPageDown()
{
	var val = editUserGalleryPageDown_observer.field.getValue();
	if (val && currentGalleryPageStart < 28 && userGallery[currentGalleryPageStart+3].url != '')
	{
		currentGalleryPageStart += 3;
		// set up the gallery images/titles
		setUserGalleryChoices()
	}
}

function onEditUserGallerySave()
{
	var val = editUserGallerySave_observer.field.getValue();
}

function onSelUserGalleryHelp()
{
	var val = selUserGalleryHelp_observer.field.getValue();
}

function GetAndSetGallery (userId)
{
	// populate userGallery[] from server
	// set images to the 'edit' dialog
	currentGalleryPageStart = 0;	// restart at 'first page'
	setUserGalleryChoices();
}

function onSelUserGalleryMySelect()
{
	var val = selUserGalleryMySelect_observer.field.getValue();
	if (val)
	{
		GetAndSetGallery (userId);
	}
}

function onSelUserGallerySel1()
{
	var val = selUserGallerySel1_observer.field.getValue();
	if (val)
	{
		GetAndSetGallery (friendList[currentGalleryPageStart].id);
	}
}

function onSelUserGallerySel2()
{
	var val = selUserGallerySel2_observer.field.getValue();
	if (val)
	{
		if (currentGalleryPageStart+1 < friendList.length)
			GetAndSetGallery (friendList[currentGalleryPageStart+1].id);
	}
}

function onSelUserGallerySel3()
{
	var val = selUserGallerySel3_observer.field.getValue();
	if (val)
	{
		if (currentGalleryPageStart+2 < friendList.length)
			GetAndSetGallery (friendList[currentGalleryPageStart+2].id);
	}
}

function onSelUserGallerySel4()
{
	var val = selUserGallerySel4_observer.field.getValue();
	if (val)
	{
		if (currentGalleryPageStart+3 < friendList.length)
			GetAndSetGallery (friendList[currentGalleryPageStart+3].id);
	}
}

function onSelUserGalleryNext()
{
	var val = selUserGalleryNext_observer.field.getValue();
	if (val && currentFriendPageStart >= 4)
	{
		currentFriendPageStart -= 4;
		// set up the gallery images/titles
		setSelUserGalleryChoices();
	}
}

function onSelUserGalleryPrev()
{
	var val = selUserGalleryPrev_observer.field.getValue();
	if (val && currentGalleryPageStart < (friendList.length-4) && friendList[currentFriendPageStart+4].url != '')
	{
		currentFriendPageStart += 4;
		// set up the gallery images/titles
		setSelUserGalleryChoices();
	}
}

function onSelUserGalleryShow()
{
	var val = selUserGalleryShow_observer.field.getValue();
	if (val < 1) // now closing this dialog
		setNodeEventIn ("GalleryDlg", "show", 1); // turn back on the main gallery dialog
}

function onSpeakerChosen()
{
	currentSpeakerPos = lazySusan_observer.field.getValue();

//	if (currentSpeakerPlaying != currentSpeakerPos)
//		setNodeEventIn ("MusicDlg", "set_songplay1", 2);
//	else
//		setNodeEventIn ("MusicDlg", "set_songplay1", -1);

	// no nav while in dialog
	setNodeEventIn ("NavigationInfoNone", "set_bind", true);

	// set the 'album' info for this speaker
//	setNodeEventInIndex ("MusicDlg", "bandname", 0, musicAlbums[currentSpeakerPos].bandName);
	var md = context.getNode ("MusicDlg");
//	var bn = md.getField("bandname");

//	md.bandname[0] = musicAlbums[currentSpeakerPos].bandName;
/*
	// init first (up to) 4 songs
	var i;
	// clear any existing song titles
//	for (i = 1; i <= 4; i++)
//	{
//		setNodeEventInIndex ("MusicDlg", "songtitle"+i, 0, '');
//	}
*/
	md.songtitle1[0] = ' ';
//	md.songtitle2[0] = ' ';
//	md.songtitle3[0] = ' ';
//	md.songtitle4[0] = ' ';

	// add current song titles
//	for (i = 0; i < 4 && i < musicAlbums[currentSpeakerPos].songs.length; i++)
//	{
//		setNodeEventInIndex ("MusicDlg", "songtitle"+(i+1), 0, musicAlbums[currentSpeakerPos].songs[i].title);
//	}
	if (musicAlbums[currentSpeakerPos].songs.length > 0)
		md.songtitle1[0] = musicAlbums[currentSpeakerPos].songs[0].title;
	else
		md.songtitle1[0] = ' ';
/*
	if (musicAlbums[currentSpeakerPos].songs.length > 1)
		md.songtitle2[0] = musicAlbums[currentSpeakerPos].songs[1].title;
	if (musicAlbums[currentSpeakerPos].songs.length > 2)
		md.songtitle3[0] = musicAlbums[currentSpeakerPos].songs[2].title;
	if (musicAlbums[currentSpeakerPos].songs.length > 3)
		md.songtitle4[0] = musicAlbums[currentSpeakerPos].songs[3].title;
*/
	// show dialog
	setNodeEventIn ("MusicDlg", "show", 1);
//	md.show = 1;
	doMusicPlay1 (1); // make like they hit the 'play' button to show 'pause'
}

function onMusicShow()
{
	var val = musicShow_observer.field.getValue();
	if (val < 1)
	{
		// 'music' dialog was just closed, re-enable walking/flying
		setNodeEventIn ("NavigationInfoNone", "set_bind", false);
	}
}

function onMusicHelp()
{
	var val = musicHelp_observer.field.getValue();
}

function onMusicFlag()
{
	var val = musicFlag_observer.field.getValue();
}

function onMusicPlay1()
{
	var val = musicPlay1_observer.field.getValue();
	doMusicPlay1(val);
}

function doMusicPlay1(val)
{
//alert (val);
	// 'play' button hides, 'pause' button shows  'play button showing' = 0 'pause button showing' = 1
	if (val == 1) // 'pause' button now showing, meaning they hit 'play'
	{
		// turn off any other playing songs
		if (currentSpeakerPlaying != -1)
		{
			setNodeEventIn ('Speaker'+currentSpeakerPlaying+'a', 'play', false);
//			setNodeEventIn ("MusicDlg", "set_songplay1", 2);
			currentSpeakerPlaying = -1;
		}
		SetMusic (currentSpeakerPos, musicAlbums[currentSpeakerPos].songs[0].url); // one song per album
		currentSpeakerPlaying = currentSpeakerPos;
	}
	else // if (val == 1)  // play button now up, meaning we just paused, so stop the music
	{
		setNodeEventIn ('Speaker'+currentSpeakerPos+'a', 'play', false);
		currentSpeakerPlaying = -1;
	}
}

function onMusicPlay2()
{
	var val = musicPlay2_observer.field.getValue();
	// to do: see onMusicPlay1
}

function onMusicPlay3()
{
	var val = musicPlay3_observer.field.getValue();
	// to do: see onMusicPlay1
}

function onMusicPlay4()
{
	var val = musicPlay4_observer.field.getValue();
	// to do: see onMusicPlay1
}

function onMusicPrev()
{
	var val = musicPrev_observer.field.getValue();
	if (!val) // do on mouse-down
		return;
//	currentSpeakerPos = lazySusan_observer.field.getValue();
//	doMusicPlay1(1);
/*
	// turn off any other playing songs
	if (currentSpeakerPlaying != -1)
	{
		setNodeEventIn ('Speaker'+currentSpeakerPlaying+'a', 'play', false);
		setNodeEventIn ("MusicDlg", "set_songplay1", 2);
		currentSpeakerPlaying = -1;
	}
*/
	// get previous album
}

function onMusicNext()
{
	var val = musicNext_observer.field.getValue();
	if (!val) // do on mouse-down
		return;
//	currentSpeakerPos = lazySusan_observer.field.getValue();
//	doMusicPlay1(1);
/*
	// turn off any other playing songs
	if (currentSpeakerPlaying != -1)
	{
		setNodeEventIn ('Speaker'+currentSpeakerPlaying+'a', 'play', false);
		setNodeEventIn ("MusicDlg", "set_songplay1", 2);
		currentSpeakerPlaying = -1;
	}
*/
	// get next album
}

function onMusicUp()
{
	var val = musicUp_observer.field.getValue();
	// get previous 'page' worth of songs
}

function onMusicDown()
{
	var val = musicDown_observer.field.getValue();
	// get next 'page' worth of songs
}

function addRootNodesFromSceneInString (str)
{
	if (context)
	{
		var newNodes = new Array();

		// Build scene graph
		var newScene = browser.createX3DFromString (str);
		var oldRootNodes = context.getRootNodes();
		var node = context.getNode('MainGroup');
		//var node = oldRootNodes.Item(0);
		if (node != null)
		{
			var addChildren = node.getField('addChildren');
			if (addChildren != null)
			{
				// get the result - kind of like pulling teeth, thanks Justin
				var i;
				var rootnodes = newScene.getRootNodes();
				for (i = 0; i< rootnodes.Count; i++)
				{
					var xfm = rootnodes.Item(i);
					newScene.removeRootNode(xfm);
					addChildren.set1Value(0, xfm);
					newNodes[i] = xfm;
				}
			}
		}
		return newNodes;
	}
}

function removeRootNodesFromScene (nodeName)
{
	if (context)
	{
		var nodeGroup = context.getNode('MainGroup');
		if (nodeGroup != null)
		{
			var removeChildren = nodeGroup.getField('removeChildren');
			if (removeChildren != null)
			{
				if (vehicleNode != null)
				{
					removeChildren.set1Value(0,vehicleNode);
				}
			}
		}
	}
}

function addPartNodesFromSceneInString (str)
{
	if (context)
	{
		var newNodes = new Array();
		var watchList = null;
		// Build scene graph
		var newScene = browser.createX3DFromString (str);
		var oldRootNodes = context.getRootNodes();
		var node = context.getNode('PartGroup');
		var loadSenseNode = context.getNode ('SceneLoadSensor');
		if (loadSenseNode != null)
		{
			watchList = loadSenseNode.getField('watchList');
//			if (watchList)
//				setProgress (numPartsLoaded / numPartsToLoad); // put up the 'percent' progress
		}

		//var node = oldRootNodes.Item(0);
		if (node != null)
		{
			var addChildren = node.getField('addChildren');
			if (addChildren != null)
			{
				// get the result - kind of like pulling teeth, thanks Justin
				var i;
				var rootnodes = newScene.getRootNodes();
				for (i = 0; i < rootnodes.Count; i++)
				{
					var inlineNode = rootnodes.Item(i);
					newScene.removeRootNode(inlineNode);
					addChildren.set1Value(0, inlineNode);
					if (watchList != null)
						watchList.set1Value(0, inlineNode);
					newNodes[i] = inlineNode;
				}
			}
		}
		return newNodes;
	}
}

function removePartNodesFromScene (node)
{
	if (context)
	{
		var nodeGroup = context.getNode('PartGroup');
		if (nodeGroup != null)
		{
			var removeChildren = nodeGroup.getField('removeChildren');
			if (removeChildren != null)
			{
				if (node != null)
				{
					removeChildren.set1Value(0,node);
				}
			}
		}
	}
}

function SetDOMValue (name, value)
{
	var i;
	var node;
	var names = name.split('.');
	var index = -1;
	var indexAt = -1;
	var indexTo = -1;

    if (context != null)
	{
		node = context.getNode(names[0]); // shape
		if (node)
		{
			for (i = 1; i < names.length; i++)
			{
				indexAt = names[i].indexOf("[");
				if (indexAt > 0) // an MF (array)
				{
					var indexStr = names[i].split("[");
					index = parseInt (indexStr[1]);
					child = node.getField(indexStr[0]);
					if (child)
					{
						node = child.get1Value(index);
					}
				}
				else // normal child
				{
					child = node.getField(names[i]);
					if (child)
					{
						node = child.getValue();
					}
				}
			}
			if (index >= 0)
			{
				if (child)
				{
					child.set1Value(index, value);
				}
			}
			else
			{
				if (child)
				{
					child.setValue(value);
				}
			}
		}
	}
}

function GetDOMValue (name)
{
	var i;
	var node;
    if (context != null)
	{
		var names = name.split('.');
		node = context.getNode(names[0]); // shape
		if (node)
		{
			for (i = 1; i < names.length; i++)
			{
				child = node.getField(names[i]);
				if (child)
				{
					node = child.getValue();
				}
			}
			if (child)
			{
				return child.getValue(value);
			}
		}
	}
	return (null);
}


function setNodeFieldValue (node, eventInName, value)
{
	var ev = node.getField(eventInName);
	if (ev != null)
	{
		ev.setValue(value);
	}
	else
		alert("Can't get event " + eventInName);
}

function setNodeEventIn(nodeName, eventInName, value)
{
	var node;
	if (context)
	{
		node = context.getNode(nodeName);

		if (node != null)
		{
			setNodeFieldValue (node, eventInName, value);
		}
		else
			alert("Can't get node " + nodeName);
	}
}

function setNodeFieldValueArray (node, eventInName, valueArray)
{
	var ev = node.getField(eventInName);
	if (ev != null)
	{
 		for (var i = 0; i < valueArray.length; i++)
			ev.set1Value( i, valueArray[i]);
	}
	else
		alert("Can't get event " + eventInName);
}


function setNodeFieldIndexValue (node, eventInName, index, value)
{
	var ev = node.getField(eventInName);
	if (ev != null)
	{
		ev.set1Value(index, value);
	}
	else
		alert("Can't get event " + eventInName);
}

function setNodeEventInIndex(nodeName, eventInName, index, value)
{
	var node;
	if (context)
	{
		node = context.getNode(nodeName);

		if (node != null)
		{
			setNodeFieldIndexValue (node, eventInName, index, value);
		}
		else
			alert("Can't get node " + nodeName);
	}
}

function setNodeEventArray(nodeName, eventInName, valueArray)
{
	var node;
	if (context)
	{
		node = context.getNode(nodeName);

		if (node != null)
		{
			setNodeFieldValueArray (node, eventInName, valueArray);
		}
		else
			alert("Can't get node " + nodeName);
	}
}

function getNodeFieldValue (node, eventInName)
{
	var ev = node.getField(eventInName);
	if (ev != null)
	{
		var val = ev.getValue ();
		return val;
	}
	else
		alert("Can't get event " + eventInName);
	return null;
}

function getNodeField(nodeName, eventInName)
{
	var node;
	if (context)
	{
		node = context.getNode(nodeName);

		if (node != null)
		{
			return getNodeFieldValue (node, eventInName);
		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}

function getNodeFieldIndexValue (node, eventInName, index)
{
	var ev = node.getField(eventInName);
	if (ev != null)
	{
		var val = ev.get1Value (index);
		return val;
	}
	else
		alert("Can't get event " + eventInName);
	return null;
}

function getNodeFieldIndex(nodeName, eventInName, index)
{
	var node;
	if (context)
	{
		node = context.getNode(nodeName);

		if (node != null)
		{
			return getNodeFieldIndexValue (node, eventInName, index);
		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}


function setNodeEventInXYZ(nodeName, eventInName, x,y,z)
{
	if (context)
	{
		var	node = context.getNode(nodeName);
		if (node != null)
		{
			ev = node.getField(eventInName);
			if (ev != null)
			{
				ev.x = x;
				ev.y = y;
				ev.z = z;
			}
			else
				alert("Can't get event " + eventInName);

		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}

function setNodeEventInXY(nodeName, eventInName, x, y)
{
	if (context)
	{
		var	node = context.getNode(nodeName);
		if (node != null)
		{
			ev = node.getField(eventInName);
			if (ev != null)
			{
				ev.x = x;
				ev.y = y;
			}
			else
				alert("Can't get event " + eventInName);

		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}

function setNodeEventInAngle(nodeName, eventInName, a)
{
	if (context)
	{
		var node = context.getNode(nodeName);

		if (node != null)
		{
			ev = node.getField(eventInName);
			if (ev != null)
			{
				ev.angle = a;
			}
			else
				alert("Can't get event " + eventInName);

		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}

function Pos(x,y,z)
{
	this.x = x;
	this.y = y;
	this.z = z;
}

function Rot(x,y,z,a)
{
	this.x = x;
	this.y = y;
	this.z = z;
	this.a = a;
}

function setNodeEventInRot(nodeName, eventInName, x,y,z,a)
{
	if (context)
	{
		var node = context.getNode(nodeName);

		if (node != null)
		{
			ev = node.getField(eventInName);
			if (ev != null)
			{
				setNodeEventInXYZ(nodeName, eventInName, x,y,z);
				ev.angle = a;
			}
			else
				alert("Can't get event " + eventInName);

		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}

function setNodeEventInRGBbyName(nodeName, eventInName, r, g, b)
{
	if (context)
	{
		var node = context.getNode(nodeName);

		if (node != null)
		{
			ev = node.getField(eventInName);
			if (ev != null)
			{
				ev.r = r;
				ev.g = g;
				ev.b = b;
			}
			else
				alert("Can't get event " + eventInName);

		}
		else
			alert("Can't get node " + nodeName);
	}
	return null;
}


function setNodeEventInRGB(node, eventInName, r,g,b)
{
	if (node != null)
	{
		ev = node.getField(eventInName);
		if (ev != null)
		{
			ev.r = r;
			ev.g = g;
			ev.b = b;
		}
		else
			alert("Can't get event " + eventInName);

	}
	else
		alert("Can't get node " + nodeName);

	return null;
}

function setListenerObserverOnNode(node,fieldName,callback)
{
	if (node)
	{
		var field = node.getField(fieldName);
		if (field)
		{
			var observer = new Object;
			observer.readableFieldChanged = callback;
			observer.field = field;
			field.addFieldEventListener(observer);
			field = null;
			return observer;
		}
		node = null;
	}
	return null;
}

function setListenerObserver(nodeName,fieldName,callback)
{
	if (context)
	{
	    context = browser.getExecutionContext();
	    if (context)
	    {
			var node = null;
			var field = null;
	        node = context.getNode(nodeName);
			if (node)
			{
				return setListenerObserverOnNode(node,fieldName,callback);
			}
		}
	}
	return null;
}

function getAJAXNodeValue(obj,tag)
{
	if (obj)
	{
		var nodes = obj.getElementsByTagName(tag);
		if (nodes)
		{
			var node = nodes[0];
			if (node)
			{
				if (node.firstChild)
					return node.firstChild.nodeValue;
			}
		}
		else
			alert ('no nodes '+tag);
	}
	else
		alert ('no obj');
	return null;
}
