$(document).ready(function() {
	var controller = $('body').attr('id');
	var actions = $('body').attr('class').split(' ');

	if(typeof Init[controller] === 'object')
	{
		for(var i in actions)
		{
			if(typeof Init[controller][actions[i]] === 'function')
			{
				Init[controller][actions[i]]();
			}
		}
	}

	if(controller != 'sponsor')
	{
		Init.sponsor.index();
	}
});

Init = {
	sponsor: {
		liberia: function(){
			Init.sponsor.index()
		},
		index: function(){
			// Video playback
			$('#playvideo').click(function(e) {
				e.preventDefault();
				var el = $(this);
				el.parent().html(el.data('video'));
			});

			// Init gender selection
			$('ul.gender_picker li').click(function(event) {
				event.preventDefault();
				var element = $(this);
				element.parent().find('li').removeClass('active');
				element.addClass('active');
			});

			var container = $('#map_dropdown');
			var list = container.find('.list');
			var label = container.find('.label');

			// Open/close the list
			container.click(function(event){
				event.preventDefault();
				if(list.is(':visible'))
				{
					$('body').unbind('click.dropdown');
					if($('html').hasClass('ie7') || $('html').hasClass('ie6'))
					{
						$('#sponsor_form').find('.row:lt(2)').children().show();
					}
					list.hide();
				}
				else
				{
					if($('html').hasClass('ie7') || $('html').hasClass('ie6'))
					{
						$('#sponsor_form').find('.row:lt(2)').children().hide();
					}
					list.show();
					$('body').bind('click.dropdown', function(e) {
						if(e.target != list)
						{
							container.click();
						}
					});
				}
				return false;
			});

			// Select a continent
			container.find('a').click(function(event) {
				event.preventDefault();
				var el = $(this);
				label.text(el.text());
				label.data('selected', el.attr('class'));
				container.click();
				return false;
			});

			// Age dropdown
			var age_container = $('#age_dropdown');
			var age_list = age_container.find('.list');
			var age_label = age_container.find('.label');
			age_container.click(function(event){
				event.preventDefault();
				if(age_list.is(':visible'))
				{
					$('body').unbind('click.dropdown');
					if($('html').hasClass('ie7') || $('html').hasClass('ie6'))
					{
						$('#sponsor_form').find('.row:lt(2)').children().show();
					}
					age_list.hide();
				}
				else
				{
					if($('html').hasClass('ie7') || $('html').hasClass('ie6'))
					{
						$('#sponsor_form').find('.row:lt(2)').children().hide();
					}
					age_list.show();
					$('body').bind('click.dropdown', function(e) {
						if(e.target != age_list)
						{
							age_container.click();
						}
					});
				}
				return false;
			});

			// Select an age
			age_container.find('a').click(function(event) {
				event.preventDefault();
				var el = $(this);
				age_label.text(el.text());
				age_container.data('selected', el.data('value'));
				age_container.click();
				return false;
			});

			// Init alternating label for first and last name
			$('#nameLabel').alternating({inputs: $('#firstname, #lastname')});

			// Init infoslider
			$('#slide_opener').click(function(){
				var opener = $(this);
				var wrapper = $('#infoContainer');
				var content = wrapper.find('div:eq(0)');
				var height = 0;

				if(wrapper.hasClass('sliderHidden'))
				{
					height = content.height();
				}

				opener.toggleClass('sliderHidden');
				wrapper.toggleClass('sliderHidden');

				if(Modernizr.csstransitions)
				{
					wrapper.css({height: height + 'px'});
				}
				else
				{
					wrapper.animate({height: height + 'px'}, 300);
				}

				return false;
			});

			// Change tabs
			$('#sidebar').find('.tabs a').click(function(event){
				event.preventDefault();
				var index = $(this).parent().index();
				$('#sidebar').find('.tab').hide().eq(index).show();
				$('#sidebar').find('.tabs li').removeClass('active').eq(index).addClass('active');
			});

			// Form validation
			var validation = {
				born: {
					keyup: function(){
						var field = $(this);
						var value = field.val();

						if(value.match(/^[0-9]{6}$/))
						{
							return true;
						}
						else if(value.length >= 6 || field.hasClass('success'))
						{
							return false;
						}
					},
					blur: function(){
						return $(this).hasClass('success');
					}
				},
				phone: {
					keyup: function(){
						var field = $(this);
						var value = field.val().replace(/ /g, '');
						if(value.match(/^[0-9]{8}$/))
						{
							return true;
						}
						else if(value.length >= 8 || field.hasClass('success'))
						{
							return false;
						}
					},
					blur: function(){
						return $(this).hasClass('success');
					}
				},
				email: {
					keyup: function(){
						var field = $(this);
						var value = field.val().replace(/ /g, '');
						if(value.match(/^.+@.+\..{2,}$/))
						{
							return true;
						}
						else if(field.hasClass('success'))
						{
							return false;
						}
					},
					blur: function(){
						return $(this).hasClass('success');
					}
				},
				zip: {
					keyup: function(){
						var field = $(this);
						var value = field.val();

						if(!field.data('value'))
						{
							field.data('value', '');
						}

						if(value == field.data('value'))
						{
							return;
						}

						field.data('value', value);

						if(value.match(/^[0-9]{4}$/))
						{
							var place = $('#place');

							if(place.val().length === 0)
							{
								$('#place').siblings('.fieldstate').removeClass('success error');
								$('#place').siblings('.loader').show();
								$.getJSON(url('/sponsor/ajax_zipcode/zipcode:' + value), function(data){
									if(data.name && place.val().length === 0)
									{
										place.val(data.name);
										place.blur();
									}

									place.siblings('.loader').hide();
								});
							}

							return true;
						}
						else if(value.length >= 4 || field.hasClass('success'))
						{
							return false;
						}
					},
					blur: function(){
						return $(this).hasClass('success');
					}
				}
			};

			var messages = {
				firstname: 'Du må hete noe hvis du skal bli Plan-fadder.',
				lastname: 'Du må hete noe hvis du skal bli Plan-fadder.',
				born: 'Fyll ut fødselsdato i formatet DDMM&Aring;&Aring;'
			};

			$('#sponsor_form form input[type=text]').each(function(){
				var element = $(this);
				var id = element.attr('id');
				if(id.length === 0)
				{
					return;
				}

				// Call a validation function and adjust field accordingly
				var doValidation = function(func){
					var result = func.call(this);
					if(typeof result == 'undefined')
					{
						return;
					}

					var element = $(this);

					if(result)
					{
						element.removeClass('error').addClass('success');
						element.siblings('.fieldstate').removeClass('error').addClass('success');
						hideTooltip(element);
					}
					else
					{
						element.removeClass('success').addClass('error');
						element.siblings('.fieldstate').removeClass('success').addClass('error');
					}
				};

				// Use custom functions for validation or a simple one that only checks length
				if(validation[id])
				{
					for(var rule in validation[id])
					{
						(function(rule){
							element.bind(rule, function(){doValidation.call(this, validation[id][rule]);});
						})(rule);
					}
				}
				else
				{
					element.blur(function(){
						doValidation.call(this, function(){
							return $(this).val().length >= 2;
						});
					});
				}
			});

			$('#company_form form').bind('submit', function(event){
				event.preventDefault();
				var empty = false;
				var data = {};
				$('#company_form').find('input[type=text]').each(function(key, element){
					element = $(element);
					if(element.attr('type') == 'text')
					{
						if(element.val().length === 0)
						{
							empty = true;
						}

						data[element.attr('name')] = element.val();
					}
				});

				if(empty)
				{
					$('#form_feedback').show();
				}
				else
				{
					$('#form_feedback').hide();
					$.post(url('/sponsor/ajax_company_submit'), data, function(response){
						$.get(url('/thank_you_company'), function(response){
							Adform.Tracking.Track(40186,221152,'Sale=' + data.Company__sponsorships +
								'|Email=' + data.Company__email +
								'|ZIP=' + data.Company__zip +
								'|Country=Norge' +
								'|var3=' + data.Company__company +
								'|var4=' + data.Company__contact + '|');
							$('#sidebar').children().detach();
							$('#sidebar').append(response);
							Init.sponsor.thank_you();
						});
					});
				}
			});

			// Show and hide tooltips
			$('#sidebar a.fieldstate').click(function(){
				var element = $(this);

				if(!element.hasClass('error'))
				{
					return;
				}

				if(element.parent().find('.feedback').length === 0 || element.parent().find('.feedback.removing').length > 0)
				{
					if(messages[element.siblings('input').attr('id')])
					{
						showTooltip(element, messages[element.siblings('input').attr('id')]);
					}
					else
					{
						showTooltip(element, 'Fyll ut korrekt');
					}
				}
				else
				{
					hideTooltip(element);
				}
			});

			// Handle form submission
			$('#sponsor_form form').submit(function(event){
				event.preventDefault();
				$('#sponsor_form form input').blur();

				// Get any fields that do not validate
				var errorFields = $('#sponsor_form form input.error');
				if(errorFields.length === 0)
				{
					var data = {};
					$('#sponsor_form form input[type=text], #sponsor_form form select').each(function(){
						var name = $(this).attr('name');
						if(name.length > 0)
						{
							data[name] = $(this).val();
						}
					});

					//var dropdown = $('#sponsor_form').find('.dropdown .label');
					var dropdown = $('#sponsor_form').find('#map_dropdown .label');
					if (dropdown.data('selected') && dropdown.data('selected').match(/^country-/))
					{
						data['Sponsor[country_id]'] = dropdown.data('selected').split('-').pop();
					}
					else
					{
						switch(dropdown.text())
						{
							case 'Afrika':
								data['Sponsor[continent]'] = '2';
								break;
							case 'Asia':
								data['Sponsor[continent]'] = '3';
								break;
							case 'Latin-Amerika':
								data['Sponsor[continent]'] = '4';
								break;
							default:
								data['Sponsor[continent]'] = '1';
								break;

						}
					}

					switch($('#sponsor_form').find('.gender_picker .active .label').text())
					{
						case 'Jente':
							data['Sponsor[gender]'] = 3;
							break;
						case 'Gutt':
							data['Sponsor[gender]'] = 2;
							break;
						default:
							data['Sponsor[gender]'] = 1;
							break;
					}

					age = $('#age_dropdown').data('selected');
					if (age != 'any') {
						data['Sponsor[age]'] = age;
					}

					$.post(url('/sponsor/ajax_submit'), data, function(response){
						if(response.success)
						{
							$.get(url('/thank_you'), function(response){
								AddParam(846, data.Sponsor__zip);
								AddParam(2071, $('#sidebar').find('.dropdown .label').text());
								AddParam(2072, $('#sidebar').find('.gender_picker .active .label').text());
								AddParam(2082, data.Sponsor__firstname);
								AddParam(2083, data.Sponsor__lastname);
								AddParam(2084, data.Sponsor__email);
								CreateConversion('74295474-440b-436e-b937-2c15cf49fa93', 'NOK', '0');

								Adform.Tracking.Track(40186,221151,'Email=' + data.Sponsor__email +
									'|FName=' + data.Sponsor_firstname +
									'|LName=' + data.Sponsor__lastname +
									'|ZIP=' + data.Sponsor__zip +
									'|Country=Norge' +
									'|var1=' + $('#sponsor_form').find('.gender_picker .active .label').text() +
									'|var2=' + $('#sponsor_form').find('.dropdown .label').text());

								$('#sidebar').children().detach();
								$('#sidebar').append(response);
								Init.sponsor.thank_you();
							});

							$('body').attr('id', 'competition').addClass('index');
						}
						else
						{
							for(var field in response.validation)
							{
								var element = $('#' + field);
								if(messages[element.attr('id')])
								{
									element.siblings('.feedback').text(messages[element.attr('id')]);
								}
								else
								{
									element.siblings('.feedback').text('Fyll ut dette feltet.');
								}
							}
						}
					}, 'json');
				}
				else
				{
					if(errorFields.length <= 3)
					{
						errorFields.each(function(){
							var element = $(this);
							if(messages[element.attr('id')])
							{
								showTooltip(element, messages[element.attr('id')]);
							}
							else
							{
								showTooltip(element, 'Fyll ut korrekt');
							}
						});
					}
					errorFields[0].focus();
				}

				return false;
			});
		},
		thank_you: function() {
			$('#share_wall').bind('click', function(event){
				event.preventDefault();
				FB.login(function(response)
				{
					if (response.session)
					{
						var post = {
							message: 'I dag har jeg blitt Plan-fadder!',
							description: '',
							link: 'http://fadderskap.plan-norge.no/landingsside/?code=FSPN-PN-P2',
							picture: 'http://www.plan-norge.no/Images/logo.gif'
						};

						FB.api('/me/feed', 'post', post, function(response) {
							$('#share_wall').html('<span></span>Statusen din ble oppdatert.');
						});
					}
				}, {perms:'publish_stream'});
			});
		}
	},
	competition: {
		index: function() {
			$('#competition_sponsorship_no').click(function(){
				$('#competition_error').text('Du må være Plan-fadder for å bli med i konkurransen. Bli fadder i skjemaet til venstre.').show();
			});
			$('#competition_sponsorship_yes').click(function(){
				$('#competition_error').hide();
			});

			$('#competition_form').submit(function(event){
				var valid = true;

				if($('#competition_sponsorship_no').is(':checked'))
				{
					return false;
				}

				$(this).find('input[type=text], textarea').each(function(){
					if($(this).attr('id') != 'competition_sponsor_name' && $(this).val().length === 0)
					{
						valid = false;
					}
				});

				if(!valid)
				{
					$('#competition_error').text('Du må fylle ut alle feltene.').show();
					return false;
				}
			});
		}
	}
};

(function($)
{
	$.fn.extend({
		alternating: function(options)
		{
			var currentElement = -1;
			var timeout = 0;

			// Create focus and blur events for all inputfields
			options.inputs.each(function(index){
				var element = $(this);
				element.focus(function(){
					clearTimeout(timeout);
					currentElement = index;
				});
				element.blur(function(){
					timeout = setTimeout(function(){currentElement = -1;}, 1000);
				});
			});


			return this.each(function(){
				var element = $(this);

				// Remove for attribute from element
				element.attr('for', '');

				// Create click event
				element.click(function(){
					clearTimeout(timeout);
					var nextElement = currentElement + 1;
					if(nextElement == options.inputs.length)
					{
						nextElement = 0;
					}
					$(options.inputs[nextElement]).focus();
				});
			});
		}
	});
})(jQuery);

function showTooltip(input, text)
{
	var container = input.parent();

	if(container.find('.feedback').length === 0 || container.find('.feedback').css('opacity') < 1)
	{
		var feedback = $('<div class="feedback"><span></span>' + text +'</div>');
		feedback.css('opacity', 0);

		container.append(feedback);

		setTimeout(function(){
			feedback.css('opacity', 1);
		}, 1);

		// Set height of row
		var row = container;
		if(!row.hasClass('row'))
		{
			row = row.parent();
		}

		var height = 70 + 11 + feedback.outerHeight();

		if(row.css('height') != 70)
		{
			height = height >= parseInt(row.css('height'), 10) ? height : row.css('height');
		}

		row.css('height', height);
	}
}

function hideTooltip(input)
{
	var container = input.parent();
	var feedback = container.find('.feedback');
	if(feedback.length > 0)
	{
		if(Modernizr.csstransitions)
		{
			feedback.bind('webkitTransitionEnd transitionend oTransitionEnd', function(){
				feedback.detach();
			});
			feedback.css('opacity', 0);
			feedback.addClass('removing');
		}
		else
		{
			feedback.detach();
		}

		var row = container;
		if(!row.hasClass('row'))
		{
			row = row.parent();
		}

		if(row.find('.feedback').not('.removing').length === 0)
		{
			row.css('height', 70);
		}
		else
		{
			var height = 70 + 11 + row.find('.feedback:not(.removing)').outerHeight();
			row.css('height', height);
		}
	}
}
