/* ==========================================================
 * MobilySelect
 * date: 18.1.2010
 * author: Marcin Dziewulski
 * last update: 25.1.2010
 * web: http://www.mobily.pl or http://playground.mobily.pl
 * email: hello@mobily.pl
 * Free to use under the MIT license.
 * ========================================================== */
(function($) {
	$.fn.mobilyselect = function(options) {
		var defaults = {
			collection: "all",
			animation: "absolute",
			duration: 300,
			listClass: "selecterContent",
			btnsClass: "selecterBtns",
			btnActiveClass: "active",
			elements: "li",
			onChange: function() {},
			onComplete: function() {}
		};
		var sets = $.extend({}, defaults, options);
		return this.each(function() {
			var $t = $(this),
				list = $t.find("." + sets.listClass),
				btns = $t.find("." + sets.btnsClass),
				btn = btns.find("a"),
				li = list.find(sets.elements),
				w = li.width(),
				h = li.height(),
				l = li.length,
				finishTime;
			if (sets.animation == "absolute") {
				li.css({
					position: "relative"
				}).children().css({
					position: "absolute",
					top: 0,
					left: 0
				})
			}
			var select = {
				init: function() {
					this.start();
					this.trigger()
				},
				start: function() {
					if (sets.collection != "all") {
						li.hide().filter("." + sets.collection).show();
						btn.removeClass(sets.btnActiveClass).filter(function() {
							return $(this).attr("rel") == sets.collection
						}).addClass(sets.btnActiveClass)
					}
				},
				trigger: function() {
					btn.bind("click", function() {
						var $t = $(this),
							rel = $t.attr("rel"),
							selected = li.filter("." + rel),
							s = li.filter(function() {
								return $(this).css("display") == "block"
							});
						if (rel == "all") {
							if (l != s.length) {
								select.animation(li, li)
							}
						} else {
							select.animation(li, selected)
						}
						btn.removeClass(sets.btnActiveClass);
						$t.addClass(sets.btnActiveClass);
						sets.onChange.call(this);
						return false
					})
				},
				animation: function(not, selected) {
					switch (sets.animation) {
					case "plain":
						$(not).hide();
						$(selected).show();
						break;
					case "fade":
						$(not).fadeOut(sets.duration);
						setTimeout(function() {
							$(selected).fadeIn(sets.duration)
						}, sets.duration + 400);
						break;
					case "absolute":
						setTimeout(function() {
							$(selected).show().children().animate({
								top: 0,
								left: 0
							}, sets.duration)
						}, sets.duration + 400);
						$(not).children().animate({
							top: -h + "px",
							left: -w + "px"
						}, sets.duration, function() {
							$(not).hide()
						});
						break
					}
					if (sets.animation == "absolute" || sets.animation == "fade") {
						finishTime = sets.duration * 2 + 400
					} else {
						finishTime = 100
					}
					setTimeout(function() {
						sets.onComplete.call(this)
					}, finishTime)
				}
			};
			select.init()
		})
	}
}(jQuery));

