window.cmsfx        = window.cmsfx || {};
window.cmsfx.Widget = window.cmsfx.Widget || {};

window.cmsfx.Widget.getBaseUrl = function() {
	var $elements = document.getElementsByTagName("script");
	var $base = $elements[$elements.length-1].src.match( /^((https?:)?\/\/[^\/]+)/ );
	return $base ? $base[1] : "";
};

window.cmsfx.Widget.getConfig = function() {
	var $userConfig   = (window["widgetConfig"]) ? window["widgetConfig"] : {};
	var $resultConfig = (cmsfx.Widget.$defaults) ? cmsfx.Widget.$defaults : {};
	
	for (var $key in $resultConfig) {
		if ("undefined" == typeof($userConfig[$key]) && "undefined" != typeof(window[$key])) {
			$resultConfig[$key] = window[$key];
		}
	}
	
	for (var $key in $userConfig) {
		$resultConfig[$key] = $userConfig[$key];
	}
	
	return $resultConfig;
};

window.cmsfx.Widget.getFormattedValue = function( $value ) {
	if ( (new RegExp('^[ \t]*[0-9]+(\%|px|pt|em)[ \t]*$','i')).test($value) ) {
		return $value;
	}
	return parseInt($value)+"px";
};

window.cmsfx.Widget.toQueryString = function( $hash ) {
	var $queryString = "";
	for (var $key in $hash) {
		if ($hash[$key] || 0 === $hash[$key]) {
			$queryString += "&" + $key + "=" + escape($hash[$key]);
		}
	}
	
	if ("" != $queryString) {
		$queryString = "?" + $queryString.substr(1);
	}
	
	return $queryString;
};

window.cmsfx.Widget.hideSplash = function( $splashId ) {
	var $splash = document.getElementById($splashId);
		$splash.style.borderStyle = 'none';
		$splash.parentNode.removeChild($splash);
};

window.cmsfx.Widget.isIframeOnloadError = function() {
	if (!(/Safari/i.exec(navigator.userAgent))) {
		return false;
	}
	var $regExp = /Safari\W*(\d+(:?\.\d+)?)/i;
	var $match  = $regExp.exec(navigator.userAgent);
	if ($match && "undefined" != typeof($match[1]) && $match[1] < 500) {
		return true;
	}
	return false;
};

window.cmsfx.Widget.onLoads = window.cmsfx.Widget.onLoads || {};

window.cmsfx.Widget.write = function( $path, $defaultWidth, $defaultHeight ) {
	var $config = cmsfx.Widget.getConfig();
	
	var $urlpref = cmsfx.Widget.getBaseUrl();
	if (false === $urlpref) {
		return false;
	}
	
	var $width, $height, $onload, $frameUrl, $frameDomain, $random, $blockId, $iframeId, $onloadId, $display, $i = 0, $content = [];
	
	$width    = cmsfx.Widget.getFormattedValue($defaultWidth ? $defaultWidth : $config["width" ]);
	$height   = cmsfx.Widget.getFormattedValue($defaultHeight ? $defaultHeight : $config["height"]);
	$onload   = ("function" === typeof($config["onload"])) ? $config["onload"] : null;
	
	$random   = Math.random();
	$blockId  = 'block'  + $random;
	$iframeId = 'iframe' + $random;
	$onloadId = 'onload' + $random;
	
	window.cmsfx.Widget.onLoads[$onloadId] = function( $domElementFrame ) {
		if ($onload) {
			try {
			var $window = window.frames[$iframeId];
			var $API = ("function" === typeof($window["getAPI"])) ? $window["getAPI"]() : null;
			$onload($API, $window, $domElementFrame);
			} catch($e){}
		}
		cmsfx.Widget.hideSplash($blockId);
	};
	
	$frameUrl = $config["frameUrl"] ? $config["frameUrl"] : $urlpref + $path;
	
	$config["width" ] = null;
	$config["height"] = null;
	$config["onload"  ] = null;
	$config["frameUrl"] = null;
	
	
	$frameUrl += cmsfx.Widget.toQueryString($config);
	
	$frameDomain = $frameUrl.match( /^((https?:)?\/\/[^\/]+)/ );
	$frameDomain = $frameDomain ? $frameDomain[1] : "";
	
	$display = "";
	if ($frameDomain !== $urlpref && cmsfx.Widget.isIframeOnloadError()) {
		$display = "display:none;";
	}
	
	$content[++$i] = '<link rel="stylesheet" type="text/css" href="'+$urlpref+'/common/css/onload.css?version=1.4">';
	$content[++$i] = '<div class="cmsfxWidgetWrapper" style="width: '+$width+'; height: '+$height+';">';
	$content[++$i] = '<iframe name="'+$iframeId+'" onload="window.cmsfx.Widget.onLoads[\''+$onloadId+'\'](this)" scrolling="No" frameborder="0" allowtransparency="true" src="'+$frameUrl+'" width="100%" height="100%" style="position: absolute; top: 0; left: 0; border: 0px solid black;"></iframe>';
	$content[++$i] = '<div id="'+$blockId+'" class="cmsfxWidgetSplash" style="'+$display+'"><table cellpadding="0" cellspacing="0"><tr><td></td></tr></table></div>';
	$content[++$i] = '</div>';
	
	document.write($content.join(''));

	window["widgetConfig"] = null;
};

window.cmsfx.Widget.callback = function( $content ) {
	document.write($content);
}

window.cmsfx.Widget.documentWrite = function( $path ) {
	var $config = cmsfx.Widget.getConfig();
	$config["callback"] = "window.cmsfx.Widget.callback";
	document.write("<script src='"+cmsfx.Widget.getBaseUrl()+$path+cmsfx.Widget.toQueryString($config)+"&version=2.0'></script>");
}

if (cmsfx.Widget.autorun) {
	cmsfx.Widget.autorun();
}