/**
 *  Copyright (c) 2009, SiteOne
 *  @version 1.0
 *  @copyright SiteOne
 */
var go = false;
var SiteOneMYX = {
	MYXServer: 'http://api.myx.cz',
	serverScriptLogURLFormat: 'http://api.myx.cz/logClick.php?x={x}&y={y}&url={url}&sid={sid}&cookie={cookie}&aplkod={aplkod}&host={host}',
	preloaderImage: '/images/preloader.gif',
	flashSource: '/flash/ShellApplication.swf',
	endpointUri: '/api/amf/gateway.php',
	configUri: '/data/config/colors.xml',
	expresInstallFlashSource: '/flash/expressInstall.swf',
	clickAplkod: 'click',
	firstElId: '',
	firstEl:null,
	code: '',
	forceDocumentHost: '',
	forceDocumentUrl: '',
	leftTopOffsetObj: null,
	documentUrl: '',
	documentHost: '',
	overlayEl:null,
	overlayContainerEl:null,
	xmlDoc:null,
	preloaderEl:null,
	preloaderContainerEl:null,
	customPosition:null,
	initCheck:false,
	maintenance:false,
	logClick:true,
	
	init: function() {
		
		//this.serverScriptLogURLFormat	= this.MYXServer + this.serverScriptLogURLFormat;
		this.flashSource = this.MYXServer + this.flashSource;
		this.expresInstallFlashSource	= this.MYXServer + this.expresInstallFlashSource;
		this.endpointUri				= this.MYXServer + this.endpointUri;
		this.configUri					= this.MYXServer + this.configUri;
		this.preloaderImage				= this.MYXServer + this.preloaderImage;
		
		if ((!this.firstEl || !this.firstEl.tagName || this.firstEl.tagName=='') && this.firstElId!='') {
			this.firstEl=document.getElementById(this.firstElId);
		}
		if (!this.firstEl || !this.firstEl.tagName || this.firstEl.tagName=='') {
			if (this.code!='') {
				this.setCustomPositionFromCode();
			}
			if (this.customPosition!==null) {
				this.leftTopOffsetObj = this.getOffsetFromCustomPosition();
				this.initCheck = true;
			}
		} else {
			this.leftTopOffsetObj = this.getElementOffset(this.firstEl);
			this.initCheck = true;
		}

		if (document.getElementById('heatButton')) {
			this.addListener(document.getElementById('heatButton'),'click', function(e) { go = true; SiteOneMYX.openHeatMap(e); } );
		}
		
		if (this.initCheck) {
			this.addListener(window,'resize',function() {
				if ((!SiteOneMYX.firstEl || !SiteOneMYX.firstEl.tagName || SiteOneMYX.firstEl.tagName=='') && SiteOneMYX.customPosition!==null) {
					SiteOneMYX.leftTopOffsetObj = SiteOneMYX.getOffsetFromCustomPosition();
				} else {
					SiteOneMYX.leftTopOffsetObj = SiteOneMYX.getElementOffset(SiteOneMYX.firstEl);
				}
			});
			
			var urlRE = new RegExp('^https?:\\/\\/([_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,})(\\/{1}.*)$','i');
			var hashmarkRE = new RegExp('([^#]*)#.*$','i');

			var hostRE = new RegExp('^https?:\\/\\/([_a-zA-Z0-9\\.\\-]+\\.[a-zA-Z]{2,})\\/?$','i');
			var urlOnlyRE = new RegExp('^\\/.*$','i');
			
			if (this.forceDocumentHost.length && this.forceDocumentHost.length>0 && hostRE.test(this.forceDocumentHost)) {
				this.documentHost = this.forceDocumentHost.replace(hostRE,'$1');
			} else {
				this.documentHost = document.URL.replace(urlRE,'$1');
			}
			if (this.forceDocumentUrl.length && this.forceDocumentUrl.length>0 && urlOnlyRE.test(this.forceDocumentUrl)) {
				this.documentUrl = this.forceDocumentUrl;
			} else {
				this.documentUrl = document.URL.replace(urlRE,'$2').replace(hashmarkRE,'$1');
			}
			
			var paramsRE = new RegExp('\\?([^#]*)(#?.*)$');
			if (this.documentUrl.indexOf('?')>=0 && this.documentUrl.indexOf('?') < this.documentUrl.indexOf('&')) {
				var arrMatches = this.documentUrl.match(paramsRE);
				var arrParams = arrMatches[1].split('&').sort();
				this.documentUrl = this.documentUrl.replace(paramsRE,'?'+arrParams.join('&')+'$2');
			}
	
			this.addListener(document,'mousedown',this.sendClickXY);
			
			this.serverScriptLogURLFormat = this.serverScriptLogURLFormat.replace("{url}",encodeURIComponent(this.documentUrl));
			this.serverScriptLogURLFormat = this.serverScriptLogURLFormat.replace("{host}",encodeURIComponent(this.documentHost));
			this.serverScriptLogURLFormat = this.serverScriptLogURLFormat.replace("{sid}",this.getPHPSID());
			this.serverScriptLogURLFormat = this.serverScriptLogURLFormat.replace("{cookie}",encodeURIComponent(this.getGAValues()));
			
			this.preloaderEl = new Image();
			this.preloaderEl.src = this.preloaderImage;
			this.preloaderEl.style.display = 'block';
			this.preloaderEl.style.marginTop = '250px';
			this.preloaderEl.style.marginLeft = 'auto';
			this.preloaderEl.style.marginRight = 'auto';
		}
		this.maintenance = false;
	},
	
	addListener: function (element,strEvent,fnHandler) {
		if (element.addEventListener) {
			element.addEventListener(strEvent,fnHandler,false);
		} else if (element.attachEvent) {
			element.attachEvent('on'+strEvent,fnHandler);
		}
	},
	
	ord: function (string) {
	    // Returns the codepoint value of a character  
	    // 
	    // version: 908.406
	    // discuss at: http://phpjs.org/functions/ord
	    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   bugfixed by: Onno Marsman
	    // +   improved by: Brett Zamir (http://brett-zamir.me)
	    // *     example 1: ord('K');
	    // *     returns 1: 75
	    // *     example 2: ord('\uD800\uDC00'); // surrogate pair to create a single Unicode character
	    // *     returns 2: 65536
	    var str = string + '';
	    
	    var code = str.charCodeAt(0);
	    if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
	        var hi = code;
	        if (str.length === 1) {
	            return code; // This is just a high surrogate with no following low surrogate, so we return its value;
	                                    // we could also throw an error as it is not a complete character, but someone may want to know
	        }
	        var low = str.charCodeAt(1);
	        if (!low) {
	            
	        }
	        return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
	    }
	    if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
	        return code; // This is just a low surrogate with no preceding high surrogate, so we return its value;
	                                // we could also throw an error as it is not a complete character, but someone may want to know
	    }
	    return code;
	},
	
	openHeatMap: function(e) {

		if (!e) var e = window.event;
		if (true) {
			if (!SiteOneMYX.initCheck) {
				alert('Vas mYx kod neni validni. Zkontrolujte prosim, zda byl spravne zadan, pripadne kontaktujte "myx@siteone.cz".');
				return false;
			}
			var documentHeight = Math.max(
				Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),
				Math.max(document.body.offsetHeight, document.documentElement.offsetHeight),
				Math.max(document.body.clientHeight, document.documentElement.clientHeight)
			);

			SiteOneMYX.preloaderContainerEl = document.createElement('div');
			SiteOneMYX.preloaderContainerEl.style.position = 'absolute';
			SiteOneMYX.preloaderContainerEl.style.top = '0px';
			SiteOneMYX.preloaderContainerEl.style.left = '0px';
			SiteOneMYX.preloaderContainerEl.style.width = '100%';
			SiteOneMYX.preloaderContainerEl.style.height = documentHeight+'px';
			SiteOneMYX.preloaderContainerEl.style.zIndex = '900';
			if (SiteOneMYX.maintenance) {
				SiteOneMYX.preloaderContainerEl.style.opacity='.50';
				SiteOneMYX.preloaderContainerEl.style.filter='alpha(opacity=50)';
				SiteOneMYX.preloaderContainerEl.style['-moz-opacity'] = '0.50';
				SiteOneMYX.preloaderContainerEl.style.backgroundColor = '#000';
				SiteOneMYX.openMaintenanceMessage(documentHeight);
				return;
			}
			if (!swfobject.hasFlashPlayerVersion('10.0.0')) {
				SiteOneMYX.preloaderContainerEl.style.opacity='.50';
				SiteOneMYX.preloaderContainerEl.style.filter='alpha(opacity=50)';
				SiteOneMYX.preloaderContainerEl.style['-moz-opacity'] = '0.50';
				SiteOneMYX.preloaderContainerEl.style.backgroundColor = '#000';
				var errEl = document.createElement('div');
				errEl.style.width = '400px';
				errEl.style.height = '110px';
				errEl.style.marginTop = '200px';
				errEl.style.padding = '10px';
				errEl.style.marginLeft = errEl.style.marginRight = 'auto';
				errEl.style.backgroundColor = '#000';
				errEl.style.border = '2px solid #333';
				errEl.style.color = '#fff';
				errEl.style.textAlign = 'center';
				oVersion = swfobject.getFlashPlayerVersion();
				errEl.innerHTML = 'Vase verze Flash playeru je '+oVersion.major+'.'+oVersion.minor+'.'+oVersion.release+'<br/>Pro spusteni mYxu potrebujete Flash player 10.0.0<br />Posledni verzi Flash playeru si stahnete na strankach<br/><br/><a href="http://www.adobe.com" target="_blank" style="color:#fff; font-weight:bold;">www.adobe.com</a><br /><br />';
				var elOdkaz = document.createElement('a');
				elOdkaz.href='"';
				elOdkaz.innerHTML='OK';
				elOdkaz.style.display='block';
				elOdkaz.style.width='50px';
				elOdkaz.style.height='17px';
				elOdkaz.style.textAlign='center';
				elOdkaz.style.backgroundColor='#999';
				elOdkaz.style.color='#000';
				elOdkaz.style.textDecoration='none';
				elOdkaz.style.marginLeft = elOdkaz.style.marginRight = 'auto';
				elOdkaz.style.border='1px solid #333';
				elOdkaz.onclick = function(e) {
					if(errHolderEl.parentNode) {
						errHolderEl.parentNode.removeChild(errHolderEl);
					}
					if(SiteOneMYX.preloaderContainerEl.parentNode) {
						SiteOneMYX.preloaderContainerEl.innerHTML = '';
						SiteOneMYX.preloaderContainerEl.parentNode.removeChild(SiteOneMYX.preloaderContainerEl);
					}
					return false;
				};
				errEl.appendChild(elOdkaz);
				var errHolderEl = document.createElement('div');
				errHolderEl.style.position = 'absolute';
				errHolderEl.style.top = '0px';
				errHolderEl.style.left = '0px';
				errHolderEl.style.width = '100%';
				errHolderEl.style.height = documentHeight+'px';
				errHolderEl.style.zIndex = '990';
				errHolderEl.appendChild(errEl);
				if (errHolderEl.parentNode!=document.body) {
					document.body.appendChild(errHolderEl);
				}
				if (SiteOneMYX.preloaderContainerEl.parentNode!=document.body) {
					document.body.appendChild(SiteOneMYX.preloaderContainerEl);
				}
				return;
			}
			SiteOneMYX.preloaderContainerEl.appendChild(SiteOneMYX.preloaderEl);
			if (SiteOneMYX.preloaderContainerEl.parentNode!=document.body) {
				document.body.appendChild(SiteOneMYX.preloaderContainerEl);
			}

			SiteOneMYX.overlayEl = document.createElement('div');
			SiteOneMYX.overlayEl.style.position = 'absolute';
			SiteOneMYX.overlayEl.style.top = '0px';
			SiteOneMYX.overlayEl.style.left = '0px';
			
			SiteOneMYX.overlayEl.style.width = '100%';
			
			SiteOneMYX.overlayEl.style.height = documentHeight+'px';
			SiteOneMYX.overlayEl.style.zIndex = '999999';
			SiteOneMYX.overlayContainerEl = document.createElement('div');
			SiteOneMYX.overlayContainerEl.id = 'heatmapcontainer';
			SiteOneMYX.overlayEl.appendChild(SiteOneMYX.overlayContainerEl);
			if (SiteOneMYX.overlayEl.parentNode!=document.body) {
				document.body.appendChild(SiteOneMYX.overlayEl);
				var aFlashEl = document.getElementsByTagName('embed');
				for (var i=0;i<aFlashEl.length;i++) {
					aFlashEl[i].style.visibility='hidden';
				}
				aFlashEl = document.getElementsByTagName('object');
				for (i=0;i<aFlashEl.length;i++) {
					aFlashEl[i].style.visibility='hidden';
				}
			}
			var oVariables = {
				'host': SiteOneMYX.documentHost,
				'path': SiteOneMYX.documentUrl,
				'myxHost': SiteOneMYX.MYXServer+'/demo-data'
			};
			
			var myFlashSource = SiteOneMYX.flashSource;
			swfobject.embedSWF( myFlashSource, SiteOneMYX.overlayContainerEl.id, '100%', '100%', '9.0.0', SiteOneMYX.expresInstallFlashSource, oVariables, {wmode:'transparent', allowScriptAccess:'always'} );
		}
		if (e.stopPropagation) {
			e.stopPropagation();
		} else {
			e.cancelBubble = true;
		}
		if (e.preventDefault) {
			e.preventDefault();
		} else {
			e.returnValue = false;
		}
	},
	
	closeHeatMap: function() {
		var aFlashEl = document.getElementsByTagName('embed');
		for (var i=0;i<aFlashEl.length;i++) {
			aFlashEl[i].style.visibility='visible';
		}
		aFlashEl = document.getElementsByTagName('object');
		for (i=0;i<aFlashEl.length;i++) {
			aFlashEl[i].style.visibility='visible';
		}
		if (SiteOneMYX.overlayEl.parentNode==document.body) {
			SiteOneMYX.overlayEl.parentNode.removeChild(SiteOneMYX.overlayEl);
			SiteOneMYX.overlayEl=null;
		}
		if ((!SiteOneMYX.firstEl || !SiteOneMYX.firstEl.tagName || SiteOneMYX.firstEl.tagName=='') && SiteOneMYX.customPosition!==null) {
			SiteOneMYX.leftTopOffsetObj = SiteOneMYX.getOffsetFromCustomPosition();
		} else {
			SiteOneMYX.leftTopOffsetObj = SiteOneMYX.getElementOffset(SiteOneMYX.firstEl);
		}
	},
	
	closePreloader: function() {
		if (SiteOneMYX.preloaderContainerEl.parentNode==document.body) {
			SiteOneMYX.preloaderContainerEl.parentNode.removeChild(SiteOneMYX.preloaderContainerEl);
			SiteOneMYX.preloaderContainerEl=null;
		}
	},
	
	sendXY: function(e, aplkod) {
		if (!e) var e = window.event;
		var mouseXYObj = SiteOneMYX.getMouseXY(e);
		
		var url = SiteOneMYX.serverScriptLogURLFormat.replace("{x}",mouseXYObj.x);
		url = url.replace("{y}",mouseXYObj.y);
		url = url.replace("{aplkod}",encodeURIComponent(aplkod));
		var img = new Image();
		img.src=url;
	},
	
	sendClickXY: function(e) {
		if (!SiteOneMYX.overlayEl && SiteOneMYX.logClick) {
			if (!e) var e = window.event;
			SiteOneMYX.sendXY(e, SiteOneMYX.clickAplkod);
		}
	},
	
	getMouseXY: function(e) {
		if (!e) var e = window.event;
		
		var mouseX = (e.pageX)?e.pageX:(e.clientX + document.body.scrollLeft);
		var mouseY = (e.pageY)?e.pageY:(e.clientY + document.body.scrollTop);
		
		mouseX -= this.leftTopOffsetObj.x;
		mouseY -= this.leftTopOffsetObj.y;
		return {'x':mouseX,'y':mouseY};
	},
	
	getElementOffset: function(obj) {
		var curleft = 0;
		var curtop = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent){
				curleft += obj.offsetLeft;
				curtop += obj.offsetTop;
				obj = obj.offsetParent;
			}
		} else {
			if (obj.x) {
				curleft += obj.x;
			}
			if (obj.y) {
				curtop += obj.y;
			}
		}
		if (document.all) {
			var marginLeftExplorer  = parseInt(document.body.style.marginLeft);
			var marginTopExplorer   = parseInt(document.body.style.marginTop);
			if (isNaN(marginLeftExplorer)) {
				marginLeftExplorer=0;
			}
			if (isNaN(marginTopExplorer)) {
				marginTopExplorer=0;
			}
			curleft = curleft + marginLeftExplorer;
			curtop = curtop + marginTopExplorer;
		}
		return {'x':curleft,'y':curtop};
	},
	
	getPHPSID: function() {
		var re = new RegExp('^.*PHPSESSID=([a-zA-Z0-9]+).*$','i');
		if (!re.test(document.cookie)) {
			return '';
		} else {
			var sid = document.cookie.replace(re,'$1');
			return (sid!='')?sid:'';
		}
	},
	
	getGAValues: function() {
		var reUTMA = new RegExp('^.*(__utma=[^$;]+).*$','i');
		var parUTMA = '';
		if (reUTMA.test(document.cookie)) {
			parUTMA = document.cookie.replace(reUTMA,'$1');
		}
		var reUTMZ = new RegExp('^.*(__utmz=[^$;]+).*$','i');
		var parUTMZ = '';
		if (reUTMZ.test(document.cookie)) {
			parUTMZ = document.cookie.replace(reUTMZ,'$1');
		}
		return (parUTMA!='' || parUTMZ!='')?(parUTMA+';'+parUTMZ):'';
	},
	
	
	setCustomPositionFromCode: function() {
		if (this.checkCustomCode()==true) {
			var arrData = this.code.split(':');
			var codePart = new String(arrData[0]);
			var metaCharsRE = new RegExp('[a-z]','g');
			var splitRE = new RegExp('[A-Z]','g');
			var arr = codePart.replace(metaCharsRE,'').split(splitRE);
			if (arr && arr.length && arr.length==5) {
				this.customPosition = {
					'width':parseInt(arr[0]),
					'height':parseInt(arr[1]),
					'x':parseInt(arr[2]),
					'y':parseInt(arr[3]),
					'align':parseInt(arr[4])
				};
			}
		}
	},
	
	checkCustomCode: function() {
		var arrData = this.code.split(':');
		if (!arrData || !arrData.length || arrData.length!=3) {
			return false;
		}
		var countOrd = 0;
		var countChar = 0;
		var oneChar = '';
		var codePart = new String(arrData[0]);
		for (var i=0,l=codePart.length;i<l;i++) {
			var oneChar = codePart.charAt(i);
			countOrd += this.ord(oneChar);
			++countChar;
		}
		return (arrData[1]==countOrd && arrData[2]==countChar)?true:false;
	},
	
	getOffsetFromCustomPosition: function() {
		if (SiteOneMYX.customPosition.align==0) {
			return {'x':SiteOneMYX.customPosition.x,'y':SiteOneMYX.customPosition.y};
		} else {
			var oViewport = SiteOneMYX.getViewport();
			var newWidth = oViewport.width;
			if (document.documentElement.scrollWidth>document.documentElement.clientWidth) {
				newWidth = document.documentElement.scrollWidth;
			}
			var rozdil = Math.floor((SiteOneMYX.customPosition.width - newWidth)/2);
			var pozice = SiteOneMYX.customPosition.x - rozdil;
			return {'x':(pozice>0?pozice:0),'y':SiteOneMYX.customPosition.y};
		}
	},
	
	getHtmlFirstElementPoint: function() {
		if ((!SiteOneMYX.firstEl || !SiteOneMYX.firstEl.tagName || SiteOneMYX.firstEl.tagName=='') && SiteOneMYX.customPosition!==null) {
			SiteOneMYX.leftTopOffsetObj = SiteOneMYX.getOffsetFromCustomPosition();
		} else {
			SiteOneMYX.leftTopOffsetObj = SiteOneMYX.getElementOffset(SiteOneMYX.firstEl);
		}
		return this.leftTopOffsetObj;
	},
	
	getViewport: function() {
		 if (
			typeof document.documentElement != 'undefined' &&
			typeof document.documentElement.clientWidth != 'undefined' &&
			document.documentElement.clientWidth != 0) {
				viewportwidth = document.documentElement.clientWidth,
				viewportheight = document.documentElement.clientHeight
		} else {
			viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
			viewportheight = document.getElementsByTagName('body')[0].clientHeight
		}
		return {'width': viewportwidth, 'height':viewportheight };
	},
	
	getHtmlUserCenterPoint: function() {
		var oViewport = SiteOneMYX.getViewport();
		
		var iebody=(document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body
		var dsocleft=document.all? iebody.scrollLeft : pageXOffset
		var dsoctop=document.all? iebody.scrollTop : pageYOffset			
		return {'x':Math.round(dsocleft+oViewport.width/2), 'y':Math.round(dsoctop+oViewport.height/2)};
	},
	
	openMaintenanceMessage: function(documentHeight) {
		var errEl = document.createElement('div');
		errEl.style.width = '400px';
		errEl.style.height = '110px';
		errEl.style.marginTop = '200px';
		errEl.style.padding = '10px';
		errEl.style.marginLeft = errEl.style.marginRight = 'auto';
		errEl.style.backgroundColor = '#000';
		errEl.style.border = '2px solid #333';
		errEl.style.color = '#fff';
		errEl.style.textAlign = 'center';
		errEl.innerHTML = '<br />Vazeny kliente. V soucasne chvili (19.11.2009) probiha upgrade mYxu a neni mozne si nyni zobrazit demo. Demo bude opet pristupne nejpozdeji 20.11.2009. Dekujeme za pochopeni!<br /><br />';
		var elOdkaz = document.createElement('a');
		elOdkaz.href='"';
		elOdkaz.innerHTML='OK';
		elOdkaz.style.display='block';
		elOdkaz.style.width='50px';
		elOdkaz.style.height='17px';
		elOdkaz.style.textAlign='center';
		elOdkaz.style.backgroundColor='#999';
		elOdkaz.style.color='#000';
		elOdkaz.style.textDecoration='none';
		elOdkaz.style.marginLeft = elOdkaz.style.marginRight = 'auto';
		elOdkaz.style.border='1px solid #333';
		elOdkaz.onclick = function(e) {
			if(errHolderEl.parentNode) {
				errHolderEl.parentNode.removeChild(errHolderEl);
			}
			if(SiteOneMYX.preloaderContainerEl.parentNode) {
				SiteOneMYX.preloaderContainerEl.innerHTML = '';
				SiteOneMYX.preloaderContainerEl.parentNode.removeChild(SiteOneMYX.preloaderContainerEl);
			}
			return false;
		};
		errEl.appendChild(elOdkaz);
		var errHolderEl = document.createElement('div');
		errHolderEl.style.position = 'absolute';
		errHolderEl.style.top = '0px';
		errHolderEl.style.left = '0px';
		errHolderEl.style.width = '100%';
		errHolderEl.style.height = documentHeight+'px';
		errHolderEl.style.zIndex = '990';
		errHolderEl.appendChild(errEl);
		if (errHolderEl.parentNode!=document.body) {
			document.body.appendChild(errHolderEl);
		}
		if (SiteOneMYX.preloaderContainerEl.parentNode!=document.body) {
			document.body.appendChild(SiteOneMYX.preloaderContainerEl);
		}
	}
	
};

