(function($) {

$.expandable = function(elements, eventName, selectedIndex, doHideFromDOM, useEffect) {
	// Comability modus: the parameters could be also passed in an array (jQuery-style)
	var settings = {
		elements: {},
		eventName: 'click',
		selectedIndex: null,
		doHideFromDOM: true,
		useEffect: true,
		cookie: false,
		cookieOptions: { path: '/', expires: 1 }
	};
	var states = new Array();
	var selectedState;

	if (elements.elements) {
		// jQuery-style parameter pass
		if (elements) {
			settings.mode = 'new mode';
			$.extend(settings, elements);
		}
	} else {
		settings.mode = 'old school';
		// Old-school mode
		settings.elements = elements;
		settings.eventName = (eventName != undefined) ? eventName : 'click';
		settings.selectedIndex = (selectedIndex != undefined) ? selectedIndex : null;
		settings.doHideFromDOM = (doHideFromDOM == null) ? true : doHideFromDOM;
		settings.useEffect = (useEffect == null) ? true : useEffect;
	}

	$.each(settings.elements, function(elementIndex, el) {

		if (el.attr('expand')) {
			var state = $('#' + el.attr('expand'));
			if (state) {
				if (!el.is(':checkbox') && !el.is(':radio')) {
					el.addClass('expand-up').removeClass('expand-down');
				}
				if (el.is(':checkbox') && el.is(':checked')) {
					state.show();
				} else {
					state.hide();
					if (settings.doHideFromDOM) { hideFromDOM(state); }
				}
				states.push(state);
			}
		}

		el.bind(settings.eventName, function() {
			if (settings.elements.length == 1 && this.className != "checkbox") {
				if (!state.is(':visible')) {
					if (settings.doHideFromDOM) { showInDOM(state); }
					if (settings.useEffect) { state.slideDown('slow'); } else { state.show(); }
					$(this).addClass('expand-down').removeClass('expand-up');
					setCookie(0);
				} else {
					if (settings.useEffect) {
						state.slideUp('slow', function() { if (settings.doHideFromDOM) { hideFromDOM(state); }});
					} else {
						state.hide();
						if (settings.doHideFromDOM) { hideFromDOM(state); }
					}
					$(this).addClass('expand-up').removeClass('expand-down');
					setCookie(null);
				}
			} else if (this.className == "checkbox") {
				if ($(this).is(':checked')) {
					if (settings.doHideFromDOM) { showInDOM(state); }
					if (settings.useEffect) { state.slideDown('slow'); } else { state.show(); }
					setCookie(0);
				} else {
					if (settings.useEffect) {
						state.slideUp('slow', function() { if (settings.doHideFromDOM) { hideFromDOM(state);} });
					} else {
						state.hide();
						if (settings.doHideFromDOM) { hideFromDOM(state);}
					}
					setCookie(null);
				}
			} else {
				if (selectedState != state) {
					$.each(states, function() {
						if (this.is(':visible')) {
							if (settings.useEffect) {
								this.slideUp('slow', function() { if (settings.doHideFromDOM) { hideFromDOM($(this)); } });
							} else {
								this.hide();
								if (settings.doHideFromDOM) { hideFromDOM($(this)); }
							}
						}
					});
					selectedState = null;
					if (state) {
						if (settings.doHideFromDOM) { showInDOM(state); }
						if (settings.useEffect) { state.slideDown('slow'); } else { state.show(); }
						selectedState = state;
						setCookie(elementIndex);
					} else {
						setCookie(null);
					}
				}
			}
		});
	});

	var selectedIndex = null;
	if (settings.cookie) {
		var _cookie = $.cookie('expandable-' + settings.elements[0].attr('id'));
		selectedIndex = (_cookie != null) ? (_cookie == -1) ? null : _cookie : settings.selectedIndex;
	} else {
		selectedIndex = settings.selectedIndex;
	}

	if (selectedIndex != null) {
		if (settings.elements[selectedIndex]) {
			for (var i=0; i < states.length; i++) {
				if (states[i].attr('id') == $(settings.elements[selectedIndex]).attr('expand')) {
					if (settings.doHideFromDOM) { showInDOM(states[i]); }
					states[i].show();
					selectedState = states[i];
					settings.elements[selectedIndex].addClass('expand-down').removeClass('expand-up');
				}
			}
		}
	}

	function setCookie(value) {
		if (settings.cookie) {
			if (value == null) value = -1;
			$.cookie('expandable-' + settings.elements[0].attr('id'), value, settings.cookieOptions);
		}
	}
};

})(jQuery);



$(document).ready(function() {

	// init tooltip
	if (typeof $.fn.tooltip == 'function') {
		$('.tooltip').tooltip({
			fade: 250,
			fixPNG: true,
			showURL: false,
			showBody: " - "
		});
	}

});