/*
 *         developed by Matteo Bicocchi on JQuery
 *         © 2002-2009 Open Lab srl, Matteo Bicocchi
 *			    www.open-lab.com - info@open-lab.com
 *       	version 2.0
 *       	tested on: 	Explorer and FireFox for PC
 *                  		FireFox and Safari for Mac Os X
 *                  		FireFox for Linux
 *         MIT - GPL (GPL-LICENSE.txt) licenses.
 *
 * CONTAINERS BUILD WITH BLOCK ELEMENTS
 */

(function($) {
	//	var msie6=$.browser.msie && $.browser.version=="6.0";
	//	var Opera=$.browser.opera;
	jQuery.fn.buildContainers = function(options) {
		return this.each(function() {
			if ($(this).is("[inited=true]")) return;

			this.options = {
				containment: "document",
				elementsPath: "/jquery.mbContainerPlus.2.0/elements/",
				onCollapse: function(o) { },
				onIconize: function(o) { },
				onClose: function(o) { },
				onResize: function(o) { },
				onDrag: function(o) { },
				minimizeEffect: "slide", //or "fade"
				effectDuration: 300
			};

			$.extend(this.options, options);
			var container = $(this);

			container.attr("inited", "true");
			container.attr("iconized", "false");
			container.attr("collapsed", "false");
			container.attr("closed", "false");
			container.attr("options", this.options);
			container.css({ position: "relative" });

			if ($.metadata) {
				$.metadata.setType("class");
				if (container.metadata().skin) container.attr("skin", container.metadata().skin);
				if (container.metadata().collapsed) container.attr("collapsed", container.metadata().collapsed);
				if (container.metadata().closed) container.attr("closed", container.metadata().closed);
				if (container.metadata().iconized) container.attr("iconized", container.metadata().iconized);
				if (container.metadata().icon) container.attr("icon", container.metadata().icon);
				if (container.metadata().buttons) container.attr("buttons", container.metadata().buttons);
				if (container.metadata().content) container.attr("content", container.metadata().content); //ajax
				if (container.metadata().aspectRatio) container.attr("aspectRatio", container.metadata().aspectRatio); //ui.resize
				if (container.metadata().handles) container.attr("handles", container.metadata().handles); //ui.resize
				if (container.metadata().dock) container.attr("dock", container.metadata().dock);

				if (container.metadata().width) container.attr("width", container.metadata().width);
				if (container.metadata().height) container.attr("height", container.metadata().height);
			}

			if (container.attr("content"))
				container.mb_changeContainerContent(container.attr("content"));

			container.addClass(container.attr("skin"));
			container.find(".n:first").attr("unselectable", "on");
			if (!container.find(".n:first").html()) container.find(".n:first").html("&nbsp;");
			container.containerSetIcon(container.attr("icon"), this.options.elementsPath);
			if (container.attr("buttons")) container.containerSetButtons(container.attr("buttons"), this.options);
			container.css({ width: "99.9%" });
			if (container.attr("width")) {
				var cw = $.browser.msie ? container.attr("width") : container.attr("width") + "px";
				container.css({ width: cw });
			}

			if (container.attr("height")) {
				container.find(".c:first , .mbcontainercontent:first").css("height", container.attr("height") - container.find(".n:first").outerHeight() - (container.find(".s:first").outerHeight()));
			}

			if (container.hasClass("draggable")) {
				container.css({ position: "absolute", margin: 0 });
				container.find(".n:first").css({ cursor: "move" });
				container.mb_BringToFront();
				container.draggable({
					handle: ".n:first",
					cancel: ".c",
					delay: 0,
					containment: this.options.containment,
					stop: function() {
						var opt = $(this).attr("options");
						if (opt.onDrag) opt.onDrag($(this));
					}
				});
				container.bind("mousedown", function() {
					$(this).mb_BringToFront();
				});
			}
			if (container.hasClass("resizable")) {
				container.containerResize();
			}
			if (container.attr("collapsed") == "true") {
				container.attr("collapsed", "false");
				container.containerCollapse(this.options);
			}

			if (container.attr("closed") == "true") {
				container.mb_close();
			}
			if (container.attr("iconized") == "true") {
				container.attr("iconized", "false");
				container.containerIconize(this.options);
			}
		});
	};

	jQuery.fn.containerResize = function() {
		var isDraggable = $(this).hasClass("draggable");

		var handles = $(this).attr("handles") ? $(this).attr("handles") : "e,s,se";
		var aspectRatio = $(this).attr("aspectRatio") ? $(this).attr("aspectRatio") : false;

		$(this).resizable({
			handles: isDraggable ? "e,s,se" : handles,
			aspectRatio: aspectRatio,
			minWidth: 150, //todo: move to properties
			minHeight: 150, //todo: move to properties
			iframeFix: true,
			helper: "mbproxy",
			start: function(e, o) {
				o.helper.mb_BringToFront();
			},
			stop: function() {
				var resCont = $(this); //$.browser.msie || Opera ?o.helper:
				var elHeight = resCont.outerHeight() - $(this).find(".n:first").outerHeight() - ($(this).find(".s:first").outerHeight());
				$(this).find(".c:first , .mbcontainercontent:first").css({ height: elHeight });
				if (!isDraggable && !$(this).attr("handles")) {
					var elWidth = $(this).attr("width") && $(this).attr("width") > 0 ? $(this).attr("width") : "99.9%";
					$(this).css({ width: elWidth });
				}
				var opt = $(this).attr("options");
				if (opt.onResize) opt.onResize($(this));
			}
		});

		/*
		*TO SOLVE UI CSS CONFLICT I REDEFINED A SPECIFIC CLASS FOR HANDLERS
		*/

		//    $(this).find(".ui-resizable-n").removeClass("ui-resizable-n");
		//    $(this).find(".ui-resizable-e").removeClass("ui-resizable-e");
		//    $(this).find(".ui-resizable-w").removeClass("ui-resizable-w");
		//    $(this).find(".ui-resizable-s").removeClass("ui-resizable-s");
		//    $(this).find(".ui-resizable-se").removeClass("ui-resizable-se");

		$(this).find(".ui-resizable-n").addClass("mb-resize").addClass("mb-resize-resizable-n");
		$(this).find(".ui-resizable-e").addClass("mb-resize").addClass("mb-resize-resizable-e");
		$(this).find(".ui-resizable-w").addClass("mb-resize").addClass("mb-resize-resizable-w");
		$(this).find(".ui-resizable-s").addClass("mb-resize").addClass("mb-resize-resizable-s");
		$(this).find(".ui-resizable-se").addClass("mb-resize").addClass("mb-resize-resizable-se");

	};

	jQuery.fn.containerSetIcon = function(icon, path) {
		if (icon && icon != "") {
			$(this).find(".ne:first").prepend("<img class='icon' src='" + path + "icons/" + icon + "' style='position:absolute'>");
			$(this).find(".n:first").css({ paddingLeft: 25 });
		} else {
			$(this).find(".n:first").css({ paddingLeft: 0 });
		}
	};

	jQuery.fn.containerSetButtons = function(buttons, opt) {
		if (!opt) opt = $(this).attr("options");
		var path = opt.elementsPath;
		var container = $(this);
		if (buttons != "") {
			var btn = buttons.split(",");
			$(this).find(".ne:first").append("<div class='buttonBar'></div>");
			for (var i in btn) {
				if (btn[i] == "c") {
					$(this).find(".buttonBar:first").append("<img src='" + path + $(this).attr('skin') + "/close.png' class='close'>");
					$(this).find(".close:first").bind("click", function() {
						if (!$.browser.msie) container.fadeOut(opt.effectDuration);
						else container.hide();
						container.attr("closed", "true");
						if (opt.onClose) opt.onClose(container);
					});
				}
				if (btn[i] == "m") {
					$(this).find(".buttonBar:first").append("<img src='" + path + $(this).attr('skin') + "/min.png' class='collapsedContainer'>");
					$(this).find(".collapsedContainer:first").bind("click", function() { container.containerCollapse(opt); });
					$(this).find(".n:first").bind("dblclick", function() { container.containerCollapse(opt); });
				}
				if (btn[i] == "p") {
					$(this).find(".buttonBar:first").append("<img src='" + path + $(this).attr('skin') + "/print.png' class='printContainer'>");
					$(this).find(".printContainer:first").bind("click", function() { });
				}
				if (btn[i] == "i") {
					$(this).find(".buttonBar:first").append("<img src='" + path + $(this).attr('skin') + "/iconize.png' class='iconizeContainer'>");
					$(this).find(".iconizeContainer:first").bind("click", function() { container.containerIconize(opt); });
				}
			}
			var fadeOnClose = $.browser.mozilla || $.browser.safari;
			if (fadeOnClose) $(this).find(".buttonBar:first img")
              .css({ opacity: .5, cursor: "pointer", "mozUserSelect": "none", "khtmlUserSelect": "none" })
              .mouseover(function() { $(this).fadeTo(200, 1); })
              .mouseout(function() { if (fadeOnClose) $(this).fadeTo(200, .5); });
			$(this).find(".buttonBar:first img").attr("unselectable", "on");
		}
	};

	jQuery.fn.containerCollapse = function(opt) {
		this.each(function() {
			if (!opt) opt = $(this).attr("options");
			var container = $(this);
			if ($(this).attr("collapsed") == "false") {
				container.attr("w", container.outerWidth());
				container.attr("h", container.outerHeight());
				if (opt.minimizeEffect == "fade")
					container.find(".o:first").fadeOut(opt.effectDuration, function() { });
				else {
					container.find(".icon:first").hide();
					container.find(".o:first").slideUp(opt.effectDuration, function() { });
					container.animate({ height: container.find(".n:first").outerHeight() + container.find(".s:first").outerHeight() }, opt.effectDuration, function() { container.find(".icon:first").show(); });
				}
				container.attr("collapsed", "true");
				container.find(".collapsedContainer:first").attr("src", opt.elementsPath + $(this).attr('skin') + "/max.png");
				container.resizable("destroy");
				if (opt.onCollapse) opt.onCollapse(container);
			} else {
				if (opt.minimizeEffect == "fade")
					container.find(".o:first").fadeIn(opt.effectDuration, function() { });
				else {
					container.find(".o:first").slideDown(opt.effectDuration, function() { });
					container.find(".icon:first").hide();
					container.animate({ height: container.attr("h") }, opt.effectDuration, function() { container.find(".icon:first").show(); });
				}
				if (container.hasClass("resizable")) container.containerResize();
				container.attr("collapsed", "false");
				container.find(".collapsedContainer:first").attr("src", opt.elementsPath + $(this).attr('skin') + "/min.png");
				container.find(".mbcontainercontent:first").css("overflow", "auto");

			}
		});
	};

	jQuery.fn.containerIconize = function(opt) {
		if (!opt) opt = $(this).attr("options");
		return this.each(function() {
			var container = $(this);
			container.attr("iconized", "true");
			if (container.attr("collapsed") == "false") {
				container.attr("h", container.outerHeight());
			}
			container.attr("w", container.attr("width") && container.attr("width") > 0 ? (!container.hasClass("resizable") ? container.attr("width") : container.width()) : !$(this).attr("handles") ? "99.9%" : container.width());
			container.attr("t", container.css("top"));
			container.attr("l", container.css("left"));
			container.resizable("destroy");
			var l = 0;
			var t = container.css("top");
			var dockPlace = container;
			if (container.attr("dock")) {
				dockPlace = $("#" + container.attr("dock"));
				var icns = dockPlace.find("img").size();
				l = $("#" + container.attr("dock")).offset().left + (32 * icns);
				t = $("#" + container.attr("dock")).offset().top;
			};
			/*
			ICONIZING CONTAINER
			*/
			this.dockIcon = $("<img src='" + opt.elementsPath + "/icons/" + (container.attr("icon") ? container.attr("icon") : "restore.png") + "' class='restoreContainer' width='32'>").appendTo(dockPlace)
              .css("cursor", "pointer")
              .hide()
              .attr("contTitle", container.find(".n:first").html())
              .bind("click", function() {
              	container.attr("iconized", "false");
              	if (container.is(".draggable"))
              		container.css({ top: $(this).offset().top, left: $(this).offset().left });
              	else
              		container.css({ left: "auto", top: "auto" });
              	container.show();

              	if (!$.browser.msie) {
              		container.find(".no:first").fadeIn("fast");
              		if (container.attr("collapsed") == "false") {
              			container.animate({ height: container.attr("h"), width: container.attr("w"), left: container.attr("l"), top: container.attr("t") }, opt.effectDuration, function() {
              				container.find(".mbcontainercontent:first").css("overflow", "auto");
              				if (container.hasClass("draggable")) {
              					container.mb_BringToFront();
              				}
              			});
              			container.find(".c:first , .mbcontainercontent:first").css("height", container.attr("h") - container.find(".n:first").outerHeight() - (container.find(".s:first").outerHeight()));
              		}
              		else
              			container.animate({ height: "60px", width: container.attr("w"), left: container.attr("l"), top: container.attr("t") }, opt.effectDuration);
              	} else {
              		container.find(".no:first").show();
              		if (container.attr("collapsed") == "false") {
              			container.css({ height: container.attr("h"), width: container.attr("w"), left: container.attr("l"), top: container.attr("t") }, opt.effectDuration);
              			container.find(".c:first , .mbcontainercontent:first").css("height", container.attr("h") - container.find(".n:first").outerHeight() - (container.find(".s:first").outerHeight()));
              		}
              		else
              			container.css({ height: "60px", width: container.attr("w"), left: container.attr("l"), top: container.attr("t") }, opt.effectDuration);
              	}
              	if (container.hasClass("resizable") && container.attr("collapsed") == "false") container.containerResize();
              	$(this).remove();
              	if (container.hasClass("draggable")) container.mb_BringToFront();
              	$(".iconLabel").remove();
              })
              .bind("mouseenter", function() {
              	var label = "<div class='iconLabel'>" + $(this).attr("contTitle") + "</div>";
              	$("body").append(label);
              	$(".iconLabel").hide().css({
              		position: "absolute",
              		top: $(this).offset().top - 15,
              		left: $(this).offset().left + 15,
              		opacity: .9
              	}).fadeIn("slow").mb_BringToFront();
              })
              .bind("mouseleave", function() {
              	$(".iconLabel").remove();
              });


			if (!$.browser.msie) {
				container.find(".mbcontainercontent:first").css("overflow", "hidden");
				container.find(".no:first").slideUp("fast");
				container.animate({ height: "32px", width: "32px", left: l, top: t }, opt.effectDuration, function() {
					$(this.dockIcon).show();
					if (container.attr("dock")) container.hide();
				});
			} else {
				container.find(".no:first").hide();
				container.css({ height: "32px", width: "32px", left: l, top: t });
				$(this.dockIcon).show();
				if (container.attr("dock")) container.hide();
			}
			if (opt.onIconize) opt.onIconize(container);
		});
	};

	jQuery.fn.mb_resizeTo = function(h, w) {
		if (!w) w = $(this).outerWidth();
		if (!h) h = $(this).outerHeight();
		$(this).animate({ "height": h, "width": w }, 500, function() {
			var elHeight = $(this).outerHeight() - $(this).find(".n:first").outerHeight() - ($(this).find(".s:first").outerHeight());
			$(this).find(".c:first , .mbcontainercontent:first").animate({ height: elHeight });
		});
	};

	jQuery.fn.mb_iconize = function() {
		if ($(this).attr("closed") == "false") {
			if ($(this).attr("iconized") == "true") {
				var icon = $(this)[0].dockIcon;
				$(icon).click();
				$(this).mb_BringToFront();
			} else {
				$(this).containerIconize();
			}
		}
	};

	jQuery.fn.mb_open = function(url, data) {
		if ($(this).attr("closed") == "true") {
			if (!data) data = "";
			if (url) {
				$(this).mb_changeContainerContent(url, data);
			}
			if (!$.browser.msie) $(this).fadeIn(300);
			else $(this).show();
			$(this).attr("closed", "false");
			$(this).mb_BringToFront();
		}
	};

	jQuery.fn.mb_toggleDraggable = function() {
		if (!$(this).hasClass("draggable")) {
			$(this).addClass("draggable");
			$(this).css({ position: "absolute", margin: 0 });
			$(this).find(".n:first").css({ cursor: "move" });
			$(this).mb_BringToFront();
			$(this).draggable({
				handle: ".n:first",
				cancel: ".c",
				delay: 0,
				containment: $(this).attr("options").containment,
				stop: function() {
					var opt = $(this).attr("options");
					if (opt.onDrag) opt.onDrag($(this));
				}
			});
			$(this).bind("mousedown", function() {
				$(this).mb_BringToFront();
			});
		}
		else {
			$(this).removeClass("draggable");
			$(this).css({ position: "static", margin: 0 });
			$(this).find(".n:first").css({ cursor: "pointer" });
			$(this).draggable(null);
		}
		$(this).containerResize();
	}

	jQuery.fn.mb_close = function() {
		if ($(this).attr("closed") == "false") {
			$(this).find(".close:first").click();
		}
	};

	jQuery.fn.mb_toggle = function() {
		if ($(this).attr("closed") == "false" && $(this).attr("iconized") == "false") {
			$(this).containerCollapse();
		}
	};

	jQuery.fn.mb_BringToFront = function() {
		var zi = 10;
		$('*').each(function() {
			if ($(this).css("position") == "absolute") {
				var cur = parseInt($(this).css('zIndex'));
				zi = cur > zi ? parseInt($(this).css('zIndex')) : zi;
			}
		});
		$(this).css('zIndex', zi += 1);
	};

	jQuery.fn.mb_changeContent = function(url, data) {
		var where = $(this);
		if (!data) data = "";
		$.ajax({
			type: "POST",
			url: url,
			data: data,
			success: function(html) {
				where.html(html);
			}
		});
	};

	jQuery.fn.mb_changeContainerContent = function(url, data) {
		$(this).find(".mbcontainercontent:first").mb_changeContent(url, data);
	};

	jQuery.fn.mb_getState = function(attr) {
		var state = $(this).attr(attr);
		if (state == "true") state = true;
		if (state == "false") state = false;
		return state;
	};

	jQuery.fn.mb_fullscreen = function() {
		//  console.log(!$(this).is(".draggable"),$(this).is("[iconized='true']"),$(this).is("[collapsed='true']"))
		if (!$(this).is(".draggable") || $(this).is("[iconized='true']") || $(this).is("[collapsed='true']")) return;

		$(this).attr("w", $(this).width());
		$(this).attr("h", $(this).height());
		$(this).attr("t", $(this).css("top"));
		$(this).attr("l", $(this).css("left"));

		$(this).animate({ top: 10, left: 10, position: "relative" });
		$(this).mb_resizeTo("98%", "98%");
	};

})(jQuery);

