/*
 * @name:     Switchboard
 * @version:  0.2
 * @release:  2009-08-22 20:49:30
 * @type:     jQuery plugin
 * @author:   David Sklar
--------------------------------------- */
(function($) {
	var Switchboard = function(pool, opts) {
		var $this = pool;
		var frame;
		var slider;
		var slide;
		var control;
		var btn_prev;
		var btn_next;
		var w_frame = 0;
		var w_slider = 0;
		var count = 0;
		var options = opts;
		slide = $(options.box);
		count = slide.length;
		w_frame = slide.eq(0).width() || w_frame;
		w_slider = w_frame * count;
		slide
				.each(function(j) {
					if ($(this).attr('id')) {
						$(this).attr( {
							'rev' : $(this).attr('id')
						}).removeAttr('id');
					}
					if (options.control
							&& !$(this).find('ul').is('ul.s-control')) {
						var prev = $(this).prev().attr('rev');
						var next = $(this).next().attr('id');
						if (prev == undefined) {
							btn_prev = $('<span class="prev">' + options.TXT.prev + '</span>');
						} else {
							btn_prev = $('<a href="#' + prev
									+ '" class="prev">' + options.TXT.prev
									+ '</a>');
						}
						if (next == undefined) {
							btn_next = $('<span class="next">' + options.TXT.next + '</span>');
						} else {
							btn_next = $('<a href="#' + next
									+ '" class="next">' + options.TXT.next
									+ '</a>');
						}
						btn_prev.bind('click', function(e) {
							run(e);
						});
						btn_next.bind('click', function(e) {
							run(e);
						});
						control = $('<ul class="s-control"></ul>');
						control.append(btn_prev).append(btn_next);
						control.find('a, span').wrap('<li></li>');
						$(this).append(control);
					}
					if (!slide.parent('div').is('.s-slider')) {
						slide
								.wrapAll('<div class="s-frame"><div class="s-slider"></div></div>');
					}
				});
		slider = $('.s-slider');
		slider.width(w_slider).css( {
			'padding' : 0,
			'margin' : 0,
			'position' : 'relative',
			'top' : 0
		});
		frame = $('.s-frame');
		frame.width(w_frame).css( {
			'padding' : 0,
			'margin' : 0,
			'position' : 'relative',
			'overflow' : 'hidden'
		});
		$this.bind('click', function(e) {
			run(e);
		});
		var run = function(e) {
			var target = $(e.target);
			if (target.is('a[href*="#"]')) {
				var hash = target.attr('href').match(/#(.+)$/)[1];
				process(hash);
			} else if (target.parents('a').is('a[href*="#"]')) {
				var hash = target.parents('a').attr('href').match(/#(.+)$/)[1];
				process(hash);
			}
		};
		var process = function(hash, animate) {
			var i, h, x;
			var temp = slide.filter('[rev="' + hash + '"]');
			i = slide.index(temp);
			h = temp.height();
			x = (-i) * slide.width();
			var animate = animate == undefined ? true : animate;
			if (animate) {
				frame.animate( {
					'height' : h + 'px'
				}, {
					queue : false,
					duration : 100,
					complete : function() {
						slider.animate( {
							'left' : x + 'px'
						}, {
							queue : true,
							easing : options.easing,
							duration : options.duration
						})
					}
				});
			} else {
				slider.css('left', x + 'px');
				frame.css('height', h + 'px');
			}
			set(hash);
		};
		var set = function(hash) {
			if (options.group) {
				$(options.group).each(function() {
					replace($(this), hash);
				});
			} else {
				replace($this, hash);
			}
		}
		var replace = function(obj, hash) {
			var b = obj.find('a[href*="#"] strong');
			b.replaceWith(b.text());
			obj.find('li').removeClass(options.active);
			var a = obj.find('a[href*="#' + hash + '"]');
			a.each(function() {
				$(this).wrapInner('<strong></strong>').parents('li').addClass(
						options.active);
			});
		}
		var hash = location.hash ? location.hash.match(/#(.+)$/)[1] : $this
				.find('a[href*="#"]').eq(options.origin).attr('href').match(
						/#(.+)$/)[1];
		process(hash, false);
	};
	$.fn.switchboard = function(options) {
		var opts = $.extend( {}, {
			box : '.part',
			group : false,
			control : true,
			active : 'set',
			origin : 0,
			TXT : {
				prev : 'Předchozí',
				next : 'Další'
			},
			easing : 'easeOutQuint',
			duration : 500,
			css : 'disabled'
		}, options);
		return this.each(function() {
			return new Switchboard($(this), opts);
		});
	};
})(jQuery);

