///<reference path="init.js"/>
//------------------------------------------------------------------
//## PAGE
//------------------------------------------------------------------
PAGE.Init = function() {
	this.PageID = '';
	this.PageName = document.getElementsByTagName('H1')[0].innerHTML.ToString();
	this.ContentDiv = $('content');
	this.TextSize = (Cookie.Read('HHHR-TextSize') == 'big') ? 'big' : 'default';
	this.RenderMode = (Cookie.Read('HHHR-PageRender') == 'static') ? 'static' : 'dynamic';
	this.ListenToPage = $('listen-to-page');
	this.LayoutMode = ($('financial-table')) ? 'table' : 'column';
	this.LayoutMode = ($('specialsida')) ? 'special' : this.LayoutMode;
	this.Tools = $('tools');
	this.Itterator = 0;
	this.FlashArea = getElementsByClassName(document, 'DIV', 'flash-container');
	VISITEDPAGESHANDLER.InitializeVisitedLinks();
	if (PAGE.Tools) {

		//## BUTTON FOR CHANGING TEXT SIZE
		var li = DOM.Create('LI');
		var a = DOM.Create('A', '', 'btn-textsize');
		DOM.SetAttribute(a, 'HREF', 'javascript:;');
		if (PAGE.TextSize == 'big') {
			DOM.SetAttribute(a, 'TITLE', TEXTHANDLER.TextSizeStandardTitle);
			a.innerHTML = '<span>' + TEXTHANDLER.TextSizeStandard + '</span>';
		} else {
			DOM.SetAttribute(a, 'TITLE', TEXTHANDLER.TextSizeBigTitle);
			a.innerHTML = '<span>' + TEXTHANDLER.TextSizeBig + '</span>';
		}
		DOM.Add(a, li);
		addEvent(a, 'click', PAGE.ChangeTextSize);
		DOM.Add(li, PAGE.Tools);

		//## BUTTON FOR CHANGING RENDERMODE
		var li = DOM.Create('LI');
		var a = DOM.Create('A', '', 'btn-pagerender');
		DOM.SetAttribute(a, 'HREF', 'javascript:;');
		if (PAGE.RenderMode == 'static') {
			DOM.SetAttribute(a, 'TITLE', TEXTHANDLER.RenderColumnLayoutTitle);
			a.innerHTML = '<span>' + TEXTHANDLER.RenderColumnLayout + '</span>';
		} else {
			DOM.SetAttribute(a, 'TITLE', TEXTHANDLER.RenderBasicLayoutTitle);
			a.innerHTML = '<span>' + TEXTHANDLER.RenderBasicLayout + '</span>';
		}
		DOM.Add(a, li);
		addEvent(a, 'click', PAGE.ChangeRenderMode);
		DOM.Add(li, PAGE.Tools);

		//## ADD LISTEN-TO-PAGE
		var btnListen = $('btn-listen');
		btnListen.innerHTML = TEXTHANDLER.ListenToPage;
		btnListen.title = TEXTHANDLER.ListenToPageTitle;
		addEvent($('btn-listen'), 'click', PAGE.Listen);

		//## PRINT PDF
		var li = DOM.Create('LI');
		var a = DOM.Create('A', 'checkboxes', 'download-pdf');
		DOM.SetAttribute(a, 'HREF', 'javascript:;');
		DOM.SetAttribute(a, 'TITLE', TEXTHANDLER.TabDownloadPdf);
		a.innerHTML = '<span>' + TEXTHANDLER.TabDownloadPdf + '</span>';
		DOM.Add(a, li);
		addEvent(a, 'click', MENU.OpenPrintPDF);
		DOM.AddFirst(li, PAGE.Tools);

		//## ADD SEARCHFORM
		var searchForm = DOM.Create('FORM', '', 'searchform');
		DOM.SetAttribute(searchForm, 'action', '/');
		DOM.SetAttribute(searchForm, 'method', 'post');
		var searchWrapper = DOM.Create('DIV');
		var searchSpan1 = DOM.Create('SPAN', 'text');
		var searchSpan2 = DOM.Create('SPAN');
		var searchField = DOM.Create('INPUT', '', 'tbSearchBox');
		DOM.SetAttribute(searchField, 'type', 'text');
		DOM.SetAttribute(searchField, 'value', TRANSLATE.GetValue("BtnSearch"));
		DOM.Add(searchField, searchSpan2);
		DOM.Add(searchSpan2, searchSpan1);
		DOM.Add(searchSpan1, searchWrapper);
		var searchBtn = DOM.Create('INPUT', '', 'btnSearch');
		DOM.SetAttribute(searchBtn, 'type', 'button');
		DOM.SetAttribute(searchBtn, 'value', '');
		DOM.Add(searchBtn, searchWrapper);
		DOM.Add(searchWrapper, searchForm);
		DOM.AddFirst(searchForm, $('topbar'));

	}
	if (PAGE.RenderMode == 'dynamic') {
		tmpClassName = 'dynamic';
		if (document.addEventListener) {
			tmpClassName = 'dynamic nonIE';
		}
		document.getElementsByTagName('html')[0].className = tmpClassName;
		document.getElementsByTagName('body')[0].className = tmpClassName;
		document.getElementsByTagName('html')[0].style.overflowY = 'hidden';
	}

	if (PAGE.FlashArea.length > 0) {
		//if (PAGE.RenderMode == 'static') return;
		PAGE.InitFlash();
		var isSingleFlash = (DOM.GetByClassName(document, 'div', 'singleflash')[0]) ? true : false;
		if (isSingleFlash) {
			if (PAGE.RenderMode != 'static') {
				$('content').style.width = 'auto';
			}
			var documentH1 = document.getElementsByTagName('H1')[0];
			documentH1.style.visibility = 'hidden';
			documentH1.style.marginTop = '75px';
		}
	}

	if ($('notes')) {
		var specialHeight = Math.max($('content').offsetHeight, $('submenu').offsetHeight);
		$('content').style.height = specialHeight + 20 + 'px';
	}

};
PAGE.StartReport = function() {

};
PAGE.CheckForOversize = function() {
	//if (PAGE.RenderMode == 'static') return;
	if (parseInt($('content').offsetHeight + $('content').offsetTop) > getViewport.Height()) {
		document.getElementsByTagName('html')[0].style.overflowY = 'scroll';
	}
	var isSingleFlash = (DOM.GetByClassName(document, 'div', 'singleflash')[0]) ? true : false;
	if (isSingleFlash) {
		var newFlashHeight = parseInt(getViewport.Height() - 150);
		if (PAGE.RenderMode == 'static') {
			newFlashHeight = 320;
		}
		if (newFlashHeight > 545) newFlashHeight = 545;
		var newFlashWidth = parseInt(newFlashHeight * 1.7557);
		var flashObject = PAGE.FlashArea[0].getElementsByTagName('OBJECT')[0];
		var flashEmbed = PAGE.FlashArea[0].getElementsByTagName('EMBED')[0];
		if (flashObject) {
			DOM.SetAttribute(flashObject, 'height', newFlashHeight);
			DOM.SetAttribute(flashObject, 'width', newFlashWidth);
		}
		if (flashEmbed) {
			DOM.SetAttribute(flashEmbed, 'height', newFlashHeight);
			DOM.SetAttribute(flashEmbed, 'width', newFlashWidth);
		}
	}
};
PAGE.InitFlash = function() {
	for (var i = 0, n = PAGE.FlashArea.length; i < n; i++) {
		var flashArea = PAGE.FlashArea[i];
		var flashSource = flashArea.id.toString();
		var path = '../../gfx/flash/';
		var flashHeight = '100%';
		var flashWidth = '100%';
		var flashScale = 'showall';
		var flashWmode = '';

		var newFlashHeight = parseInt(getViewport.Height() - 150);
		if (newFlashHeight > 545) newFlashHeight = 545;
		var newFlashWidth = parseInt(newFlashHeight * 1.7557);

		var isEn = TRANSLATE.GetValue("lang") == "en";

		if (flashSource.toLowerCase().indexOf('ap1financialreportsingle') != -1) {
			flashSource = flashSource + '&xmlurl=../../gfx/flash/report.xml';
			flashHeight = newFlashHeight;
			flashWidth = newFlashWidth;

			if (isEn) {
				flashSource = flashSource.toString().replace('report.xml', 'report_en.xml');
				flashSource = "en/" + flashSource;
			}
		}
		if (flashSource.toLowerCase().indexOf('ap1financialreportintro.swf') != -1) {
			path = '../gfx/flash/';
			if (isEn) {
				path = path + "en/";
			}
			flashHeight = newFlashHeight;
			flashWidth = newFlashWidth;
			flashSource = flashSource.toString().replace('../../', '../');
			
		}
		if (flashSource.toLowerCase().indexOf('ap1inlinevideo.swf') != -1) {
			flashHeight = 221;
			flashWidth = 300;
			flashWmode = 'transparent';
		}
		if (flashSource.toLowerCase().indexOf('ap1ceovideo.swf') != -1) {
			flashWmode = 'transparent';

			if (isEn) {
				flashSource = "en/" + flashSource;
			}
		}

		flashSource = path + flashSource;

		var flashInput = '';
		flashInput += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="' + flashWidth + '" height="' + flashHeight + '" align="middle">';
		flashInput += '	<param name="movie" value="' + flashSource + '"/>';
		flashInput += '	<param name="quality" value="high"/>';
		flashInput += '	<param name="scale" value="' + flashScale + '">';
		flashInput += '	<param name="allowscriptaccess" value="always">'
		flashInput += '	<param name="wmode" value="' + flashWmode + '"/>';
		flashInput += '	<embed scale="' + flashScale + '" wmode="' + flashWmode + '" allowscriptaccess="always" src="' + flashSource + '" pluginspace="http://www.adobe.com/go/getflashplayer" width="' + flashWidth + '" height="' + flashHeight + '" type="application/x-shockwave-flash" quality="high"/>';
		flashInput += '</object>';
		flashArea.innerHTML = flashInput;
	}
}
PAGE.HideFlashArea = function() {
	for (var i = 0, n = PAGE.FlashArea.length; i < n; i++) {
		var flashArea = PAGE.FlashArea[i];
		flashArea.style.visibility = 'hidden';
	}
};
PAGE.ShowFlashArea = function() {
	for (var i = 0, n = PAGE.FlashArea.length; i < n; i++) {
		var flashArea = PAGE.FlashArea[i];
		flashArea.style.visibility = 'visible';
	}
};
PAGE.ChangeTextSize = function(e) {
	var target = $('btn-textsize');
	if (PAGE.TextSize == 'big') {
		PAGE.TextSize = 'default';
		Cookie.Create('HHHR-TextSize', 'default', '365');
		DOM.SetAttribute(target, 'TITLE', TEXTHANDLER.TextSizeBigTitle);
		target.innerHTML = '<span>' + TEXTHANDLER.TextSizeBig + '</span>';
	} else {
		PAGE.TextSize = 'big';
		Cookie.Create('HHHR-TextSize', 'big', '365');
		DOM.SetAttribute(target, 'TITLE', TEXTHANDLER.TextSizeStandardTitle);
		target.innerHTML = '<span>' + TEXTHANDLER.TextSizeStandard + '</span>';
	}
	if (PAGE.RenderMode == 'static') {
		document.location.reload();
	} else {
		if (PAGE.LayoutMode == 'special') {
			document.location.reload();
		} else {
			LAYOUT.ForceReset();
		}
	};
};
PAGE.ChangeRenderMode=function(){
	if(PAGE.RenderMode=='dynamic'){
		PAGE.RenderMode='static';
		Cookie.Create('HHHR-PageRender','static','365');
	}else{
		PAGE.RenderMode='dynamic';
		Cookie.Create('HHHR-PageRender','dynamic','365');
	}
	document.location.reload();
};
PAGE.Listen = function(e) {
	if (!e) e = window.event;
	CancelEvent(e);
	$('tools').style.display = 'none';
	var pageURL = document.location.toString();
	encodedURL = escape(pageURL);
	var doubleencodedURL = escape(encodedURL);
	var mp3FileName = document.getElementsByTagName('TITLE')[0].innerHTML.toString() + '_' + document.getElementsByTagName('H1')[0].innerHTML.toString();
	mp3FileName = mp3FileName.WebSafe();
	var pathToFlashPlayer = 'http://www.ap1.se/2008/gfx/flash/';
	//var pathToFlashPlayer = 'http://produktion.halvarsson.se/clients/ap12008sv/wwwroot/gfx/flash/';

	var langForReadspeaker = "sv_se";
	var spara = "Spara som MP3";
	if (TRANSLATE.GetValue("lang") == "en") {
		langForReadspeaker = "en_uk";
		spara = "Save as MP3";
	}

	if ($('readspeaker')) DOM.Remove($('readspeaker'));
	var divReadSpeaker = DOM.Create('div', '', 'readspeaker');
	divReadSpeaker.innerHTML =
		'<object classid=\'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\' codebase=\'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0\' height=\'25\' width=\'175\'>'
		+ '	<param name=\'movie\' value="' + pathToFlashPlayer + 'readspeaker19.swf?url=http%3A%2F%2Fapp.readspeaker.com%2Fcgi-bin%2Frsent%3Fcustomerid%3D4489%26lang%3D' + langForReadspeaker + '%26url%3D' + doubleencodedURL + '">'
		+ '	<param name=\'quality\' value=\'high\'><param name=\'SCALE\' value=\'exactfit\'>'
		+ '	<param name=\'wmode\' value=\'transparent\'>'
		+ '	<embed wmode=\'transparent\' src="' + pathToFlashPlayer + 'readspeaker19.swf?url=http%3A%2F%2Fapp.readspeaker.com%2Fcgi-bin%2Frsent%3Fcustomerid%3D4489%26lang%3D' + langForReadspeaker + '%26url%3D' + doubleencodedURL + '" quality=\'high\' pluginspage=\'http://www.macromedia.com/go/getflashplayer\' type=\'application/x-shockwave-flash\' scale=\'exactfit\' height=\'25\' width=\'175\'>'
		+ '	</embed>'
		+ '</object>'
		+ '<a href="http://app.readspeaker.com/cgi-bin/rsent?customerid=4489&lang=sv_se&audiofilename=' + mp3FileName + '&voice=elin22k&save=1&url=' + encodedURL + '">' + spara + '</a>';
	DOM.Add(divReadSpeaker, document.getElementsByTagName('body')[0]);
};

PAGE.GetPageHash=function(){
    var url = document.location.pathname.toString();
    var posSlash = url.lastIndexOf("/");
    var posDot = url.lastIndexOf(".");
    url = url.substring(posSlash,posDot);
    return url;
};


/* iPOP - INTERNALPOPUPS
----------------------------------------------------*/
iPOP.Init = function() {
	this.iPop = null;
	this.extraWidth = 85;
	this.extraHeight = 50;
	this.Left = 0;
	this.Top = 120;
	this.isFlash = false;
	this.Topic = '';
	var internalLinks = getElementsByAttribute($('content'), 'A', 'rel', 'inline');
	for (var i = 0, n = internalLinks.length, link = null; i < n; i++) {
		link = internalLinks[i];
		addEvent(link, 'click', iPOP.Open);
	}

	//## EXTERNAL LINKS
	var externalLinks = $('content').getElementsByTagName('A');
	for (var i = 0, n = externalLinks.length; i < n; i++) {
		var link = externalLinks[i];
		var url = DOM.GetAttribute(link, 'href');
		if (url && url.toLowerCase() != 'javascript:;' && url.toLowerCase().indexOf('../') == -1) {
			if (url.indexOf(document.domain.toString()) == -1) {
				DOM.SetAttribute(externalLinks[i], 'target', '_blank');
			}
		}
	}

};
iPOP.Open = function(e) {
	if (PAGE.RenderMode == 'static') return;
	PAGE.HideFlashArea();
	iPOP.Build(e);
	CancelEvent(e);
};
iPOP.Close=function(){
	PAGE.ShowFlashArea();
	var iPop=$('ipopper');
	if(iPop){
		DOM.Remove(iPop);
		iPopAnimation.Close();
	}
};
iPOP.AddTextContent = function(url, e) {
	if (!url) return;
	url = url.toString().toLowerCase();
	if (url.indexOf('#bm_') != -1) {
		url = '../_popups/' + url.substring(url.indexOf('#bm_') + 1) + '.html?cache=' + Math.random();
	} else {
		var fileName = url.substring(url.lastIndexOf('/'));
		fileName = fileName.replace('/', '');
		url = '../_popups/' + fileName + '?cache=' + Math.random();
	}
	var longUrl = 'http://' + document.domain;
	if (typeof XMLHttpRequest == 'undefined') {
		function XMLHttpRequest() {
			try { return new ActiveXObject("MSXML3.XMLHTTP") } catch (e) { }
			try { return new ActiveXObject("MSXML2.XMLHTTP.3.0") } catch (e) { }
			try { return new ActiveXObject("MSXML2.XMLHTTP.4.0") } catch (e) { }
			try { return new ActiveXObject("Msxml2.XMLHTTP") } catch (e) { }
			try { return new ActiveXObject("Microsoft.XMLHTTP") } catch (e) { }
			return null;
		};
	}
	var responseXml = null;
	httpRequest = new XMLHttpRequest();
	if (httpRequest.overrideMimeType) httpRequest.overrideMimeType('text/xml');
	httpRequest.open('GET', url, true);
	httpRequest.send(null);
	httpRequest.onreadystatechange = function() {
		var thisFunction = arguments.callee;
		if (!thisFunction.loopCount) thisFunction.loopCount = 0;
		thisFunction.loopCount++;
		if (thisFunction.loopCount > 10) {
			oTopic.innerHTML = '404';
			oContent.innerHTML = '';
			return;
		}
		if (httpRequest.readyState == 4) {
			if (httpRequest.status == 200) {
				if (httpRequest.responseXML == null) return;
				responseXml = httpRequest.responseXML.documentElement;
				if (!responseXml) {
					var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
					xmlDoc.async = false;
					xmlDoc.loadXML(httpRequest.responseText);
					if (xmlDoc.documentElement !== null) {
						responseXml = xmlDoc.documentElement;
					}
				}
				if (responseXml) {
					var strTopic = '', strText = '', oContent;
					strTopic = responseXml.getElementsByTagName('title')[0].firstChild.nodeValue;
					oContent = responseXml.getElementsByTagName('content')[0]; //.getElementsByTagName('p');
					strText = oContent.xml;
					iPOP.Topic = strTopic;
					if (typeof strText == 'undefined') {
						strText = new XMLSerializer().serializeToString(oContent);
					}
					$('pop-topic').getElementsByTagName('A')[0].innerHTML = strTopic;
					$('pop-content').innerHTML = strText;
				}
			} else if (httpRequest.status == 404) {
				var ErrorUrl = longUrl + url.replace('..', '');
				$('pop-topic').getElementsByTagName('A')[0].innerHTML = '404 Page Not Found!';
				$('pop-content').innerHTML = '<p>The requested file was not found on this server.<br /><code>' + ErrorUrl + '</code></p>';
			}
		}
	};
};
iPOP.Build = function(e) {
	var Event = e;
	var Trigger = (e.srcElement) ? e.srcElement : e.target;
	var Parent = Trigger.parentNode;
	iPOP.isFlash = false;
	if (PAGE.LayoutMode != 'table') {
		while (Parent.parentNode && Parent.parentNode.className !== 'column') {
			Parent = Parent.parentNode;
		}
		Parent = Parent.parentNode;
	}
	if ((Trigger.tagName.toLowerCase() == 'span' && Trigger.className == 'zoom') || Trigger.tagName.toLowerCase() == 'img' || Trigger.tagName.toLowerCase() == 'strong') {
		Trigger = Trigger.parentNode;
	}
	iPOP.TriggerX = e.clientX;
	iPOP.TriggerY = e.clientY;
	if (PAGE.LayoutMode == 'table') {
		var ScrollPanel = $('tablescrollpanel');
		var wrapperLeft = $('tablescrollpanel').scrollLeft;
		iPOP.extraHeight = 42;
		iPOP.Width = 515;
		if (Parent.tagName == 'TD') {
			iPOP.Left = 500;
		} else {
			iPOP.Left = -10;
		}
	} else if (PAGE.LayoutMode == 'special') {
		var ScrollPanel = $('content');
	} else {
		var ScrollPanel = $('scrollpanel');
		var wrapperLeft = ScrollPanel.scrollLeft;
		var parentLeft = parseInt(Parent.offsetLeft - wrapperLeft);
		if (Parent.nextSibling) {
			iPOP.Left = (parentLeft > 600) ? parseInt(Parent.previousSibling.offsetLeft - wrapperLeft) - 65 : parseInt(Parent.nextSibling.offsetLeft - wrapperLeft) - 20;
		}
		iPOP.Width = Parent.clientWidth + iPOP.extraWidth;
	}
	var topicLink = DOM.GetAttribute(Trigger, 'href');
	if (topicLink.toLowerCase().indexOf('flash') != -1) {
		iPOP.isFlash = true;
	}
	if (Trigger.parentNode.parentNode.className.indexOf('illustration') != -1) {
		var ImageSrc = DOM.GetAttribute(Trigger, 'href');
		var bigImage = new Image();
		bigImage.src = ImageSrc.toString();
		bigImage.width = 600;
		iPOP.Width = 668;
		var currContentWidth = parseInt(LAYOUT.ContentDiv.style.width);
		if ((iPOP.Left + iPOP.Width) > currContentWidth) {
			iPOP.Left = 0;
		}
	} else if ((Trigger.parentNode.parentNode.className.indexOf('additional') != -1) && (Trigger.parentNode.parentNode.className.indexOf('graph-box') != -1)) {
		if (PAGE.LayoutMode == 'special') {
			this.Width = 668;
		} else {
			var tableWrapper = Trigger.parentNode.parentNode.getElementsByTagName('DIV')[1];
			tableWrapper.style.display = 'block';
			this.Width = tableWrapper.getElementsByTagName('TABLE')[0].offsetWidth + 70;
			tableWrapper.style.display = 'none';
		}
		if (DOM.GetByClassName(Trigger.parentNode, 'table', 'double')[0]) {
			this.Width = 970;
			this.Left = 0;
		}
	} else if ((Trigger.parentNode.parentNode.parentNode.className.indexOf('additional') != -1) && (Trigger.parentNode.parentNode.parentNode.className.indexOf('graph-box') != -1)) {
		var tableWrapper = Trigger.parentNode.parentNode.parentNode.getElementsByTagName('DIV')[1];
		tableWrapper.style.display = 'block';
		this.Width = tableWrapper.getElementsByTagName('TABLE')[0].offsetWidth + 100;
		tableWrapper.style.display = 'none';
	} else {
		if (!topicLink) topicLink = Trigger.a;
		if (!topicLink) return;
	}
	if (iPOP.isFlash) {
		this.Width = 600;
		this.Left = 0;
	}
	iPOP.Height = ScrollPanel.clientHeight + iPOP.extraHeight;
	iPOP.iPop = $('ipopper');
	if (iPOP.iPop) DOM.Remove(iPOP.iPop);
	iPOP.iPop = document.createElement('DIV');
	iPOP.iPop.id = 'ipopper';
	iPOP.iPop.style.top = iPOP.Top + 'px';
	iPOP.iPop.style.left = iPOP.Left + 'px';
	iPOP.iPop.style.width = iPOP.Width + 'px';
	iPOP.iPop.style.height = iPOP.Height + 'px';
	DOM.Add(DOM.Create('DIV', 'pop-corner-tr'), iPOP.iPop);
	DOM.Add(DOM.Create('DIV', 'pop-corner-br'), iPOP.iPop);
	DOM.Add(DOM.Create('DIV', 'pop-corner-bl'), iPOP.iPop);
	DOM.Add(DOM.Create('DIV', 'pop-corner-tl'), iPOP.iPop);
	var shade = DOM.Create('DIV', 'pop-top');
	shade.style.width = parseInt(iPOP.Width - 40) + 'px';
	DOM.Add(shade, iPOP.iPop);
	var main = DOM.Create('DIV', 'pop-main');
	main.style.width = parseInt(iPOP.Width - 40) + 'px';
	main.style.height = parseInt(iPOP.Height - 40) + 'px';
	DOM.Add(main, iPOP.iPop);
	var shade = DOM.Create('DIV', 'pop-bottom');
	shade.style.width = parseInt(iPOP.Width - 40) + 'px';
	DOM.Add(shade, iPOP.iPop);
	var shade = DOM.Create('DIV', 'pop-right');
	shade.style.height = parseInt(iPOP.Height - 40) + 'px';
	DOM.Add(shade, iPOP.iPop);
	var shade = DOM.Create('DIV', 'pop-left');
	shade.style.height = parseInt(iPOP.Height - 40) + 'px';
	DOM.Add(shade, iPOP.iPop);
	var close = DOM.Create('DIV', 'pop-close');
	close.title = 'Close';
	close.innerHTML = '<span>' + TEXTHANDLER.Close + '</span>';
	addEvent(close, 'click', iPOP.Close);
	DOM.Add(close, iPOP.iPop);
	var popTopic = DOM.Create('H2', '', 'pop-topic');
	var popLink = DOM.Create('A');
	DOM.SetAttribute(popLink, 'HREF', topicLink);
	DOM.Add(popLink, popTopic);
	DOM.Add(popTopic, iPOP.iPop);
	var popContent = DOM.Create('DIV', '', 'pop-content');
	popContent.style.width = iPOP.Width - 68 + 'px';
	popContent.style.height = iPOP.Height - 85 + 'px';
	DOM.Add(popContent, iPOP.iPop);

	iPOP.iPop.style.visibility = 'hidden';
	DOM.Add(iPOP.iPop, document.getElementsByTagName('BODY')[0]);

	//## INPUT CONTENT
	if (Trigger.parentNode.parentNode.className.indexOf('illustration') != -1 && !iPOP.isFlash) {
		CancelEvent(e);
		if (bigImage) {
			$('pop-content').appendChild(bigImage);
			bigImage.style.width = '600px';
			bigImage.style.height = 'auto';
			if (Trigger.getElementsByTagName('STRONG')[0]) {
				iPOP.Topic = Trigger.getElementsByTagName('STRONG')[0].innerHTML;
				$('pop-topic').getElementsByTagName('A')[0].innerHTML = iPOP.Topic;
			}
			DOM.SetAttribute($('pop-topic').getElementsByTagName('A')[0], 'TARGET', '_blank');
			if (bigImage.src.toString().indexOf('/diagrams/') != -1) {
				var linkBox = DOM.Create('DIV', 'diagram-linkbox');
				var linkBoxList = DOM.Create('UL');
				var linkToEmf = ImageSrc.toLowerCase().replace('/fullsize/', '/emf/').replace('.png', '.emf');
				var linkToExcel = ImageSrc.toLowerCase().replace('/fullsize/', '/excel/').replace('.png', '.xls');
				linkBoxList.innerHTML = '<li class="emf"><a href="' + linkToEmf + '" target="_blank">' + TEXTHANDLER.DownloadEmfText + '</a></li><li class="excel"><a href="' + linkToExcel + '" target="_blank">' + TEXTHANDLER.DownloadExcelText + '</a></li>';
				DOM.Add(linkBoxList, linkBox);
				DOM.Add(linkBox, $('pop-content'));
			}
			if (Trigger.parentNode.getElementsByTagName('CITE')[0]) {
				var popCite = DOM.Create('CITE');
				var oCite = Trigger.parentNode.getElementsByTagName('CITE')[0]
				var strCite = oCite.innerHTML;
				if (strCite && DOM.GetAttribute(oCite, 'title')) {
					strCite = DOM.GetAttribute(oCite, 'title').toString();
				}
				popCite.innerHTML = strCite;
				DOM.Add(popCite, $('pop-content'));
			}
		}
	} else if (Trigger.parentNode.parentNode.className == 'additional graph-box') {
		var tables = Trigger.parentNode.parentNode.getElementsByTagName('TABLE');
		if (tables.length == 1) {
			table = tables[0];
			var tableClone = table.cloneNode(true);
			tableClone.getElementsByTagName('TH')[0].style.textAlign = 'left';
			$('pop-content').appendChild(tableClone);
			if (Trigger.getElementsByTagName('STRONG')[0]) {
				iPOP.Topic = Trigger.getElementsByTagName('STRONG')[0].innerHTML;
				$('pop-topic').getElementsByTagName('A')[0].innerHTML = iPOP.Topic;
			}
			if (Trigger.parentNode.getElementsByTagName('CITE')[0]) {
				var popCite = DOM.Create('CITE');
				var oCite = Trigger.parentNode.getElementsByTagName('CITE')[0]
				var strCite = oCite.innerHTML;
				if (strCite && DOM.GetAttribute(oCite, 'title')) {
					strCite = DOM.GetAttribute(oCite, 'title').toString();
				}
				popCite.innerHTML = strCite;
				DOM.Add(popCite, $('pop-content'));
			}
		} else {
			for (var i = 0, n = tables.length; i < n; i++) {
				var tableClone = tables[i].cloneNode(true);
				$('pop-content').appendChild(tableClone);
			}
			iPOP.Topic = Trigger.getElementsByTagName('STRONG')[0].innerHTML;
			$('pop-topic').getElementsByTagName('A')[0].innerHTML = iPOP.Topic;
			if (Trigger.parentNode.getElementsByTagName('CITE')[0]) {
				var popCite = DOM.Create('CITE');
				popCite.innerHTML = Trigger.parentNode.getElementsByTagName('CITE')[0].innerHTML;
				DOM.Add(popCite, $('pop-content'));
			}
		}
		CancelEvent(e);
	} else {
		iPOP.AddTextContent(topicLink, e);
	}

	if (typeof sC == "object" && typeof sC.hhLogPopup == "function") {
		if (iPOP.Topic) {
			popupName = iPOP.Topic;
		} else if (topicLink) {
			popupName = topicLink;
		} else {
			popupName = null;
		}
		sC.hhLogPopup(popupName);
	}


	//## ANIMATE VISIBILITY
	//## iPopAnimation.Start(X, Y, WIDTH ,HEIGHT);
	iPopAnimation.Start(iPOP.Left, iPOP.Top, iPOP.Width, iPOP.Height);
	TOOLTIP.Init();
};

function cubicOut(t, b, c, d) {return c*((t=t/d-1)*t*t + 1) + b;}
function cubicIn(t, b, c, d) {return c*(t/=d)*t*t + b;}

/* ANIMATION
----------------------------------------------------*/
var iPopAnimation = {
	Start: function(x, y, width, height) {
		var elmAnimator = $('pop-animator');
		if (elmAnimator) DOM.Remove(elmAnimator);
		elmAnimator = DOM.Create('DIV', '', 'pop-animator');
		elmAnimator.style.left = iPOP.TriggerX - 3 + 'px';
		elmAnimator.style.top = iPOP.TriggerY - 3 + 'px';
		this.Animator = elmAnimator;
		this.Animation = { time: 0, top: 0, left: 0, width: 0, height: 0, changeTop: 0, changeLeft: 0, changeHeight: 0, changeWidth: 0, duration: 0.0, timer: null, element: null };
		DOM.Add(elmAnimator, document.getElementsByTagName('BODY')[0]);
		iPopAnimation.Animation.time = 0;
		iPopAnimation.Animation.top = iPOP.TriggerY - 5;
		iPopAnimation.Animation.left = iPOP.TriggerX - 5;
		iPopAnimation.Animation.height = 0;
		iPopAnimation.Animation.width = 10;
		iPopAnimation.Animation.changeTop = y - iPopAnimation.Animation.top + 10;
		iPopAnimation.Animation.changeLeft = x - iPopAnimation.Animation.left;
		iPopAnimation.Animation.changeWidth = width;
		iPopAnimation.Animation.changeHeight = height;
		iPopAnimation.Animation.duration = 25;
		iPopAnimation.Animation.element = elmAnimator;
		iPopAnimation.Animation.timer = setInterval("iPopAnimation.Animate();", 15);
	},
	Close: function() {
		iPopAnimation.Animator.style.visibility = 'visible';
		iPopAnimation.Animation.time = 0;
		iPopAnimation.Animation.top = iPOP.Top;
		iPopAnimation.Animation.left = iPOP.Left;
		iPopAnimation.Animation.height = iPOP.Height;
		iPopAnimation.Animation.width = iPOP.Width;
		iPopAnimation.Animation.changeTop = parseInt(iPOP.TriggerY - iPOP.Top);
		iPopAnimation.Animation.changeLeft = parseInt(iPOP.TriggerX - iPOP.Left);
		iPopAnimation.Animation.changeWidth = -iPOP.Width;
		iPopAnimation.Animation.changeHeight = -iPOP.Height;
		iPopAnimation.Animation.duration = 25;
		iPopAnimation.Animation.element = iPopAnimation.Animator;
		iPopAnimation.Animation.timer = setInterval("iPopAnimation.Animate();", 15);
	},
	Stop: function() {
		DOM.Remove(iPopAnimation.Animator);
		clearInterval(iPopAnimation.Animation.timer);
		iPopAnimation.Animation.timer = null;
	},
	Animate: function() {
		var move = null;
		if (iPopAnimation.Animation.time >= iPopAnimation.Animation.duration) {
			clearInterval(iPopAnimation.Animation.timer);
			iPopAnimation.Animation.timer = null;
			iPopAnimation.Animation.duration = null;
			iPopAnimation.Animator.style.visibility = 'hidden';
			if (iPOP.iPop) {
				iPOP.iPop.style.visibility = 'visible';
			}
			return;
		} else {
			//## LEFT
			move = cubicOut(iPopAnimation.Animation.time, iPopAnimation.Animation.left, iPopAnimation.Animation.changeLeft, iPopAnimation.Animation.duration)
			iPopAnimation.Animation.element.style.left = parseInt(move) + 'px';
			//## TOP
			move = cubicOut(iPopAnimation.Animation.time, iPopAnimation.Animation.top, iPopAnimation.Animation.changeTop, iPopAnimation.Animation.duration)
			iPopAnimation.Animation.element.style.top = parseInt(move) + 'px';
			//## WIDTH
			move = cubicOut(iPopAnimation.Animation.time, iPopAnimation.Animation.width, iPopAnimation.Animation.changeWidth, iPopAnimation.Animation.duration)
			iPopAnimation.Animation.element.style.width = parseInt(move) + 'px';
			//## HEIGHT
			move = cubicOut(iPopAnimation.Animation.time, iPopAnimation.Animation.height, iPopAnimation.Animation.changeHeight, iPopAnimation.Animation.duration)
			iPopAnimation.Animation.element.style.height = parseInt(move) + 'px';
			iPopAnimation.Animation.time++;
		}
	}
};





//------------------------------------------------------------------
//## LAYOUT
//------------------------------------------------------------------
LAYOUT.Init = function() {
	this.ContentDiv = $('content');
	this.TextLineHeight = 0;
	this.ColumnWidth = 0;
	this.ColumnMargin = 0;
	this.lastDimensions = getViewport.Height() + '.' + getViewport.Width()
	//## ENLARGE TEXT
	if (PAGE.TextSize == 'big') {
		LAYOUT.ColumnWidth = 390;
		LAYOUT.ColumnMargin = 20;
		LAYOUT.TextLineHeight = 22;
		LAYOUT.ContentDiv.className += ' large';
	} else {
		LAYOUT.ColumnWidth = 300;
		LAYOUT.ColumnMargin = 14;
		LAYOUT.TextLineHeight = 17;
		LAYOUT.ContentDiv.className = LAYOUT.ContentDiv.className.replace('large', '');
	}

	this.CurrentColumn = 0;
	this.Columns = 0;
	this.ColumnStartPosition = 0;
	this.VisibleColumns = 0;
	this.LastVisibleColumn = null;

	this.ScrollDuration = 25;
	this.ScrollThread = null;
	this.ScrollLastPosition = 0;
	this.ScrollAnimation = { time: 0, begin: 0, change: 0.0, duration: 0.0, element: null, timer: null };

	this.OriginalContent = '';
	this.isResizing = null;
	this.TableHeader = null;

	if (PAGE.RenderMode == 'dynamic') {
		if (PAGE.LayoutMode == 'table') {
			LAYOUT.BuildTableLayout();
		} else if (PAGE.LayoutMode == 'special') {
			LAYOUT.BuildSpecialLayout();
		} else {
			LAYOUT.BuildColumnLayout();
		}
		addEvent(window, 'resize', LAYOUT.ResetLayout);
		addEvent(window, 'scroll', PAGE.CheckForOversize);
	}
};
LAYOUT.ToggleFinancialTableWidth = function(e) {
	CancelEvent(e);
	LAYOUT.ClearAllGraphs();
	var scrollPanel = $('tablescrollpanel');
	isWide = (scrollPanel.className == 'wide');
	if (isWide) {
		scrollPanel.className = '';
		$('submenu').style.display = 'block';
		scrollPanel.parentNode.className = '';
		DOM.ChildNodes(DOM.ChildNodes(DOM.ChildNodes(DOM.ChildNodes(scrollPanel)[0])[0])[0])[5].style.display = 'none';
	} else {
		scrollPanel.className = 'wide';
		$('submenu').style.display = 'none';
		scrollPanel.parentNode.className = 'wide';
		if (!isIE) {
			DOM.ChildNodes(DOM.ChildNodes(DOM.ChildNodes(DOM.ChildNodes(scrollPanel)[0])[0])[0])[5].style.display = 'table-cell';
		} else {
			DOM.ChildNodes(DOM.ChildNodes(DOM.ChildNodes(DOM.ChildNodes(scrollPanel)[0])[0])[0])[5].style.display = 'block';
		}
	}
};
LAYOUT.InitGraphs = function(e) {
	var table = $('financial-table');
	var rows = table.rows;
	for (var i = 0, n = rows.length, tr = null, td = null, newTd = null; i < n; i++) {
		row = rows[i];
		td = row.cells[1];
		if (!td.getElementsByTagName('IMG')[0]) {
			if (row.parentNode.tagName == 'TBODY') {
				newTd = LAYOUT.CreateCheckboxCell();
				newTd.style.cursor = 'pointer';
				row.insertBefore(newTd, td);
				addEvent(newTd, 'click', LAYOUT.DisplayGraphBars);
			} else {
				if (td.className != 'radio') {
					row.insertBefore(DOM.Create('TH', 'radio', ''), td);
				}
			}
		}
	}
	var noteCols = getElementsByClassName($('head-clone'), 'TH', 'note');
	if (!noteCols) return;
	var n = noteCols.length;
	var headerNoteCell = noteCols[n - 1];
	if (!headerNoteCell) return;
	var newHeaderNoteCell = DOM.Create('TH', 'note', '');
	var graphIcon = DOM.Create('IMG', 'graph-icon', '');
	DOM.SetAttribute(graphIcon, 'SRC', '../../gfx/ico-graph.png');
	DOM.Add(graphIcon, newHeaderNoteCell);
	headerNoteCell.parentNode.insertBefore(newHeaderNoteCell, headerNoteCell);
	headerNoteCell.style.display = 'none';
};
LAYOUT.CreateCheckboxCell = function() {
	var cell = DOM.Create('TD', 'radio', '');
	var box = DOM.Create('IMG', 'graph-radio', '');
	DOM.SetAttribute(box, 'SRC', '../../gfx/radio-off.png');
	DOM.Add(box, cell);
	return cell;
};
LAYOUT.ClearAllGraphs = function() {
	var imgs = getElementsByClassName($('tablescrollpanel'), 'IMG', 'graph-radio');
	for (var i = 0, n = imgs.length; i < n; i++) {
		imgs[i].src = '../../gfx/radio-off.png';
	}
	var trs = $('financial-table').getElementsByTagName('tr');
	for (var i = 0, n = trs.length; i < n; i++) {
		trs[i].className = trs[i].className.replace('diagram', '');
	}
	if ($('bars')) DOM.Remove($('bars'));
};
LAYOUT.DisplayGraphBars=function(e){
	var imgs=getElementsByClassName($('tablescrollpanel'),'IMG','graph-radio');
	for(var i=0,n=imgs.length,img=null; i<n; i++){
		img=imgs[i];
		img.src='../../gfx/radio-off.png';
	}
	//## CLEAR ALLA DIAGRAM ROWS FROM TABLE 
	var trs = $('financial-table').getElementsByTagName('tr');
	for (var i=0,iLen=trs.length;i<iLen;i++){
		trs[i].className=trs[i].className.replace('diagram','');
	}
	if ($('bars')) $('bars').style.display = 'none';
	if(this == LAYOUT.CurrentRadio){
		LAYOUT.CurrentRadio=null;
	}else{		
		LAYOUT.CurrentRadio=this;				
		this.getElementsByTagName('IMG')[0].src='../../gfx/radio-on.png';				
		//## INSERT CODE FOR DISPLAYING BARS!
		LAYOUT.ShowDiagram(this.parentNode, e);				
	}
};
LAYOUT.FinancialTableScroll = function(e) {
	if ($('bars')) DOM.Remove($('bars'));
};
LAYOUT.ShowDiagram = function(tr, e) {
	var tableId = 'financial-table';
	if ($('bars')) DOM.Remove($('bars'));
	div = document.createElement('div');
	div.id = 'bars';
	for (var i = 0; i < 10; i++) {
		img = document.createElement('img');
		img.width = '7';
		div.appendChild(img);
	}
	DOM.Add(div, $('tablescrollpanel'));
	el = $(tableId).getElementsByTagName('div')[0];
	diagrambars = document.getElementById('bars').getElementsByTagName('IMG');
	tr.className = tr.className + ' diagram';
	diagramcells = tr.cells;
	cellvalue = new Array();
	max = -1000000;
	min = 1000000;
	label = diagramcells[0].childNodes[0];
	for (var i = 2; i < diagramcells.length; i++) {
		cellvalue[i] = diagramcells[i].innerHTML.replace(/ /g, '');
		if (TRANSLATE.Lang == 'en')
			cellvalue[i] = cellvalue[i].replace(',', '');
		else
			cellvalue[i] = cellvalue[i].replace('&nbsp;', '').replace(',', '.');

		cellvalue[i] = parseFloat(cellvalue[i]);
		if (cellvalue[i] < min)
			min = cellvalue[i];
		if (cellvalue[i] > max)
			max = cellvalue[i];
	}
	scale = 1;
	if (Math.abs(min) > max) {
		scale = -min;
	} else {
		scale = max;
	}
	scrollDivTop = document.getElementById('tablescrollpanel').scrollTop;
	var left = 206;
	var top = tr.offsetTop - 35 - scrollDivTop;
	for (var i = 3; i < diagramcells.length; i++) {
		if (isNaN(cellvalue[i])) cellvalue[i] = 0;
		height = parseInt((Math.abs(cellvalue[i]) / scale) * 100);
		diagrambars[i - 2].style.height = height + 'px';
		diagrambars[i - 2].style.left = left + 'px';
		if (cellvalue[i] < 0) {
			diagrambars[i - 2].className = 'negative';
			diagrambars[i - 2].style.top = top + 'px';
			diagrambars[i - 2].src = '../../gfx/diagramred.gif';
		} else {
			diagrambars[i - 2].className = '';
			diagrambars[i - 2].style.top = (top - height) + 'px';
			diagrambars[i - 2].src = '../../gfx/diagramblue.gif';
		}
		left += 73;
		diagrambars[i - 2].style.display = 'block';
	}
	$('bars').style.display = 'block';
};
LAYOUT.BuildTableLayout = function() {
	iPOP.Init();
	var tables = LAYOUT.ContentDiv.getElementsByTagName('TABLE');
	for (var i = 0, t = tables.length, table = null; i < t; i++) {
		table = tables[i];
		if (table.className.indexOf('datatable') > -1) {
			//## INIT MULTIYEAR
			if (table.className.indexOf('multiyear') > -1) {
				var toogleMultiView = DOM.Create('DIV', '', 'headlinelink');
				var toogleMultiViewTrigger = DOM.Create('A');
				DOM.SetAttribute(toogleMultiViewTrigger, 'HREF', 'javascript:;');
				toogleMultiViewTrigger.innerHTML = TEXTHANDLER.FinancialTableMultiViewTrigger;
				addEvent(toogleMultiViewTrigger, 'click', LAYOUT.ToggleFinancialTableWidth);
				DOM.Add(toogleMultiViewTrigger, toogleMultiView);
				DOM.Add(toogleMultiView, LAYOUT.ContentDiv);
			}
			if (table.getElementsByTagName('THEAD')) {
				var tHeadRows = table.getElementsByTagName('THEAD')[0].rows.length;
				var tHeadTopicRow = table.getElementsByTagName('THEAD')[0].rows[tHeadRows - 1].className = 'main-header-row';
			}
			var oldlevel = 1;
			for (var r = 1, nn = table.rows.length, row = null; r < nn; r++) {
				row = table.rows[r];
				var className = row.className;
				var pos = className.indexOf('lev') + 3;
				var level = className.substring(pos, pos + 1);
				if (level > oldlevel) {
					var cell = table.rows[r - 1].cells[0];
					var tmplevel = level;
					while (tmplevel > 1) {
						tmplevel--;
						cell = cell.childNodes[0];
					}
					cell = cell.parentNode;
					if (!cell.getElementsByTagName('A')[0]) {//## CHECK SO WE DONT APPEND MULTIPLE ITEMS
						a = document.createElement('a');
						a.innerHTML = cell.innerHTML;
						a.href = 'javascript:;';
						addEvent(a, 'click', LAYOUT.Swaprows);
						cell.innerHTML = '';
						cell.appendChild(a);
					}
				}
				oldlevel = level;
			}
		}
		var rowCount = Math.floor((document.documentElement.clientHeight - LAYOUT.ContentDiv.offsetTop) / LAYOUT.TextLineHeight) - 5;
		var maxHeight = LAYOUT.TextLineHeight * rowCount;
		var contentHeight = LAYOUT.ContentDiv.scrollHeight;
		var tableheight = maxHeight;
		var TableScrollPanel = $('tablescrollpanel');
		if (table.className.indexOf('scrollable') > -1) {
			table = document.createElement('table');
			table.className = table.className;
			table.cellSpacing = '0';
			table.appendChild(document.createElement('tbody'));
			table = table.childNodes[0];
			table.appendChild(tables[i].rows[0]); // append first row
			if (table.rows[0].cells[1].tagName == 'TH') {
				table.appendChild(tables[i].rows[0]); // append second row
			}
			table.parentNode.insertBefore(table.parentNode, table);
			tableheight -= table.offsetHeight;
			tablescrollpanel = document.createElement('div');
			tablescrollpanel.className = 'tablescrollpanel';
			table.parentNode.appendChild(tablescrollpanel);
			tablescrollpanel.appendChild(tables[i + 1]);
			return;
		} else {
			if (!TableScrollPanel) {
				TableScrollPanel = document.createElement('div');
				TableScrollPanel.id = 'tablescrollpanel';
				table.parentNode.insertBefore(TableScrollPanel, table.parentNode.firstChild);
				TableScrollPanel.appendChild(table);
			}
		}
		LAYOUT.CreateHeaderClone(table, false);
		LAYOUT.InitGraphs();
	}
};
LAYOUT.CreateHeaderClone = function(table, override) {
	var tHeadClone = $('head-clone');
	var headCloneClass = ($('tablescrollpanel').className == 'wide') ? 'wide' : '';
	if (!tHeadClone || override) {
		if (tHeadClone) DOM.Remove(tHeadClone);
		var tHead = table.getElementsByTagName('THEAD')[0];
		tHead = tHead.cloneNode(true);
		tHeadClone = DOM.Create('DIV', headCloneClass, 'head-clone');
		tHeadClone.innerHTML = '<table id="financial-table" class="datatable"><thead>' + tHead.innerHTML + '</thead></table>';
		DOM.Add(tHeadClone, LAYOUT.ContentDiv);
		tHeadClone.style.top = $('tablescrollpanel').offsetTop + 'px';
		tHeadClone.style.left = $('tablescrollpanel').offsetLeft + 'px';
	}
	LAYOUT.TableHeader = tHeadClone;
};
LAYOUT.Swaprows = function(e) {
	if (document.addEventListener) {
		e.preventDefault();
		a = e.target;
		if (a.className != 'expanded') {
			a.className = 'expanded';
			viewtype = 'table-row';
		} else {
			a.className = '';
			viewtype = 'none';
		}
	} else {
		e.cancelBubble = true;
		a = e.srcElement;
		if (a.className != 'expanded') {
			a.className = 'expanded';
			viewtype = 'block';
		} else {
			a.className = '';
			viewtype = 'none';
		}
	}
	tr = a.parentNode;
	while (tr.tagName != 'TR') {
		tr = tr.parentNode;
	}
	if (a.className != 'expanded') {
		tr.className = tr.className.replace(' expanded', '');
	} else {
		tr.className += ' expanded';
	}
	var textindex = tr.className.indexOf('lev');
	startlevel = parseInt(tr.className.substring(textindex + 3, textindex + 4));
	level = startlevel + 1;
	var rowindex = tr.rowIndex;
	tr = tr.parentNode.rows[rowindex - 1];
	while (startlevel < level) {
		if (startlevel == (level - 1) || viewtype == 'none') {
			if (a.parentNode.parentNode != tr) tr.style.display = viewtype;
		}
		if (tr.parentNode.rows.length <= rowindex + 1) break;
		rowindex++;
		tr = tr.parentNode.rows[rowindex - 1];
		textindex = tr.className.indexOf('lev');
		level = parseInt(tr.className.substring(textindex + 3, textindex + 4));
	}
	LAYOUT.ClearAllGraphs();
	return false;
};
LAYOUT.BuildSpecialLayout = function() {
	LAYOUT.ReplaceTablesWithIcon();
	$('content').style.width = '950px';
	if ($('micro-scroll')) {
		LAYOUT.ContentDiv = $('micro-scroll');
		LAYOUT.BuildMicroColumnLayout();
	}
	LAYOUT.InitInlineIllustrations();
	PAGE.CheckForOversize();
};
LAYOUT.ReplaceTablesWithIcon = function() {
	if (PAGE.RenderMode == 'static') return;
	var tables = getElementsByClassName($('content'), 'table', 'datatable');
	for (var z = 0, n = tables.length; z < n; z++) {
		var table = tables[z];
		if ((table.className.indexOf('locked') == -1) && (table.className.indexOf('chain-previous') == -1)) {
			var tableBorder = DOM.GetAttribute(table, 'border');
			if (!tableBorder == '0') DOM.SetAttribute(table, 'border', '0');
			var tableWrapper = DOM.Create('DIV', 'additional graph-box');
			var container = DOM.Create('DIV', 'graph-container');
			var GraphBoxHeadline = ' ';
			if (table.previousSibling) {
				GraphBoxHeadline = DOM.PreviousSibling(table);
				if (GraphBoxHeadline && GraphBoxHeadline.tagName) {
					if (GraphBoxHeadline.tagName.toLowerCase() == 'h6') {
						GraphBoxHeadline.style.display = 'none';
						GraphBoxHeadline = GraphBoxHeadline.innerHTML.ToString();
					} else {
						GraphBoxHeadline = ' ';
					}
				} else {
					GraphBoxHeadline = ' ';
				}
			}
			var GraphBoxCite = ' ';
			if (table.nextSibling) {
				GraphBoxCite = DOM.NextSibling(table);
				if (GraphBoxCite && GraphBoxCite.tagName) {
					if (GraphBoxCite.tagName.toLowerCase() == 'cite') {
						GraphBoxCite.style.display = 'none';
						var strCite = GraphBoxCite.innerHTML.ToString();
						if (strCite.length > 50) {
							GraphBoxCite = strCite.substring(0, 53) + ' ...';
						} else {
							GraphBoxCite = strCite;
						}
					} else {
						GraphBoxCite = ' ';
					}
				} else {
					GraphBoxCite = ' ';
				}
			}
			var link = DOM.Create('A', '');
			link.innerHTML = '<strong>' + GraphBoxHeadline + '</strong><img src="../../gfx/icon-table.gif" alt="" />';
			DOM.SetAttribute(link, 'href', 'javascript:;');
			DOM.SetAttribute(link, 'rel', 'inline');
			DOM.Add(link, container);
			var btn = DOM.Create('span', 'zoom');
			btn.innerHTML = '';
			btn.title = 'Zoom';
			DOM.Add(btn, link);
			var wrapper = DOM.Create('DIV', 'ipop-table');
			wrapper.innerHTML = '<table class="' + table.className.toString() + '">' + table.innerHTML + '</table>';
			DOM.Add(wrapper, container);
			var cite = DOM.Create('cite');
			if (strCite) DOM.SetAttribute(cite, 'title', strCite);
			cite.innerHTML = GraphBoxCite.ToString();
			DOM.Add(cite, container);
			DOM.Add(container, tableWrapper);
			table.parentNode.replaceChild(tableWrapper, table);
		} else if (table.className.indexOf('chain-previous') != -1) {
			var tableSibling = DOM.ChildNodes(DOM.ChildNodes(DOM.PreviousSibling(table))[0])[1];
			DOM.Add(table, tableSibling);
		}
	}
	return;
};
LAYOUT.BuildMicroColumnLayout = function() {
	var elCount = 0;
	LAYOUT.ColumnWidth = 500;
	LAYOUT.ColumnMargin = 15;
	LAYOUT.TextLineHeight = 17;
	LAYOUT.ContentDiv.className = '';
	LAYOUT.ContentDiv.style.padding = '0';
	LAYOUT.ContentDiv.style.overflow = 'hidden';
	if (LAYOUT.OriginalContent == '') {
		LAYOUT.OriginalContent = LAYOUT.ContentDiv.innerHTML;
	} else {
		LAYOUT.ContentDiv.innerHTML = LAYOUT.OriginalContent;
	}
	var rowCount = Math.floor((document.documentElement.clientHeight - LAYOUT.ContentDiv.offsetTop) / LAYOUT.TextLineHeight) - 5;
	var maxHeight = $('leftcontent').offsetHeight;
	var contentHeight = LAYOUT.ContentDiv.scrollHeight;
	if (contentHeight < maxHeight) return;
	var columns = DOM.Create('div', '', 'columns');
	columns.style.height = maxHeight - 14 + 'px';
	columns.style.overflow = 'hidden';
	LAYOUT.scrollPanel = DOM.Create('div', '', 'scrollpanel');
	DOM.Add(columns, LAYOUT.scrollPanel);
	DOM.Add(LAYOUT.scrollPanel, LAYOUT.ContentDiv);
	var nextOffset = 0;
	var lastColumnHeight = 0;
	var heightRemainder = 0;
	elCount = DOM.ChildNodes(LAYOUT.ContentDiv).length;
	if (elCount < 1) return;
	var backupItterator = 0;
	while ((elCount > 1) && (backupItterator < 100)) {
		backupItterator++;
		var column = DOM.Create('div', 'column', 'col-' + LAYOUT.Columns);
		column.style.marginTop = (-nextOffset) + 'px';
		columns.appendChild(column);
		while ((elCount > 1) && (backupItterator < 100)) {
			DOM.Add(DOM.ChildNodes(LAYOUT.ContentDiv)[0], column);
			elCount--;
			if (column.lastChild.tagName == 'P') {
				if (column.scrollHeight > (maxHeight + nextOffset)) { //## IF COL IS FULL
					if ((column.lastChild.className.indexOf('additional') != -1) || (column.lastChild.className.indexOf('illustration') != -1)) {
						LAYOUT.ContentDiv.insertBefore(column.lastChild, LAYOUT.ContentDiv.firstChild);
						elCount++;
						//## ADDED BY TED 2008-03-17 TO CIRCUMVENT BUG IN FIREFOX WHICH CAUSES AN INFINITE LOOP
						if (navigator.userAgent.indexOf("Firefox") != -1) { nextOffset = 1; }
						else { nextOffset = 0; }
					} else {
						var elHeight = (column.scrollHeight - lastColumnHeight);
						if (elHeight > maxHeight) {
							LAYOUT.ContentDiv.insertBefore(column.lastChild.cloneNode(true), DOM.FirstChild(LAYOUT.ContentDiv));
							elCount++;
							heightRemainder = (column.scrollHeight - (maxHeight + nextOffset));
							nextOffset = (elHeight - heightRemainder);
							lastColumnHeight = 0;
						} else if ((column.scrollHeight - (maxHeight + nextOffset) == LAYOUT.TextLineHeight) && (elHeight != LAYOUT.TextLineHeight)) {
							nextOffset = 0;
						} else {
							LAYOUT.ContentDiv.insertBefore(column.lastChild.cloneNode(true), LAYOUT.ContentDiv.firstChild);
							elCount++;
							column.lastChild.className = column.lastChild.className + ' noprint';
							heightRemainder = (column.scrollHeight - maxHeight);
							nextOffset = (elHeight) - (heightRemainder) + nextOffset;
							if (nextOffset == 0) {
								column.removeChild(column.lastChild);
								var lastElem = DOM.ChildNodes(column)[DOM.ChildNodes(column).length - 1];
								if (lastElem.tagName) {
									if (lastElem.tagName.toUpperCase().substring(0, 1) == 'H') {
										LAYOUT.ContentDiv.insertBefore(lastElem, LAYOUT.ContentDiv.firstChild);
										elCount++;
									}
								}
							}
						}
					}
				}
				break;
			}
			lastColumnHeight = column.scrollHeight;
		}
		LAYOUT.Columns++;
	}
	columns.style.width = parseInt(LAYOUT.ColumnWidth * LAYOUT.Columns + LAYOUT.ColumnMargin * (LAYOUT.Columns - 1)) + 'px';
	column.style.marginRight = '0';
	var screenWidth = 500; //$('specialsida').clientWidth; //document.documentElement.clientWidth;
	if (parseInt(columns.style.width) < screenWidth) {
		screenWidth = parseInt(columns.style.width);
	}
	LAYOUT.VisibleColumns = Math.floor(screenWidth / LAYOUT.ColumnWidth);
	LAYOUT.LastVisibleColumn = getElementsByClassName($('columns'), 'DIV', 'column')[LAYOUT.VisibleColumns - 1];
	LAYOUT.ContentDiv.style.width = screenWidth + 'px';
	LAYOUT.scrollPanel.style.width = LAYOUT.scrollPanel.parentNode.offsetWidth - (LAYOUT.ColumnMargin + LAYOUT.ColumnMargin) + 'px';
	LAYOUT.scrollPanel.style.overflowY = 'hidden';
	LAYOUT.scrollPanel.style.height = maxHeight + 'px';
	LAYOUT.ContentDiv.appendChild(LAYOUT.scrollPanel);
	addEvent(LAYOUT.scrollPanel, 'scroll', LAYOUT.adjustScroll);
	PAGE.CheckForOversize();
};
LAYOUT.InitInlineIllustrations = function() {
	//## INITIALIZE INLINE ILLUSTRATIONS
	if (PAGE.RenderMode == 'static') return;
	var divs = getElementsByClassName($('content'), 'div', 'illustration')
	for (var i = 0, iLen = divs.length; i < iLen; i++) {
		var div = divs[i];
		var link = getElementsByAttribute(div, 'A', 'rel', 'inline')[0];
		if (link) {
			var GraphBoxHeadline = null;
			if (div.previousSibling) {
				GraphBoxHeadline = DOM.PreviousSibling(div);
				if (GraphBoxHeadline && GraphBoxHeadline.tagName) {
					if (GraphBoxHeadline.tagName.toLowerCase() == 'h6') {
						GraphBoxHeadline.style.display = 'none';
						var strong = DOM.Create('STRONG');
						var strStrong = GraphBoxHeadline.innerHTML.ToString();
						strong.innerHTML = strStrong;
						DOM.AddFirst(strong, link);
					}
				}
			}
			var GraphBoxCite = null;
			if (div.nextSibling) {
				GraphBoxCite = DOM.NextSibling(div);
				if (GraphBoxCite && GraphBoxCite.tagName) {
					if (GraphBoxCite.tagName.toLowerCase() == 'cite') {
						GraphBoxCite.style.display = 'none';
						var cite = DOM.Create('CITE');
						var strCite = GraphBoxCite.innerHTML.ToString();
						if (strCite) {
							if (strCite.length > 50) {
								cite.innerHTML = strCite.substring(0, 55) + ' ...';
							} else {
								cite.innerHTML = strCite;
							}
							DOM.SetAttribute(cite, 'title', strCite);
						}
						DOM.Add(cite, link);
					}
				}
			}
			div.className = div.className + ' graph-box';
			var btn = DOM.Create('span', 'zoom');
			btn.innerHTML = ' ';
			btn.title = 'Zoom';
			DOM.Add(btn, link);
			var container = DOM.Create('DIV', 'graph-container');
			DOM.Add(link, container);
			DOM.Add(container, div);
			//## PRELOAD BIG ILLUSTRATIONS
			var thumbImageSrc = DOM.GetAttribute(link, 'href').toString();
			var bigImage = new Image();
			bigImage.src = thumbImageSrc.toString();
		}
	}
};
LAYOUT.BuildColumnLayout = function() {
	if ($('submenu') != null) {
		//## THIS IS A FINANCIAL TABLE (NOTE)
		$('content').style.width = '480px';
		return;
	}
	if (!LAYOUT.ContentDiv) LAYOUT.ContentDiv = $('content');
	LAYOUT.ReplaceTablesWithIcon();
	var elCount = 0;
	if (PAGE.TextSize == 'big') {
		LAYOUT.ColumnWidth = 390;
		LAYOUT.ColumnMargin = 20;
		LAYOUT.TextLineHeight = 22;
		LAYOUT.ContentDiv.className = 'large';
	} else {
		LAYOUT.ColumnWidth = 300;
		LAYOUT.ColumnMargin = 14;
		LAYOUT.TextLineHeight = 17;
		LAYOUT.ContentDiv.className = '';
	}

	LAYOUT.ContentDiv.style.padding = '0';
	LAYOUT.ContentDiv.style.overflow = 'hidden';
	if (LAYOUT.OriginalContent == '') {
		LAYOUT.OriginalContent = LAYOUT.ContentDiv.innerHTML;
	} else {
		LAYOUT.ContentDiv.innerHTML = LAYOUT.OriginalContent;
	}
	var rowCount = Math.floor((document.documentElement.clientHeight - LAYOUT.ContentDiv.offsetTop) / LAYOUT.TextLineHeight) - 5;
	var maxHeight = LAYOUT.TextLineHeight * rowCount;
	var contentHeight = LAYOUT.ContentDiv.scrollHeight;
	if (contentHeight < maxHeight) return;
	var columns = DOM.Create('div', '', 'columns');
	columns.style.height = maxHeight + 'px';
	columns.style.overflow = 'hidden';

	var pagenumbers = DOM.Create('div', '', 'pagenumbers');

	//## SETUP DIVS FOR THE HORIZONTAL SCROLLING FEATURE
	LAYOUT.scrollPanel = DOM.Create('div', '', 'scrollpanel');
	DOM.Add(columns, LAYOUT.scrollPanel);
	DOM.Add(pagenumbers, LAYOUT.scrollPanel);
	DOM.Add(LAYOUT.scrollPanel, LAYOUT.ContentDiv);

	LAYOUT.InitInlineIllustrations();

	var nextOffset = 0;
	var lastColumnHeight = 0;
	var heightRemainder = 0;
	elCount = DOM.ChildNodes($('content')).length;
	if (elCount < 1) return;
	var backupItterator = 0;
	while ((elCount > 1) && (backupItterator < 100)) {
		backupItterator++;
		var column = DOM.Create('div', 'column', 'col-' + LAYOUT.Columns);
		column.style.marginTop = (-nextOffset) + 'px';
		columns.appendChild(column);
		while ((elCount > 1) && (backupItterator < 100)) {
			if (DOM.ChildNodes(LAYOUT.ContentDiv)[0].id !== 'scrollpanel') {
				DOM.Add(DOM.ChildNodes(LAYOUT.ContentDiv)[0], column);
			}
			elCount--;
			if (column.scrollHeight > (maxHeight + nextOffset)) { //## IF COL IS FULL
				if ((column.lastChild.className.indexOf('additional') != -1) || (column.lastChild.className.indexOf('illustration') != -1) || (column.lastChild.tagName == 'ul')) {
					LAYOUT.ContentDiv.insertBefore(column.lastChild, LAYOUT.ContentDiv.firstChild);
					elCount++;
					//## ADDED BY TED 2008-03-17 TO CIRCUMVENT BUG IN FIREFOX WHICH CAUSES AN INFINITE LOOP
					if (navigator.userAgent.indexOf("Firefox") != -1) { nextOffset = 1; }
					else { nextOffset = 0; }
				} else {
					var elHeight = (column.scrollHeight - lastColumnHeight);
					if (elHeight > maxHeight) {
						LAYOUT.ContentDiv.insertBefore(column.lastChild.cloneNode(true), LAYOUT.ContentDiv.firstChild);
						elCount++;
						heightRemainder = (column.scrollHeight - (maxHeight + nextOffset));
						nextOffset = (elHeight - heightRemainder);
						lastColumnHeight = 0;
					} else if ((column.scrollHeight - (maxHeight + nextOffset) == LAYOUT.TextLineHeight) && (elHeight != LAYOUT.TextLineHeight)) {
						elCount++;
						nextOffset = 0;
					} else {
						LAYOUT.ContentDiv.insertBefore(column.lastChild.cloneNode(true), LAYOUT.ContentDiv.firstChild);
						elCount++;
						column.lastChild.className = column.lastChild.className + ' noprint';
						heightRemainder = (column.scrollHeight - maxHeight);
						nextOffset = (elHeight) - (heightRemainder) + nextOffset;
						if (nextOffset == 0) {
							column.removeChild(column.lastChild);
							var lastElem = DOM.ChildNodes(column)[DOM.ChildNodes(column).length - 1];
							if (lastElem.tagName) {
								if (lastElem.tagName.toUpperCase().substring(0, 1) == 'H') {
									LAYOUT.ContentDiv.insertBefore(lastElem, LAYOUT.ContentDiv.firstChild);
									elCount++;
								}
							}
						}
					}
				}
				break;
			}
			lastColumnHeight = column.scrollHeight;
		}
		LAYOUT.Columns++;
	}
	//## ADD PAGENUMBERS
	for (var i = 0, n = DOM.ChildNodes(columns).length; i < n; i++) {
		pagenumber = document.createElement('div');
		pagenumber.innerHTML = (i + 1) + ' (' + LAYOUT.Columns + ')';
		pagenumbers.appendChild(pagenumber);
	}
	columns.style.width = parseInt(LAYOUT.ColumnWidth * LAYOUT.Columns + LAYOUT.ColumnMargin * (LAYOUT.Columns - 1)) + 'px';
	column.style.marginRight = '0';
	pagenumber.style.marginRight = '0';
	pagenumbers.style.width = columns.style.width;
	var screenWidth = document.documentElement.clientWidth;
	if (PAGE.TextSize == 'big') {
		if (screenWidth >= 1620) { screenWidth = 1620 }
		else if (screenWidth >= 1210) { screenWidth = 1210 }
		else { screenWidth = 800 }
	} else {
		if (screenWidth >= 1870) { screenWidth = 1870 }
		else if (screenWidth >= 1556) { screenWidth = 1556 }
		else if (screenWidth >= 1242) { screenWidth = 1242 }
		else { screenWidth = 928 }
	}
	if (parseInt(columns.style.width) < screenWidth) {
		screenWidth = parseInt(columns.style.width);
	}
	LAYOUT.VisibleColumns = Math.floor(screenWidth / LAYOUT.ColumnWidth);
	LAYOUT.LastVisibleColumn = getElementsByClassName($('columns'), 'DIV', 'column')[LAYOUT.VisibleColumns - 1];
	LAYOUT.ContentDiv.style.width = screenWidth + 'px';
	LAYOUT.scrollPanel.style.width = screenWidth + 'px';
	LAYOUT.scrollPanel.style.height = ((rowCount * LAYOUT.TextLineHeight) + 55) + 'px';
	LAYOUT.ContentDiv.appendChild(LAYOUT.scrollPanel);
	addEvent(LAYOUT.scrollPanel, 'scroll', LAYOUT.adjustScroll);
	var pos = location.href.indexOf('#');
	if (pos > 0) {
		var anc = location.href.substring(pos + 1);
		var pos2 = location.href.indexOf('&', pos)
		if (pos2 !== -1) {
			anc = 'id' + location.href.substring(pos + 1);
		} else {
			anc = 'id' + location.href.substring(pos + 1, pos2);
			sword = location.href.substring(pos2 + 3);
			if (sword.length > 2) {
				sword = unescape(sword).replace(/ +/g, '(\\s+|\\s*<[^>]*>\\s*)');
				var re = new RegExp(">([^<]*)(" + sword + ")", "igm");
				LAYOUT.scrollPanel.innerHTML = LAYOUT.scrollPanel.innerHTML.replace(re, ">$1<span class=\"highlight\">$2</span>");
			}
		}
		if (pos2 - pos - 1 != 0 && location.href.length - pos - 1 != 0) {
			h = $(anc);
			if (!h) return;
			span = document.createElement('span');
			span.className = 'highlight';
			span.innerHTML = h.innerHTML;
			h.innerHTML = '';
			h.appendChild(span);
			col = parseInt(h.parentNode.id.substring(4));
			if (col > 0) ScrollTo(col);
		}
	}
	PAGE.CheckForOversize();
};
LAYOUT.adjustScroll=function(e){
	if(LAYOUT.ScrollThread != null) clearTimeout(LAYOUT.ScrollThread);
	LAYOUT.ScrollThread=setTimeout("LAYOUT.doAdjustscroll()", 300);
};
LAYOUT.doAdjustscroll=function(){	
	var adjustment=LAYOUT.scrollPanel.scrollLeft %(LAYOUT.ColumnWidth+LAYOUT.ColumnMargin);
	if(adjustment != 0){	
		if(Math.abs(adjustment) <= 10){ //## LEFT			
			LAYOUT.ScrollNext();
		}else if(Math.abs(adjustment-(LAYOUT.ColumnWidth+LAYOUT.ColumnMargin)) <= 10){ //## RIGHT
			LAYOUT.ScrollPrevious();
		}else{ //## NEAREST
			if(adjustment >(LAYOUT.ColumnWidth/2)){ //## ADJUST TO RIGHT
				LAYOUT.ScrollTo(parseInt(LAYOUT.scrollPanel.scrollLeft /(LAYOUT.ColumnWidth+LAYOUT.ColumnMargin))+1);
			}else{ //## ADJUST TO LEFT
				LAYOUT.ScrollTo(parseInt(LAYOUT.scrollPanel.scrollLeft /(LAYOUT.ColumnWidth+LAYOUT.ColumnMargin)));
			}
		}
	}else{
		LAYOUT.CurrentColumn=(LAYOUT.scrollPanel.scrollLeft /(LAYOUT.ColumnWidth+LAYOUT.ColumnMargin));
	}
	LAYOUT.ScrollLastPosition=LAYOUT.scrollPanel.scrollLeft;
};
LAYOUT.ScrollNext=function(){
	if (LAYOUT.CurrentColumn + LAYOUT.VisibleColumns + 1 >= LAYOUT.Columns) {
		LAYOUT.ScrollTo(LAYOUT.Columns - 1)
	} else {
		LAYOUT.OffsetScroll(LAYOUT.VisibleColumns - 1);
	}
};
LAYOUT.ScrollPrevious=function(){
	var targetColumn=(-(LAYOUT.VisibleColumns-1));
	if (LAYOUT.VisibleColumns==1)
		targetColumn--;
	if(LAYOUT.CurrentColumn > 1){
		LAYOUT.OffsetScroll(targetColumn);
	}else{
		LAYOUT.OffsetScroll(-1);
	}
};
LAYOUT.OffsetScroll=function(offset){
	var target=LAYOUT.CurrentColumn+offset;
	if(target < 0 || target > LAYOUT.Columns) return;
	LAYOUT.ScrollTo(target);
};
LAYOUT.ScrolltoPos = function(e) {
	var TagNameInContentForPortraits = 'h2';
	//## GET NAME OF PORTRAIT
	var em = this.parentNode.getElementsByTagName('em')[0];
	//## GET ELEMENT IN CONTENT DIV WITH CORRESPONDENT INNERHTML
	var elements = $('content').getElementsByTagName(TagNameInContentForPortraits);
	for (var i = 0, iLen = elements.length; i < iLen; i++) {
		if (elements[i] && elements[i].innerHTML.indexOf(em.innerHTML) > -1) {
			var column = elements[i].parentNode;
			LAYOUT.ScrollTo(column.id.replace('col-', ''));
			break;
		}
	}
};
LAYOUT.ScrollTo=function(target){
	if(target < 0) return;
	LAYOUT.doScrollTo(target);
};
LAYOUT.doScrollTo = function(target) {
	if (target >= LAYOUT.Columns) return;
	LAYOUT.CurrentColumn = target;
	targetcol = $('col-' + target);
	var offsetLeft;
	if (target == (LAYOUT.Columns - 1)) {
		offsetLeft = LAYOUT.scrollPanel.scrollWidth - LAYOUT.scrollPanel.offsetWidth;
	} else {
		offsetLeft = 0;
		do {
			offsetLeft += targetcol.offsetLeft;
		} while (targetcol = targetcol.offsetParent)

		targetcol = document.getElementById('col-0');
		LAYOUT.ColumnStartPosition = 0;
		do {
			LAYOUT.ColumnStartPosition += targetcol.offsetLeft;
		} while (targetcol = targetcol.offsetParent)
		offsetLeft -= LAYOUT.ColumnStartPosition;
	}
	if (LAYOUT.ScrollAnimation.timer != null) {
		clearInterval(LAYOUT.ScrollAnimation.timer);
		LAYOUT.ScrollAnimation.timer = null;
	}
	LAYOUT.ScrollAnimation.time = 0;
	LAYOUT.ScrollAnimation.begin = LAYOUT.scrollPanel.scrollLeft;
	LAYOUT.ScrollAnimation.change = offsetLeft - LAYOUT.scrollPanel.scrollLeft;
	LAYOUT.ScrollAnimation.duration = LAYOUT.ScrollDuration;
	LAYOUT.ScrollAnimation.element = LAYOUT.scrollPanel;
	LAYOUT.ScrollAnimation.timer = setInterval("LAYOUT.scrollHorizAnim();", 15);
};
LAYOUT.scrollHorizAnim = function() {
	if (LAYOUT.ScrollAnimation.time > LAYOUT.ScrollAnimation.duration) {
		clearInterval(LAYOUT.ScrollAnimation.timer);
		LAYOUT.ScrollAnimation.timer = null;
	} else {
		move = -LAYOUT.ScrollAnimation.change / 2 * (Math.cos(Math.PI * LAYOUT.ScrollAnimation.time / LAYOUT.ScrollAnimation.duration) - 1) + LAYOUT.ScrollAnimation.begin;
		LAYOUT.ScrollAnimation.element.scrollLeft = move;
		LAYOUT.ScrollAnimation.time++;
	}
};
LAYOUT.ResetLayout = function() {
	if (LAYOUT.isResizing != null) {
		clearTimeout(LAYOUT.isResizing);
	}
	LAYOUT.isResizing = setTimeout("LAYOUT.doResetLayout()", 300);
	if (MENU.Cover) MENU.Cover.style.height = document.documentElement.clientHeight + 'px';

};
LAYOUT.doResetLayout = function() {
	switch (PAGE.LayoutMode) {
		case 'table':
			LAYOUT.BuildTableLayout();
			break;
		case 'special':
			// NOTHING
			break;
		default:
			if (LAYOUT.lastDimensions != getViewport.Height() + '.' + getViewport.Width()) {
				LAYOUT.lastDimensions = getViewport.Height() + '.' + getViewport.Width()
				LAYOUT.CurrentColumn = 0;
				LAYOUT.Columns = 0;
				LAYOUT.ColumnStartPosition = 0;
				LAYOUT.ScrollLastPosition = 0;
				LAYOUT.BuildColumnLayout();
				iPOP.Init();
			}
			break;
	}
	TOOLTIP.Init();
	PAGE.CheckForOversize();
	return;
};
LAYOUT.ForceReset = function() {
	switch (PAGE.LayoutMode) {
		case 'table':
			//LAYOUT.BuildTableLayout();
			break;
		case 'special':
			break;
		default:
			LAYOUT.CurrentColumn = 0;
			LAYOUT.Columns = 0;
			LAYOUT.ColumnStartPosition = 0;
			LAYOUT.ScrollLastPosition = 0;
			LAYOUT.BuildColumnLayout();
			iPOP.Init();
			break;
	}
	TOOLTIP.Init();
	PAGE.CheckForOversize();
	return;
};



//------------------------------------------------------------------
//## MENU
//------------------------------------------------------------------
MENU.Init = function() {

	this.Menu = $('menu');
	this.MenuTabs = $('menutabs');
	this.CurrentActiveTab = null;
	this.LinkType = null;
	this.LinkId = null;
	this.CheckBoxes = 0;
	this.Cover = null;
	this.DownloadItems = 0;
	this.Mp3DefaultSize = 382;

	var menuButton = DOM.Create('A', '', 'menubutton');
	menuButton.innerHTML = TRANSLATE.GetValue('menu');
	DOM.SetAttribute(menuButton, 'HREF', 'javascript:;');
	addEvent(menuButton, 'click', MENU.ShowHide);
	DOM.Add(menuButton, document.getElementsByTagName('BODY')[0]);

	//## SPLIT LAST MENUCOLUMN INTO TWO
	if ($('menuoptions')) {
		var m = $('menuoptions').getElementsByTagName('UL')[0];
		var n = DOM.ChildNodes(m)[4];
		var mm = DOM.ChildNodes(n.getElementsByTagName('UL')[0]);
		var splitter = parseInt(mm.length / 2) + 1;
		var newUl1 = DOM.Create('UL');
		var newUl2 = DOM.Create('UL', 'splitted-ul');
		for (var i = 0, z = mm.length; i < z; i++) {
			var li = mm[i];
			if (i < splitter) {
				DOM.Add(li, newUl1);
			} else {
				DOM.Add(li, newUl2);
			}
		}
		var newLi = DOM.Create('LI');
		newLi.className = 'lastmenuitem';
		DOM.Add(newLi, m);
		DOM.Add(newUl2, newLi);
		n.getElementsByTagName('UL')[0].parentNode.replaceChild(newUl1, n.getElementsByTagName('UL')[0]);
	}

};
MENU.InitMenuTabs = function() {
	if (MENU.MenuTabs) return;

	MENU.MenuTabs = DOM.Create('DIV', '', 'menutabs');
	var ul = DOM.Create('UL', '', '');

	//## CLOSE BUTTON
	var closeButtonText = TEXTHANDLER.Close;
	var closeButton = DOM.Create('A', 'close-button', '');
	DOM.SetAttribute(closeButton, 'TITLE', TEXTHANDLER.Close);
	DOM.SetAttribute(closeButton, 'HREF', 'javascript:;');
	closeButton.innerHTML = '<span>' + TEXTHANDLER.Close + '</span>';
	addEvent(closeButton, 'click', MENU.Hide);


	//## MENU ITEMS ['NAME','CLASSNAME','ID']
	var menuItems = [
		[TEXTHANDLER.TabNavigation, '', 'navigation']
		, [TEXTHANDLER.TabSearchResults, 'tablinksearch', 'tablinksearch']
		, [TEXTHANDLER.TabDownloadPdf, 'checkboxes', 'download-pdf']
		//, [TEXTHANDLER.TabDownloadMp3, 'checkboxes', 'download-mp3']
		, [TEXTHANDLER.TabVisitedPages, 'tabvisitedpages', 'tabvisitedpages']
		, [TEXTHANDLER.TabStickyNotes, 'tabstickynotes', 'tabstickynotes']
	];

	//## CREATE MENU STRUCTURE
	for (var i = 0, n = menuItems.length, item = null, itemClass = null; i < n; i++) {
		item = menuItems[i][0];
		itemClass = menuItems[i][1];
		itemId = menuItems[i][2];
		var li = DOM.Create('LI', '', '');
		var link = DOM.Create('A', '', '');
		DOM.SetAttribute(link, 'HREF', 'javascript:;');
		DOM.SetAttribute(link, 'TITLE', item);
		if (itemId) DOM.SetAttribute(link, 'ID', itemId);
		if (itemClass) DOM.SetAttribute(link, 'CLASS', itemClass);
		if (i == 0) {
			DOM.SetAttribute(li, 'CLASS', 'selected');
			MENU.CurrentActiveTab = li;
		}
		addEvent(link, 'click', MENU.OpenTab);
		link.innerHTML = item;
		DOM.Add(link, li);
		DOM.Add(li, ul);
	}

	//## INIT SEARCHFORM 
	var searchDiv = DOM.Create('DIV', '', 'menu-searchform');
	var searchResultText = DOM.Create('DIV', '', 'menu-searchresult');
	searchResultText.innerHTML = "";
	DOM.Add(searchResultText, searchDiv);
	var searchResultNav = DOM.Create('DIV', '', 'menu-searchresultNav');
	//searchResultNav.style.display='none';

	//## BUTTON
	var navPSpan = DOM.Create('span', '', '');
	DOM.SetAttribute(navPSpan, 'class', 'nav-button');
	var navPSpan2 = DOM.Create('span', '', '');
	var em = DOM.Create('em', '', '');
	DOM.SetAttribute(em, 'class', 'left');
	em.innerHTML = '&nbsp;';
	DOM.Add(em, navPSpan2);
	var btnP = DOM.Create('input', '', 'btn-nav-previous');
	DOM.SetAttribute(btnP, 'value', TEXTHANDLER.SearchNavigatePrevious);
	DOM.SetAttribute(btnP, 'type', 'button');
	addEvent(btnP, 'click', SEARCHHANDLER.NavigateSearchResult);
	DOM.Add(btnP, navPSpan2);
	DOM.Add(navPSpan2, navPSpan);
	DOM.Add(navPSpan, searchResultNav);

	//## RIGHT BUTTON
	navPSpan = DOM.Create('span', '', '');
	DOM.SetAttribute(navPSpan, 'class', 'nav-button');
	navPSpan2 = DOM.Create('span', '', '');
	btnP = DOM.Create('input', '', 'btn-nav-next');
	DOM.SetAttribute(btnP, 'value', TEXTHANDLER.SearchNavigateNext);
	DOM.SetAttribute(btnP, 'type', 'button');
	addEvent(btnP, 'click', SEARCHHANDLER.NavigateSearchResult);
	em = DOM.Create('em', '', '');
	DOM.SetAttribute(em, 'class', 'right');
	em.innerHTML = '&nbsp;';
	DOM.Add(em, navPSpan2);
	DOM.Add(btnP, navPSpan2);
	DOM.Add(navPSpan2, navPSpan);
	DOM.Add(navPSpan, searchResultNav);

	DOM.Add(searchResultNav, searchDiv);

	//## INIT DOWNLOAD VISITED PAGES RESET BUTTON
	var wrapper = DOM.Create('DIV', '', 'resetvisitedpages');
	var spanContainer = DOM.Create('span', 'button', '');
	var spanInner = DOM.Create('span', '', '');

	var btnVisitedPages = DOM.Create('input', '', 'resetvisitedpagesbtn');
	btnVisitedPages.setAttribute('type', 'button');
	btnVisitedPages.setAttribute('class', 'button');
	btnVisitedPages.setAttribute('value', TEXTHANDLER.VisitedPagesButton);
	addEvent(btnVisitedPages, 'click', VISITEDPAGESHANDLER.ResetVisitedPages);
	DOM.Add(btnVisitedPages, spanInner);
	DOM.Add(spanInner, spanContainer);
	DOM.Add(spanContainer, wrapper);

	//## INIT CHECKBOXES
	MENU.InitCheckboxes();

	//## INIT STICKY NOTES	
	MENU.InitStickyNotes();

	var divCommentForm = GetCommentForm();
	DOM.Add(divCommentForm, $('menuoptions'));

	//## OUTPUT
	DOM.Add(closeButton, MENU.MenuTabs);
	DOM.Add(ul, MENU.MenuTabs);
	DOM.Add(searchDiv, $('menuoptions'));
	DOM.Add(wrapper, $('menuoptions'));
	MENU.Menu.insertBefore(MENU.MenuTabs, MENU.Menu.firstChild);
};
MENU.OpenPrintPDF = function() {
	MENU.Show();
	MENU.OpenTab('download-pdf');
};
MENU.InitCover = function() {
	if (MENU.Cover) return;
	MENU.Cover = DOM.Create('DIV', '', 'cover');
	MENU.Cover.style.height = document.documentElement.clientHeight + 'px';
	setOpacity(MENU.Cover, 75);
	DOM.Add(MENU.Cover, document.getElementsByTagName('body')[0]);
	addEvent(MENU.Cover, 'click', MENU.Hide);
};
MENU.ShowHide = function() {
	if (MENU.Menu.style.display == 'block') {
		MENU.Hide();
	} else {
		MENU.Show();
	}
};
MENU.Show = function() {
	iPOP.Close();
	PAGE.HideFlashArea();
	MENU.InitCover()
	MENU.InitMenuTabs();
	MENU.Cover.style.display = 'block';
	MENU.Menu.style.display = 'block';
	MENU.MenuTabs.style.display = 'block';
	MENU.OpenTab('navigation');
};
MENU.Hide = function() {
	PAGE.ShowFlashArea();
	if (MENU.Menu) MENU.Menu.style.display = 'none';
	if (MENU.MenuTabs) MENU.MenuTabs.style.display = 'none';
	if (MENU.Cover) MENU.Cover.style.display = 'none';
	$('menubutton').className = $('menubutton').className.replace('active', '');
};
MENU.OpenTab = function(tabId) {
	$('menubutton').className = 'active';

	//CLOSE ALL OPEN TOOLTIPS 
	var els = MENU.Menu.getElementsByTagName('div');
	for (var i = 0, iLen = els.length; i < iLen; i++) {
		if (els[i] && els[i].className == 'tooltip') {
			els[i].style.display = 'none';
		}
	}

	if (MENU.CurrentActiveTab) {
		MENU.CurrentActiveTab.className = '';
	}
	if (tabId && $(tabId)) {
		MENU.CurrentActiveTab = $(tabId).parentNode;
		MENU.LinkType = tabId;
		if (MENU.LinkType == 'download-pdf') {
			MENU.LinkType = 'checkboxes';
			MENU.LinkId = 'download-pdf';
		}
	} else {
		MENU.CurrentActiveTab = this.parentNode;
		MENU.LinkType = this.className;
	}
	MENU.CurrentActiveTab.className = 'selected';
	if (!MENU.LinkId) MENU.LinkId = this.id;
	if (MENU.LinkType) {
		MENU.Menu.className = MENU.LinkType;
		if (MENU.LinkType == 'checkboxes') {
			MENU.InitDownloadFunction();
		}
	} else {
		MENU.Menu.className = '';
		MENU.Menu.removeAttribute('CLASS');
	}
	$('tryckord').style.display = 'none';
	$('menuadditions').style.display = 'none';
	if ($('menu-searchform')) $('menu-searchform').style.display = 'none';
	if ($('resetvisitedpages')) $('resetvisitedpages').style.display = 'none';
	if ($('menu-commentform')) $('menu-commentform').style.display = 'none';
	try {
		if ($('comment-tools')) $('comment-tools').style.display = 'none';
	}
	catch (exc) { }
	switch (MENU.CurrentActiveTab.getElementsByTagName('a')[0].id) {
		case 'navigation':
			$('tryckord').style.display = 'block';
			break;
		case 'download-pdf':
			$('menuadditions').style.display = 'block';
			break;
		case 'download-mp3':
			$('menuadditions').style.display = 'block';
			break;
		case 'tabvisitedpages':
			$('resetvisitedpages').style.display = 'block';
			//## COOKIE WITH VISITED PAGES DATA
			var visitedPages = (Cookie.Read('visitedpages')) ? Cookie.Read('visitedpages') : '';
			var li = $('menu').getElementsByTagName('li');
			for (var i = 0, iLen = li.length; i < iLen; i++) {
				if (li[i].getElementsByTagName('ul').length < 1) { //## MAKE SURE THIS IS BOTTOM LI IN HIEARARCHY				
					var ahref = li[i].getElementsByTagName('a')[0]; //## OBS!! JUST THE FIRST A HREF IN LIST ELEMENT IS CHECKED
					if (visitedPages.indexOf(ahref) > -1 && li[i].className.indexOf('visited') == -1) {
						li[i].className += ' visited';
					}
				}
			}
			break;
		case 'tablinksearch':
			var buttons = getElementsByClassName($('menu-searchresultNav'), 'span', 'nav-button');
			for (var i = 0, iLen = buttons.length; i < iLen; i++) {
				buttons[i].style.display = 'block';
			}
			$('menu-searchform').style.display = 'block';
			break;

		case 'tabstickynotes':
			//## MOVE COMMENT TOOLS
			var tools = $('comment-tools');
			if (tools) {
				tools.style.display = 'block';
				var menuOptions = $('menuoptions');

				//## MOVE COMMENT TOOLS TO MENU IF NOT ALREADY MOVED 
				var divs = menuOptions.getElementsByTagName('div');
				var found = false;
				for (var divCounter = 0, divLength = divs.length; divCounter < divLength; divCounter++) {
					if (divs[divCounter].id == 'comment-tools') {
						found = true;
					}
				}
				if (!found)
					DOM.Add(tools, $('menuoptions'));

				//## LOOP THROUGH ALL PAGES IN MENU 
				var li = menuOptions.getElementsByTagName('li');
				var c = COMMENTHANDLER.getComments();
				for (var i = 0, n = li.length; i < n; i++) {
					if (li[i].className.indexOf('section') == -1) {

						//GET A WITH HREF OF CURRENT PAGE
						var a = li[i].getElementsByTagName('a')[0];
						if (a) {
							var link = a.href;
							var stickynote = li[i].getElementsByTagName('span')[0];
							if (stickynote) {
								link = link.substring(link.lastIndexOf('/') + 1, link.length);
								link = link.substring(0, link.lastIndexOf('.'));
								for (var x = 0, xLen = c.length; x < xLen; x++) {
									if (c[x].Page.indexOf(link) > -1) {
										//STICKY NOTE FOUND										
										if (stickynote.className.indexOf('sticky-note-found') == -1)
											stickynote.className += ' sticky-note-found';
										break;
									}
								}
							}
						}
					}
				}
			}
			else { // the menu tools do not exist: the user is not logged in
				$('menu-commentform').style.display = 'block';
			}
			break;
	}
};
MENU.InitCheckboxes = function() {
	//## OUTPUT CHECKBOXES
	var li = $('menuoptions').getElementsByTagName('li');
	for (var i = 0, n = li.length; i < n; i++) {
		if (li[i].className != 'lastmenuitem') {
			var chSpan = DOM.Create('span', 'checkbox', '');
			var ch = DOM.Create('input', '', '');
			DOM.SetAttribute(ch, 'TYPE', 'checkbox');
			DOM.SetAttribute(ch, 'VALUE', li[i].firstChild.innerHTML);
			if (typeof li[i].firstChild.tagName == 'undefined') DOM.SetAttribute(ch, 'CLASS', 'group');
			DOM.Add(ch, chSpan);
			addEvent(chSpan, 'click', MENU.CheckboxFunctions);
			li[i].insertBefore(chSpan, li[i].firstChild);
		}
	}

	//## DOWNLOAD FUNCTIONS
	var downloadActionContainer = DOM.Create('DIV', '', 'download-action-container');
	DOM.Add(DOM.Create('DIV', '', 'download-action-text'), downloadActionContainer);

	var spanContainer = DOM.Create('span', 'button', '');
	var spanInner = DOM.Create('span', '', '');
	var btn = DOM.Create('input', '', 'download-action-button');
	btn.setAttribute('type', 'button');
	btn.setAttribute('class', 'button');
	btn.setAttribute('value', '');
	DOM.Add(btn, spanInner);
	DOM.Add(spanInner, spanContainer);
	DOM.Add(spanContainer, downloadActionContainer);
	if ($('menuadditions')) DOM.Add(downloadActionContainer, $('menuadditions'));

	var count = 0;
//	var firstLevel = DOM.ChildNodes($('menuoptions').getElementsByTagName('UL')[0]);
//	for (var i = 0, n = firstLevel.length; i < n; i++) {
//		var secondLevel = DOM.ChildNodes(firstLevel[i].getElementsByTagName('UL')[0]);
//		count += secondLevel.length;
//		if (i == 1) {
//			count = count + 3;
//		}
	//	}
	var links = $('menu').getElementsByTagName('A');
	for (var i = 0, n = links.length; i < n; i++) {
		var link = links[i];
		var linkRel = parseInt(DOM.GetAttribute(link, 'rel'));
		if (linkRel) {
			count = parseInt(count + linkRel);
		}
	}
	MENU.DownloadItems = count;

};
MENU.InitStickyNotes = function() {
	var li = $('menuoptions').getElementsByTagName('li');
	for (var i = 0, iLen = li.length; i < iLen; i++) {
		//## ADD SPANS OF NOTES
		var spanSticky = DOM.Create('span', 'sticky-note-container', '');
		if (li[i].className.indexOf('section') == -1) {
			li[i].insertBefore(spanSticky, li[i].firstChild);
		}
		//## WE WANT TO SHOW IF THE SPAN CONTAINS A NOTE OR NOT AS WELL
		//## THIS FUNCTION IS PLACED WHERE IT CAN BE TRIGGERED FRIQUENTLY FOR LIVE UPDATING
		//## I.E MENU.OpenTab		
	}
};
MENU.CheckboxFunctions = function() {
	var checkbox = this.getElementsByTagName('input')[0];
	if (!checkbox.checked) {
		this.className = this.className + '  checked';
		checkbox.checked = true;
	} else {
		this.className = this.className.replace('checked', '');
		checkbox.checked = false;
	}

	//## CHECKBOX GROUP LEADER	
	if (checkbox.className == 'group') {
		var isGroupLeaderChecked = checkbox.checked;
		var boxes = checkbox.parentNode.parentNode.getElementsByTagName('INPUT');
		if (DOM.NextSibling(checkbox.parentNode.parentNode).className == 'lastmenuitem') {
			var arr = boxes;
			var boxes = [];
			for (var i = 0, n = arr.length; i < n; i++) {
				boxes.push(arr[i]);
			}
			var arr2 = DOM.NextSibling(checkbox.parentNode.parentNode).getElementsByTagName('INPUT');
			for (var i = 0, n = arr2.length; i < n; i++) {
				if (arr2[i].parentNode.parentNode && arr2[i].parentNode.parentNode.className != 'hidden') {
					boxes.push(arr2[i]);
				}
			}
		}
		var n = boxes.length;
		for (var i = 0, box = null; i < n; i++) {
			box = boxes[i];
			if (isGroupLeaderChecked) {
				box.parentNode.className = 'checkbox checked';
				box.checked = true;
			} else {
				box.checked = false;
				box.parentNode.className = 'checkbox';
			}
		}
	} else {
		checkboxGroupleader = checkbox.parentNode;
		while (checkboxGroupleader.getElementsByTagName('INPUT')[0].className != 'group') {
			checkboxGroupleader = checkboxGroupleader.parentNode;
		}
		var GroupLeader = checkboxGroupleader;
		if (GroupLeader.checked) GroupLeader.checked = false;
	}

	//## COUNT ALL CHECKED BOXES
	var boxes = $('menuoptions').getElementsByTagName('input');
	var n = boxes.length, z = 0, pdfpages = 0;
	for (var i = 0, box = null; i < n; i++) {
		box = boxes[i];
		if (box.checked == true) {
			if (box.className != 'group') {
				var aTag = box.parentNode.parentNode.getElementsByTagName('A')[0];
				if (aTag) {
					var linkRel = parseInt(DOM.GetAttribute(aTag, 'rel'));
					if (linkRel) {
						pdfpages = parseInt(pdfpages + linkRel);
					}
				}
			}
		}
	}

	var downloadActionText = $('download-action-text');
	var downloadActionButton = $('download-action-button');
	switch (MENU.LinkId) {
		case 'download-pdf':
			//## ENABLE PDF DOWNLOAD
			downloadActionText.innerHTML = TEXTHANDLER.DownloadPdfPages + ' ' + pdfpages + ' (' + TEXTHANDLER.DownloadPdfPagesOutOf + ' ' + MENU.DownloadItems + ')';
			downloadActionButton.value = TEXTHANDLER.DownloadPdfText;
			addEvent(downloadActionButton, 'click', PDFExporter);
			break;
		case 'download-mp3':
			//## ENABLE MP3 DOWNLOAD
			MENU.Mp3DefaultSize += MENU.Mp3DefaultSize;
			if (MENU.Mp3DefaultSize > 1024) {
				downloadActionText.innerHTML = TEXTHANDLER.DownloadMp3Size + (MENU.Mp3DefaultSize / 1024).toPrecision(3) + ' Mb';
			} else {
				downloadActionText.innerHTML = TEXTHANDLER.DownloadMp3Size + MENU.Mp3DefaultSize + ' Kb';
			}
			downloadActionButton.value = TEXTHANDLER.DownloadMp3Text;
			addEvent(downloadActionButton, 'click', PDFExporter);
			break;
	}

};
MENU.InitDownloadFunction = function(FileType) {
	var downloadActionText = $('download-action-text');
	var downloadActionButton = $('download-action-button');

	var spans = DOM.GetByClassName($('menu'), 'span', 'checkbox');
	for (var i = 0, n = spans.length; i < n; i++) {
		spans[i].style.visibility = 'visible';
	}
	switch (MENU.LinkId) {
		case 'download-pdf':
			//## ENABLE PDF DOWNLOAD
			if (downloadActionButton) {
				downloadActionText.innerHTML = TEXTHANDLER.DownloadPdfPages + ' 0 (' + TEXTHANDLER.DownloadPdfPagesOutOf + ' ' + MENU.DownloadItems + ')';
				downloadActionButton.value = TEXTHANDLER.DownloadPdfText;
				addEvent(downloadActionButton, 'click', PDFExporter);
			}
			break;
		case 'download-mp3':
			//## ENABLE MP3 DOWNLOAD
			if (downloadActionText) {
				downloadActionText.innerHTML = TEXTHANDLER.DownloadMp3Size + ' 0 Kb';
				downloadActionButton.value = TEXTHANDLER.DownloadMp3Text;
			}
			break;
	}
};


/* TOOLTIP
----------------------------------------------------*/
TOOLTIP.Init = function() {
	this.Tooltip = null;
	this.Title = '';
	this.Rel = '';
	var tooltips = getElementsByClassName(document, '*', 'tooltip');
	for (var i = 0, n = tooltips.length, tooltip = null; i < n; i++) {
		tooltip = tooltips[i];
		if (DOM.GetAttribute(tooltip, 'title')) {
			addEvent(tooltip, 'mouseover', TOOLTIP.Display);
		}
	}

};
TOOLTIP.Display = function(e) {
	TOOLTIP.Title = DOM.GetAttribute(this, 'title');
	if (!TOOLTIP.Title) TOOLTIP.Title = this.title;
	if (!TOOLTIP.Title) return;
	DOM.SetAttribute(this, 'rel', TOOLTIP.Title);
	DOM.SetAttribute(this, 'title', '');
	TOOLTIP.Tooltip = $('tooltip-container');
	if (!TOOLTIP.Tooltip) {
		TOOLTIP.Tooltip = DOM.Create('div', '', 'tooltip-container');
		DOM.Add(TOOLTIP.Tooltip, document.getElementsByTagName('body')[0]);
	} else {
		TOOLTIP.Tooltip.style.display = 'block';
	}
	if (document.all) { x = event.clientX + document.body.scrollLeft; y = event.clientY + document.documentElement.scrollTop; } else { x = e.pageX; y = e.pageY; }
	if (x < 0) { x = -5000; }
	if (y < 0) { y = -5000; }
	TOOLTIP.Tooltip.className = '';
	TOOLTIP.Tooltip.style.left = (x) + 'px';
	TOOLTIP.Tooltip.style.top = (y + 5) + 'px';
	TOOLTIP.Tooltip.id = 'tooltip-container';
	TOOLTIP.Tooltip.zIndex = 10000;
	TOOLTIP.Tooltip.innerHTML = '<em>' + TOOLTIP.Title + '</em>';
	addEvent(this, 'mouseout', TOOLTIP.Hide);

	if (parseInt(y + 130) > getViewport.Height()) {
		TOOLTIP.Tooltip.style.top = (y - TOOLTIP.Tooltip.clientHeight - 5) + 'px';
		TOOLTIP.Tooltip.className = 'rev';
	}

};
TOOLTIP.Hide = function() {
	if (!TOOLTIP.Tooltip) TOOLTIP.Tooltip = $('tooltip-container');
	TOOLTIP.Tooltip.innerHTML = '';
	DOM.SetAttribute(this, 'title', TOOLTIP.Title);
	DOM.SetAttribute(this, 'rel', '');
	TOOLTIP.Tooltip.style.display = 'none';
};


/* PDF EXPORTER
----------------------------------------------------*/
var PDFExporter = function(e) {
	var boxes = $('menuoptions').getElementsByTagName('input');
	var n = boxes.length, z = 0;
	url = "http://hhxen0103.halvarsson.se/getpdf.aspx?company=AP1_"+ TRANSLATE.Lang +"&p=";
	for (var i = 0, box = null; i < n; i++) {
		box = boxes[i];
		if (box.className !== 'group') {
			if (box.checked == true) {
				url = url + "t";
			}
			url = url + ",";
		}
	}
	document.location = url;
};

/* PDF EXPORTER
----------------------------------------------------*/
//var PDFExporter=function(e){
//	var pathtoXmlDoc='../../xml/pdfstructure.xml';
//	if(typeof XMLHttpRequest=='undefined'){
//		function XMLHttpRequest(){
//			try { return new ActiveXObject("MSXML3.XMLHTTP")} catch(e){}
//			try { return new ActiveXObject("MSXML2.XMLHTTP.3.0")} catch(e){}
//			try { return new ActiveXObject("MSXML2.XMLHTTP.4.0")} catch(e){}
//			try { return new ActiveXObject("Msxml2.XMLHTTP")} catch(e){}
//			try { return new ActiveXObject("Microsoft.XMLHTTP")} catch(e){}
//			return null;
//		};
//	}
//	var responseXml=null;
//	httpRequest=new XMLHttpRequest();  
//	if(httpRequest.overrideMimeType) httpRequest.overrideMimeType('text/xml');
//	httpRequest.open('GET', pathtoXmlDoc, true);	
//	httpRequest.send(null);
//	httpRequest.onreadystatechange=function(){
//		var isLocal=(httpRequest.status == 200);		
//		if(httpRequest.readyState == 4 &&(httpRequest.status == 200 || isLocal)){		    
//			if(httpRequest.responseXML==null) return;
//			responseXml=httpRequest.responseXML.documentElement;
//			if(!responseXml){
//				if(isLocal){
//					var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
//					xmlDoc.async=false;
//					xmlDoc.loadXML(httpRequest.responseText);
//					if(xmlDoc.documentElement !== null){
//						responseXml=xmlDoc.documentElement;
//					}
//				}
//			}
//			if(responseXml){
//				var sections='', pages='', xmlFilePageName='', xmlFilePageNumbers=0, oContent;
//				var pdfFileNumberOfPages=0;				
//				var pdfFilePage=new Array();				
//				var currentPDFPageCounter=0;
//				var arrayPositionPageName=0;
//				var arrayPositionPageNumbers=1;
//				var arrayPositionPageStartPageNumber=2;
//                //## GET XML VALUE FROM AJAX POST
//                //## SAVE IN ARRAY AND USE IT FOR LATER
//	            sections=responseXml.getElementsByTagName('section');  
//	                   				
//	            //## LOOP THROUGH EACH SECTION
//	            for(var i=0, n=sections.length; i<n; i++){
//	                pages=sections[i].getElementsByTagName('page');
//	                //## LOOP THROUGH EACH PAGE
//	                for(var x=0, nn=pages.length, xmlNode=null; x<nn; x++){
//	                    xmlNode=pages[x];				                    
//	                    xmlFilePageName=xmlNode.getAttribute('name');				 
//	                    xmlFilePageNumbers=parseInt(xmlNode.getAttribute('pdfpages'));
//                        pdfFilePage[currentPDFPageCounter]=new Array(3);
//	                    pdfFilePage[currentPDFPageCounter][arrayPositionPageName]=xmlFilePageName; //get name of pdf section	  
//	                    pdfFilePage[currentPDFPageCounter][arrayPositionPageNumbers]=xmlFilePageNumbers; //get number of pages for section 
//	                    pdfFilePage[currentPDFPageCounter][arrayPositionPageStartPageNumber]=pdfFileNumberOfPages; //startpage for this section
//	                    pdfFileNumberOfPages += xmlFilePageNumbers; //increase total numbers in pdf
//	                    currentPDFPageCounter++;
//	                }				                			 
//	            }			                
//	            
//			    //## GET ALLT INPUT ELEMENTS
//			    var inputElements=document.getElementsByTagName('input');			    
//			    var URL='http://hhxen0103.halvarsson.se/?file=out&pages=';
//			    var printing=false;
//			    			    
//			    for(var currentInputElementCounter=0, n=inputElements.length; currentInputElementCounter<n; currentInputElementCounter++){
//			        var currentInputElement=inputElements[currentInputElementCounter];
//			        //## IS THIS A CHECKBOX?
//			        if(currentInputElement.type=='checkbox'){
//		                var currentCheckBoxPageName=currentInputElement.value;
//		                if(currentInputElement.checked == true){
//		                    for(var iCurrentArrayElement=0, nn=pdfFilePage.length; iCurrentArrayElement<nn; iCurrentArrayElement++){		                        
//		                        if(currentCheckBoxPageName == pdfFilePage[iCurrentArrayElement][arrayPositionPageName]){		                        
//		                            var startPageForThisSection=pdfFilePage[iCurrentArrayElement][arrayPositionPageStartPageNumber];		                            
//		                            if(!printing) URL +=startPageForThisSection;
//		                            printing=true;
//		                        }
//		                    }
//		                }else { //## DON'T PRINT THIS SECTION 
//		                    //## IF WE WERE PRINTING, INSERT LAST PAGE
//		                    if(printing){
//		                        var lastInputElement=inputElements[currentInputElementCounter -1];
//		                        for(var i=0,nn=pdfFilePage.length; i<nn; i++){
//		                            if(lastInputElement.value == pdfFilePage[i][arrayPositionPageName]){
//		                                URL += '-' + parseInt(pdfFilePage[i][arrayPositionPageStartPageNumber] + pdfFilePage[i][arrayPositionPageNumbers]);
//		                            }
//		                        }
//		                        if(URL.lastIndexOf(',') != URL.length) URL+=',';
//		                    }		                        
//		                    printing=false;
//		                }
//			        }			        
//			    }
//			    URL=URL.substring(0, URL.length - 1);			    
//			    document.location=URL;
//			}
//		}
//	};
//};



/* SEARCH
----------------------------------------------------*/
SEARCHHANDLER.Init = function() {
	SEARCHHANDLER.ClassNameForHightlightedListItems = 'highlight';
	SEARCHHANDLER.CurrentActiveSearchResult = 1;
	addEvent($('btnSearch'), 'click', SEARCHHANDLER.SearchForm);
};
SEARCHHANDLER.NavigateSearchResult = function(e) {
	if (this.id.indexOf('next') > -1) { //move forward 				
		SEARCHHANDLER.CurrentActiveSearchResult++;
	} else {
		if (SEARCHHANDLER.CurrentActiveSearchResult > -1) SEARCHHANDLER.CurrentActiveSearchResult--; //move backwards
	}
	SEARCHHANDLER.MoveToActiveSearchResultPosition(SEARCHHANDLER.CurrentActiveSearchResult);
};
SEARCHHANDLER.MoveToActiveSearchResultPosition = function(pos) {
	var divElements = $('menuoptions').getElementsByTagName('div');
	var noOfElements = 0;
	for (var i = 0, iLen = divElements.length; i < iLen; i++) {
		if (divElements[i].className.indexOf('tooltip') > -1 && divElements[i].parentNode.parentNode.parentNode.className.indexOf('faded') == -1) {
			if (noOfElements == pos) {
				divElements[i].style.display = 'block';
			} else {
				divElements[i].style.display = 'none';
			}
			noOfElements++;
		}
	}
	if (SEARCHHANDLER.CurrentActiveSearchResult + 1 == noOfElements) SEARCHHANDLER.CurrentActiveSearchResult = -1;
};
SEARCHHANDLER.SearchForm = function(e) {
	var filterType = 1, tb = null;
	var trigger = (typeof e.target !== 'undefined') ? e.target : e.srcElement;
	if (trigger.type == 'button') {
		if (trigger.id == 'btnSearch') {
			tb = $('tbSearchBox');
		} else {
			tb = $('tbSearchBoxInMenu');
		}
	} else {
		tb = trigger;
	}

	var d = unescape(tb.value);
	if (d.length == 0) return;
	var od = d; //od=value searched for

	var m = 0; //seach for a word or a full sentence
	if (d.charAt(0) == '"' && d.charAt(d.length - 1) == '"') m = 1;

	var r = new Array(); //new array of results
	var pageScore = new Array();
	var co = 0;
	var numberOfInstances = 0;

	//search for word
	if (m == 0) {
		var woin = new Array(); //array holding if a word should be included or excluded
		var w = d.split(" ");
		for (var a = 0, n = w.length; a < n; a++) {
			woin[a] = 0;
			if (w[a].charAt(0) == '-') { //exclude word if it has a '-' in front
				woin[a] = 1;
			}
		}

		for (var a = 0, n = w.length; a < n; a++) { //remove odd caracters from search(remove -(minus sign) )
			w[a] = w[a].replace(/^\-|^\+/gi, "");
		}

		a = 0; //## RESET ITERATOR TO KEEP NUMBER OF PASSED LINES(RESULTS)
		for (var c = 0, n = sData.length; c < n; c++) {
			pa = 0; //## NUMBER OF PATTERNS PASSED
			nh = 0; //## NUMBER OF PATTERNS PROCESSED
			var score = 0;
			for (var i = 0, nn = woin.length; i < nn; i++) {
				if (woin[i] == 0) {
					//## REMOVE PREVIOUSLY SEARCHED WORD RESULTS					
					sData[c] = sData[c].replace(/<strong>/gi, '');
					sData[c] = sData[c].replace(/<\/strong>/gi, '');

					var line = sData[c]; //## CURRENT LINE TO SEARCH					

					var subjRegexPat = "^(\\w| )*" + w[i];
					var regSubj = new RegExp(subjRegexPat, "i");
					var headingFound = line.search(regSubj);
					if (headingFound >= 0) {
						score += 10;
					}
					nh++;
					var pat = new RegExp(w[i], "i");
					var rn = line.match(pat);
					if (rn && rn.length > 0) {
						var tempArr = sData[c].split(rn);
						var tempString = "";
						//## INSERT STRONG AROUND WORD TO INDICATE RESULT
						for (var cnt = 0, cntLen = tempArr.length; cnt < cntLen; cnt++) {
							tempString += tempArr[cnt] + '<strong>' + rn + '</strong>';
						}

						//## CALCULATE NUMBER OF INSTANCES OF WORD IN STRING
						numberOfInstances += tempArr.length - 1;
						sData[c] = tempString;
						pa++;
						score += rn.length;
					} else {
						pa = 0;
						break;
					}
				}
				if (woin[i] == 1) {
					nh++;
					var pat = new RegExp(w[i], "i");
					var rn = sData[c].search(pat);
					if (rn >= 0) {
						pa = 0;
						break;
					} else {
						pa++;
						score++;
					}
				}
			}
			if (pa == nh && SEARCHHANDLER.IsInScope(sData[c], filterType)) { //IF NUMBER OF PATTERNS IS EQUAL TO NUMBER OF PATTERNS PASSED, ADD LINE TO RESULTS								
				r[a] = sData[c];
				pageScore[a] = score;
				a++; //## INCREMENT RESULT COUNT
			}
		}
		co = a; //## SET NUMBER OF RESULTS

		//SORT THE SEARCH
		r = SEARCHHANDLER.SortSearchResult(r, pageScore);

	}

	//## SEARCH FOR SENTENCE
	if (m == 1) {
		d = d.replace(/"/gi, "");
		var a = 0;
		var pat = new RegExp(d, "i");
		for (var c = 0, n = s.length; c < n; c++) {
			var rn = s[c].search(pat);
			if (rn >= 0 && SEARCHHANDLER.IsInScope(s[c], filterType)) {
				r[a] = s[c]; //add line to result
				a++;
			}
		}
		co = a;
	}
	if (typeof sC == "object" && typeof sC.hhLogSearch == "function") {
		sC.hhLogSearch(d, numberOfInstances);
	}

	SEARCHHANDLER.PrintResult(r, d, m, numberOfInstances);
	return false;
};
SEARCHHANDLER.IsInScope=function(row,type){			
	//## TYPE: 1=ALL, 2=SECTION, 3=PAGE
	if(type == 1) return true; //if 1, always return true(filter off)
	var section="";
	var page="";
	var url=window.location.toString();
	var aUrl=url.split("/");
	section=aUrl[aUrl.length -2];

	//## IF TYPE IS FILTER ON PAGE, FILL IN THE PAGE, OTHERWISE, LEAVE IT EMPTY.
	if(type == 3){
		page=aUrl[aUrl.length -1];
		page=page.substring(0,page.indexOf("."));
	}
    
	//## SPLIT THE ROW AND COMPARE VALUES
	var aRow=row.split("^");
	if(section != aRow[4]){
		return false;
	}else{
		if(page == "" || page == aRow[5]) return true;
		else{ 
			return false;
		}
	}
};
SEARCHHANDLER.PrintResult = function(r, d, m, numberOfSearchResults) {
	var resultPanel = document.getElementById("resultPanel"); //namePrefix + 
	var ToolTipContainerClassName = 'tooltip';
	var resultHtml = "";
	var btnSearchPath = '../../gfx/searchfound.gif';
	var btnSearchPathExpanded = '../../gfx/searchfound.gif';
	var menuListElements = $('menuoptions').getElementsByTagName('li');
	var className = SEARCHHANDLER.ClassNameForHightlightedListItems;
	var classNameNoResult = 'faded';
	for (var i = 0, len = menuListElements.length; i < len; i++) {
		menuListElements[i].className = menuListElements[i].className.replace(className, '');
		menuListElements[i].className = menuListElements[i].className.replace(classNameNoResult, '');
		if (menuListElements[i].parentNode.parentNode.id != 'menuoptions')
			menuListElements[i].className += ' ' + classNameNoResult;
		var images = menuListElements[i].getElementsByTagName('img');
		if (images.length > 0) {
			DOM.Remove(images[0]);
		}
		var tooltips = menuListElements[i].getElementsByTagName('div');
		for (var x = 0, xLen = tooltips.length; x < xLen; x++) {
			if (tooltips[x] && tooltips[x] != 'undefined' && tooltips[x].className == ToolTipContainerClassName)
				DOM.Remove(tooltips[x]);
		}
	}
	if (r.length == 0) {
		MENU.Show();
		MENU.OpenTab('tablinksearch');
		standardSearchQuery = $('tbSearchBox').value;
		menuSearchQuery = $('tbSearchBoxInMenu').value;
		if (menuSearchQuery == '') {
			$('tbSearchBoxInMenu').value = standardSearchQuery;
		} else {
			if (menuSearchQuery !== d) {
				$('tbSearchBoxInMenu').value = d;
			}
		}
		$('menu-searchresult').innerHTML = TEXTHANDLER.SearchNoMatch;
	} else {
		var pattern = SEARCHHANDLER.GetSearchPattern(d, m);
		for (var elementCounter = 0, length = menuListElements.length; elementCounter < length; elementCounter++) {
			var aElement = menuListElements[elementCounter].getElementsByTagName('a');
			if (aElement.length == 1) {
				var currentMenuSection = aElement[0].innerHTML;
				for (var searchArraypos = 0, searchArrayLen = r.length; searchArraypos < searchArrayLen; searchArraypos++) {
					if (r[searchArraypos].indexOf(currentMenuSection) > -1) {
						var searchRowArray = r[searchArraypos].split("^");
						var searchRowArrayPosTitle = 0, searchRowArrayPosText = 3;
						var ch = DOM.Create('img');
						ch.setAttribute('src', btnSearchPath);
						var posResult = searchRowArray[searchRowArrayPosText].search(pattern);
						if (posResult > -1) {
							ch.src = btnSearchPathExpanded;
							var tooltipTextPopup = DOM.Create('div', '', '');
							DOM.SetAttribute(tooltipTextPopup, 'class', ToolTipContainerClassName);
							tooltipTextPopup.style.display = 'none';
							var tooltipText = searchRowArray[searchRowArrayPosText].substr(posResult - 8, 120) + "...";
							tooltipTextPopup.innerHTML = '<span><span><span>' + tooltipText + '</span></span></span>';
							menuListElements[elementCounter].appendChild(tooltipTextPopup);
							addEvent(aElement[0], 'mouseover', viewTooltipForMenuList);
							addEvent(aElement[0], 'mouseout', hideTooltipForMenuList);
						}
						menuListElements[elementCounter].insertBefore(ch, aElement[0]);
						menuListElements[elementCounter].className = menuListElements[elementCounter].className.replace(classNameNoResult, ''); 0
						menuListElements[elementCounter].className = menuListElements[elementCounter].className + ' ' + className;
						var parentListElement = menuListElements[elementCounter].parentNode.parentNode;
					}
				}
			}
		}
	}
	if (r.length > 0) {
		MENU.Show();
		MENU.OpenTab('tablinksearch');
		//$('menu-searchresultNav').style.display = 'block';
		var textout = TEXTHANDLER.SearchResult;
		textout = textout.replace('{SEARCHWORD}', d);
		textout = textout.replace('{RESULTS}', numberOfSearchResults);
		textout = textout.replace('{PAGES}', r.length);
		$('menu-searchresult').innerHTML = textout;

	}
	return;
};
SEARCHHANDLER.SortSearchResult = function(r, pageScore) {
	var newResultArray = new Array();
	for (var pageIterator = 0; pageIterator < r.length; pageIterator++) {
		var maxScore = 0;
		var scorePos = 0;
		for (var scoreIterator = 0, n = pageScore.length; scoreIterator < n; scoreIterator++) {
			if (pageScore[scoreIterator] > maxScore) {
				maxScore = pageScore[scoreIterator];
				scorePos = scoreIterator;
			}
		}
		newResultArray[pageIterator] = r[scorePos];
		pageScore[scorePos] = -1;
	}
	return newResultArray;
};
SEARCHHANDLER.GetSearchPattern=function(d,m){
	if(m == 0){
		var criteria=d.split(" ")[0];
		return new RegExp(criteria, "i");
	}else{
		return new RegExp(d, "i");
	}
};
SEARCHHANDLER.InputOnFocus=function(e){	
	if (this.value=='Sök')
		this.value='';
};
SEARCHHANDLER.InputOnBlur=function(e){
	if (this.value=='')
		this.value='Sök';
};




var viewTooltipForMenuList = function(e) {
	var startElement = this.parentNode;
	if (startElement.parentNode.parentNode.parentNode.parentNode.parentNode.className == 'tablinksearch' && startElement.className.indexOf(SEARCHHANDLER.ClassNameForHightlightedListItems) > -1) {
		startElement.getElementsByTagName('div')[0].className = 'tooltip';
		viewTooltip(1, startElement)
	}
}
var hideTooltipForMenuList=function(e){var startElement = this.parentNode;if (startElement.className.indexOf(SEARCHHANDLER.ClassNameForHightlightedListItems)>-1){viewTooltip(0, startElement)}}

//view: 1 = view, view: 0 = hide 
function viewTooltip(view, startElement){    
    var toolTipElements = startElement.getElementsByTagName('div');
    for (var i=0,iLen=toolTipElements.length;i<iLen;i++){
        if(toolTipElements[i].className == 'tooltip') {
        	if (view) {
        		toolTipElements[i].style.display = 'block';
        	} else {
        		toolTipElements[i].style.display = 'none';
        	}
        }
    }

}

currentFilter=1;
function filterButton(span, no, type){
	if(no != currentFilter){
		if(type == 'hover'){
			span.className='button';
		}else{
			span.className='button inactivebutton';
		}
	}
};



TRANSLATE.Lang = "en";
TRANSLATE.Dictionary = null;
TRANSLATE.Init=function() {	
    if (document.location.toString().indexOf("/sv/") > -1){				
        TRANSLATE.Lang = "sv";
        if(typeof(dictionary_sv) != "undefined"){
            TRANSLATE.Dictionary = dictionary_sv;            
        }
       } else if (document.location.toString().indexOf("/fi/") > -1) {
        TRANSLATE.Lang = "fi";
        if(typeof(dictionary_fi) != "undefined")
        {
            TRANSLATE.Dictionary = dictionary_fi;
        }
    }else{
        if(typeof(dictionary_en) != "undefined"){
            TRANSLATE.Dictionary = dictionary_en;
        }
    }        
};
TRANSLATE.GetValue = function(key) {		
    if (TRANSLATE.Dictionary != null) {                
		var dictLength=TRANSLATE.Dictionary.length;
        for (var ix = 0; ix < dictLength; ix++) {
            if (TRANSLATE.Dictionary[ix][0] == key) {
                return TRANSLATE.Dictionary[ix][1];
            }
        }
    }
    return key;
};

function VisitedPagesHandler() {
	this.NumberOfSecondsBeforePageIsCountedAsVisited = 5;
	this.ResetVisitedPages = function() {
		if (confirm(TEXTHANDLER.ResetConfirm)) {
			var li = $('menu').getElementsByTagName('li');
			for (var i = 0, iLen = li.length; i < iLen; i++) {
				li[i].className = li[i].className.replace('visited', '');
			}
			Cookie.Create('visitedpages', '', '365');
		}
	}
	this.InitializeVisitedLinks = function() {
		var documentName = document.location;
		setTimeout(this.SetPageAsVisited, this.NumberOfSecondsBeforePageIsCountedAsVisited * 1000);
	}
	this.SetPageAsVisited = function() {
		var cookieNameVisitedPages = 'visitedpages';
		var visitedPages = Cookie.Read(cookieNameVisitedPages);
		if (visitedPages != null) {
			visitedPages = visitedPages + '|'; //SEPARATOR OF URLS	
		} else {
			visitedPages = "";
		}
		if (visitedPages.indexOf(document.location) == -1) {
			visitedPages = visitedPages + document.location;
			Cookie.Create(cookieNameVisitedPages, visitedPages, '365');
		}
	}
};

function StringHandler() {
	this.GetCleanInput = function(str) {
		return str;
	}
	this.CharReplaceArray = new Array(
		new Array('\%', '%25'),
		new Array('\n', '{lf}'),
		new Array('\'', '{´}'),
		new Array('&', '%26'),
		new Array(' ', '%20'),
		new Array('\$', '%24'),
		new Array('\+', '%2B'),
		new Array('\?', '%3F'),
		new Array('"', '%22'),
		new Array('\<', '%3C'),
		new Array('\>', '%3E'),
		new Array('\#', '%23'),
		new Array('|', '%7C')
	);
	this.Encode = function(str) {
		return this.EncodeDecode(str, 1);
	}
	this.Decode = function(str) {
		return this.EncodeDecode(str, 0);
	}
	this.EncodeDecode = function(str, encode) {
		if (str == null)
			return str;
		var source = 1, replacement = 0;
		if (encode) {
			source = 0;
			replacement = 1;
		}
		for (var i = 0, iLen = this.CharReplaceArray.length; i < iLen; i++) {
			var strArr = str.toString().split(this.CharReplaceArray[i][source]);
			var newstring = '';
			for (var x = 0, xLen = strArr.length; x < xLen; x++) {
				if (xLen > 1) {
					newstring += strArr[x];
					if (x < xLen - 1) {
						newstring += this.CharReplaceArray[i][replacement];
					}
				} else {
					newstring = str;
				}
			}
			str = newstring;
		}
		return str;
	}
	this.ToHtml = function(str) {
		str = str.replace(/\n/g, '<br />');
		return str;
	}
	this.Trim = function(sString) {
		var arr = new Array('	', '\n', '\r', '			', ' ');
		if (!sString)
			return '';
		sString = sString.toString();
		while (arr.exists(sString.substring(0, 1))) {
			sString = sString.substring(1, sString.length);
		}
		while (arr.exists(sString.substring(sString.length - 1, sString.length))) {
			sString = sString.substring(0, sString.length - 1);
		}
		return sString;
	}
};
function InputOutput() {
	this.Alert = function(str) {
		if ($('alert')) return;
		var cover = document.createElement('div');
		cover.id = 'alertcover';
		cover.className = 'cover';
		cover.style.height = '1000px';
		cover.style.width = '2000px';
		cover.style.display = 'block';
		cover.style.zIndex = 100;
		setOpacity(cover, 75);
		document.body.appendChild(cover);
		var p = new POPUP();
		p.Width = 300;
		p.Height = 140;
		p.Id = 'alert';
		p.BodyText = str;
		p.CurrentXPos = parseInt(document.body.offsetWidth / 2) - parseInt(p.Width / 2);
		p.CurrentYPos = parseInt(document.body.offsetHeight / 2) - parseInt(p.Height / 2);
		p.Show();
		if (isIE) {
			$('alert').style.background = '#ccc';
		}
		$('alert').style.zIndex = 101;
		setTimeout('FadeElement("alert", 1000, 100, 0)', 3000);
		setTimeout('FadeElement("alertcover", 1000, 75, 0)', 3000);
	}
	this.Confirm = function(sr) {
		return confirm(sr);
	}
};


function TextHandler() {
	this.gv = function(val) { return TRANSLATE.GetValue(val) }
	this.TextWelcome = this.gv('Welcome');
	this.TextWelcomeBody = this.gv('WelcomeBody');
	this.TextWelcomeLinkMoreInfo = this.gv('WelcomeLinkMoreInfo');
	this.TextWelcomeLinkSignUp = this.gv('WelcomeLinkSignUp');
	this.TextWelcomeLinkHaveAccount = this.gv('WelcomeLinkHaveAccount');
	this.TextPopupClose = this.gv('Close');
	this.TextLoginHeader = this.gv('LoginHeader');
	this.TextLoginFieldEmail = this.gv('Email');
	this.TextLoginFieldPassword = this.gv('Password');
	this.TextLoginButtonLogin = this.gv('Login');
	this.TextLoginLinkNewUser = this.gv('NewUser');
	this.TextLoginLinkLostPassword = this.gv('LostPassword');
	this.TextSignUpHeader = this.gv('Signup');
	this.TextSignUpBody = this.gv('CommentsInfo');
	this.TextSignUpFieldFullName = this.gv('FieldYourName');
	this.TextSignUpFieldYourEmail = this.gv('FieldYourEmail');
	this.TextSignUpFieldNewPassWord = this.gv('FieldNewPassword');
	this.TextSignUpFieldAccept = this.gv('TermsAccept');
	this.TextSignUpFieldAcceptEnd = this.gv('TermsAcceptEnd');
	this.TextSignUpSubmitButton = this.gv('BtnSignup');
	this.TextCollaborateHeader = this.gv('ColH');
	this.TextCollaborateBody = this.gv('ColB');
	this.TextCollaborateFieldEmailAddresses = this.gv('FieldFriends');
	this.TextCollaborateButtonInvite = this.gv('BtnInvite');
	this.TextCollaborateButtonSkip = this.gv('BtnSkip');
	this.TextCollaborateInviteSectionHeader = this.gv('InviteMore');
	this.TextCollaborateInviteSectionBody = this.gv('FieldFriends');
	this.TextCollaborateInviteSectionBtnText = this.gv('BtnInvite');
	this.TextCollaborateRemoveSectionHeader = this.gv('RemMembersH');
	this.TextCollaborateRemoveSectionBody = this.gv('RemMembersB');
	this.TextCollaborateRemoveSectionBtnText = this.gv('BtnRemove');
	this.TextInvitationSent = this.gv('SendingInvitations');
	this.TextCommentFormHeader = this.gv('WelcomeBack');
	this.TextCommentFormBodyInvitationUnused = this.gv('ComToolsInfoB1');
	this.TextCommentFormBodyInvitedPerson = this.gv('ComToolsInfoB2');
	this.TextCommentFormBodyInvitationUsed = this.gv('ComToolsInfoB3');
	this.TextCommentFormStartCollaborate = this.gv('StartCol');
	this.TextCommentFormButtonLogout = this.gv('Logout');
	this.TextCommentFormButtonEditGroupMembers = this.gv('EditMembers');
	this.TextCommentFormButtonCreateComment = this.gv('CreateComment');
	this.TextCommentFormButtonShowComments = this.gv('ShowMyComments');
	this.TextRecoverPasswordHeader = this.gv('RecoverAccount');
	this.TextRecoverPasswordButtonRecover = this.gv('SendMePassword');
	this.TextRecoverPasswordConfirmationText = this.gv('EmailSent');
	this.TextUserHasBeenCreated = this.gv('UserCreated');
	this.TextYourComment = this.gv('You');
	this.TextDeleteComment = this.gv('DeleteComment');
	this.TextCreateComment = this.gv('CreateComment');
	this.TextUpdateComment = this.gv('UpdateComment');
	this.TextResponseCreate = this.gv('ClickRespond');
	this.TextResponseDelete = this.gv('DeleteResponse');
	this.TextResponseSave = this.gv('SaveResponse');
	this.TextUpdateResponse = this.gv('UpdateResponse');
	this.TextDeleteConfirm = this.gv('ConfirmDelete');
	this.TextAnd = this.gv('And');
	this.ErrorAcceptTermsOfUse = this.gv('TermsOfUser');
	this.ErrorUserCreation = this.gv('ErrorRegistration');
	this.ErrorLogin = this.gv('ErrorLogin');

	//SEARCH MODULE
	this.SearchResult = this.gv('Searchresult');
	this.SearchButton = this.gv('BtnSearch');
	this.SearchNavigatePrevious = this.gv('BtnPrevious');
	this.SearchNavigateNext = this.gv('BtnNext');
	this.SearchNoMatch = this.gv('SearchEmpty');

	this.DownloadPdfText = this.gv('DownloadPdfText');
	this.DownloadPdfPages = this.gv('DownloadPdfPages');
	this.DownloadPdfPagesOutOf = this.gv('DownloadPdfPagesOutOf');

	this.DownloadMp3Text = this.gv('DownloadMp3Text');
	this.DownloadMp3Size = this.gv('DownloadMp3Size');

	this.DownloadEmfText = this.gv('DownloadEmfText');
	this.DownloadExcelText = this.gv('DownloadExcelText');

	this.ListenToPage = this.gv('ListenToPage');
	this.ListenToPageTitle = this.gv('ListenToPageTitle');

	this.TextSizeStandard = this.gv('TextSizeStandard');
	this.TextSizeStandardTitle = this.gv('TextSizeStandardTitle');

	this.TextSizeBig = this.gv('TextSizeBig');
	this.TextSizeBigTitle = this.gv('TextSizeBigTitle');

	this.RenderColumnLayout = this.gv('RenderColumnLayout');
	this.RenderColumnLayoutTitle = this.gv('RenderColumnLayoutTitle');

	this.RenderBasicLayout = this.gv('RenderBasicLayout');
	this.RenderBasicLayoutTitle = this.gv('RenderBasicLayoutTitle');

	this.Close = this.gv('Close');
	this.FinancialTableMultiViewTrigger = this.gv('FinancialTableMultiViewTrigger');
	this.MenuClose = this.gv('MenuClose');
	this.TabNavigation = this.gv('TabNavigation');
	this.TabSearchResults = this.gv('TabSearchResults');
	this.TabDownloadPdf = this.gv('TabDownloadPdf');
	this.TabDownloadMp3 = this.gv('TabDownloadMp3');
	this.TabVisitedPages = this.gv('TabVisitedPages');
	this.ResetConfirm = this.gv('ResetConfirm');
	this.TabStickyNotes = this.gv('TabStickyNotes');
	this.VisitedPagesButton = this.gv('VisitedPagesResetButton');
};
function User() {
	this.Name = '';
	this.Username = '';
	this.Password = '';
	this.Hash = '';
	this.isAdmin = false; //IS USER ADMIN?
	this.GroupMembers = new Array();
	this.Save = function() {
		USERHANDLER.SaveUser(this);
	}
	this.LoadByCookie = function() {
		return USERHANDLER.LoadUserByCookie(this);
	}
};
function UserHandler() {
	this.CookieNameUsername = 'Username';
	this.CookieNameName = 'Name';
	this.CookieNameHash = 'LoginHash';
	this.CookieNameGroupMembers = 'GroupMembers';
	this.CookieNameIsAdmin = 'IsAdmin';
	this.Login = function(name, email, password, isAdmin) {
		var Hash = hex_md5(email + password);
		USER.Hash = Hash;
		USER.Name = name;
		USER.Username = email;
		USER.isAdmin = isAdmin;
		this.SaveUser(USER);
		document.location.reload();
	};
	this.Logout = function() {
		USERHANDLER.Reset();
		document.location.reload();
	};
	this.Reset = function() {
		Cookie.Create(USERHANDLER.CookieNameHash, '', -1);
		Cookie.Create(USERHANDLER.CookieNameName, '', -1);
		Cookie.Create(USERHANDLER.CookieNameUsername, '', -1);
		Cookie.Create(USERHANDLER.CookieNameGroupMembers, '', -1);
		Cookie.Create(USERHANDLER.CookieNameIsAdmin, '', -1);

	};
	this.SaveUser = function(user) {
		Cookie.Create(this.CookieNameHash, user.Hash, 365);
		Cookie.Create(this.CookieNameName, user.Name, 365);
		Cookie.Create(this.CookieNameIsAdmin, user.isAdmin, 365);
		Cookie.Create(this.CookieNameUsername, user.Username, 365);
		Cookie.Create(this.CookieNameGroupMembers, user.GroupMembers, 365);

	};
	this.LoadUserByCookie = function(user) {
		user.Hash = Cookie.Read(this.CookieNameHash);
		user.Name = Cookie.Read(this.CookieNameName);
		user.Username = Cookie.Read(this.CookieNameUsername);
		user.isAdmin = false;
		if (Cookie.Read(this.CookieNameIsAdmin) == 'true') user.isAdmin = true;
		if (user.Username) {
			SERVERCONNECTION.GetUsersInGroup(user.Username,
				function(success, members) {
					if (!success) {
						User.Hash = '';
					}
				}
			);
		}
		return USER.Hash;
	};
};
function Comment(page, section, offset, id, wordlength) {
    this.Page = page;
    this.Section = section;
    this.Offset = offset;
    this.WordLength = wordlength;
    this.ID = id;    
    this.CommentSection = new Array();
    this.Editable = false;
    this.addSection = function(text, author, created) {
    this.CommentSection[this.CommentSection.length] = (new CommentSection(text, author, created));}        
}
function CommentSection(text, author, created) {
    this.Text = text;
    this.Author = author;
    this.CreatedTime = created;
}
function ServerConnection() {
	this.callBackCreateUser = null; //function(bool)
	this.callBackAuthenticateUser = null; //function(bool success, bool isGroupAdmin)
	this.callBackGetUsersInGroup = null; //function(bool,array of usernames)
	this.callBackInviteUsers = null; //function(bool)
	this.callBackKickUser = null; //function(bool)
	this.callBackCreateComment = null; //function(bool)
	this.callBackEditComment = null; //function(bool)
	this.callBackDeleteComment = null; //function(bool)
	this.callBackGetComments = null; //function(bool)
	this.CreateUser = function(username, name, password, callback) {
		this.callBackCreateUser = callback;
		var path = "/CreateUser.aspx?u=" + STRINGHANDLER.Encode(username) + "&n=" + STRINGHANDLER.Encode(name) + "&p=" + STRINGHANDLER.Encode(password);
		callServer(path);
	};
	this.AuthenticateUser = function(username, password, callback) {
		this.callBackAuthenticateUser = callback;
		var path = "/Login.aspx?u=" + STRINGHANDLER.Encode(username) + "&p=" + STRINGHANDLER.Encode(password);
		callServer(path);
	};
	this.GetUsersInGroup = function(username, callback) {
		this.callBackGetUsersInGroup = callback;
		var path = "/GetUsersInGroup.aspx?u=" + STRINGHANDLER.Encode(username);
		callServer(path);
	};
	this.InviteUsers = function(username, invite, callback) {
		this.callBackInviteUsers = callback;
		var path = "/InviteUser.aspx?u=" + STRINGHANDLER.Encode(username) + "&i=" + STRINGHANDLER.Encode(invite); //invite is email separated by , or ;
		callServer(path);
	};
	this.KickUser = function(username, callback) {
		this.callBackKickUser = callback;
		var path = "/KickUser.aspx?u=" + STRINGHANDLER.Encode(username);
		callServer(path);
	};
	this.CreateComment = function(username, section, page, offset, wordlength, callback) {
		this.callBackCreateComment = callback;
		var path = "/CreateComment.aspx?u=" + STRINGHANDLER.Encode(username) + "&s=" + STRINGHANDLER.Encode(section) + "&p=" + STRINGHANDLER.Encode(page) + "&o=" + STRINGHANDLER.Encode(offset) + "&w=" + STRINGHANDLER.Encode(wordlength);
		callServer(path);
	};
	this.EditComment = function(username, commentId, text, callback) {
		this.callBackEditComment = callback;
		var path = "/EditComment.aspx?u=" + STRINGHANDLER.Encode(username) + "&id=" + STRINGHANDLER.Encode(commentId) + "&t=" + STRINGHANDLER.Encode(text);
		callServer(path);
	};
	this.DeleteComment = function(username, commentId, callback) {
		this.callBackDeleteComment = callback;
		var path = "/DeleteComment.aspx?u=" + STRINGHANDLER.Encode(username) + "&id=" + STRINGHANDLER.Encode(commentId);
		callServer(path);
	};
	this.GetComments = function(username, callback) {
		this.callBackGetComments = callback;
		var path = "/GetComments.aspx?u=" + STRINGHANDLER.Encode(username);
		callServer(path);
	};

	var serverPath = "http://cybercom.commentserver.ar.halvarsson.se/test";

	var callServer = function(url) {
		var script = document.createElement('script');
		var srcVar = serverPath + url + '&rnd=' + parseInt(Math.random() * 99999999);
		var head = document.getElementsByTagName('head')[0];
		script.src = srcVar;
		script.setAttribute('type', 'text/javascript');
		var scripts = document.getElementsByTagName('script');
		for (var i = 0, iLen = scripts.length; i < iLen; i++) {
			if (scripts[i] && scripts[i].src.indexOf(serverPath + url) > -1) {
				DOM.Remove(scripts[i]);
			}
		}
		DOM.Add(script, head);
		if (isIE6) {
			var iframeid = 'ajaxiframe';
			if ($(iframeid))
				DOM.Remove($(iframeid));
			var iframe = document.createElement('iframe');
			iframe.id = iframeid;
			iframe.src = srcVar;
			DOM.Add(iframe, head);
		}
	}
};

function CommentHandler() {
	var _comments = [];
	this.clearComments = function() {
		_comments.length = 0;
	};
	this.addComment = function(comment) {
		_comments[_comments.length] = comment;
	};
	this.GetNameByAuthor = function(author) {
		for (var i = 0, iLen = USER.GroupMembers.length; i < iLen; i++) {
			if (author == USER.GroupMembers[i].Username)
				return USER.GroupMembers[i].Name;

		}
		return author;
	};
	this.getComments = function() {
		return _comments;
	};
};

ACTIVECOMMENT.Init = function() {
	ACTIVECOMMENT.ActiveCommentContainerId = 'activecomment';
	ACTIVECOMMENT.CommentId = ''; //Active commentid
	ACTIVECOMMENT.IsEditing = false;
	ACTIVECOMMENT.EditClassName = 'edit';
	ACTIVECOMMENT.TextAreaId = 'commenttext';
};
ACTIVECOMMENT.SetCommentId=function(newcommentid){ACTIVECOMMENT.CommentId=newcommentid}
ACTIVECOMMENT.GetCommentId=function(){return ACTIVECOMMENT.CommentId}
ACTIVECOMMENT.UpdateComment = function() {
	var commentid = ACTIVECOMMENT.GetCommentId();
	var e = $(ACTIVECOMMENT.TextAreaId);
	var commenttext = STRINGHANDLER.GetCleanInput(e.value);

	SERVERCONNECTION.EditComment(USER.Username, commentid, commenttext,
		function(success) {

		}
	);
	COMMENTS.FlushComments();
	ACTIVECOMMENT.IsEditing = false;
	setTimeout("ACTIVECOMMENT.Hide()", 200);
};
ACTIVECOMMENT.DeleteComment = function() {
	if (ACTIVECOMMENT.GetCommentId() == '')
		return;
	if (confirm(TEXTHANDLER.TextDeleteConfirm)) {
		ACTIVECOMMENT.GetCommentId();
		SERVERCONNECTION.DeleteComment(USER.Username, ACTIVECOMMENT.GetCommentId(),
			function(success) {
				if (success) {
					COMMENTS.FlushComments();
					COMMENTPLACEHOLDER.SetAsDeleted(ACTIVECOMMENT.GetCommentId());
				}
			}
		);
		ACTIVECOMMENT.Hide();
		ACTIVECOMMENT.IsEditing = false;
	}
};
ACTIVECOMMENT.Show = function(obj) {
	if (ACTIVECOMMENT.IsEditing) return;
	if (obj.className != COMMENTPLACEHOLDER.ClassName) obj = this;
	if (obj.className != COMMENTPLACEHOLDER.ClassName) return;
	var commentid = obj.id.replace('commentid=', '');
	var scrollpanel = $('scrollpanel');
	var mouseEvent = COMMENTAREA.MouseEvent;
	var left = 0, top = 0;
	if (mouseEvent) {
		left = mouseEvent.screenX;
		if (isIE) {
			top = mouseEvent.screenY;
		}
	}
	if (PAGE.RenderMode == 'static') {
		if (isIE) {
			top = obj.offsetTop + 130;
			left = obj.offsetLeft + 60;
		} else {
			top = obj.offsetTop + 20;
			left = obj.offsetLeft + 50;
		}
	} else {
		if (isIE) {
			left -= window.screenLeft;
			top -= window.screenTop;
		}
		else {
			left -= window.screenX;
			top = obj.offsetTop + 30;
		}
		left += 10;
	}
	ACTIVECOMMENT.SetCommentId(commentid);
	var commenttext = '';
	var comments = COMMENTHANDLER.getComments();
	ACTIVECOMMENT.Container = DOM.Create('div', '', ACTIVECOMMENT.ActiveCommentContainerId);
	strhtml = '<div class="pop-close" id="btn-comment-close" title="' + TEXTHANDLER.TextPopupClose + '"><span>' + TEXTHANDLER.TextPopupClose + '</span></div><div class="header">{header}</div><div class="content">';
	var iLen = comments.length;
	var commentIsNew = true;
	var header = '<strong>' + TEXTHANDLER.TabStickyNotes + '</strong><a href="javascript:;" id="comment-action"></a><a href="javascript:;" id="comment-delete">' + TEXTHANDLER.TextDeleteComment + '</a>';
	var ActionDelete = false;
	var ActionUpdateResponse = false;
	var ActionCreateResponse = true;
	var actionbuttontext = '';
	strhtml = strhtml.replace('{header}', header);
	for (var i = 0; i < iLen; i++) {
		if (commentid == comments[i].ID) {
			commentIsNew = false;
			var CommentSections = comments[i].CommentSection;
			var iCSLen = CommentSections.length;
			var isLatestComment = true;
			if (iCSLen > 0) {
				for (var iCS = iCSLen - 1; iCS >= 0; iCS--) {
					var text = STRINGHANDLER.Decode(CommentSections[iCS].Text);
					if (CommentSections[iCS].Author == USER.Username) {
						strhtml += '<p>';
						strhtml += '<strong>' + TEXTHANDLER.TextYourComment + ':</strong>';
						if (isLatestComment) {
							actionbuttontext = TEXTHANDLER.TextUpdateComment;
							strhtml += '<textarea id="' + ACTIVECOMMENT.TextAreaId + '">' + text + '</textarea>';
							strhtml += '<span>' + STRINGHANDLER.ToHtml(text) + '</span>';
							ActionUpdateResponse = true;
						}
						else {
							strhtml += STRINGHANDLER.ToHtml(text);
						}
						strhtml += '</p>';
					} else {
						actionbuttontext = TEXTHANDLER.TextResponseCreate;
						strhtml += '<p>';
						strhtml += '<strong>' + COMMENTHANDLER.GetNameByAuthor(CommentSections[iCS].Author) + ':</strong>';
						strhtml += STRINGHANDLER.ToHtml(text);
						strhtml += '</p>';
					}
					isLatestComment = false;
				}
			}
			else { //THIS IS A NEW COMMENT					
				commentIsNew = true;
			}
			if (iCSLen == 0) {
				actionbuttontext = TEXTHANDLER.TextCreateComment;
			} else if (iCSLen == 1 && CommentSections[0].Author == USER.Username) {
				actionbuttontext = TEXTHANDLER.TextUpdateComment;
			} else if (iCSLen > 1 && CommentSections[CommentSections.length - 1].Author == USER.Username) {
				actionbuttontext = TEXTHANDLER.TextUpdateResponse;
			} else if (iCSLen > 1 && CommentSections[CommentSections.length - 1].Author != USER.Username) {
				actionbuttontext = TEXTHANDLER.TextResponseCreate;
			}
		}
	}
	if (commentIsNew) {
		actionbuttontext = TEXTHANDLER.TextCreateComment;
		strhtml += '<p>';
		strhtml += '<strong>' + TEXTHANDLER.TextYourComment + ':</strong>';
		strhtml += '<textarea id="' + ACTIVECOMMENT.TextAreaId + '"></textarea>';
		strhtml += '</p>';
		ActionUpdateResponse = true;
	}
	strhtml += '</div>';
	ACTIVECOMMENT.Container.innerHTML = strhtml;
	ACTIVECOMMENT.Container.style.left = left + 'px';
	ACTIVECOMMENT.Container.style.top = top + 'px';
	ACTIVECOMMENT.Container.innerHTML = strhtml;
	DOM.Add(ACTIVECOMMENT.Container, $(COMMENTAREA.ContainerId));
	addEvent($('btn-comment-close'), 'click', ACTIVECOMMENT.Hide);
	$('comment-action').innerHTML = actionbuttontext;
	var deletebtn = $('comment-delete');
	addEvent(deletebtn, 'click', ACTIVECOMMENT.DeleteComment);
	deletebtn.innerHTML = TEXTHANDLER.TextDeleteComment;
	if (ActionUpdateResponse) {
		addEvent($('comment-action'), 'click', ACTIVECOMMENT.UpdateComment);
	} else if (ActionDelete) {
		addEvent($('comment-action'), 'click', ACTIVECOMMENT.DeleteComment);
	} else if (ActionCreateResponse) {
		//REMOVE DELETE BUTTON
		DOM.Remove(deletebtn);
		addEvent($('comment-action'), 'click', ACTIVECOMMENT.CreateResponse);
	}
	var e = ACTIVECOMMENT.Container.getElementsByTagName('div');
	for (var i = 0, iLen = e.length; i < iLen; i++) {
		if (e[i].className == 'content') {
			e[i].style.overflowY = 'auto';
			e[i].style.overflowX = 'hidden';
			e[i].style.height = ACTIVECOMMENT.Container.style.height;
		}
	}
	var containerTop = parseInt(ACTIVECOMMENT.Container.style.top.replace('px', ''));
	if (containerTop + ACTIVECOMMENT.Container.offsetHeight > $('content').offsetHeight + $('content').offsetTop) {
		ACTIVECOMMENT.Container.style.top = (containerTop - ACTIVECOMMENT.Container.offsetHeight - 15) + 'px';
	}
	var containerLeft = parseInt(ACTIVECOMMENT.Container.style.left.replace('px', ''));
	if (containerLeft + ACTIVECOMMENT.Container.offsetWidth > $('scrollpanel').offsetWidth) {
		ACTIVECOMMENT.Container.style.left = (containerLeft - ACTIVECOMMENT.Container.offsetWidth - 25) + 'px';
	}
};
ACTIVECOMMENT.Hide = function() {
	ACTIVECOMMENT.IsEditing = false;
	if ($(ACTIVECOMMENT.ActiveCommentContainerId))
		DOM.Remove(ACTIVECOMMENT.Container);
};
ACTIVECOMMENT.StartEdit = function() {
	ACTIVECOMMENT.IsEditing = true;
	if ($(ACTIVECOMMENT.TextAreaId)) {
		$(ACTIVECOMMENT.TextAreaId).style.display = 'block';
		$(ACTIVECOMMENT.TextAreaId).focus();
	}
	ACTIVECOMMENT.Container.className = ACTIVECOMMENT.EditClassName;
};
ACTIVECOMMENT.CreateResponse = function() {
	ACTIVECOMMENT.Response = DOM.Create('div', 'edit', ACTIVECOMMENT.ActiveCommentContainerId);
	var strhtml = '<div class="pop-close" id="btn-response-close" title="' + TEXTHANDLER.TextPopupClose + '"><span>' + TEXTHANDLER.TextPopupClose + '</span></div>';
	strhtml += '<div class="header"><strong>Response</strong><a href="javascript:;" id="btn-comment-save">' + TEXTHANDLER.TextResponseSave + '</a></div>';
	strhtml += '<div class="content"><p><textarea id="response"></textarea></div></p>';
	ACTIVECOMMENT.Response.innerHTML = strhtml;

	var left = parseInt(ACTIVECOMMENT.Container.style.left.replace('px', ''));
	var top = parseInt(ACTIVECOMMENT.Container.style.top.replace('px', ''));
	left += 50;
	top += 50;
	ACTIVECOMMENT.Response.style.left = left + 'px';
	ACTIVECOMMENT.Response.style.top = top + 'px';
	ACTIVECOMMENT.Response.style.height = '289px';
	DOM.Add(ACTIVECOMMENT.Response, $(COMMENTAREA.ContainerId));
	$('response').style.display = 'block';
	$('response').focus();
	addEvent($('btn-comment-save'), 'click', ACTIVECOMMENT.SaveResponse);
	addEvent($('btn-response-close'), 'click', ACTIVECOMMENT.CloseResponse);
};
ACTIVECOMMENT.SaveResponse = function() {
	var e = $('response');
	var commentid = ACTIVECOMMENT.GetCommentId();
	SERVERCONNECTION.EditComment(USER.Username, commentid, STRINGHANDLER.GetCleanInput(e.value),
		function(success) {
		}
	);
	COMMENTS.FlushComments();
	ACTIVECOMMENT.CloseResponse();
	ACTIVECOMMENT.Hide();
};
ACTIVECOMMENT.CloseResponse = function() {
	DOM.Remove(ACTIVECOMMENT.Response);
};

COMMENTAREA.Init = function() {
	COMMENTAREA.ContainerId = 'content';
	COMMENTAREA.Container = $(COMMENTAREA.ContainerId);
	COMMENTAREA.Underline = DOM.Create('div', '', '');
	COMMENTAREA.Underline.className = 'underline';
	COMMENTAREA.IllegalChars = new Array(' ', ',', '.', '\n', '-', '"');
	document.body.appendChild(COMMENTAREA.Underline);
	COMMENTAREA.DoComment = false;
	if (isIE) COMMENTAREA.CommentRange = document.body.createTextRange();
	COMMENTAREA.CommentIcon = DOM.Create('span', '', 'comment-icon');
	DOM.Add(COMMENTAREA.CommentIcon, COMMENTAREA.Container);
	addEvent(COMMENTAREA.Container, 'click', COMMENTAREA.Click);
	addEvent(COMMENTAREA.Container, 'mousemove', COMMENTAREA.MouseMove);
	addEvent(COMMENTAREA.Container, 'mouseout', COMMENTAREA.MouseOut);
};
COMMENTAREA.MouseMove = function(e) {
	COMMENTAREA.MouseEvent = e;
	if (COMMENTAREA.DoComment) {
		COMMENTAREA.CommentIcon.style.top = (e.clientY + 10) + 'px';
		COMMENTAREA.CommentIcon.style.left = (e.clientX + 10) + 'px';
		COMMENTAREA.CommentIcon.style.display = 'block';
		if (isIE) {
			COMMENTAREA.CommentRange.moveToPoint(e.clientX, e.clientY);
			COMMENTAREA.CommentRange.expand("word");
			var columnWidth = 400;
			if (COMMENTS.AcceptedCommentTags.indexOf('|' + e.srcElement.tagName + '|') == -1 || COMMENTAREA.CommentRange.boundingLeft >= ((columnWidth + 100) * 2)) {
				//commentout(e);
			} else {
				COMMENTAREA.Underline.style.left = (COMMENTAREA.CommentRange.boundingLeft - 4) + 'px';
				COMMENTAREA.Underline.style.top = (COMMENTAREA.CommentRange.boundingTop - 1) + 'px';
				COMMENTAREA.Underline.style.display = 'block';
			}
		}
	}
};
COMMENTAREA.MouseOut = function(e) {
	if (!ACTIVECOMMENT.IsEditing) ACTIVECOMMENT.Hide();
};
COMMENTAREA.Click = function(e) {
	var commentPlaceHolder;
	if (COMMENTAREA.DoComment) {
		var el;
		go = false;
		if (isIE) {
			el = e.srcElement;
			if (COMMENTS.AcceptedCommentTags.indexOf('|' + el.tagName + '|') > -1) {
				if (el.parentNode.className != COMMENTPLACEHOLDER.ClassName) {
					go = true;
					var commentLength = COMMENTAREA.CommentRange.text.length;
					COMMENTAREA.CommentRange.pasteHTML('<span id="newcomment" ' +
						' onmouseover="COMMENTPLACEHOLDER.MouseOver(this)" ' +
						' onmouseout="COMMENTPLACEHOLDER.MouseOut(this)" ' +
						' onclick="COMMENTPLACEHOLDER.Click(this)" ' +
						' class="' + COMMENTPLACEHOLDER.ClassName + '" >' + COMMENTAREA.CommentRange.text + '</span>');
					commentPlaceHolder = $('newcomment');
				}
			}
		} else {
			el = e.target;
			if (!el) el = e.srcElement;
			if (COMMENTS.AcceptedCommentTags.indexOf('|' + el.tagName + '|') > -1) {
				go = true;
				sel = window.getSelection();
				startpos = sel.anchorOffset;
				endpos = startpos;

				sel.collapse(sel.anchorNode, startpos);
				range = document.createRange();
				range.setStart(sel.anchorNode, startpos);
				range.setEnd(sel.anchorNode, endpos);

				while (startpos > 0) {
					startpos--;
					range.setStart(sel.anchorNode, startpos);
					if (range.toString().substring(0, 1) == ' ') {
						startpos++;
						range.setStart(sel.anchorNode, startpos);
						break;
					}
				}
				endpos = startpos + 1;

				var illegalchrs = COMMENTAREA.IllegalChars;
				if (endpos - startpos == 1) {
					range.setEnd(sel.anchorNode, endpos);
					while (illegalchrs.exists(range.toString().substring(range.toString().length - 1))) {
						endpos++;
						range.setEnd(sel.anchorNode, endpos);

					}
				}

				while (true) {
					try {
						range.setEnd(sel.anchorNode, endpos);
					}
					catch (ex) {
						endpos -= 2;
						range.setEnd(sel.anchorNode, endpos);
						break;
					}
					var chr = range.toString().substring(range.toString().length - 1)

					if (illegalchrs.exists(chr)) {
						endpos--;
						range.setEnd(sel.anchorNode, endpos);
						break;
					}
					endpos++;
				}
				commentLength = endpos - startpos;
				commentPlaceHolder = DOM.Create('span', COMMENTPLACEHOLDER.ClassName, '');
				DOM.SetAttribute(commentPlaceHolder, 'onmouseout', 'COMMENTPLACEHOLDER.MouseOut(this);');
				DOM.SetAttribute(commentPlaceHolder, 'onmouseover', 'COMMENTPLACEHOLDER.MouseOver(this);');
				DOM.SetAttribute(commentPlaceHolder, 'onclick', 'COMMENTPLACEHOLDER.Click(this);');
				DOM.SetAttribute(commentPlaceHolder, 'id', 'newcomment');

				commentPlaceHolder.innerHTML = range.toString();

				range.deleteContents();
				range.insertNode(commentPlaceHolder);
			}
		}
		if (go) {
			if (commentPlaceHolder != null) {
				var comment = new Comment();
				comment.Page = PAGE.GetPageHash();
				comment.Section = COMMENTAREA.GetSection(el);

				var sectiontext = commentPlaceHolder.parentNode.innerHTML;
				var startpos = sectiontext.indexOf('<span id="newcomment"');
				var endpos = sectiontext.indexOf(commentPlaceHolder.innerHTML + '</span>') + commentPlaceHolder.innerHTML.length + 7;

				if (isIE) {
					startpos = sectiontext.indexOf('<SPAN class=comment id=newcomment');
					endpos = sectiontext.indexOf(commentPlaceHolder.innerHTML + '</SPAN>');
					endpos += commentPlaceHolder.innerHTML.length + 7;
				}
				startpos -= 2;

				var illegalChars = new Array(' ', '	', '\n', '<', '>', '"');
				while (illegalChars.exists(sectiontext.substring(endpos, endpos + 1)) && endpos < sectiontext.length) {
					endpos++;
				}

				var chr = sectiontext.substring(startpos, startpos + 1);
				var wordBeforeComment = '';
				while (!illegalChars.exists(chr) && startpos >= 0) {
					chr = sectiontext.substring(startpos, startpos + 1);
					wordBeforeComment += chr;
					startpos--;
				}
				wordBeforeComment = STRINGHANDLER.Trim(wordBeforeComment.reverse());

				chr = sectiontext.substring(endpos, endpos + 1);
				var wordAfterComment = '';
				while (!illegalChars.exists(chr) && endpos < sectiontext.length) {
					chr = sectiontext.substring(endpos, endpos + 1);
					wordAfterComment += chr;
					endpos++;
				}
				wordAfterComment = STRINGHANDLER.Trim(wordAfterComment);
				var commentText = STRINGHANDLER.Trim(commentPlaceHolder.innerHTML);

				comment.Offset = wordBeforeComment + '|' + commentText + '|' + wordAfterComment;
				//COMMENTAREA.GetStartPosForComment(commentPlaceHolder);
				comment.WordLength = commentLength;
				SERVERCONNECTION.CreateComment(USER.Username, comment.Section, comment.Page, comment.Offset, comment.WordLength,
					function(success, id) {
						if (success) {
							ACTIVECOMMENT.SetCommentId(id);
							commentPlaceHolder.id = 'commentid=' + id;
						}
					}

				);
				COMMENTPLACEHOLDER.MouseOver(commentPlaceHolder);
				COMMENTPLACEHOLDER.Click(commentPlaceHolder);
			}
			COMMENTAREA.DoComment = false;
			COMMENTAREA.CommentIcon.style.display = 'none';
		}
	}
};
COMMENTAREA.GetStartPosForComment = function(commentPlaceHolder) {
	var parent = commentPlaceHolder.parentNode;
	var innerHTML = STRINGHANDLER.Trim(parent.innerHTML);
	var pos = innerHTML.indexOf('<span id="newcomment"');
	if (isIE) {
		pos = innerHTML.indexOf('<SPAN class=comment id=newcomment');
	}
	return pos;
};
COMMENTAREA.GetSection = function(commentPlaceHolder) {
	var content = $(COMMENTAREA.ContainerId);
	var elementCounter = 0;
	COMMENTAREA.nodeFound = false;
	elementCounter = COMMENTAREA.CalculateChildNodes(content, commentPlaceHolder, elementCounter, -1)
	return elementCounter;
};
COMMENTAREA.GetSectionElement = function(elPos) {
	var content = $(COMMENTAREA.ContainerId);
	COMMENTAREA.nodeFound = false;
	COMMENTAREA.currentElement = null;
	elementCounter = COMMENTAREA.CalculateChildNodes(content, null, 0, elPos)
};
COMMENTAREA.CalculateChildNodes = function(element, currentElement, elementCounter, elementToFindPos) {
	if (!COMMENTAREA.nodeFound) {
		var innerElements = element.getElementsByTagName('*');
		for (var i = 0, iLen = innerElements.length; i < iLen; i++) {
			var innerElement = innerElements[i];
			if (COMMENTS.AcceptedCommentTags.indexOf('|' + innerElement.nodeName + '|') > -1) {
				if (elementToFindPos > -1) {
					if (elementCounter == elementToFindPos) {
						COMMENTAREA.currentElement = innerElement;
						COMMENTAREA.nodeFound = true;
						return;
					}
				} else if (innerElement == currentElement) {
					COMMENTAREA.nodeFound = true;
					return elementCounter;
				}
				elementCounter++;
			}
		}
	}
	return elementCounter;
};


COMMENTPLACEHOLDER.Init = function() {
	COMMENTPLACEHOLDER.ClassName = 'comment';
};
COMMENTPLACEHOLDER.MouseOver = function(obj) {
	if (!obj.innerHTML) {
		obj = this;
	}
	if (obj.className == '')
		return;
	ACTIVECOMMENT.Show(obj);
};
COMMENTPLACEHOLDER.MouseOut = function(obj) {
	if (!ACTIVECOMMENT.IsEditing) ACTIVECOMMENT.Hide();
};
COMMENTPLACEHOLDER.Click = function(obj) {
	ACTIVECOMMENT.StartEdit();
};
COMMENTPLACEHOLDER.SetAsDeleted = function(id) {
	var el = $('commentid=' + id);
	DOM.SetAttribute(el, 'class', 'comment-deleted');
	DOM.SetAttribute(el, 'onclick', 'javascript:;');
	DOM.SetAttribute(el, 'onmouseover', 'javascript:;');
	DOM.SetAttribute(el, 'onmouseout', 'javascript:;');
}

COMMENTS.Init = function() {
	if (PAGE.LayoutMode == 'table' || PAGE.LayoutMode == 'special') return;
	COMMENTS.AcceptedCommentTags = '|LI|P|H2|H3|H4|';
	COMMENTS.IsCommentScriptLoaded = false;
	COMMENTS.Flusher = null;
	COMMENTS.FlushCommentsRepeatTime = 10000;
	if (isIE) commentrange = document.body.createTextRange();

	var res = USER.LoadByCookie();
	var a = DOM.Create('A', '', 'btn-startdocomment');

	if (res != null) {
		COMMENTS.FlushComments();
		var delay = 100;
		setTimeout('COMMENTS.LoadCommentTools()', delay);
		setTimeout('COMMENTS.LoadCommentPlaceHolders()', delay);
		addEvent(a, 'click', COMMENTS.StartDoComment);
	} else {
		addEvent(a, 'click', ActionHandler);
	}
	COMMENTAREA.Init();
	ACTIVECOMMENT.Init();
	COMMENTPLACEHOLDER.Init();
	if (!$('btn-startdocomment')) {
		var li = DOM.Create('LI');
		DOM.SetAttribute(a, 'HREF', 'javascript:;');
		DOM.SetAttribute(a, 'TITLE', TEXTHANDLER.TextCreateComment);
		a.innerHTML = '<span>' + TEXTHANDLER.TextCreateComment + '</span>';
		DOM.Add(a, li);
		DOM.Add(li, PAGE.Tools);
	}
};
COMMENTS.FlushComments = function() {
	SERVERCONNECTION.GetComments(USER.Username,
		function(success) {
			if (success) {

			}
		}
	)
	COMMENTS.Flusher = setTimeout('COMMENTS.FlushComments()', COMMENTS.FlushCommentsRepeatTime);
};
COMMENTS.LoadCommentPlaceHolders = function() {
	var c = COMMENTHANDLER.getComments();
	for (var i = 0, iLen = c.length; i < iLen; i++) {
		if (parseInt(c[i].ID) > 0 && c[i].Section.indexOf(':') == -1) {
			COMMENTS.PlaceCommentInPage(c[i]);
		}
	}
};
COMMENTS.PlaceCommentInPage = function(comment) {
	if (PAGE.GetPageHash().indexOf(comment.Page) > -1 || comment.Page.indexOf(PAGE.GetPageHash()) > -1) {
		var words = comment.Offset.split('|')
		var elements = COMMENTAREA.Container.getElementsByTagName('*');
		for (var i = 0, iLen = elements.length; i < iLen; i++) {
			var elementContent = elements[i].innerHTML;
			if (COMMENTS.AcceptedCommentTags.indexOf('|' + elements[i].nodeName + '|') > -1) {
				if (elementContent.indexOf(words[1]) > -1) {
					var wordArray = elementContent.split(words[1]);
					var pos = 0;
					var correctElement = true;
					var contentTextBeforeComment = '';
					var contentTextAfterComment = '';
					var posFound = false;
					for (var x = 0, xLen = wordArray.length - 1; x < xLen; x++) {
						contentTextBeforeComment += wordArray[x];
						var currWordBefore = wordArray[x].substring(wordArray[x].length - words[0].length - 2, wordArray[x].length);
						pos += STRINGHANDLER.Trim(wordArray[x]).length;
						var currWordAfter = STRINGHANDLER.Trim(wordArray[x + 1]).substring(0, words[2].length + 2);
						if (currWordBefore.indexOf(words[0]) > -1 && currWordAfter.indexOf(words[2]) > -1) {
							break;
						}
						pos += STRINGHANDLER.Trim(wordArray[x + 1]).length;
						if (currWordBefore.indexOf(words[0]) == -1 || currWordAfter.indexOf(words[2]) == -1) {
							correctElement = false;
						}
						contentTextBeforeComment += words[1];
					}
					if (correctElement) {
						contentTextAfterComment = elementContent.replace(contentTextBeforeComment, '');
						contentTextAfterComment = contentTextAfterComment.substring(words[1].length, contentTextAfterComment.length);
						var id = 'commentid=' + comment.ID;
						var span = '<span class="comment" id="' + id + '" >' + words[1] + '</span>';
						elements[i].innerHTML = contentTextBeforeComment;
						elements[i].innerHTML += span;
						elements[i].innerHTML += contentTextAfterComment;
						var spans = elements[i].getElementsByTagName('span');
						for (var y = 0, yLen = spans.length; y < yLen; y++) {
							if (spans[y].className == COMMENTPLACEHOLDER.ClassName) {
								addEvent(spans[y], 'mouseover', COMMENTPLACEHOLDER.MouseOver);
								addEvent(spans[y], 'mouseout', COMMENTPLACEHOLDER.MouseOut);
								addEvent(spans[y], 'click', COMMENTPLACEHOLDER.Click);
							}
						}
					}
				}
			}
		}
	}
};
COMMENTS.StartDoComment = function() {
	COMMENTAREA.DoComment = true;
};
COMMENTS.LoadCommentTools = function() {
	var headertext = TEXTHANDLER.TextCommentFormHeader.replace('{User.Name}', USER.Name);
	var bodytext;
	var users = '', lastuser = '';
	var div = DOM.Create('div', 'comment-tools', 'comment-tools');
	if (USER.isAdmin && USER.GroupMembers.length == 1) {
		bodytext = TEXTHANDLER.TextCommentFormBodyInvitationUnused;
		div.innerHTML = '<p>' + bodytext + '</p>' +
			'<p>' +
				'<a id="btn-logout" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonLogout + '</a> ' +
				'<a style="display: none;" id="btn-start-collaborate" href="javascript:;">' + TEXTHANDLER.TextCommentFormStartCollaborate + '</a> ' +
				'<a style="display: none;" id="btn-createcomment" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonCreateComment + '</a> ' +
			'</p>';
	} else if (USER.isAdmin) {
		bodytext = TEXTHANDLER.TextCommentFormBodyInvitationUsed;
		for (var i = 0, iLen = USER.GroupMembers.length; i < iLen; i++) {
			if (USER.GroupMembers[i].Username != USER.Username) {
				users += ', ' + USER.GroupMembers[i].Name;
			}
		}
		if (users != '')
			users = users.substring(0, users.lastIndexOf(',')) + ' ' + TEXTHANDLER.TextAnd + users.substring(users.lastIndexOf(',') + 1, users.length);
		bodytext = bodytext.replace('{Users}', users);
		div.innerHTML = '<p>' + bodytext + '</p>' +
			'<p>' +
				'<a id="btn-logout" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonLogout + '</a> ' +
				'<a id="btn-start-collaborate" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonEditGroupMembers + '</a> ' +
				'<a id="btn-createcomment" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonCreateComment + '</a>' +
			'</p>';
	} else {
		bodytext = TEXTHANDLER.TextCommentFormBodyInvitedPerson;
		var moderator = '';
		for (var i = 0, iLen = USER.GroupMembers.length; i < iLen; i++) {
			if (USER.GroupMembers[i].Username != USER.Username) {
				users += USER.GroupMembers[i].Name;
				users += ', ';
				if (USER.GroupMembers[i].isAdmin) {
					moderator = USER.GroupMembers[i].Name;
				}
			}
		}
		if (users != '') users = ' ' + users.substring(0, users.lastIndexOf(','));
		bodytext = bodytext.replace('{Users}', users);
		bodytext = bodytext.replace('{Moderator}', moderator);
		div.innerHTML = '<p>' + bodytext + '</p>' +
			'<p>' +
				'<a id="btn-logout" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonLogout + '</a> ' +
				'<a id="btn-createcomment" href="javascript:;">' + TEXTHANDLER.TextCommentFormButtonCreateComment + '</a>' +
			'</p>';

	}
	DOM.Add(div, $('content'));
	if ($('btn-start-collaborate'))
		addEvent($('btn-start-collaborate'), 'click', COMMENTS.StartCollaborate);
	addEvent($('btn-createcomment'), 'click', COMMENTS.StartDoComment);
	addEvent($('btn-logout'), 'click', USERHANDLER.Logout);
};
COMMENTS.StartCollaborate = function(e) {
	var p = new POPUP();
	p.Width = 700;
	p.Height = 300;
	p.Id = 'popup-collaboration';
	p.HeaderText = TEXTHANDLER.TextCollaborateHeader;
	var divGroupMembers = '';
	divGroupMembers = '<div id="groupmembers">';
	var classname = 'left';
	if (USER.GroupMembers.length > 1) classname = 'third';
	for (var i = 0, iLen = USER.GroupMembers.length; i < iLen; i++) {
		var id = "chkMember=" + USER.GroupMembers[i].Username;
		if (USER.GroupMembers[i].Username != '') {
			if (USER.GroupMembers[i].Username != USER.Username) {
				divGroupMembers += '<p><input name="member" type="checkbox" id="' + id + '" />' +
							'<label for="' + id + '">' + USER.GroupMembers[i].Name + '</label></p>';
			}
		}
	}
	divGroupMembers += '</div>';
	p.BodyText = '<div class="' + classname + '">' +
					TEXTHANDLER.TextCollaborateBody +
				'</div>' +
				'<div class="' + classname + '">' +
					'<h2>' + TEXTHANDLER.TextCollaborateInviteSectionHeader + '</h2>' +
					'<p>' + TEXTHANDLER.TextCollaborateInviteSectionBody + '</p>' +
						'<div><textarea id="emailaddresses"></textarea></div>' +
					'<p><a href="javascript:;" id="btn-invite">' + TEXTHANDLER.TextCollaborateInviteSectionBtnText + '</a></p>' +
				'</div>';
	if (USER.GroupMembers.length > 1) {
		p.BodyText +=
				'<div class="' + classname + ' nomargin">' +
					'<h2>' + TEXTHANDLER.TextCollaborateRemoveSectionHeader + '</h2>' +
					'<p>' + TEXTHANDLER.TextCollaborateRemoveSectionBody + '</p>' +
						divGroupMembers +
					'<p><a href="javascript:;" id="btn-remove">' + TEXTHANDLER.TextCollaborateRemoveSectionBtnText + '</a></p>';
		'</div>';
	}

	p.CurrentXPos = e.screenX - 300;
	p.CurrentYPos += 20;
	p.Show();
	addEvent($('btn-invite'), 'click', COMMENTS.SendInvitation);
	if ($('btn-remove'))
		addEvent($('btn-remove'), 'click', COMMENTS.KickUser);
};
COMMENTS.KickUser = function(e) {
	var inputs = document.getElementsByTagName('input');
	var elementid = '';
	for (var i = 0, iLen = inputs.length; i < iLen; i++) {
		if (inputs[i] && inputs[i].type == 'checkbox' && inputs[i].name == 'member' && inputs[i].checked) {
			elementid = inputs[i].id;
			var user = inputs[i].id.replace('chkMember=', '');
			DOM.Remove(inputs[i]);
			SERVERCONNECTION.KickUser(user,
				function(success) {
					if (success) {
						SERVERCONNECTION.GetUsersInGroup(USER.Username,
							function(success, members) {
								if (success) {
									USER.Save();
								}

							}
						);
					}
				}
			);
		}
	}
	var labels = document.getElementsByTagName('label');
	for (var i = 0, iLen = labels.length; i < iLen; i++) {
		if (labels[i].getAttribute('for') == elementid) {
			DOM.Remove(labels[i]);
		}
	}
};
COMMENTS.SendInvitation = function(e) {
	var emailEl = $('emailaddresses');
	var emails = STRINGHANDLER.GetCleanInput(emailEl.value);
	SERVERCONNECTION.InviteUsers(USER.Username, emails,
		function(success) {
			if (success) {
				//GET UPDATED MEMBERLIST
				SERVERCONNECTION.GetUsersInGroup(USER.Username,
					function(success, members) {
						if (success) {
							USER.Save();
							//## CLOSE POPUP
							DOM.Remove($('popup-collaboration'));
							IO.Alert(TEXTHANDLER.TextInvitationSent);
						}

					}
				);
			}
		}
	);
};

ELEMENTS.InitCheckboxes = function() {
	var inputs = document.getElementsByTagName('input');
	for (var i = 0, iLen = inputs.length; i < iLen; i++) {
		if (inputs[i] && inputs[i].type == 'checkbox') {
			ELEMENTS.BuildCheckbox(inputs[i]);
		}
	}
};
ELEMENTS.BuildCheckbox = function(e) {
	var span = DOM.Create('span', 'checkbox', '');
	var temp = DOM.Create('em', '', '');
	e.parentNode.replaceChild(temp, e);
	DOM.Add(e, span);
	temp.parentNode.replaceChild(span, temp);
	addEvent(span, 'click', ELEMENTS.CheckboxOnClick);
};
ELEMENTS.CheckboxOnClick = function(e) {
	var input = this.getElementsByTagName('input')[0];
	if (!input.checked) {
		this.className = this.className + '  checked';
		input.checked = true;
	} else {
		this.className = this.className.replace('checked', '');
		input.checked = false;
	}
};

var POPUPVARIABLES = {};
POPUPVARIABLES.Counter = 0;
POPUPVARIABLES.Width = 400;
POPUPVARIABLES.Height = 300;
POPUPVARIABLES.CurrentYPos = 100;
POPUPVARIABLES.CurrentXPos = 30;
POPUPVARIABLES.YPosInc = 10;
POPUPVARIABLES.XPosInc = 10;
POPUPVARIABLES.ZIndex = 30;
POPUPVARIABLES.EventButtonClassName = 'popup-event-button';
POPUPVARIABLES.ClassName = 'popup';
POPUPVARIABLES.PopupHolderId = 'content';

function POPUP(BodyText) {
	this.HeaderText = '';
	this.BodyText = BodyText;
	this.Container = '';
	this.Counter = 0;
	this.Width = POPUPVARIABLES.Width;
	this.Height = POPUPVARIABLES.Height;
	this.CurrentYPos = POPUPVARIABLES.CurrentYPos;
	this.CurrentXPos = POPUPVARIABLES.CurrentXPos;
	this.YPosInc = POPUPVARIABLES.YPosInc;
	this.XPosInc = POPUPVARIABLES.XPosInc;
	this.Id = '';
	this.ZIndex = POPUPVARIABLES.ZIndex++;

	this.Show = function() {
		if (this.Id == '') this.Id = 'POPUP' + this.Counter;
		var el = $(this.Id);
		if (el) {
			el.style.zIndex = this.ZIndex;
			return;
		}
		this.Container = DOM.Create('div', POPUPVARIABLES.ClassName, '');
		DOM.Add(DOM.Create('DIV', 'pop-corner-tr'), this.Container);
		DOM.Add(DOM.Create('DIV', 'pop-corner-br'), this.Container);
		DOM.Add(DOM.Create('DIV', 'pop-corner-bl'), this.Container);
		DOM.Add(DOM.Create('DIV', 'pop-corner-tl'), this.Container);

		var shade = DOM.Create('DIV', 'pop-top');
		shade.style.width = parseInt(this.Width - 40) + 'px';
		DOM.Add(shade, this.Container);

		var main = DOM.Create('DIV', 'pop-main');
		main.style.width = parseInt(this.Width - 40) + 'px';
		main.style.height = parseInt(this.Height - 40) + 'px';
		DOM.Add(main, this.Container);

		var shade = DOM.Create('DIV', 'pop-bottom');
		shade.style.width = parseInt(this.Width - 40) + 'px';
		DOM.Add(shade, this.Container);

		var shade = DOM.Create('DIV', 'pop-right');
		shade.style.height = parseInt(this.Height - 40) + 'px';
		DOM.Add(shade, this.Container);

		var shade = DOM.Create('DIV', 'pop-left');
		shade.style.height = parseInt(this.Height - 40) + 'px';
		DOM.Add(shade, this.Container);

		var close = DOM.Create('DIV', 'pop-close');
		close.title = 'Close';
		close.innerHTML = '<span>' + TEXTHANDLER.TextPopupClose + '</span>';
		DOM.Add(close, this.Container);

		var popTopic = DOM.Create('H2', '', 'pop-topic');
		popTopic.innerHTML = this.HeaderText;
		DOM.Add(popTopic, this.Container);

		var popContent = DOM.Create('DIV', '', 'pop-content');
		popContent.style.width = this.Width - 68 + 'px';
		popContent.style.height = this.Height - 80 + 'px';
		popContent.innerHTML += this.BodyText;
		DOM.Add(popContent, this.Container);


		this.Container.style.top = this.CurrentYPos + 'px';
		this.Container.style.left = this.CurrentXPos + 'px';

		this.Container.style.width = this.Width + 'px';
		this.Container.style.height = this.Height + 'px';
		this.Container.id = this.Id;
		this.Container.style.zIndex = this.ZIndex;

		DOM.Add(this.Container, $(POPUPVARIABLES.PopupHolderId));
		addEvent(close, 'click', this.Close);

		this.AddListeners();

		POPUPVARIABLES.CurrentXPos += this.XPosInc;
		POPUPVARIABLES.CurrentYPos += this.YPosInc;
		POPUPVARIABLES.Counter++;
	}
	this.Close = function() {
		if ($('alertcover'))
			DOM.Remove($('alertcover'));
		if (this.parentNode) DOM.Remove(this.parentNode);
	}
	this.AddListeners = function() {
		var as = $(POPUPVARIABLES.PopupHolderId).getElementsByTagName('a');
		for (var i = 0, iLen = as.length; i < iLen; i++) {
			if (as[i].className == POPUPVARIABLES.EventButtonClassName) {
				addEvent(as[i], 'click', ActionHandler);
			}
		}
	};
};

var ActionHandler = function(actionId) {
	if (actionId == '[object MouseEvent]' || actionId == '[object]') actionId = this.id;
	switch (actionId) {
		case 'moreinfo':
		case 'new-user':
		case 'btn-startdocomment':
		case 'signup':
			var popup = new POPUP();
			popup.Id = 'popup-signup';
			popup.HeaderText = 'Sign up';
			popup.Width = 500; //special width for signup popup
			popup.Height = 340;
			popup.HeaderText = TEXTHANDLER.TextSignUpHeader;
			popup.BodyText = '<div class="left">' +
								'<p>' + TEXTHANDLER.TextSignUpBody + '</p>' +
							'</div>' +
							'<div class="right">' +
								'<p><label for="txtName">' + TEXTHANDLER.TextSignUpFieldFullName + ':</label>' +
									'<input type="text" class="text" id="txtName" /></p>' +
								'<p><label for="txtEmail">' + TEXTHANDLER.TextSignUpFieldYourEmail + ':</label>' +
									'<input type="text" class="text" id="txtEmail" /></p>' +
								'<p><label for="txtPassword">' + TEXTHANDLER.TextSignUpFieldNewPassWord + ':</label>' +
									'<input type="text" class="text" id="txtPassword" /></p>' +
								'<p><input type="checkbox" class="checkbox" id="chkAccept" />' +
									'<label for="chkAccept">' + TEXTHANDLER.TextSignUpFieldAccept + ' ' + TEXTHANDLER.TextSignUpFieldAcceptEnd + '</p>' +
								'<p><a class="' + POPUPVARIABLES.EventButtonClassName + '" id="button-signup" href="javascript:;">' + TEXTHANDLER.TextSignUpSubmitButton + '</a></p>' +
							'</div>';
			popup.Show();
		break;

		case 'haveaccount':
			var popup = new POPUP();
			popup.Id = 'popup-haveaccount';
			popup.HeaderText = TEXTHANDLER.TextLoginHeader;
			popup.BodyText = '<p><label for="txtEmailLogin">' + TEXTHANDLER.TextLoginFieldEmail + ':</label>' +
							'<input type="text" class="text" id="txtEmailLogin" /></p>' +
							'<p><label for="txtPasswordLogin">' + TEXTHANDLER.TextLoginFieldPassword + ':</label>' +
							'<input type="password" class="text" id="txtPasswordLogin" /></p>' +
							'<p><a class="button" id="login" href="javascript:;">' + TEXTHANDLER.TextLoginButtonLogin + '</a> ' +
							'<a id="lost-password" class="' + POPUPVARIABLES.EventButtonClassName + '" href="javascript:;">' + TEXTHANDLER.TextLoginLinkLostPassword + '</a>' +
							'</p>';
			popup.Show();
			addEvent($('lost-password'), 'click', ActionHandler);
		break;

		case 'lost-password':
			var popup = new POPUP();
			popup.Id = 'popup-passwordrecovery';
			popup.Height = 200;
			popup.HeaderText = TEXTHANDLER.TextRecoverPasswordHeader;
			popup.BodyText = '<p><label for="txtEmailPassword">' + TEXTHANDLER.TextLoginFieldEmail + ':</label>' +
								'<input type="text" class="text" id="txtEmailPassword" /></p>' +
							'<p><a id="recover-password" class="button" href="javascript:;">' + TEXTHANDLER.TextRecoverPasswordButtonRecover + '</a></p>';
			popup.Show();
			addEvent($('recover-password'), 'click', ActionHandler);
		break;

		case 'recover-password':
			IO.Alert(TEXTHANDLER.TextRecoverPasswordConfirmationText);
			DOM.Remove('popup-passwordrecovery');
		break;

		case 'login':
			//## LOGIN USER			
			var email = STRINGHANDLER.GetCleanInput($('txtEmailLogin').value);
			var password = STRINGHANDLER.GetCleanInput($('txtPasswordLogin').value);
			SERVERCONNECTION.AuthenticateUser(email, password,
				function(success, isGroupAdmin) {
					if (success) { //## LOGIN IS SUCCESSFUL 
						//GET ALL USERS IN GROUP AND SAVE USER INFO IN COOKIE																		
						SERVERCONNECTION.GetUsersInGroup(email,
							function(success) {
								for (var i = 0, iLen = USER.GroupMembers.length; i < iLen; i++) {
									if (email == USER.GroupMembers[i].Username) {
										var name = USER.GroupMembers[i].Name;
										var isadmin = USER.GroupMembers[i].isAdmin;
										USERHANDLER.Login(name, email, password, isadmin);
									}
								}
							}
						);
					} else { //LOGIN UNSUCCESSFUL
						IO.Alert(TEXTHANDLER.ErrorLogin);
					}
				}
			)
		break;

		case 'button-signup':
			var chkAccept = $('chkAccept');
			if (!chkAccept.checked) {
				chkAccept.focus();
				IO.Alert(TEXTHANDLER.ErrorAcceptTermsOfUse)
				return;
			}
			var username = STRINGHANDLER.GetCleanInput($('txtEmail').value);
			var name = STRINGHANDLER.GetCleanInput($('txtName').value);
			var password = STRINGHANDLER.GetCleanInput($('txtPassword').value);

			SERVERCONNECTION.CreateUser(username, name, password,
				function(success) {
					if (success) { //USER HAS BEEN CREATED											
						DOM.Remove($('popup-signup'));
						//CHECK IF USER WAS INVITED 
						//COMMENTS.StartCollaborate(this);
						IO.Alert(TEXTHANDLER.TextUserHasBeenCreated);
					} else {
						IO.Alert(TEXTHANDLER.ErrorUserCreation);
					}

				}

			);

		break;

		case 'skip-collaborate':
			DOM.Remove($('popup-collaborate'));
		break;

		case 'invite':
			IO.Alert(TEXTHANDLER.TextInvitationSent);
		break;
	};
};

function GetCommentForm() {
	var div = DOM.Create('div', '', 'menu-commentform');
	div.innerHTML += '<p>' + TEXTHANDLER.TextWelcomeBody + '</p>';
	var aMoreInfo = DOM.Create('a', '', '');
	DOM.SetAttribute(aMoreInfo, 'href', 'javascript:;');
	DOM.SetAttribute(aMoreInfo, 'id', 'moreinfo');
	aMoreInfo.innerHTML = TEXTHANDLER.TextWelcomeLinkMoreInfo;
	var aSignUp = DOM.Create('a', '', '');
	DOM.SetAttribute(aSignUp, 'href', 'javascript:;');
	DOM.SetAttribute(aSignUp, 'id', 'signup');
	aSignUp.innerHTML = TEXTHANDLER.TextWelcomeLinkSignUp;
	var aHaveAccount = DOM.Create('a', '', '');
	DOM.SetAttribute(aHaveAccount, 'href', 'javascript:;');
	DOM.SetAttribute(aHaveAccount, 'id', 'haveaccount');
	aHaveAccount.innerHTML = TEXTHANDLER.TextWelcomeLinkHaveAccount;
	addEvent(aMoreInfo, 'click', ActionHandler);
	addEvent(aHaveAccount, 'click', ActionHandler);
	addEvent(aSignUp, 'click', ActionHandler);
	var ul = DOM.Create('ul', '', '');
	var li1 = DOM.Create('li', '', '');
	DOM.Add(aMoreInfo, li1);
	DOM.Add(li1, ul);
	var li2 = DOM.Create('li', '', '');
	DOM.Add(aSignUp, li2);
	DOM.Add(li2, ul);
	var li3 = DOM.Create('li', '', '');
	DOM.Add(aHaveAccount, li3);
	DOM.Add(li3, ul);
	DOM.Add(ul, div);
	return div;
};

function ChangeOpacity(el, opacity) {
	var image = document.getElementById(el);
	if (!image)
		return;
	if (isIE) {
		image.style.filter = "alpha(opacity=" + opacity + ")";
	} else {
		image.style.MozOpacity = (opacity / 100);
	}
	if (opacity < 1) {
		DOM.Remove($(el));
	}
};

function FadeElement(el, milli, start, end) {
	if (!$(el)) return;
	var fadeTime = Math.round(milli / 100);
	var i = 0;  // Fade Timer
	if (start < end) {
		for (j = start; j <= end; j++) {
			var expr = "ChangeOpacity('" + el + "'," + j + ")";
			var timeout = i * fadeTime;
			setTimeout(expr, timeout);
			i++;
		}
	} else if (start > end) {
		for (j = start; j >= end; j--) {
			var expr = "ChangeOpacity('" + el + "'," + j + ")";
			var timeout = i * fadeTime;
			setTimeout(expr, timeout);
			i++;
		}
	}
};



var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
function md5_vm_test(){
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
function core_md5(x, len) {
	x[len >> 5] |= 0x80 << ((len) % 32);
	x[(((len + 64) >>> 9) << 4) + 14] = len;
	var a = 1732584193;
	var b = -271733879;
	var c = -1732584194;
	var d = 271733878;
	for (var i = 0; i < x.length; i += 16) {
		var olda = a;
		var oldb = b;
		var oldc = c;
		var oldd = d;
		a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
		d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
		c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
		b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
		a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
		d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
		c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
		b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
		a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
		d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
		c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
		b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
		a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
		d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
		c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
		b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);

		a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
		d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
		c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
		b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
		a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
		d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
		c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
		b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
		a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
		d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
		c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
		b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
		a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
		d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
		c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
		b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);

		a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
		d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
		c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
		b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
		a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
		d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
		c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
		b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
		a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
		d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
		c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
		b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
		a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
		d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
		c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
		b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);

		a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
		d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
		c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
		b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
		a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
		d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
		c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
		b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
		a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
		d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
		c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
		b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
		a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
		d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
		c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
		b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);

		a = safe_add(a, olda);
		b = safe_add(b, oldb);
		c = safe_add(c, oldc);
		d = safe_add(d, oldd);
	}
	return Array(a, b, c, d);
};
function md5_cmn(q, a, b, x, s, t) {
	return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}
function md5_ff(a, b, c, d, x, s, t) {
	return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t) {
	return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t) {
	return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t) {
	return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
function core_hmac_md5(key, data) {
	var bkey = str2binl(key);
	if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
	var ipad = Array(16), opad = Array(16);
	for (var i = 0; i < 16; i++) {
		ipad[i] = bkey[i] ^ 0x36363636;
		opad[i] = bkey[i] ^ 0x5C5C5C5C;
	}
	var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
	return core_md5(opad.concat(hash), 512 + 128);
}
function safe_add(x, y) {
	var lsw = (x & 0xFFFF) + (y & 0xFFFF);
	var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
	return (msw << 16) | (lsw & 0xFFFF);
}
function bit_rol(num, cnt) {
	return (num << cnt) | (num >>> (32 - cnt));
}
function str2binl(str) {
	var bin = Array();
	var mask = (1 << chrsz) - 1;
	for (var i = 0; i < str.length * chrsz; i += chrsz)
		bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
	return bin;
}
function binl2str(bin) {
	var str = "";
	var mask = (1 << chrsz) - 1;
	for (var i = 0; i < bin.length * 32; i += chrsz)
		str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask);
	return str;
}
function binl2hex(binarray) {
	var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
	var str = "";
	for (var i = 0; i < binarray.length * 4; i++) {
		str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
           hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
	}
	return str;
}
function binl2b64(binarray) {
	var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	var str = "";
	for (var i = 0; i < binarray.length * 4; i += 3) {
		var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16)
                | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8)
                | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
		for (var j = 0; j < 4; j++) {
			if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
			else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
		}
	}
	return str;
}
