// General JS functions and stuff :p

Array.prototype.in_array = function ( obj ) {
	var len = this.length;
	for ( var x = 0 ; x < len ; x++ ) {
		if ( this[x] == obj ) return true;
	}
	return false;
}

function NewsList() {
	this.cur_pos = 0;
	this.loaded_pages = [0];
	this.register_clicks = true;
}

NewsList.prototype.next = function(id) {
	var registerClicks = this.registerClicks.bind(this);
	var el = $(id);
	
	var first_dec = el.firstDescendant();
	var width = first_dec.getWidth(); // get inner element width ( how much to increment at a time )
	
	if(isNaN(parseInt(el.style.left)))
		var og_val = 0;
	else
		var og_val = parseInt(el.style.left);
	
	var _this = this;
	
	// Check if content exists...
	if(this.loaded_pages.in_array(_this.cur_pos + 1) == false && this.register_clicks == true) {
		this.register_clicks = false;
		// alert('adding new');
		
		var a_list = el.getElementsByTagName('a');
		var h_ref = a_list[(a_list.length - 1)].href;
		
		var id_s = MyStringHandler.extractId(h_ref);
		var site = MyStringHandler.extractSite(h_ref);
		var pars = 'id=' + id_s + '&site=' + site + '&direction=older';
		var url = '/ajax_loaders/news_list_loader.php';
		
		// Get the real content
		
		var protoAjax = new Ajax.Request(
			url,
			{
				method: 'get',
				parameters: pars,
				onComplete: function(response)
				{
					if(response.responseText == "") {
						_this.registerClicks();
						return;
					}
					el.style.width = (el.getWidth() + width) + 'px'; // expand the container
					
					new Insertion.Bottom(id, '<div>' + response.responseText + '</div>');
					
					_this.cur_pos++;
					_this.loaded_pages.push(_this.cur_pos);
					
					new Effect.Move(
						id, {
							x: -width,
							y: 0,
							duration: 0.3,
							transition: Effect.Transitions.sinoidal,
							afterFinish: registerClicks,
							fps: frames_per_sec
						}
					);
				}
			}
		);
		
	} else if(this.register_clicks == true) {
		this.register_clicks = false;
		new Effect.Move(
			id, {
				x: -width,
				y: 0,
				duration: 0.3,
				transition: Effect.Transitions.sinoidal,
				afterFinish: registerClicks,
				fps: frames_per_sec
			}
		);
		this.cur_pos++;
	}
}

NewsList.prototype.prev = function(id) {
	var registerClicks = this.registerClicks.bind(this);
	var el = $(id);
	
	var first_dec = el.firstDescendant();
	var width = first_dec.getWidth(); // get inner element width ( how much to increment at a time )
	
	if(isNaN(parseInt(el.style.left)))
		var og_val = 0;
	else
		var og_val = parseInt(el.style.left);
	
	_this = this;
	
	// Check if content exists...
	if(this.loaded_pages.in_array(_this.cur_pos - 1) == false && this.register_clicks == true) {
		
		this.register_clicks = false;
		// alert('adding new');
		
		var a_list = el.getElementsByTagName('a');
		var h_ref = a_list[0].href;
		
		var id_s = MyStringHandler.extractId(h_ref);
		var site = MyStringHandler.extractSite(h_ref);
		var pars = 'id=' + id_s + '&site=' + site + '&direction=newer';
		var url = '/ajax_loaders/news_list_loader.php';
		
		var protoAjax = new Ajax.Request(
			url,
			{
				method: 'get',
				parameters: pars,
				onComplete: function(response)
				{
					if(response.responseText == "") {
						_this.registerClicks();
						return;
					}
					el.style.width = (el.getWidth() + width) + 'px'; // expand the container
					el.style.left = (og_val - width) + 'px'; // move the position to compensate for the new width
					
					new Insertion.Top(id, '<div>' + response.responseText + '</div>');
					
					_this.cur_pos--;
					_this.loaded_pages.push(_this.cur_pos);
					
					new Effect.Move(
						id, {
							x: width,
							y: 0,
							duration: 0.3,
							transition: Effect.Transitions.sinoidal,
							afterFinish: registerClicks,
							fps: frames_per_sec
						}
					);
				}
			}
		);
		
	} else if(this.register_clicks == true) {
		this.register_clicks = false;
		new Effect.Move(
			id, {
				x: width,
				y: 0,
				duration: 0.3,
				transition: Effect.Transitions.sinoidal,
				afterFinish: registerClicks,
				fps: frames_per_sec
			}
		);
		this.cur_pos--;
	}
}

NewsList.prototype.registerClicks = function() {
	this.register_clicks = true;
}

function ImageSlider() {
	
	if($('image_list_inner') && $('slider'))
		this.el = $('image_list_inner');
	else
		return;
	
	size = 109;
	
	this.cur_pos = 0;
	
	doSlide = this.scrollHorizontal.bind(this);
	doChange = this.changeHorizontal.bind(this);
	
	images = this.el.getElementsByTagName('span');
	image_count = images.length;
	
	this.total_width = Math.round((size * (image_count)) - $('image_list_outer').getWidth());
	
	this.slider = new Control.Slider(
		'slider', 'track', {
			onSlide: function(v) {
				doSlide(v);
			},
			onChange: function(v) {
				doChange(v);
			}
		}
	);
}

ImageSlider.prototype.scrollHorizontal = function(value) {
	true_value = Math.round((-1)*(this.total_width*value));
	this.el.style.left = true_value + 'px';
	this.cur_pos = value;
}

ImageSlider.prototype.changeHorizontal = function(value) {
	var delta = this.cur_pos - value;
	// $('info').innerHTML = delta;
	if(this.cur_pos != value) {
		
		true_value = Math.round(delta*this.total_width);
		
		new Effect.Move(
			'image_list_inner', {
				x: true_value,
				y: 0,
				transition: Effect.Transitions.sinoidal,
				duration: 0.3,
				fps: frames_per_sec
			}
		);
		this.cur_pos = value;
	} else {
		return;
	}
}

/*
ImageSlider.prototype.scrollPrevious = function(id) {
	new Effect.Move(
		'image_list_inner', {
			x: 180,
			y: 0,
			transition: Effect.Transitions.sinoidal
		}
	);
}
*/

function Nosto() {
	
	if($('nosto'))
		this.el = $('nosto');
	else
		return;
	
	this.pe = false;
	this.ignore_click = false;
	
	this.divlist = this.el.getElementsByTagName('div');
	this.lilist = this.el.getElementsByTagName('li');
	this.alist = this.el.getElementsByTagName('a');
	
	this.cur_num = 0;
	this.change_num = 0;
	
	this.startRotate();
}

Nosto.prototype.startRotate = function() {
	this.cur_num = this.change_num;
	if(this.cur_num == 4)
		this.change_num = 0;
	else
		this.change_num = this.cur_num + 1;
	// alert('current: ' + this.cur_num + '\nnext: ' + this.change_num);
	this.registerClick();
	if(this.pe)
		this.pe.stop();
	var nextNosto = this.nextNosto.bind(this); // closure, the periodical executer executes in the window-scope
	this.pe = new PeriodicalExecuter(nextNosto, 7);
}

Nosto.prototype.registerClick = function() {
	this.ignore_click = false;
	// $('clickability').innerHTML = 'true';
}

Nosto.prototype.ignoreClick = function() {
	this.ignore_click = true;
	// $('clickability').innerHTML = 'false';
}

Nosto.prototype.nextNosto = function() {
	
	this.ignoreClick();
	
	if(this.pe)
		this.pe.stop();
	
	this.applyChanges();
}
	
Nosto.prototype.clickedNosto = function(obj) {
	
	if(this.ignore_click == false) {
				
		this.ignoreClick();
		
		if(this.pe)
			this.pe.stop();
		
		var len = this.divlist.length;
		
		for(var i = 0; i < len; i++) {
			if(obj == this.lilist[i])
				this.change_num = i
		}
		if(this.cur_num == this.change_num) {
			this.startRotate();
			return;
		}
		
		this.applyChanges();
	}
}

Nosto.prototype.applyChanges = function() {
	this.divlist[this.cur_num].className = '';
	this.divlist[this.change_num].className = 'current';
	// $('nosto_link').href = this.alist[this.change_num].href;
	
	this.lilist[this.cur_num].className = '';
	this.lilist[this.change_num].className = 'current';
	/*
	this.lilist[this.cur_num].firstChild.src = this.lilist[this.cur_num].firstChild.src.replace('o.png','.png');
	this.lilist[this.change_num].firstChild.src = this.lilist[this.change_num].firstChild.src.replace('.png','o.png');
	*/
	
	var startRotate = this.startRotate.bind(this);
	
	new Effect.Parallel(
	[
		new Effect.Fade(this.divlist[this.cur_num], { sync: true }),
		new Effect.Appear(this.divlist[this.change_num], { sync: true })
	], { afterFinish: startRotate, fps: frames_per_sec  } );
}

var StringHandler = Class.create();

StringHandler.prototype = {
	initialize: function() {
		// void main(void) AGAIN!
	},
	extractId : function(str) {
		var match;
		reg = new RegExp("\/([0-9]+)\/","gi")
		match = reg.exec(str);
		// alert(match[0] + "\n" + match[1] + "\n" + match[2] + "\n" + match[3]);
		return match[1];
	},
	extractSite : function (str) {
		var match;
		reg = new RegExp("http://[^/]*/{1}([A-Za-z]+)","gi")
		match = reg.exec(str);
		// alert(match[0] + "\n" + match[1] + "\n" + match[2] + "\n" + match[3]);
		return match[1];
	},
	extractArticleType : function (str) {
		var match;
		reg = new RegExp("http://[^/]*/{1}[^/]*/{1}([A-Za-z]+)","gi")
		match = reg.exec(str);
		// alert(match[0] + "\n" + match[1] + "\n" + match[2] + "\n" + match[3]);
		return match[1];
	}
};

function AjaxHandler() {
	this.ignore_news_click = false;
}

AjaxHandler.prototype.registerNewsClick = function(str) {
	// alert('runnin registerNewsClick');
	this.ignore_news_click = false;
	gapi.plusone.go();
}

AjaxHandler.prototype.ignoreNewsClick = function() {
	this.ignore_news_click = true;
}

AjaxHandler.prototype.processData = function(response) {
	
	registerNewsClick = this.registerNewsClick.bind(this); // again, closure...
	
	req = response.responseXML.documentElement;
	$('news_content').innerHTML = req.getElementsByTagName('content')[0].firstChild.data;
	$('source_content').innerHTML = req.getElementsByTagName('source')[0].firstChild.data;
	
	myLightbox.updateImageList();
	
	new Effect.Appear('news_right_wrapper', { duration: 0.5, fps: frames_per_sec, afterFinish: registerNewsClick } );
}
	
AjaxHandler.prototype.runAjax = function(obj) {

	var processData = this.processData.bind(this); // For closure (binding 'this' to given instance) :p
	
	if(this.ignore_news_click == false) {
		this.ignoreNewsClick(); // don't accept any new news clicks :p
		var news = $('news_left');
		
		var arr = news.getElementsByTagName('a');
		/*
		for(var i = 0; i < arr.length; i++) {
			arr[i].className = '';
		}
		
		obj.className = 'selected';
		*/
		Effect.Fade('news_right_wrapper', {
			duration: 0.5,
			fps: frames_per_sec,
			afterFinish : function () {
				//new Effect.Fade('source_content')
				var url = '/ajax_loaders/news_loader.php';
				var id = MyStringHandler.extractId(obj.href);
				var site = MyStringHandler.extractSite(obj.href);
				var pars = 'id=' + id + '&site=' + site;
				var protoAjax = new Ajax.Request(
					url,
					{
						method: 'get',
						parameters: pars,
						onComplete: processData
					}
				);
			}
		});
	}
	return false;
}

function RssFeed() {
	// void
	var element;
}

RssFeed.prototype.getFeed = function(address, _element) {
	this.element = _element;
	// $('debug').innerHTML = address;
	// var processData = this.processData.bind(this); // Closure...
	var url = '/ajax_loaders/feed_loader.php';
	var pars = 'url=' + escape(address);
	new Ajax.Updater($(this.element),
		url,
		{
			method: 'get',
			parameters: pars
		}
	);
}
/*
RssFeed.prototype.processData = function(req) {
	var text = req.responseText;
	this.element.innerHTML = text;
}
*/
function JulkaisuTopTenList(position) {
	this.position = position;
	this.register_clicks = true;
}

JulkaisuTopTenList.prototype.show = function(el) {
	var width = 313;
	var registerClicks = this.registerClicks.bind(this);
	var id = 'julkaisut_inner';
	
	if(el == 'jutut' && this.position != 'jutut' && this.register_clicks == true) {
		if(this.position == 'julkaisut') {
			width = (2*width);
			$('tulevat_julkaisut_header').src = $('tulevat_julkaisut_header').src.replace('_active', '');
			$('tulevat_julkaisut_header').setOpacity(0.5);
		} else {
			$('gameranking_header').src = $('gameranking_header').src.replace('_active', '');
			$('gameranking_header').setOpacity(0.5);
		}
		$('uusimmat_artikkelit_header').src = $('uusimmat_artikkelit_header').src.replace('.gif', '_active.gif');
		$('uusimmat_artikkelit_header').setOpacity(0.99);
		
		this.register_clicks = false;
		new Effect.Move(
			id, {
				x: width,
				y: 0,
				duration: 0.3,
				transition: Effect.Transitions.sinoidal,
				afterFinish: registerClicks,
				fps: frames_per_sec
			}
		);
		this.position = 'jutut';
		
	}
	if(el == 'top_ten' && this.position != 'top_ten' && this.register_clicks == true) {
		if(this.position == 'jutut') {
			width = -width;
			$('uusimmat_artikkelit_header').src = $('uusimmat_artikkelit_header').src.replace('_active', '');
			$('uusimmat_artikkelit_header').setOpacity(0.5);
		} else {
			$('tulevat_julkaisut_header').src = $('tulevat_julkaisut_header').src.replace('_active', '');
			$('tulevat_julkaisut_header').setOpacity(0.5);
		}
		$('gameranking_header').src = $('gameranking_header').src.replace('.gif', '_active.gif');
		$('gameranking_header').setOpacity(0.99);
		this.register_clicks = false;
		new Effect.Move(
			id, {
				x: width,
				y: 0,
				duration: 0.3,
				transition: Effect.Transitions.sinoidal,
				afterFinish: registerClicks,
				fps: frames_per_sec
			}
		);
		this.position = 'top_ten';
		
	}
	if(el == 'julkaisut' && this.position != 'julkaisut' && this.register_clicks == true) {
		if(this.position == 'jutut') {
			width = (2*width);
			$('uusimmat_artikkelit_header').src = $('uusimmat_artikkelit_header').src.replace('_active', '');
			$('uusimmat_artikkelit_header').setOpacity(0.5);
		} else {
			$('gameranking_header').src = $('gameranking_header').src.replace('_active', '');
			$('gameranking_header').setOpacity(0.5);
		}
		$('tulevat_julkaisut_header').src = $('tulevat_julkaisut_header').src.replace('.gif', '_active.gif');
		$('tulevat_julkaisut_header').setOpacity(0.99);
		
		this.register_clicks = false;
		new Effect.Move(
			id, {
				x: -width,
				y: 0,
				duration: 0.3,
				transition: Effect.Transitions.sinoidal,
				afterFinish: registerClicks,
				fps: frames_per_sec
			}
		);
		this.position = 'julkaisut';
	}
}

JulkaisuTopTenList.prototype.registerClicks = function() {
	this.register_clicks = true;
}

function Storage() {
	var stored_value;
}

Storage.prototype.setValue = function(val) {
	this.stored_value = val;
}

Storage.prototype.getValue = function() {
	return this.stored_value;
}
