var ie = document.all && document.getElementById;
var ns = document.getElementById & !document.all;
var wizardHeight = 672;
var wizardWidth = 1015;
var popupHeight = 574;
var popupWidth = 673; //751;
var maxRetries = 10;
var screenWidth = getScreenDimensions()[0];
var screenHeight = getScreenDimensions()[1];

var months = new Array("January", "February","March","April","May","June","July",
"August","September","October","November","December" );

var days = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

function isMicrosoft()
{
	if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) 
	{
		return true;
	}
	return false;
}

function getBrowserWidth()
{
    return ( window.outerWidth ) ? window.outerWidth : document.body.clientWidth;
}

function getScreenDimensions()
{
    var width = screen.availWidth;//screen.width;
    var height = screen.availHeight;//height;
    
    return [width, height];
}

function getFormObject()
{
    return document.forms[0];
}

function getFormObjectFromWindow( theWindow )
{
    return theWindow.getFormObject();
}

// Get the window object for a named frame
function getFrameWindow( frameName )
{
	var win = null;
	
	if ( window.parent )
	{
		if ( top.frames )
			win = top.frames[ frameName ];
	}
	
	return win;
}

// Get a DHTML element in the document.
// e.g. var objEmail = getElement( "txtEmailAddress" );
function getElement( id )
{
	if ( document.getElementById )
	{
		return document.getElementById( id );
	}
	else if ( document.all )
	{
		return document.all[id];
	}

	return null;
}

// Get a DHTML element in another window
// e.g. var objEmail = getElement( "txtEmailAddress", theWindow );
function getElementFromWindow( id, theWindow )
{
    return theWindow.getElement( id );
}

// Get a DHTML element in the specified frame window.
// e.g. var objEmail = getElement( "txtEmailAddress", "frameToolbox" );
function getElementFromFrame( id, frame )
{
	var win = null;
	if ( typeof( frame ) == "object" )
	{
		//alert( "assume its already the window object" );
		win = frame;
	}
	else
	{
		//alert( "// assume its a string" );
		win = getFrameWindow( frame );
	}
	
	if ( win )
	{
		if ( win.document.getElementById )
		{
			return win.document.getElementById( id );
		}
		else if ( win.document.all )
		{
			return win.document.all[id];
		}		
	}

	return null;
}

// Get a DHTML element from a sibling frame.
// e.g. var objEmail = getElement( "txtEmailAddress", "frameToolbox" );
function getElementFromSiblingFrame( id, siblingFrame )
{
    return getElementFromFrame( id, self.parent.frames[ siblingFrame ] )
}

function getSiblingFrameElementText( id, frame )
{
	var obj = getElementFromSiblingFrame( id, frame );
	if ( obj )
	{
		return obj.innerText;
	}
	
	return "";
}

function getSiblingFrameElementValue( id, frame )
{
	var obj = getElementFromSiblingFrame( id, frame );
	if ( obj )
	{
		return obj.value;
	}
	
	return "";
}
	
function getElementText( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		return obj.innerText;
	}
	
	return "";
}

function getElementHTML( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		return obj.innerHTML;
	}
	
	return "";
}

function getElementValue( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		return obj.value;
	}
	
	return "";
}

function getSelectedItem( id )
{
	var obj = getElement( id );
	
	if ( obj )
	{
		return obj.options[obj.selectedIndex];
	}
	
	return "";
}

function setElementValue( id, value )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.value = value;
	}	
}

function setElementText( id, text )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.innerText = text;
	}	
}

function setSelectedItem( id, value )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.selectedIndex = value;
	}
}

function setElementHTML( id, html )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.innerHTML = html;
	}	
}

function setElementFocus( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.focus();
	}	
}

// Replace newline characters with <br /> tags
function TransformForHtml( txt )
{
    return txt.replace( /\n/g, "<br />" );
}

function showMessage( txt )
{
	alert( txt );
}

// ----------------------------------------------
location.getParameter = function(sParam) {
    var sKey = sParam + "=";
    var toMatch = new RegExp( sKey, "i" );
    var oParams = this.search.substring(1).split("&");

    for(var i = 0; i < oParams.length; i++)
    {
        if( oParams[i].search( toMatch ) == 0)
            return oParams[i].substring(sKey.length);
    }
    return null;
};

function submitWithConfirm( id, msg )
{
	if ( typeof( msg ) == "undefined" )
	{
		msg = "Are you sure?";
	}
	
	if ( typeof( id ) == "undefined" )
	{
		if ( typeof( this ) != "undefined" )
		{
			id = this.id;
		}
		else
		{
			id = "";
		}
	}
	
	if ( window.confirm( msg ) )
	{
		// Now post the form
		doPostBack( id, "" );
	}
	return true;
}

// Remove an Event, asking first
function removeWithConfirm()
{
	if ( window.confirm( "Are you sure you want to delete this event?" ) )
	{
		// Now post the form
		doPostBack( 'btnRemoveConfirm', '' );
		return true;
	}
	
	return false;
}

// Close the current window (asking first)
function closeWithConfirm()
{
	if ( window.confirm( "Are you sure you want to close this window?" ) )
	{
		window.close();
	}
	return true;
}

function closeAndRefreshParentWithConfirm()
{
	if ( window.confirm( "Are you sure you want to close this window?" ) )
	{
		closeAndRefreshParent();
	}
	return true;
}

// Close current window and force parent to refresh itself.
function closeAndRefreshParent()
{
	if ( window )
	{
		if ( window.top.frames )
		{
			if ( window.top.opener )
			{
				setTimeout( "window.top.close()", 500 );
				window.top.opener.document.location.reload();
			}
		    else
		    {
	    		window.top.close();
    		}
		}
		else if ( window.opener )
		{
			setTimeout( "window.close()", 500 );
			window.opener.document.location.reload();
		}
		else
		{
			window.close();
		}
	}
	
	return false;
}


// Force parent to refresh itself.
function refreshParent()
{
	if ( window )
	{
		if ( window.top.frames )
		{
			if ( window.top.frames )
			{
				window.top.opener.document.location.reload();
			}
		}
		else if ( window.opener )
		{
			window.opener.document.location.reload();
		}
	}
	
	return false;
}

function getOpener()
{
	var opener = null;
	
	if ( window )
	{
		if ( top.opener )
			opener = top.opener
	}

	return opener;
}

function closePopup()
{
    ( getOpener() != null ) ? top.close(): window.history.back();

/*    var opener = getOpener();
    
    if ( opener != null )
        top.close();
    else
        window.history.back();*/
}

// Close Current Windows and Refresh either Calendar, My Reminders, or ePXTs
function closeAndRefreshParentChoose( eventTypeCode, eventID, month, year )
{
	var opener = getOpener();

	if ( opener	!= null )
	{
		var whichPage = getCurrentPage( opener.location.href ).toLowerCase();
		
		switch( whichPage )
		{
		    case "ecards":
		    case "my-reminders":
		    case "invites":
		        closeAndRefreshParentShowTargeted( eventTypeCode, eventID, whichPage );
		        break;
		    case "calendar":
			    closeAndRefreshParentNewDate( month, year );
			    break;
			default:
			    closeAndRefreshParent();
		}
	}
	else
	{
   		closeAndRefreshParent();
	}
}

// Close current window 
function closeAndRefreshParentShowTargeted( eventTypeCode, eventID, whichPage )
{
	var opener = getOpener();
	var page = whichPage + ".aspx?archive=y&event=";
	
	if ( opener != null )
	{
	    page = getCurrentDirectory( opener.location.href ) + page + eventTypeCode + eventID
        opener.location = page;
        setTimeout( "top.close();", 500 );
	}
}

// Close current window 
function closeAndRefreshParentNewDate( month, year )
{
	var opener = getOpener();
	
    if ( typeof(month) == "undefined" )
        month = new Date().getMonth() + 1;

    if ( typeof(year) == "undefined" )
        year = new Date().getFullYear();

	if ( opener != null )
	{
		setTimeout( "top.close()", 500 );
		opener.location = getCurrentDirectory( opener.location.href ) + "Calendar.aspx?Month=" + month + "&Year=" + year;
		opener.location.reload;
	}
}

// Close current window 
function closeAndRefreshParentUploadedImage( imageID )
{
	var opener = getOpener();
	
	if ( opener != null )
	{
		setTimeout( "top.close()", 500 );
		
		var currentUrl = opener.top.location.href;
		
		if ( currentUrl.match(/invitewizard/i) )
		{
		    opener.dostep2( imageID );
		}
		else
		{
		currentUrl = currentUrl.replace( /step=1/i, 'step=2' );
		currentUrl = currentUrl.replace( /ImageID=([0-9]+)&/i, 'ImageID=' + imageID + '&' );

		var cleanUrl = /\.aspx$/i;

	        if ( cleanUrl.test( currentUrl ) ) { currentUrl = currentUrl + '?imageID=' + imageID; }
       		if ( currentUrl.search(/imageid=/i) < 0 ) { currentUrl = currentUrl + '&imageID=' + imageID; }

		opener.top.location = currentUrl;
		opener.top.location.reload;
		}
	}
}

function closeAndRefreshParentAddressBookShowNew( entryID )
{
    var opener = getOpener();
	
	if ( opener != null )
	{
		opener.location = getCurrentDirectory( opener.location.href ) + "addressbook.aspx?type=contact#A" + entryID;
		setTimeout( "top.close()", 500 );
		opener.highlightNewest();
	}
}

// Close current window and force parent to logout
function closeAndLogoutParent()
{
	if ( window )
	{
		if ( window.parent.frames )
		{
			if ( window.parent.opener )
			{
				window.parent.opener.document.location = "/Default.aspx?lgt=x";
			}
		}
		else if ( window.opener )
		{
			window.opener.document.location = "/Default.aspx?lgt=x";
		}

		setTimeout( "window.close()", 500 );
	}
}

function logMeOut()
{
    if (window)
    {
        window.location = "/default.aspx?lgt=x";
    }
}

function selectImage( eventID, eventSubTypeID, imageCategoryID, imageID )
{
	setElementValue( "hidEventID", eventID );
	setElementValue( "hidEventSubTypeID", eventSubTypeID );
	setElementValue( "hidImageCategoryID", imageCategoryID );
	setElementValue( "hidImageID", imageID );
	
	// Now post the form
	doPostBack( "btnUpdateImage", "" );
}

function doPostBack(eventTarget, eventArgument)
{
	//alert( "doPostBack( '" + eventTarget + "', '" + eventArgument + "' )" );
	
	// Now post the form
	if ( typeof( __doPostBack ) == "undefined" )
	{
		var theForm = getFormObject();
		
		setElementValue( "__EVENTTARGET", eventTarget.split("$").join(":") );
		setElementValue( "__EVENTARGUMENT", eventArgument );

		theForm.submit();
	}
	else
	{
		__doPostBack( eventTarget, eventArgument );
	}
}

// do a Post Back on another Frame
function doPostBackWithWindow( eventTarget, eventArgument, theWindow )
{
	//alert( "doPostBackWithWindow( '" + eventTarget + "', '" + eventArgument + "', theWindow );" );
	var objTarget = getElementFromWindow( "__EVENTTARGET", theWindow );
	if ( objTarget )
	{
		objTarget.value = eventTarget.split("$").join(":");
	}

	var objArgument = getElementFromWindow( "__EVENTARGUMENT", theWindow );
	if ( objArgument )
	{
		objArgument.value = eventArgument;
	}

	var theForm = getFormObjectFromWindow( theWindow );
	theForm.submit();
}

function showWizard( eventTypeCode, step, eventID )
{
	var url = "Wizard.aspx?Step=" + step + "&EventID=" + eventID + "&EventTypeCode=" + eventTypeCode;
	return showPopupWizard( url );
}

function showWizardFromReminderMenu( step, eventSubTypeID, tags, imageID )
{
	var url = "Wizard.aspx?Step=" + step + "&EventSubTypeID=" + eventSubTypeID + "&EventTypeCode=R&Tags=" + tags + "&ImageID=" + imageID;

    return showPopupWizard( url );
}

function showWizardFromMyReminders( eventTypeCode, step, eventID, eventSubTypeID )
{
	var url = "Wizard.aspx?Step=" + step + "&EventID=" + eventID + "&EventTypeCode=" + eventTypeCode + "&EventSubTypeID=" + eventSubTypeID;
	return showPopupWizard( url );
}

function showWizardFromMenu( eventTypeCode, step, eventID, newDay, newMonth, newYear )
{
	var url = "Wizard.aspx?Step=" + step + "&EventID=" + eventID + "&EventTypeCode=" + eventTypeCode + "&Day=" + newDay + "&Month=" + newMonth + "&Year=" + newYear;
    return showPopupWizard( url );
}

function showWizardFromAddressBook( eventTypeCode, step, eventID, entryID, targetName, newDay, newMonth, newYear )
{
	var url = "Wizard.aspx?Step=" + step + "&EventID=" + eventID + "&EventTypeCode=" + eventTypeCode + "&EntryID=" + entryID + "&TargetName=" + targetName + "&Day=" + newDay + "&Month=" + newMonth + "&Year=" + newYear;
	
	var regex = /&(\w)*=undefined/g;
	
    return showPopupWizard( url.replace( regex, '' ) );
}

function showAddressBookEdit( addressBookEntryID )
{
	var url = "AddressBookEntryEdit.aspx?AddressBookEntryID=" + addressBookEntryID;
    return showPopup( url );
}

function showAddressBookGroupEdit( addressBookGroupID )
{
	var url = "AddressBookGroupEdit.aspx?AddressBookGroupID=" + addressBookGroupID;
    return showPopup( url );
}

// -------------------------------------------------
// Image Library Functions
function showWizardFromLibraryReminder( imageID )
{
    var url = "Wizard.aspx?Step=1&EventTypeCode=R&ImageID=" + imageID;
    return showPopupWizard( url );
}

function showWizardFromLibraryePXT( imageID )
{
    return showePXTWizardFromHomePage( imageID );
}
// -------------------------------------------------
// ePXT Wizard functions
function showePXTWizard( step, eventID, tags )
{
    var search = ( typeof( tags ) != "undefined" ) ? "&Tags=" + escape( tags ) : "" ;

	var url = "Wizard.aspx?EventTypeCode=P&Step=" + step + "&EventID=" + eventID + search;
    return showPopupWizard( url );
}

function showePXTWizardFromHomePage( imageID )
{
    var url = "Wizard.aspx?Step=2&ImageID=" + imageID + "&EventTypeCode=P";
    return showPopupWizard( url );
}

function showePXTWizardFromAddressBook( step, eventID, targetName, targetEmail )
{
	var url = "Wizard.aspx?EventTypeCode=P&Step=" + step + "&EventID=" + eventID + "&TargetName=" + targetName + "&TargetEmail=" + targetEmail;
    return showPopupWizard( url );
}

function showChooseAddress( fromMembers )
{
    var url = ( fromMembers ) ? "ChooseAddress.aspx" : "Members/ChooseAddress.aspx";

/*    if ( fromMembers )
        var url = "ChooseAddress.aspx";
    else
        var url = "Members/ChooseAddress.aspx";*/
        
    showPopupWithName( url, "name" );
}

function showImageUpload()
{
    var url = "ImageUpload.aspx";
    return showPopupWithName( url, "name" );
}

function showLostPassword()
{
    var url = "LostPassword.aspx";
    showPopupWithName( url, "name" );
}
function showLostActivationCode()
{
    var url = "LostActivationCode.aspx?Email=" + getElementValue( "_ctl0_ContentMain_txtEmailAddress" );
    showPopupWithName( url, "name" );
}

// --------------------------------------------
// InviteWizard functions
function showInviteWizard( eventID, imageID, eventDate, contactID )
{
    var url = "InviteWizard.aspx";
    var parameters = new Array();
    var urlParams = "";

    if ( !IsNull( eventID ) ) { parameters.push( "eventID=" + eventID ); }
    if ( !IsNull( imageID ) ) { parameters.push( "imageID=" + imageID ); }
    if ( !IsNull( eventDate ) ) { parameters.push( "eventDate=" + eventDate ); }

    if ( !isUndefined( contactID ) ) { parameters.push( "contactID=" + contactID ); }

    if ( parameters.length > 0 ) { urlParams = "?" + parameters.join( "&" ); }

    return showPopupWizard( url + urlParams );
}
// --------------------------------------------
function button_MouseOver( thisButton )
{
	thisButton.className = "ButtonHover";
}

function button_MouseOut( thisButton )
{
	thisButton.className = "Button";
}
// --------------------------------------------

function showPopup( url, width, height, name )
{
    height = ( isUndefined( height ) ) ? popupHeight : height;
    width = ( isUndefined( width ) ) ? popupWidth : width;
    name = ( isUndefined( name ) ) ? "_blank" : name;

    var dim = getScreenDimensions();
    var top = 0;
    var left = 0;
    var scrollbars = 0;

    if ( ( dim[0] < width ) || ( dim[1] < height ) )
    {
        width = ( dim[0] < width ) ? dim[0]-20: width;
        height = ( dim[1] < height ) ?  dim[1]-20: height;
        scrollbars = 1;
    }
    else
    {
	    top = Math.round( (screenHeight - height)/2 ) - 30;
    	left = Math.round( (screenWidth - width)/2 ) - 5;    
    }

	var features = "top=" + top + ", left=" + left + ", width=" + width + ", height=" + height + ", scrollbars=" + scrollbars + ", resizable=0, status=1,  menubar=0, directories=0, fullscreen=0, toolbar=0";
	window.open( url, name, features );

	return false;
}

function isUndefined( variable )
{
    return ( typeof( variable ) == "undefined" );
}

function showPopupWizard( url )
{
    return showPopup( url, wizardWidth, wizardHeight );
}

function showPopupWithName( url, name )
{
    return showPopup( url, popupWidth, popupHeight, name );
}

// Enable scrollbars on body if browser window is too small
function checkScreenSize()
{
	var winWidth = window.innerWidth || document.body.clientWidth;
	var winHeight = window.innerHeight || document.body.clientHeight;
	//alert( winHeight );
	if ( winWidth < 952 || winHeight < 574 )
	{
		//var x = '<style type="text/css">body{overflow:auto;}</style>';
		//document.write( x );
		//var s = document.createElement('style');
		//s.setAttribute('type', 'text/css');
		//s.setAttribute('src',c.url);
		//document.getElementsByTagName('head')[0].appendChild(s);
		document.body.className += " scrollbars";
	}
}

// Called from Header.ascx
function headerInit()
{
	checkScreenSize();
}

// Called from HeaderPopup.ascx
function headerPopupInit()
{
	checkScreenSize();
}

// ------------------------------------------
// Javascript specifically for the Wizard
//

// Update the main title in the Title frame
function setTitle( section, subSection )
{	
	setElementText( "lblSectionTitle", section );
	if ( typeof( subSection ) != "undefined" )
	{
		setElementText( "lblSubSectionTitle", subSection );
	}
}

function setTitleFromContent()
{
	//setTitle( winContent.document.title );
	var titleText = getElementFromFrame( "hidTitle", "content" );
	if ( titleText != null )
	{
		setTitle( titleText.value );
	}
}

// Set Display style of an Element
function showElement( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.style.display = "block";
	}
}

function hideElement( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.style.display = "none";
	}
}

function toggleDisplay( id )
{
    var obj = ( typeof( obj ) == 'string' ) ? getElement( id ) : id;

    try
    {
        obj.style.display = ( obj.style.display == 'none' ) ? 'block' : 'none';
    }
    catch( error )
    {
        displayJavascriptError( error );
    }
}

// Set Visibility style of an Element
function cloakElement( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.style.visibility = "hidden";
	}
}

function unCloakElement( id )
{
	var obj = getElement( id );
	if ( obj )
	{
		obj.style.visibility = "inherit";
	}
}

// ---------------------------------------
// Toolbox code
// Show only the items for this step
function toolboxSetStep( step, imageID, queryString, tags )
{
	setElementValue( "hidStep", step );
	if ( typeof(tags) != "undefined" && tags != "" )
	{
		setElementValue( "txtTags", tags );
	}
	
	var currentUrl = new String( document.URL );	
	var urlNew;
	var urlSuffix = ".aspx";
	var idx = currentUrl.indexOf( urlSuffix );
	if ( idx > 0 )
	{
		if ( currentUrl.charAt( idx-1 ) != step.toString() )
		{
			urlNew = currentUrl.substr( 0, idx-1 );
			urlNew += step.toString();
			urlNew += urlSuffix;
			urlNew += queryString;
			urlNew += "&NewImageID=";
			urlNew += imageID.toString();

			//document.URL = urlNew;
			document.location.href = urlNew;
		}
	}
}

// Refresh the Content frame with the appropriate Wizard page
function notifyContent( 
	step,
	eventID, 
	eventSubTypeID,
	eventTypeCode,
	imageCategoryID,
	imageID,
	pageNumber )
{
	var winContent = getFrameWindow( "content" );
	if (winContent)
	{
		//winContent.document.URL = 
		winContent.document.location = 
			"Wizard" + step.toString() + ".aspx" +
			"?EventID=" + eventID.toString() +
			"&EventSubTypeID=" + eventSubTypeID.toString() +
			"&EventTypeCode=" + eventTypeCode +
			"&ImageCategoryID=" + imageCategoryID.toString() +
			"&ImageID=" + imageID.toString() +
			"&PageNumber=" + pageNumber.toString();
	}
}

// Search for some images
function doSearch()
{
	var tags = getElementValue( "txtTags" );

	// remove non alphanumerics
	tags = stripNonAlphaNumerics( tags );
	setElementValue( "txtTags", tags );
	if ( tags.length == 0 )
	{
		alert( "Please enter some tags" );
		return false;
	}
	
	var winToolbox = getFrameWindow( "toolbox" );
	if (winToolbox)
	{
		var objTagsInput = getElementFromWindow( "txtTags", winToolbox );
		if ( objTagsInput )
		{
			objTagsInput.value = tags;
		}		
	}
	
	parent.parent.wizardSearchTerms = tags;

	var winContent = getFrameWindow( "content" );
	if (winContent)
	{
		var eventID = getElementValue( "hidEventID" );
		var eventSubTypeID = getElementValue( "hidEventSubTypeID" );
		var eventTypeCode = getElementValue( "hidEventTypeCode" );
		var imageID = getElementValue( "hidImageID" );
		
		var url = getWizardUrl( eventTypeCode, 2 ) + "?EventID=" + eventID + "&EventSubTypeID=" + eventSubTypeID + "&EventTypeCode=" + eventTypeCode + "&ImageID=" + imageID + "&Tags=" + escape(tags) + getQuerystringExtra();
		winContent.document.location = url;
	}
	else
	{
		alert( "Couldn't find the 'content' frame" );
	}
	
	return false;
}

function getWizardUrlPrefix( eventTypeCode )
{
	switch( eventTypeCode )
	{
	    case "P":
	        return "ePXT";
	        break;
	    case "I":
	        return "Invite";
	        break;
		default:
		    return "";
	}
}

function getWizardUrl( eventTypeCode, step )
{
	var url = getWizardUrlPrefix( eventTypeCode ) + "Wizard" + step + ".aspx";
	
	return url;
}

function getToolboxUrl( eventTypeCode, step )
{
	var url = getWizardUrlPrefix( eventTypeCode ) + "Toolbox" + step + ".aspx";
	
	return url;
}

function fillTags( id )
{
	var tagsSearch = getElement( id );
	
	if ( tagsSearch )
	{
		if ( parent.parent.wizardSearchTerms != null )
		{
			tagsSearch.value = (unescape)(parent.parent.wizardSearchTerms);
			doSearch();
		}
	}
}

// Show Hot Tags in the content frame
function showHotTags()
{
	var winContent = getFrameWindow( "content" );

	if (winContent)
	{
		var eventID         = getSiblingFrameElementValue( "hidEventID", "toolbox" );
		var eventSubTypeID  = getSiblingFrameElementValue( "hidEventSubTypeID", "toolbox" );
		var eventTypeCode   = getSiblingFrameElementValue( "hidEventTypeCode", "toolbox" );
		var imageID         = getSiblingFrameElementValue( "hidImageID", "toolbox" );
		
		var url             = "HotTags.aspx?EventID=" + eventID + "&EventSubTypeID=" + eventSubTypeID + "&EventTypeCode=" + eventTypeCode + "&ImageID=" + imageID + getQuerystringExtra();
		winContent.document.location.href = url;
	}

	return false;
}

// Strip out non alphanumeric characters
function stripNonAlphaNumerics( txt )
{
	var returnString = "";
    var ch;
    
	for ( i = 0; i < txt.length; i++ )
	{
	    ch = txt.charAt(i);
		if ( ( ch >= '0' && ch <= '9' ) ||
		     ( ch >= 'A' && ch <= 'Z' ) ||
		     ( ch >= 'a' && ch <= 'z' ) )
		{
		    // normal character
			returnString += ch;
		}
		else if ( ch == ' ' ||
		          ch == ';' ||
	              ch == ',' ||
	              ch == '\r' ||
	              ch == '\n' ||
	              ch == '\t' )
		{
		    // convert these characters to a space
			returnString += ' ';
		}
	}

	return returnString;
}

// Remove NewLine, CarriageReturn and Tab characters from a string
function removeNewLine( txt )
{
	var returnString = "";

	for ( i = 0; i < txt.length; i++ )
	{
		if ( txt.charAt(i) == '\n' || txt.charAt(i) == '\r' || txt.charAt(i) == '\t')
		{
			returnString += ' ';
		}
		else
		{
			returnString += txt.charAt(i);
		}
	}

	return returnString;
}

function removeCharacterFromString( txt, character )
{
	var returnString = "";
	
	if ( character.length > 1 )
	{
		if ( character.length > 2 || ( character.length == 2 && character.charAt(0) != '\\' ) )
		{
			alert( "The character parameter must be a single character or an escaped two character sequence." );
			return "ERROR";
		}
	}

	for ( i = 0; i < txt.length; i++ )
	{
		if ( txt.charAt(i) != character )
		{
			returnString += txt.charAt(i);
		}
	}
	
	return returnString;
}

// Strip off any Hash Part of the url,
// eg. stripHashPart( "My-Reminders.aspx#86" )
// returns "My-Reminders.aspx"
function stripHashPart( url )
{
    return url.replace( /#(\w)*/g, '' );
}

// Get the page part of a URL, eg.
// getCurrentPage( "Members/My-Reminders.aspx#86" );
// returns  "My-Reminders.aspx"
function getCurrentPage( url )
{
    return url.substring( url.lastIndexOf( "/" ) + 1, url.indexOf( ".aspx" ) );

/*    var page;
    
    var lastSlash = url.lastIndexOf( "/" );
    if ( lastSlash >= 0 )
    	page = url.substring( lastSlash + 1 );
    else
        page = url;
        
    return stripHashPart( page ); */
}

// Get the directory part of a URL
function getCurrentDirectory( url )
{
    var lastSlash = url.lastIndexOf( "/" );
    if ( lastSlash >= 0 )
	    return url.substring( 0, lastSlash + 1 );
	else
	    return "";
}

function highlightNewest()
{
	var newest = "";

    if ( window.location.getParameter( "event" ) != null )
    {
        newest = window.location.getParameter( "event" );
        
        var lineToHighlight = getElement( newest );
        if ( lineToHighlight )
        {
            lineToHighlight.className = "highlightRow";
            lineToHighlight.scrollIntoView(true);
        }
    }
}

function scrollTo( elementID )
{
    var element = getElement( elementID );
    
    if ( element )
    {
        element.scrollIntoView(true);
    }
}

function getDatesForWizard()
{
	var stepNumber;
	var eventSubTypeID;
	var eventID;
	var currentYear = new Date();
	currentYear = currentYear.getFullYear();

	var DateDay   = getElement( "ddlDateOfEventDay" );
	var DateMonth = getElement( "ddlDateOfEventMonth" );
	var DateYear  = getElement( "ddlDateOfEventYear" );

	if ( getElement( "txtName" ) != null )
	{
        if ( top && top.location && top.location.getParameter )
        {
    	    if ( top.location.getParameter( "TargetName" ) != null )
	            getElement("txtName").value = convertEntities(top.location.getParameter( "TargetName" ));
	    }
	}

	if ( top.location.search.length > 0 )
	{
		if ( top.location.getParameter( "Day" ) != null )
		{
			if ( DateDay )
				DateDay.value = top.location.getParameter( "Day" );
		}
		
		if ( top.location.getParameter( "Month" ) != null )
		{
			if ( DateMonth )
				DateMonth.value = top.location.getParameter( "Month" );
		}
		
		if ( top.location.getParameter( "Year" ) != null )
			top.wizardYear = top.location.getParameter( "Year" );
	}

	if ( location.search.length > 0 )
	{
		eventSubTypeID = location.getParameter( "EventSubTypeID" );
		stepNumber = location.getParameter( "Step" );
		eventID = location.getParameter( "EventID" );

        if ( eventSubTypeID == 1 && eventID == 0 )
            DateYear.value = top.wizardYear;
		else if ( eventSubTypeID == 5 )
		{
			DateYear.options.length = 7;
			setElementHTML( "NameLabel", "Title" );
			
			if ( stepNumber != 3 )
				DateYear.value = currentYear;
		}
		else if ( eventSubTypeID != 15 )
		{
			if ( stepNumber != 3 && stepNumber != null )
				DateYear.value = 0;
		}
	}
}

// ------------------------------------------------------------------
// Some Date manipulation and formatting functions

// generates an array object.
// NB. first index is 0.
function makeArray() 
{
	var i;
    for (i = 0; i < makeArray.arguments.length; i++)
        this[i] = makeArray.arguments[i];
}

function returnMonth( mm, full )
{
    if ( full )
        return months[ mm - 1 ];
    else
        return ( months[ mm - 1 ] ).substr( 0, 3 );
}

// returns the suffix for a day, eg.
// nths( 11 ) returns "th";
function nths( d )
{
    if (d == 1 || d == 21 || d == 31) return "st";
    if (d == 2 || d == 22) return "nd";
    if (d == 3 || d == 23) return "rd";
    return "th";
}

// Adjust a year from 2 digit to include century, eg.
// y2kAdjust( 20 ) returns 2020
// y2kAdjust( 60 ) returns 1960
// y2kAdjust( 1870 ) returns 1870
function y2kAdjust( y )
{
	return ( y >= 1000 ) ? y : ( ( y < 50 ) ? y + 2000 : y + 1900 );
}

// Adds a number of years/months/days onto a date,
// and returns the date.
function dateAdd( datepart, adjustment, dateFrom ) 
{
    var dateNew;
    
    if ( datepart == "y" || datepart == "yy" || datepart == "yyyy" )
    {
		dateNew = new Date( 
			dateFrom.getYear() + adjustment, 
			dateFrom.getMonth(), 
			dateFrom.getDate(), 
			dateFrom.getHours(),
			dateFrom.getMinutes(),
			dateFrom.getSeconds() );
	}
	else if ( datepart == "m" || datepart == "mm" )
    {
		dateNew = new Date( 
			dateFrom.getYear(), 
			dateFrom.getMonth() + adjustment, 
			dateFrom.getDate(), 
			dateFrom.getHours(),
			dateFrom.getMinutes(),
			dateFrom.getSeconds() );
	}
	else if ( datepart == "wk" || datepart == "w" || datepart == "ww" )
    {
		dateNew = new Date( 
			dateFrom.getYear(), 
			dateFrom.getMonth(),
			dateFrom.getDate() + ( adjustment * 7 ), 
			dateFrom.getHours(),
			dateFrom.getMinutes(),
			dateFrom.getSeconds() );
	}
	else if ( datepart == "d" || datepart == "dd" )
    {
		dateNew = new Date( 
			dateFrom.getYear(), 
			dateFrom.getMonth(),
			dateFrom.getDate() + adjustment, 
			dateFrom.getHours(),
			dateFrom.getMinutes(),
			dateFrom.getSeconds() );
	}
	else if ( datepart == "h" || datepart == "hh" )
    {
		dateNew = new Date( 
			dateFrom.getYear(), 
			dateFrom.getMonth(),
			dateFrom.getDate(), 
			dateFrom.getHours() + adjustment,
			dateFrom.getMinutes(),
			dateFrom.getSeconds() );
	}
	else if ( datepart == "min" || datepart == "mi" || datepart == "n" )
    {
		dateNew = new Date( 
			dateFrom.getYear(), 
			dateFrom.getMonth(),
			dateFrom.getDate(), 
			dateFrom.getHours(),
			dateFrom.getMinutes() + adjustment,
			dateFrom.getSeconds() );
	}
	else if ( datepart == "s" || datepart == "ss" )
    {
		dateNew = new Date( 
			dateFrom.getYear(), 
			dateFrom.getMonth(),
			dateFrom.getDate(), 
			dateFrom.getHours(),
			dateFrom.getMinutes(),
			dateFrom.getSeconds() + adjustment );
	}

	return dateNew;
}

/*
Preloading Images functions
	
Example:
	var myImages = new Array( "images/1.jpg", "images/2.jpg", "images/3.jpg" );	
	loadImages( myImages );
*/
function loadImages( imageFiles )
{
	if ( document.images )
	{
		var loadedImages = new Array();
		var i;
		for ( i=0; i < imageFiles.length; i++ )
		{
			if ( imageFiles[i] != null )
			{
				loadedImages[i] = new Image();
				loadedImages[i].src = imageFiles[i];		
			}
		}
	}
}

// Scrolls a DIV to the top
function scrollToTop( id )
{
    var obj = getElement( id );
    if ( obj )
    {
        obj.scrollTop = 0;
    }
}

function deleteAddressBookEntry()
{
    return confirm( "Are you sure you want to delete this entry?" );
}

function deleteAddressBookGroup()
{
    return confirm( "Are you sure you want to delete this group?" );
}

// -----------------------------------------------------------------------
// Add the selected emails addresses into the To field on the parent form
// this function is called from the popup window (via showChooseAddress() function)
// ChooseAddress.aspx
function addAddressToEPXT( address )
{
    var anOpener = getOpener();

    if ( anOpener != null )
    {
        var test = anOpener.document.getElementsByTagName("input");
        var parentTextBox = null;

        // find the field to put the addresses in
        // input field with attribute of
        // accesskey="e"
        for (var ii = 0, len = test.length; ii < len; ii++)
        {
            var akey = test[ii].getAttributeNode('accesskey');
            if (akey != null && akey.value == "e")
            {
                parentTextBox = test[ii];
                break;
            }
        }

        if (parentTextBox != null)
        {
            var existingValue = parentTextBox.value;
            parentTextBox.value = address;
            
            if (anOpener.document.URL.toLowerCase().indexOf("invitewizard.aspx") >= 0)
            {
                // Invite Wizard
                anOpener.setTimeout("showNameAndEmailFields()", 100);
            }
        }
    }
    else
    {
        //var iii = 0;
        //alert( "The ePXT window you are trying to add\r\naddresses to does not appear to be open." );
    }
}

function copyDefaultEmail()
{
    var anOpener = getOpener();
    
    if ( anOpener != null )
    {
        var parentInputs = anOpener.document.getElementsByTagName("input");
        var parentTextBox;
        
        for ( var ii = 0, len = parentInputs.length; ii < len; ii++ )
        {
            if ( parentInputs[ii].getAttributeNode('accesskey') != null && parentInputs[ii].getAttributeNode('accesskey').value == "e" )
                parentTextBox = parentInputs[ii];
        }
        
        var currentInputs = document.getFormElementsByType("text");
        
        currentInputs[0].value = parentTextBox.value;
    }
}

function addAddressToTOField( address, displayName )
{
    var textBox = getElement('_ctl0_ContentLeft_txtToAddress');
    
    var existingAddresses = textBox.value.split(";");
    
    var current;
    if ( address == "" )
        current = displayName;
    else if ( displayName == "" )
        current = address;
    else
        current = address + " (" + displayName + ")";
    
    var isNewAddress = true;
    for( var ii = 0; ii < existingAddresses.length; ii++ )
    {
        if ( existingAddresses[ii].indexOf( current ) >= 0 )
        {
            isNewAddress = false;
            break;
        }
    }

    if ( isNewAddress )
    {    
        if ( textBox.value.length > 0 )
        {
            var len = textBox.value.length;
            var str = new String( textBox.value );
            var semiColonAt = -1;
            for ( var z = len-1; z >= 0; z-- )
            {
                var c = str.charAt( z );
                if ( c == ' ' )
                {
                    // skip over this
                }
                else if ( c == ';' )
                {
                    textBox.value = textBox.value.substr( 0, z+1 ) + " ";
                    break;
                }
                else
                {
                    // need to add semicolon
                    textBox.value = textBox.value.substr( 0, z+1 ) + "; ";                    
                    break;
                }
            }
        }

        textBox.value += current + "; ";
    }
}

function getExistingAddresses( parentTextBoxID, currentTextBoxID )
{
    var regex = /\;\s*$/;

    try
    {
        var anOpener = getOpener();
    }
    catch (exp)
    {
        //alert( "Exception: " + exp );
    }

    try
    {
        //var parentTextBox = getElementFromWindow( parentTextBoxID, anOpener )
        var test = anOpener.document.getElementsByTagName("input");
        var parentTextBox;
        
        // Find the input control to put the addresses in.
        for ( var ii = 0, len = test.length; ii < len; ii++ )
        {
            if (test[ii].getAttributeNode('accesskey') != null && test[ii].getAttributeNode('accesskey').value == "e") 
            {
                parentTextBox = test[ii];
                break;
            }
        }
        
        if ( parentTextBox != null )
        {
        var currentTextBox = getElement( currentTextBoxID )
        
        if ( parentTextBox.value != "" && !regex.test( parentTextBox.value ) )
            currentTextBox.value = parentTextBox.value + "; ";
        else
            currentTextBox.value = parentTextBox.value;
    }
    }
    catch (exp)
    {
        //alert( "The ePXT window you are trying to add\r\naddresses to does not appear to be open." );
        //alert( "Exception: " + exp );
    }
}

function convertEntities( stringToConvert )
{
    return stringToConvert.replace(/%20/g, " " );
}

// Makes some text safe to display on a page
// ie. strips out < and > characters and any other non-standard characters.
function MakeHtmlSafe( txt )
{
    return txt.replace( /[^\w\s\d\-\(\)\*\!&%\$\#\@\[\]\;\:\'\"\/\?\.\,\_\=\+\\\|\{\}\~]/g, "" );
}

function buttonOnMouseOver( obj )
{
    if ( obj ) obj.style.backgroundColor = "#999900";
}

function buttonOnMouseOut( obj )
{
    if ( obj ) obj.style.backgroundColor = "#008080";
}

document.getFormElementsByType = function ( elemType ) {
	var elements = document.getElementsByTagName( elemType );

	if ( elements.length == 0 )
		elements = document.getElementsByAttribute( 'type', elemType, 'input' );

	return elements;
}

document.getElementsByAttribute = function ( attr, value, tag ) {
	var elements = ( typeof( tag ) == "undefined" ) ? document.getElementsByTagName( '*' ) : document.getElementsByTagName( tag );
	var withAttribute = new Array();
	var item = null;
	var attrValue = null;

	for ( var ii = 0, len = elements.length; ii < len; ii++ )
	{
		item = elements[ii];
		attrValue = item.getAttribute( attr );

        if ( attrValue.length > 0 && attrValue == value )
        	withAttribute[ withAttribute.length ] = item;
	}
	
	return withAttribute;
}

function reminderLinkChange( selectedType )
{
    var winWizard = getFrameWindow( "content" );
    var allLinks = winWizard.document.getElementsByTagName( 'a' );
    
    var currentURL = "";
    
    if ( selectedType == "standard" )
    {
        for ( var ii = 0, len = allLinks.length; ii < len; ii++ )
        {
            currentURL = allLinks[ii].href;
            allLinks[ii].href = currentURL.replace("Step=2","Step=3");
        }
    }
    else if ( selectedType == "select" )
    {
        for ( var ii = 0, len = allLinks.length; ii < len; ii++ )
        {
            currentURL = allLinks[ii].href;
            allLinks[ii].href = currentURL.replace("Step=3","Step=2");
        }        
    }    
}


/*----- Array methods -----*/
function Array_push() {
	var A_p = 0;
	for (A_p = 0; A_p < arguments.length; A_p++) {
		this[this.length] = arguments[A_p];
	}
	return this.length;
}

if (typeof Array.prototype.push == "undefined") {
	Array.prototype.push = Array_push;
}

function Array_shift() {
	var A_s = 0;
	var response = this[0];
	for (A_s = 0; A_s < this.length-1; A_s++) {
		this[A_s] = this[A_s + 1];
	}
	this.length--;
	return response;
}

if (typeof Array.prototype.shift == "undefined") {
	Array.prototype.shift = Array_shift;
}

String.prototype.trim=function(){
    return this.replace(/^\s*|\s*$/g,'');
}

function getQuerystringExtra()
{
    var addressBookEntryID = location.getParameter( "EntryID" );
    var newEventDay = location.getParameter( "Day" );
	var newEventMonth = location.getParameter( "Month" );
	var newEventYear = location.getParameter( "Year" );
	var targetName = location.getParameter( "TargetName" );
	var targetEmail = location.getParameter( "TargetEmail" );
	
	var querystringExtra = "";
	
	if ( addressBookEntryID != null )
	    querystringExtra += "&EntryID=" + addressBookEntryID;
	if ( newEventDay != null )
	    querystringExtra += "&Day=" + newEventDay;
	if ( newEventMonth != null )
	    querystringExtra += "&Month=" + newEventMonth;
	if ( newEventYear != null )
	    querystringExtra += "&Year=" + newEventYear;
	if ( targetName != null )
	    querystringExtra += "&TargetName=" + targetName;
	if ( targetEmail != null )
	    querystringExtra += "&TargetEmail=" + targetEmail;
	    
    return querystringExtra;
}

function IsNull( item ) { return (item == null ); }

function displayJavascriptError( error )
{
    try
    {
        var errorSpace = document.getElementById( 'javascriptProjectErrorSpace' );
        errorSpace.innerHtml = errorSpace.innerHtml + error;
        errorSpace.style.display = 'block';
    }
    catch( error )
    {
        //Die silently. Logging not enabled
    }
}