RegisterNamespace("Arland.UI");

var slb = null;

Object.extend(Enumerable, {
	indexOf: function(searchValue) {
		var result = -1;
		this.each(function(value, index) {
			if(searchValue == value)
			{
				result = index;
				throw $break;
			}
		});
		return result;
	}
});

var DelayedMouseOverAjaxRequest = Class.create({
	initialize: function(element, delay, options)
	{
		this.element = element;
		this.delay = delay;
		this.options = options || {};
		this.onMouseOverHandler = this.onMouseOver.bind(this);
		this.onMouseOutHandler = this.onMouseOut.bind(this);
		Event.observe(this.element, "mouseover", this.onMouseOverHandler);
		Event.observe(this.element, "mouseout", this.onMouseOutHandler);
	},
	onMouseOver: function(e)
	{
		if(this.counted || this.interval)
			return;
		this.interval = window.setTimeout(this.onTimer.bind(this), this.delay);
	},
	onMouseOut: function(e)
	{
		if(this.interval)
		{
			window.clearTimeout(this.interval);
			this.interval = null;
		}
	},
	onTimer: function(e)
	{
		new Ajax.Request(this.options.url, {
			parameters: this.options.parameters,
			onSuccess: this.onRequestSuccess.bind(this),
			onError: this.options.onError||Prototype.emptyFunction
		});
	},
	onRequestSuccess: function(tr)
	{
		if(tr.responseText == "refresh")
		{
			timeOut();
			return;
		}
		(this.options.onSuccess||Prototype.emptyFunction)(tr);
		this.stopObserving();
	},
	stopObserving: function()
	{
		Event.stopObserving(this.element, "mouseover", this.onMouseOverHandler);
		Event.stopObserving(this.element, "mouseout", this.onMouseOverHandler);
	}
});

Arland.UI.SportLeagueBrowser = Class.create(Arland.Control, {
	initialize: function($super, id, key, options)
	{
		$super(id);
		this.options = options || {};
		this.url = this.options.url || "default.aspx";
		this.contentUrl = this.options.contenturl || "content.aspx"
		this.key = key;
		this.select = 0;
		this.leaguesShown = false;
		this.sports = $A();
		this.selectedLeagues = $A();
		this.leagues = $H();

		if(this.container!=null)
			this.initTree();
	},
	initTree: function()
	{
		this.sports = $H();
		this.leagues = $H();
		var sportElements = this.container.select(".sport");
		for(var i=0; i < sportElements.length; i++)
		{
			var sportElement = sportElements[i];
			if(!sportElement.id.startsWith("sport_"))
				continue;

			var sport = new Arland.UI.SportLeagueBrowser.Sport(this, sportElement);
			this.sports.set(sport.id, sport);
			this.leagues = this.leagues.merge(sport.leagues);
		}
	},
	showLeagues: function(leagueIds)
	{
		var selectedLeagues = this.selectedLeagues;
		var leagueIds = leagueIds.findAll(function(leagueId) { 
			return selectedLeagues.indexOf(leagueId) == -1; 
		});

		if(leagueIds.length < 1)
			return;

		if(this.leaguesShown && this.options.ajaxLoading)
		{
			var insertion = this.options.insertion || Insertion.Top;
			leagueIds.each(function(leagueId) {
				var leagueListItem = $("league_" + leagueId);
				if(!leagueListItem)
					return;
				leagueListItem.addClassName("loading");
			});

			try {
				new Arland.Updater(window.content_frame.document.getElementById("oddlist"), this.contentUrl, {
					parameters: "cmd=show_league&league=" + leagueIds.join(","),
					insertion: insertion,
					evalScripts: true,
					onComplete: (function(tr) {
						var slb = this;
						leagueIds.each(function(leagueId) {
							try {
								var leagueListItem = $("league_" + leagueId);
								lcel = window.content_frame.document.getElementById("league_count_" + leagueId);
								if(lcel)
									slb.leagues.get(leagueId).setCount(parseInt(lcel.value));
								else
									slb.leagues.get(leagueId).setCount(0);
								leagueListItem.removeClassName("loading");
								leagueListItem.addClassName("selected");

								window.content_frame.document["league_" + leagueId] = new window.content_frame.Arland.OddBrowser("league_" + leagueId);
							}
							catch(e) {
								signal(e)
							}
						});
						window.content_frame.OnExecResize();
					}).bind(this)
				});
				leagueIds.each(function(leagueId) {
					selectedLeagues.push(leagueId);
					var cb = $('check_' + leagueId);
					if(cb)
						cb.checked=true;
				});
			}
			catch(e)
			{
				leagueIds.each(function(leagueId) {
					var leagueListItem = $("league_" + leagueId);
					if(!leagueListItem)
						return;
					leagueListItem.removeClassName("loading");
				});
			}
		}
		else
		{
			window.content_frame.document.location.href="content.aspx?cmd=show_leagues&league=" + leagueIds.join(",");
			this.leaguesShown = true;
			leagueIds.each(function(leagueId) {
				selectedLeagues.push(leagueId);
			});

			if(this.options.ajaxLoading)
			{
				leagueIds.each(function(leagueId) {
					$("league_" + leagueId).addClassName("selected");	
					var cb = $('check_' + leagueId);
					if(cb)
						cb.checked=true;
				});
			}
		}
	},
	showLeague: function(leagueId)
	{
		this.showLeagues($A([leagueId]));
	},
	hideLeagues: function(leagueIds)
	{
		var selectedLeagues = this.selectedLeagues;
		var leagueIds = leagueIds.findAll(function(leagueId) { 
			return selectedLeagues.indexOf(leagueId) != -1; 
		});

		if(leagueIds.length < 1)
			return;

		new Ajax.Request(this.contentUrl, {
			parameters: "cmd=remove_league&league=" + leagueIds.join(","),
			onSuccess: function(tr)
			{
				slb = this;
				leagueIds.each(function(leagueId) 
				{
					var leagueIndex = slb.selectedLeagues.indexOf(leagueId);

					slb.selectedLeagues.splice(leagueIndex, 1);
					var box = $(window.content_frame.document.getElementById("box_league_" + leagueId));
					if(box)
					{
						box.remove();
					}
					$("league_" + leagueId).removeClassName("selected");

					var cb = $('check_' + leagueId);
					if(cb)
						cb.checked=false;
				});
				if(this.selectedLeagues.length < 1)
				{
					window.content_frame.document.location.href=this.contentUrl;
					this.leaguesShown = false;
				}

			}.bind(this),
			onError: function(tr)
			{
			}.bind(this)
		});
	},
	hideLeague: function(leagueId)
	{
		this.hideLeagues($A([leagueId]));
	},
	clearAllLeagues: function ()
	{
		var slb = this;
		this.selectedLeagues.each(function(leagueId) {
			var cb = $('check_' + leagueId);
			if(cb)
				cb.checked=false;
			$("league_" + leagueId).removeClassName("selected");
			new Ajax.Request(slb.contentUrl, {
				parameters: "cmd=remove_league&league=" + leagueId
			});
		});
		this.leaguesShown = false;
		this.selectedLeagues = $A();
	},
	showSport: function (id)
	{
	    this.showLevel("sport", "countries", id);
	},
	hideSport: function(id)
	{
	    this.hideLevel("sport", "countries", id);
	},
	showCountry: function (id)
	{
	    this.showLevel("country", "leagues", id);
	},
	hideCountry: function(id)
	{
	    this.hideLevel("country", "leagues", id);
	},		
	showLevel: function(name, containerName, id)
	{
		try
		{
			var element= $(name + "_" + id);
			var container = element.down("." + containerName);
			setItemCollapsedState(name + '_' + id,0);

			if("Effect" in window && !Prototype.Browser.IE)
				Effect.SlideDown(container, {
					beforeSetup: function () {
						element.removeClassName(name + "Collapsed");
					},
					afterFinish: function(e) {
						OnExecResize();
					}
				});
			else
			{
				element.removeClassName(name + "Collapsed");
				container.show();
				OnExecResize();
			}
		}
		
		catch(ex)
		{
			signal('showLevel: ' + ex.message);
		}	
	},
	hideLevel: function(name, containerName, id)
	{
		try
		{
			var element= $(name + "_" + id);
			var container = element.down("." + containerName);
			
			setItemCollapsedState(name + '_' + id,1);
			if("Effect" in window && !Prototype.Browser.IE)
			{
				Effect.SlideUp(container, {
					afterFinish: function (e) {
						element.addClassName(name + "Collapsed");
						OnExecResize();
					}
				});
			}
			else
			{
				element.addClassName(name + "Collapsed");
				container.hide();
				OnExecResize();
			}
		}
		catch(ex)
		{
			signal('hideLevel: ' + ex.message);
		}
	},	
	showSelection: function(sel)
	{
		if(this.select == sel)
			return;

		var slbform = $("slbform");
		var pos = Position.positionedOffset(slbform);
		var dim = slbform.getDimensions();

		var slb_loading = $("slb_loading");
		slb_loading.setStyle({left: pos[0] + "px", top: pos[1] + "px", width: dim.width + "px", height: dim.height + "px", display: "block"});

		$("slb_select_" + this.select).removeClassName("selected");
		this.select = sel;
		$("slb_select_" + this.select).addClassName("selected");

		new Arland.Updater($("slbcontent"), "default.aspx", {
			parameters: "cmd=load_slb&select=" + sel + "&slb=" + encodeURIComponent(this.key) + "&sid=" + encodeURIComponent(sessionID),
			onComplete: this.onUpdateComplete.bind(this)
		});
	},
	onUpdateComplete: function(tr, object)
	{
		var slb_loading = $("slb_loading");
		slb_loading.setStyle({display: "none"}); 
		this.initTree();
	}
});

Arland.UI.SportLeagueBrowser.BaseEntity = Class.create({
	initialize: function(slb, container)
	{
		this.slb = slb;
		this.container = $(container);
	},
	isCollapsed: function(level)
	{
		return this.container.hasClassName(level + "Collapsed");
	}
});

Arland.UI.SportLeagueBrowser.Sport = Class.create(Arland.UI.SportLeagueBrowser.BaseEntity, {
	initialize: function($super, slb, container) 
	{
		$super(slb, container);
		this.id = parseInt(this.container.id.substring(6));

		this.leagues = $H();
		this.countries = $H();
		this.count = -1;

		this.header = this.container.down(".sportName");

		Event.observe(this.header, "click", (function(e) {
			Event.stop(e);
			if(this.isCollapsed("sport"))
			{
				slb.showSport(this.id);
				if(this.countries.values().length == 1)
				{
					var sportId = this.id;
					this.countries.each(function(pair) {
						slb.showCountry(pair.key + "_" + sportId);
					});
				}
			}
			else
			{
				slb.hideSport(this.id);
			}
			return false;
		}).bind(this));
		
		if(this.slb.options.ajaxLoading)
		{
			this.headerDMOAR = new DelayedMouseOverAjaxRequest(this.header, Arland.Configuration.SportLeaguebrowser.SportTippCountDelay || 1000, {
				url: slb.url,
				parameters: "cmd=tippcount&sport=" + this.id + "&slb=" + encodeURIComponent(this.slb.key) + "&sid=" + encodeURIComponent(sessionID),
				onSuccess: (function(tr)
				{
					this.setCount(parseInt(tr.responseText), true);
				}).bind(this)
			});
		}
		
		if(this.slb.options.showCountryLevel)
		{
		    var countryElements = this.container.select(".country");
		    for(var i=0; i < countryElements.length; i++)
		    {
			    var countryElement = countryElements[i];
	    		if(!countryElement.id.startsWith("country_"))
    				continue;
    				
			    var country = new Arland.UI.SportLeagueBrowser.Country(slb, this, countryElement);
    			this.leagues = this.leagues.merge(country.leagues);
			    this.countries.set(country.id, country);
		    }
		}
		else
		{
		    var leagueElements = this.container.select(".league");
		    for(var i=0; i < leagueElements.length; i++)
		    {
			    var leagueElement = leagueElements[i];
			    var league = new Arland.UI.SportLeagueBrowser.League(slb, leagueElement);
			    this.leagues.set(league.id, league);
		    }
		}
	},
	setCount: function(cnt, continueObserving)
	{
		if(this.count != -1)
			return;
		this.count = cnt;

		if(!continueObserving)
		{
			this.headerDMOAR.stopObserving();
		}

		this.header.appendChild(document.createTextNode(" (" + cnt + ")"));
	}
});

Arland.UI.SportLeagueBrowser.Country = Class.create(Arland.UI.SportLeagueBrowser.BaseEntity, {
	initialize: function($super, slb, sport, container) 
	{
		$super(slb, container);
		this.sport = sport;
		this.id = parseInt(this.container.id.substring(8));

		this.leagues = $H();
		this.count = -1;
		
		this.header = this.container.down(".countryName");

		this.selectAllLink = $('country_selectall_' + this.id + "_" + this.sport.id);
		this.selectNoneLink = $('country_selectnone_' + this.id + "_" + this.sport.id);

		Event.observe(this.header, "click", (function(e) {
			Event.stop(e);
			if(this.isCollapsed("country"))
				slb.showCountry(this.id + "_" + this.sport.id);
			else
				slb.hideCountry(this.id + "_" + this.sport.id);
			return false;
		}).bind(this));

		if(this.selectAllLink)
		{
			Event.observe(this.selectAllLink, "click", (function(e) {
				Event.stop(e);
				this.showAllLeagues();
			}).bind(this));
		}

		if(this.selectNoneLink)
		{
			Event.observe(this.selectNoneLink, "click", (function(e) {
				Event.stop(e);
				this.hideAllLeagues();
			}).bind(this));
		}
		
		if(this.slb.options.ajaxLoading)
		{
			this.headerDMOAR = new DelayedMouseOverAjaxRequest(this.header, Arland.Configuration.SportLeaguebrowser.SportTippCountDelay || 1000, {
				url: slb.url,
				parameters: "cmd=tippcount&country=" + this.id + "&sport=" + this.sport.id + "&slb=" + encodeURIComponent(this.slb.key) + "&sid=" + encodeURIComponent(sessionID),
				onSuccess: (function(tr)
				{
					this.setCount(parseInt(tr.responseText), true);
				}).bind(this)
			});
		}

		var leagueElements = this.container.select(".league");
		for(var i=0; i < leagueElements.length; i++)
		{
			var leagueElement = leagueElements[i];
			var league = new Arland.UI.SportLeagueBrowser.League(slb, leagueElement);
			this.leagues.set(league.id, league);
		}
	},

	showAllLeagues: function()
	{
		var leagueIds = this.leagues.map(function(pair) { return parseInt(pair.key); });
		this.slb.showLeagues(leagueIds);
	},
	hideAllLeagues: function()
	{
		var leagueIds = this.leagues.map(function(pair) { return parseInt(pair.key); });
		this.slb.hideLeagues(leagueIds);
	},
	setCount: function(cnt, continueObserving)
	{
		if(this.count != -1)
			return;
		this.count = cnt;

		if(!continueObserving)
		{
			this.headerDMOAR.stopObserving();
		}

		this.header.appendChild(document.createTextNode(" (" + cnt + ")"));
	}
});

Arland.UI.SportLeagueBrowser.League = Class.create({
	initialize: function(slb, container) 
	{
		this.slb = slb;
		this.count = -1;
		this.container = $(container);
		this.leagues = $A();
		this.id = parseInt(this.container.id.substring(7));
		this.cb = $('check_' + this.id);
		this.linkEl = this.container.down("a");

		Event.observe(this.cb, "click", (function(e) {
			if(this.cb.checked)
				this.slb.showLeague(this.id);
			else
				this.slb.hideLeague(this.id);
			/*
			Event.stop(e);
			return false;
			*/
		}).bind(this));

		Event.observe(this.linkEl, "click", (function(e) { 
			if(!this.cb.checked)
	            this.slb.showLeague(this.id);
			else
	            this.slb.hideLeague(this.id);
            Event.stop(e);
            return false;
		}).bind(this));

		if(this.slb.options.ajaxLoading)
		{
			this.linkElDMOAR = new DelayedMouseOverAjaxRequest(this.linkEl, Arland.Configuration.SportLeaguebrowser.LeagueTippCountDelay || 1000, {
				url: slb.url,
				parameters: "cmd=tippcount&league=" + this.id + "&slb=" + encodeURIComponent(this.slb.key) + "&sid=" + encodeURIComponent(sessionID),
				onSuccess: (function(tr)
				{
					if(this.count != -1)
						return;

					this.count = parseInt(tr.responseText);
					this.linkEl.appendChild(document.createTextNode(" (" + tr.responseText + ")"));
				}).bind(this)
			});
		}
	},
	setCount: function(cnt, continueObserving)
	{
		if(this.count != -1)
			return;
		this.count = cnt;

		if(!continueObserving)
			this.linkElDMOAR.stopObserving();

		this.linkEl.appendChild(document.createTextNode(" (" + cnt + ")"));
	}
});

function initSportLeagueBrowser(element, options)
{
	slb = new Arland.UI.SportLeagueBrowser(element, sessionID, options);
}
