Iframe = function(params) {
	Iframe.logger.info("Iframe object initiation started.");
	
	this.onloadListeners = new Array();

	function paramDefault(pname, def) {
		Iframe.logger.enter("paramDefault");
		if (typeof params == "undefined" || null == params) {
			params = new Object();
		}
		if (typeof params[pname] == "undefined" || null == params[pname]) {
			Iframe.logger.debug("Parameter '" + pname + "' not added. Using default: '" + def + "'");
			params[pname] = def;
		} else {
			Iframe.logger.debug("Found parameter: '" + pname + "' With value: '" + params[pname] + "'");
		}
		Iframe.logger.complete("paramDefault");
	}
	
	function getObject(pIframe) {
		Iframe.logger.enter("getObject");
		if (typeof pIframe == "string") {
			return document.getElementById(pIframe);
		} else {
			return pIframe;
		}
		Iframe.logger.complete("getObject");
	}

	this.callOnloadListeners = function() {
		for (var i = 0; i< this.onloadListeners.length; i++) {
			var oFunction = this.onloadListeners[i];
			oFunction(this.oIframe);
		}
	}

	this.addOnloadListener = function(oFunction) {
		this.onloadListeners[this.onloadListeners.length] = oFunction;
	}

	this.setSRC = function(src) {
		Iframe.logger.enter("setSRC");
		this.oIframe.src = src;
		if (typeof (this.oIframe.readyState) == "undefined") {
			this.oIframe.readyState = "loading";

			var oIframe = this.oIframe;

			this.addUniversalEventListener("load", function() {
				Iframe.logger.enter("Mozilla Onload handler");
				Iframe.logger.debug("Mozilla workaround: onload event was called. Setting readyState to 'complete'");
				oIframe.readyState = "complete";
				Iframe.logger.complete("Mozilla  handler");
			});
		}
		Iframe.logger.complete("setSRC");
	}

	this.isIframeLoaded = function() {
		Iframe.logger.enter("isIframeLoaded");
		if (typeof (this.oIframe.readyState) != "undefined") {
			if (this.oIframe.readyState == "complete") {
				Iframe.logger.complete("isIframeLoaded");
				return true;
			} else {
				Iframe.logger.complete("isIframeLoaded");
				return false;
			}
		}
	}

	this.addUniversalEventListener = function(event, handler) {
		if (this.oIframe.addEventListener) {
			this.oIframe.addEventListener(event, handler, false);
		} else if (this.oIframe.attachEvent) {
			this.oIframe.attachEvent('on' + event, handler);
		}
	}

	this.makeTransparent = function() {
		Iframe.logger.enter("makeTransparent");
		this.oIframe.allowTransparency = "true";
		Iframe.logger.complete("makeTransparent");
	}

	this.fitHeight = function() {
		Iframe.logger.enter("fitHeight");
		Iframe.logger.debug("Current iframe height: " + this.oIframe.height);
		Iframe.logger.debug("Current iframe document height: " + this.oIframe.contentWindow.document.body.scrollHeight);

		this.oIframe.height = this.oIframe.contentWindow.document.body.scrollHeight + "px";
		this.oIframe.style.height = this.oIframe.contentWindow.document.body.scrollHeight + "px";
		Iframe.logger.complete("fitHeight");
	}

	this.fitToContent = function() {
		Iframe.logger.enter("fitToContent");

		if (!this.isIframeLoaded(this.oIframe)) {
			var iframeInstance = this;
			this.addUniversalEventListener("load", function() {
				iframeInstance.fitHeight();
				iframeInstance.callOnloadListeners();
			});
		} else {
			this.fitHeight(this.oIframe);
		}
		Iframe.logger.complete("fitToContent");
	}
	
	

	paramDefault("elementId", "");
	paramDefault("src", "");
	paramDefault("transparent", false);
	paramDefault("fitHeight", false);

	if (params.elementId != "") {
		this.oIframe = getObject(params.elementId);
	} else {
		Iframe.logger.error("'elementId' must be defined!");
		throw new Exception("'elementId' must be defined!");
	}

	if (params.src != "") {
		Iframe.logger.debug("Setting Iframe source to: " + params.src);
		this.setSRC(params.src);
	}

	if (params.transparent) {
		Iframe.logger.debug("Setting Iframe background to transparent");
		this.makeTransparent();
	}

	if (params.fitHeight) {
		Iframe.logger.debug("Setting Iframe height to fit its contents");
		this.fitToContent();
	}

	Iframe.logger.info("Iframe object initiation finished.");
}

Iframe.logger = Logger.getLogger("Iframe");
