﻿/* Main JavaScript file for entire site. */

// Contants
var MOUSE_OVER_EXT = '_over';	// Extension for image mouse overs.
var _isLogMinimized = false;

var g_opener = window.opener;

// Detect if the browser is IE or not.
// If it is not IE, we assume that the browser is NS.
var IE = document.all?true:false

var g_normalImageUrl;
var g_rollOverControl;
var g_normalCssClass;
var g_rollOverCssControl;

var g_blockUnloadWindowID = '';
var _closeChatCons = true;
var g_maxCharsInput;
var g_maxCharsDisplay;
var g_maxInputChars;

// Closes all chat connections.
window.onbeforeunload = "closeChatConnections()";
function closeChatConnections()
{
	if (typeof(_chatPositions) != "undefined" && _closeChatCons)
	{
		var swfChat;
		for (var i = 0; i < _chatPositions.length; i++)
		{
			if (_chatPositions[i] != null)
			{
				swfChat = getSwf('chat_'+_chatPositions[i]+'_swf');
				swfChat.closeConnections();
			}	
		}
	}
	
	_closeChatCons = true;
}

function stopCloseChatCon()
{
	// Prevent connections from closing only for IE.
	if (Sys.Browser.agent == Sys.Browser.InternetExplorer)
	{
		_closeChatCons = false;
	}
}

// Formats any URLs in text.
function formatChatText(postText)
{
	// Remove any HTML brackets.
	var convText = postText.replace(/>/g, "&gt;");
	convText = convText.replace(/</g, "&lt;");
	
	try
	{
		var matches = postText.match(/(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp):\/\/)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(\/[a-zA-Z0-9\&%_\.\/-~-]*)?/g);
		var urlText;
		var fullUrl;
		for (var i = 0; matches != null && i < matches.length; i++)
		{
			if (matches[i].match("://"))
			{
				fullUrl = matches[i];
			}
			else
			{
				fullUrl = 'http://'+matches[i];
			}
			
			urlText = "<a href='" + fullUrl + "' target='_blank'><font color='#00AAFF'>" + matches[i] + "</font></a>";
			convText = convText.replace(matches[i], urlText);
		}
	}
	catch (err) {}
	
	return convText;
}

function maxChars(event, displayID, maxInputChars)
{
	var allowMore = true;
	
	try
	{
		g_maxCharsDisplay = document.getElementById(displayID);
		g_maxCharsInput = event.target ? event.target : event.srcElement;
		g_maxInputChars = maxInputChars;
		
		if (g_maxCharsInput.value.length >= maxInputChars && !isNavOrDeleteKey(event.keyCode))
		{
			allowMore = false;
		}
	}
	catch (err)
	{
		// Do nothing.
	}
	
	return allowMore;
}

function updateMaxChars()
{
	try
	{
		g_maxCharsDisplay.innerHTML = '<i>(' + g_maxCharsInput.value.length + ' / ' + g_maxInputChars + ')</i>';
	}
	catch (err){}
}

function isNavOrDeleteKey(keyCode)
{
	var isNav = false;
	
	// Up, down, left, right, delete, backspace.
	if (keyCode == 38 || keyCode == 40 || keyCode == 37 || keyCode == 39 || keyCode == 46 || keyCode == 8)
	{
		isNav = true;
	}
		
	return isNav;
}

// Preloads all specified images.
function preLoadImages()
{
    for (var i = 0; i < preLoadImages.arguments.length; i++)
    {
        var image = new Image(10,10);
        image.src = preLoadImages.arguments[i];
    }
}

//closes current window
function closeWindow()
{
	var newWindow = window.open(location.href, '_parent','');
	newWindow.close();
	return false;
}

// Shows the VueFon window.
function showVueFon(username, roomID)
{	
	var isShowing = getCookie('IsVueFonLive') == "true";
	var loadNew = true;

	// If window is already showing, just give it focus.
	if (isShowing == true)
	{
		// Get reference to window.
		var vueFonWindow = window.open('', 'vueFonLive');
		vueFonWindow.focus();
		
		try
		{
			// Add room or user if required.
			if (username != null && username != '')
			{
				vueFonWindow.roomWithUser(username);
			}
			else if (roomID != null && roomID != '')
			{
				vueFonWindow.joinRoom(roomID);
			}
			
			loadNew = false;
		}
		catch (err)
		{
			loadNew = true;
		}
	
	} // Window is not showing, launch it.
	else
	{
		//setCookie('IsVueFonLive', true);
		loadNew = true;
	}
	
	return loadNew;
}

// Shows the message window.
function showMessageWindow(id)
{
    if (typeof(toggleDocked) != 'undefined')
    {
        toggleDocked(false);
    }

	var isShowing = getCookie('IsMessageWindowOpen') == 'true';
	var loadNew = true;

	// If window is already showing, just give it focus.
	if (isShowing == true)
	{
		// Get reference to window.
		var messageWindow = window.open('', 'messageWindow');
		messageWindow.focus();
		
		try
		{
			// Set current message in window.
			messageWindow.setMessage(id);

			loadNew = false;
		}
		catch (err)
		{
			loadNew = true;
		}
	
	} // Window is not showing, launch it.
	else
	{
		//setCookie('IsMessageWindowOpen', true);
		loadNew = true;
	}
	
	return loadNew;
}

// Generic show window with close call back function.
function showWindow(windowID)
{
	var isShowing = getCookie(windowID) == 'true';
	var loadNew = true;

	// If window is already showing, just give it focus.
	if (isShowing == true)
	{
		// Get reference to window.
		var shownWindow = window.open('', windowID);
		shownWindow.focus();
		
		// Call window update function with params.
		if (typeof(shownWindow.updateWindow) != 'undefined')
			eval(buildFunction("shownWindow.updateWindow", showWindow.arguments, 1));
			
		loadNew = false;
	
	} // Window is not showing, launch it.
	else
	{
		loadNew = true;
	}
	
	return loadNew;
}

// Sets that a dock window is open.
function windowOpened(windowID)
{
	if (window.name == windowID)
	{
		// Reset window blocking.
		if (g_blockUnloadWindowID == window.name)
			g_blockUnloadWindowID = '';
	
		// Set cookie that window is open.			
		if (window.opener != null && typeof(window.opener.setCookie) != 'undefined')
			window.opener.setCookie(windowID, true);
			
		if (typeof(setCookie) != 'undefined')
			setCookie(windowID, true);
			
		// Call window open function with params.
		if (window.opener != null && typeof(window.opener.onWindowOpened) != 'undefined')
			eval(buildFunction("window.opener.onWindowOpened", windowOpened.arguments, 0));			
	}
}

// Sets that a dock window is closed.
function windowClosed(windowID)
{
	// Only allow set if window is specified window, and it is not blocked from unloading.
	if (window.name == windowID && g_blockUnloadWindowID != window.name)
	{
		// Set cookie that window is closed.
		if (typeof(setCookie) != 'undefined')
			setCookie(windowID, true);
		
		if (g_opener != null && typeof(g_opener.setCookie) != 'undefined')
			g_opener.setCookie(windowID, false);
			
		// Call window closed function with params.
		if (g_opener != null && typeof(g_opener.onWindowClosed) != 'undefined')
			eval(buildFunction("g_opener.onWindowClosed", windowClosed.arguments, 0));			
	}
}

// Calls specified function with parameters, starting at the specified param index.
function buildFunction(functionName, parameters, paramIndex)
{
	// Add all remaining parameters to function call.
	var paramString = "";
	for (var i = paramIndex; i < parameters.length; i++)
	{
		paramString += "'" + parameters[i] + "'";
		if (i < parameters.length - 1)
			paramString += ",";
	}		
	
	// Call update window function will all params.
	return functionName + "(" + paramString + ");";
}

function writeSwf(controlID)
{
	var control = document.getElementById(controlID);
	var movieUrl = document.getElementById(controlID+'_hdfMovieUrl').value;
	var flashVars = document.getElementById(controlID+'_hdfFlashVars').value;
	var so = new SWFObject(movieUrl, controlID+'_swf', control.style.width, control.style.height, '8', '');
	so.addParam('allowScriptAccess', 'always');
	so.addParam('swLiveConnect', 'true');
	so.addParam('menu', 'false');
	so.addParam('wmode', 'transparent');
	so.addParam('FlashVars', flashVars);
	so.write(controlID+'_SwfDiv');
}

// Gets a reference to the swf file.
function getSwf(swfID) 
{
	// IE and Netscape refer to the movie object differently.
	// This function returns the appropriate syntax depending on the browser.
	
	var movie = null;
    
    // Check for IE way of getting flash; othwerwise do mozilla way.
	if (navigator.appName.indexOf("Microsoft Internet")!=-1)
	{
		movie = window.document[swfID+'_swf'];
	}
	else
	{
		if (document.embeds && document.embeds[swfID+'_swf'])
		{
			movie = document.embeds[swfID+'_swf']; 
		}	
		else
		{
			movie = document.getElementById(swfID+'_swf');
		}
	}
	
	return movie;
}

// Swaps images of a control for roll-overs.
function rollOverImage(control)
{
	// If this control does not have a source, check if its child does.
	var imgControl = control;
	if (control.src == null)
	{
		imgControl = control.firstChild;
	}

    g_rollOverControl = imgControl;
    g_normalImageUrl = imgControl.src;
    
    // Get over image.
    var extIndex = g_normalImageUrl.lastIndexOf('.');
    var ext = g_normalImageUrl.substring(extIndex);
    var fileName = g_normalImageUrl.substring(0, extIndex);
    
    // Verify that image does not already have _over on it.
    if (fileName.length > MOUSE_OVER_EXT.length && fileName.substring(fileName.length - MOUSE_OVER_EXT.length, fileName.length).toLowerCase() != MOUSE_OVER_EXT)
    {
		imgControl.src  = fileName + MOUSE_OVER_EXT + ext;
    }	
}

// Roll-over for standard controls.
function rollOverImageRef(controlID)
{
    rollOverImage(document.getElementById(controlID));
}

// Restores normal image for control.
function restoreImage()
{
    g_rollOverControl.src = g_normalImageUrl;
}

// Preloads all specified images.
function preLoadImages()
{
    for (var i = 0; i < preLoadImages.arguments.length; i++)
    {
        var image = new Image(10,10);
        image.src = preLoadImages.arguments[i];
    }
}

// Roll-over css style change.
function rollOverCss(control)
{
	g_rollOverCssControl = control;
	g_normalCssClass = control.className;
	
	var className = control.className;
	
    // Verify that class name does not already have _over on it.
    if (className.length > MOUSE_OVER_EXT.length && className.substring(className.length - MOUSE_OVER_EXT.length, className.length).toLowerCase() != MOUSE_OVER_EXT)
    {
		control.className = className + MOUSE_OVER_EXT;
    }	
}


// mouse down css style change.
function mouseDownCSs(control)
{
	g_rollOverCssControl = control;
	g_normalCssClass = control.className;
	
	var className = control.className;
	
    // Verify that class name does not already have _over on it.
    if (className.length > MOUSE_OVER_EXT.length && className.substring(className.length - MOUSE_OVER_EXT.length, className.length).toLowerCase() != MOUSE_OVER_EXT)
    {
		control.className = className + MOUSE_OVER_EXT;
    }	
}

// mouse up css style change.
function mouseUpCss(control)
{
	g_rollOverCssControl = control;
	g_normalCssClass = control.className;
	
	var className = control.className;
	
    // Verify that class name does not already have _over on it.
    if (className.length > MOUSE_OVER_EXT.length && className.substring(className.length - MOUSE_OVER_EXT.length, className.length).toLowerCase() != MOUSE_OVER_EXT)
    {
		control.className = className + MOUSE_OVER_EXT;
    }	
}


// Css restore after roll-over.
function restoreCss()
{
	g_rollOverCssControl.className = g_normalCssClass;
}

// Gets the selected value of a radio button group.
function validateRadioButtons(radioButtonContainerID, validatorID) 
{
	var radioButtons = document.getElementById(radioButtonContainerID).getElementsByTagName("input");
	var isChecked = false;

	if(radioButtons)
	{			
		var radioLength = radioButtons.length;
		
		if(radioLength == undefined)
			if(radioButtons.checked)
				isChecked = true;
			else
				isChecked = false;
				
		for(var i = 0; i < radioLength && !isChecked; i++) 
		{
			if(radioButtons[i].checked)
			{
				isChecked = true;
			}
		}
	}
	
	// Display message if no items are checked.
	if (!isChecked)
	{
		document.getElementById(validatorID).style.visibility = "visible";
	}
	else
	{
		document.getElementById(validatorID).style.visibility = "hidden";
	}
}

// Pads the text with the specified character.
function pad(text, character, count)
{
	var padText = "";
	var padCount = count - text.toString().length;
	for (var i = 0; i < padCount; i++)
		padText += character;
	return padText + text;
}

// Finds the position of an item within a page.
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

// Gets the current scroll position
function getScrollPos() {
    var scrollPos = new Object();
    var scrOfX = 0, scrOfY = 0;
    if( typeof( window.pageYOffset ) == 'number' ) {
        //Netscape compliant
        scrOfY = window.pageYOffset;
        scrOfX = window.pageXOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        //DOM compliant
        scrOfY = document.body.scrollTop;
        scrOfX = document.body.scrollLeft;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        //IE6 standards compliant mode
        scrOfY = document.documentElement.scrollTop;
        scrOfX = document.documentElement.scrollLeft;
    }
    scrollPos.x = scrOfX;
    scrollPos.y = scrOfY;
    
    return scrollPos
}

// Gets the root domain for the site.
function getRootDomain()
{
	var domain = '';
	var working = window.location.href;
	var dotIndex = working.indexOf('.');
	if (dotIndex >= 0)
	{
		working = working.substring(dotIndex + 1, working.length - 1);
		
		var slashIndex = working.indexOf('/');
		if (dotIndex >= 0)
			domain = working.substring(0, slashIndex);
	}
		
	return domain;
}

// Creates a new cookie.
function setCookie( name, value, expires, path, domain, secure ) 
{
// set time, it's in milliseconds
var today = new Date();
today.setTime( today.getTime() );

// default domain is worldvuer.com
if (!domain)
	domain = getRootDomain();

/*
if the expires variable is set, make the correct 
expires time, the current script below will set 
it for x number of days, to make it for hours, 
delete * 24, for minutes, delete * 60 * 24
*/
if ( expires )
{
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( today.getTime() + (expires) );

document.cookie = name + "=" +escape( value ) +
( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
( ( path ) ? ";path=" + path : "" ) + 
( ( domain ) ? ";domain=" + domain : "" ) +
( ( secure ) ? ";secure" : "" );
}

// Deletes an existing cookie.
function clearCookie(name)
{
  var cookieDate = new Date ( );  // current date & time
  cookieDate.setTime ( cookieDate.getTime() - 1 );
  document.cookie = name += "=; expires=" + cookieDate.toGMTString();
}

// Gets a cookie.
function getCookie(name)
{
var start = document.cookie.indexOf( name + "=" );
var len = start + name.length + 1;
if ( ( !start ) &&
( name != document.cookie.substring( 0, name.length ) ) )
{
return null;
}
if ( start == -1 ) return null;
var end = document.cookie.indexOf( ";", len );
if ( end == -1 ) end = document.cookie.length;
return unescape( document.cookie.substring( len, end ) );
}

// Gets a parameter from the url.
function getUrlParam(name)
{
	var strReturn = "";
	var strHref = window.location.href;
	if ( strHref.indexOf("?") > -1 )
	{
		var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
		var aQueryString = strQueryString.split("&");
		for ( var iParam = 0; iParam < aQueryString.length; iParam++ )
		{
			if (aQueryString[iParam].indexOf(name + "=") > -1 )
			{
				var aParam = aQueryString[iParam].split("=");
				strReturn = aParam[1];
				break;
			}
		}
	}
	return strReturn;
}

// Gets an integer from pixels.
function pixelsToInt(pixels)
{
	var value = pixels.substring(0, pixels.length - 2);
	return parseInt(value);
}

// Writes message to log section of page.
function log(message)
{
	try
	{
		var logTag = document.getElementById('log');
		if (logTag == null)
		{
			logTag = document.createElement('div');
			logTag.id = 'log';
			logTag.innerHTML += "<table id='logTitle' width='100%' cellpadding='0' cellspacing='1' border='0'><tr><td>&nbsp;JavaScript Log</td><td align='right'><a href='#' onclick='return toggleLogState()'>&nbsp;&minus;&nbsp;</a>&nbsp;<a href='#' onclick='return closeLog()'>X&nbsp;</a></td></tr></table><div id='logText'></div>";
			
			var body = document.getElementsByTagName("body")[0];
			body.appendChild(logTag);
		}
			
		var now = new Date();		
		var logText = document.getElementById('logText');
		
		logText.innerHTML = pad(now.getHours(), "0", 2) + ":" + pad(now.getMinutes(), "0", 2) + ":" + pad(now.getSeconds(), "0", 2) + "&nbsp; " + 
		message + "<br />" + logText.innerHTML;
	}
	catch(err){}
}

function toggleLogState()
{
	var logTag = document.getElementById('log');
	if (!_isLogMinimized)
	{
		logTag.style.height = '20px';
	}
	else
	{
		logTag.style.height = '150px';
	}

	_isLogMinimized = !_isLogMinimized;
	
	return false;
}

function closeLog()
{
	var logTag = document.getElementById('log');
	if (logTag != null)
	{
		logTag.style.display = 'none';
	}
	
	return false;
}

function getWindowSize() {
  var size = new Object();
  size.width = 0;
  size.height = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    size.width = window.innerWidth;
    size.height = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    size.width = document.documentElement.clientWidth;
    size.height = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    size.width = document.body.clientWidth;
    size.height = document.body.clientHeight;    
    }
    return size;
  }