SportpostUpdater = function(app){
	var updater = this;
	updater.app = app;
	
	updater.mainBlockId = "main_block";
	updater.init();

	$(document).bind("activateContext", function(event, context){
		updater.activateAjaxPager(context);
		updater.activateUpdaterLinks(context);
	})
	
	return updater;
}

SportpostUpdater.prototype.init = function(){
	var updater = this;

	if (updater.app.selectors) {
		var hash = updater.parseHash();
		var mainBlockSelectors = updater.app.selectors.selectorsByBlock[updater.mainBlockId];
		if (hash.filters && mainBlockSelectors != undefined && mainBlockSelectors.length){
			hash.filters.reverse();
			for (var i = mainBlockSelectors.length - 1; i > -1; i--) {
				mainBlockSelectors[i].setValue(hash.filters.pop())
			}
			updater.load({
				blockId: updater.mainBlockId,
				pageNum: hash.pageNum
			});
		}
	}

	var newsBlock = $("#news-block");
	var newsBlockTitle = $("#news-block-title");
	if (newsBlock.length && newsBlock.hasClass("update-on-load")){
		var newsContainer = newsBlock.parent();
		var categorySelector = $("#selector_category");
		
		newsContainer.removeClass("hidden");

		var activeCategory = newsBlock.attr("category");
		if (categorySelector.length && categorySelector.data('selector')) {
			activeCategory = categorySelector.data('selector').value;

			categorySelector.bind("change", function(event, category){
				updater.loadNewsBlock(newsBlock, newsBlockTitle, categorySelector.data('selector').value, categorySelector.data('selector').activeText[0].innerHTML, true);
			});
		}
		if (categorySelector.data('selector')) {
			updater.loadNewsBlock(newsBlock, newsBlockTitle, activeCategory, categorySelector.data('selector').activeText[0].innerHTML);
		} else {
			updater.loadNewsBlock(newsBlock, newsBlockTitle, activeCategory);
		}	
	}
}

SportpostUpdater.prototype.loadNewsBlock = function(newsBlock, newsBlockTitle, category, categoryName, forceLoad){
	var updater = this;
	if (category != 'all') {
		newsBlock.attr("category", categoryName);
	}
	if (categoryName && category && category == 'all') {
		newsBlockTitle.html('Sport News');
	} else if (categoryName && category && category != 'all') {
		newsBlockTitle.html(categoryName + ' News');
	}	
	updater.load({
		blockId: newsBlock.attr("id"),
		message: 'Loading Related News',
		forceLoad: forceLoad,
		error: function(){
			newsBlock.html('<div class="padded">No related news available.</div>')
		}
	});
}

SportpostUpdater.prototype.load = function(options){
	var updater = this;

	var block = $("#" + options.blockId);
	if (
			(block.length && block.attr("update_url") != "" && !block.data("busy-updating")) || 
			options.forceLoad
		) {
		
		if (block.data("busy-updating") && block.data("http-request")){
			block.data("http-request").abort();
			block.data("http-request", false);
		}
		
		block.data("busy-updating", true);
		options.pageNum = options.pageNum || 1;

		var filter = false;
		
		if (block.hasClass("update-by-filters") && !options.noFilters) {
			filter = "/";
			var selectors = updater.app.selectors.selectorsByBlock[options.blockId];
			buildHash: for (var i = selectors.length - 1; i > -1; i--) {
				if (selectors[i].value != 0) {
					filter = filter + selectors[i].value;
				}
				if (i > 0) {
					filter = filter + "/";
				}
				if (options.breakHashOnSelector && selectors[i] == options.selector) {
					break buildHash;
				}
			}
	
			var hash = filter;
			if (options.pageNum > 1) hash = hash + "," + options.pageNum;
		}
		
		var beforeUnload = block.attr("beforeUnload");
		if (beforeUnload != undefined && beforeUnload != "" && typeof (window[beforeUnload]) == "function"){
			window[beforeUnload]();
		}
		
		var blockMsgData = updater.blockWithMsg(block, options.message || "Updating");
		block.addClass("busy");

		var url = options.url || block.attr("update_url");
		if (!filter && options.selector != undefined && options.selector.value != undefined) url = url + "&" + options.selector.value;
		var data = {};

		if (filter)	data.filter = filter;
		if (block.attr("category")) data.category = block.attr("category");
		if (options.pageNum > 1) data.page = options.pageNum;
		
		var ajaxRequest = $.ajax({
			url: url,
			dataType: "html",
			type: "GET",
			data: data,
			cache: false,
			complete: function(){
				block.data("http-request", false);
				block.data("busy-updating", false);
				if (blockMsgData.message) blockMsgData.message.remove();
				block.removeClass("busy");
			},
			error: function (XMLHttpRequest, textStatus, errorThrown) {
				if (blockMsgData.blockPreviousContent != null) block.html(blockMsgData.blockPreviousContent);
				if (typeof (options.error) == "function") options.error();
				if (typeof($.fn.block) == "function") block.unblock();
			},
			success: function(html){
				if (options.success != undefined && typeof (options.success) == "function"){
					options.success();
				}
				block.html(html).css("position", "static");
				if (block.hasClass("update-selectors")) {
					updater.app.selectors.selectorsByBlock[options.blockId] = null;
				}
				$(document).trigger("activateContext", block);

				if (options.blockId == updater.mainBlockId && hash != undefined) location.hash = hash;

				if ((($(block).offset().top + $(block).outerHeight() < $(document).scrollTop()) || options.forceScroll)	&& typeof ($.scrollTo) == "function") {
					$.scrollTo(block);
				}
			}
		});

		block.data("http-request", ajaxRequest);
	}
}

SportpostUpdater.prototype.parseHash = function(){
	var updater = this;

	var result = {};
	var parts = location.hash.replace(/^#/, '').split(",");

	result.filters = (parts[0] == "") ? false : parts[0].replace(/^\//, "").split("/");
	result.pageNum = parts[1] || 1;

	return result;
}

SportpostUpdater.prototype.activateAjaxPager = function(context){
	var updater = this;

	$("div.pager", context).not(".pager_activated").each(function(){
		var pager = $(this);
		var block_id = pager.attr("block_id");
		var block = null;
		if (block_id && block_id != ""){
			block = $("#" + block_id);
		}
		
		if (!block || block.length == 0) {
			block = pager.parents("div.block").eq(0);
		}
		
		if (block.length != 0 && block.attr("id") && block.attr("id") != "") {
			pager.find("a").click(function(){
				updater.load({
					blockId: block.attr("id"),
					pageNum: $(this).attr("page")
				});
	
				return false;
			});
		}
	}).addClass("pager_activated");
}


SportpostUpdater.prototype.activateUpdaterLinks = function(context){
	var updater = this;

	$("a.updater-link", context).not(".updater_activated").click(function(){
		if (window._playerData) {
			window._playerData = {};
			$("#videoplayer-container-hd").html("");
		}
		var link = $(this);
		var blockId = link.attr("block_id");
		var url = link.attr("update_url");
		updater.load({
			blockId: blockId,
			url: url,
			forceScroll: true
		});
		return false;
	}).addClass("updater_activated clickable");
}


SportpostUpdater.prototype.blockWithMsg = function(block, message){
	var messageText = '<h4><img src="/images/img/loading.gif" width="16" height="16" alt="" align="absmiddle">&nbsp;&nbsp;&nbsp;' + message + '</h4>';

	var blockHeight = block.outerHeight();

	var message = null;
	var blockPreviousContent = null;

	if (block.html() != "" && blockHeight > 40 && typeof($.fn.block) == "function") {
		var blockTop = block.offset().top;
		var blockBtm = blockTop + blockHeight;

		var winTop = $(document).scrollTop();
		var winBtm = winTop + $(window).height();

		var visTop = (blockTop < winTop) ? winTop - blockTop : 0;
		var visBtm = (blockBtm < winBtm) ? blockHeight : winBtm - blockTop;
		
		block.block({
			message: '',
			fadeIn: 100,
			fadeOut: 100,
			overlayCSS: {
				backgroundColor: "#fff",
				opacity: 0.6
			}
		});

		var message = $('<div class="loading-message">' + messageText + '</div>').appendTo(block);
		
		var msgHeight = message.height();
		var msgTop = visTop + (visBtm - visTop) / 2 - msgHeight / 2;
		if (msgTop < 0){
			msgTop = blockHeight / 2 - message.height();
		}
		if (msgTop > blockHeight - message.height()){
			msgTop = 0;
		}
		
		var msgWidth = message.width();

		message.css({
			top: msgTop,
			marginLeft: "-" + msgWidth / 2 + "px"
		})
	} else {
		blockPreviousContent = block.html();
		block.html('<div class="padded loading-message-container">' + messageText + '</div>')
	}

	return {
		message: message,
		blockPreviousContent: blockPreviousContent
	}
}



// http://flesler.blogspot.com/2007/10/jqueryscrollto.html
;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);