
// config

var CUSTOM_SCROLL_AREA_MAX_HEIGHT = 270; // pixels

var OVERLAY_PANE_SLIDE_SPEED = 500;

var MODERATE_MENU_TOP_CORRECTION = 3;
var MODERATE_MENU_LEFT_CORRECTION = 7;


$(function() {
	$(document.body).addClass('js-enhanced');
	
	if (typeof BLINK != 'undefined') {
		var body = $(document.body);
		var black = true;
		setInterval(function() {
			body.css('background-color', black ? 'black' : 'white');
			black = !black;
		}, 100);
	}
	
	if (typeof NOTIFICATION_TITLE != 'undefined') {
		showNotification(NOTIFICATION_TITLE, NOTIFICATION_MESSAGE, NOTIFICATION_SUCCESS);
	}
	
	Cufon.now();
	
	initCustomScroll();
	initCollapsibleBlock();
	initOverlayPanes();
	initModerate();
	initAppelSwitches();
	initRadioAutoSubmitFilterForm();
	initFormDates();
	ModalOverlay.init();
});


/* utilities */

function setPreference(preference, value, callback) {
	var params = {};
	params['preferences[' + preference + ']'] = value;
	ajaxModuleActionCall('common', 'set-preferences', callback, params);
}

function ajaxModuleActionCall(module, action, callback, params, url) {
	if (!params) {
		params = {};
	}
	params.module = module;
	params.action = action;
	params.format = 'json';
	params[CSRF_TOKEN_NAME] = CSRF_TOKEN; 
	if (typeof url == 'undefined') {
		url = 'index.php';
	}
	$.post(url, params, function(data, status, xhr) {
		if (callback) {
			callback(data, status, xhr);
		}
		processAjaxResponse(data);
	}, 'json');
}

function processAjaxResponse(data) {
	if (data.notification) {
		showNotification(
			data.notification.title,
			data.notification.message,
			data.notification.success
		);
	}
	initModerate();
}

function stringPadLeft(value, length, padChar) {
	var string = value.toString();
	while (string.length < length) {
		string = padChar + string;
	}
	return string;
}

function applyCustomFontHeavy(selector) {
	applyCustomFont(selector, CUSTOM_FONT_HEAVY);
}

function applyCustomFontLight(selector) {
	applyCustomFont(selector, CUSTOM_FONT_LIGHT);
}

function applyCustomFont(selector, type) {
	Cufon.replace(selector, {fontFamily: type});
}

function isDescendantOf(parent, descendant) {
	if (parent == descendant) {
		return false;
	}
	if (parent.contains) {
		return parent.contains(descendant);
	}
	var children = parent.childNodes;
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		if (child == descendant || isDescendantOf(child, descendant)) {
			return true;	
		}
	}
	return false;
}

function isOwnMouseOutEventOf(element, event) {
	var from = event.target || event.fromElement;
	var to = event.relatedTarget || event.toElement;
	return element != to
		&& !isDescendantOf(element, to)
		&& (element == from || isDescendantOf(element, from));
}

function isOwnMouseOverEventOf(element, event) {
	var from = event.relatedTarget || event.fromElement;
	var to = event.target || event.toElement;
	return element != from
		&& !isDescendantOf(element, from)
		&& (element == to || isDescendantOf(element, to));
}

function hasCustomFonts() {
	return typeof CUSTOM_FONT_HEAVY != 'undefined';
}


/* init functions */

function initFormDates() {
	$.datepicker.setDefaults({
		dateFormat: 'dd-mm-yy',
		firstDay: 1
	});
	$('input.date').each(function() {
		var date = $(this);
		if (!date.hasClass('hasDatepicker')) {
			date.datepicker();
		}
	});
}

function initRadioAutoSubmitFilterForm() {
	var filterForm = $('.filter-form.radio-auto-submit');
	if (filterForm.length == 0) {
		return;
	}
	
	$('.submit-button', filterForm).addClass('hidden');
	$('.radio', filterForm).click(function() {
		filterForm.submit();
	});
}

function initCollapsibleBlock() {
	$('.collapsible-block').each(function() {
		var collapsibleBlock = $(this);
		collapsibleBlock.addClass('enhanced');
		
		var content = $('.block-content', collapsibleBlock);
		var title = $('.block-title', collapsibleBlock);
		
		if (!content.parent().hasClass('block')) {
			content = content.parent();
		}
		
		var blockID = collapsibleBlock.get(0).id;
		var saveCollapsedState = Boolean(blockID);
		
		var isDefaultOpen = collapsibleBlock.hasClass('collapsible-default-open');
		var isOpen = isDefaultOpen;
		
		if (saveCollapsedState) {
			var cookieName = blockID.replace(/[^a-zA-Z0-9-]/g, '-');
			if (!collapsibleBlock.hasClass('collapsible-global')) {
				cookieName += '-' + VIEW;
			}
			var hasCookie = $.cookie(cookieName) == 1;
			isOpen = (isDefaultOpen && !hasCookie) || (!isDefaultOpen && hasCookie);
		}
		
		var openClose = $('<span>');
		openClose.addClass('collapse-icon');
		openClose.height(title.outerHeight());
		title.append(openClose);
		
		if (!isOpen) {
			collapsibleBlock.addClass('collapsed');
			content.hide();
		}
		
		title.click(function() {
			content.slideToggle();
			collapsibleBlock.toggleClass('collapsed');
			
			if (saveCollapsedState) {
				var isClosed = collapsibleBlock.hasClass('collapsed');
				if ((isClosed && isDefaultOpen) || (!isClosed && !isDefaultOpen)) {
					$.cookie(cookieName, 1);
				}
				else {
					$.cookie(cookieName, 0);
				}
			}
		});
	});
}

function initCustomScroll() {
	var maxHeightRegex = /max-height-(\d+)/;
	var customScrollBlocks = $('.custom-scroll-block');
	customScrollBlocks.each(function() {
		var scrollArea = $('.scroll-area', this);
		var maxHeight;
		var match = maxHeightRegex.exec(scrollArea.attr('class'));
		if (match) {
			maxHeight = parseInt(match[1]);
		}
		else {
			maxHeight = CUSTOM_SCROLL_AREA_MAX_HEIGHT;
		}
		if (scrollArea.height() > maxHeight) {
			scrollArea.height(maxHeight);
			$(this).addClass('scroll-activated');
			scrollArea.jScrollPane({
				mouseWheelSpeed: 40,
				showArrows: true
			});
		}
	});
}

function initAppelSwitches() {
	$('.appel-switch').appelSwitch();
}


function showNotification(title, content, isSuccess) {
	var notification = $("#notification");
	if (!notification.length) {
		var html = '<div id="notification" style="display: none;"><span class="block-close-button"></span><h2 class="title"></h2><p class="content"></p></div>';
		var header = $('.title-header-container');
		if (header.length) {
			header.after(html);
		}
		else {
			$('#main-content').prepend(html);
		}
		notification = $("#notification");
	}
	
	notification.toggleClass('success', isSuccess);
	notification.toggleClass('fail', !isSuccess);
	
	var titleElement = $('.title', notification);
	if (!title || $.trim(title) == '') {
		titleElement.hide();
	}
	else {
		titleElement.show();
		titleElement.html(title);
	}
	
	var contentElement = $('.content', notification);
	contentElement.html(content);
	
	notification.slideDown();
	
	function hideNotification() {
		notification.slideUp();
	}
	
	$(".block-close-button", notification).click(function(event) {
		hideNotification();
		event.preventDefault();
		event.stopPropagation();
	});
}


var ModalOverlay = {
	_element: null,
	
	init: function() {
		this._element = $(document.createElement('div'));
		this._element.attr('id', 'modal-overlay');
		this.hide();
		$(document.body).append(this._element);
	},
	
	show: function() {
		this._element.show();
	},
	
	hide: function() {
		this._element.hide();
	}
};


function initOverlayPanes() {
	var overlayPanes = $('.overlay-pane');
	
	overlayPanes.each(function() {
		var pane = $(this);
		
		initOverlayPane(pane);
		
		$('.title', pane).show();
		$('.content', pane).show();
	});
	
	$('.pane-close-button', overlayPanes).click(function(e) {
		e.preventDefault();
		e.stopPropagation();
		
		toggleOverlayPane($(this).closest('.overlay-pane'));
	});
	
	overlayPanes.click(function(event) {
		event.stopPropagation();
	});
	
	$(document).click(function() {
		overlayPanes.each(function() {
			closeOverlayPane($(this));
		});
	});
}

function initOverlayPane(pane) {
	pane.css('top', getPaneClosedTop(pane));
}

function openOverlayPane(pane) {
	if (pane.hasClass('collapse')) {
		return;
	}
	
	$(window).scrollTop(0);
	
	ModalOverlay.show();
	
	pane.addClass("collapse");
	pane.css('z-index', parseInt(pane.css('z-index')) + 1);
	pane.animate({top: '0px'}, OVERLAY_PANE_SLIDE_SPEED);
}

function closeOverlayPane(pane) {
	if (!pane.hasClass('collapse')) {
		return;
	}
	
	ModalOverlay.hide();
	
	pane.animate(
		{top: getPaneClosedTop(pane)},
		OVERLAY_PANE_SLIDE_SPEED,
		function() {
			pane.css('z-index', parseInt(pane.css('z-index')) - 1);
			pane.removeClass('collapse');
		}
	);
}

function toggleOverlayPane(pane) {
	if (isOverlayPaneOpen(pane)) {
		closeOverlayPane(pane);
	}
	else {
		openOverlayPane(pane);
	}
}

function isOverlayPaneOpen(pane) {
	return pane.hasClass('collapse');
}

function getPaneClosedTop(pane) {
	var content = $('.content', pane);
	return '-' + (content.height() + pane.children('.title').outerHeight() + 1) + 'px';
}

function initModerate() {
	var container = $('#moderate-menus');
	if (container.length == 0) {
		container = $('<div id="moderate-menus"></div>');
		container.appendTo(document.body);
	}
	
	var moderateMenus = $('.moderate-menu');
	var moderateButtons = $('.moderate-button');
	
	moderateButtons.show();
	
	moderateButtons.click(function(event) {
		event.preventDefault();
		event.stopPropagation();
	});
	
	$('*', moderateButtons).click(function(event) {
		event.stopPropagation();
	});
	
	moderateButtons.hover(
		function() {
			var button = $(this);
			var moderateMenu = $(button.attr('href'));
			moderateMenu.show();
			
			var offset = button.offset();
			moderateMenu.css('top', offset.top + MODERATE_MENU_TOP_CORRECTION);
			moderateMenu.css('left', offset.left + MODERATE_MENU_LEFT_CORRECTION);
		},
		function() {
			var button = $(this);
			var moderateMenu = $(button.attr('href'));
			moderateMenu.hide();
		}
	);
	
	moderateMenus.appendTo(container);
	moderateMenus.each(function() {
		var moderateMenu = $(this);
		moderateMenu.hover(
			function() {
				moderateMenu.show();
			},
			function() {
				moderateMenu.hide();
			}
		);
	});
}

function lightBoxConfig() {
	return {
		imageLoading: 'third-party/jquery/plugins/lightbox/images/lightbox-ico-loading.gif',
		imageBtnClose: 'third-party/jquery/plugins/lightbox/images/lightbox-btn-close.gif',
		imageBtnPrev: 'third-party/jquery/plugins/lightbox/images/lightbox-btn-prev.gif',
		imageBtnNext: 'third-party/jquery/plugins/lightbox/images/lightbox-btn-next.gif',
		imageBlank: 'third-party/jquery/plugins/lightbox/images/lightbox-blank.gif'
	};
}

