// log function
window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments))}};

// Setup some 'constants' (or at least something that follows the convention)
// Since the keyword 'const' only works in Mozilla, we just keep the convention
// to use UPPERCASE named vars. DO NOT OVERWRITE THEN...
var TYPE_INFO    = 'info';
var TYPE_ERROR   = 'error';
var TYPE_SUCCESS = 'success';
var TYPE_WARNING = 'warning';

var MSG_TEMP     = true;

// Setup configuration variables.
// This includes strings used as well as DOM elements
// being inserted upon various AJAX calls and operations.
var nk = {};

// global vars
var feedback, $feedback, $org_edit_link;

// strings
nk.strings = {
	loading   : 'Lade...',
	saving    : 'Speichere...',
	saved     : 'Gespeichert.',
	error     : 'Fehler aufgetreten.',

	cat_error : 'Diese Checkbox kann nicht deaktiviert werden, da sie zu einer Hauptkategorie gehoert.',

	def_cost : 'Kostenlos',
	def_register: 'ohne Anmeldung'
};

// config items
nk.config = {
	delay                  : 1000, // ms
	max_secondary_selected : 2,
	slide_speed            : 'fast',
	scroll_speed           : 500, // ms
	feedback_delay         : 2000 // ms
};

(function ($) {

	// Prepare feedback box. Insert the element into the DOM.
	// We insert an empty <div> with an id 'saef_feedback',
	// feel free to style it properly. For now, we just position
	// it absolutely on the top, using the full width.
	feedback = '<div id="saef_feedback"></div>';
	$feedback = $(feedback).hide();
	$('body').append($feedback);

	// Organizator edits.  Functions to call when a user is
	// editing the organizator details for a given event.

	// setup targets
	$org_edit_link = $('#org_edit');
	var $org_edit_target = $('#org_edit_target');
	var $org_preview = $('#org_preview');
	var $org_profile = $('#org_profile');

	// organizator edit
	$org_edit_link.bind('click', function (e) {

		// clear target, show loading text
		var $button_target = $(e.target);
		var button_text = $button_target.html();

		$org_edit_target.slideUp(nk.config.slide_speed, function(e) {
		    $(this).empty();
			$button_target.html(nk.strings.loading);
		});

		// get form
		$.ajax({

			url: this.href,
			type: 'GET',
			async: false,
			cache: false,

			error: function(XMLHttpRequest, textStatus, errorThrown) {
				show_error(XMLHttpRequest, textStatus, errorThrown);
			},

			success: function (data) {

				// display form inline
				$org_edit_target.empty().append(data).slideDown(nk.config.slide_speed);

				// setup ajax form submission
				$('#org_edit_form').bind('submit', function (e) {

					disable_submit_buttons();

					var org_preview_path = $('#org_profile_path', $(this)).val();
					var org_id = $('#org_id', $(this)).val();
					var form = this;

					// show feedback
					$org_edit_target.slideUp(nk.config.slide_speed).empty();

					$feedback
						.html(feedback_div(nk.strings.saving, TYPE_INFO))
						.slideDown(nk.config.slide_speed, function () {

							var options = {

								type: 'POST',
								// iframe: true,
								async: false,
								cache: false,

								// error callback
								error: show_error,

								// success callback
								success: function (data) {
									show_feedback(nk.strings.saved, TYPE_SUCCESS, MSG_TEMP);

									// update profile box
									$org_preview.load(org_preview_path, { 'org_id': org_id });

									// show buttons
									$org_edit_link.show();
									enable_submit_buttons();

									// scroll to profile position
									// $.scrollTo($org_profile, nk.config.scroll_speed);
								}
							};

							$(form).ajaxSubmit(options);

						});

					e.preventDefault();

				}); // edit form submit
			}
		});

		$button_target.html(button_text);
		$org_edit_link.hide();

		e.preventDefault();

	}); // oranizator edit link

	// Categories selection handling.  This section takes care
	// of categories specific error messages and ensures js-based
	// validation of the category user selection / input.

	// setup DOM elements
	var $cat_select = $('#cat_select'); // fieldset with all category fields
	var $cat_secondary_container = $('#cat_secondary_container');
	var $secondary_inputs = $cat_secondary_container.find('input[type=checkbox]');

	// gender
	var $cat_gender_container = $('#cat_gender');
	var gender_all_id = 'cat4_48';
	var $gender_inputs = $cat_gender_container.find('input[type=radio]');
	var $gender_all_input = $cat_gender_container.find('#' + gender_all_id);

	// age
	var $cat_age_container = $('#cat_age');
	var age_all_id = 'cat3_55';

	var $age_inputs = $cat_age_container.find('input[type=checkbox]');
	var $age_all_input = $cat_age_container.find('#' + age_all_id);

	// Prevent from selecting more than three secondary categories
	$cat_secondary_container.trilemma( { max: nk.config.max_secondary_selected } );

	// Bind click events on secondary category
	$secondary_inputs.each(function(i) {
		$(this).bind('change', function(e) {
			var number_checked = $secondary_inputs.filter(':checked').length;
		});

		// prevent readonly elements from being changed
		$(this).bind('click', function(e) {
			if ($(this).attr('rel') == 'readonly')
			{
				show_feedback(nk.strings.cat_error, TYPE_WARNING, MSG_TEMP);
				e.preventDefault();
			}
		});
	});

	// Spice up the age category selection
	$age_inputs.each(function(i) {

		$(this).bind('change', function(e) {

			var checked_count = $age_inputs.filter(':checked').length;

			if (checked_count == 0)
			{
				$age_all_input.attr('checked', 'checked');
			}
			else if (checked_count > 0 && this.id == age_all_id)
			{
				$age_inputs.not(this).removeAttr('checked');
			}
			else
			{
				$age_all_input.removeAttr('checked');
			}

		});

	});

	// Select default gender
	if ($gender_inputs.filter(':checked').length == 0)
	{
		$gender_all_input.attr('checked', 'checked');
	}

	// Add default values for pre-filled fields
	var $field_cost = $('#field_id_33');
	var $field_register = $('#field_id_34');

	if ($field_cost.val() == "")
	{
		$field_cost.val(nk.strings.def_cost)
	}

	if ($field_register.val() == "")
	{
		$field_register.val(nk.strings.def_register)
	}

	// Perform tasks as soon as the entire document is loaded.
	// Here's where we enable the submit buttons form-wide.
	window.onload = function() {

		// trigger change events
		$secondary_inputs.each(function(i) {
			$(this).change();
		});

		// trigger age/gender category change events
		var $age_checked = $age_inputs.filter(':checked');
		if ($age_checked.length > 0)
		{
			$age_checked.slice(0,1).change();
		}
		else
		{
			$age_inputs.slice(0,1).change();
		}

		// initially disable all unchecked if more than maximum
		disable_all_unchecked($secondary_inputs);

		// show category selection
		$cat_select.slideDown(nk.config.slide_speed);

		$org_edit_link.show();
		enable_submit_buttons();
	};

})(jQuery);

// Disables all unchecked checkbox elements in the list of inputs.
function disable_all_unchecked(inputs)
{
	if (inputs.filter(':checked').length >= nk.config.max_secondary_selected)
	{
		inputs.each(function(i) {
			if ( ! $(this).attr('checked'))
			{
				$(this).attr('disabled', 'disabled');
			}
		});
	}
}

// Helper functions to display feedback boxes.
// Can be errors, warnings, infos or similar.
function feedback_div(data, type)
{
	type = (typeof(type) == 'undefined') ? TYPE_INFO : type;
	return '<div class="feedback ' + type + '">' + data + '</div>';
}

// Feedback helper function. Takes care of displaying
// progress information to the user. Additionaly, makes
// sure there's no flickering and other s*it animation-related stuff.
function show_feedback(data, type, temp, callback)
{
	temp = (typeof(temp) == 'undefined') ? false : temp;

	// set message content
	$feedback.html(feedback_div(data, type));

	// show if hidden
	if ($feedback.is(':hidden'))
	{
		$feedback.slideDown(nk.config.slide_speed);
	}

	// remove later if temp
	if (temp)
	{
		$feedback
			.animate({ 'opacity' : 1 }).delay(nk.config.delay)
			.slideUp(nk.config.slide_speed);
	}

	return $feedback;
}

// Removes any messages from the feedback container and hides
// the container if visible.
function clear_feedback()
{
	// hide if shown
	if ( ! $feedback.is(':hidden'))
	{
		$feedback.slideUp(nk.config.slide_speed).empty();
	}
}

// Helper function to compose and display AJAX-related errors
function show_error(XMLHttpRequest, textStatus, errorThrown)
{
	var error_msg = XMLHttpRequest + "\n\n" + textStatus+ "\n\n" + errorThrown;
	enable_submit_buttons();
 	return show_feedback(error_msg, TYPE_ERROR);
}

// Helper function to disable all submit buttons on a page
function disable_submit_buttons()
{
	// disable submit buttons
	var submits = $('input[type=submit]');
	for (var i = submits.length - 1; i >= 0; i--){
		$(submits[i]).attr('disabled', 'disabled');
	};
}

// Helper function to enable all submit buttons on a page
function enable_submit_buttons()
{
	// re-enable submit buttons
	var submits = $('input[type=submit][disabled]');
	for (var i = submits.length - 1; i >= 0; i--){
		$(submits[i]).removeAttr('disabled');
	};
}

// Helper function to retrieve the entire HTML of a selected
// DOM element, as opposed to the innerHTML as delivered by
// the html() jQuery method.
// Courtesy of  http://www.interaktionsdesigner.de
(function($) {
	jQuery.fn.entireHtml = function() {
		if(this.length == 1) {
			return this.clone().wrap('<div></div>').parent().html();
		}
		else {
			var html = '';
			$(this).each(function() {
				html+= $(this).entireHtml();
			});
			return html;
		}
	}
})(jQuery);
