var Net54 = function()
{
	var showPreview = false;
	var loadingImg  = '<div style="text-align:center;">'
                    + '<img src="http://www.net54baseball.com/images/forumimages/ajax-loader.gif" />'
                    + '</div>';
	var loadUrl = 'http://www.net54baseball.com/loader.php';

	var slowSpeed = 1000;
	var fastSpeed = 500;
	
	$.ajaxSetup({
		cache: true
	});
	
	return {
		/** @var jQuery Context of application */
		$container: null,
		
		/** @var object Cached data */
		cache: {},
		
		/** @var string Made request */
		request: null,
		
		/**
		 * Script initializer.
		 * 
		 * @return void
		 */
		init: function()
		{
			// Context of application
			Net54.$container = $('#_container');
			
			// Wont display if javascript is disabled
			Net54.$container.show();
			
			// Hide the pulldown
			$('._content', Net54.$container).hide();
			
			if (showPreview)
			{
				Net54.toggleDisplay(slowSpeed);
				$('._content', Net54.$container).delay(3000);
				Net54.toggleDisplay(slowSpeed);
			}
			
			// Display content
			Net54.displayCounts();
			Net54.loadContent();
			
			// Event handlers
			$('._filters a', Net54.$container).live('click', Net54.loadContent);
			$('._close span', Net54.$container).live('click', Net54.toggleDisplay);
			$('._show-distribution', Net54.$container).live('click', Net54.showDistribution);
		},
		
		/**
		 * Event handler for filters.
		 * 
		 * @return void
		 */
		loadContent: function(e)
		{
			if (e)
			{
				// A link was clicked. Dont redirect
				e.preventDefault();
				
				// Let user know what they're looking at
				$('._filters a', Net54.$container).removeClass('_selected');
				$(this).addClass('_selected');
			}
			
			Net54.request = this.id;
			
			switch (Net54.request)
			{
				case 'seller':
				case 'price':
				case 'grade':
				case 'yearman':
					// Valid requests, do nothing
				break;
				
				default:
					Net54.request = 'yearman';
				break;
			}
			
			if (Net54.cache[Net54.request])
			{
				// Page found in cache
				Net54.displayContent(Net54.cache[Net54.request]);
				
				return;
			}
			
			$.ajax({
				url:        loadUrl,
				data:       {request: Net54.request, format: 'json'},
				type:       'GET',
				dataType:   'json',
				beforeSend: Net54.rotateImg,
				error:      Net54.ajaxError,
				success:    Net54.displayContent
			});
		},
		
		/**
		 * Displays the data returned from the server.
		 * 
		 * @return void
		 */
		displayContent: function(data)
		{
			switch (Net54.request)
			{
				case 'yearman':
					html = Net54.buildSingleColumn(data, 'Year and Manufacturer');
				break;
				
				case 'seller':
					html = Net54.buildSingleColumn(data, 'Seller');
				break;
				
				case 'price':
					html = Net54.buildSingleColumn(data, 'Price');
				break;
				
				case 'grade':
					html = Net54.buildDoubleColumn(data);
				break;
			}
			
			$('._content ._results', Net54.$container).html(html);
			
			if ( ! Net54.cache[Net54.request])
			{
				// Cache this data
				Net54.cache[Net54.request] = data;
			}
		},
		
		/**
		 * Builds all single column displays.
		 * 
		 * @param  object data
		 * @return string
		 */
		buildSingleColumn: function(data, header)
		{
			table = '<table class="'+Net54.request+'">'
			      + '<tr><th>'+header+'</th></tr>'
			      + '<tr>'
			      + Net54.buildColumn(data[Net54.request].groupings, (Net54.request == 'yearman'))
			      + '</tr></table>';
			
			return table;
		},
		
		/**
		 * Builds all double column displays.
		 * 
		 * @param  object data
		 * @return string
		 */
		buildDoubleColumn: function(data)
		{
			table = '<table class="'+Net54.request+'">'
		          + '<tr><th>SGC</th><th>PSA</th></tr>'
		          + '<tr>'
		          + Net54.buildColumn(data[Net54.request].SGC.groupings)
		          + Net54.buildColumn(data[Net54.request].PSA.groupings)
		          + '</tr></table>';
		
			return table;
		},
		
		/**
		 * Builds each column.
		 * 
		 * @param  object groupings
		 * @param  bool   isYearMan
		 * @return string
		 */
		buildColumn: function(groupings, isYearMan)
		{
			column = '<td><ul>';
			
			if (isYearMan)
			{
				column += '<li><strong>';
				column += '<a class="_show-distribution" target="_blank" href="http://rover.ebay.com/rover/1/711-53200-19255-0/1?ff3=4&pub=5574643778&toolid=10001&campid=5336745661&customid=&mpre=http%3A%2F%2Fsports-cards.shop.ebay.com%2FBaseball-%2F213%2Fi.html%3Frt%3Dnc%26Era%3DPre%25252DWWII%252520%252528Pre%25252D1942%252529%26_dmpt%3DUS_Baseball%26_fln%3D1%26_ssov%3D1%26_trksid%3Dp3286.c0.m282">See All Pre-War Cards</a>';
				column += '</strong><div class="_distribution">';
				column += '<a target="_blank" href="http://rover.ebay.com/rover/1/711-53200-19255-0/1?ff3=4&pub=5574643778&toolid=10001&campid=5336745661&customid=&mpre=http%3A%2F%2Fsports-cards.shop.ebay.com%2FBaseball-%2F213%2Fi.html%3Frt%3Dnc%26Era%3DPre%25252DWWII%252520%252528Pre%25252D1942%252529%26_dmpt%3DUS_Baseball%26_fln%3D1%26_ssov%3D1%26_trksid%3Dp3286.c0.m282">All Pre-War Cards on eBay</a>';
				column += '<a target="_blank" href="http://www.grandslambids.com/categories.php?parent_id=1876&category=Baseball&limit=10&item_type=all">All Pre-War Cards on GSB</a>';
				column += '</li>';
			}
			
			for (i in groupings)
			{
				column += '<li>';
				column += '<a target="_blank"';
				column += (groupings[i].distribution) ? ' class="_show-distribution"' : '';
				column += ' href="'+groupings[i].url+'">'+groupings[i].title+'</a>';
				
				if (groupings[i].distribution)
				{
					column += '<div class="_distribution">';
					column += '<a target="_blank" href="'+groupings[i].distribution.ebay_url+'">'+groupings[i].distribution.ebay_title+'</a>';
					column += '<a target="_blank" href="'+groupings[i].distribution.gsb_url+'">'+groupings[i].distribution.gsb_title+'</a>';
					column += '</div>';					
				}
				
				column += '</li>';
				
				if (((parseInt(i) + 1) % 10) == 0)
				{
					column += '</ul><ul>'; // 10 items per list
				}
			}
			
			column += '</ul></td>';
			
			return column; 
		},
		
		/**
		 * Loads and displays counts in the info section
		 * 
		 * @return void
		 */
		displayCounts: function()
		{
			$.ajax({
				url:      loadUrl,
				data:     {request: 'counts', format: 'json'},
				type:     'GET',
				dataType: 'json',
				error:    Net54.ajaxError,
				success:  function(data)
				{
					info = data.counts.total+' cards total | '+data.counts.SGC+' SGC cards | '+data.counts.PSA+' PSA cards';
					$('._header ._info', Net54.$container).hide().html(info).fadeIn(slowSpeed);
				}
			});		
		},
		
		/**
		 * Shows/Hides the pulldown.
		 * 
		 * @return void
		 */
		toggleDisplay: function(speed)
		{
			if (isNaN(speed))
			{
				speed = fastSpeed;
			}
			
			var $content = $('._content', Net54.$container);
			
			if ($content.is(':visible'))
			{
				// Hide it
				$content.slideUp(speed);
				$(this).html('Show');
			}
			else
			{
				// Show it
				$content.slideDown(speed);
				$(this).html('Hide');
			}
		},
		
		/**
		 * Click handler for showing the distribution of items.
		 * 
		 * @param  eventObject e
		 * @return void
		 */
		showDistribution: function(e)
		{
			e.preventDefault();
			var li = $(this).parents('li');

			if ($('._distribution', li).is(':visible'))
			{
				// Hide it
				$('._distribution', li).stop(true).fadeOut(500);
			}
			else
			{
				// Get relative position of mouse inside list element
				var x = e.pageX - $(li).offset().left;
				var y = e.pageY - $(li).offset().top;

				// Move 5 pixels right and 5 pixels down
				x += 5;
				y += 5;

				// IE fix
				if ($.browser.msie)
				{
					$(this)
						.parent('li').css('z-index', 10)
						.siblings('li').css('z-index', 9)
						.parent('ul').css('z-index', 8);
				}

				// Show it and then hide it
				$('._distribution', li).css({'left': x, 'top': y}).fadeIn(100).delay(5000).fadeOut(500);
			}
		},
		
		/**
		 * Displays the rotating image  to show that the page is loading.
		 * 
		 * @return void
		 */
		rotateImg: function()
		{
			$('._content ._results', Net54.$container).html(loadingImg);
		},
		
		/**
		 * Error callback function for ajax errors.
		 * 
		 * @return void
		 */
		ajaxError: function()
		{
			$('._content ._results', Net54.$container).html('<h4>An error has occured</h4><p>Sorry for any inconvenience. Please try again later</p>');
		}
	};
}();

// Dont show for IE 6 or below
if ( ! ($.browser.msie && parseInt($.browser.version) <= 6))
{
	$(document).ready(Net54.init);
}

