if (typeof(top10) != "object" || top10 == null) {
	var top10 = {

		_sectionList: null,

		_sectionTitleList: null,

		/**
		 * Call after home.html has loaded.
		 */
		init: function() {
			// this has to be done every time, since the elements
			// change between subpage loads:
			this._sectionList = [
				YAHOO.util.Dom.get('t10s1'),
				YAHOO.util.Dom.get('t10s2'),
				YAHOO.util.Dom.get('t10s3'),
				YAHOO.util.Dom.get('t10s4'),
				YAHOO.util.Dom.get('t10s5')
			];

			// grab the section titles from the div that's already
			// there
			if (this._sectionTitleList == null) {
				this._sectionTitleList = new Array();
				for (var i in this._sectionList) {
					var e = this._sectionList[i];
					this._sectionTitleList[i] = e.innerHTML;
				}
			}

			this._top10Section =  0;
			this._top10Element = this._oldTop10Element = this._sectionList[0];
			this._loadTop10();
		},

		shutdown: function() {
			if (this._top10AjaxRequest != null) {
				YAHOO.util.Connect.abort(this._top10AjaxRequest);
				this._top10AjaxRequest = null;
			}
		},

		_top10AjaxRequest: null,

		_top10ReqNames: [
			"GetTopTenEarners",
			"GetTopTenOrderEarners",
			"GetTopTenDestructionEarners",
			"GetTopTenRecruiters",
			"GetTopTenWealthyRegions"
		],

		_top10Section: 0, // 0-4

		_top10Element: null, // ref to the div element to fill

		_oldTop10Element: null,

		/**
		 * start a load of a certain top 10 list
		 */
		_loadTop10: function() {
			if (this._top10AjaxRequest != null) {
				YAHOO.util.Connect.abort(this._top10AjaxRequest);
			}

			var reqName = this._top10ReqNames[this._top10Section];

			soapXMLStr = buildSOAPXMLStr(reqName, '');

			YAHOO.util.Connect.setDefaultPostHeader('text/xml; charset=utf-8'); // SOAP 1.1
			YAHOO.util.Connect.initHeader('SOAPAction', '"' + _SOAP_namespace + reqName + '"'); // SOAP 1.1
			//YAHOO.util.Connect.setDefaultPostHeader('application/soap+xml; charset=utf-8'); // SOAP 1.2
			this._top10AjaxRequest =
				YAHOO.util.Connect.asyncRequest('POST', SOAP_URL,
						top10_loaderCallback, soapXMLStr);
		},

		/**
		 * called when a top 10 list loads successfully
		 */
		_loadSuccess: function(o) {
			this._top10AjaxRequest = null;

			if (alertOnFault(o.responseXML.documentElement)) { return; }

			// construct the inner html table from the data in the body

			// the name of the subelement list will be
			// <xxxResponse><xxxResult>, where xxx is the current
			// request name
			var reqName = this._top10ReqNames[this._top10Section];

			var doc = o.responseXML.documentElement;
			var bodyNode = getSOAPBodyElementFromXML(doc)[0];
			var responseNode = bodyNode.getElementsByTagName(reqName + 'Response')[0];

			if (responseNode == undefined) { return; } // old xaction

			var resultNode = responseNode.getElementsByTagName(reqName + 'Result')[0];
			var leaderBoardItems = resultNode.getElementsByTagName('LeaderboardItem');

			var i;
			var htmlStr = '<div class="top10body">';

			var contentElement = this._top10Element.getElementsByTagName('div')[1];

			//beejjs.debug.write(o.responseText);

			for (i = 0; i < leaderBoardItems.length; i++) {
				var leaderBoardItem = leaderBoardItems[i];
				//{
				//	var x = leaderBoardItem.childNodes;
				//	for(var i = 0;i< x.length;i++) {
				//		beejjs.debug.write(x[i].nodeName);
				//	}
				//}
				var points = getFirstChildNodeValue(leaderBoardItem.getElementsByTagName("Points"));
				var numberRecruited = getFirstChildNodeValue(leaderBoardItem.getElementsByTagName("NumberRecruited"));
				var realm = getFirstChildNodeValue(leaderBoardItem.getElementsByTagName("Realm"));
				var realmId = realmToRealmId(realm);

				var rowcolor;
				var realmcolor;

				realmcolor = realmId==1? 'l': 'd';

				if (i%2 == 0) {
					htmlStr += '<div class="top10lightrow">';
					rowcolor = 'l';
				} else {
					htmlStr += '<div class="top10darkrow">';
					rowcolor = 'd';
				}

				htmlStr += '<table class="top10rowtable">';
				htmlStr += '<colgroup><col class="top10col0"><col class="top10col1"><col class="top10col2"><col class="top10col3"><col class="top10col4"></colgroup>';
				htmlStr += '<tbody><tr><td></td>';
				htmlStr += '<td>' + (i+1) + '.</td>';
				if (this._top10Section < 4) { // users
					var userName = getFirstChildNodeValue(leaderBoardItem.getElementsByTagName("UserName"));
					userName = htmlize(userName);

					htmlStr += '<td>' + (userName.replace(/\s/g, '&nbsp;')) + '</td>';
					if (this._top10Section == 3) { // recruiters
						htmlStr += '<td>' + numberRecruited + '</td>';
					} else {
						htmlStr += '<td>' + points + '</td>';
					}

				} else if (this._top10Section == 4) { // regions
					var regionName = getFirstChildNodeValue(leaderBoardItem.getElementsByTagName("RegionName"));
					regionName = fixLeadingCaps(regionName);
					htmlStr += '<td>' + (regionName.replace(/\s/g, '&nbsp;')) + '</td>';
					htmlStr += '<td>' + points + '</td>';
				}

				htmlStr += '<td><img src="img/b' + realmcolor + rowcolor + '.png"/></td>';

				htmlStr += '</tr></tbody></table>';

				htmlStr += '</div>'; // top10xxxrow

				//htmlStr += '' + (i+1) + '=' + userName + '=' + points + '=' + numberRecruited + '<br \/>';
			}

			htmlStr += '</div>'; // top10body

			contentElement.innerHTML = htmlStr;
		},
			
		/**
		 * called when a top 10 list load fails
		 */
		_loadFailure: function(o) {
			this._top10AjaxRequest = null;

			if (!alertOnFault(o.responseXML.documentElement)) {
				alert("HTTP error: " + o.status + ' ' + o.statusText);
			}
		},

		/**
		 * locate the red arrow span (name="redarrow") under a parent
		 * element.
		 */
		_findRedArrowElem: function(p) {
			var spans = p.getElementsByTagName('span');
			for (var i = 0; i < spans.length; i++) {
				if (spans[i].getAttribute('name') == 'redarrow') {
					return spans[i];
				}
			}

			return null;
		},
			
		/**
		 * pass in a ref to the dom element to expand, prob "this"
		 * onclick, the div containing the title and top10.
		 */
		expandSection: function(s) {
			if (s == this._top10Element) { return; }
			this._oldTop10Element = this._top10Element;
			// find the element
			for (var i in this._sectionList) {
				e = this._sectionList[i];
				if (e == s) {
					this._top10Element = e;
					this._top10Section = i;
					arrow = this._findRedArrowElem(e);
					YAHOO.util.Dom.replaceClass(arrow, "top10sectheaderarrowhidden", "top10sectheaderarrow");
				} else {
					arrow = this._findRedArrowElem(e);
					YAHOO.util.Dom.replaceClass(arrow, "top10sectheaderarrow", "top10sectheaderarrowhidden");
				}
			}

			var duration = 0.15; //s
			var attr = {
				height: { to: 170, unit: 'px' }
			};
			var panelAnim = new YAHOO.util.Anim(this._top10Element, attr, duration, YAHOO.util.Easing.easeBoth);
			panelAnim.onComplete.subscribe(top10_expandSection2);

			var attrold = {
				height: { to: 17, unit: 'px' }
			};
			var panelAnimOld = new YAHOO.util.Anim(this._oldTop10Element, attrold, duration, YAHOO.util.Easing.easeBoth);

			panelAnim.animate();
			panelAnimOld.animate();
		},

		expandSection2: function(s) {
			YAHOO.util.Dom.replaceClass(this._top10Element, "top10contracted", "top10expanded");
			YAHOO.util.Dom.replaceClass(this._oldTop10Element, "top10expanded", "top10contracted");

			this._loadTop10();
		}

	}

	/**
	 * callbacks for top10 loads
	 */
	top10_loaderCallback = {
		success: top10._loadSuccess,
		failure: top10._loadFailure,
		scope: top10
	}

	function top10_expandSection2() {
		top10.expandSection2();
	}
}
