(function(jQuery) {
	jQuery.fn.LeaderBoards = function(options) {
		
		var defaults = {			
			url: 'LeaderBoards.xml',
			cols: 2,
			user: [],
			message_dir: '/'
		};
			
		this.each(function() {
			var obj = jQuery(this);
			var o = jQuery.extend(defaults, options);
			var col = 1;
			var curLB = 1;
			var curLBName = '';
			var curLBNodes = [];
			var lbTabbed = [];
			var lbTabbedNo = [];
			var tStr = '';
			var messages_top10 = [];
			var messages_nottop10 = [];
			var messages_register = [];
			var messages_wronglvl_lower = [];
			var messages_wronglvl_higher = [];
			var messages_noentry = [];
			
			app(
				'<table style="width: 100%;" border="0" cellspacing="0" cellpadding="0"><tbody><tr>'
			);
			
			jQuery.ajax({
				type: "GET",
				url: o.message_dir+'/messages.xml',
				dataType: "xml",
				success: function(xml) {
					loadXmlMessages(xml);
					jQuery.ajax({
						type: "GET",
						url: o.url,
						dataType: "xml",
						success: function(xml) {
							loadXmlData(xml);
						}
					});
				}
			});
			
			function loadXmlMessages(xml) {
				jQuery(xml).find('message_top10').each(function(){
					messages_top10[messages_top10.length] = jQuery(this).text();
				});
				jQuery(xml).find('message_nottop10').each(function(){
					messages_nottop10[messages_nottop10.length] = jQuery(this).text();
				});
				jQuery(xml).find('message_wronglvl_lower').each(function(){
					messages_wronglvl_lower[messages_wronglvl_lower.length] = jQuery(this).text();
				});
				jQuery(xml).find('message_wronglvl_higher').each(function(){
					messages_wronglvl_higher[messages_wronglvl_higher.length] = jQuery(this).text();
				});
				jQuery(xml).find('message_register').each(function(){
					messages_register[messages_register.length] = jQuery(this).text();
				});
				jQuery(xml).find('messages_noentry').each(function(){
					messages_noentry[messages_noentry.length] = jQuery(this).text();
				});
			}
			
			function loadXmlData(xml) {
				numLB = jQuery(xml).find('LeaderBoard').length;
				jQuery(xml).find('LeaderBoard').each(function(){
					append_LeaderBoard(this);
				});
				jQuery(obj).append(tStr);
				for (c=0;c<lbTabbed.length;c++) {
					jQuery("#"+lbTabbed[c]).tabs();
					jQuery("#"+lbTabbed[c]).tabs('select',(lbTabbedNo[lbTabbed[c]]-1));
					jQuery("#"+lbTabbed[c]).tabs({ fxFade: true, fxSpeed: 'slow' });
				}

			};
			
			function append_LeaderBoard(node) {
				var name = jQuery(node).attr('name');
				var lbData = getLeaderBoardData(name);
				if (!isNaN(name.substr(name.length-1,name.length))) {
					return append_LeaderBoard_Tabbed(node);
				}
				
				if (curLBName!='') 
					close_LB_Tabbed();
				
				app('<td valign="top" align="right"><div id="'+name+'_solo" class="leaderboard_col leaderboard_notabs">');
				app('<div class="leaderboard_title">'+lbData['name']+'</div>');
				app('<ul><li class="indicator">'+lbData['indicator']+'</li></ul>');
				append_LeaderBoard_Data(node);
				app('</div></td>');
				if (numLB==curLB) {
					app('</tr></tbody></table>');
				} else
					closeCols();
				col++;
				curLB++;
			};
			
			function append_LeaderBoard_Tabbed(node) {
				var nameRaw = jQuery(node).attr('name');
				var lbData = getLeaderBoardData(nameRaw);
				name = nameRaw.replace(/(.*)(\_\d{1}$)/,'$1');
				entry = nameRaw.replace(/(.*\_)(\d{1}$)/,'$2');
				
				if (curLBName!=name && curLBName!='') 
					close_LB_Tabbed();
				if (curLBName!=name) {
					curLBName = name;
					lbTabbed[lbTabbed.length] = name;
					app('<td valign="top" align="right"><div id="'+name+'" class="leaderboard_col">');
					app('<div class="leaderboard_title">'+lbData['name']+'</div>');
					app('<ul><li class="indicator">Ranks:</li>');
				}
				
				app('<li><a href="#'+nameRaw+'">'+entry+'</a></li>');
				curLBNodes[curLBNodes.length] = node;
				
				if (numLB==curLB) {
					app('</tr></tbody></table>');
				}
				curLB++;
			};
			
			function append_LeaderBoard_Data(node) {
				var name = jQuery(node).attr('name');
				var nameCl = name.replace(/(.*)(\_\d{1}$)/,'$1');
				if (lbTabbedNo[nameCl]==undefined)
					lbTabbedNo[nameCl] = 5;
				var level = name.replace(/(.*\_)(\d{1}$)/,'$2');
				if (level==name) level = false;
				var lbData = getLeaderBoardData(name);
				var hasUser = false;
				app('<div id="'+name+'" class="leaderboard_wrapper">');
				app('<table class="leaderboard" cellpadding="0" cellspacing="0"><tr>');
				app('</tr>');
				jQuery(node).find('entry').each(function(){
					var value = jQuery(this).attr('value1');
					if (!isNaN(value)) value = addDots(value);
					if (o.user['name'] &&
						(jQuery(this).attr('ref')==o.user['name'] || jQuery(this).attr('value2')==o.user['name']) &&
						(level==o.user['level'] || level==false)) {
						app('<tr class="active">');
						hasUser= true;
					} else
						app('<tr>');
					app('<td class="pos">'+jQuery(this).attr('position')+'. </td>');
					app('<td class="ref">'+jQuery(this).attr('ref')+'</td>');
					app('<td class="value">'+lbData['val_front']+value+lbData['val_back']+'</td>');
					app('</tr>');
				});
				if (hasUser) {
					var message = randMsg(messages_top10,'t10');
					app('<tr class="note"><td colspan="3">'+message+'</td></tr>');
					lbTabbedNo[nameCl] = level;
				} else if (o.user['name'] && lbData['user_field']!=false && (level==o.user['level'] || level==false)) {
					lbTabbedNo[nameCl] = level;
					var value = o.user[lbData['user_field']];
					if (!isNaN(value)) value = addDots(value);
					app('<tr class="active">');
					app('<td class="pos">'+o.user['position_'+nameCl]+'.</td>');
					app('<td class="ref">'+o.user['name']+'</td>');
					app('<td class="value">'+lbData['val_front']+value+lbData['val_back']+'</td>');
					app('</tr>');
				} else if (o.user['name'] && level==o.user['level'] && lbData['user_field']!=false) {
					var message = randMsg(messages_nottop10,'nt10');
					app('<tr class="note"><td colspan="3">'+message+'</td></tr>');
				} else if (o.user['name'] && level>o.user['level'] && lbData['user_field']!=false) {
					var message = randMsg(messages_wronglvl_higher,'wlh');
					app('<tr class="note"><td colspan="3">'+message+'</td></tr>');
				} else if (o.user['name'] && level<o.user['level'] && lbData['user_field']!=false) {
					var message = randMsg(messages_wronglvl_lower,'wll');
					app('<tr class="note"><td colspan="3">'+message+'</td></tr>');
				} else if (o.user['name'] && lbData['user_field']==false) {
					var message = randMsg(messages_noentry,'noe');
					app('<tr class="note"><td colspan="3">'+message+'</td></tr>');
				} else {
					var message = randMsg(messages_register,'reg');
					app('<tr class="note"><td colspan="3">'+message+'</td></tr>');
				}
				
				app('</table></div>');
			};
			
			function close_LB_Tabbed() {
				app('</ul>');
				for (c=0; c<curLBNodes.length; c++) {
					append_LeaderBoard_Data(curLBNodes[c]);
				}
				app('</div></td>');
				curLBName = '';
				curLBNodes = [];
				closeCols(); col++;
			};
			
			function closeCols() {
				if (col==o.cols) {
					col = 0;
					app('</tr><tr>');
				} 
			};
			
			function getLeaderBoardData(name) {
				var aReturn = [];
				switch (name) {
					case 'TOP_AGENTS_1':
					case 'TOP_AGENTS_2':
					case 'TOP_AGENTS_3':
					case 'TOP_AGENTS_4':
					case 'TOP_AGENTS_5':
						aReturn['name'] 	= 'Top<strong>Agents</strong>';
						aReturn['val_front'] = '<span class="nostrong">$</span> ';
						aReturn['val_back'] = '';
						aReturn['indicator'] = 'Ranks:';
						aReturn['user_field'] = 'money_total';
					break;
					case 'TOP_SAVERS_1':
					case 'TOP_SAVERS_2':
					case 'TOP_SAVERS_3':
					case 'TOP_SAVERS_4':
					case 'TOP_SAVERS_5':
						aReturn['name'] 	= 'Top<strong>Savers</strong>';
						aReturn['val_front'] = '<span class="nostrong">$</span> ';
						aReturn['val_back'] = '';
						aReturn['indicator'] = 'Ranks:';
						aReturn['user_field'] = 'money_saved';
					break;
					case 'TOP_SPENDERS_1':
					case 'TOP_SPENDERS_2':
					case 'TOP_SPENDERS_3':
					case 'TOP_SPENDERS_4':
					case 'TOP_SPENDERS_5':
						aReturn['name'] 	= 'Top<strong>Spenders</strong>';
						aReturn['val_front'] = '<span class="nostrong">$</span> ';
						aReturn['val_back'] = '';
						aReturn['indicator'] = 'Ranks:';
						aReturn['user_field'] = 'money_spend';
					break;
					case 'TOP_RISING':
						aReturn['name'] 	= 'Top<strong>Rising</strong>Agents';
						aReturn['val_front'] = '<span class="nostrong">$</span> ';
						aReturn['val_back'] = '';
						aReturn['indicator'] = 'All Ranks (money earned per day)';
						aReturn['user_field'] = 'money_per_day';
					break;
					case 'TOP_EARNING_STAR':
						aReturn['name'] 	= 'Top<strong>Earning</strong>Stars';
						aReturn['val_front'] = '<span class="nostrong">$</span> ';
						aReturn['val_back'] = '';
						aReturn['indicator'] = 'All Ranks (money earned)';
						aReturn['user_field'] = false;
					break;
					case 'TOP_NETWORKER':
						aReturn['name'] 	= 'Top<strong>Networkers</strong>';
						aReturn['val_front'] = '';
						aReturn['val_back'] = '';
						aReturn['indicator'] = 'Number of contacts';
						aReturn['user_field'] = 'number_contacts';
					break;
				}
				return aReturn;
			};
			
			function randMsg(message_array,id) {
				var rand = Math.floor(Math.random()*message_array.length);
				return message_array[rand];
			};
			
			function addDots(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;
			};
			
			function app(str) {
				tStr += str;
				//jQuery(obj).append(str);
			};
			
		});
		
	};
})(jQuery);