/*
	Multigames javascript library.
	by Robin Gustafsson
*/

// Multigames namespace and its sub-namespaces.
var Multigames = {};

// Multigames Ajax namespace.
Multigames.Ajax = {
	getRequest: function(url, success_handler) {
		new Ajax.Request(url, {
			method: 'get',
			onSuccess: success_handler,
			onFailure: Multigames.Ajax.onFailureHandler
		});
	},

	onFailureHandler: function(transport, json) {
		// Test for PHP Fatal Error and Warning.
		if (transport.responseText.match('<b>Notice</b>:') 
			|| transport.responseText.match('<b>Warning</b>:') 
			|| transport.responseText.match('<b>Fatal error</b>:') 
			|| transport.responseText.match('<b>Parse Error</b>:'))
		{
			throw { error_message:"PHP error, either Notice, Warning, or Fatal", error_details: transport.responseText, error_backtrace: null };
		}
		if (json && !json.success) {
			if (json.error_code || json.error_id) {
				throw json;
			}
		}
		return true;     
	},

	parseResponse: function(response) {
		return eval('('+response+')');
	},

	postRequest: function(url, params, success_handler) {
		new Ajax.Request(url, {
			method: 'post',
			postBody: params,
			onSuccess: success_handler,
			onFailure: Multigames.Ajax.onFailureHandler
		});
	},

	showMsg: function(container, msg, bgcolor) {
		var c = $(container);
		if (!c.hasClassName('text')) {
			c.addClassName('text');
		}
		c.setStyle({
			display:'block',
			backgroundColor:'#f2f2f2',
			color:bgcolor,
			padding:'10px',
			border:'1px solid '+bgcolor,
			margin:'0 0 10px 0'
		});
		c.update(msg);
	},

	showErrorMsg: function(container, msg) {
		this.showMsg(container, msg, '#ff0000');
	},

	showInfoMsg: function(container, msg) {
		this.showMsg(container, msg, '#0000ff');
	}
};
Object.extend(Multigames, Multigames.Ajax);

// Class to handle Multigames ajax post requests that updates a container.
// It also handles message display and indicator visibility.
Multigames.AjaxUpdatePostRequest = Class.create({
	initialize: function(container, options) {
		this.container = container;
		this.setOptions(options);

		// Set pre request visibility of elements.
		$(this.container).hide();
		if (this.options.msgbox != '') {
			$(this.options.msgbox).hide();
		}
		if (this.options.indicator != '') {
			$(this.options.indicator).show();
		}

		// Send request.
		Multigames.Ajax.postRequest(
			this.options.url,
			't='+this.options.type+'&a='+this.options.action+'&'+Object.toQueryString(this.options.params),
			this.onSuccess.bind(this)
		);
	},

	onSuccess: function(transport) {
		if (this.options.indicator != '') {
			$(this.options.indicator).hide();
		}
		var resp = Multigames.Ajax.parseResponse(transport.responseText);
		if (resp.status == 'OK') {
			if (this.options.msgbox != '') {
				Multigames.Ajax.showInfoMsg(this.options.msgbox, resp.msg);
			}
			$(this.container).update(resp.content);
			$(this.container).show();
			if (this.options.success) {
				this.options.success();
			}
			if (this.options.successWithJSON) {
				this.options.successWithJSON(resp);
			}
		} else {
			if (this.options.msgbox != '') {
				Multigames.Ajax.showErrorMsg(this.options.msgbox, resp.msg);
			}
			if (this.options.failure) {
				this.options.failure();
			}
			$(this.container).show();
		}
	},

	setOptions: function(options) {
		this.options = {
			url: '/ajax',
			type: '',
			action: '',
			params: '',
			msgbox: '',
			indicator: '',
			success: false,
			successWithJSON: false,
			failure: false
		};
		Object.extend(this.options, options || {});
	}
});

// Multigames Comment namespace.
Multigames.Comment = {
	load: function(cid) {
		$('comments-container').update('');
		$('addcomment-posting-indicator').setStyle({ display: 'block' });
		new Ajax.Updater('comments-container', '/ajax?t=comment&a=s&cid=' + cid + '&p=1', {
			asynchronous: true,
			method: 'get',
			onComplete: function () {
				$('addcomment-posting-indicator').setStyle({ display: 'none' });
			}
		});
	},

	loadPage: function(cid, page) {
		$('comments-container').update('');
		$('addcomment-posting-indicator').setStyle({ display: 'block' });
		new Ajax.Updater('comments-container', '/ajax?t=comment&a=s&cid=' + cid + '&p=' + page, {
			asynchronous: true,
			method: 'get',
			onComplete: function () {
				$('addcomment-posting-indicator').setStyle({ display: 'none' });
				$('comments-container').scrollTo();
				$$('#divComment-1 div.body').setStyle({ background: '#ddffff', border: '1px solid #99ffff' });
			}
		});
	},

	post: function(cid) {
		$('addcomment-posting-indicator').setStyle({ display: 'block' });
		$('addcomment-posting-msg').setStyle({ display: 'none' });
		new Ajax.Request('/ajax', {
			method: 'post',
			postBody: 't=comment&a=a&' + Form.serialize('addcomment-form'),
			onSuccess: function(transport) {
				$('addcomment-posting-indicator').setStyle({ display: 'none' });
				var msgbox = $('addcomment-posting-msg');
				if (!msgbox.hasClassName('textGeneral')) {
					msgbox.addClassName('textGeneral');
				}
				if (transport.responseText == 'OK') {
					msgbox.setStyle({ display: 'block', color: '#0000ff', padding: '5px', border: '1px solid #0000ff', margin: '0 0 10px 0' });
					msgbox.update('Your comment has been added!');
					$('comments-container').update('');
					$('addcomment-posting-indicator').setStyle({ display: 'block' });
					new Ajax.Updater('comments-container', '/ajax?t=comment&a=s&cid=' + cid + '&p=1', {
						asynchronous: true,
						method: 'get',
						onComplete: function () {
							$('addcomment-posting-indicator').setStyle({ display: 'none' });
							$('comments-container').scrollTo(); $$('#comment-1 div.body').setStyle({ background: '#ddffff', border: '1px solid #99ffff' }); /*Effect.BlindDown('divComment-1', { duration:2 });*/
						}
					});
				}
				else {
					msgbox.setStyle({ display: 'block', color: '#ff0000', padding: '5px', border: '1px solid #ff0000', margin: '0 0 10px 0' });
					msgbox.update(transport.responseText);
				}
			}
		});
	}
};
Object.extend(Multigames, Multigames.Comment);

// Multigames Content namespace.
Multigames.Content = {
	formForEdit: function(rowidbase, cid) {
		new Multigames.AjaxUpdatePostRequest(rowidbase+cid, {
			url: '/ajax.php',
			type: 'content_actions',
			action: 'ef',
			params: { 'cid': cid, 'rowidbase': rowidbase },
			msgbox: rowidbase+'Msg',
			indicator: '', //'divAdminUsersListIndicator_'+cid,
			success: function() {
				$(rowidbase+'Msg').hide();
			}
		});
	},

	statsRegPlay: function(cid, url) {
		new Multigames.Ajax.postRequest(
            '/ajax',
            't=stats&a=rp&cid='+cid,
            function (transport) {
                // We received a response so redirect the user to the page!
                //window.location = url;
            }
        );
	},

	statusReqDelete: function(rowidbase, cid) {
		new Multigames.AjaxUpdatePostRequest('divContentEditStatus_'+cid, {
			url: '/ajax',
			type: 'status',
			action: 'd',
			params: { 'cid': cid },
			msgbox: rowidbase+'Msg',
			indicator: 'divContentEditStatusIndicator_'+cid/*,
			success: function () {
				$('divContentEditStatus_'+cid).update('<img src="images/ajaxIconSuccess.gif" alt="Success" />');
			}*/
		});
	},

	tagAdd: function(rowidbase, cid) {
		new Multigames.AjaxUpdatePostRequest('divContentEditTags_'+cid, {
			url: '/ajax',
			type: 'tag',
			action: 'a',
			params: { 'cid': cid, tag: $('divContentEditTagsAddForm_'+cid).value, 'rowidbase': rowidbase },
			msgbox: rowidbase+'Msg',
			indicator: 'divContentEditTagsIndicator_'+cid,
			success: function () {
				$('divContentEditTagsAddForm_'+cid).value = '';
			}
		});
	},

	tagDelete: function(rowidbase, cid, tid) {
		new Multigames.AjaxUpdatePostRequest('divContentEditTags_'+cid, {
			url: '/ajax',
			type: 'tag',
			action: 'd',
			params: { 'cid': cid, tid: tid, 'rowidbase': rowidbase },
			msgbox: rowidbase+'Msg',
			indicator: 'divContentEditTagsIndicator_'+cid
		});
	}
};
Object.extend(Multigames, Multigames.Content);

// Multigames Form namespace.
Multigames.Form = {
	callOnKeydown: function(id, fn, key) {
		$(id).observe('keypress',
			function (event) {
				if (event.keyCode == key) {
					fn();
				}
			}
		);
	},

	submitAjaxForm: function(form_id, container_id, type, action, options) {
		// Merge options with defaults.
		var opt = {
			url: '/ajax',
			msgbox: '',
			indicator: '',
			upload_files: true,
			success: false,
			failure: false
		};
		Object.extend(opt, options || {});

		// Send normal form data.
		new Multigames.AjaxUpdatePostRequest(container_id, {
			url: opt.url,
			type: type,
			action: action,
			params: $(form_id).serialize(true),
			msgbox: opt.msgbox,
			indicator: opt.indicator,
			success: opt.success,
			failure: opt.failure
		});
	}
};
Object.extend(Multigames, Multigames.Form);

Multigames.Controls = {};
Object.extend(Multigames, Multigames.Controls);

// Multigames Controls.ContentFeeSelectbox class.
Multigames.Controls.ContentFeeSelectbox = Class.create({
	initialize: function(id, options) {
		this.id = id;
		this.setOptions(options);

		// Observe changes to the selectbox selection.
		Event.observe($(this.id), 'change', this.selectionChange.bind(this));
	},

	setOptions: function(options) {
		this.options = {
            feeAmountFieldID: false,
			param: 'option'
		};
		Object.extend(this.options, options || {});
	},

	selectionChange: function(e) {
		if (!e) {
			e = window.event;
		}

		var option = Event.element(e);
		if (option.value != -1 && this.options.feeAmountFieldID != false) {
			if ($(this.id).options[$(this.id).selectedIndex].value == 0 ||
                $(this.id).options[$(this.id).selectedIndex].value == 1)
            {
				$(this.options.feeAmountFieldID).hide();
			} else {
				$(this.options.feeAmountFieldID).show();
			}
		}
	}
});
Object.extend(Multigames.Controls, Multigames.Controls.ContentFeeSelectbox);

// Multigames Controls.LocaleSelect class.
Multigames.Controls.LocaleSelect = Class.create({
	initialize: function(options) {
		this.id = 'localeSelectLink';
		this.cid = 'localeSelectDiv';
		this.aid = 'localeSelectArrow';
		this.mouseInside = false;
		this.setOptions(options);

		// Set up event listeners.
		$(this.id)['onclick'] = this.onClickSelect.bind(this);
		$(this.aid)['onclick'] = this.onClickSelect.bind(this);
		Event.observe($(this.cid), 'mouseover', this.onMouseOverContent.bind(this));
		Event.observe($(this.cid), 'mouseout', this.onMouseOutContent.bind(this));

		// Add to instances array.
		Multigames.Controls.LocaleSelect.instances.push(this);
	},

	onClickSelect: function() {
		var select = $(this.id);
		var anchor = $(this.aid);
		$(this.cid).setStyle({
			'display': 'block',
			'position': 'absolute',
			'top': ((select.cumulativeOffset().top+select.getHeight()+10)+'px'),
			'left': ((anchor.cumulativeOffset().left+anchor.getWidth()-$(this.cid).getWidth())+'px')
		});
		return false;
	},

	onMouseOverContent: function(e) {
		this.mouseInside = true;
		return false;
	},

	onMouseOutContent: function(e) {
		var x = Event.pointerX(e);
		var y = Event.pointerY(e);
		var dim = $(this.cid).getDimensions();
		var p = $(this.cid).cumulativeOffset();
		if (this.mouseInside == true 
			&& ((x < p.left || x > (p.left + dim.width)) 
			|| (y < p.top || y > p.top + dim.height)))
		{
			$(this.cid).hide();
		}
		return false;
	},

	setOptions: function(options) {
		this.options = {
		};
		Object.extend(this.options, options || {});
	}
});
Object.extend(Multigames.Controls.LocaleSelect, {
	instances: [],
	findById: function(id) {
		return Multigames.Controls.LocaleSelect.instances.find(function(select) {
			return select.id == id;
		});
	}
});
Object.extend(Multigames.Controls, Multigames.Controls.LocaleSelect);

// Multigames Controls.SelectboxHook class.
Multigames.Controls.SelectboxHook = Class.create({
	initialize: function(id, options) {
		this.id = id;
		this.setOptions(options);

		// Observe changes to the selectbox selection.
		Event.observe($(this.id), 'change', this.selectionChange.bind(this));
	},

	setOptions: function(options) {
		this.options = {
			url: window.location.href,
			option_as_url: false,
			param: 'option'
		};
		Object.extend(this.options, options || {});
	},

	selectionChange: function(e) {
		if (!e) {
			e = window.event;
		}

		var option = Event.element(e);
		if (option.value != -1) {
			if (this.options.option_as_url != false) {
				window.location = $(this.id).options[$(this.id).selectedIndex].value;
			} else {
				if (this.options.url.search(/\?/i) == -1) {
					window.location = this.options.url + "?" + this.options.param + "=" + option.value;
				} else {
					window.location = this.options.url + "&" + this.options.param + "=" + option.value;
				}
			}
		}
	}
});
Object.extend(Multigames.Controls, Multigames.Controls.SelectboxHook);

// Multigames Controls.Tabs class.
Multigames.Controls.Tabs = Class.create({
	initialize: function(id, options) {
		this.id = id;
		this.tabs = [];
		this.panes = new Hash();
		this.activePane = false;
		this.setOptions(options);

		// Add all tabs.
		$(this.id).select(this.options.tabSelector).each(function(t) {
			this.addTab(t);
		}.bind(this));

		// Hide all tabs panes but the first.
		this.panes.values().each(Element.hide);
		this.setActiveTab(this.tabs.first());

		// Add to instances array.
		Multigames.Controls.Tabs.instances.push(this);
	},

	addTab: function(tab) {
		this.tabs.push(tab);
		tab.key = tab.getAttribute('href').replace(window.location.href.split('#')[0], '').split('/').last().replace(/#/, '');
		if (this.options.clickFunction != false) {
			tab['onclick'] = function(tab) {
				if (window.event) {
					Event.stop(window.event);
				}
				this.setActiveTab(tab);
				this.options.clickFunction(tab.key);
				return false;
			}.bind(this, tab);
		} else {
			var pane = $(tab.key);
			if (!pane) {
				throw "Multigames.Controls.Tabs: #" + tab.key + " could not be found."
			}
			this.panes.set(tab.key, pane);
			tab['onclick'] = function(tab) {
				if (window.event) {
					Event.stop(window.event);
				}
				this.setActiveTab(tab);
				return false;
			}.bind(this, tab);
		}
	},

	setActiveTab: function(tab) {
		if (this.activePane) {
			this.options.hideFunction(this.activePane);
		}
		this.tabs.each(function(item) {
			item.removeClassName(this.options.activeClassName);
		}.bind(this));
		Element.addClassName(tab, this.options.activeClassName);
		if (this.options.clickFunction == false) {
			this.activePane = this.panes.get(tab.key);
			this.options.showFunction(this.panes.get(tab.key));
		}
	},

	setOptions: function(options) {
		this.options = {
			showFunction: Element.show,
			hideFunction: Element.hide,
			clickFunction: false,
			tabSelector: 'li a',
			activeClassName: 'selected'
		};
		Object.extend(this.options, options || {});
	}
});
Object.extend(Multigames.Controls.Tabs, {
	instances: [],
	findById: function(id) {
		return Multigames.Controls.Tabs.instances.find(function(tabs) {
			return tabs.id == id;
		});
	}
});
Object.extend(Multigames.Controls, Multigames.Controls.Tabs);

// Multigames Highscore namespace.
Multigames.Highscore = {
	list: function(listing_type) {
		if (listing_type == 'default') {
			Multigames.Ajax.postRequest(
				'/ajax',
				't=highscore&a=dlt&bid='+$F('gameHighscoreBoardSelect'),
				function (transport) {
					var resp = Multigames.Ajax.parseResponse(transport.responseText);
					if (resp.status == 'OK') {
						Multigames.Highscore.listPage(resp.listing_type, 1);
						var hsTabs = Multigames.Controls.Tabs.findById('highscoreTabs');
						hsTabs.setActiveTab(hsTabs.tabs[resp.listing_type - 1]);
					} else {
						Multigames.Highscore.listPage(listing_type, 1);
					}
				}
			);
		} else {
			Multigames.Highscore.listPage(listing_type, 1);
		}
	},

	listPage: function(listing_type, page) {
		new Multigames.AjaxUpdatePostRequest('gameHighscoreListDiv', {
			url: '/ajax',
			type: 'highscore',
			action: 'l',
			params: { 'bid': $F('gameHighscoreBoardSelect'), 'ltype': listing_type, 'page': page },
			indicator: 'gameHighscoreIndicator',
			success: function () {
				Multigames.Highscore.updateLeaderboardDescription($F('gameHighscoreBoardSelect'), 'gameHighscoreLeaderboardDescDiv');
			}
		});
	},

	updateLeaderboardDescription: function(bid, container_id) {
		var url = '/ajax?'+Object.toQueryString({ 't': 'highscore', 'a': 'bdesc', 'bid': bid });
		Multigames.Ajax.getRequest(url, 
			function (transport, json) {
				if (json && json.status == 'OK') {
					$(container_id).update(json.content);
				}
			}
		);
	}
};
Object.extend(Multigames, Multigames.Highscore);

// Multigames star rating class.
Multigames.StarRating = Class.create({
	initialize: function(container_id, cid, stars, rating, small, dark) {
		this.container_id = container_id;
		this.cid = cid;
		this.stars = stars;
		this.small = small;
		this.dark = dark;
		this.setRating(rating);
	},

	getImage: function(style, small, dark) {
		var img;
		if (style == 'full') {
			img = 'Red';
		} else if (style == 'half') {
			img = 'GreyHalf';
		} else if (style == 'over') {
			img = 'Yellow';
		} else {
			img = 'Grey';
		}
		if (dark) {
			if (small) {
				return '/images/starRatingSmall' + img + 'D.jpg';
			} else {
				return '/images/starRating' + img + 'D.jpg';
			}
		} else {
			if (small) {
				return '/images/starRatingSmall' + img + '.jpg';
			} else {
				return '/images/starRating' + img + '.jpg';
			}
		}
	},

	starOver: function(e) {
		var greater = false;
		var star = Event.element(e);
		var stars = $(this.container_id).childNodes;
		for (var i = 0; i < stars.length; ++i) {
			stars[i].src = greater ? 
				this.getImage('empty', this.small, this.dark) 
				: this.getImage('over', this.small, this.dark);
			if (stars[i] == star) {
				greater = true;
			}
		}
	},

	starClick: function(e) {
		var rating = 0;
		var star = Event.element(e);
		var stars = $(this.container_id).childNodes;
		for (var i = 0; i < stars.length; ++i) {
			if (stars[i] == star) {
				rating = i + 1;
				break;
			}
		}
		//window.location = "/rate?cid=" + this.cid + "&r=" + rating;
		new Multigames.AjaxUpdatePostRequest(this.container_id, {
			url: '/ajax',
			type: 'rating',
			action: 'a',
			params: { 'cid': this.cid, 'r': rating },
			msgbox: this.container_id+'-msg',
			indicator: this.container_id+'-indicator',
			success: function() {
				Multigames.Ajax.getRequest('/ajax?t=rating&a=g&cid='+this.cid, 
					function (transport, json) {
						if (json && json.status == 'OK') {
							this.setRating(json.content);
						} else {
							this.setRating(this.rating);
						}
					}.bind(this)
				);
			}.bind(this),
			failure: function() {
				this.setRating(this.rating);
			}.bind(this)
		});
	},

	starOut: function(e) {
		var greater = false;
		var star = Event.element(e);
		var stars = $(this.container_id).childNodes;
		for (var i = 0; i < stars.length; ++i) {
			if (i + 1 > this.rating) {
				greater = true;
			}
			stars[i].src = greater ? 
				((this.rating >= i + 0.5) ? 
				this.getImage('half', this.small, this.dark) 
				: this.getImage('empty', this.small, this.dark)) 
				: this.getImage('full', this.small, this.dark);
		}
	},

	setRating: function(rating) {
		this.rating = rating;
		$(this.container_id).childElements().each(function(elem, i) {
			elem.remove();
		});
		var greater = false;
		for (var i = 0; i < this.stars; ++i) {
			if (i + 1 > this.rating) {
				greater = true;
			}
			var star = document.createElement('img');
			star.src = greater ? 
				((this.rating >= i + 0.5) ? 
				this.getImage('half', this.small, this.dark) 
				: this.getImage('empty', this.small, this.dark)) 
				: this.getImage('full', this.small, this.dark);

			// Only allow rating on big stars.
			if (!this.small) {
				Event.observe(star, 'mouseover', this.starOver.bind(this));
				Event.observe(star, 'click', this.starClick.bind(this));
				Event.observe(star, 'mouseout', this.starOut.bind(this));
			}

			// Add star to container.
			$(this.container_id).appendChild(star);
		}
	}
});

// Multigames tooltip class.
Multigames.Tooltip = Class.create({
	initialize: function(target, tooltip, options) {
		this.target = $(target);
		this.tooltip = $(tooltip);
		this.setOptions(options);

		// Hide tooltip to start with.
		this.tooltip.hide();

		// Observe target element to show tooltip when appropriate.
		this.observeTarget();
	},

	setOptions: function(options) {
		this.options = {
			delayhide: 0.1, // in seconds
			delayshow: 0, // in seconds
			effecthide: 'fade',
			effectshow: 'appear',
			keepinviewport: true,
			offsetx: 30,
			offsety: -30,
			zindex: 1000
		};
		Object.extend(this.options, options || {});
	},

	observeTarget: function() {
		this.target.observe('mouseover', this.showTooltip.bindAsEventListener(this));
		this.target.observe('mouseout', this.hideTooltip.bindAsEventListener(this));
		this.target.observe('mousemove', this.moveTooltip.bindAsEventListener(this));
	},

	showTooltip: function(e) {
		this.moveTooltip(e);

		// Show tooltip with specified effect.
		if (this.options.effectshow == 'appear') {
			new Effect.Appear(this.tooltip, {
				duration: this.options.delayshow,
				from: 0.0,
				to: 1.0,
				queue: { scope: 'tooltip', position: 'end' }
			});
		} else {
			this.tooltip.show();
		}
	},

	hideTooltip: function(e) {
		// Hide tooltip with specified effect.
		if (this.options.effecthide == 'fade') {
			new Effect.Fade(this.tooltip, {
				duration: this.options.delayhide,
				from: 1.0,
				to: 0.0,
				queue: { scope: 'tooltip', position: 'end' }
			});
		} else {
			this.tooltip.hide();
		}
	},

	moveTooltip: function(e) {
		Event.stop(e);
		var x = Event.pointerX(e);
		var y = Event.pointerY(e);

		// Keep tooltip withing viewport if specified to do so.
		if (this.options.keepinviewport) {
			// TODO.
		}

		// Set tooltip styles.
		this.tooltip.setStyle({
			position: 'absolute',
			top: (y+this.options.offsety)+'px',
			left: (x+this.options.offsetx)+'px',
			zindex: this.options.zindex
		});
	}
});

// Multigames Upload namespace.
Multigames.Upload = {
	cancel: function(id) {
        $(id+'-message').hide();
        $(id+'-fields').show();
        $(id+'-progressbar').hide();
        
        // TODO: implement cancellation of upload!
	},

	start: function(id, options) {
		new Multigames.AjaxUpdatePostRequest(id+'-container', {
			url: '/ajax_upload',
			type: 'ticket',
			action: '',
			params: $(id).serialize(true),
			msgbox: id+'-message',
			indicator: '',
			successWithJSON: function(json) {
				$(id+'-message').hide();
				$(id+'-fields').hide();
				$(id+'-progressbar').show();
				var ticketID = json.ticket_id;
				new Multigames.Controls.ProgressBar(id, {
					width: 400,
					oncomplete: function() {
						Multigames.Ajax.postRequest(
							'/ajax_upload',
							't=complete&ticketID='+ticketID,
							function (transport) {
								var resp = Multigames.Ajax.parseResponse(transport.responseText);
								if (resp.status == 'OK') {
									Multigames.Ajax.showInfoMsg(id+'-message', resp.msg);
									$(id+'-progressbar').hide();
									$(id+'-fields').show();
								} else {
									Multigames.Ajax.showErrorMsg(id+'-message', resp.msg);
									$(id+'-progressbar').hide();
									$(id+'-fields').show();
								}
								$(options.flashuploader).resetUpload();
							}
						);
					},
					onfailure: function(msg) {
						var pbar = Multigames.Controls.ProgressBar.findById(id);
						pbar.reset();
						Multigames.Ajax.showErrorMsg(id+'-message', msg);
						$(id+'-progressbar').hide();
						$(id+'-fields').show();
					}
				});
				$(options.flashuploader).startUpload(ticketID, id, 'Multigames.Upload.onUploadProgress');
			}
		});
	},

	onUploadProgress: function(id, status, percent, speed) {
		var pbar = Multigames.Controls.ProgressBar.findById(id);
		if (status == 'nofiles') {
			pbar.error('No screenshots added for upload! You must upload atleast 1 screenshot.');
		} else {
			if (status == 'ok') {
				pbar.update(percent, speed);
			} else {
				pbar.error('Oops, an error occured! Please try again!');
			}
		}
	}
};
Object.extend(Multigames, Multigames.Upload);

// Multigames progressbar control.
Multigames.Controls.ProgressBar = Class.create({
	initialize: function(id, options) {
		this.id = id;
		this.setOptions(options);

		// Add to instances array.
		Multigames.Controls.ProgressBar.instances.push(this);
	},

	setOptions: function(options) {
		this.options = {
			width: 400, // in pixels
			oncomplete: false,
			onfailure: false
		};
		Object.extend(this.options, options || {});
	},

	error: function(what) {
		if (this.options.onfailure) {
			this.options.onfailure(what);
		}
	},

	reset: function() {
		$(this.id+'-progressbar-inner').setStyle({ backgroundPosition: '-'+this.options.width+'px 50%' });
		$(this.id+'-progressbar-info').update('0% (0 KiB/s)');
		$(this.id+'-progressbar').hide();
	},

	update: function(percent, speed) {
		if (percent == 100) {
			$(this.id+'-progressbar-info').update(percent+'%');
			if (this.options.oncomplete) {
				this.options.oncomplete();
			}
		} else {
			$(this.id+'-progressbar-info').update(percent+'% ('+speed+' KiB/s)');
		}
		$(this.id+'-progressbar-inner').setStyle({ backgroundPosition: '-'+(this.options.width-((this.options.width/100)*percent))+'px 50%' });
	}
});
Object.extend(Multigames.Controls.ProgressBar, {
	instances: [],
	findById: function(id) {
		return Multigames.Controls.ProgressBar.instances.find(function(pbars) {
			return pbars.id == id;
		});
	}
});
Object.extend(Multigames.Controls, Multigames.Controls.ProgressBar);

// Multigames Utility namespace.
Multigames.Utility = {
	addLoadEvent: function(f) {
		var oldonload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = f;
		} else {
			window.onload = function() {
				if (oldonload) {
					oldonload();
				}
				f();
			}
		}
	},

	getIframeDocument: function(id) {
		var iframe = $(id);
		if (iframe.contentDocument) { // For Firefox etc.
			return iframe.contentDocument;
		} else if (iframe.contentWindow) { // For IE5.5 and IE6.
			return iframe.contentWindow.document;
		} else if (iframe.document) { // For IE5
			return iframe.document;
		}
	},

	processExternalLinks: function() {
		var anchors = document.getElementsByTagName("a");
		for (var i = 0; i < anchors.length; i++) {
			var anchor = anchors[i];
			if (anchor.getAttribute("href") &&
				anchor.getAttribute("rel") == "external") {
				anchor.target = "_blank";
			}
			else if (anchor.getAttribute("href") &&
				anchor.getAttribute("rel") == "top") {
				anchor.target = "_top";
			}
		}
	},

	processPageMessages: function() {
		var errorMsgs = $("messages-error");
		var infoMsgs = $("messages-info");
		if (errorMsgs.childNodes.length > 0) {
			errorMsgs.style.display = 'block';
		}
		if (infoMsgs.childNodes.length > 0) {
			infoMsgs.style.display = 'block';
		}
	},

	showAndCenterPopup: function(url, name, width, height) {
		var left = screen.width - width;
		var top = screen.height - height;
		left = (left < 0) ? 0 : left / 2;
		top  = (top < 0)  ? 0 : top / 2;
		var popup = window.open(url, name,
			'toolbar=no,directories=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes, ' +
			'left='+left+', top='+top+', ' +
			'width='+width+', height='+height);
		if (popup) {
			popup.focus();
		}
	},

	showSignupTerms: function() {
		Multigames.Utility.showAndCenterPopup('/terms?t=popup', 'Terms of Use', 500, 540);
	}
};
Object.extend(Multigames, Multigames.Utility);

// Add default load events.
Multigames.Utility.addLoadEvent(Multigames.Utility.processPageMessages);
Multigames.Utility.addLoadEvent(Multigames.Utility.processExternalLinks);

