// JavaScript Document

Event.observe(window, 'load', function() {
	if($('facebook_attach_message') && !$('facebook_attach_message').empty()) {
		$('facebook_attach_message').show();
		$('facebook_attach_message').highlight();
	}

	if($('info_box') && !$('info_box').empty())
	{
		$('info_box').show();
		$('info_box').highlight();
		
		$$('.campaign_container').each(function(e) { 
			var old_height = e.getHeight();
			var new_height = 44;
			var height = old_height + new_height;
			e.setStyle( { height: height + 'px' });
		});
	}

});

document.observe('dom:loaded', function() {
	
	$$('#delete_profile_button').invoke('observe','click', showProfileDeleteLink);

	$$('#modify_profile_form').invoke('observe','submit', storeProfileData);
	$$('#change_profile_image').invoke('observe','click', showProfileImageUploadForm);
	$$('#create_review').invoke('observe','click', showCreateNewReviewForm);
	$$('#create_comparison').invoke('observe','click', showCreateNewComparisonForm);
	$$('#comparisons ul li').invoke('observe', 'click', fetchComparisonForm);
	$$('#reviews ul li').invoke('observe', 'click', fetchReviewForm);
	$$('#carousel_next').invoke('observe', 'click', function(e) { carousel.next('carousel_movable_container'); } );
	$$('#carousel_previous').invoke('observe', 'click', function(e) { carousel.prev('carousel_movable_container'); } );
	$$('.comparison_open').invoke('observe', 'click', comparisonOpen);
	$$('.review_open').invoke('observe', 'click', reviewOpen);
	$$('.delete_comparison').invoke('observe', 'click', deleteComparison);
	$$('.delete_review').invoke('observe', 'click', deleteReview);

	if($('campaign_lift_container'))
		var MyRotator = new Rotator($('campaign_lift_container'));

	observeLimitText();
	
	$$('.thank').each(function(e) { new Effect.Appear(e); } );
	// $$('#add_comment_form').invoke('observe', 'submit', storeComment);
	// $$('.vote').invoke('observe', 'click', storeVote);
	// MUST BE LAST!
	$$('.validate_me').each(function(e) { new Validation(e, { useTitles: true }) });

	observeComments();
	$$('.modal_window').each(function(e) {
		
		var modal_window = new Control.Modal(e, {  
			overlayOpacity: 0.75,  
			className: 'modal',  
			fade: true,
			onSuccess: function(e) { $$('.store_vote_with_ajax').invoke('observe', 'click', storeVote); }
		});
	});
	
	$$('.tabs').each(function(tab_group){
		new Control.Tabs(tab_group);
	});
	if($('backgroundBanner'))
	{
		$('backgroundBanner').observe('click', function(event) {
			if(event.target.id == 'backgroundBanner') {
				// pageTracker._trackPageview($('backgroundBanner').title);
				Event.stop(event);
				window.open($('backgroundBanner').title, '_blank');
			}
		});
	}
	
	if($('login'))
	{
		$('login').down('input[type=text]').observe('focus', function(e) { this.select(); });
		if($('login').down('input[type=password]'))
			changePasswordToText($('login').down('input[type=password]'));
	}

	if($('fbL'))
	{
		fbLogin();
	}
});

fbLogin = function(e)
{
	FB.login(function(response) {
		if (response.session) {
			if (response.perms) {
			  // user is logged in and granted some permissions.
			  // perms is a comma separated list of granted permissions
				alert("fbLogin");
			} else {
			  // user is logged in, but did not grant any permissions
			}
		} else {
			// user is not logged in
		}
	}, {perms:'email'});
}

navigateToTitle = function(e)
{
	window.location.href = this.title;
}

var Rotator = Class.create(
{
	initialize: function(id)
	{
		this.el = $(id);
		this.images = $$('#' + this.el.id + ' img');
		this.list = $$('#' + this.el.id + ' li');
		var switchImage = this.switchImage.bind(this);
		this.list.invoke('observe', 'click', switchImage);
		this.index = 0;
		this.images.invoke('observe', 'click', navigateToTitle);
		this.effect = false;
		this.next = 1;

		if(this.images.size() > 1)
			this.startRotate();
	},
	
	switchImage: function(e)
	{
		var el = Event.element(e);
		if(el.hasClassName('selected'))
			return;
		this.pe.stop();
		
		if(this.effect)
		{
			this.cancelEffect();
		}
		
		var value = 0;
		var fade = false;
		this.images.each(function(e)
		{
			if(e.getOpacity() > value && e.visible())
			{
				value = e.getOpacity();
				fade = e;
			}
			else
			{
				e.setStyle({ opacity: 0, display: 'none' });
			}
		});
		
		
		this.next = parseInt(el.innerHTML) - 1;
		
		var next = this.next;
		
		this.setSelected(this.list[next]);
		
		var _this = this;
		
		this.effect = new Effect.Parallel(
		[
			new Effect.Fade(fade, { sync: true }),
			new Effect.Appear(this.images[next], { sync: true })
		], { afterFinish: function(e) { _this.effect = false; _this.startRotate(); _this.index = next; }, duration: 3 });
	},
	
	setSelected: function(el)
	{
		this.list.invoke('removeClassName','selected');
		el.addClassName('selected');
	},
	
	cancelEffect: function()
	{
		this.effect.cancel();
		this.effect = false;		
	},
	
	startRotate: function()
	{
		var crossFade = this.crossFade.bind(this);
		this.pe = new PeriodicalExecuter(crossFade, 8);
	},
	
	crossFade: function()
	{
		
		this.next = this.getNext();
		
		next = this.next;
		
		var selectTarget = this.getNext();
		
		this.setSelected(this.list[selectTarget]);
		
		var _this = this;

		this.effect = new Effect.Parallel(
		[
			new Effect.Fade(this.images[this.index], { sync: true }),
			new Effect.Appear(this.images[next], { sync: true })
		], { afterFinish: function(e) { _this.effect = false; _this.index = next; }, duration: 3 });	
	},
	
	getNext: function()
	{
		if(this.index < this.images.size() - 1)
		{
			return this.index + 1;
		}
		else
		{
			return 0;
		}
	}
});

showProfileDeleteLink = function(e)
{
	Event.stop(e);
	$('settings_content').hide();
	$('delete_profile_wrapper').show();
	$('delete_profile_wrapper').highlight();
	$('delete_profile_button').hide();
}

observeLimitText = function()
{
	$$('#comparisons textarea').invoke('observe', 'keypress', limitText);
	$$('#reviews textarea').invoke('observe', 'keypress', limitText);
}

limitText = function(e)
{
	var limit = 250
	if(!this.previous('div') || this.previous('div').className != 'limit')
	{
		var content = '<div class="limit" style="display: none;">' + (limit - this.value.length) + '</div>';
		this.insert({before: content});
		new Effect.Appear(this.previous('div'));
	}
	if(this.value.length > limit)
	{
		this.value = this.value.substring(0, limit);
	}
	this.previous('div').update(limit - this.value.length);
}

deleteComparison = function(e)
{
	Event.stop(e);
	if(confirm('Haluatko varmasti tuhota kyseisen vertailun?'))
	{
		var _this = this;
		var id = this.up('li').title;
		var params = { id: id };
		var url = 'templates/rekisteroityminen/delete_comparison.php';
		new Ajax.Request(url, { parameters: params, onSuccess: _this.up('li').remove() });
	}
}

deleteReview = function(e)
{
	Event.stop(e);
	if(confirm('Haluatko varmasti tuhota kyseisen arvostelun?'))
	{
		var _this = this;
		var id = this.up('li').title;
		var params = { id: id };
		var url = 'templates/rekisteroityminen/delete_review.php';
		new Ajax.Request(url, { parameters: params, onSuccess: _this.up('li').remove() });
	}
}

changePasswordToText = function(e)
{
	var name = e.name;
	e.remove();
	var content = '<input type="text" name=' + name + ' value="Salasana" id="replaced_password" />';
	$('login').down('input[type=text]').insert({ after: content });
	$('replaced_password').observe('focus', changeTextToPassword);
}

changeTextToPassword = function(e)
{
	var name = this.name;
	this.remove();
	var content = '<input type="password" name=' + name + ' value="" id="replaced_text" />';
	$('login').down('input[type=text]').insert({ after: content });
	Form.Element.focus('replaced_text');
}

observeComments = function()
{
	$$('.modal').invoke('remove');
	$$('.comments').each(function(e)
	{
		new Control.Modal(e,
		{  
			overlayOpacity: 0.75,  
			className: 'modal',  
			fade: true,
			width: 600,
			iframe: false,
			onSuccess: function(e)
			{ 
				// alert('jee');
				$$('#add_comment_form').invoke('observe', 'submit', storeComment);
				$$('#comment_list .delete').invoke('observe', 'click', deleteComment);
				// getTMqs('www.tyylituomari.fi/kommentti', 'www.tyylituomari.fi kommentti', 'forma_fi', 'fi', 'UTF-8', tmsec);
				trackPage('/kommentti', '');
			},
			beforeOpen: function(e)
			{
				$$('#add_comment_form').invoke('show');
			}
		});
	});
}

deleteComment = function(e)
{
	Event.stop(e);
	var url = this.href;
	var content = this.up('li');
	if(confirm('Haluatko varmasti poistaa kyseisen kommentin?'))
		new Ajax.Request(url, { method: 'post', onSuccess: function(e) { if(e.responseText == "true") content.remove() } });
}

storeComment = function(e)
{
	Event.stop(e);
	var _this = this;
	this.request(
		{
			method: 'post',
			onSuccess: function(e) {
				if(e.responseText != "false")
				{
					var content = e.responseText;
					$('comment_list').insert({ 'top' : content});
					$('comment_list').down('li').highlight();
					_this.down('textarea').clear();
					_this.hide();
					$$('#comment_list .delete').invoke('observe', 'click', deleteComment);
				}
				else
				{ 
					alert('Virhe! Ole hyvä ja yritä uudestaan.');
				}
			}
		}
	);
}

storeVote = function(e)
{
//	Event.stop(e);
	var el = this;
	var url = this.href;
	new Ajax.Request(url, {
		method: 'get', onSuccess: function(e) {
			alert('Kiitos mielipiteestäsi!');
//			Control.Modal.close(el.up('.modal'));
		}
	});
}

deleteComparisonImage = function(e)
{
	this.up('div').insert({ 'after': '<input type="hidden" name="delete_this_id[]" value="' + this.title + '" />' } );
	this.up('div').insert({ 'after': '<input type="file" name="files[]" class="required" title="Molemmat kuvat ovat pakkollisia" />'} );
	this.remove();
	$$('.validate_me').each(function(e) { new Validation(e, { useTitles: true }) });
		
}

deleteReviewImage = function(e)
{
	this.up('div').insert({ 'after': '<input type="hidden" name="delete_this_id[]" value="' + this.title + '" />' } );
	this.up('div').insert({ 'after': '<input type="file" name="files[]" class="required" title="Kuva on pakollinen" />'} );
	this.remove();
	$$('.validate_me').each(function(e) { new Validation(e, { useTitles: true }) });
		
}

showProfileImageUploadForm = function(e) {
	Event.stop(e);
	$('profile_image_wrapper').hide();
	$('upload_profile_image_form_wrapper').show();
}

storeProfileData = function(e) {
	Event.stop(e);
	if($('password_change').value == $('password_check').value) {
		$('modify_profile_form').request({ onSuccess: function(e) { $('info_box').innerHTML = 'Tietosi tallennettu'; $('info_box').show(); $('info_box').highlight(); } });
	} else {
		var content = 'Salasanat eivät ole samat!';
		$('info_box').innerHTML = content;
		$('info_box').show();
		$('info_box').highlight();
	}
}

showCreateNewComparisonForm = function(e) {
	Event.stop(e);
	if($('create_new_comparison_form').visible())
	{
		$('create_new_comparison_form').hide();
		$('comparison_form_wrapper').hide();
		$$('.comparisons_list').invoke('show');
		this.innerHTML = 'Luo uusi vertailu';
		
	}
	else if($('update_comparison_form') && $('update_comparison_form').visible())
	{
		$('update_comparison_form').hide();
		$('comparison_form_wrapper').hide();
		$$('.comparisons_list').invoke('show');
		this.innerHTML = 'Luo uusi vertailu';
	}
	else
	{
		$('create_new_comparison_form').show();
		$('comparison_form_wrapper').hide();
		$$('.comparisons_list').invoke('hide');
		this.innerHTML = 'Näytä vertailut';
	}
}

showCreateNewReviewForm = function(e) {
	Event.stop(e);
	/*
	if(!$('create_new_review_form').visible())
	{
		$('create_new_review_form').show();
		$('review_form_wrapper').hide();
		$$('.reviews_list').invoke('hide');
	}
	else
	{
		$('create_new_review_form').hide();
		$('review_form_wrapper').hide();
		$$('.reviews_list').invoke('show');
	}
	this.innerHTML = 'Näytä arvostelut';
	*/
	if($('create_new_review_form').visible())
	{
		$('create_new_review_form').hide();
		$('review_form_wrapper').hide();
		$$('.reviews_list').invoke('show');
		this.innerHTML = 'Luo uusi arvostelu';
		
	}
	else if($('update_review_form') && $('update_review_form').visible())
	{
		$('update_review_form').hide();
		$('review_form_wrapper').hide();
		$$('.reviews_list').invoke('show');
		$('create_review').innerHTML = 'Luo uusi arvostelu';
	}
	else
	{
		$('create_new_review_form').show();
		$('review_form_wrapper').hide();
		$$('.reviews_list').invoke('hide');
		this.innerHTML = 'Näytä arvostelu';
	}
}

fetchComparisonForm = function(e)
{
	var comp_id = Number(this.title);
	// getTMqs('www.tyylituomari.fi/vertailu/' + comp_id, 'www.tyylituomari.fi vertailu ' + comp_id, 'forma_fi', 'fi', 'UTF-8', tmsec);
	
	var url = 'templates/rekisteroityminen/fetch_comparison.php';
	new Ajax.Updater($('comparison_form_wrapper'), url, {
		parameters: { id: comp_id },
		method: 'post',
		onComplete: function(e) {
			$$('.delete_comparison_image').invoke('observe', 'click', deleteComparisonImage);
			$('comparison_form_wrapper').show();
			$('create_new_comparison_form').hide();
			$$('.comparisons_list').invoke('hide');
			$('create_comparison').innerHTML = 'Näytä vertailut';
			observeLimitText();
			trackPage('/vertailu/' + comp_id);
		}
	} );
}

trackPage = function(str, comp_id)
{
	//'www.tyylituomari.fi/arvostelu/'
	var str_combined = str + comp_id;
	var str_replaced = str_combined.replace(/\//, ' ');
	// alert(str_replaced);
	getTMqs('www.tyylituomari.fi' + str_combined, 'www.tyylituomari.fi' + str_replaced, 'forma_fi', 'fi', 'UTF-8', tmsec);
	_gaq.push(['_trackPageview', str_combined]);
	// pageTracker._trackPageview(str_combined);
}

fetchReviewForm = function(e)
{
	var comp_id = Number(this.title);
	// getTMqs('www.tyylituomari.fi/arvostelu/' + comp_id, 'www.tyylituomari.fi arvostelu ' + comp_id, 'forma_fi', 'fi', 'UTF-8', tmsec);
	var url = 'templates/rekisteroityminen/fetch_review.php';
	new Ajax.Updater($('review_form_wrapper'), url, {
		parameters: { id: comp_id },
		method: 'post',
		onComplete: function(e) {
			$$('.delete_review_image').invoke('observe', 'click', deleteReviewImage);
			$('review_form_wrapper').show();
			$('create_new_review_form').hide();
			$$('.reviews_list').invoke('hide');
			$('create_review').innerHTML = 'Näytä arvostelut';
			observeLimitText();
			trackPage('/arvostelu/', comp_id);
		}
	} );
}

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;
}

comparisonOpen = function(e)
{
	Event.stop(e);
	url = this.down('a').href;
	new Ajax.Updater('main_lift_container', url, { onComplete: function(e) { observeComments(); } } );
}

reviewOpen = function(e)
{
	Event.stop(e);
	url = this.down('a').href;
	new Ajax.Updater('main_lift_container', url, { onComplete: function(e) { observeComments(); } } );
}

// Carousel

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

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

Carousel.prototype.registerEventHandlers = function()
{
	$$('.comparison_open').invoke('observe', 'click', comparisonOpen);
	$$('.review_open').invoke('observe', 'click', reviewOpen);
	this.registerClicks();
}

Carousel.prototype.next = function(id) {
	var registerEventHandlers = this.registerEventHandlers.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 mode = MyStringHandler.extractMode(h_ref);
		var id_s = MyStringHandler.extractId(h_ref);
		var type = MyStringHandler.extractType(h_ref);
		var page = MyStringHandler.extractPage(h_ref);

		var url = 'templates/etusivu/carousel.php';
		var pars = 'id=' + id_s + '&type=' + type + '&direction=older&page=' + page;
		if(a_list[(a_list.length - 1)].title == 'popularity')
			pars += '&popularity=1';
		if(mode) {
			pars += '&iframe=' + mode;
			var url = 'templates/iframe_karuselli/carousel.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, '<ul>' + response.responseText + '</ul>');
					
					_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: registerEventHandlers
						}
					);
				}
			}
		);
		
	} 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: registerEventHandlers
			}
		);
		this.cur_pos++;
	}
}

Carousel.prototype.prev = function(id) {
	var registerEventHandlers = this.registerEventHandlers.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 type = MyStringHandler.extractType(h_ref);
		var page = MyStringHandler.extractPage(h_ref);
		var pars = 'id=' + id_s + '&type=' + type + '&direction=newer&page=' + page;
		if(a_list[0].title == 'popularity')
			pars += '&popularity=1';
		var url = 'templates/etusivu/carousel.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: registerEventHandlers
						}
					);
				}
			}
		);
		
	} 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: registerEventHandlers
			}
		);
		this.cur_pos--;
	}
}

function StringHandler()
{
}

StringHandler.prototype = {
	initialize: function() {
		// void main(void) AGAIN!
	},
	extractId : function(str) {
		var m;
		//alert(str);
		reg = new RegExp("(&id=){1}([^&]*)","gi")
		m = reg.exec(str);
		//alert(m[0] + "\n" + m[1] + "\n" + m[2] + "\n" + m[3]);
		return m[2];
	},
	extractType : function (str) {
		var m;
		//alert(str);
		reg = new RegExp("(vote_type=){1}([^&]*)","gi")
		m = reg.exec(str);
		//alert(m[0] + "\n" + m[1] + "\n" + m[2] + "\n" + m[3]);
		return m[2];
	},
	extractPage : function (str) {
		var m;
		//alert(str);
		reg = new RegExp("(page=){1}([^&]*)","gi")
		m = reg.exec(str);
		//alert(m[0] + "\n" + m[1] + "\n" + m[2] + "\n" + m[3]);
		return m[2];
	},
	extractArticleType : function (str) {
		var m;
		reg = new RegExp("http://[^/]*/{1}[^/]*/{1}([A-Za-z]+)","gi")
		m = reg.exec(str);
		// alert(match[0] + "\n" + match[1] + "\n" + match[2] + "\n" + match[3]);
		return m[1];
	},
	extractMode : function(str) {
		var m;
//		alert(str);
		reg = new RegExp("(&iframe=){1}([^&]*)","gi")
		m = reg.exec(str);
//		alert(m[0] + "\n" + m[1] + "\n" + m[2] + "\n" + m[3]);
		if(m != null)
			return m[2];
		else
			return false;
	}
};

var carousel = new Carousel();
var MyStringHandler = new StringHandler();
