function Module (callback)
{
	return callback();
}

/**
 * Element extensions
 */
Element.addMethods ({
	/**
	 * Switches element between two class names.
	 */
	switchClassNames:
		function (element, bool, on_class, off_class)
		{
			if (bool)
			{
				element.removeClassName (off_class);
				if (on_class)
					element.addClassName (on_class);
			}
			else
			{
				element.removeClassName (on_class);
				if (off_class)
					element.addClassName (off_class);
			}
			return element
		},

	selectClassName:
		function (element, class_names, selected_class_name)
		{
			class_names.each (function (c) { element.removeClassName (c) })
			element.addClassName (selected_class_name)
		},

	setPosition:
		function (element, x, y)
		{
			element.style.left = x + 'px'
			element.style.top = y + 'px'
		},

	/**
	 * Hides element using visibility: 'hidden' and absolute positioning.
	 */
	visibilityHide:
		function (element)
		{
			return element.setStyle ({ visibility: 'hidden' })
		},

	/**
	 * Shows back element hidden with visibilityHide.
	 */
	visibilityShow:
		function (element)
		{
			return element.setStyle ({ visibility: '' })
		}
})

/**
 * Cookie manipulation functions.
 */
var Cookie = Class.create()
Object.extend (Cookie, {
	get:
		function (name)
		{
			var start = document.cookie.indexOf (name + "=")
			var len = start + name.length + 1
			if ((!start) && (name != document.cookie.substring (0, name.length)))
				return null
			if (start == -1)
				return null
			var end = document.cookie.indexOf (';', len)
			if (end == -1)
				end = document.cookie.length
			return unescape (document.cookie.substring (len, end))
		},

	set:
		function (name, value, expires, path, domain, secure)
		{
			var expires_date = new Date()
			expires_date.setTime (expires_date.getTime() + expires * 1000)
			document.cookie = name + '=' + escape (value) +
				(expires? ';expires=' + expires_date.toGMTString() : '') + //expires.toGMTString()
				(path? ';path=' + path : '') +
				(domain? ';domain=' + domain : '') +
				(secure? ';secure' : '')
		},

	del:
		function (name, path, domain)
		{
			if (getCookie (name))
				document.cookie = name + '=' +
					(path? ';path=' + path : '') +
					(domain? ';domain=' + domain : '') +
					';expires=Thu, 01-Jan-1970 00:00:01 GMT';
		}
});


var Richslideshow = Class.create ({
	initialize:
		function(element)
		{
			this.element = $$(element)[0];
			this.element.slides = this.element.select('.slide');
			this.play = this.element.select('.play');
			this.prev = this.element.select('.prev')[0];
			this.next = this.element.select('.next')[0];
			this.mute = this.element.select('.mute')[0];
			this.iscycling = false;
			this.ismuted = false;
		
			(Cookie.get('muted') == 'false') || this.__mute();

			// each slide loads some mp3 file
			this.element.slides.each(function(slide) {
				//console.log('./audio/'+slide.readAttribute('id')+'.mp3');
				slide.sound = soundManager.createSound({
					id: 'sound_'+slide.readAttribute('id'), 
					url: '/audio2/'+slide.readAttribute('id')+'.mp3', 
					volume: 50,
					onfinish: function() {
						if(this.iscycling)
							this.__cycleSlide();	
						else
							Element.switchClassNames(this.play[0], 1, 'play', 'pause');
					}.bind(this),
					onplay:	function() {
						if(!this.iscycling)
							Element.switchClassNames(this.play[0], 0, 'play', 'pause');
					}.bind(this)
				});
			}.bind(this));

			// hides all slides leaving only first one visible
			this.element.slides.invoke('hide');
			this.element.slides[0].show();
			this.currentslide = this.element.slides[0];
		
			// from now each handler's click toggles a slide
			this.element.select('.handler').each(function(el) {
				el.observe('click', function(event) {
					this.__changeSlide(el);
				}.bind(this));
			}.bind(this));

			// slideshow controls bindings
			this.play.each(function(el){
				el.observe('click', this.__startTimer.bind(this));
			}.bind(this));

			this.mute.observe('click', this.__mute.bind(this));
			this.next.observe('click', this.__cycleSlide.bind(this));
			this.prev.observe('click', function(event) {	
				this.__cycleSlide('backwards');
			}.bind(this));
		},
	__startTimer:
		function() { 
			if(this.iscycling) {
				this.__togglePlayBtn(true);
				this.currentslide.sound.pause();
				this.iscycling = false;
			}
			else {
				this.__togglePlayBtn(false);

				if(this.currentslide.sound.paused || !this.currentslide.sound.playState)
					this.currentslide.sound.play();

				this.iscycling = true;
			}
		},
	__togglePlayBtn:
		function(state)
		{
			this.play.each(function(el){	
				Element.switchClassNames(el, state ? true : false, 'play', 'pause');
			});
		},

	// gets an dt element as a handler, and shows first dd after
	__changeSlide:
		function(handler)
		{
			soundManager.stopAll();
			this.element.slides.invoke('hide');
			handler.next().appear();
			this.currentslide = handler.next();
			this.currentslide.sound.play();
			
			this.element.select('.handler').each(function(el) {
				el.switchClassNames(el, 0, 'active', '');
			}.bind(this));

			Element.switchClassNames(handler, 1, 'active', '');
		},
	__cycleSlide:
		function(direction)
		{
			if(direction == 'backwards') {
				if(this.currentslide == this.element.slides[0])
					this.__changeSlide(this.element.slides[this.element.slides.length-1].previous());
				else 
					this.__changeSlide(this.currentslide.previous(2));
			}

			//forwards case
			else 
			{
				//...reaching the end of the slideshow
				if(this.currentslide == this.element.slides[this.element.slides.length-1])
				{
					// was it a slideshow really?
					if(this.iscycling) 
					{
						soundManager.stopAll();
						this.iscycling = false;
						this.__togglePlayBtn(true);

						//go back to the first slide
						this.element.slides.invoke('hide');
						(this.currentslide = this.element.slides[0]).show();
						this.element.select('.handler').each(function(el) {
							el.switchClassNames(el, 0, 'active', '');
						}.bind(this));
						Element.switchClassNames(this.currentslide.previous(), 1, 'active', '');
					}
				}
				else 
					this.__changeSlide(this.currentslide.next());
			}
		},
	__mute:
		function()
		{
			// case: sound is turned on
			if(!this.ismuted) {
				soundManager.mute();
				Element.switchClassNames(this.mute, 1, 'muted', '');
				this.ismuted = true;
				Cookie.set ('muted', 'true', 36000, '/');
			}
			// case: sound is turned off
			else if(this.ismuted) {
				soundManager.unmute();
				Element.switchClassNames(this.mute, 0, 'muted', '');
				this.ismuted = false;
				Cookie.set ('muted', 'false', 36000, '/');
			}
		}
});

/**
 * Helper for input default text autoclearing on focus.
 */
var Autoclear = Class.create ({
	initialize:
		function (element, default_value)
		{
			this.element = $(element)
			this.focus_observer = function() {
				if (this.value == (this.getAttribute ('default') || this.defaultValue))
					this.value = ''
			}
			this.blur_observer = function() {
				if (!this.value)
					this.value = this.getAttribute ('default') || this.defaultValue
			}
			this.keyup_observer = function (event) {
				if (event.keyCode == 27)
					this.value = ''
			}
			this.element.observe ('focus', this.focus_observer)
			this.element.observe ('blur', this.blur_observer)
			this.element.observe ('keyup', this.keyup_observer)
		},

	destroy:
		function()
		{
			this.element.stopObserving ('focus', this.focus_observer)
			this.element.stopObserving ('blur', this.blur_observer)
			this.element.stopObserving ('keyup', this.keyup_observer)
		}
});

document.observe("dom:loaded", function() {

	// EXPANDABLE TEXT SLIDER
	$$('.readmore').each(function(el) {
		el.insert({ after: '<p class="showmore"><span>Czytaj dalej...</span></p>'});
		el.hide();
	});

	$$('.showmore').each(function(el) {
		el.observe('click', function(){
			el.previous().visible() ? Effect.BlindUp(el.previous('.readmore'), { duration: 0.5 }) : Effect.BlindDown(el.previous('.readmore'), { duration: 0.5 }) ;
			el.update( !el.previous().visible() ? '<span>(schowaj)</span>' : '<span>Czytaj dalej...</span>' );
		});
	});

	$$('.box_content p').each(function(paragraph){
		if (paragraph.innerHTML.search(/<!--more-->/i) != -1)
		{
			text = paragraph.innerHTML;
			text = text.replace(/<!--more-->/i,'<span class="text_hidden">'); 
			text += '</span> <a href="#" class="text_readmore">Czytaj dalej...</a>'
			paragraph.update(text);
		}
	});

	$$('.text_hidden').invoke('hide');
	$$('.text_readmore').each(function(el){
		el.observe('click', function(event) {
			event.preventDefault();
			text = el.previous('.text_hidden');
			text.visible() ? text.hide() && el.update('Czytaj dalej...') : text.appear() && el.update('(schowaj)');

		});		
	});

});
