﻿// JScript File

var bInProcess = true;		// If this is true, we're in the middle of a process that requires a confirmation to leave.

var gInfoAlertTimout = 2000;	// Milliseconds.
var gRDAAToken = "1013";
var gRDMAToken = "1014";
var gClubAAToken = "1015";
var gClubMAToken = "1016";
var gOrgAAToken = "1017";
var gOrgFAToken = "1018";
var gOrgDAToken = "1019";


var gSessionKey = "IMASession";
var gSessionUserID = "UID";

var gbUserLoggedIn = false;


//var sCatListXML = null;
//var iCatListAttempts = 0;
//var xCatListTimeout = null;

//var sCountriesXML = '';
//var iCountryListAttempts = 0;
//var xCountryTimeout = null;

var gsCurrentField = "";
var gsOrigText = "";
var gsNewText = "";
var gsQuickEditFormName = "";
var gsOrigQuickEditContent = "";
var gQuickEditCallback = null;

var gsPartiWizBirthDate = "";
var gsPartiWizGender = "";
var gsPartiWizFinishTIme = "";
var gaPartiWizRatings = new Array();
var gaPartiWizImages = new Array();
var gsPartiWizRaceReport = "";

var giCartCookieLife = 7;

var goDialog = null;

var gBrowserAgent = navigator.userAgent;
var gIsIE = $.browser.msie;
var gBrowserMajVer = 0;
var gBrowserMinVer = 0.0;
var gBrowserVerRaw = navigator.appVersion;

var sSupportContact = "877.IMA.7979 or e-mail support@imathlete.com";

var gCookiesEnabled = false;

var gReplaceNamePattern = /[^a-zA-Z0-9]/g;

try {
	// Cookie test
	gCookieMake("CookieTest", "1", 1);

	gCookiesEnabled = (gCookieTake("CookieTest") == "1");
	
	if (gCookiesEnabled)
		gCookieEat("CookieTest");
		
}catch(e)
{
}//end catch

if (gIsIE)
{
	if (gBrowserVerRaw.indexOf("MSIE") > -1)
		gBrowserVerRaw = gBrowserVerRaw.substring(gBrowserVerRaw.indexOf("MSIE"));
	
	if (gBrowserVerRaw.indexOf(";") > -1)
		gBrowserVerRaw = gBrowserVerRaw.substring(4, gBrowserVerRaw.indexOf(";"));
		
}//end if
else if (gBrowserVerRaw.indexOf(" ") > -1)
{
	gBrowserVerRaw = gBrowserVerRaw.substring(0, gBrowserVerRaw.indexOf(" "));
	
}//end else

if (gBrowserVerRaw != null && gBrowserVerRaw.length > 0)
{
	var sVer = 	gBrowserVerRaw;
	var sMaj = "";
	var sMin = "";
	
	if (sVer.indexOf(".") > -1)
	{
		sMaj = sVer.substring(0, sVer.indexOf("."));
		sMin = sVer.substring(sVer.indexOf(".") + 1);
		
	}//end if
	else
		sMaj = sVer;
	
	gBrowserMajVer = parseInt(sMaj, 10);
	if (isNaN(gBrowserMajVer))
		gBrowserMajVer = 0;
	
	gBrowserMinVer = parseFloat(sMin);
	if (isNaN(gBrowserMinVer))
		gBrowserMinVer = 0;
		
}//end if


// Startup Functions ========================================================

//gProcessAjaxGetSync("/data/events/EventGetCatList.aspx", gLoadCatListXML, true);
//gProcessAjaxGetSync("/data/GetCountryList.aspx", gLoadCountryListXML, true);

//gProcessAjaxGetSync(gURLNoCache("/data/GetCurrentSession.aspx"), gUpdateSessionVars, true);

$(document).ready(function() {
	
	$(".HelpLink").each(function() {
		
		CreateHelpLink($(this).attr("id"));
		
	});//end each
		
});//end document.ready


// General functions =======================================================

function gComingSoon ()
{
	alert("This feature is coming soon!");
	
}//end gComingSoon

function gDisplayAlert(inMessage)
{
	gDisplayAlertCallback(inMessage, null);
	
}//end gDisplayAlert

function gDisplayAlertCallback(inMessage, inCallback)
{
	gDisplayAlertCallbackEx(inMessage, inCallback, null);
	
}//end gDisplayAlertCallback

function gDisplayAlertCallbackEx( inMessage, inCallback, inCSS, inWidth, inHeight )
{
	var iWidth = 0;
	var iHeight = 0;

	if ( $("#IMADialog p").html() != '' || $("#IMADialog").dialog("isOpen") )
		$("#IMADialog").dialog("close");
	
	$("#IMADialog p").html(inMessage);
	
	if (inCSS != null && inCSS != "")
		$("#IMADialog").removeClass("StandardDialog").addClass(inCSS);
	
	if (inWidth != null && inWidth > 0)
		iWidth = inWidth;
	
	if (inHeight != null && inHeight > 0)
		iHeight = inHeight;
	
	if (inCallback)
		$("#IMADialog").dialog({ resizable: false, width: (iWidth > 0 ? iWidth : 300), height: (iHeight > 0 ? iHeight : 200),
							overlay: { backgroundColor: '#000', opacity: 0.5 },
							modal: true, title: 'Alert', close: inCallback });
	else
		$("#IMADialog").dialog({ resizable: false, width: (iWidth > 0 ? iWidth : 300), height: (iHeight > 0 ? iHeight : 200),
							overlay: { backgroundColor: '#000', opacity: 0.5 },
							modal: true, title: 'Alert' });
	
	$("#fIMADialogSubmit").unbind("click");
	
	$("#fIMADialogSubmit").bind("click", function() {
		
		$("#IMADialog").dialog("close");
		
		return false;
		
	});//end function
	

}//end gDisplayAlertCallbackEx


function gPositionItemCenter(inItemID) {
	
	var obj = $(inItemID);
	
	if (obj == null)
		return;
	
	var iWidth = obj.width();
	var iHeight = obj.height();
	
	var iWindowWidth = window.innerWidth;
	var iWindowHeight = window.innerHeight;
	
	var iTop = (iWindowHeight / 2) - (iHeight / 2);
	var iLeft = (iWindowWidth / 2) - (iWidth / 2);
	
	iTop = iTop - 100;
	
	if (iTop < 50)
		iTop = 50;
	
	obj.css("top", iTop);
	obj.css("left", iLeft);
	
}//end gPositionItemCenter

function gPositionItem(inItemID, inTop, inLeft) {
	
	var obj = $(inItemID);
	
	if (obj == null)
		return;
	
	obj.css("top", inTop);
	obj.css("left", inLeft);
	
}//end gPositionItemCenter

// Does not validate true date/time. Just makes sure it's in the right format.
function gValidateDateTime(inDateTime)
{
	var sDate = "";
	var sTime = "";
	
	if (inDateTime.indexOf(":") > -1)
	{
		sDate = inDateTime;
		sTime = sDate.substring(sDate.indexOf(" ")+1);
		sDate = sDate.substring(0, sDate.indexOf(" "));
		
	}//end if
	else
		sDate = inDateTime;
	
	var reg = /^\d{1,2}(\-|\/|\.)\d{1,2}\1(\d{4}|[0-9]{2})$/
	
	if (!reg.test(sDate))
		return false;
	else
	{
		var aOrigPieces = new Array();
		var aNewPieces = new Array();
		
		var datetest = new Date(sDate);
		
		aOrigPieces = sDate.split("/");
		aNewPieces[0] = datetest.getMonth() + 1;
		aNewPieces[1] = datetest.getDate();
		aNewPieces[2] = datetest.getFullYear();
		
		for(var i=0; i < aNewPieces.length; i++)
		{
			var iTest = gGetIntFromDB( (aOrigPieces.length > i ? aOrigPieces[i] : "") );
			
			if (iTest != aNewPieces[i])
				return false;
		
		}//end for
				
	}//end else
	
	if (sTime.length > 0)
	{
		reg = /^\d{1,2}(\:)\d{1,2}\1\d{1,2}$/
		
		if (!reg.test(sTime))
			return false;
	
	}//end if
	return true;
	
}//end gValidateDateTime


function gCleanDateTime(inDBDateTime) 
{
	var sFinal = "";
	var sDate = "";
	var sTime = "";
	
	if (inDBDateTime.indexOf(":") > -1)
	{
		sDate = inDBDateTime.substring(0, inDBDateTime.indexOf("T"));
		sTime = inDBDateTime.substring(inDBDateTime.indexOf("T")+1);
	}//end if
	else
	{
		sDate = inDBDateTime;
		
	}//end else
	
	var sYear = sDate.substring(0, sDate.indexOf("-"));
	sDate = sDate.substring(sDate.indexOf("-")+1);
	var sMonth = sDate.substring(0, sDate.indexOf("-"));
	sDate = sDate.substring(sDate.indexOf("-")+1);
	var sDay = sDate;
	
	sFinal = sMonth + "/" + sDay + "/" + sYear;
	
	if (sFinal == "//")
		sFinal = "";
	
	if (sTime.length > 0)
		sFinal = sFinal + " " + sTime;
	
	//alert(Date.parse(sFinal).toString());
	
	return sFinal;

}//end gCleanDateTime

function gCleanDateOnly(inDBDateTime)
{
	var sWork = gCleanDateTime(inDBDateTime);

	if (sWork.indexOf(" ") > -1)
		sWork = sWork.substring(0, sWork.indexOf(" "));
		
	return sWork;

}//end gCleanDateOnly

// Returns a full/long date ("February 20, 2008")
function gFormatDateFull(inDateTime)
{
	var sOutput = "";
	
	var temp = new Date(inDateTime);
	var sOutput = temp.toDateString();
	var sMonth = "";
	
	sOutput = sOutput.substring(sOutput.indexOf(" ")+1);
	sMonth = sOutput.substring(0, sOutput.indexOf(" ")).toUpperCase();
		
	switch(sMonth)
	{
		case "JAN":
			sMonth = "January";
			break;
		case "FEB":
			sMonth = "February";
			break;
		case "MAR":
			sMonth = "March";
			break;
		case "APR":
			sMonth = "April";
			break;
		case "MAY":
			sMonth = "May";
			break;
		case "JUN":
			sMonth = "June";
			break;
		case "JUL":
			sMonth = "July";
			break;
		case "AUG":
			sMonth = "August";
			break;
		case "SEP":
			sMonth = "September";
			break;
		case "OCT":
			sMonth = "October";
			break;
		case "NOV":
			sMonth = "November";
			break;
		case "DEC":
			sMonth = "December";
			break;
		
	}//end switch
	
	sOutput = sMonth + " " + sOutput.substring(sOutput.indexOf(" ") + 1).replace(" ", ", ");
	
	
	return sOutput;
	
}//end gFormatDateFull

// Returns a truncated date ("Feb 20")
function gFormatDateTrunc(inDateTime)
{
	var sOutput = "";
	
	var temp = new Date(inDateTime);	// DOW MON DD YEAR TIME
	var aPieces = temp.toDateString().split(" ");
	
	var sOutput = "";
	var sMonth = aPieces[1];
	var sDay = aPieces[2];
	
	sOutput = sMonth + " " + sDay;
	
	return sOutput;
	
}//end gFormatDateFull

// Whoever created the JS toDateString call should be shot...after he's introduced to modern date formats.
function gConvertJSToDate(inDateObj)
{
	var sWork = "";
	if (inDateObj == null)
		return "";
	
	var sTime = inDateObj.toTimeString();
	sTime = sTime.substring(0, sTime.indexOf(" "));
	
	var iHours = parseInt(sTime.substring(0, sTime.indexOf(":")), 10);
	if (isNaN(iHours))
		iHours = 12;
	
	sTime = sTime.substring(sTime.indexOf(":"));	// We want the colon
	
	if (iHours == 0)
		sTime = "12" + sTime + " AM";
	else if (iHours < 12)
		sTime = "" + iHours +  sTime + " AM";
	else if (iHours == 12)
		sTime = "12" + sTime + " PM";
	else if (iHours > 12)
		sTime = "" + (iHours - 12) + sTime + " PM";
	
	sWork = (inDateObj.getMonth() + 1) + "/" + inDateObj.getDate() + "/" + inDateObj.getFullYear() + " " + sTime;
	
	return sWork;
	
}//end gConvertJSToDate

// Whoever created the JS toDateString call should be shot...after he's introduced to modern date formats.
function gConvertJSToDateShort(inDateObj)
{
	var sWork = "";
	if (inDateObj == null)
		return "";
	
	sWork = (inDateObj.getMonth() + 1) + "/" + inDateObj.getDate() + "/" + inDateObj.getFullYear();
	
	return sWork;
	
}//end gConvertJSToDateShort


function gConvertUTCToLocal(inUTCDate)
{
	var work = new Date(inUTCDate);
	var d = new Date();
	var offset = d.getTimezoneOffset() * 60000;		// Milliseconds in a minute; offset is in minutes; + = east of UTC; - = west of UTC
	
	// Subtract the offset from the time passed in to get local ticks.
	var local = work.getTime() - offset;
	
	var localDate = new Date(local);
	
	return localDate;
	
}//end gConvertUTCToLocal

function gConvertLocalToUTC(inLocalDate)
{
	var work = new Date(inLocalDate);
	var d = new Date();
	var offset = d.getTimezoneOffset() * 60000;		// Milliseconds in a minute; offset is in minutes; + = east of UTC; - = west of UTC
	
	// Add the offset from the time passed in to get UTC time.
	var utc = work.getTime() + offset;
	
	var utcDate = new Date(utc);
	
	return utcDate;
	
}//end gConvertLocalToUTC

function gConvertFinishTime( inTimeNum, inHideSeconds, inShortFormat )
{
	var sWork = "";
	var fWork = inTimeNum;
	var iHours = 0;
	var iMinutes = 0;
	var iSeconds = 0;
	var bShortFormat = false;	// 00:00:00 = short; long = 0 hrs, 00 mins, 00 secs
	
	if (inShortFormat != null)
		bShortFormat = inShortFormat;
	
	iHours = fWork / 60.0;
	iHours = Math.floor(iHours);
	
	fWork = fWork - (iHours * 60);
	iMinutes = Math.floor(fWork);
	
	fWork = fWork - iMinutes;
	iSeconds = Math.round(fWork * 60);
	
	if (bShortFormat)
	{
		var sHours = "0" + iHours;
	
		sWork = sHours.substring(sHours.length-2) + ":";
		
		var sMins = "0" + iMinutes;
		var sSecs = "0" + iSeconds;
		
		sWork += sMins.substring(sMins.length-2);
		
		if (!inHideSeconds)
			sWork += ":" + sSecs.substring(sSecs.length-2);
			
	}//end if
	else
	{
		sWork = "" + iHours + ( iHours == 1 ? " hr" : " hrs");
		
		sWork += (sWork.length > 0 ? ", " : "" ) + iMinutes + ( iMinutes == 1 ? " min" : " mins" );
		
		if (!inHideSeconds)
			sWork += (sWork.length > 0 ? ", " : "" ) + iSeconds + ( iSeconds == 1 ? " sec" : " secs" );
		
	}//end else
	
	return sWork;
	
}//end gConvertFinishTime

function gFormatMoney(inFloatValue) 
{
	var fValue = inFloatValue;
	var bNegative = false;
	
	if (fValue < 0.000)
	{
		bNegative = true;
		fValue = Math.abs(fValue);
		
	}//end if
		
	var test = "" + fValue;
	
	if (test.length == 0)
		return "0.00";
	
	
	var fCost = gGetFloatFromDB(fValue);
	var iDollars = 0;
	var iCents = 0;
	var sCents = "";
	
	
	iDollars = gGetIntFromDB(fCost);
	iCents = gGetIntFromDB((fCost*100) - (iDollars*100));
	sCents = "0" + iCents;
	
	
	return (bNegative ? "-" : "") + iDollars + "." + sCents.substring(sCents.length-2);

}//end gFormatMoney

function gFormatMoneyLarge(inFloatValue) 
{
	var test = "" + inFloatValue;
	
	if (test.length == 0)
		return "0.00";
	
	// Strip out anything but periods:
	var pattern = /[^0-9\.]+/g;
	
	test = test.replace(pattern, "");
	
	var aParts = test.split(".");
	var sDollars = (aParts.length > 0 ? aParts[0] : "0");
	var sCents = (aParts.length > 1 ? aParts[1] : "0");;
	var iDollars = 0;
	var iCents = 0;
	
	iDollars = parseInt(sDollars, 10);
	iCents = parseInt(sCents, 10);
	sCents = "0" + iCents;
	
	if (sDollars.length > 6)
		sDollars = sDollars.substring(0, sDollars.length - 6) + "," + sDollars.substring(sDollars.length - 6);
	
	if (sDollars.length > 3)
		sDollars = sDollars.substring(0, sDollars.length - 3) + "," + sDollars.substring(sDollars.length - 3);
	
	return "" + sDollars + "." + sCents.substring(sCents.length-2);

}//end gFormatMoneyLarge

// From: http://www.mredkj.com/javascript/nfbasic.html
function gFormatNumber(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
	
}//end gFormatNumber


function gFormatPhone(inPhone)
{
	var sWork = "";
	
	if (inPhone != null)
		sWork = inPhone;
	
	if (sWork.length >= 10)
		sWork = sWork.substring(0, 3) + "-" + sWork.substring(3, 6) + "-" + sWork.substring(6, 10);
	
	return sWork;	
	
}//end gFormatPhone

function gFormatPhoneIntl(inPhone, inCountryID)
{
	var sWork = "";
	
	if (inPhone != null)
		sWork = inPhone;
	
	if ((inCountryID == giCountryDefaultUS || inCountryID == giCountryCanada) && sWork.length >= 10)
		sWork = sWork.substring(0, 3) + "-" + sWork.substring(3, 6) + "-" + sWork.substring(6, 10);
	
	return sWork;	
	
}//end gFormatPhoneIntl

function gCleanNumString(inValueStr)
{
	var sWork = '' + inValueStr;
	var cleanpat = /[^0-9.\-]+/g;
	
	return sWork.replace(cleanpat, '');
	
}//end gCleanNumString

function gGetIntFromDB(inDBValueStr)
{
	var iVal = parseInt(gCleanNumString(inDBValueStr), 10);
	
	if (isNaN(iVal))
		iVal = 0;
	
	return iVal;
	
}//end gGetIntFromDB

function gGetFloatFromDB(inDBValueStr)
{
	var fVal = parseFloat(gCleanNumString(inDBValueStr));
	
	if (isNaN(fVal))
		fVal = 0.0;
	
	return fVal;
	
}//end gGetFloatFromDB

function gGetBoolFromDB(inDBValueStr)
{
	var sTest = "" + inDBValueStr;
	
	sTest = sTest.toLowerCase();
	
	return (sTest == "1" || sTest == "true");

}//end gGetBoolFromDB


function gGetMonthNameShort(inMonth)
{
	var iMonth = parseInt(inMonth, 10);
	var sMonthName = "";
	
	if (isNaN(iMonth))
		return "";
	
	switch(iMonth)
	{
		case 1:
			sMonthName = "Jan";
			break;
		case 2:
			sMonthName = "Feb";
			break;
		case 3:
			sMonthName = "Mar";
			break;
		case 4:
			sMonthName = "Apr";
			break;
		case 5:
			sMonthName = "May";
			break;
		case 6:
			sMonthName = "Jun";
			break;
		case 7:
			sMonthName = "Jul";
			break;
		case 8:
			sMonthName = "Aug";
			break;
		case 9:
			sMonthName = "Sep";
			break;
		case 10:
			sMonthName = "Oct";
			break;
		case 11:
			sMonthName = "Nov";
			break;
		case 12:
			sMonthName = "Dec";
			break;
	
	}//end switch
	
	return sMonthName;
	
}//end gGetMonthNameShort


function gGetMonthName(inMonth)
{
	var iMonth = parseInt(inMonth, 10);
	var sMonthName = "";
	
	if (isNaN(iMonth))
		return "";
	
	switch(iMonth)
	{
		case 1:
			sMonthName = "January";
			break;
		case 2:
			sMonthName = "February";
			break;
		case 3:
			sMonthName = "March";
			break;
		case 4:
			sMonthName = "April";
			break;
		case 5:
			sMonthName = "May";
			break;
		case 6:
			sMonthName = "June";
			break;
		case 7:
			sMonthName = "July";
			break;
		case 8:
			sMonthName = "August";
			break;
		case 9:
			sMonthName = "September";
			break;
		case 10:
			sMonthName = "October";
			break;
		case 11:
			sMonthName = "November";
			break;
		case 12:
			sMonthName = "December";
			break;
	
	}//end switch
	
	return sMonthName;
	
}//end gGetMonthName

function gGetHHMMSSFromFloat(inFloat)
{
	var sWork = "";
	var iHours = 0;
	var sHours = "";
	var iMinutes = 0;
	var sMinutes = "";
	var iSeconds = 0;
	var sSeconds = "";
	
	var iTemp = parseInt(inFloat, 10);
	
	iHours = parseInt(iTemp / 60, 10);
	sHours = "0" + iHours;
	iMinutes = iTemp % 60;
	sMinutes = "0" + iMinutes;
	iSeconds = Math.round((inFloat - iTemp) * 60);
	sSeconds = "0" + iSeconds;
	
	
	if (iHours > 0)
	{
		sWork = sHours.substring(sHours.length - 2) + ":";
		
	}//end if
	
	sWork = sWork + sMinutes.substring(sMinutes.length - 2) + ":" +
					sSeconds.substring(sSeconds.length - 2);
					
	return sWork;


}//end gGetHHMMSSFromFloat

function gSetToolTip( inItemID, inToolTipText )
{
	var sItemTag = "#" + inItemID;
	
	if($(sItemTag).offset() == null)
		return;
		
	var iTop = $(sItemTag).offset().top;
	
	iTop = iTop - 145;
	
	
	$(sItemTag).hover( function() {
		
		$("#reghelp").text(inToolTipText);
		$("#reghelp").attr("class", "HelpTooltip");
		
		$("#reghelp").css("top", iTop);
		
	}, function() { 
		
		$("#reghelp").text("");
		$("#reghelp").attr("class", "HelpTooltipOff");
		
	});//end hover

}//end gSetTooltip

function gURLNoCache(inURL)
{
	var sURL = inURL;
	var sCacheBreak = new Date().getTime();
	
	// Weird situation but could happen:
	if (sURL.indexOf("?") > -1 && sURL.indexOf("?") != (sURL.length - 1))
		sURL = sURL + "&";
	else if (sURL.indexOf("?") == -1)
		sURL = sURL + "?";
	
	sURL = sURL + "z=" + sCacheBreak;
	
	return sURL;
	
}//end gURLNoCache

function gGetAgeFromDates(inBasisDate, inDOB)
{
	if (inBasisDate == null || inDOB == null)
		return 0;
	
	if (inBasisDate == "" || inDOB == "")
		return 0;
		
	// Check to make sure their age fits within the range.
	var dtBasis = new Date(inBasisDate);
	var dtBirth = new Date(inDOB);
	
	var iAge = dtBasis.getFullYear() - dtBirth.getFullYear();
	
	// Compensate for month
	if (dtBasis.getMonth() == dtBirth.getMonth())
	{
		// Birthdate is in the same month...check days
		if (dtBasis.getDay() < dtBirth.getDay())
			iAge--;
				
	}//end if
	else if (dtBasis.getMonth() < dtBirth.getMonth())
		iAge--;
	
	return iAge;
	
}//end gGetAgeFromDates

function gGetAgeGroup(inAge)
{
	var iTens = 0;
	var iOnes = 0;
	var iAge = 0;
	var sRange = "";
	
	iAge = parseInt(inAge, 10);
	
	if (isNaN(iAge))
		return "";
		
	// Take care of the easier ones first.
	if (iAge < 20)
		return "19 and under";
	
	if (iAge >= 70)
		return "70+";
	
	
	if (inAge.length > 1)
	{
		iTens = parseInt(inAge.substring(0,1), 10);
		iOnes = parseInt(inAge.substring(1,2), 10);
		
	}//end if
	else
	{
		iOnes = iAge;
	}//end else
	
	if (iOnes < 5)
		sRange = iTens + "0-" + iTens + "4";
	else
		sRange = iTens + "5-" + iTens + "9";
		
	return sRange;
		
	
}//end gGetAgeGroup

function gGetAgeGroupByFactor(inFactor)
{
	var sRange = "";
	
	if (inFactor < 4)
		sRange = "19 and under";
	else if (inFactor > 14)
		sRange = "70+";
	else
		sRange = "" + (inFactor * 5) + "-" + (((inFactor+1) * 5) - 1);
	
	return sRange;
	
}//end gGetAgeGroupByFactor


function gMemberSectionMinimize(thisSection, isUserAction) {
	
	var sID = $(thisSection).attr("id");
	
	
	$(thisSection).find(".MemberBreakdownSectionDisplay").toggleClass("hide");
	$(thisSection).find("span.SectionBoxMinimize a").toggleClass("max");
	
	if (!isUserAction)
		return;
		
//	if (sID.indexOf("_") > -1)
//		sID = sID.substring(sID.indexOf("_") + 1);
		
	var sSections = gCookieSessionGet("BoxPrefs");
	
	if (sSections.length == 0)	// Add
		sSections = "|" + sID + "|";
	else if (sSections.indexOf("|" + sID + "|") == -1)	// Add
		sSections += sID + "|";
	else if (sSections.indexOf("|" + sID + "|") > -1)	// Remove
    {	    
        var sPattern = new RegExp("\\b\|" + sID + "\|\\b", "g");	            
		sSections = sSections.replace(sPattern, "|");
	}
	
	if (sSections.length == 0 || sSections == "|")
		gCookieSessionSet("BoxPrefs", "");
	else
		gCookieSessionSet("BoxPrefs", sSections);
		
}//end gMemberSectionMinimize



function gGetDateFromJSON(inJSONDateString)
{
	var sWork = "" + inJSONDateString;
	var lTime = 0;
	
	lTime = gGetTicksFromJSONDate(sWork);
			
	if (lTime == 0)
		return null;
		
	var local = new Date();
	var offset = local.getTimezoneOffset() * 60000;	// Convert to milliseconds
	var result = new Date(lTime - offset);	// Remove it from the time since times after UTC will be negative, before positive.
		
	return result;
	
}//end gGetDateFromJSON

function gGetDateFromJSONUTC(inJSONDateString)
{
	var sWork = "" + inJSONDateString;
	var lTime = 0;
	
	lTime = gGetTicksFromJSONDate(sWork);
			
	if (lTime == 0)
		return null;
		
	var result = new Date(lTime);
		
	return result;
	
}//end gGetDateFromJSONUTC

function gGetTicksFromJSONDate(inJSONDateString)
{
	var sWork = "" + inJSONDateString;
	var lTicks = 0;
	var regex = /\d+/;
	
	if (sWork.match(regex) != null)
	{
		sWork = sWork.match(regex)[0];
		
		lTicks = gGetIntFromDB(sWork);
		
	}//end if
	
	return lTicks;	
	
}//end gGetTicksFromJSONDate



// Quick Edit Functions ========================================================

function gQuickEditCreate(inID, inFormName)
{
	gQuickEditCreateCallback(inID, inFormName, null, null, null);
	
}//end gQuickEditCreate

function gQuickEditCreateCustom( inID, inFormName, inRows, inCols )
{
	gQuickEditCreateCallback(inID, inFormName, null, inRows, inCols);
	
	
}//end gQuickEditCreateCustom

function gQuickEditCreateCallback(inID, inFormName, inCreateCallback, inRows, inCols)
{
	var sHiddenFieldID = "";
	var sCurrentText = "";
	var sHTML = "";
	var iRows = 10;
	var iCols = 75;
	
	if (gsCurrentField == inID)
		return;
		
	if (inFormName == "")
		return;
	
	if (inRows != null)
		iRows = inRows;
	
	if (inCols != null)
		iCols = inCols;
	
	gsQuickEditFormName = inFormName;
	
	if (gsCurrentField.length > 0)
	{
		if (!confirm("You already editing another field. Click OK to abandon your changes on the other field and start working with this one."))
			return;
		
		// Wrap up the previous field by just clearing it.
		$("#" + gsCurrentField).html(gsOrigText);
		
		gsCurrentField = "";
		gsOrigText = "";
		
	}//end if
	
	gsCurrentField = inID;
	sHiddenFieldID = "f" + inID;
	
	gsOrigText = $("#" + gsCurrentField).html();
	
	if (gsOrigText.indexOf("Be the first to add this information!") > -1)
		gsOrigText = "";
	
	sHTML = '<textarea class="StandardField" name="' + sHiddenFieldID + '" id="' + sHiddenFieldID + '" rows="' + iRows + '" cols="' + iCols + '">' + 
		gConvertTextForStorage(gsOrigText) + '</textarea><br/>' + 
		 '<input type="image" name="fQuickEditSubmit" id="fQuickEditSubmit" class="ImageRollover" alt="Save" tabindex="300" src="/images/global/btn_save_off.gif" onclick="gQuickEditSave();" />' +
		 '<input type="image" name="fQuickEditCancel" id="fQuickEditCancel" class="ImageRollover" alt="Cancel" tabindex="310" src="/images/global/btn_cancel_off.gif" onclick="gQuickEditReset();"  />' +
		 '<br /><br />';
		
	
	$("#" + gsCurrentField).html(sHTML);
	
	if (inCreateCallback != null)
		gQuickEditCallback = inCreateCallback;
		
		
}//end gQuickEditCreate

function gQuickEditSave()
{
	var sSubmitFieldID = "";
	
	if (gsCurrentField.length == 0)
	{
		alert("You are not currently editing a field.");
		return;
	}//end if
	
	sSubmitFieldID = "f" + gsCurrentField;
	
	gsNewText = $("#" + sSubmitFieldID).val();
	
	if (!gIsValidText(gsNewText))
	{
		alert("We detected invalid text in your submission. Please make sure you don't have any <script> tags included in the text.");
		return;
	}//end 
	
	if (gsNewText == gsOrigText)
	{
		alert("No changes were detected.");
		
		gQuickEditReset();
		
		return;
		
	}//end if
	
	if (!confirm("Are you sure you want to submit these changes?"))
		return;
	
	// Call the callback so the page can rearrange the form before we do something with it.
	if (gQuickEditCallback != null)
		gQuickEditCallback(gsCurrentField);
	
	// Grab the editor form content.
	gsOrigQuickEditContent = $("#QuickEditForm").html();
	
	// Replace the original form with the new field...
	$("#" + gsQuickEditFormName).html($("#" + gsCurrentField).html());
	
	if (gsOrigQuickEditContent.length > 0)
		$("#" + gsQuickEditFormName).append(gsOrigQuickEditContent);
	
	// Update the quick edit form with the real body...
	$("#" + gsQuickEditFormName + " #f" + gsCurrentField).val(gsNewText);
	
	var sAction = $("#" + gsQuickEditFormName).attr("action");
	
	gProcessAjaxForm(gsQuickEditFormName, sAction, gQuickEditFinish);
	
	
}//end gQuickEditSave

function gQuickEditReset()
{
	$("#" + gsCurrentField).html(gsOrigText);
	
	gsCurrentField = "";
	gsOrigText = "";
	gsNewText = "";
	
}//end gQuickEditReset

function gQuickEditFinish(inData, inError)
{

	if (gProcessReportError(inError, true, "errormsg"))
		return;
	
	$("#" + gsQuickEditFormName).html(gsOrigQuickEditContent);	// Restore the quick edit form.
	
	$("#" + gsCurrentField).html(gConvertTextForDisplay(gsNewText));
	
	// Clear the vars:
	gQuickEditCallback = null;
	gsQuickEditFormName = "";
	gsCurrentField = "";
	gsOrigText = "";
	gsNewText = "";
	
	
}//end gQuickEditFinish

function gReplaceQuotes(inText){
	return inText.replace(/\\/g, '\\\\').replace(/"/g, '\\\"').replace(/'/g, '\\\'');
}//end gReplaceQuotes

function gReplaceQuotesToHTML(inText){
	return inText.replace(/"/g, '&quot;');
}//end gReplaceQuotesToHTML

function gConvertTextForDisplay(inOriginalCopy) 
{
	var sWork = '';
	
	if (inOriginalCopy == '')
		return '';
	
	sWork = '' + inOriginalCopy;
	sWork = sWork.replace(/\r\n/g, '</p><p>');
	sWork = sWork.replace(/\r/g, '</p><p>');
	sWork = sWork.replace(/\n/g, '</p><p>');
	
	sWork = sWork.replace(/\<p\>\w*\<\/p\>/g, '<p>&nbsp;</p>');
	
	// Look for links here. Use regular expressions.
	// Event Links
	// Group Links
	// User Links
	
	if (sWork.length > 0)
		sWork = '<p>' + sWork + '</p>';
	
	return sWork;
	
}//end gConvertTextForDisplay

function gConvertTextForStorage(inOriginalCopy) 
{
	var sWork = "";
	
	if (inOriginalCopy == "")
		return "";
	
	sWork = "" + inOriginalCopy;
	sWork = sWork.replace(/<br>/gi, "\r\n");
	sWork = sWork.replace(/<br\/>/gi, "\r\n");
	sWork = sWork.replace(/<\/p>/gi, "");
	sWork = sWork.replace(/<p>/gi, "\r\n");
//	debugger;
//	sWork = sWork.replace(/\\/g, "\\\\");
	
	
	// Look for links here. Use regular expressions.
	// Event Links
	// Group Links
	// User Links
	
	return sWork;
	
}//end gConvertTextForStorage

// Rights checks ==========================================================

// Checks to see if the current user is allowed to view a particular piece of functionality.
function gCheckRights(inRights, inFuncPointer)
{
	gCheckRightsCore("/data/CheckRights.aspx", inRights, inFuncPointer);
		
}//end gCheckRights

function gCheckRightsLowSec(inRights, inFuncPointer)
{
	
	gCheckRightsCore("/data/CheckRights_LowSec.aspx", inRights, inFuncPointer);
	
	
}//end gCheckRightsLowSec

function gCheckRightsCore(inURL, inRights, inFuncPointer)
{
	if (inRights.length > 0)
	{
		var sFormData = "fRightsToCheck=" + inRights;
		
		$.post(inURL, sFormData, function(inData) {
			
			var result = $(inData);
			
			if (result.find("check").text() == "Valid")
				inFuncPointer(true);
			else
				inFuncPointer(false);
			
		});//end post
				
	}//end if

}//end gCheckRightsCore



// XML Extractors =========================================================================

function gGetErrorFromXMLData(inAjaxDataObj){
	
	var sError = gExtractTagValue("error", inAjaxDataObj);
	
	return sError;	
	
}//end gGetErrorFromXMLData


function gExtractTagValue(inTag, inAjaxDataObj)
{
	
	if (inTag.length == 0 || inAjaxDataObj == null)
		return "";
	
	var sValue = "";
	
	var node = $(inAjaxDataObj).find(inTag);
	
	// Cut it down to size...
	if (node.length > 1)
	{
		node = node.slice(0,1);		
		
	}//end if	
	
	// If we found something, grab the value and pass it back.
	if (node.length == 1)
		sValue = node.text();
		
	return sValue;
	
}//end gExtractTagValue

function gExtractSuccessValue( inAjaxDataObj )
{
	var sSuccess = gExtractTagValue("status", inAjaxDataObj);
			
	var sTempID = "";
			
	var iStart = sSuccess.indexOf("(") + 1;
	var iEnd = sSuccess.lastIndexOf(")");
	
	if (iEnd == -1)
		iEnd = sSuccess.length-1;
	
	if (iStart > 0)
		sTempID = sSuccess.substring(iStart, iEnd);
	
	return sTempID;
	
}//end gExtractSuccessValue


function gGetQueryStringValue(inVarName) {
	
	var sWork = window.location.href;
	var sVarNameToken = inVarName + "=";
	
	if (sWork.indexOf(sVarNameToken) > -1)
	{
		sWork = sWork.substring(sWork.indexOf(sVarNameToken) + sVarNameToken.length);
		
		if (sWork.indexOf("&") > -1)
			sWork = sWork.substring(0, sWork.indexOf("&"));
		else if (sWork.indexOf("#") > -1)
			sWork = sWork.substring(0, sWork.indexOf("#"));
		
	}//end if
	else
		sWork = "";
	
	return sWork;
	
}//end gGetQueryStringValue

function gWrapProcessLink(inConfirmMsg, inDest) {
	
	if (bInProcess)
	{
		if (confirm(inConfirmMsg))
			document.location.href = inDest;
	
	}//end if

}//end gWrapProcessLink

function gWrapProcessLinkFunc( inConfirmMsg, inFuncPtr ) {
	
	if (bInProcess)
	{
		if (confirm(inConfirmMsg))
			inFuncPtr();
			
	}//end if
	
}//end gWrapProcessLinkFunc

// Form Functions ==============================================================

// Wrapper for some repetitive tasks.
function gSelectMenuItem(inFormID, inMenuID, inValue) {
	
	var menu = null;
	var sValue = "" + (inValue == null ? "" : inValue);
	
	if (gIsIE && gBrowserMajVer < 7)
	{
		if (inFormID != null && inFormID != "")
		{
			menu = document.forms[inFormID].elements[inMenuID];
	
			if (menu == null)
				return false;
			
		}//end if
		else
			menu = document.getElementById(inMenuID);
			
		for(var i=0; i < menu.options.length; i++)
		{	
			if (menu.options[i].value.toLowerCase() == sValue.toLowerCase())
			{
				menu.options[i].selected = true;
				return true;
			}//end if
		}//end for
			
	}//end if
	else
	{
		$("#" + inMenuID + " option[value=" + sValue + "]").attr("selected", "selected");
		return true;
		
	}//end else
		
	return false;
	
}//end gSelectMenuItem

function gSelectMenuItemByText(inFormID, inMenuID, inText) {
	
	var menu = null;
	var sText = "" + (inText == null ? "" : inText);
	
	if (gIsIE && gBrowserMajVer < 7)
	{
		if (inFormID != null && inFormID != "")
		{
			menu = document.forms[inFormID].elements[inMenuID];
	
			if (menu == null)
				return false;
			
		}//end if
		else
			menu = document.getElementById(inMenuID);
			
		for(var i=0; i < menu.options.length; i++)
		{	
			if (menu.options[i].text.toLowerCase() == sText.toLowerCase())
			{
				menu.options[i].selected = true;
				return true;
			}//end if
		}//end for
			
	}//end if
	else
	{
		$("#" + inMenuID + " option[value=" + sText + "]").attr("selected", "selected");
		return true;
		
	}//end else
		
	return false;
	
}//end gSelectMenuItemByText


// Could use a text version of these (where it pulls the text, not the values:
function gGetSelectValueByID(inID)
{
	
	// For IE 6, we need to go old school since it doesn't like CSS selectors.
	if (gIsIE && gBrowserMajVer == 6)
	{
		var object = document.getElementById(inID);
		
		if (object != null)
			return gGetSelectValue(object);
		else
			return "";
			
	}//end if
	else
	{
		if ($("#" + inID + " option").length > 0)
			return $("#" + inID + " option:selected").val();
		else
			return "";
		
	}//end else

}//end gGetSelectValueByID

function gGetSelectTextByID(inID)
{
	
	// For IE 6, we need to go old school since it doesn't like CSS selectors.
	if (gIsIE && gBrowserMajVer == 6)
	{
		var object = document.getElementById(inID);
		
		if (object != null)
			return gGetSelectText(object);
		else
			return "";
			
	}//end if
	else
	{
		if ($("#" + inID + " option").length > 0)
			return $("#" + inID + " option:selected").text();
		else
			return "";
		
	}//end else

}//end gGetSelectTextByID

function gGetSelectValue(inSelectObj)
{
	var iSelection = -1;
	
	if (inSelectObj == null)
		return "";
	
	if (inSelectObj.selectedIndex)
		iSelection = inSelectObj.selectedIndex;
	
	if (inSelectObj.options && iSelection > -1)
		return inSelectObj.options[iSelection].value;
	else
		return "";


}//end gGetSelectValue


function gGetSelectText(inSelectObj)
{
	var iSelection = -1;
	
	if (inSelectObj == null)
		return "";
	
	if (inSelectObj.selectedIndex)
		iSelection = inSelectObj.selectedIndex;
	
	if (inSelectObj.options && iSelection > -1)
		return inSelectObj.options[iSelection].text;
	else
		return "";


}//end gGetSelectText

// Selects a drop-down option via ID by value.
function gSetSelectedByIDValue(inID, inValue)
{
	gSelectMenuItem(null, inID, inValue);

}//end gGetSelectValueByID

// Radio ==========================
function gGetRadioValueByName(inName)
{
	var elements = document.getElementsByName(inName);
	
	for(var i=0; i < elements.length; i++)
	{
		if (elements[i].checked)
		{
			return gGetRadioValue(elements[i]);
			
		}//end if
	}//end for
	
	return "";
	
}//end gGetRadioValueByName

function gGetRadioValueByID(inID)
{
	var object = document.getElementById(inID);
	
	if (object != null)
		return gGetRadioValue(object);
	else
		return "";
		
}//end gGetRadioValueByID

function gGetRadioValue(inRadioObj)
{
	var sSelection = "";
	
	if (inRadioObj == null)
		return "";
	
	var radio = inRadioObj;
	
	if (radio.length != null)
	{
		for(var i=0; i < radio.length; i++)
		{		
			if (radio[i].checked)
			{
				sSelection = radio[i].value;
				break;
			}//end if
		}//end for
	}//end if
	else if (radio.checked)
		sSelection = radio.value;
	
	return sSelection;
	
}//end gGetRadioValue



// Call this to submit the current page's form data to the current form action attribute.
function gProcessFormSubmit(inFormID, inCallback) {
	
	var formID = inFormID;
	
	if (formID.indexOf("#") <= -1)
		formID = "#" + inFormID
		
	var f = $("form" + formID);
	
	if (f == null)
		return;
		
	var action = f.attr("action");
	
	gProcessAjaxForm(inFormID, action, inCallback);

}//end gProcessFormSubmit

// Call this to customize where you want to submit the data.
function gProcessAjaxForm(inFormID, inAction, inCallback) {
	
	gProcessAjaxFormSync( inFormID, inAction, inCallback, false );
	
}//end gProcessAjaxForm


function gProcessAjaxFormSync(inFormID, inAction, inCallback, inSync) {
	
	var formID = inFormID;
	
	if (formID.indexOf("#") <= -1)
		formID = "form#" + inFormID
	else
		formID = inFormID;	// Allows overrides.
		
	var f = $(formID);
	
	if (f == null)
		return;
	
	var sURL = inAction;
	var formdata = f.serialize();
	var bHandled = false;
	
	
	$.ajax({ type: "POST", url: sURL, data: formdata, async: inSync, success: function(data) {

	// $.post(action, formdata, function(data) {
		
		var doc = $(data);
		var sError = "";
		
		doc.find("error").each( function () {
			
			sError = sError + $(this).text();
						
		});//end each	
		
		if (inCallback != null)
		{
			 inCallback( data, sError );
			 
		}//end if
		
	//});//end post
	
	},	// end success function,
	error: function(xmlrequest, text, ex) {
		
		var sError = "";
		var bShowSupportInfo = false;
		var bSuppress = false;
		
	
		switch(xmlrequest.status)
		{
			case 500:
			case 501:
			case 502:
			case 503:
				
				sError = "A server error occurred. Our team has been notified of the error.";
				bShowSupportInfo = true;
				
				break;
			
			case 404:
				
				sError = "We were unable to find the following resource. Please contact support at " + sSupportContact + 
							"\r\n\r\nDetails: " + sURL;
				
				break;
				
			case 0:
				// Hide this for now...it's generated when a user clicks out of a page before an Ajax call gets to complete.
				bSuppress = true;
				
				
				break;
				
			default:
				sError = "An unknown error has occured. Please contact support at " + sSupportContact + ".";
				
				sError += "\r\n\r\n[" + xmlrequest.status + "] : " + xmlrequest.statusText;
				
				if (text != null && text != "error")
					sError = sError + "\r\n\r\n" + text;
				else if (ex != null)
					sError = sError + "\r\n\r\n" + ex;
				break;
				
				sError += "\r\n\r\n[999]";
				
		}//end switch
		
		if (bSuppress)
			return;
			
		if (bShowSupportInfo)
			sError += "\r\n\r\nIf this error persists, please contact support at " + sSupportContact + ".";
				
		if (inCallback != null)
		{			
			inCallback( "", sError );
			 
		}//end if
		else
			alert(sError);
		
	}	//end error function
	});//end ajax
	
	
}//end gProcessAjaxFormSync

// Call this to customize where you want to submit the data.
function gProcessAjaxGet(inURL, inCallback) {
	
	
	gProcessAjaxGetSync(inURL, inCallback, true);
	
		
}//end gProcessAjaxGet

function gProcessAjaxGetSync(inURL, inCallback, inSync) {
	
	var sURL = inURL;
	var bHandled = false;
	
	$.ajax({ type: "GET", url: sURL, async: inSync, success: function(data) {
		
		var doc = $(data);
		var sError = "";
		
		doc.find("error").each( function () {
			
			sError = sError + $(this).text();
						
		});//end each
		
		if (inCallback != null)
		{
			 inCallback( data, sError );
			 
		}//end if
		
	},	// end success function,
	error: function(xmlrequest, text, ex) {
		
		var sError = "";
		var bShowSupportInfo = false;
		var bSuppress = false;
		
				
		switch(xmlrequest.status)
		{
			case 500:
			case 501:
			case 502:
			case 503:
				
				sError = "A server error occurred. Our team has been notified of the error.";
				bShowSupportInfo = true;
				
				break;
			
			case 404:
				
				sError = "We were unable to find the following resource. Please contact support at " + sSupportContact + 
							"\r\n\r\nDetails: " + sURL;
				
				break;
			
			case 0:
				// Hide this for now...it's generated when a user clicks out of a page before an Ajax call gets to complete.
				bSuppress = true;
				
				break;
			
			default:
				sError = "An unknown error has occured. Please contact support at " + sSupportContact + ".";
				
				sError += "\r\n\r\n[" + xmlrequest.status + "] : " + xmlrequest.statusText;
				
				if (text != null && text != "error")
					sError = sError + "\r\n\r\n" + text;
				else if (ex != null)
					sError = sError + "\r\n\r\n" + ex;
				break;
				
				sError += "\r\n\r\n[999]";
				
		}//end switch
		
		if (bSuppress)
			return;
			
			
		if (bShowSupportInfo)
			sError += "\r\n\r\nIf this error persists, please contact support at " + sSupportContact + ".";
				
		if (inCallback != null)
		{			
			inCallback( "", sError );
			 
		}//end if
		else
			alert(sError);
		
	}	//end error function
	});//end ajax

}//end gProcessAjaxGetSync

// Call this to customize where you want to submit the data.
function gDoTextGet(inURL, inCallback) {
	
	gDoTextGetSync(inURL, inCallback, true);
	
		
}//end gDoTextGet

function gDoTextGetSync(inURL, inCallback, inSync) {
	
	var sURL = inURL;
	var bHandled = false;
	
	$.ajax({ type: "GET", url: sURL, async: inSync, success: function(data) {
		
		if (inCallback != null)
		{
			 inCallback( data, "" );
			 
		}//end if
		
	},	// end success function,
	error: function(xmlrequest, text, ex) {
		
		var sError = "";
		var bShowSupportInfo = false;
		var bSuppress = false;
		
				
		switch(xmlrequest.status)
		{
			case 500:
			case 501:
			case 502:
			case 503:
				
				sError = "A server error occurred. Our team has been notified of the error.";
				bShowSupportInfo = true;
				
				break;
			
			case 404:
				
				sError = "We were unable to find the following resource. Please contact support at " + sSupportContact + 
							"\r\n\r\nDetails: " + sURL;
				
				break;
			
			case 0:
				// Hide this for now...it's generated when a user clicks out of a page before an Ajax call gets to complete.
				bSuppress = true;
				
				break;
			
			default:
				sError = "An unknown error has occured. Please contact support at " + sSupportContact + ".";
				
				sError += "\r\n\r\n[" + xmlrequest.status + "] : " + xmlrequest.statusText;
				
				if (text != null && text != "error")
					sError = sError + "\r\n\r\n" + text;
				else if (ex != null)
					sError = sError + "\r\n\r\n" + ex;
				break;
				
				sError += "\r\n\r\n[999]";
				
		}//end switch
		
		if (bSuppress)
			return;
			
			
		if (bShowSupportInfo)
			sError += "\r\n\r\nIf this error persists, please contact support at " + sSupportContact + ".";
				
		if (inCallback != null)
		{			
			inCallback( "", sError );
			 
		}//end if
		else
			alert(sError);
		
	}	//end error function
	});//end ajax

}//end gDoTextGetSync


function gProcessReportError(inError, inDisplayAlert, inErrorElementID)
{
	if (inError == null)
		return false;
	
	if (inError != "" && inError.length > 0)
	{
		if (inDisplayAlert)
			alert(inError);
		
		if (inErrorElementID != null)
		{
			if ($("form").find(inErrorElementID).length > 0)
				$("form").find(inErrorElementID).html(inError);
				
		}//end if
		
		return true;
		
	}//end if
	
	return false;
	
}//end gProcessReportError

function gClearDefault(inFieldObj, inDefault, inCaseSensitive)
{
	var sDefault = "" + inDefault;
	
	
	if (inFieldObj == null)
		return;
	
	if (!inCaseSensitive)
	{
		if (inFieldObj.value.toLowerCase() == sDefault.toLowerCase())
			inFieldObj.value = "";
	}//end if
	else
	{
		if (inFieldObj.value == sDefault)
			inFieldObj.value = "";
	}//end else

}//end gClearDefault

function gApplyDefaultBlur(inFieldObj, inDefault)
{
	
	if (inFieldObj == null)
		return;
	
	if (inFieldObj.value == "")
		inFieldObj.value = inDefault;
	
}//end gApplyDefaultBlur

function gUpdateDayField(inFieldObj) 
{
	var iMonth = 0;
	var iDaysInMonth = 0;
	var iYear = 0;
	var sWork = "";
	
	if (inFieldObj == null)
		return;
		
	var sFieldName = inFieldObj.id;
		
	if (sFieldName.indexOf("Month") > -1)
	{
		sFieldName = sFieldName.substring(0, sFieldName.indexOf("Month"));
		
		iMonth = parseInt(inFieldObj.options[inFieldObj.selectedIndex].value, 10);
		if (isNaN(iMonth))
			iMonth = 0;
		
		// Grab the year
		iYear = parseInt($("#" + sFieldName + "Year").val(), 10);
		if (isNaN(iYear))
			iYear = 0;
		
	}//end if
	else if (sFieldName.indexOf("Year") > -1)
	{
		sFieldName = sFieldName.substring(0, sFieldName.indexOf("Year"));
		
		if (inFieldObj.value.length <  4)
			return;
			
		iYear = parseInt(inFieldObj.value, 10);
		if (!isNaN(iYear))
		{
			// Grab the month if we can
			var oMenu = $("#" + sFieldName + "Month");
			
			sWork = oMenu.find("option:selected").val();
			iMonth = parseInt(sWork, 10);
			if (isNaN(iMonth))
				iMonth = 0;
		}//end if
		else
			iYear = 0;
		
	}//end else if
	else
		return;
	
	switch(iMonth)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			iDaysInMonth = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			iDaysInMonth = 30;
			break;
		case 2:	// Feb
			iDaysInMonth = 28;
			
			// If the year is divisible by 4, we need to check for leap years
			if ((iYear % 4) == 0)
			{
				// If a leap year doesn't fall on a century, then it's just a straight 29 days
				if ((iYear % 100) > 0)
				{
					iDaysInMonth = 29;
					
				}//end if
				else
				{
					// If it does, then we only worry about years that are divisible by 400
					if ((iYear % 400) == 0)
						iDaysInMonth = 29;
					
					
				}//end else
			}//end if
			
			alert(iDaysInMonth);
			
			break;
		default:
			// Failsafe:
			if (iYear > 0)
				iDaysInMonth = 31;
			else
				iDaysInMonth = 0;
			break;
	}//end switch
	
	
	sFieldName = sFieldName + "Day";
	
	var oDayMenu = $("#" + sFieldName);
	var iCurrSel = parseInt($("#" + sFieldName + " option:selected").val(), 10);
	
	if (isNaN(iCurrSel))
		iCurrSel = 0;
	
	if (iCurrSel > iDaysInMonth)
		iCurrSel = iDaysInMonth;
	
	oDayMenu.html('<option value=""' + (iCurrSel == 0 ? ' selected' : ' ') + '>DD</option>');
	
	for(var i=1; i <= iDaysInMonth; i++)
	{
		var sDisplay = "0" + i;
		var sHTML = '<option value="' + i + '"' + (iCurrSel == i ? ' selected' : ' ') + 
					'>' + sDisplay.substring(sDisplay.length - 2) + '</option>\r\n';
				
		oDayMenu.append(sHTML);
		
	}//end for
	
	
}//end gUpdateDayField


function gRenderInfoAlert(inFieldID, inHTML)
{
	var elem = $("#" + inFieldID);
	var bWriteNew = true;
	
	if (elem == null)
		return;
	
	if (elem.attr("class").indexOf("ui-widget") > -1)
	{
		if (elem.html().indexOf("ui-state-highlight") > -1)
		{
			elem.find("#InfoMsg").html(inHTML);
			bWriteNew = false;
			
		}//end if
		else
			elem.html("").removeClass("ui-widget");
	
	}//end if
	
	if (bWriteNew)
	{
		elem.addClass("ui-widget");
		
		elem.html('<div class="ui-state-highlight ui-corner-all" style="padding: 0 .7em;">' + 
					'<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>' + 
					'<span id="InfoMsg">' + inHTML + '</span></p>' + 
					'</div>');
	}//end else
	
	elem.show();
	
}//end gRenderInfoAlert

function gRenderError(inFieldID, inHTML)
{
	var elem = $("#" + inFieldID);
	var bWriteNew = true;
	
	if (elem == null)
		return;
	
	if (elem.attr("class").indexOf("ui-widget") > -1)
	{
		if (elem.html().indexOf("ui-state-error") > -1)
		{
			elem.find("#ErrorMsg").html(inHTML);
			bWriteNew = false;
			
		}//end if
		else
			elem.html("").removeClass("ui-widget");
	
	}//end if
	
	if (bWriteNew)
	{
		elem.addClass("ui-widget");
		
		elem.html('<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">' + 
					'<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>' + 
					'<span id="ErrorMsg">' + inHTML + '</span></p>' + 
					'</div>');
	}//end else
	
	elem.show();
	
}//end gRenderError


// Loaders ==========================================================================

//function gLoadCatListXML(inData, inError)
//{
//	if (gProcessReportError(inError, true, null))
//			return;
//	
//	sCatListXML = inData;
//	
//	
//}//end gLoadCatListXML


//function gLoadCountryListXML(inData, inError)
//{
//	if (gProcessReportError(inError, true, null))
//			return;
//	
//	sCountriesXML = inData;

//}//end gLoadCountryListXML


	


function gLoadCountryList(inFormFieldID, inStartingValue, inContinentFilter) {
	
	 gLoadCountryListEx(inFormFieldID, inStartingValue, inContinentFilter, null);
	
}//end gLoadCountryList

function gLoadCountryListEx(inFormFieldID, inStartingValue, inContinentFilter, inCallback) {
		
	gMakeCountryDropDown( inFormFieldID, inStartingValue, gExtractCountryList(true, inContinentFilter), true );
	
	if (inCallback != null && inCallback != "undefined")
		inCallback(inFormFieldID);
	
}//end gLoadCountryListEx

function gMakeContinentDropDown( inFormFieldID, inStartingValue, inCountriesList)
{
	gMakeCountryDropDown( inFormFieldID, inStartingValue, inCountriesList, false );

}//end gMakeContinentDropDown

function gMakeCountryDropDown( inFormFieldID, inStartingValue, inCountriesList, isCountryList )
{
	var sTemp = "";
	var sCountryID = "";
	var sCOuntryName = "";
	
	for(var i=0; i < inCountriesList.length; i++)
	{		
		sCountryID = inCountriesList[i];
		
		if (sCountryID.indexOf("|") > -1)
		{
			sCountryName = sCountryID.substring(sCountryID.indexOf("|")+1);
			sCountryID = sCountryID.substring(0, sCountryID.indexOf("|"));
			
		}//end if
		else
			sCountryName = sCountryID;
		
		
		sTemp = sTemp + '<option value="' + sCountryID + '"';
		
		if (inStartingValue == sCountryID)
			sTemp = sTemp + ' selected';
		
		sTemp = sTemp + '>' + sCountryName + '</option>\r\n';
					
	}//end for
	
	sTemp = '<option value="" class="empty">' + (isCountryList ? 'Select Country' : 'Select Continent') + '</option>\r\n' + sTemp;
	
	$("#" + inFormFieldID).html(sTemp);
	
}//end gMakeCountryDropDown

function gExtractCountryList(inShowAll, inContinentFilter)
{
	var aWork = new Array();
	var sContinentFilter = inContinentFilter;
	//var data = $(gParseXML(sCountriesXML));
	var data = gCountries;
	
	//data.find("Country").each(function() { 
	for(var i=0; i < data.length; i++)
	{
	
//		var sCountryID = $(this).find("CountryID").text();
//		var sCountryName = $(this).find("CountryName").text();
//		var sCountryContinent = $(this).find("CountryContinent").text();
//		var sCountryDisplayFlag = $(this).find("CountryDisplayed").text();

		var sCountryID = data[i].ID;
		var sCountryName = data[i].Name;
		var sCountryContinent = data[i].ContinentName;
		var sCountryDisplayFlag = data[i].Displayed;
		
		if ( (inShowAll || (!inShowAll && sCountryDisplayFlag == "1")) &&
			(sContinentFilter.length == 0 || 
					(sContinentFilter.length > 0 && sContinentFilter == sCountryContinent)) )
			aWork[aWork.length] = sCountryID + "|" + sCountryName;
		
	//});//end each
	}//end for
	
	return aWork;
	
}//end gExtractCountryList

function gExtractContinents()
{
	var aWork = new Array();
	
	//var data = $(gParseXML(sCountriesXML));
	var data = gCountries;
	
//	data.find("Country").each(function() { 
	for(var i=0; i < data.length; i++)
	{
	
		//var sContinent = $(this).find("CountryContinent").text();
		var sContinent = data[i].ContinentName;
		
		var bFound = false;
		
		for(var j=0; j < aWork.length; j++)
		{
			if (aWork[j] == sContinent)
			{
				bFound = true;
				break;
			}//end if
		}//end for
		
		if (!bFound)
			aWork[aWork.length] = sContinent;
				
	//});//end each
	}//end for
	
	
	return aWork;
	
}//end gExtractContinents

function gLoadStateList(inFormFieldID, inCountryID, inStartingValue) {
	
	gLoadStateListEx(inFormFieldID, inCountryID, inStartingValue, null);
	
}//end gLoadStateList

function gLoadStateListEx(inFormFieldID, inCountryID, inStartingValue, inCallback) {
	
//	gProcessAjaxGet(gURLNoCache("/data/GetStateList.aspx?fCID=" + inCountryID), 
//		function (inData, inError){
//	
//			gProcessStateList(inData, inError, inFormFieldID, inStartingValue, inCallback);
//		
//	});	//end

	gProcessStateList(inFormFieldID, inCountryID, inStartingValue, inCallback);
	
}//end gLoadStateListEx


//function gProcessStateList(inData, inError, inFormFieldID, inStartingValue, inCallback)
function gProcessStateList(inFormFieldID, inCountryID, inStartingValue, inCallback)
{
//	var x = typeof(inData);

//	var temp;
//	
//	if (x == "string")
//		temp = $(gParseXML(inData));
//	else
//		temp = $(inData);
	
	var iCountryID = gGetIntFromDB(inCountryID);
	var data = gStates;
	
	var fCallbackFunction = inCallback;
	
	var sTemp = "";
	
	//temp.find("State").each( function () {
	for(var i=0; i < data.length; i++)
	{
		if (data[i].CountryID == iCountryID)
		{
//			var sStateID = $(this).find("StateID").text();
//			var sStateName = $(this).find("StateName").text();
			var sStateID = "" + data[i].ID;
			var sStateName = data[i].Name;
			
			sTemp = sTemp + '<option value="' + sStateID + '"';
			
			if (inStartingValue == sStateID)
				sTemp = sTemp + ' selected';
			
			sTemp = sTemp + '>' + sStateName + '</option>\r\n';
			
		}//end if
		
//	});//end each
	}//end for
	
	if (sTemp.length > 0)
	{
		sTemp = '<option value="" class="empty">Select State</option>\r\n' + sTemp;
		
		$("#" + inFormFieldID).html(sTemp);	
		
		$("#" + inFormFieldID).attr("disabled", "");
		
	}//end if
	else
	{
		sTemp = '<option value="">None</option>\r\n';
		
		$("#" + inFormFieldID).html(sTemp);		
		
		$("#" + inFormFieldID).attr("disabled", "disabled");
		
	}//end else
	
	if (fCallbackFunction != null && fCallbackFunction != "undefined")
		fCallbackFunction(inFormFieldID);
		


}//end gProcessStateList


function gLoadSportList(inFormFieldID, inStartingValue)
{
	
	gProcessAjaxGet(gURLNoCache("/data/GetSportsList.aspx"), function (inData, inError){
		
	var temp = $(inData);		
	var sTemp = "";
	
	//-------------------------------------
	temp.find("Sport").each( function () {
			
			var sSportID = $(this).find("SportID").text();
			var sSportName = $(this).find("SportName").text();
			
			sTemp = sTemp + '<option value="' + sSportID + '"';
			
			if (inStartingValue == sSportID)
				sTemp = sTemp + ' selected';
			
			sTemp = sTemp + '>' + sSportName + '</option>\r\n';
						
		});//end each
		
		if (sTemp.length > 0)
		{
			sTemp = '<option value="" class="empty">Select Sport</option>\r\n' + sTemp;
			
			$("#" + inFormFieldID).html(sTemp);	
			
			$("#" + inFormFieldID).attr("disabled", "");
			
		}//end if
		else
		{
			sTemp = '<option value="">None</option>\r\n';
			
			$("#" + inFormFieldID).html(sTemp);		
			
			$("#" + inFormFieldID).attr("disabled", "disabled");
			
		}//end else
	
	});
	
}//end gLoadSportList

function gLoadCaptcha(inFieldPrefix, inGuid) {
	
	gProcessAjaxGet("/data/account/GetCaptcha.aspx?captchaID=" + inGuid, function(inData, inError) {
		
		var temp = $(inData);
		
		temp.find("Captcha").each( function() {
			
			var sQues = temp.find("CaptchaQuestion").text();
			var sResp1 = temp.find("CaptchaResponse1").text();
			var sResp2 = temp.find("CaptchaResponse2").text();
			var sResp3 = temp.find("CaptchaResponse3").text();
			
			var sGUID = temp.find("GUID").text();
			
			$("#fCaptchaID").val(temp.find("CaptchaID").text());
			
			$("#CaptchaQuestion").text(sQues);
			
			$("#fCaptchaGUID").val(sGUID);
			
			if (sResp2.length == 0 && sResp3.length == 0)
			{
				$("#fCaptchaResponseMulti").hide();
				$("#fCaptchaResponseSingle").show();
				
				$("#fCaptchaResponseSingle").val("");
				
			}//end if
			else
			{
				$("#fCaptchaResponseSingle").hide();
				
				$("#fCaptchaResponseMulti").show();
				
				$("#fCaptchaResponseMulti").html('<option value="" selected></option>');
				
				$("#fCaptchaResponseMulti").append('<option value="' + sResp1 + '">' + sResp1 + '</option>\r\n');
				$("#fCaptchaResponseMulti").append('<option value="' + sResp2 + '">' + sResp2 + '</option>\r\n');
				if (sResp3.length > 0)
					$("#fCaptchaResponseMulti").append('<option value="' + sResp3 + '">' + sResp3 + '</option>\r\n');
				
			}//end else
			
		});//end each		
		
	});//end get
	
	
	
}//end gLoadCaptcha

//	function LoadInfoBarData(inData, inError)
//	{
//		if (gProcessReportError(inError, true, ""))
//			return;
//			
//		var work = $(inData);
//		
//		var sName = work.find("Name").text();
//		
//		if (sName.length > 0)
//		{
//			sName = "Welcome, " + sName + "!";
//			
//			$("#UserInfoName").html(sName);
//			
//		}//end if
//		
//		gLoadShoppingCartCount();
//		
//	}//end LoadInfoBarData


function gLoadUserSession(inCheckLogin)
{
	if (inCheckLogin)
	{
	
		var data = gUInfo;
		
		if (data != null)
		{
			var sUserID = data.UserID;
			
			gbUserLoggedIn = (sUserID.length > 0);
			
			var sName = gUInfo.FirstName;
			
			if (sName.length > 0)
			{
				sName = "Welcome, " + sName + "!";
				
				$("#UserInfoName").html(sName);
				
			}//end if
			
			var sInboxCount = gUInfo.InboxCount;

			if(sInboxCount.length>0 && sInboxCount!="0")
			{
				$("#fNavInboxCount").text("("+sInboxCount+")");
			}
			else
			{
				$("#fNavInboxCount").text("");
			}
			
			
		}//end if
	}//end if
	
	gLoadShoppingCartCount();
	
	gLoadSearchBySportList();
	
//	gLoadSearchByLocationList();
	
}//end gLoadUserSession


// START Shopping Cart =============================================================
function gLoadShoppingCartCount()
{
	var iItems = gGetShoppingCartCount();
	
	if ($("#ShoppingCartLink").length == 0)
		return;
	
	if (iItems <= 0)
	{
		$("#ShoppingCartLink").hide();
			
	}//end if
	else
	{
		var sDisplay = "";
		
		if (iItems <= 0)
			sDisplay = "Empty";
		else 
			sDisplay = iItems + (iItems == 1 ? " item" : " items");
		
		$("#ShoppingCartItemsLabel").html(sDisplay);
		$("#ShoppingCartLink").show();
		
	}//end else
	
}//end gLoadShoppingCartCount

function gGetShoppingCartCount()
{
	var sItemCount = gCookieTake("SCartItems");
	var iItemCount = 0;
	//var sTest = gCookieTake("IMAEventReg");
	//var bRegExists = (sTest != null && sTest != "");
	
	iItemCount = gGetIntFromDB(sItemCount);
	
	// Can't exactly do this right now. The IMAEventReg cookie is secure so we're not reading it right.
	//if (!bRegExists || iItemCount <= 0)
	if (iItemCount <= 0)
		return 0;
	else
		return iItemCount;
	
}//end gGetShoppingCartCount


// Updates the value we use and the actual UI's shopping cart item count display
function gSetShoppingCartCounter(inItemCount)
{
	var iCount = 0;
	var iPrevCount = 0;
	
	if (inItemCount != null)
	{
		if (typeof(inItemCount) == "string")
			iCount = gGetIntFromDB(inItemCount);
		else
			iCount = inItemCount;
	}//end if
	
	iPrevCount = gGetIntFromDB(gCookieTake("SCartItems"));
	
	// Set the cookie if needed.
	if (iPrevCount != iCount)
		gCookieMake("SCartItems", "" + iCount, giCartCookieLife);
	
	// Reuse the loading call.
	gLoadShoppingCartCount();
	
}//end gSetShoppingCartCounter

// END Shopping Cart =============================================================





function gLoadSearchBySportList()
{
	var sOutput = '';
	
	var results = ExtractCategories(1, "", "");
	
	for (var i=0; i < results.Results.length; i++)
	{
		sOutput = sOutput + '<li><a href="' + 
				gURLNoCache('/events/EventSearch.aspx?fSp1=' + escape(results.Results[i]) ) + 
				'">' + results.Results[i] + '</a></li>';
		
	}//end for
	
	$(".SearchBySportList").html(sOutput);
	
	
}//end gLoadSearchBySportList

function gLoadSearchByLocationList()
{
	
	var sOutput = '';
	
	var aContinents = gExtractContinents();
	
	
	for (var i=0; i < aContinents.length; i++)
	{
		sOutput = sOutput + '<li><a href="' + 
					gURLNoCache('/events/EventSearch.aspx?fLocCon=' + aContinents[i])  
					+ '">' + aContinents[i] + '</a></li>';
		
	}//end for
	
	
	$(".SearchByLocationList").html(sOutput);
	
	
}//end gLoadSearchBySportList



// Event Category Functions =======================================================

function CategoryResults () {
	this.HasChildren = false;
	this.Results = new Array();
	this.ResultIDs = new Array();
}

function ExtractCategories(inLevel, inLevel1Filter, inLevel2Filter)
{
	var data = gSports;
		
	var bHasChildren = false;
	var aResults = new Array();
	var aResultIDs = new Array();
	
	if (data != null)
	{
		for(var x=0; x < data.length; x++)
		{
			
//			var sSport1 = $(this).find("EventCategoryLevel1").text();
//			var sSport2 = $(this).find("EventCategoryLevel2").text();
//			var sSport3 = $(this).find("EventCategoryLevel3").text();
//			var sSportID = $(this).find("EventCategoryID").text();
			
			var sSport1 = data[x].Level1Name;
			var sSport2 = data[x].Level2Name;
			var sSport3 = data[x].Level3Name;
			var sSportID = data[x].ID;
			
			sSport1 = sSport1.replace("&", "&amp;");
			sSport2 = sSport2.replace("&", "&amp;");
			sSport3 = sSport3.replace("&", "&amp;");
			
			var bFound = false;
			var sDataToFilter = "";
			
			if (inLevel == 1)
			{
				
				// Only thing to do here is grab the top level stuff.
				if (sSport1.length > 0)
				{
					for(var i=0; i < aResults.length; i++)
					{
						if (aResults[i] == sSport1)
						{
							bFound = true;
							break;
						}//end if
					}//end for
					
					if (!bFound)
					{
						aResults[aResults.length] = sSport1;
						aResultIDs[aResultIDs.length] = sSportID;
					}//end if
					
					if (!bHasChildren && sSport2.length > 0)
						bHasChildren = true;
					
				}//end if
			}//end level 1 if
			else if (inLevel == 2) // level 2
			{
				var sTest = inLevel1Filter.replace("&", "&amp;");
			
				if ( (sTest.length == 0 || 
					(sTest.length > 0 && sSport1 == sTest)) &&
					sSport2.length > 0 )
				{
					
					for (var i=0; i < aResults.length; i++)
					{
					
						if (aResults[i] == sSport2)
						{
							bFound = true;
							break;
						}//end if
					}//end for
					
					
					if (!bFound)
					{
						aResults[aResults.length] = sSport2;
						aResultIDs[aResultIDs.length] = sSportID;
					}//end if
					
					if (!bHasChildren && sSport3.length > 0)
						bHasChildren = true;
					
				}//end if
			}//end level 2 else
			else if (inLevel == 3) // Level 3
			{
				var sTest = inLevel1Filter.replace("&", "&amp;");
				var sTest2 = inLevel2Filter.replace("&", "&amp;");
			
				if ( (sTest.length == 0 || 
					(sTest.length > 0 && sSport1 == sTest)) &&
					(sTest2.length == 0 || 
						(sTest2.length > 0 && sSport2 == sTest2)) &&
					sSport3.length > 0 )
				{
					
					for (var i=0; i < aResults.length; i++)
					{
						if (aResults[i] == sSport3)
						{
							bFound = true;
							break;
						}//end if
					}//end for
					
					if (!bFound)
					{
						aResults[aResults.length] = sSport3;
						aResultIDs[aResultIDs.length] = sSportID;
					}//end if
				
				}//end if
			
			}//end else
		//});//end each
		}//end for
	}//end if
	
	var oResults = new CategoryResults();
	oResults.HasChildren = bHasChildren;
	oResults.Results = aResults;
	oResults.ResultIDs = aResultIDs;
	
	return oResults;
	
}//end ExtractCategories



// Other Event Functions ==========================================================

function gMakeSportSearchLink(inLinkText, inCat1, inCat2, inCat3, inClass)
{
	var sURL = "/events/EventSearch.aspx?fSp1=" + escape(inCat1)  + "&fSp2=" + escape(inCat2) + "&fSp3=" + escape(inCat3);
	var sHTML = '<a href="' + gURLNoCache(sURL) + '"';
	
	if (inClass.length > 0)
		sHTML = sHTML + ' class=""';
	
	sHTML = sHTML + '>' + inLinkText + '</a>';
	
	return sHTML;

}//end MakeSportSearchLink

function gMakeLocationSearchLink(inLinkText, inCont, inCtry, inState, inCity, inClass)
{
	var sURL = "/events/EventSearch.aspx?fLocCon=" + inCont + 
			"&fLocCID=" + inCtry + "&fLocSID=" + inState + 
			"&fLocCity=" + inCity;
	var sHTML = '<a href="' + gURLNoCache(sURL) + '"';
	
	if (inClass.length > 0)
		sHTML = sHTML + ' class="' + inClass + '"';
		
	sHTML = sHTML + '>' + inLinkText + '</a>';
	
	return sHTML;

}//end MakeLocationSearchLink

// Cookies!!! ======================================================================
function gCookieMake(name,value,days) {
	var expires = "";
	
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		expires = "; expires="+date.toGMTString();
	}
	if (name == null || name == "")
		return;
	
	document.cookie = name+"="+(value != null ? value : "")+expires+"; path=/";
}

function gCookieTake(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return "";
}

function gCookieEat(name) {
	gCookieMake(name,"",-1);
}

// Looks in the main session only!
function gCookieSessionGet( inName )
{
	return gCookieSessionGetEx(gSessionKey, inName);

}//end gCookieSessionGet

function gCookieSessionGetEx( inSession, inName )
{
	var sWork = gCookieTake(inSession);
	
	var regex = new RegExp("" + inName + ":'([\\w]*)'");
	
//	alert(regex.toString() + " == " + (sWork.match(regex) == null ? "null" : sWork.match(regex)[1]));
	
	if (sWork.match(regex) == null)
		return "";
	
	var sValue = "";
	
	if (sWork.match(regex).length > 0)
		sValue = sWork.match(regex)[1];
	
	if (sValue == null)
		sValue = "";
	
	return sValue;
	
}//end gCookieSessionGetEx

// Looks in the main session only!
function gCookieSessionSet( inName, inValue )
{
	gCookieSessionSetEx(gSessionKey, inName, inValue);

}//end gCookieSessionSet

function gCookieSessionSetEx( inSession, inName, inValue )
{
	var sWork = gCookieTake(inSession);
	var rempattern = /XXPermanent:'([\w]*)'/ ;
	var remember = "";
	
	if (sWork.match(rempattern) != null && sWork.match(rempattern).length > 0)
		remember = sWork.match(rempattern)[1];
	
	var iLife = 0;
	var bPerm = (remember == sEBoolOn);
	
	var regex = new RegExp("" + inName + ":'([\\w]*)'");
	
	if (sWork.match(regex) == null)
		sWork += (sWork.indexOf(",") > -1 ? ',' : '') + inName + ':\'' + inValue + '\'';
	else
		sWork = sWork.replace(regex, inValue);
	
	switch(inSession.toLowerCase())
	{
		case "imasession":
			iLife = 0;
			break;
		case "imaeventreg":
			iLife = 7;
			bPerm = false;
			break;
		case "imaadminsession":
			iLife = 1;
			bPerm = false;
			break;
			
	}//end switch
	
	gCookieMake(inSession, sWork, (bPerm ? 365 : iLife));
	
	
}//end gCookieSessionSetEx


// Paging ======================================================================

function gMakePaging(inDivID, inPagingFunc, inPageNum, inTotalPages, inPagesToShow)
{

	var iRangeSize = 10;
	var iStart = 1;
	var iEnd = 1;
	var sWork = "";

	if (inTotalPages <= 0)
		return;
	
	if (inPagesToShow > 0)
		iRangeSize = inPagesToShow;
	
	if (iRangeSize > inTotalPages)
		iRangeSize = inTotalPages;

	if (inPageNum >= (10))
		iStart = inPageNum - (5 - 1);	// Favors the left of the nav
	else
		iStart = 1;
	
	if (iStart <= 0)
		iStart = 1;
	
	iEnd = iStart + iRangeSize - 1;
	
	
	if (iEnd > inTotalPages)
		iEnd = inTotalPages;
	
//	alert(iStart + " : " + inPagesToShow + " : " + iEnd + " : " + inTotalPages);
	
	for(var i=iStart; i <= iEnd; i++)
	{
		if (i != inPageNum)
			sWork = sWork + '<li class="PagingOn" onclick="' + inPagingFunc + '(' + i + '); return false; ">' + 
					'<a href="javascript: ' + inPagingFunc + '(' + i + ');">' + i + '</a></li>\r\n';
		else
			sWork = sWork + '<li class="PagingOff">' + i + '</li>\r\n';
	}//end for
	
	// Add "Prev" and "Next"
	if (inPageNum > 1)
	{
		sWork = '<li class="PagingPrev" onclick="' + inPagingFunc + '(' + (inPageNum-1) + ');return false;">' + 
				'<a href="javascript: ' + inPagingFunc + '(' + (inPageNum - 1) + ');">&#171; Prev</a></li>\r\n' + sWork;
	}//end if
	else
		sWork = '<li class="PagingPrevBlank">.</li>\r\n' + sWork;
	
	if (inPageNum < iEnd)
	{
		sWork = sWork + '<li class="PagingNext" onclick="' + inPagingFunc + '(' + (inPageNum+1) + ');return false;">' + 
				'<a href="javascript: ' + inPagingFunc + '(' + (inPageNum + 1) + '); ">Next &#187;</a></li>\r\n';
	}//end if
	else
		sWork = sWork + '<li class="PagingNextBlank">.</li>\r\n';
	
	sWork = '<div class="PagingWrapper"><ul class="PagingBar">' + sWork + '</ul></div>\r\n';
	$("#" + inDivID).html(sWork);	
		
}//end gMakePaging

//variant with prev/next image only
function gMakePaging2(inDivID, inPagingFunc, inPageNum, inTotalPages)
{

	var iRangeSize = 10;
	var iStart = 1;
	var iEnd = 1;
	var sWork = '<span style="white-space:nowrap;">';
	// Add "Prev" and "Next"
	if(inPageNum <= 1)
	{
		sWork += '<input disabled="disabled" type="image" src="/images/messages/btn_nextpage_lft_inactive.gif" class="ImageRollover" style="vertical-align:middle;" alt="prev" />'
	}
	else
	{
		sWork += '<input onclick="'+inPagingFunc + '(' + (inPageNum-1) + ');" type="image" src="/images/messages/btn_nextpage_lft_off.gif" class="ImageRollover" style="vertical-align:middle;" alt="prev" />'
	}
	if(inPageNum >= inTotalPages)
	{
		sWork += '<input disabled="disabled" type="image" src="/images/messages/btn_nextpage_rt_inactive.gif" class="ImageRollover" style="vertical-align:middle;" alt="prev" />'
	}
	else
	{
		sWork += '<input onclick="'+inPagingFunc + '(' + (inPageNum+1) + ');" type="image" src="/images/messages/btn_nextpage_rt_off.gif" class="ImageRollover" style="vertical-align:middle;" alt="prev" />'
	}

	sWork += '</span>';
	$("#" + inDivID).html(sWork);	
		
}//end gMakePaging2


// Participation Wizard Code ===========================================================

function gParticipatedWizard(inEventID, inDateString)
{
	document.location.href="/events/EventParticipatedWizard.aspx?fEID=" + inEventID + "&fDate=" + inDateString;
	
}//end gParticipatedWizard

function gRegisterForEvent(inEventID)
{
	document.location.href= gURLNoCache("/events/EventReg/EventReg_SelectType.aspx?fEID=" + inEventID + "&fNew=1");
	
}//end gRegisterForEvent

function gViewProfile(inUserID)
{
	if (inUserID != null && inUserID != "")
		document.location.href = gURLNoCache("/account/ViewProfile.aspx?fUID=" + inUserID);
	else
		alert("No profile available for this person.");
	
}//end gViewProfile




// NOTE: This function interacts with external components!!!
function CheckPasswordStrength( inPass ){
	
	var sPass = inPass;
	
	var sBarClass = "PassStrengthBarInvalid";
	var sBarText = "PassStrengthDescInvalid";
	var sStrengthText = "Not Valid";
	
	var iScore = 0;
	var regex = /[A-Z]+/;
	
	// Plus 5 for length
	if (sPass.length >= 6)
		iScore = iScore + 5;
	
	// Plus 5 for caps
	if (regex.test(sPass))
		iScore = iScore + 5;
	
	// Plus 5 for numbers
	regex = /[0-9]+/;
	if (regex.test(sPass))
		iScore = iScore + 5;
	
	// Plus 5 for punctuation
	regex = /[!@#$%^&*()_+=\[\]{},.:]+/;
	if (regex.test(sPass))
		iScore = iScore + 5;
	
	
	if (iScore <= 5)
	{
		sBarClass = "PassStrengthBarWeak";
		sBarText = "PassStrengthDescWeak";
		sStrengthText = "Weak";
	}//end if
	else if (iScore < 15)
	{
		sBarClass = "PassStrengthBarMedium";
		sBarText = "PassStrengthDescMedium";
		sStrengthText = "Medium";
		
	}//end if
	else 
	{
		sBarClass = "PassStrengthBarStrong";
		sBarText = "PassStrengthDescStrong";
		sStrengthText = "Strong";
		
	}//end if
	
	$("#PassStrengthBar").attr("class", sBarClass);
	$("#PassStrengthDesc").attr("class", sBarText);
	$("#PassStrengthDesc").html(sStrengthText);
	
	return iScore;
	
}//end CheckPasswordStrength

// Images ============================================================================


// Profile Photo/Avatar ===========================
// For thumbnails
function gMakeUserProfileAvatar( inUserID, inPhotoID, inExt )
{
	return gMakeUserProfileAvatarEx( inUserID, inPhotoID, inExt, true );
	
}//end gMakeUserProfileAvatar

function gMakeUserProfileAvatarEx( inUserID, inPhotoID, inExt, inGender )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	if (inUserID != null && inUserID != "")
		sURL = sURL + "fUID=" + inUserID + "&fPID=" + inPhotoID + "&fExt=" + inExt + "&fUsePH=1" + "&fGen=" + ( inGender ? "1" : "0" ) + 
		"&fThumb=1";
	else
		sURL = "/images/global/imA_avatar_" + ( inGender ? "male" : "female") + "_sm.gif";
	
	
	return gURLNoCache(sURL);
	
}//end gMakeUserProfileAvatarEx

// For full sized photos:
function gMakeUserProfilePhoto( inUserID, inPhotoID, inExt )
{
	return gMakeUserProfilePhotoEx( inUserID, inPhotoID, inExt, true );
	
}//end gMakeUserProfilePhoto

function gMakeUserProfilePhotoEx( inUserID, inPhotoID, inExt, inGender )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	if (inUserID != null && inUserID != "")
		sURL = sURL + "fUID=" + inUserID + "&fPID=" + inPhotoID + "&fExt=" + inExt + "&fUsePH=1" + "&fGen=" + ( inGender ? "1" : "0" );
	else
		sURL = "/images/global/imA_avatar_male.gif";
	
	
	return gURLNoCache(sURL);
	
}//end gMakeUserProfilePhotoEx




// PHOTOS ===========================
// For thumbnails
function gMakeUserThumbURL( inUserID, inPhotoID, inPhotoExt )
{
	return gMakeThumbURL( "user", inUserID, inPhotoID, inPhotoExt );
	
}//end gMakeUserThumbURL

function gMakeEventThumbURL( inEventID, inPhotoID, inPhotoExt )
{
	return gMakeThumbURL( "event", inEventID, inPhotoID, inPhotoExt );
	
}//end gMakeEventThumbURL

function gMakeSponsorThumbURL( inSponsorID, inPhotoID, inPhotoExt )
{
	return gMakeThumbURL( "sponsor", inSponsorID, inPhotoID, inPhotoExt );
	
}//end gMakeSponsorThumbURL

function gMakeCampaignThumbURL( inCampaignID, inPhotoID, inPhotoExt )
{
	return gMakeThumbURL( "campaign", inCampaignID, inPhotoID, inPhotoExt );
	
}//end gMakeCampaignThumbURL

// For full-sized images
function gMakeUserPhotoURL( inUserID, inPhotoID, inPhotoExt )
{
	return gMakePhotoURL( "user", inUserID, inPhotoID, inPhotoExt );
	
}//end gMakeUserPhotoURL

function gMakeEventPhotoURL( inEventID, inPhotoID, inPhotoExt)
{
	return gMakePhotoURL( "event", inEventID, inPhotoID, inPhotoExt );

}//end gMakeEventPhotoURL

function gMakeSponsorPhotoURL( inSponsorID, inPhotoID, inPhotoExt )
{
	return gMakePhotoURL( "sponsor", inSponsorID, inPhotoID, inPhotoExt );
	
}//end gMakeSponsorPhotoURL

function gMakeCampaignPhotoURL( inCampaignID, inPhotoID, inPhotoExt )
{
	return gMakePhotoURL( "campaign", inCampaignID, inPhotoID, inPhotoExt );
	
}//end gMakeCampaignPhotoURL

//------------Merchandise------------
// For full-sized images
function gMakeMerchPhotoURL( inMerchID, inPhotoID, inPhotoExt, inEventID )
{
	if (inEventID == null)
		inEventID = 0;
	var sURL = "/data/GetPhoto.aspx?";
	sURL += "fEID=" + inEventID;
	sURL += "&fMID=" + inMerchID;
	
	sURL = sURL + "&fPID=" + inPhotoID + "&fExt=" + inPhotoExt;

	return gURLNoCache(sURL);
	
}//end gMakeMerchPhotoURL

// For thumbnails
function gMakeMerchThumbURL( inMerchID, inPhotoID, inPhotoExt, inEventID )
{
	if (inEventID == null)
		inEventID = 0;
	var sURL = "/data/GetPhoto.aspx?";
	sURL += "fEID=" + inEventID;
	sURL += "&fMID=" + inMerchID;
	
	sURL = sURL + "&fPID=" + inPhotoID + "&fExt=" + inPhotoExt + "&fThumb=1";
	
	return gURLNoCache(sURL);
	
}//end gMakeUserThumbURL



function gMakeThumbURL( inType, inID, inPhotoID, inPhotoExt )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	if (inType == "user")
		sURL = sURL + "fUID=" + inID;
	else if (inType == "sponsor")
		sURL = sURL + "fSID=" + inID;
	else if (inType == "campaign")
		sURL = sURL + "fCNID=" + inID;
	else if (inType == "company")
		sURL = sURL + "fCID=" + inID;
	else if (inType == "merchandise")
		sURL = sURL + "fMID=" + inID;
	else 
		sURL = sURL + "fEID=" + inID;
	
	sURL = sURL + "&fPID=" + inPhotoID + "&fExt=" + inPhotoExt + "&fThumb=1";
	
	return gURLNoCache(sURL);
	
}//end gMakeThumbURL

// Logos ===========================
function gMakeEventLogoPhoto( inEventID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fEID=" + inEventID + "&fLogo=1";
	
	return gURLNoCache(sURL);
	
}//end gMakeUserProfilePhoto

function gMakeEventLogoThumb( inEventID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fEID=" + inEventID + "&fLogo=1&fUsePH=1&fThumb=1";
	
	return gURLNoCache(sURL);
	
}//end gMakeUserProfilePhoto

function gMakeSponsorLogoThumbURL( inSponsorID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fSID=" + inSponsorID + "&fLogo=1&fThumb=1";
	
	return gURLNoCache(sURL);
	
}//end gMakeSponsorLogoThumbURL

function gMakeSponsorLogoURL( inSponsorID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fSID=" + inSponsorID + "&fLogo=1";
	
	return gURLNoCache(sURL);
	
}//end gMakeSponsorLogoURL


function gMakeCompanyLogoURL( inCompanyID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fCID=" + inCompanyID + "&fLogo=1&fUsePH=1";
	
	return gURLNoCache(sURL);

}//end gMakeCompanyLogoURL

function gMakeCompanyLogoThumb( inCompanyID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fCID=" + inCompanyID + "&fLogo=1&fUsePH=1&fThumb=1";
	
	return gURLNoCache(sURL);

}//end gMakeCompanyLogoURL

function gMakeGroupLogoURL( inGroupID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fGID=" + inGroupID + "&fLogo=1&fUsePH=1";
	
	return gURLNoCache(sURL);

}//end gMakeGroupLogoURL

function gMakeGroupLogoThumb( inGroupID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fGID=" + inGroupID + "&fLogo=1&fUsePH=1&fThumb=1";
	
	return gURLNoCache(sURL);

}//end gMakeGroupLogoURL

function gMakeCampaignLogoURL( inCampaignID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fCNID=" + inCampaignID + "&fLogo=1&fUsePH=0";
	
	return gURLNoCache(sURL);

}//end gMakeCampaignLogoURL

function gMakeCampaignLogoThumb( inCampaignID )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	sURL = sURL + "fCNID=" + inCampaignID + "&fLogo=1&fUsePH=0&fThumb=1";
	
	return gURLNoCache(sURL);

}//end gMakeCampaignLogoThumb


// GENERAL PHOTO FUNCTIONS ===========================
function gMakePhotoURL( inType, inID, inPhotoID, inPhotoExt )
{
	var sURL = "/data/GetPhoto.aspx?";
	
	if (inType == "user")
		sURL = sURL + "fUID=" + inID;
	else if (inType == "sponsor")
		sURL = sURL + "fSID=" + inID;
	else if (inType == "campaign")
		sURL = sURL + "fCNID=" + inID;
	else if (inType == "company")
		sURL = sURL + "fCID=" + inID;
	else if (inType == "merchandise")
		sURL = sURL + "fMID=" + inID;
	else 
		sURL = sURL + "fEID=" + inID;
	
	sURL = sURL + "&fPID=" + inPhotoID + "&fExt=" + inPhotoExt;
	
	return gURLNoCache(sURL);
	
}//end gMakePhotoURL


function gViewLargerUserPhoto( inUserID, inPhotoID, inPhotoExt )
{
	gViewLargerPhoto( "user", inUserID, inPhotoID, inPhotoExt);
	
}//end gViewLargerUserPhoto

function gViewLargerEventPhoto( inEventID, inPhotoID, inPhotoExt )
{
	gViewLargerPhoto( "event", inEventID, inPhotoID, inPhotoExt);
	
}//end gViewLargerEventPhoto

function gViewLargerCampaignPhoto( inCampaignID, inPhotoID, inPhotoExt )
{
	gViewLargerPhoto( "campaign", inCampaignID, inPhotoID, inPhotoExt);
	
}//end gViewLargerCampaignPhoto

function gViewLargerPhoto( inType, inID, inPhotoID, inPhotoExt )
{
	var sURL = gMakePhotoURL( inType, inID, inPhotoID, inPhotoExt );
	
	if (inPhotoExt.toLowerCase() == "pdf")
	{
		window.open(sURL, "");	
		
		return;
			
	}//end if
	
	var sHTML = '<img id="LargePhotoDisplay" src="' + sURL + '" ALT="Click the image to close it"/>';
	
	if ($().jquery != "1.2.6")
	{
		var img = $(sHTML);
		bImageLoaded = false;
		var image = new Image();
		image.src = sURL;
		image.onload = function(){ continueShowImage(this); };
	}
	else
	{
		$.blockUI( { message: sHTML , 
			css: { "border-style": "none", "background-color": "Transparent",
				"position": "absolute", "top": "100px", "left": "100px"} } );
	
		$("#LargePhotoDisplay").click(function() {
			$.unblockUI();
		});//end click
	}
}//end gViewLargerEventPhoto

function continueShowImage(image)
{
	var width = image.width;
	var height = image.height;
	
	var newx = 800; // set to whatever you want the images max width to be.
    var newy = 600; // whatever you want the images maximum height to be.
    
    if (width<newx && height<newy)
    {
		newx = width;
		newy = height;
    }
    else if ( width >= height ) {
        var tmpy = height*newx/width;
        if ( tmpy <= newy )
            newy = tmpy;
        else
            newx = width*newy/height;
    }
    else {
        tmpx = width*newy/height;
        if ( tmpx <= newx )
            newx = tmpx;
        else
            newy = height*newx/width;
    }
    image.width = newx;
    image.height = newy;
	
	var dialogElement = $("<div/>")
		.dialog({ autoOpen: false, modal:true,title:"View Photo",resizable:false, position: [100, 100]});
		
	dialogElement.dialog("option", "height", newy+80);
	dialogElement.dialog("option", "width", newx+50);

	dialogElement.dialog("open").append(image);
}//end continueShowImage

function gApplyRollovers()
{
	// Old System =====================================================================
	$(".ImageRollover").unbind("hover").hover(function() {
		
		var sSrc = $(this).attr("src");
		var pattern = /_off\.(?:gif|jpg|png){1}$/i;
		
		var matches = sSrc.match(pattern);
		var sReplacement = "";
		
		if (matches != null && matches.length > 0)
		{
			sReplacement = sSrc.match(pattern)[0];
		
			sReplacement = sReplacement.replace("_off.", "_on.").replace("_Off.", "_On.");
		
			sSrc = sSrc.replace(pattern, sReplacement);
		}//end if
		
		$(this).attr("src", sSrc);
		
	}, function() {
		
		var sSrc = $(this).attr("src");
		var pattern = /_on\.(?:gif|jpg|png){1}$/i;
		
		var matches = sSrc.match(pattern);
		var sReplacement = "";
		
		if (matches != null && matches.length > 0)
		{
			sReplacement = sSrc.match(pattern)[0];
		
			sReplacement = sReplacement.replace("_on.", "_off.").replace("_On.", "_Off.");
		
			sSrc = sSrc.replace(pattern, sReplacement);
		}//end if
		
		$(this).attr("src", sSrc);
		
	});//end hover
	
	// New System ===========================================================================
	$(".Rollover").unbind("hover").hover(function() {
		
		var sSrc = $(this).attr("src");
		var pattern = /_active\.(?:gif|jpg|png){1}$/i;
		
		var matches = sSrc.match(pattern);
		var sReplacement = "";
		
		if (matches != null && matches.length > 0)
		{
			sReplacement = sSrc.match(pattern)[0];
		
			sReplacement = sReplacement.replace("_active.", "_hover.");
		
			sSrc = sSrc.replace(pattern, sReplacement);
		}//end if
		
		$(this).attr("src", sSrc);
		
		
	}, function() {
		
		var sSrc = $(this).attr("src");
		var pattern = /_hover\.(?:gif|jpg|png){1}$/i;
		
		var matches = sSrc.match(pattern);
		var sReplacement = "";
		
		if (matches != null && matches.length > 0)
		{
			sReplacement = sSrc.match(pattern)[0];
		
			sReplacement = sReplacement.replace("_hover.", "_active.");
		
			sSrc = sSrc.replace(pattern, sReplacement);
		}//end if
		
		$(this).attr("src", sSrc);
		
	});//end hover
	

}//end gApplyRollovers

function PhotoFileRecord(inID, inExt, inTitle, inOwnerID)
{
	this.PhotoID = inID;
	this.PhotoExt = inExt;
	this.PhotoTitle = inTitle;
	this.PhotoOwnerID = inOwnerID;

}//end PhotoFileRecord

function gGetPhotoUploadList(inXML)
{
	var bCleanup = false;
	var aList = new Array();
	
	// Do a little bit of clean up just in case:
	if (inXML.indexOf('<?xml version="1.0" ?>') > -1)
		inXML = inXML.replace('<?xml version="1.0" ?>', '');
	
	if (inXML.toLowerCase().indexOf("<response>") > -1)
		bCleanup = true;
	
	
	if (bCleanup)
	{
		inXML = '<?xml version="1.0" ?>\r\n<responses>' + inXML + '</responses>';
	
		var data = $(gParseXML(inXML));
	
	}//end if
	else
	{
		data = $(inXML);
	
	}//end else
	
	// Handle the different methods of getting info back:	
	if (data.find("status").length > 0)
	{
		data.find("status").each( function() {
			var sStatus=$(this).text();
			
			if (sStatus.indexOf('Success') > -1)
			{
				var sPhotoUserID = 	sStatus.substring(sStatus.indexOf('(')+1, sStatus.indexOf("/"));
				var sPhotoID = sStatus.substring(sStatus.indexOf('/')+1, sStatus.lastIndexOf("."));
				var sPhotoExt = sStatus.substring(sStatus.lastIndexOf('.')+1, sStatus.lastIndexOf(")"));
				
				var record = new PhotoFileRecord(sPhotoID, sPhotoExt, "", sPhotoUserID);
				
				aList[aList.length] = record;
				
			}//end if
			
		});//end each
		
	}//end if
	else if (data.find("Photo").length > 0)
	{
		data.find("Photo").each( function() {
		
			var sPhotoID = $(this).find("PhotoID").text();
			var sPhotoExt = $(this).find("PhotoExtension").text();
			var sPhotoEventID = $(this).find("PhotoOwnerID").text();
			var sPhotoTitle = $(this).find("PhotoTitle").text();
			
			var record = new PhotoFileRecord(sPhotoID, sPhotoExt, sPhotoTitle, sPhotoEventID);
			
			aList[aList.length] = record;
			
		});//end each
	
	}//end else
	else if (data.find("error").length > 0)
	{
		gProcessReportError(data.find("error").text(), true, "errormsg");
		
	}//end else
	
	return aList;

}//end gGetPhotoUploadList

// Validity Checks ====================================================================

function gIsValidNumber(inString)
{
	var bResult = false;
	var sWork = "";
	var pattern = /^[^0-9\.\,]+$/g;
	
	if (inString != null)
		sWork = "" + inString;
	
	bResult = !(sWork.match(pattern) != null);	
	
	return bResult;	
	
}//end gIsValidNumber

function gIsValidEmail(inEmail)
{
	var sLocal = "";
	var sDomain = "";
	var iPos = -1;

	if (inEmail.indexOf("@") > -1)
	{
		iPos = inEmail.lastIndexOf("@");
		sLocal = inEmail.substring(0, iPos);
		sDomain = inEmail.substring(iPos+1);

	}//end if

	if (sLocal.length == 0 || sLocal.length > 63 || sDomain.length == 0 || sDomain.length > 255)
		return false;

	// Now validate each piece:
	// Local part

	// Check for escaped characters
	var pattern = /\\\\/g;
	var sTest = sLocal.replace(pattern, "");
	pattern = /^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/g;

	if (!sTest.match(pattern))
	{
		// If we couldn't find valid characters (escaped or otherwise), verify the string is quoted:
		pattern = /^\"(\\\\\"|[^\"])+\"$/g;

		if (!sTest.match(pattern))
			return false;	// Not quoted. Bad news guys...

	}//end if

	// Now check for dots in the right place. Can't start or end with them here or have two side-by-side:
	if (sLocal[0] == "." || sLocal[sLocal.length-1] == ".")
		return false;

	if (sLocal.indexOf("..") > -1)
		return false;

	// For the domain, we're gonna just check for valid characters and dots. No DNS check please...
	if (sDomain[0] == "." || sDomain[sDomain.length-1] == ".")
		return false;
		
	if (sDomain.indexOf("..") > -1)
		return false;

	pattern = /^[A-Za-z0-9\\-\\.]+$/g;

	if (!sDomain.match(pattern))
		return false;

	return true;
	
	
}//end gIsValidEmail

function gIsValidPhone(inString)
{
	var bResult = false;
	var sWork = "";
	var pattern = /^[0-9]{10}$/;
	
	if (inString != null)
		sWork = "" + inString;
		
	// Strip out spaces
	pattern = /[\s]+/g;
	
	sWork = sWork.replace(pattern, "");
	
	// Check if it's just a string of numbers:
	pattern = /^[0-9]{10}$/;
	
	if (sWork.match(pattern) != null)
		return true;
	
	pattern = /^[\(]{0,1}[0-9]{3}[\)\-\.\s]{0,1}[0-9]{3}[\-\.\s]{0,1}[0-9]{4}$/;
	
	bResult = (sWork.match(pattern) != null);	
	
	return bResult;	
	
}//end gIsValidPhone

function gIsValidPhoneIntl(inString, inCountryID)
{
	var bResult = false;
	var sWork = "";
	var pattern = /^[0-9]{10}$/;
	
	if (inString != null)
		sWork = "" + inString;
	
	// Strip out spaces
	pattern = /[\s]+/g;
	
	sWork = sWork.replace(pattern, "");
	
	// Check if it's just a string of ten digits we're fine in any country for now.
	pattern = /^[0-9]{10}$/;
	
	if (sWork.match(pattern) != null)
		return true;
	
	// Otherwise, if it's the US or Canada, look for XXX-XXX-XXXX or 
	if (inCountryID == giCountryDefaultUS || inCountryID == giCountryCanada)
	{
		pattern = /^[\(]{0,1}[0-9]{3}[\)\-\.\s]{0,2}[0-9]{3}[\-\.\s]{0,3}[0-9]{4}$/;
		bResult = (sWork.match(pattern) != null);	// We're good if we match the pattern.
		
	}//end if
	else
	{
		pattern = /[^0-9\(\)\-\.\s]+/g;
		bResult = (sWork.match(pattern) == null);	// We're good if we find NO matches here.
	}//end else
	
	
	return bResult;	
	
}//end gIsValidPhoneIntl


function gIsValidShortDate(inString)
{
	var bResult = false;
	var sWork = "";
//	var pattern = /^(0?[1-9]|1[012])\/(0?[1-9]|1\d|2[0-8])|(0?[13456789]|1[012])\/(19|20)[0-5]{1}[0-9]{1}$/;
	var pattern = /^(0?[1-9]|1[012])\/(0?[1-9]|1\d|2[0-9]|3[01])\/(19\d{2}|20[0-5]{1}[0-9]{1}|\d{2})$/;
	
	if (inString != null)
		sWork = "" + inString;
	
	bResult = (sWork.match(pattern) != null);	
	
	return bResult;	
	
}//end gIsValidShortDate

function gFixShortYear(inDateString)
{
	var sWork = "" + inDateString;
	var sFinal = sWork;
	
	if (sWork.indexOf("/") > -1 && sWork.indexOf("/") < sWork.lastIndexOf("/"))
	{
		var aPieces = sWork.split("/");
		
		if (aPieces.length == 3)
		{
			var sYear = aPieces[2];
			
			if (sYear.length == 2)
			{
				var iYear = gGetIntFromDB(sYear);
				
				if (iYear <= 20)
					sYear = "20" + iYear;
				else
					sYear = "19" + iYear;
					
				sFinal = aPieces[0] + "/" + aPieces[1] + "/" + sYear;
					
			}//end if
			
		}//end if
	}//end if
	

	return sFinal;
	

}//end gFixShortYear

function gIsValidTime(inString)
{
	var bResult = false;
	var sWork = "";
	var pattern = /^[0-9]{1,2}[:][0-5]{1}[0-9]{1}[:][0-5]{1}[0-9]{1}([\s]{1}[AP]{1}[M]{1})*$/i;
	
	if (inString != null)
		sWork = "" + inString;
	
	bResult = (sWork.match(pattern) != null);	
	
	return bResult;	
	
}//end gIsValidTime

function gIsValidURL(inString)
{
	var bResult = false;
	var sWork = "";
	var pattern = /^((http|https):\/\/){0,1}([a-zA-Z0-9]+[\.\-_]{1})*([a-zA-Z0-9]+){1}(\.[a-zA-Z]{2,4}){1}([\/?#]{1}([a-zA-Z0-9,\.\-\_=%&]*))*$/i;
	
	if (inString != null)
		sWork = "" + inString;
	
	bResult = (sWork.match(pattern) != null);	
	
	return bResult;	
	
}//end gIsValidURL


function gIsValidLocalURL(inString)
{
	var bResult = false;
	var sWork = "";
	var pattern = /^([\/?#]{1}([a-zA-Z0-9,\.\-\_=%&]*))+$/i;
	
	if (inString != null)
		sWork = "" + inString;
	
	bResult = (sWork.match(pattern) != null);
	
	return bResult;	
	
}//end gIsValidLocalURL


function gIsValidText(inString)
{
	var bResult = false;
	var sWork = "";
	
	// Look for obvious markup we don't want.
	var pattern = /[\<]{1,}[\/]{0,1}[\s]{0,}(html|script|meta|link|body|head|table|tr|td|thead|tbody|div|object|embed|iframe|layer|frame|frameset)[\>]{1,}/i;
	
	if (inString != null)
		sWork = "" + inString;
	
	if (sWork.match(pattern) != null)
		return false;	// Bad!
		
	// Not sure how this was supposed to work but it makes basic stuff like links not pass through this check.
	// Need a better check...assuming this was from the security scans. Will have to address then.
//	// Look for SQL injection attack attempts.
//	pattern = /(\"\>){1,}/i;	
//	
//	if (sWork.match(pattern) != null)
//		return false;	// Bad!
//	
	return true;	
	
}//end gIsValidText


function gValidateCheckEmpty(element,alertMessage) {
	var isBlank = 0;
	$(element).each(function() {
		if ($(this).val().length == 0) {
			isBlank = 1;
		}
	});
	
	if (isBlank) {
		alert(alertMessage);
		$(element).focus();
		return false;
	}//end if
	
	else return true;
	
}// end gValidateCheckEmpty


function gIsValidZipCode(value) {
	
	var re = /^\d{5}([\-]\d{4})?$/;
	
	if (re.test(value))
		return true;
		
	re = /^[^0-9A-Za-z]{3}$/;
		
	return !(re.test(value));
	
}//end gIsValidZipCode


function gValidateCheckSelect(elementId,alertMessage) {
	if ($(elementId + " option:selected").attr("class") == "empty")
	{
		alert(alertMessage);
		$(elementId).focus();
		return false;
		
	}//end if
	else return true;
	
}//end gValidateCheckSelect



function gValidateCheckDuplicatesByClass(elems,alertMessage) {
	
	var allValues = new Array;
	
	// cycle thru values and create array
	$(elems).each(function() {
		var thisVal = $(this).val();
		allValues.push(thisVal);
	});
	
	var valuesAreUnique;
	var valuesTempArray;
	
	// cycle thru each price input
	$(elems).each(function() {
		var thisVal = $(this).val();
		valuesTempArray = allValues;		
		
		//filter out non-matches
		valuesTempArray = jQuery.grep(valuesTempArray,function(n) {
			return (n == thisVal);
		});
		
		valuesAreUnique = (valuesTempArray.length >= 2) ? 0 : 1;
		
		if (!valuesAreUnique) {
			alert(alertMessage);
			$(this).focus();
			return false;
		}
	});
		
	return valuesAreUnique;
	
}//gValidateCheckDuplicatesByClass

// http://www.codingforums.com/showthread.php?t=49660
Number.prototype.ToNearestUpper = function(num) { // num is an exponent of 10
	return Math.round(this/num)*num;
}

Number.prototype.ToNearestLower = function(num) { // num is an exponent of 10
	return Math.floor(this/num)*num;
}

function gParseXML( inXML ) 
{
	if (inXML == null)
		return "";
	
	if (typeof(inXML) != 'string')
		return inXML;
	
	if (inXML == "")
		return "";
	
	// Convert it to a DOM object:
	if (window.ActiveXObject && window.GetObject) 
	{ 
		var dom = new ActiveXObject( 'Microsoft.XMLDOM' ); 
		dom.loadXML( inXML ); 
		return dom;
		
	}//end if
	
	if( window.DOMParser ) 
		return new DOMParser().parseFromString( inXML, 'text/xml' ); 
    
    throw new Error( 'No XML parser available' ); 
    
}//end gParseXML

// Performs an Ajax call passing the request as JSON but receiving XML.
// If a success call is sent in with a null error call, we assume a two param function.
// Otherwise, the success and error calls are assumed to be single param functions.
function gDoAjaxXML(inURL, inRequestData, inSuccessCall, inErrorCall)
{

    $.ajax({
        type: "POST",
        url: inURL,
        contentType: "application/json; charset=utf-8",
        data: inRequestData,
        dataType: "xml",
        success: function(response) {
			
		    var doc = $(response);
		    var sError = "";
		
		    doc.find("error").each( function () {
    			
			    sError = sError + $(this).text();
    						
		    });//end each
			
			if (sError.length > 0)
			{
				if (inErrorCall)
					inErrorCall(sError);
				else
					inSuccessCall( "", sError);
				
				return;
				
			}//end if
			
		    if (inSuccessCall != null)
		    {
				if (inErrorCall)
					inSuccessCall( response );
				else
					inSuccessCall( response, "" );
    			 
		    }//end if
		
		},	// end success function,
		error: function(xmlrequest, text, ex) {
			
			var sError = "";
			var bShowSupportInfo = false;
			var bSuppress = false;
			
					
			switch(xmlrequest.status)
			{
				case 500:
				case 501:
				case 502:
				case 503:
					
					sError = "A server error occurred. Our team has been notified of the error.";
					bShowSupportInfo = true;
					
					break;
				
				case 404:
					
					sError = "We were unable to find the following resource. Please contact support at " + sSupportContact + 
								"\r\n\r\nDetails: " + inURL;
					
					break;
				
				case 0:
					// Hide this for now...it's generated when a user clicks out of a page before an Ajax call gets to complete.
					bSuppress = true;
					
					break;
				
				default:
					sError = "An unknown error has occured. Please contact support at " + sSupportContact + ".";
					
					sError += "\r\n\r\n[" + xmlrequest.status + "] : " + xmlrequest.statusText;
					
					if (text != null && text != "error")
						sError = sError + "\r\n\r\n" + text;
					else if (ex != null)
						sError = sError + "\r\n\r\n" + ex;
					break;
					
					sError += "\r\n\r\n[999]";
					
			}//end switch
			
			if (bSuppress)
				return;
				
				
			if (bShowSupportInfo)
				sError += "\r\n\r\nIf this error persists, please contact support at " + sSupportContact + ".";
					
			if (inErrorCall != null)
			{			
				inErrorCall( sError );
				 
			}//end if
			else if (inSuccessCall != null)
			{
				inSuccessCall("", sError);
				
			}//end else
			else
				alert(sError);
			
		}	//end error function
	});//end ajax


}//end gDoAjaxXML

function gDoAjaxJSONSync(inURL, inRequestData, inSuccessCall, inErrorCall, inSync)
{
 $.ajax({
        type: "POST",
        url: inURL,
        contentType: "application/json; charset=utf-8",
        data: inRequestData,
        dataType: "json",
        async: inSync,
        success: function(response) {
						
		    if (inSuccessCall != null)
		    {
				if (inErrorCall)
					inSuccessCall( response );
				else
					inSuccessCall( response, "" );
    			 
		    }//end if
		
		},	// end success function,
		error: function(xmlrequest, text, ex) {
			
			var sError = "";
			var bShowSupportInfo = false;
			var bSuppress = false;
			
					
			switch(xmlrequest.status)
			{
				case 500:
				case 501:
				case 502:
				case 503:
					
					sError = "A server error occurred. Our team has been notified of the error.";
					bShowSupportInfo = true;
					
					break;
				
				case 404:
					
					sError = "We were unable to find the following resource. Please contact support at " + sSupportContact + 
								"\r\n\r\nDetails: " + inURL;
					
					break;
				
				case 0:
					// Hide this for now...it's generated when a user clicks out of a page before an Ajax call gets to complete.
					bSuppress = true;
					
					break;
				
				default:
					sError = "An unknown error has occured. Please contact support at " + sSupportContact + ".";
					
					sError += "\r\n\r\n[" + xmlrequest.status + "] : " + xmlrequest.statusText;
					
					if (text != null && text != "error")
						sError = sError + "\r\n\r\n" + text;
					else if (ex != null)
						sError = sError + "\r\n\r\n" + ex;
					break;
					
					sError += "\r\n\r\n[999]";
					
			}//end switch
			
			if (bSuppress)
				return;
				
				
			if (bShowSupportInfo)
				sError += "\r\n\r\nIf this error persists, please contact support at " + sSupportContact + ".";
					
			if (inErrorCall != null)
			{			
				inErrorCall( sError );
				 
			}//end if
			else if (inSuccessCall != null)
			{
				inSuccessCall("", sError);
				
			}//end else
			else
				alert(sError);
			
		}	//end error function
	});//end ajax
}//end gDoAjaxJSONSync


function gDoAjaxJSON(inURL, inRequestData, inSuccessCall, inErrorCall)
{
	gDoAjaxJSONSync(inURL, inRequestData, inSuccessCall, inErrorCall, true)
	
}//end gDoAjaxJSON

function gDoAjaxJSONGenErr( inError )
{
	$.unblockUI();	// Just in case
	
	gProcessReportError(inError, true, "errmsg");

}//end gDoAjaxJSONGenErr


// Old methods:
function gProcessAjaxJSON(inURL, inRequestData, inCallback)
{

    $.ajax({
        type: "POST",
        url: inURL,
        contentType: "application/json; charset=utf-8",
        data: inRequestData,
        dataType: "json",
        success: function(response) {
			
		    var doc = $(response);
		    var sError = "";
		
		    doc.find("error").each( function () {
    			
			    sError = sError + $(this).text();
    						
		    });//end each
			
		    if (inCallback != null)
		    {
			     inCallback( response, sError );
    			 
		    }//end if
		
		},
		error: function(xhr, err, e) {
			
			if (inCallback != null)
		    {
			     inCallback( "", err );
    			 
		    }//end if
			
		}
	});//end ajax
}//end gProcessAjaxJSON

function gProcessAjaxJSONSync(inURL, inRequestData, inCallback)
{

    $.ajax({
        type: "POST",
        url: inURL,
        contentType: "application/json; charset=utf-8",
        data: inRequestData,
        dataType: "json",
        async: false,
        success: function(response) {
			
		    var doc = $(response);
		    var sError = "";
		
		    doc.find("error").each( function () {
    			
			    sError = sError + $(this).text();
    						
		    });//end each
			
		    if (inCallback != null)
		    {
			     inCallback( response, sError );
    			 
		    }//end if
		
		},
		error: function(xhr, err, e) {
			
			if (inCallback != null)
		    {
			     inCallback( "", err );
    			 
		    }//end if
			
		}
	});//end ajax
}//end gProcessAjaxJSON

function gConvertJSONResponseToObject( inResponse )
{
    var data = eval('(' + inResponse + ')');
    if (data != null) 
    {
        return data.d;
    }
    else return null;
}

function gConvertStringToJsonObject(inStringJSON)
{
    var data = null;
    try
    {
        data = eval("(" + inStringJSON + ")");
    }
    catch(err)
    {
        data = {};
    }
    return data;
}

function gParseDateJSONtoShortDate(jsonDate)
{
    try {
        var newdata = eval(jsonDate.replace(/\/Date\((-?\d+)\)\//gi, "new Date($1)"));
        var sWork = gConvertJSToDate(newdata);
        return sWork.substring(0, sWork.indexOf(" "));
    }
    catch(e) { return null; }
}// end gParseDateJSONtoShortDate


// UserID checks ==========================================================

// Checks is checked user is current
function gCheckUserId(inUIDtoCheck)
{
	var bAnswer=false;
	if (inUIDtoCheck.length > 0)
	{
		var sFormData = "fUIDtoCheck=" + inUIDtoCheck;
		$.ajax({
			url: "/data/CheckUserID.aspx",
			data: sFormData,
			success: function(inData) {
				var result = $(inData);
				if (result.find("answer").text().toLowerCase() == "true")
					bAnswer=true;
				else
					bAnswer=false;
			},
			async: false
		});
	}//end if
	return bAnswer;
}

// Help Links ====================================================

function CreateHelpLink(inID)
{
	var sTitle = ($.find("#" + inID + "Dialog").length > 0 ? $("#" + inID + "Dialog").attr("title") : null);
	
	$("#" + inID + "Dialog").dialog( { autoOpen: false, title: (sTitle != null ? sTitle : "what's this?"),
			width: 400, buttons: { Close: function() { $(this).dialog("close"); } }
			});
	
	$("#" + inID).unbind("click").click(function() {
		
		$("#" + inID + "Dialog").dialog("open");
		
		return false;
		
	});//end click
	
	
}//end CreateHelpLink


// Miscellaneous =========================================================

// Quick trim function added to all strings.
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

// Remove elements from an array (thank you John Resig!)
// http://ejohn.org/blog/javascript-array-remove/
// Example: .remove(1) removes the second element, .remove (1,2) removes the second and third element
// .remove(-2, -1) removes the last and second to last element.
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

// Quick HTML stripper.
function gRemoveHTMLTags(inInputCode){
 		/* 
  			This line is optional, it replaces escaped brackets with real ones, 
  			i.e. < is replaced with < and > is replaced with >
 		*/	
 	 	inInputCode = inInputCode.replace(/&(lt|gt);/g, function (strMatch, p1){
 		 	return (p1 == "lt")? "<" : ">";
 		});
 		var strTagStrippedText = inInputCode.replace(/<\/?[^>]+(>|$)/g, "");
 		return strTagStrippedText;	   
}


// $.browser Extension
$(document).ready(function(){
    
    $.extend($.browser, { chrome: /chrome/.test(navigator.userAgent.toLowerCase())} );
    $.extend($.browser, { safari: /webkit/.test(navigator.userAgent.toLowerCase()) && !/chrome/.test(navigator.userAgent.toLowerCase()) });
    $.extend($.browser, { ff: /firefox/.test(navigator.userAgent.toLowerCase()) });
    $.extend($.browser, { verMajor: (navigator.userAgent.match(/(Firefox\/|MSIE\s|Opera\/|Chrome\/)(\d+).(\d+)/) || navigator.userAgent.match(/(Version\/)(\d+).(\d+) Safari/) || [0,0,0])[2] });
    $.extend($.browser, { verMinor: (navigator.userAgent.match(/(Firefox\/|MSIE\s|Opera\/|Chrome\/)(\d+).(\d+)/) || navigator.userAgent.match(/(Version\/)(\d+).(\d+) Safari/) || [0,0,0])[3] });
    $.extend($.browser, { cookieEnabled: (navigator.cookieEnabled) });
    $.extend($.browser, { javaEnabled: (navigator.javaEnabled()) });
    $.extend($.browser, { checkBrowser: 
                                (  ($.browser.msie && $.browser.verMajor >= 6) 
                                || ($.browser.ff && $.browser.verMajor >= 2) 
                                || ($.browser.chrome && $.browser.verMajor >= 1) 
                                || ($.browser.opera && $.browser.verMajor >= 8) 
                                || ($.browser.safari && $.browser.verMajor >= 3)
                                ) && ($.browser.cookieEnabled)
                         });
});

