﻿var StarmindHelper = {
	CssStringToObject: function (css) {
		var r = new RegExp('\s*([^:]+?)\s*:\s*([^;]+?)\s*(?:;|$)', "ig");
		var cssobj = new Object(), m = null;

		while ((m = r.exec(css)) != null) cssobj[m[1]] = m[2];

		return cssobj;
	},
	ObjectToCssString: function (obj) {
		if (!obj || typeof (obj) != "object") return obj;

		var tmp = new Array();
		for (var k in obj) tmp.push(k + ": " + obj[k]);

		return tmp.join("; ");
	},
	MergeAttrObject: function () {
		var sto = function (o) {
			for (var i in o) if (o[i] && typeof (o[i]) == "object") sto.call(this, o[i]);
			if (typeof (o["style"]) == "string") o["style"] = this.CssStringToObject(o["style"]);
			return o;
		};

		var ots = function (o) {
			for (var i in o) if (o[i] && typeof (o[i]) == "object") ots.call(this, o[i]);
			if (typeof (o["style"]) == "object") o["style"] = this.ObjectToCssString(o["style"]);
			return o;
		};

		var args = [];
		for (var at = 0; at < arguments.length; at++)
			if (typeof (arguments[at]) == "object") {
				args.push(sto.call(this, arguments[at]));
			}

		var merged = jQuery.extend.apply(jQuery.extend, jQuery.merge([true, {}], args));
		if (merged != null) merged = ots.call(this, merged);

		return merged;
	},
	MergeObject: function () {
		var args = [];
		for (var i = 0; i < arguments.length; i++) if (typeof (arguments[i]) == "object") args.push(arguments[i]);

		return jQuery.extend.apply(jQuery.extend, jQuery.merge([true, {}], args));
	}
};

function ModalObject(args) {
	this.GetArgs = function (args) {
		return StarmindHelper.MergeAttrObject(
			{
				type: "iframe",
				closeButton: false,
				closeLayer: false,
				pattr: {}, popupAttributes: {},
				iattr: {}, iframeAttributes: {},
				cattr: {}, containerAttributes: {},
				lattr: {}, layerAttributes: {},
				cbattr: {}, closeButtonAttributes: {},
				fixed: false
			},
			args
		);
	}

	this.Args = this.GetArgs(args);
	this.Container = null;
	this.Layer = null;
	this.Popup = null;
	this.CloseBtn = null;
	this.Modal = null;
	this.HasBeenShownOnce = false;

	this.Init = function () {
		this.Args.closeButtonAttributes = this.Args.cbattr = StarmindHelper.MergeAttrObject(this.Args.closeButtonAttributes, this.Args.cbattr);
		this.Args.popupAttributes = this.Args.pattr = StarmindHelper.MergeAttrObject(this.Args.popupAttributes, this.Args.pattr);
		this.Args.iframeAttributes = this.Args.iattr = StarmindHelper.MergeAttrObject(this.Args.iframeAttributes, this.Args.iattr);
		this.Args.containerAttributes = this.Args.cattr = StarmindHelper.MergeAttrObject(this.Args.containerAttributes, this.Args.cattr);
		this.Args.layerAttributes = this.Args.lattr = StarmindHelper.MergeAttrObject(this.Args.layerAttributes, this.Args.lattr);

		this.Container = jQuery(
			'<div />',
			StarmindHelper.MergeAttrObject(
				{ 'class': 'modal' },
				this.Args.cattr,
				{ style: 'position: absolute; left: 50%; width: 0px; top: 50%; height: 0px; visibility: hidden; z-index:10000;' }
			)
		);

		this.Layer = jQuery(
			'<div />',
			StarmindHelper.MergeAttrObject(
				{ style: 'background-color: black; opacity: 0.65; filter: alpha(opacity=65);' },
				this.Args.lattr,
				{ style: 'position: fixed; left: 0px; top: 0px; width: 100%; height: 100%;' }
			)
		);

		this.Popup = jQuery(
			'<div />',
			StarmindHelper.MergeAttrObject(
				this.Args.pattr,
				{ style: 'position: absolute;' }
			)
		);

		//bind close button event
		if (this.Args.closeButton == true) {
			var closeContainer = jQuery('<div />', { style: 'position: relative; width: 0px; height: 0px; float: right;' });
			this.CloseBtn = jQuery(
				'<div />',
				StarmindHelper.MergeAttrObject(
					{ html: '<a href="#">Stäng</a>' },
					this.Args.cbattr,
					{ style: 'position: absolute; right: 5px; top: 5px; z-index: 10001; cursor: pointer;' }
				)
			);
			closeContainer.append(this.CloseBtn);

			this.Popup.append(closeContainer);
			jQuery(this.CloseBtn).bind("click", this, function (e) { e.data.Close(); return false; });
		}

		this.Container.append(this.Layer);
		this.Container.append(this.Popup);

		//bind layer close event
		if (this.Args.closeLayer != undefined && this.Args.closeLayer == true) {
			this.Layer.bind("click", this, function (e) { e.data.Close(); return false; });
		}

		//render content according to specified type
		switch (this.Args.type) {
			case "selector":
				if (this.Args.selector != undefined) {
					this.Modal = jQuery(this.Args.selector);
					this.Popup.append(this.Modal);
				}
			case "html":
				if (this.Args.html != undefined) {
					this.Modal = jQuery(this.Args.html);
					this.Popup.append(this.Modal);
				}
				break;
			case "iframe":
				this.Modal = jQuery(
					'<iframe />',
					StarmindHelper.MergeAttrObject(
						{ style: 'border: none; margin: 0px;', frameborder: '0', scrolling: 'no', src: 'about:blank' },
						this.Args.iattr,
						{ style: 'width: 100%; height: 100%;' }
					)
				);

				this.Popup.append(this.Modal);
				break;
		}

		jQuery("body").append(this.Container);

		if (this.Args.fixed != undefined && this.Args.fixed == true) jQuery(document).bind("scroll", this, function (e) { e.data.Reposition(); });
	}

	this.Init();

	this.Open = function (forceReload) {
		if (forceReload == true && this.HasBeenShownOnce == true) this.Reload();
		//this.Container.show();
		//this.Modal.show();
		this.Container.css("visibility", "visible");

		this.Reposition();

		//set flag to signal reloading is now permitted
		this.HasBeenShownOnce = true;
	}

	//currently only supports reloading of iframes (what else is there..?)
	this.Reload = function () {
		if (this.Args.type == "iframe") {
			this.Modal.contents().find("body").html("");
			this.Modal.attr("src", this.Args.iframeAttributes.src);
		}
	}

	this.Close = function () {
		//this.Container.hide();
		//this.Modal.hide();
		this.Container.css("visibility", "hidden");
	}

	this.Reposition = function () {
		this.Popup.css("left", (-Math.floor(this.Popup.outerWidth() / 2) + jQuery(document).scrollLeft()) + "px");
		this.Popup.css("top", (-Math.floor(this.Popup.outerHeight() / 2) + jQuery(document).scrollTop()) + "px");
	}
}

var StarmindModal = {
	Settings: {
		DefaultValues: {
			ForceRecreate: false
		}
	},
	Modals: Array(),
	Open: function (id) {
		if (jQuery(document).data(id) == undefined) return;

		jQuery(document).data(id).Open();
	},
	Close: function (id) {
		if (id == undefined) {
			//close all modals
			for (var i = 0; i < this.Modals.length; i++) this.Modals[i].Close();
			return;
		} else if (jQuery(document).data(id) == undefined) return;

		jQuery(document).data(id).Close();
	},
	Bind: function (id, args) {
		var m = StarmindModal.Create(id, args);
		this.bind("click", m, function (e) { e.data.Open(); return false; });

		return m;
	},
	Create: function (id, args, forceRecreate) {
		if (forceRecreate == undefined) forceRecreate = this.Settings.DefaultValues.ForceRecreate;

		var exists = (jQuery(document).data(id) != undefined);
		var m = null;

		if (!exists) {
			m = new ModalObject(args);
			jQuery(document).data(id, m);
			this.Modals.push(m);
		} else {
			m = jQuery(document).data(id);

			if (forceRecreate == true) {
				var c = m.Container;

				m.Args = this.GetArgs(args);
				m.Init();

				c.remove();
			}
		}

		return m;
	}
};

jQuery.fn.bindModal = StarmindModal.Bind;

var preObj = null;
var preId = 1;
var isActive = false;
function doChangeInfo(obj, id) {
	if (!isActive) {
		isActive = true;

		if (preObj != null)
			$(preObj).parent().removeClass("selected");

		$(obj).parent().siblings().removeClass("selected");
		$(obj).parent().addClass("selected");

		$("#i" + preId).fadeOut(200, function () {
			$("#i" + id).fadeIn(300);
			preObj = obj;
			preId = id;
			isActive = false;
		}).hide();
	}
}

function doChangePage(url) {
	$("#info-holder").fadeOut(200, function () {
		location.href = url;
	});
}
