/**
 * Javascript SEO Tools Web Client
 * 
 * copyright Maurizio Tidei & Jürgen Pospischil, 2010
 */

/**
 * Class Cache
 */
function Cache() {
	
	Cache.instance = null;
	this.positions = new Array();
	this.keywords = new Array();
	this.userKeywords = new Array();
	this.domains = null;
	this.settings = new Array();
	this.limitsMonitoring = new Array();
	this.reportSettings = new Array();
	this.userSettings = new UserSettings(1, false, "","");
	this.userKeywordCount = 0;
	
	this.selectedDomainUID = null;
	this.selectedDomainInfo = null;
	this.selectedKeyword = null;
	this.selectedSearchEngine = null;
	this.currentWeek = null;
	this.weeks = null;
	this.weeksToDisplayOffset = 0;
	this.searchEngines = null;
	
	this.currentPage = 0;
	this.tableString = "";
	this.tableSettings = new Object();
	this.currentStep = '';
	
	this.tries = 0;
	
	this.showKeywordCheckboxes = false;
	
	this.setWeeks = function(weeks) {
		this.weeks = weeks;
		
		for(var i in weeks) {
			this.weeks[i] = this.weeks[i];
		}
	};
	
	this.getWeeks = function() {
		return this.weeks;
	};
	
	this.getWeeksToDisplay = function() {
		var weeksToDisplayArray = new Array();
		var weeksToDisplay = this.getWeeksToDisplayCounted(4);
		for(var i in weeksToDisplay) {
			weeksToDisplayArray.push(weeksToDisplay[i]);
		}
		return weeksToDisplayArray;
	};
	
	this.getWeeksToDisplayExtended = function() {
		var weeksToDisplayArray = new Array();
		var nb = 8;
		if(this.getMonitoringLimit("history") == 5) {
			nb = 5;
		}
		var weeksToDisplay = this.getWeeksToDisplayCounted(nb);
		for(var i in weeksToDisplay) {
			weeksToDisplayArray.push(weeksToDisplay[i]);
		}
		return weeksToDisplayArray;
	};
	
	this.getWeeksToDisplayCounted = function(count) {
		var weeks = new Object();
		for(var i = this.weeks.length - count - this.weeksToDisplayOffset; i <= this.weeks.length - 1 - this.weeksToDisplayOffset; i++) {
			weeks[i] = this.weeks[i];
		}
		return weeks;
	};
	
	this.setCurrentWeek = function(week) {
		this.currentWeek = parseInt(week);
	};
	
	this.getWeekDifference = function(week) {
		week = parseInt(week);
		var result;
		if(week > this.currentWeek) {
			result = this.currentWeek - week + 53;
		}
		else {
			result = this.currentWeek - week;
		}
		
		return result;
	};
	
	/**
	 * @return 1  week2 newer
	 *         -1 week1 newer
	 *         0  equal
	 */
	this.compareWeeks = function(week1, week2) {
		if(week1 == null) {
			return 1;
		}
		
		var diff1 = this.getWeekDifference(week1);
		var diff2 = this.getWeekDifference(week2);
		if(diff1 > diff2) {
			return 1;
		}
		else if(diff1 < diff2) {
			return -1;
		}
		else {
			return 0;
		}
	};
	
	this.getMonitoringLimit = function(limit) {
		if(this.limitsMonitoring['domains'] == null) {
			$.ajax( {
				type : "POST",
				url : "/Programme/SuiteUI/GUI.php",
				data : "action=getUserProductLimit&group=1&limit="+limit,
				async : false,
				success : function(result) {
					checkSession(result);
					var limits = eval('(' + result + ')');
					for(id in limits) {
						Cache.getSingleton().limitsMonitoring[id] = limits[id];
					}
				}
			});
		}
		
		var result = 0;
		if(this.limitsMonitoring[limit] != null) {
			result = this.limitsMonitoring[limit]; 
		}
		
		if(limit == "domains") {
			result = parseInt(result) + this.domainLimitExtra;
			//alert(result);
		}
		
		return result;
	};
	
	this.isDemoSuite = function() {
		if(this.getMonitoringLimit("demo") == "1") {
			return true;
		}
		else {
			return false;
		}
	};
	
	this.getKeywordInfo = function(keywordUID) {
		return this.keywords[keywordUID];
	};
	
	this.addPositions = function(domainUID, positions) {
		if(this.positions[domainUID] == null) {
			this.positions[domainUID] = new Array();
		}
		var keywordCount = 0;
		var rowsArray = positions.split(";");	
		for ( var row = 0; row < rowsArray.length; row++) {
			var colsArray = rowsArray[row].split(",");
			var currentKeywordInfo;
			switch(colsArray[0]) {
			case 'P':
				this.addPosition(domainUID, new Position(colsArray[1],colsArray[2],colsArray[3],colsArray[4],colsArray[5]));
				break;
			case 'KU':
				if(this.userKeywords[domainUID] == null) {
					this.userKeywords[domainUID] = new Array();
				}
				this.userKeywords[domainUID][colsArray[1]] = true;
				// continue with K, no break
			case 'K':
				currentKeywordInfo = new KeywordInfo(colsArray[1],colsArray[2],colsArray[3],colsArray[4],colsArray[5]);
				this.keywords[colsArray[1]] = currentKeywordInfo;
				keywordCount++;
				if(this.selectedDomainInfo != null && this.selectedDomainInfo.allKeywordsAreScanned && currentKeywordInfo.scan > 0) {
					this.selectedDomainInfo.allKeywordsAreScanned = false;
				}
				break;
			case 'L':
				var labels = colsArray[1].split("#");
				for(var i in labels) {
					currentKeywordInfo.labels[labels[i]] = true;
				}
				break;
			case 'S':
				currentKeywordInfo.addSearchEngineData(colsArray[1],colsArray[2],colsArray[3],colsArray[4],colsArray[5]);
				break;
			}
		}
		return keywordCount;
	};
	
	this.addPosition = function(domainUID, position) {
		if(this.positions[domainUID] == null) {
			this.positions[domainUID] = new Array();
		}
		this.positions[domainUID].push(position);
	};
	
	/**
	 * @param domainUID the uid of the domain
	 * @param callback a function called after server response if data is not in cache
	 * @return the positions array for the domain
	 */
	this.getPositions = function(domainUID, callback, searchEngines) {
		
		var uncachedSe = this.getSettings(domainUID).getUncachedSe(searchEngines);
		if(uncachedSe.length > 0 && !isDomainInfo()) {
			if(callback != null) {
				this.getPositionsFromServer(domainUID, callback, uncachedSe);
			}
			return null;
		}
		return this.positions[domainUID];
	};  
	
	this.getPositionsFromServer = function(domainUID, callback, searchEngines) {
		
		showAjaxLoading(true);
		
		$.ajax( {
			type : "POST",
			url : "/Programme/SuiteUI/GUI.php",
			data : "action=getPositionsData&id="+domainUID+"&se="+searchEngines.join("-"),
			async : true,
			success : function(result, status, c) {
				showAjaxLoading(false);
				Cache.getSingleton().tries = 0;
				checkSession(result);
				Cache.getSingleton().addPositions(domainUID, result);
				Cache.getSingleton().getSettings(domainUID).addCachedSe(searchEngines);
				if(callback != null) eval(callback);
			},
			error: function(jqXHR, textStatus, errorThrown) {
				//alert(textStatus);
				//Cache.getSingleton().tries++;
				//if(Cache.getSingleton().tries <= 1) {
				//	Cache.getSingleton().getPositionsFromServer(domainUID, callback, searchEngines);
				//}
				//else {
					alert("Die Verbindung wurde währed der Abfrage zurückgesetzt. Versuchen Sie es bitte später nochmals.");
					$("#tabs").tabs('select', 0);
				//}
			}
		});
	};
	
	this.getUnscannedPositionsFromServer = function(callback) {
		
		var domainUID = this.getSelectedDomainInfo().uid;
		
		var unscannedKeywords = new Array();
		for(keywordUID in this.keywords) {
			var keywordInfo = this.keywords[keywordUID];
			if(!keywordInfo.wasScanned()) {
				unscannedKeywords.push(keywordUID);
			}
		}
		
		if(unscannedKeywords.length > 0) {
			showAjaxLoading(true, Text.msgRefreshing);
			$.ajax( {
				type : "POST",
				url : "/Programme/SuiteUI/GUI.php",
				data : "action=getPositionsDataForKeywords&id="+domainUID+"&keywords="+unscannedKeywords.join("|"),
				async : true,
				success : function(result) {
					showAjaxLoading(false);
					checkSession(result);
					if(result == "") {
						showMessage("#refreshResult", Text.msgKeywordsUnscanned, 5000);
					}
					else {
						var keywordsCount = Cache.getSingleton().addPositions(domainUID, result);
						buildKeywordOverviewTable();
						if(keywordsCount > 1) {
							showMessage("#refreshResult", keywordsCount + " " + Text.msgKeywordsScanned, 5000);
						}
						else {
							showMessage("#refreshResult", keywordsCount + " " + Text.msgKeywordScanned, 5000);
						}
						//eval(callback);
					}
				}
			});
		}
		else {
			showMessage("#refreshResult", "Alle Keywords sind bereits auf dem aktuellen Stand!", 5000);
		}
	};
	
	this.addDomains = function(domains) {
		
		var resArray = domains.split("###");
		this.setWeeks(resArray[0].split("|"));
		domains = resArray[1];
		
		var domainNames = new Array();
		this.domainLimitExtra = 0;
		
		this.searchEngines = new Array();
		this.domains = new Array();
		var rowsArray = domains.split(";");
		for ( var row = 0; row < rowsArray.length; row++) {
			var colsArray = rowsArray[row].split(",");
			var currentDomainInfo;
			switch(colsArray[0]) {
			case 'D': // domain data
				currentDomainInfo = new DomainInfo(colsArray[1],colsArray[2]);
				this.domains.push(currentDomainInfo);
				var settings = new DomainSettings(colsArray[1], colsArray[2], colsArray[3], colsArray[4], colsArray[5], colsArray[6], colsArray[7], colsArray[8], colsArray[9], colsArray[10]);
				this.addSettings(settings);
				
				var name = colsArray[2];
				name = name.replace(/^http:\/\/(www\.)?/, '');
				if(domainNames[name] === true) {
					this.domainLimitExtra++;
				}
				
				domainNames[name] = true;
				
				break;
			case 'S': // search engine data
				currentDomainInfo.addSearchEngineData(colsArray[1],colsArray[2].split("|"),colsArray[3].split("|"));
				if(arrayIndexOf(this.searchEngines, colsArray[1]) == -1) {
					this.searchEngines.push(colsArray[1]);
				}
				break;
			case 'R': // report settings
				this.reportSettings[colsArray[1] + "-" + colsArray[2]] = new ReportSettings(colsArray[3], colsArray[4], colsArray[5]);
				break;
			case 'US': // user settings
				this.userSettings = new UserSettings(colsArray[1], colsArray[2], colsArray[3], colsArray.slice(4));
				break;
			case 'UKC': // user keyword count
				this.userKeywordCount = parseInt(colsArray[1]);
			}
		}
	};
	
	this.getDomains = function(callback) {
		if(this.domains == null) {
			this.getDomainsFromServer(callback);
			return null;
		}
		return this.domains;
	};
	
	this.getDomainsCount = function() {
		if(this.domains == null) {
			this.getDomainsFromServer();
		}
		return this.domains.length;
	};
	
	this.getDomainsFromServer = function(callback, domainUID) {
		showAjaxLoading(true);
		
		var action;
		if(getUrlParam("module") == "reports") {
			action = "getReportSettings";
		}
		else {
			action = "getUserDomainOverview";
		}
		
		if(domainUID == null) {
			domainUID = "";
		}
		
		this.domains = new Array();
		$.ajax( {
			type : "POST",
			url : "/Programme/SuiteUI/GUI.php",
			data : "action=" + action + "&domainUID=" + domainUID,
			async : (callback != null),
			success : function(result) {
				checkSession(result);
				Cache.getSingleton().addDomains(result);
				showAjaxLoading(false);
				if(callback != null) eval(callback);
			}
		});
	};
	
	
	this.setSelectedDomainUID = function(domainUID) {
		this.selectedDomainUID = domainUID;
		
		for(var i in this.domains) {
			var domain = this.domains[i];
			if(domain.uid == domainUID) {
				this.selectedDomainInfo = domain;
				break;
			}
		}
		
		Cache.getSingleton().weeksToDisplayOffset = 0;
	};
	
	this.getNextDomainUID = function(dir) {
		
		var currentDomainIndex = -1;
		for(var i in this.domains) {
			var domain = this.domains[i];
			if(domain.uid == this.selectedDomainUID) {
				currentDomainIndex = parseInt(i);
				break;
			}
		}
		
		var maxDomains = 1;
		if(!isDemo()) {
			maxDomains = this.getMonitoringLimit('domains');
		}
		var nextDomainIndex = currentDomainIndex + dir;
		if(nextDomainIndex < 0 || nextDomainIndex >= this.domains.length || nextDomainIndex+1 > maxDomains) {
			return [-1,-1];
		}
		else {
			return [this.domains[nextDomainIndex].uid, nextDomainIndex];
		}
		
	};
	
	this.getSelectedDomainUID = function() {
		if(this.selectedDomainUID == null) {
			this.selectedDomainUID = this.domains[0].uid;
		}
		return this.selectedDomainUID;
	};
	
	this.getSelectedDomainInfo = function() {
		if(this.selectedDomainInfo == null && this.domains != null) {
			this.setSelectedDomainUID(this.domains[0].uid);
		}
		return this.selectedDomainInfo;
	};
	
	this.setSelectedKeyword = function(keyword) {
		this.selectedKeyword = keyword;
	};
	
	this.getSelectedKeyword = function() {
		return this.selectedKeyword;
	};
	
	this.setSelectedSearchEngine = function(se) {
		this.selectedSearchEngine = se;
	};
	
	this.getSelectedSearchEngine = function() {
		return this.selectedSearchEngine;
	};
	
	this.getSearchEngines = function() {
		
		if(this.searchEngines == null) {
			this.getDomainsFromServer();
		}
		
		return this.searchEngines;
	};
	
	this.addSettings = function(settings) {
		if(this.settings[settings.domainUID] != null) {
			settings.cachedSe = this.settings[settings.domainUID].cachedSe; 
		}
		this.settings[settings.domainUID] = settings;
	};
	
	this.getSettings = function(domainUID) {
		return this.settings[domainUID];
	};
	
	this.getLabelName = function(labelNb) {
		
		var color = labelNb;
		labelNb = parseInt(labelNb);
		
		switch(labelNb) {
		case 0: color = "Blaue"; break;
		case 1: color = "Grüne"; break;
		case 2: color = "Rote"; break;
		case 3: color = "Orangene"; break;
		case 4: color = "Gelbe"; break;
		case 5: color = "Graue"; break;
		}
		
		return color + " Favoriten";
	};
}

/**
 * @return Cache
 */
Cache.getSingleton = function() {
	if(Cache.instance == null) {
		Cache.instance = new Cache();
	}
	return Cache.instance;
};

/**
 * Class Position
 */
function Position(keywordUID, week, system, position, page) {
	this.keywordUID = parseInt(keywordUID);
	this.week = week;
	this.system = system;
	this.position = parseInt(position);
	this.page = page;
	if(this.page == "") {
		this.page = "/";
	}
}

/**
 * Class DomainInfo
 */
function DomainInfo(uid, name) {
	this.uid  = uid;
	this.name = name;
	
	this.nbOfKeywords = new Array();
	this.avgPosition = new Array();
	
	this.availableSearchEngines =  new Array("1", "2", "3", "6", "7", "10", "9", "5");
	
	this.allKeywordsAreScanned = true;
	
	this.addSearchEngineData = function(se, nbOfKeywords, avg) {		
		this.nbOfKeywords[se] = nbOfKeywords;
		this.avgPosition[se]  = avg;
		
		//if(arrayIndexOf(this.availableSearchEngines, se) == -1) {
		//	this.availableSearchEngines.push(se);
		//}
	};
}

/**
 * Class KeywordInfo
 */
function KeywordInfo(uid, name, scan, searchDepth, languageCode) {
	this.uid = uid;
	this.name = name.replace("<<K>>", ",");
	this.scan = parseInt(scan);
	this.searchDepth = parseInt(searchDepth) + 20;
	this.languageCode = languageCode;
	
	this.cpc = new Array();
	this.pages = new Array();
	this.searchesLocal = new Array();
	this.searchesGlobal = new Array();
	
	this.labels = new Array();
	
	this.addSearchEngineData = function(se, cpc, pages, searchesLocal, searchesGlobal) {
		this.cpc[se] = cpc;
		this.pages[se] = pages;
		this.searchesLocal[se] = searchesLocal;
		this.searchesGlobal[se] = searchesGlobal;
	};
	
	this.wasScanned = function() {
		return (this.scan == 0);
	};
	
	this.getLowerSearchDepth = function(currentDepth) {
		return currentDepth>this.searchDepth ? this.searchDepth : currentDepth; 
	};
	
	this.getMaxSearchesLocal = function(searchEngines) {
		
		var maxSearches = 0;
		for(var i in this.searchesLocal) {
			if(searchEngines == "*" || arrayIndexOf(searchEngines, i) != -1) {
				var searches = this.searchesLocal[i];
				if(searches != null && parseInt(searches) > maxSearches) {
					maxSearches = searches;
				}
			}
		}
		return parseInt(maxSearches); 
	};
	
	this.isVisible = function() {
		return (this.labels[-1] == null || this.labels[-1] == false);
	};
	
	this.getVisibilityIcon = function() {
		
		var icon = "remove";
		var desc = Text.hideKeyword;
		//var action = "setLabel(" + this.uid + ", -1)";
		var action = "showHideKeywordDialog(" + this.uid + ")";
		if(!this.isVisible()) {
			icon = "add";
			desc = "Keyword wieder aufnehmen";
			action = "unsetLabel(" + this.uid + ", -1)";
		}
		
		var result = "<a title=\"" + desc + "\" href=\"javascript:" + action + "\">"
		+ "<img border=\"0\" src=\"/images/gui/" + icon + ".png\"/></a> ";
		
		return result;
	};
	
	this.getLabelIcons = function() {
		var result = '<span class="labels" id="labels' + this.uid + '">';
		//result += this.getVisibilityIcon();
		var max = Cache.getSingleton().getMonitoringLimit('labels');
		for(var i = 0; i < max; i++) {
			
			var icon;
			switch(i) {
			case 0: icon = "blue"; break;
			case 1: icon = "green"; break;
			case 2: icon = "red"; break;
			case 3: icon = "orange"; break;
			case 4: icon = "yellow"; break;
			case 5: icon = "gray"; break;
			}
			
			var action;
			var active = false;
			var desc = "Markierung setzen (" + Cache.getSingleton().getLabelName(i) +  ")";
			if(this.labels[i] != null && this.labels[i] == true) {
				active = true;
				desc = "Markierung entfernen (" + Cache.getSingleton().getLabelName(i) + ")";
				icon += "-active";
				action = "unsetLabel(" + this.uid + "," + i + ")";
			}
			else {
				icon += "-inactive";
				action = "setLabel(" + this.uid + "," + i + ")";
			}
			
			if(!isReport()) {
				result += "<a title=\"" + desc + "\" href=\"javascript:" + action + "\">"
				+ "<img border=\"0\" src=\"/images/gui/label-" + icon + ".png\"/></a>";
			}
			else {
				result += "<img border=\"0\" src=\"/images/gui/label-" + icon + ".png\"/>";
			}
		}
		
		if(max == 0) {
			result = "- &nbsp;";
		}
		
		result += "</span>";
		return result;
	};
	
	this.setLabel = function(label, active) {
		this.labels[label] = active;
		var icons = this.getLabelIcons();
		$('span[id=labels' + this.uid + ']').each(function() {$(this).replaceWith(icons);});
	};
}

function setLabel(keywordUID, label, active) {
	
	if(active == null) {
		active = true;
	}
	
	if(keywordUID > 0 || isNaN(keywordUID)) { // regular keyword
		
		
		var keywordUIDArray = new Array();
		
		if(isNaN(keywordUID)) {
			keywordUIDArray = keywordUID.split(",");
		}
		else {
			keywordUIDArray.push(keywordUID);
		}
			
		for(var i in keywordUIDArray) {
			currentKeywordUID = keywordUIDArray[i];
			
			var keywordInfo = Cache.getSingleton().getKeywordInfo(currentKeywordUID);
			
			if(label >= 0) {
				keywordInfo.setLabel(label, active);
			}
			else if(label == -1 || label == -2) {
				//alert("Are you sure?");
				keywordInfo.labels[label] = active;
				$('#labels' + currentKeywordUID).parents('tr').remove();
				
				if(label == -2) {
					delete Cache.getSingleton().keywords[currentKeywordUID];
				}
			}
		}
		
		var $tabs = $('#tabs').tabs();
		var selected = $tabs.tabs('option', 'selected');
		switch(selected) {
		case 1:
			//buildKeywordOverviewTable(null, null, true);
					
			if($("#diagramOverlay").length == 0 && ($("select#mode").val() == 'positionfav' || $("select#mode").val() == 'positionfavsep')) {
				var position = $("#canvas").offset();
				//var height = $("#canvas").height();
				var width = $("#canvas").width();
				if(width > 980) width = 980;
				var height = $("#canvas").height();
				var opacity = 0.8;
				
				$('#canvas').after("<div id=\"diagramOverlay\"></div>");
				//, 'background-color':'#000'
				$('#diagramOverlay').css({'display': 'block', 'top': position.top, 'left': position.left, 'opacity': opacity, 'width':width, 'height':height, 'position':'absolute' });
				$('#diagramOverlay').html("<center><br>Favoriten geändert<br><br><input type=\"button\" onclick=\"$('#diagramOverlay').remove();buildKeywordOverviewTable(null, null, true);\" value=\"Diagramm jetzt aktualisieren\"></center>");
			}
			break;
		case 2:
			//buildSingleKeywordGui(null, true);
			break;
		}
		
		// save to db
		if(loggedIn() && !Cache.getSingleton().isDemoSuite()) {
			showAjaxLoading(true, "Einstellung wird gespeichert...", false);
			$.ajax( {
				type : "POST",
				url : "/Programme/SuiteUI/GUI.php",
				data : "action=setLabel&domainUID=" + Cache.getSingleton().getSelectedDomainUID() + "&keywordUID=" + keywordUID + "&label=" + label + "&active=" + active,
				async : true,
				success : function(result) {
					showAjaxLoading(false);
					checkSession(result);
					var resArray = result.split("###");
					if (resArray[1] == "true") {
						if(label == -2) {
							Cache.getSingleton().userKeywordCount = resArray[2];
							updateKeywordCount();
						}
					}
					else {
						showMessage('#labels' + keywordUID, '<span class="msgError">An error occurred saving your label, please try again later.</span>', 6000);
					}
				}
			});
		}
	}
	else if(keywordUID == 0) { // filter was set
		if(!loggedIn()) {
			showRegistrationHint();
			return;
		}
		
		
		var cache = Cache.getSingleton();
		var keywordInfo = cache.getSettings(cache.getSelectedDomainUID()).keywordInfo;
		keywordInfo.setLabel(label, active);
		var $tabs = $('#tabs').tabs();
		var selected = $tabs.tabs('option', 'selected');
		switch(selected) {
		case 1:
			buildKeywordOverviewTable();
			break;
		case 2:
			updateKeywordSelect();
			break;
		}
		
	}
	else { // multiple keywords control
		
		showAjaxLoading(true, "Einstellung wird gespeichert...", true);
		var cache = Cache.getSingleton();
		cache.keywordInfoLabelManagement.setLabel(label, active);
		
		// set label for all selected keywords
		var keywordUIDs = "";
		$('input.kcb[type=checkbox]:checked').each(function() {
			var id = $(this).parent().attr('id');
			keywordUIDs += id + ",";
		});
		keywordUIDs = rtrim(keywordUIDs, ",");
		if(keywordUIDs != "") {
			setLabel(keywordUIDs, label, active);
		}
	}
}

function unsetLabel(keywordUID, label) {
	setLabel(keywordUID, label, false);
}

/**
 * Class DomainSettings
 */
function DomainSettings(domainUID, name, depth, se, columns, searches, mode, diagramMode, labels, reportLanguage) {
	
	this.domainUID = domainUID;
	this.name = name;
	this.depth = depth;
	this.se = se;
	this.columns = columns;
	this.searches = searches;
	this.mode = mode;
	this.keywordInfo = new KeywordInfo(0, ""); // used to store labels filter
	this.cachedSe = new Array();
	this.reportLanguage = reportLanguage;
	
	//this.setLabelsFromString(labels);
	if(labels != null) {
		for(var i = 0; i < 3; i++) {
			if(labels[i] == '1') {
				this.keywordInfo.labels[i] = true;
			}
			else {
				this.keywordInfo.labels[i] = false;
			}
	}
	}
	this.diagramMode = diagramMode;
	
	
	this.toPostParams = function() {
		return "id="+this.domainUID+"&depth="+this.depth+"&se="+this.se+"&columns="+this.columns+"&searches="+this.searches+"&mode="+this.mode+"&diagramMode="+this.diagramMode+"&labels="+this.getLabelsAsString();
	};
	
	this.getDepth = function() {
		return (this.depth == '') ? 999 : this.depth;
	};
	
	this.getSE = function() {
		var se;
		if(this.se != '') {
			se = this.se;
		}
		else {
			se = this.getSeTldBased();
			
		}
		return se;
	};
	
	this.getUncachedSe = function(demandedSe) {
		var uncachedSe = new Array();
		for(var i in demandedSe) {
			if(arrayIndexOf(this.cachedSe, demandedSe[i]) == -1) {
				uncachedSe.push(demandedSe[i]);
			}
		}
		return uncachedSe;
	};
	
	this.addCachedSe = function(searchEngines) {
		for(var i in searchEngines) {
			if(arrayIndexOf(this.cachedSe, searchEngines[i]) == -1) {
				this.cachedSe.push(searchEngines[i]);
			}
		}
		this.cachedSe.push(searchEngines);
	};
	
	this.getSeTldBased = function(addNonGoogle) {
		
		var se = getSeForDomain(this.name);
		
		if(addNonGoogle != false) {
			//se += "-4-5";
			//se += "-5";
		}
		return se;
	};
	
	this.getSearches = function() {
		return (this.searches == '') ? 0 : this.searches;
	};
	
	this.getMode = function() {
		return (this.mode == '') ? 'osr' : this.mode;
	};
	
	this.getLabelsAsString = function() {
		var string = "";
		for(var i = 0; i < 3; i++) {
			if(this.keywordInfo.labels[i] != null && this.keywordInfo.labels[i] == true) {
				string += "1";
			}
			else {
				string += "0";
			}
		}
		return string;
	};
	
	this.setLabelsFromString = function(string) {
		for(var i = 0; i < 3; i++) {
			if(string[i] == '1') {
				this.keywordInfo.labels[i] = true;
			}
			else {
				this.keywordInfo.labels[i] = false;
			}
		}
	};
}

function ReportSettings(period, se, singleSE, language) {
	this.period = period;
	this.se = se;
	this.singleSE = singleSE;
	this.language = language;
}

function UserSettings(searchEngine, onlyUserKeywords, irrelevantSearchEngines, additionalSettings) {
	
	this.allAvailableSearchEngines = new Array("1", "2", "3", "6", "10", "9", "7", "5");
	
	this.setIrrelevantSearchEngines = function(irrelevantSearchEngines) {
		
		if(irrelevantSearchEngines != null) {
			this.irrelevantSearchEngines = irrelevantSearchEngines;
		}
		else {
			this.irrelevantSearchEngines = [""];
		}
		
		this.availableSearchEngines = new Array();
		for(i in this.allAvailableSearchEngines) {
			var se = this.allAvailableSearchEngines[i];
			if(arrayIndexOf(this.irrelevantSearchEngines, se) == -1) {
				this.availableSearchEngines.push(se);
			}
		}
	};
	
	this.serializeSettings = function() {
		var pairs = new Array();
		for(var key in this.settings) {
			pairs.push(key + ":" + this.settings[key]); 
		}
		return pairs.join(",");
	};
	
	
	this.searchEngine = searchEngine;
	this.onlyUserKeywords = onlyUserKeywords;
	this.setIrrelevantSearchEngines(irrelevantSearchEngines.split("-"));
	
	// better way to save settings, very easy to extend
	this.settings = new Array();
	if(additionalSettings != null && additionalSettings != "") {
		var additionalSettingsArray = additionalSettings;//.split(",");
		for(var i = 0; i < additionalSettingsArray.length; i++) {
			var pair = additionalSettingsArray[i].split(":");
			this.settings[pair[0]] = pair[1];
		}	
	}
	
	// defaults
	if(this.settings['pageSize'] == null) {
		this.settings['pageSize'] = 500;
	}
	
	if(this.settings['subdomains'] == null) {
		this.settings['subdomains'] = 'none';
	}
}


/**
 * DomainOverview Tab functions
 */
function buildDomainOverviewTable() {
	
	//var se = $("select#se").val();
	
	var cache = Cache.getSingleton();
	var domains = cache.getDomains("buildDomainOverviewTable()");
	if(domains != null) {
		var table = "<table id=\"mainTable\" class=\"tablesorter\" cellspacing=\"1\">";
		var weeks = cache.getWeeks();
		
		var weeksHeader = new Array();
		var weeksLabelsChart = new Array();
		var weeksToDisplay = cache.getWeeksToDisplayExtended();
		
		// todo: use better indicator
		if(!isReport()) {
			// remove current week
			weeks = weeks.slice(0, -1); 
			weeksToDisplay = weeksToDisplay.slice(0, -1);
		}
		for(i in weeksToDisplay) {	
			weeksHeader[i] = "20" + weeksToDisplay[i]; 
		}
		for(i in weeks) {
			weeksLabelsChart[i] = "20" + weeks[i]; 
		}
		
		var seUIDs = new Array();
		var allSeUIDs = new Array();
		
		var maxDomains = cache.getMonitoringLimit('domains');
		
		var weeksHeaderString = '<th class="{sorter: \'currency\'} title="' + Text.weekHelp + '">' + weeksHeader.join('</th><th class="{sorter: \'currency\'} title="' + Text.weekHelp + '">') + "</th>";
		
		table += "<thead><tr><th>" + Text.domain + '</th><th title="' + Text.searchEngineHelp + '">' + Text.searchEngine + "</th>" + weeksHeaderString;
		table += "<th>" + Text.trend + "</th><th>in %</th>";
		
		if(!isReport()) {
			table += "<th>" + Text.actions + "</th>";
		}
		
		table += "</tr></thead><tbody>";
		var domainNb = 0;
		for(row in domains) {

			domainNb++;
			var domain = domains[row];
			var domainSettings = cache.getSettings(domain.uid);
			var se = domainSettings.getSE();
			var nbOfRows = 0;
			
			if(domainNb > maxDomains) {
				if(!isReport()) {
					table += "<tr>";
					table += 	"<td>" + getTableActions([domain.name + "#" + domain.name + "#openUrl"], "openUrl") + "" + domain.name.replace(new RegExp("^http://", "g"), "") + "</td>";
					table += 	"<td colspan=\"10\"><i>Bitte auf ein größeres Paket <a id=\"link\" href=\"/application/seo-suite-account.php?page=activate\">upgraden</a>.</i></td>";
					table += 	"<td>" + getTableActions(["showDeleteDomainDialog#" + Text.actionDeleteDomain + "#deleteDomain"],domain.uid) + "</td>";
					table += "</tr>";
				}
			}
			else {
				for(seUID in domain.avgPosition) {
					
					if(arrayIndexOf(allSeUIDs, seUID) == -1) {
						allSeUIDs.push(seUID);
					}
					//if(se != "*" && se != seUID && se != null) {
					//	continue;
					//}
					
					table += "<tr>";
					table += 	"<td>" + getTableActions([domain.name + "#" + domain.name + "#openUrl"], "openUrl") + " <a class=\"actionlink\" href=\"javascript:showDomainKeywords(" + domain.uid + "," + seUID + ")\" title=\"" + Text.actionShowKeywords + "\">" + domain.name.replace(new RegExp("^http://", "g"), "") + "</a></td>";
					table += 	"<td>" + getSearchEngineName(seUID) + "</td>";
					for(i in weeks) {
						if(arrayIndexOf(weeksToDisplay, weeks[i]) != -1) {
							table += 	"<td>" + domain.avgPosition[seUID][i] + "</td>";
						}
					}
					
					var trend = 0;
					var oneWeekAgo  = domain.avgPosition[seUID][weeks.length-1];
					var twoWeeksAgo = domain.avgPosition[seUID][weeks.length-2];
					if(oneWeekAgo != null && twoWeeksAgo != null && twoWeeksAgo != 0) {
						trend = (oneWeekAgo / twoWeeksAgo - 1) * 100;
					}
					
					var img = getTrendImage(trend);
					trend = parseInt(trend);
					
					if(trend >= 0) {
						trend = "+" + trend;
					}
								
					table += "<td>" + img + "</td><td>"  + trend + "%</td>";
					
					//table += 	"<td>" + domain.avgPosition[seUID].join("</td><td>") + "</td>";
					if(!isReport()) {
						table += 	"<td>" + getTableActions(["showDeleteDomainDialog#" + Text.actionDeleteDomain + "#deleteDomain"],domain.uid) + getTableActions(["showDomainKeywords#" + Text.actionShowKeywords],domain.uid + "#" + seUID) + "</td>";
					}
					table += "</tr>";
					
					if(arrayIndexOf(seUIDs, seUID) == -1) {
						seUIDs.push(seUID);
					}
					
					nbOfRows++;
				}
				if(nbOfRows == 0) {
					table += '<tr title="' + Text.noResultsSoFarHelp + '">';
					table += 	"<td>" + getTableActions([domain.name + "#" + domain.name + "#openUrl"], "openUrl") + " <a class=\"actionlink\" href=\"javascript:showDomainKeywords(" + domain.uid + "," + seUID + ")\" title=\"" + Text.actionAddKeywords + "\">" + domain.name.replace(new RegExp("^http://", "g"), "") + "</a></td>";
					table += 	'<td>' + Text.noResultsSoFar + "</td>";
					for(i in weeksToDisplay) {
						table += 	"<td></td>";
					}
					
					table += "<td>" + getTrendImage(0) + "</td><td>+0%</td>";
					if(!isReport()) {
						table += 	"<td>" + getTableActions(["showDeleteDomainDialog#" + Text.actionDeleteDomain + "#deleteDomain"],domain.uid) + getTableActions(["showDomainKeywords#" + Text.actionAddKeywords], domain.uid) + "</td>";
					}
					table += "</tr>";
				}
			}
		}
		table += "</tbody></table>";
		
		$('#tableDiv').html(table);
		//$.tablesorter.defaults.sortList = [[1,0]];
		
		$("#tableDiv tr[title],#tableDiv th[title]").tooltip({  
		    position: "top center",  
		    offset: [-2, 10],  
		    effect: "fade",  
		    opacity: 0.9,  
		    tip: '.tooltip',
		    predelay:300
		});
		
		
		var msg = "";
		if(cache.getDomainsCount() > 0) {
			$('#tableDiv table').tablesorter({sortList: [[0,0]]});
			$('#message').html("");
			
			if(cache.getDomainsCount() >= maxDomains) {
				$('#addTableContent').css('height', '80px');
				$('#addTable input').attr('disabled', true);
				$('#addDomainLimit').html("Das Limit von " + maxDomains + " Domains für das aktive Paket wurde erreicht.<br>" +
					"Zum hinzufügen weiterer Domains bitte auf ein größeres Paket <a id=\"link\" href=\"/application/seo-suite-account.php?page=activate\" style=\"text-decoration:underline;\">upgraden</a>.");
			}
			else {
				$('#addTableContent').css('height', '60px');
				$('#addTable input').attr('disabled', false);
				$('#addDomainLimit').html("");
			}
		}
		else {
			showHighlightedMessage("#message", Text.noDomainsMessage);
			$('#addDomain').accordion( 'activate' , 0 );
			$('#addTableContent').css('height', '60px');
			$('#addTable input').attr('disabled', false);
			$('#addDomainLimit').html("");
		}
				
		// build chart		
		$("#chartTitle").html(Text.allDomainsChartTitle + " &sup1 " + '<img id="help" src="/images/gui/help.png">');
		//$("#help").attr('title', Text.osrHelp);
		$("#help").tooltip({  
		    position: "bottom center",  
		    offset: [-2, 10],  
		    effect: "fade",  
		    opacity: 0.9,  
		    tip: '.tooltipOSR',
		    predelay:0
		});
		var chart = new Chart();
		chart.init();
		chart.setXAxis(Text.time, weeksLabelsChart);
		//chart.setYAxis(Text.position, 1, 0, -1);
		chart.setYAxis(Text.osrAllDomains, 0, 0);
		for(seUIDIndex in seUIDs) {
			var seUID = seUIDs[seUIDIndex];
			var seAvg = new Array();
			for(weekIndex in weeks) {
				//var week = weeks[weekIndex];
				var weekSum = 0;
				var nb = 0;
				var weekAvg = null;
				for(row in domains) {
					var domain = domains[row];
					if(domain.avgPosition[seUID] != null && domain.avgPosition[seUID][weekIndex] != "") {
						var position = domain.avgPosition[seUID][weekIndex];
						//weekSum += parseInt(position);
						weekSum += parseFloat(position);
						nb++;
					}
				}
				if(nb != 0) {
					//var weekAvg = weekSum / nb;
					var weekAvg = Math.round(weekSum*100)/100; // OSR
				}
				seAvg.push(weekAvg);
			}
			chart.addSeries(getSearchEngineName(seUID), seAvg, getSearchEngineColor(seUID));
		}
				
		chart.draw(false, "line");
		if(!isReport()) {
			$('#annotations').html("<br>&sup1 " + Text.allDomainsAnnotation);
		}
		else {
			$('#tableDiv').append(" <span style=\"display:none;\">Report ist erstellt</span>");
		}
		
		//Event tracking
		trackEvent('UI', 'buildAllDomainsTab', '#domains:' + domains.length);
	}
}

function getSearchEngineName(uid) {
	
	if(uid != null) {
		var uidList = uid.split("-");
		var nameList = new Array();
		
		for(uidIndex in uidList) {
			seUID = uidList[uidIndex];
			switch(seUID) {
			case '1': nameList.push("google.de"); break;
			case '2': nameList.push("google.ch"); break;
			case '3': nameList.push("google.at"); break;
			case '4': nameList.push("yahoo.de"); break;
			case '5': nameList.push("bing.de"); break;
			case '6': nameList.push("google.com"); break;
			case '7': nameList.push("google.co.uk"); break;
			case '9': nameList.push("google.fr"); break;
			case '10': nameList.push("google.it"); break;
			case '13': nameList.push("google.com (hl=de)"); break;
			case '14': nameList.push("google.com (hl=fr)"); break;
			case '15': nameList.push("google.com (hl=it)"); break;
			
			case '*': nameList.push("alle"); break;
			}
		}
		
	return nameList.join(",");
	}
}

function getSearchEngineColor(uid) {
	switch(uid) {
	case '1': return "#007FE8";//"#1851CE";
	case '2': return "#D62408";
	case '3': return "#109618";
	case '4': return "#7B0099";
	case '5': return "#FFA614";
	case '6': return "#000000";
	case '7': return "#7E7E7E";
	case '9': return "#5CD216";
	case '10': return "#2FD0CD";
	case '*': return "#464646";
	}
}

function getLabelColor(uid) {
	switch(uid) {
	case '0': return "#007FE8";
	case '1': return "#109618";
	case '2': return "#D62408";
	case '3': return "#FFA614";
	case '4': return "#D4D523";
	case '5': return "#555555";
	}
}

function getLanguageName(uid) {
	
}

function getLanguageFromCode(code, extended) {
	var lang;
	switch(code) {
	case '1': lang = "Englisch"; break;
	case '33': lang = "Französisch"; break;
	case '39': lang = "Italienisch"; break;
	case '49': lang = "Deutsch"; break;
	}
	
	if(extended) {
		switch(code) {
		case '1': lang += " (google.com und google.co.uk)"; break;
		case '33': lang += " (google.fr)"; break;
		case '39': lang += " (google.it)"; break;
		case '49': lang += " (google.de,.ch,.at und bing.de)"; break;
		}	
	}
	
	return lang;
}

function getSECodesFromLanguage(languageCode) {
	
	var codes;
	
	switch(languageCode) {
	case '1': codes = [6,7]; break;
	case '33': codes = [9]; break;
	case '39': codes = [10]; break;
	case '49': codes = [1,2,3,5]; break;
	}
	
	return codes;
}

function doesLanguageMatchSEFilter(languageCode, SEFilterArray) {
	
	var matches = false;
		
	for(i in SEFilterArray) {
		var se = SEFilterArray[i];
		if(arrayIndexOf(getSECodesFromLanguage(languageCode), se) != -1) {
			matches = true;
			break;
		}
	}
	
	return matches;
}

function getTrendImage(trend) {
	
	var src = "nochange";
	
	trend = parseInt(trend);
	if(trend > 10) {
		src = "rising2";
	}
	else if(trend > 1) {
		src = "rising";
	}
	else if(trend < -10) {
		src = "falling2";
	}
	else if(trend < -1) {
		src = "falling";
	}
	
	return "<img src=\"/images/gui/" + src + ".png\">";
}

function deleteDomain(domainUID) {
	showAjaxLoading(true, Text.msgDeletingDomain, false);
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=deleteDomain&id=" + domainUID,
		async: false,
		success : function(result) {
			showAjaxLoading(false);
			checkSession(result);
			Cache.getSingleton().addDomains(result);
			buildDomainOverviewTable();
			showMessage('#addDomainResult', 'Domain deleted.');
		}
	});
}

function showDomainKeywords(domainUID, seUID) {
	Cache.getSingleton().setSelectedDomainUID(domainUID);
	$("select#se").val(seUID);
	$("#tabs").tabs('select', 1);
}

function nextDomain(dir) {
	
	var cache = Cache.getSingleton();
	var nextDomainUID = cache.getNextDomainUID(dir);
	if(nextDomainUID[0] != -1) {
		cache.setSelectedDomainUID(nextDomainUID[0]);
		buildGui();
	}
}

function setDomain(domainUID) {
	var cache = Cache.getSingleton();
	cache.setSelectedDomainUID(domainUID);
	buildGui();
}

function addDomain() {
	var domain = $("#domain").val();
	domain = trim(domain);
	domain = domain.replace(new RegExp("^http://", "g"), "");
	showAjaxLoading(true, Text.msgAddingDomain);
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=addDomain&domain=" + domain,
		async : true,
		success : function(result) {
			showAjaxLoading(false);
			checkSession(result);
			var resArray = result.split("###");
			if (resArray[1] == "true") {
				$("#domain").val('');
				showMessage('#addDomainResult', '<span class="msgSuccess">'+Text.msgDomainAdded+'<br><br><br></span>', 15000);
				Cache.getSingleton().addDomains(resArray[2]+"###"+resArray[3]);
				buildDomainOverviewTable();
			}
			else if(resArray[1] == "dup") {
				showMessage('#addDomainResult', '<span class="msgError">'+Text.msgDomainDup+'</span>');
			}
			else if(resArray[1] == "toLong") {
				showMessage('#addDomainResult', '<span class="msgError">'+Text.msgDomainToLong+'</span>');
			}
			else {
				showMessage('#addDomainResult', '<span class="msgError">'+Text.msgDomainInvalid+'</span>');
			}
		}
	});
	
	trackEvent('UI', 'addDomain', domain);
}
 
/**
 * Keyword Overview Tab functions
 */
function KeywordOverviewTableRow() {
	
	this.keywordUID;
	this.keyword;
	this.system;
	this.positions = new Array();
	this.positionsEstimated = new Array();
	this.positionsInterpolated = new Array();
	this.page;
	this.noPosition = false;
	
	this.addPosition = function(week, position) {
		this.positions[week] = position;
	};
}

function buildKeywordOverviewTable(subselection, keywordUID, onlyDiagram) {
	
	if(subselection == null || subselection instanceof Object) {
		if(reportSubselection == null) {
			var $tabs = $('#subsection').tabs();
			var selected = $tabs.tabs('option', 'selected');
			subselection = selected;
		}
		else {
			subselection = reportSubselection;
		}
	}
	
	switch(subselection) {
	case 0: subselection = 'positionsDomain'; break;
	case 1: subselection = 'positionsPages'; break;
	case 2: subselection = 'distribution'; break;
	}
	
	var cache = Cache.getSingleton();
	var selectedDomainInfo = cache.getSelectedDomainInfo();
	var filterSE = $("select#se").val();
	if(filterSE == null) filterSE = ["*"];
	var positions = cache.getPositions(selectedDomainInfo.uid, 'buildKeywordOverviewTable("' + subselection + '",' + keywordUID + ')', filterSE);
	
	if(positions != null) {
		showAjaxLoading(true, '', 'progress');
		setTimeout('proceedBuildingKeywordOverviewTable("' + subselection + '",' + keywordUID + ',' + onlyDiagram + ')', 0);
	}
}

function proceedBuildingKeywordOverviewTable(subselection, filterKeywordUID, onlyDiagram) {
	
	var startTime1 = new Date().getTime();
	
	var cache = Cache.getSingleton();
	var selectedDomainInfo = cache.getSelectedDomainInfo();
	
	var filterSE = $("select#se").val();
	if(filterSE == null) filterSE = ["*"];
	if(!$.isArray(filterSE)) {
		filterSE = [filterSE];
	}
	
	
	var filterSEMap = new Array();
	for(var i in filterSE) {
		var se = filterSE[i];
		filterSEMap[se] = 1;
	}
	
	if(!loggedIn()) {
		//checkLimitations();
	}
	
	var mode = $("select#mode").val();
	if(filterKeywordUID != null) {
		mode = 'position';
	}
	if(isDomainInfo()) {
		mode = 'position';
	}
	
	var filterDepth = $("select#depth").val();
	if(filterDepth != null) {
		filterDepth = parseInt(filterDepth);
	}
	else {
		filterDepth = 999;
	}
	
	var filterSearches = $("select#searches").val();
	filterSearches = parseInt(filterSearches);
	var tableColumns = $("select#tableColumns").val();
//	var diagramMode = $("select#diagramMode").val();
//	if(diagramMode == null) {
//		diagramMode = 'se'; 
//	}
	var showHidden = false;
	if($("input#showHidden").size() > 0) {
		showHidden = $("input#showHidden")[0].checked;
	}
	if(showHidden) {
		$("#addSelectedKeywords").css("display", "inline");
	} 
	else {
		$("#addSelectedKeywords").css("display", "none");
	}
	
	var filterText = "";
	if($("#textFilter").length != 0 && $("#textFilter").val() != "" && $("#textFilter").val() != Text.filterText) {
		filterText = $("#textFilter").val();
		if(filterText == "*") {
			filterText = "\\*";
		}
		
		try {
			"".match(filterText);
		}
		catch(e) {
			showMessage("#info", "Invalid regular expression: " + e, 5000);
			alert("Invalid regular expression: " + e);
			showAjaxLoading(false);
			return;
		}
	}
	
	var labelsFilterActive = false;
	var labelsFilter = [];
	domainSettings = cache.getSettings(selectedDomainInfo.uid);
	if(domainSettings != null) {
		labelsFilter = domainSettings.keywordInfo.labels;
		for(var i in labelsFilter) {
			if(labelsFilter[i] == true) {
				labelsFilterActive = true;
				break;
			}
		}
	}
	
	if(subselection == 'positionsPages') {
		$("#tableMode").hide();
		tableColumns = "page";
	}
	else {
		$("#tableMode").show();
	}
	
	// prev/next domain navigation
	var nextDomainUID = cache.getNextDomainUID(1);
	var prevDomainUID = cache.getNextDomainUID(-1);
	
	var domainName = '';
	if(!isReport()) {
		if(prevDomainUID[0] != -1) {
			var name = cache.domains[prevDomainUID[1]].name;
			$("#prevDomain").html('<a href="javascript:nextDomain(-1)" title="Zurück zu ' + name + '"><img src="/images/navigate_left.png" border="0"></a> ');
		}
		else {
			$("#prevDomain").html('<img src="/images/navigate_left_disabled.png" border="0" title="Dies ist die erste Domain."> ');
		}
	
		//domainName += selectedDomainInfo.name.replace(new RegExp("^http://", "g"), "");
		//domainName += buildDomainSelect(selectedDomainInfo.uid);
	
		if(nextDomainUID[0] != -1) {
			var name = cache.domains[nextDomainUID[1]].name;
			$("#nextDomain").html(' <a href="javascript:nextDomain(1)" title="Weiter zu ' + name + '"><img src="/images/navigate_right.png" border="0"></a>');
		}
		else {
			$("#nextDomain").html('<img src="/images/navigate_right_disabled.png" border="0" title="Dies ist die letzte Domain.">');
		}
	
		$("#domainName select").val(selectedDomainInfo.uid);
	}
	
	var positions = cache.getPositions(selectedDomainInfo.uid, null, filterSE);
	if(positions != null) {
		
		var weeks = cache.getWeeks();
		var week1 = weeks[weeks.length-1];
		var week2 = weeks[weeks.length-2];
		
		if(subselection == 'distribution') {
			var distribution = new Array();
			
			var nbOfRanges = 10;
			if(filterDepth < 50) nbOfRanges = 5;
			//var step = Math.round(filterDepth / nbOfRanges);
			var step = 10;
			var distributionRanges = new Array();
			for(var i = 1; i <= nbOfRanges; i++) {
				distributionRanges.push(step*i);
			}
		}
		
		var indexCurrentWeek = weeks.length-1;
		var index1WeekAgo    = weeks.length-2;
		var distinctKeywords = new Array();
		var distinctKeywordsNb = 0;
		
		var averages = new Array();
		var tableRowsArray = new Array();
		
		// prepare table data
		var debug = "";
		cache.tableRows = new Array();
		var keywordUIDs = new Array();
		var positionsAvailable = false;
		var overallFirstPositionWeek = 999999;
		
		var keys = new Array();
		var keys2 = new Array();
		
		var blockNb, blocksNb, j;
		var clumpy = new Clumpy();
		clumpy.
		set({
		    between: function () {
				if(cache.currentStep == 'K1') {
					var progress = blockNb/blocksNb;
			       	showProgress('K1', progress);
				}
		    }
		}).for_loop(
			function () { 
				blockNb = 0; 
				for(row in positions) {
					keys.push(row);
				}
				blocksNb = Math.ceil(keys.length / 1000);	
				cache.currentStep = 'K1';
			},
			function () { return blockNb < blocksNb; },
			function () { blockNb++; },
			function() {
				for(j = blockNb * 1000; j < (blockNb+1)*1000 && j < keys.length; j++) {
					var key = keys[j];
					var position = positions[key];
					
					positionsAvailable = true;
					
					var keywordInfo = cache.getKeywordInfo(position.keywordUID);
					
					if(keywordInfo == null) {
						continue;
					}
					
					// Single keyword filter
					if(filterKeywordUID != null && filterKeywordUID != position.keywordUID) {
						continue;
					}
					
					// In normal mode, do not show hidden keywords, in management mode, show only hidden
					if(!keywordInfo.isVisible() && !showHidden || keywordInfo.isVisible() && showHidden) {
						continue;
					}
					
					// Mode: For OSR we need the search volume
					//if(mode == "osr" && (keywordInfo.searchesGlobal[position.system] == null || keywordInfo.searchesGlobal[position.system] == 0)) {
						//keywordInfo.searchesGlobal[position.system] = 1;
					//	continue;
					//}
					
					// Search Engine filter
					if(filterSEMap["*"] == null && filterSEMap[position.system] == null) {
						continue;
					}
					
					keywordUIDs[position.keywordUID] = true;
					
					// Local Searches filter
					if(filterSearches != 0 && keywordInfo.getMaxSearchesLocal(filterSE) < filterSearches) {
						continue;
					}
					
					// Label filter
					var labelMatched = null;
					for(var i in labelsFilter) {
						if(labelsFilter[i] == true) {
							labelMatched = false;
							if(keywordInfo.labels[i] == true) {
								labelMatched = true;
								break;
							}
						}
					}
					if(labelMatched === false) {
						continue;
					}
					
					// Regexp text filter
					if(filterText != "") {
						var isUserKeyword = false;
						if(cache.userKeywords[selectedDomainInfo.uid] != null && cache.userKeywords[selectedDomainInfo.uid][keywordInfo.uid] != null) {
							isUserKeyword = true;
						}
						var keyword = keywordInfo.name;
						
						if(isUserKeyword) {
							keyword = "* " + keyword;
						}
						
						try {
							var result = keyword.match(filterText);
							if(!result) {
								continue;
							}
						}
						catch(e) {
						}
					}
					
					var key = position.keywordUID + "#" + position.system;
					if(subselection == "positionsPages") {
						key += "#" + position.page;
					}
					
					if(cache.tableRows[key] == null) {
						var tableRow = new KeywordOverviewTableRow();
						tableRow.keywordUID = position.keywordUID;
						tableRow.system		= position.system;
						tableRow.page		= position.page;
						tableRow.addPosition(position.week, position.position);
						cache.tableRows[key] = tableRow;
					}
					else {
						if(cache.tableRows[key].positions[position.week] == null || position.position < cache.tableRows[key].positions[position.week]) {
							cache.tableRows[key].addPosition(position.week, position.position);
							cache.tableRows[key].page = position.page;
						}
					}
					
					//$('#debug').html(debug);
				}
			}
		).
		once(
			function() {
				
				// add table rows for user keywords not in positions
				// but only if label filter is not active
				// and not in hidden keywords management
				if(filterKeywordUID == null && cache.userKeywords[selectedDomainInfo.uid] != null && typeof(window.disableForcedOwnKeywords) == 'undefined') {
					for(keywordUID in cache.userKeywords[selectedDomainInfo.uid]) {
						
						positionsAvailable = true;
						
						if(keywordUIDs[keywordUID] == null) {
							
							var keywordInfo = cache.getKeywordInfo(keywordUID);
							
							if(keywordInfo == null) {
								continue;
							}
							
							// Text filter
							if(filterText != "") {
								 var keyword = "* " + keywordInfo.name;
								 try {
									 var result = keyword.match(filterText);
									 if(!result) {
										 continue;
									 }
								 }
								 catch(e) {
								 }
							}
							
							// Label filter
							var labelMatched = null;
							for(var i in labelsFilter) {
								if(labelsFilter[i] == true) {
									labelMatched = false;
									if(keywordInfo.labels[i] == true) {
										labelMatched = true;
										break;
									}
								}
							}
							if(labelMatched === false) {
								continue;
							}
							
							// was keyword hidden?
							if(!showHidden && !keywordInfo.isVisible() || showHidden && keywordInfo.isVisible()) {
								continue;
							}
							
							// Search Engine filter
							if(!doesLanguageMatchSEFilter(keywordInfo.languageCode, filterSE)) {
								continue;
							}
							
							var tableRow = new KeywordOverviewTableRow();
							tableRow.keywordUID = keywordUID;
							tableRow.system = filterSE.join("-");
							cache.tableRows[keywordUID] = tableRow;
						}
					}
				}
			} 
		).
		set({
		    between: function () {
				if(cache.currentStep == 'K2') {
					var progress = blockNb/blocksNb;
					showProgress('K2', progress);
				}
		       	
		    }
		}).
		for_loop(
			//// computation of table rows ////
			function () { 
				blockNb = 0;
				for(row in cache.tableRows) {
					keys2.push(row);
				}
				blocksNb = Math.ceil(keys2.length / 100);
				cache.currentStep = 'K2';
			},
			function () { return blockNb < blocksNb; },
			function () { blockNb++; },
			function() {
				for(j = blockNb * 100; j < (blockNb+1)*100 && j < keys2.length; j++) {
					var key = keys2[j];
			
					var tableRow = cache.tableRows[key];
					var keywordInfo = cache.getKeywordInfo(tableRow.keywordUID);
					
					var isUserKeyword = false;
					if(cache.userKeywords[selectedDomainInfo.uid] != null && cache.userKeywords[selectedDomainInfo.uid][keywordInfo.uid] != null) {
						isUserKeyword = true;
					}
					
					var allPositionsOverDepth = true;
					var lastPosition = null;
					var tmpPositions = new Array();
					
					//find first week with a value
					var firstPositionWeek = null;
					var firstPositionValue = null;
					for(i in weeks) {
						if(tableRow.positions != null && tableRow.positions[weeks[i]] != null) {	
							firstPositionWeek = i;
							firstPositionValue = tableRow.positions[weeks[i]];
							break;
						}
					}
					
					if(firstPositionWeek != null && firstPositionWeek < overallFirstPositionWeek) {
						overallFirstPositionWeek = firstPositionWeek;
					}
					
					for(i in weeks) {
						var interpolated = false; 
						var position = '';
						var tdClass = '';
						var tdTitle = '';
						
						if(tableRow.positions != null && tableRow.positions[weeks[i]] != null) {
							position = tableRow.positions[weeks[i]];
							if(parseInt(position) <= filterDepth){
								allPositionsOverDepth = false;
							}
						}
						else {
							tableRow.positionsEstimated[weeks[i]] = true;
								
							// value missing
							if(i == indexCurrentWeek) {
								// value missing for current week, check if keyword was already scanned
								if(keywordInfo.wasScanned()) {
									position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
									tableRow.positionsEstimated[weeks[i]] = false;
								}
								else {
									position = lastPosition;
								}
							}
							else {
								// value missing for older week
								if(firstPositionWeek != null) {
									if(parseInt(firstPositionWeek) > parseInt(i)) {
										// we don't have an older position, so we guess it was not scanned and set it to the first known position
										position = firstPositionValue;
									}
									else {
										// we had a position for an older week: check if a position for newer week exists
										// find first week with a value
										var nextPositionWeek = null;
										var nextPositionValue = null;
										for(k = parseInt(i)+1; k < weeks.length; k++) {
											if(tableRow.positions != null && tableRow.positions[weeks[k]] != null) {	
												nextPositionWeek = k;
												nextPositionValue = tableRow.positions[weeks[k]];
												break;
											}
										}
										var lastPositionWeek = null;
										var lastPositionValue = null;
										for(k = parseInt(i)-1; k >= 0; k--) {
											if(tableRow.positions != null && tableRow.positions[weeks[k]] != null) {	
												lastPositionWeek = k;
												lastPositionValue = tableRow.positions[weeks[k]];
												break;
											}
										}
										
										// if this is a real gap between two known positions, interpolate
										if(nextPositionWeek != null) {
											var interpolationWeeks = nextPositionWeek - lastPositionWeek;
											var interpolationStep = (nextPositionValue - lastPositionValue) / interpolationWeeks;
											var interpolatedValue = lastPositionValue + (parseInt(i) - lastPositionWeek) * interpolationStep;
											interpolatedValue = Math.round(interpolatedValue);
											position = interpolatedValue;
											tableRow.positionsEstimated[weeks[i]] = false;
											if($("#x").html() == "wise") {
												tableRow.positionsInterpolated[weeks[i]] = true;
											}
										}
										else {
											// we assume it was scanned but > max
											position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
											tableRow.positionsEstimated[weeks[i]] = false;
										}
									}
								}
								else {
									// no position data at all so far for this keyword
									tableRow.noPosition = true;
									position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
								}
							}
						}
						
						positionOrig = position;
						lastPosition = position;
						
						if(parseInt(position) > keywordInfo.getLowerSearchDepth(filterDepth)) {
							position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
						}
						
						// OSR (Organic Serp Ranking) Calculation
						/*if(mode == "osr") {
							var searchesGlobal = keywordInfo.searchesGlobal[tableRow.system];
							if(searchesGlobal != null) {
								// Log10(searches) / (0,1*(x+0,9))^1,5
								//position = Math.log(searchesLocal)/Math.LN10/Math.pow((0.1*position+0.9),1.5);
								osr = Math.log(searchesGlobal)/Math.pow((0.1*position+0.9),1.5);
							}
							else {
								osr = 0;
							}
							osr = Math.round(position*100)/100;
							tableRow.osrs[weeks[i]] = osr;
						}
						*/
						
						tableRow.positions[weeks[i]] = position;
												
						// collect distribution data if this is one of the two desired weeks
						if(subselection == 'distribution' && position <= parseInt(filterDepth) && (weeks[i] == week1 || weeks[i] == week2)) {
							if(distribution[weeks[i]] == null) {
								distribution[weeks[i]] = new Array();
								for(x in distributionRanges) {
									distribution[weeks[i]].push(0);
								}
							}
							var rangeIndex = -1;
							for(x in distributionRanges) {
								var rangeLimit = distributionRanges[x];
								if(position <= rangeLimit) {
									rangeIndex = x;
									break;
								}
							}
							if(rangeIndex != -1) {
								distribution[weeks[i]][rangeIndex]++;
							}
						}
					}
					
					
					if(!allPositionsOverDepth || (isUserKeyword && typeof(window.disableForcedOwnKeywords) == 'undefined')) {
									
						tableRowsArray.push(tableRow);
						
						if(distinctKeywords[keywordInfo.uid] == null) {
							distinctKeywords[keywordInfo.uid] = 1;
							distinctKeywordsNb++;
						}
						
						// collect data for diagram
						if(!allPositionsOverDepth && mode != "osr" && tableRow.system != null && tableRow.system != "*") {
							var keys = new Array();
							for(week in tableRow.positions) {
								position = tableRow.positions[week];
								
								keys.length = 0;
								if(mode == 'position') {
									keys.push(tableRow.system);
								}
								else {
									for(var i in keywordInfo.labels) {
										if(i >= 0 && keywordInfo.labels[i] == true) {
											if(mode == 'positionfavsep') {
												keys.push(i);
											}
											else {
												keys.push(tableRow.system);
												break;
											}
										}
									}
								}
								
								for(var i in keys) {
									var key = keys[i];
									if(averages[key] == null) {
										averages[key] = new Array();
									}
									if(averages[key][week] == null) {
										averages[key][week] = new Array();
									}
									averages[key][week].push(position);
								}
							}
						}
					}
				}
			}
		).
		set({
		    between: function () {}
		}).
		once(
			function() {
				cache.currentStep = 'K3';
				showProgress('K3', 1);
			
				//// sort data ////
				//tableRowsArray.sort(function(a,b) {return a.positions[16] - b.positions[16];});
				cache.tableRows = tableRowsArray;
				if(!isReport()) {
					sortKeywordOverviewTableRows('currentpos#1');
					
					if(window.location.href.indexOf('www.seo-keyword-tools.de') != -1) {
					
						for(var row in cache.tableRows) {
							
							if(row > 15) {
								var tableRow = cache.tableRows[row];
								var keywordInfo = cache.getKeywordInfo(tableRow.keywordUID);
								var length = keywordInfo.name.length;
								var newName = "";
								for(var i = 0; i < length; i++) {
									if(i == 0) {
										newName += keywordInfo.name.charAt(i); 
									}
									else if(keywordInfo.name.charAt(i) != " ") {
										newName += "x";
									}
									else {
										newName += " ";
									}
								}
								keywordInfo.name = newName;
							}
						}
					}
				}
				else {
					sortKeywordOverviewTableRows(reportSortMethod);
				}
				
				//// build html table string ////
				cache.currentPage = 0;
				buildKeywordOverviewTableString(mode, tableColumns, subselection, filterDepth, filterKeywordUID);
			}
		).
		sleep(10).
		once(
			function() {
		
				var table = cache.tableString;	
				
				if(onlyDiagram !== true) {
					
					if(isDemo()) {
						//'<a id="showOldWeeksLink" href="#" onclick="javascript:$(\'.oldweek\').show(); $(\'#showOldWeeksLink\').fadeOut();"><b>Positionen der vergangenen Woche anzeigen</b></a><br><br>'
						$('#tableDiv').html(
						"<h2>Auszug der Daten aus dem Suchmaschinen Ranking Modul der WISE SEO Suite</h2>"		
						+ table
						+ "<br><br><br>");
					}
					else {
						$('#tableDiv').html(table);
						if(cache.showKeywordCheckboxes) {
							$('span[sort]').html('<input class="kcb" type="checkbox">');
						}
						
						var domainInfo = cache.getSelectedDomainInfo();
						if(domainInfo != null) {
							var settings = cache.getSettings(domainInfo.uid);
					
							if($('#quickSettings').size() == 0) {
					    		$('#tableControlsDiv').before('<div id="quickSettings">' +
				    			'<input type="text" id="textFilter" title="' + Text.filterTextHelp + '" value="' + Text.filterText + '">' + buildLabelsSelect(settings.keywordInfo) +
				    			'</div>');
					    		$('#textFilter').tooltip({opacity: 0.9, tip:'.tooltip', offset:[-5,0], predelay:300});
					    		$('#textFilter').keyup(applyTextFilter);
					    		$('#textFilter').focus(function() {if(this.value == Text.filterText) this.value = "";});
					    		$('#textFilter').blur(function() {if(this.value == "") this.value = Text.filterText;});
							}
				    		
				    		$('#textFilter').width($('#keywordTh').outerWidth() + 2);
						}
					}
					
					if(!isReport()) {
						
						var tableControls = "";
						if(!isDomainInfo()) {
							tableControls += "Zeit: " + buildWeekSelect();
						}
						tableControls += "&nbsp; Sortierung: " + buildSortSelect();
						
						tableControls += "&nbsp; Zeilen: " + buildPageSelect(cache.userSettings.settings['pageSize'], cache.tableRows.length) + " / " + cache.tableRows.length;
						$('#tableControlsDiv').html(tableControls);
						$('#tableControlsFiltersDiv').show();
						$('#page').change(function() {
							var page = $('#page').val();
							showKeywordOverviewTablePage(page);
						});
						
						$('#sort').change(function() {
							var sort = $('#sort').val();
							$('#page').val(1);
							showKeywordOverviewTablePage(1, null, sort);
						});
						
						$('#week').change(function() {
							Cache.getSingleton().weeksToDisplayOffset = $('#week').val();
							showKeywordOverviewTablePage();
						});
					}
					
					
					// use tablesorter only if all table rows are displayed (no paging)
					if(false) {
						if(distinctKeywordsNb > 0) {
							//$('#tableDiv table').tablesorter({headers: {2: {sorter:"currency"}}});
							
							if(!isReport() || typeof(window.sortColumn) == 'undefined') {
								sortColumn = 2 + nbOfWeeks;
								if(isDomainInfo()) {
									sortColumn -= 1;
								}
							}
							if(!isReport() || typeof(window.sortOrder) == 'undefined') {
								sortOrder = 0;
								//if(mode == 'osr') {
								//	sortOrder = 1;
								//}
							}
							
							$('#tableDiv table').tablesorter({'sortList': [[sortColumn, sortOrder]]});
						}
						else {
							$('#tableDiv table').tablesorter();
						}
					}
								
					$("#tableDiv th[title],#tableDiv td[title][id]").tooltip({  
					    position: "top center",  
					    offset: [-2, 10],  
					    effect: "fade",  
					    opacity: 0.9,  
					    tip: '.tooltip',
					    lazy: true,
					    predelay:300
					});
				}
				if(positionsAvailable) {
					$('#message').html('');
				}
				else {
					if(Cache.getSingleton().userSettings.onlyUserKeywords == 1) {
						showHighlightedMessage("#message", Text.noOwnKeywordsMessage);
					}
					else {
						
						var msg = Text.noPositionsMessage;
						
						if(Cache.getSingleton().userSettings.irrelevantSearchEngines[0] != "") {
							
							var ses = "";
							for(var i in Cache.getSingleton().userSettings.irrelevantSearchEngines) {
								ses += getSearchEngineName(Cache.getSingleton().userSettings.irrelevantSearchEngines[i]) + ", ";
							}
							
							ses = rtrim(ses, ", ");
								
							msg += "<br><br> " + Text.noPositionsSEMessage.replace("<ses>", ses);
						}
						
						showHighlightedMessage("#message", msg);
					}
					$('#addKeyword').accordion( 'activate' , 0 );
				}
				
				cache.currentStep = 'K4';
				showProgress('K4',1);
			}
		).
		once(
			function() {
								
				// draw chart if not in domain info mode
				if(!isDomainInfo()) {
					
					var weeksLabelsChart = new Array();
					for(i in weeks) {
						weeksLabelsChart[i] = "20" + weeks[i]; 
					}
					
					var filterTitle = new Array();
					if(filterText != '') {
						filterTitle.push(Text.filter + ': "' + filterText + '"');
					}
					if(filterDepth != 999) {
						filterTitle.push(Text.filterPos + ': ' + filterDepth);
					}
					if(filterSearches != 0) {
						filterTitle.push(Text.filterVol + ': ' + filterSearches);
					}
					
					if(filterTitle.length > 0) {
						filterTitle = " <i style=\"color:gray;\">[" + filterTitle.join(", ") + "]</i>";
					}
					else {
						filterTitle = "";
					}
					
					switch(subselection) {
					case 'positionsDomain':
					case 'positionsPages':	
						if(filterKeywordUID == null) {
							if(mode != "osr") {
								if(mode == 'position') {
									var text = Text.singleDomainChartTitle;
								}
								else {
									var text = Text.singleDomainFavChartTitle;
								}
							}
							else {
								var text = Text.singleDomainOSRChartTitle;
							}					
							
							text = text.replace('<nb>', distinctKeywordsNb);
							text += filterTitle;
							$("#chartTitle").html(text);
							//$("#chartTitle").html("Average Position of all " + distinctKeywords.length + " Keywords " + textFilterTitle + "down to Position " + filterDepth);
						}
						else {
							var keywordInfo = cache.getKeywordInfo(filterKeywordUID);
							var msg;
							if(keywordInfo != null) {
								msg = "<b>" + Text.singleKeywordChartTitle + " \"" + keywordInfo.name + "\"</b>";
							}
							else {
								msg = Text.noKeywordSelected;
							}
							$("#chartTitle").html(msg);
						}
						var chart = new Chart();
						chart.init();
						chart.setXAxis(Text.time, weeksLabelsChart);
						//chart.setYAxis("Position", 1, depth, 0);
						if(mode == "osr") {
							chart.setYAxis(Text.osr, 1, 0);
							
							var day = new Date().getDay();
							
							// if not all keywords are scanned do not display current weeks osr. in case of no positions, don't display osr from Mo-Th
							if(!cache.getSelectedDomainInfo().allKeywordsAreScanned || (!positionsAvailable && day != 0 && day < 5 )) {
								weeksLabelsChart.pop();
							}
							
							for(seUID in selectedDomainInfo.avgPosition) {
								seriesName = getSearchEngineName(seUID);
								seriesColor = getSearchEngineColor(seUID);
								if(!cache.getSelectedDomainInfo().allKeywordsAreScanned || (!positionsAvailable && day != 0 && day < 5 )) {
									var values = selectedDomainInfo.avgPosition[seUID].slice(0, selectedDomainInfo.avgPosition[seUID].length -1);
								}
								else {
									var values = selectedDomainInfo.avgPosition[seUID];
								}
								chart.addSeries(seriesName, values, seriesColor);
							}
							
						}
						else {
							chart.setYAxis(Text.position, 1, 0, -1);
						
							for(var seUID in averages) {
								var systemAverage = averages[seUID];
								var seAvg = new Array();
								for(weekIndex in weeks) {
									var week = weeks[weekIndex];
									var weekSum = 0;
									var weekAvg = null;
									if(systemAverage[week] != null && parseInt(weekIndex) >= parseInt(overallFirstPositionWeek)) {
										for(var p in systemAverage[week]) {
											var position = systemAverage[week][p];
											//if(mode == "osr") {
											//	weekSum += parseFloat(position);
											//}
											//else {
												weekSum += parseInt(position);
											//}
										}
										//if(mode == "osr") {
										//	weekAvg = weekSum;
										//} 
										//else {
											weekAvg = weekSum / systemAverage[week].length;
										//}
									}
									
									seAvg.push(weekAvg);
								}
								
								//alert(overallFirstPositionWeek + "\n"
								//		+ seAvg.join(","));
								
								var seriesName;
								var seriesColor;
								
								if(mode == 'position' || mode == 'positionfav') {
									seriesName = getSearchEngineName(seUID);
									seriesColor = getSearchEngineColor(seUID);
									
									if(mode == 'positionfav') {
										seriesName += " (Fav.)";
									}
								}
								else {
									seriesName = cache.getLabelName(seUID);
									seriesColor = getLabelColor(seUID);
								}
								chart.addSeries(seriesName, seAvg, seriesColor);
							}
						}
								
						chart.draw(false, "line");
					break;
					case 'distribution':
						var text = Text.singleDomainDistChartTitle.replace('<nb>', distinctKeywordsNb);
						text += filterTitle;
						$("#chartTitle").html(text);
						var chart = new Chart();
						chart.init();
						var start = 1;
						var labels = new Array();
						for(i in distributionRanges) {
							labels.push(start + "-" + distributionRanges[i]);
							start = distributionRanges[i] + 1;
						}
						chart.setXAxis(Text.positionRange, labels);
						//chart.setYAxis("Position", 1, depth, 0);
						chart.setYAxis(Text.nbOfKeywords, 0, 0, 1);
						for(var week in distribution) {
							var weeksDistribution = distribution[week];
							chart.addSeries(Text.week + " 20" + week, weeksDistribution);
						}
								
						chart.draw(false, "bar");
					break;
					}
				}
			} 
		).
		once(
			function() {
				showAjaxLoading(false);
			}
		);
	}
	else {
		showAjaxLoading(false);
	}

	// event tracking
	var action = 'buildSingleDomainTab';
	if(filterKeywordUID != null) {
		action = 'buildSingleKeywordTab';
	}
	
	trackEvent('UI', action, 'maxp:'+filterDepth + ',mins:' + filterSearches + ',tmode:' + tableColumns + ',se:' + filterSE + ',filter:' + filterText);
}

function buildKeywordOverviewTableString(mode, tableColumns, subselection, filterDepth, filterKeywordUID) {
	
	var cache = Cache.getSingleton();
	if(mode == null) {
		mode = cache.tableSettings.mode;
		tableColumns = cache.tableSettings.tableColumns;
		subselection = cache.tableSettings.subselection;
		filterDepth = cache.tableSettings.filterDepth;
		filterKeywordUID = cache.tableSettings.filterKeywordUID;
	}
	else {
		cache.tableSettings.mode = mode;
		cache.tableSettings.tableColumns = tableColumns;
		cache.tableSettings.subselection = subselection;
		cache.tableSettings.filterDepth = filterDepth;
		cache.tableSettings.filterKeywordUID = filterKeywordUID;
	}
	
	var selectedDomainInfo = cache.getSelectedDomainInfo();
	var weeks = cache.getWeeks();
	
	var weeksToDisplay;
	if(tableColumns == "time") {
		cache.displayedWeeks = 8;
		weeksToDisplay = cache.getWeeksToDisplayExtended();
	}
	else {
		cache.displayedWeeks = 4;
		weeksToDisplay = cache.getWeeksToDisplay();
	}
	
	var firstDisplayedWeek = weeksToDisplay[0];
	var lastDisplayedWeek  = weeksToDisplay[weeksToDisplay.length-1];
	var penultimateDisplayedWeek  = weeksToDisplay[weeksToDisplay.length-2];
	
	var indexCurrentWeek = cache.getWeeks().length-1;
	
	var weeksToDisplayMap = new Array();
	for(var i in weeksToDisplay) {
		var week = weeksToDisplay[i];
		weeksToDisplayMap[week] = 1;
	}
	
	// build table header
	var table = "<table width=\"100%\" class=\"tablesorter\" cellspacing=\"1\">";
	
	var weeksHeader = new Array();
	for(i in weeksToDisplay) {
		weeksHeader[i] = "20" + weeksToDisplay[i];
	}
	
	if(!isDomainInfo()) {
		var weeksHeaderString = '<th title="' + Text.weekPosHelp + '" class="{sorter: \'currency\'} oldweek">' + weeksHeader.join('</th><th title="' + Text.weekPosHelp + '" class="{sorter: \'currency\'}">') + "</th>";
	}
	else {
		var weeksHeaderString = 
			'<th title="' + Text.weekPosHelp + '" class="{sorter: \'currency\'} oldweek">Letzte Woche</th>' +
			'<th title="' + Text.weekPosHelp + '" class="{sorter: \'currency\'}">Aktuelle Position</th>';
	}
		
	var keywordColumn = "<th id=\"keywordTh\" title=\"" + Text.keywordHelp + "\">" + Text.keyword + "</th>";
	if(!isDomainInfo()) {
		keywordColumn += "<th title=\"" + Text.labelsHelp + "\">" + Text.labels + "</th>";
	}
	
	table += "<thead><tr>" + keywordColumn + "<th title=\"" + Text.seHelp + "\">" + Text.searchEngine + "</th>" + weeksHeaderString;
	
	//if(mode == "osr") {
	//	table += "<th title=\"\">Pos.</th>";
	//}
	
	if(subselection == "positionsPages" || tableColumns == "page") {
		var width = "";
		if(isDomainInfo()) {
			width = " width=\"40%\"";
		}
		table += "<th title=\"" + Text.pageHelp + "\"" + width + ">" + Text.page + "</th>";
	}
	else if(tableColumns == "keyword") {
		table += '<th title="' + Text.searchesPerMonthHelp + '">' + Text.searchesPerMonth + '</th><th title="' + Text.resultPagesHelp + '">' + Text.resultPages + '</th><th title="' + Text.avgCPCHelp + '">' + Text.avgCPC + "</th>";
	}
	else if(tableColumns == "trend") {
		table += "<th title=\"" + Text.trendHelp + "\">" + Text.trend1w + "</th>" +
				"<th title=\"" + Text.fullTrendHelp + "\">" + Text.trend4w + "</th>";
	}
	
	if(!isReport() && !isDomainInfo()) {
		table += "<th>" + Text.actions + "</th>";
	}
	table += "</tr>";
	table += "</thead><tbody>";
	
	if(isReport()) {
		cache.currentPage = 0;
		cache.userSettings.settings['pageSize'] = 10000;
	}
	
	for(var row = cache.currentPage * cache.userSettings.settings['pageSize']; row < cache.tableRows.length && row < (cache.currentPage + 1) * cache.userSettings.settings['pageSize']; row++) {
		
		var tableRow = cache.tableRows[row];
		var keywordInfo = cache.getKeywordInfo(tableRow.keywordUID);
		
		var isUserKeyword = false;
		if(cache.userKeywords[selectedDomainInfo.uid] != null && cache.userKeywords[selectedDomainInfo.uid][keywordInfo.uid] != null) {
			isUserKeyword = true;
		}
			
		tableRowString = "<tr onMouseOver=\"this.className='highlight'\" onMouseOut=\"this.className='normal'\">";
		
		//if(filterKeywordUID == null) {
			var mark = "";
			if(isUserKeyword) mark = "* ";
			if(!isReport() && !isDomainInfo() && filterKeywordUID == null && tableRow.positions != null) {
				tableRowString += "<td><span sort=\"" + keywordInfo.name + "\" id=\"" + keywordInfo.uid + "\"></span>" + " <a class=\"actionlink\" title=\"" + Text.actionShowKeyword + "\" href=\"javascript:showSingleKeyword(" + keywordInfo.uid + ")\">" +  mark + keywordInfo.name + "</a></td>";
			}
			else {
				tableRowString += "<td><span sort=\"" + keywordInfo.name + "\"></span>" + mark + keywordInfo.name + "</td>";
			}
			if(!isDomainInfo()) {
				tableRowString += "<td>" + keywordInfo.getLabelIcons() + "</td>";
			}
		//}
		if(tableRow.system != null) {
			tableRowString += 	"<td>" + getSearchEngineName(tableRow.system) + "</td>";
		}
		else {
			tableRowString += "<td>" + Text.noResultsSoFar + "</td>";
		}
		
		var lastPosition = null;
					
		for(i in cache.getWeeksToDisplayCounted(9)) {
			var position = '';
			var positionStr = '';
			var tdClass = '';
			var tdTitle = '';
			
			var position = tableRow.positions[weeks[i]];
			if(tableRow.positionsEstimated[weeks[i]] == true) {
				if(i == indexCurrentWeek) {
					tdTitle = Text.unscannedPositionHelp;
				}
				else {
					if(tableRow.noPosition == true) {
						tdTitle = Text.unknownPositionsHelp;
					}
					else {
						tdTitle = Text.unknownPositionHelp;
					}
				}
				tdClass = ' id="est"';
			}
			
			//tdTitle = Text.unknownPositionsHelp;
			
			// mark fall/rise for css styling
			if(lastPosition != null && tdClass == '') {
				if(position != lastPosition) {	
					
					var relevantly = '';
					var percentualChange    = Math.abs((lastPosition-position) / lastPosition * 100);
					var absoluteChange      = Math.abs(lastPosition-position);
					if(percentualChange >= 50 || absoluteChange >= 20) {
						relevantly = "Relevantly";
					}
					
					if(position < lastPosition) {						
						tdClass = ' id="rise' + relevantly + '"';
					}
					else if(position > lastPosition) {
						tdClass = ' id="fall' + relevantly + '"';
					}
					
					tdTitle = Text.positionColorHelp;
				}
			}
			
			lastPosition = position;
			positionStr = position;
			
			if(tableRow.positionsInterpolated[weeks[i]]) {
				positionStr = "~" + positionStr + "~";
			}
			
			if(parseInt(position) > keywordInfo.getLowerSearchDepth(filterDepth)) {
				positionStr = "&gt;" + (keywordInfo.getLowerSearchDepth(filterDepth));
				position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
			}
			
			// add week column if week has to be displayed
			if(weeksToDisplayMap[weeks[i]] != null) {
				if(tdTitle != '') {
					tdTitle = " title=\"" + tdTitle + "\"";
				}
				tdOldweek = '';
				if(isDomainInfo()) {
					if(i >= indexCurrentWeek-1) {
						if(i != indexCurrentWeek) {
							tdOldweek = ' class="oldweek"';
						}
						tableRowString += 	"<td" + tdOldweek + tdClass + tdTitle + ">" + positionStr + "</td>";
					}
				}
				else {
					tableRowString += 	"<td" + tdClass + tdTitle + ">" + positionStr + "</td>";
				}
			}
		}
		
		var url = "-";
		if(tableRow.page != null) {
			var url = selectedDomainInfo.name + tableRow.page;
		}
		
		//if(mode == "osr") {
		//	tableRowString += "<td>" + basePosition + "</td>";
		//}
		
		if(subselection == "positionsPages" || tableColumns == "page") {
			if(tableRow.page != null) {
				tableRowString += "<td>" + getTableActions([url + "#" + url + "#openUrl"], "openUrl") + tableRow.page + "</td>";
			}
			else {
				tableRowString += "<td>-</td>";
			}
		}
		else if(tableColumns == "keyword") {
			var system = tableRow.system;
			var searchesLocal = "";
			if(keywordInfo.searchesLocal[system] != null) {
				searchesLocal = keywordInfo.searchesLocal[system];
				searchesLocal = formatNumber(searchesLocal);
			}
			var pages = "";
			if(keywordInfo.pages[system] != null) {
				pages = keywordInfo.pages[system];
				pages = formatNumber(pages);
			}
			var cpc = "";
			if(keywordInfo.cpc[system] != null) {
				cpc = keywordInfo.cpc[system];
				cpc = cpc/100;
				cpc = cpc.toFixed(2);
			}
			
			tableRowString += 	"<td>" + searchesLocal + "</td>" + "<td>" + pages + "</td>" + "<td>" + cpc + "</td>";
		}
		else if(tableColumns == "trend") {
			var oneWeekTrend    = ((tableRow.positions[penultimateDisplayedWeek] - tableRow.positions[lastDisplayedWeek]) / tableRow.positions[penultimateDisplayedWeek] * 100).toFixed(1);
			//if(mode == 'osr') {
			//	oneWeekTrend = -oneWeekTrend;
			//}
			if(oneWeekTrend > 0) oneWeekTrend = "+" + oneWeekTrend;
			var fullTrend       = ((tableRow.positions[firstDisplayedWeek] - tableRow.positions[lastDisplayedWeek]) / tableRow.positions[firstDisplayedWeek] * 100).toFixed(1);
			//if(mode == 'osr') {
			//	fullTrend = -fullTrend;
			//}
			if(fullTrend > 0) fullTrend = "+" + fullTrend;
			tableRowString += 	"<td>" + oneWeekTrend + " %</td><td>" + fullTrend + " %</td>";
		}
		
		if(!isReport() && !isDomainInfo()) {
			tableRowString += 	"<td> ";
			if(filterKeywordUID == null) {
				tableRowString += keywordInfo.getVisibilityIcon();
				tableRowString += ' ' + getTableActions(["showKeywordInfo#"+Text.actionShowKeywordInfo], keywordInfo.uid + "#" + positionStr + "#" + url + "#" + tableRow.system);
				if(tableRow.positions != null) {
					tableRowString += ' ' + getTableActions(["showSingleKeyword#"+Text.actionShowKeyword], keywordInfo.uid);
				}
			}
			else {
				tableRowString += ' ' + getTableActions(["showKeywordInfo#"+Text.actionShowKeywordInfo], keywordInfo.uid + "#" + positionStr + "#" + url + "#" + tableRow.system);
			}
			tableRowString += "</td>";
		}
		
		tableRowString += "</tr>";
		
		table += tableRowString;
	}
	table += "</tbody></table>";
	
	cache.tableString = table;
}

function sortKeywordOverviewTableRows(primary, secondary) {
		
	var primaryFunction = null;
	var secondaryFunction = null;
	
	var cache = Cache.getSingleton();
	
	primaryFunction = getSortFunction(primary);
	
	var sortFunction = function(a,b) {
		var result = primaryFunction(a,b);
		if(result == 0 && secondaryFunction != null) {
			result = secondaryFunction(a,b);
		}
		return result;
	};
	
	cache.tableRows.sort(sortFunction);
}
function getSortFunction(value) {
	
	var values = value.split('#'); 
	type = values[0];
	direction = values[1];
	
	var cache = Cache.getSingleton();
	var offset = null;
	
	switch(type) {
	case 'currentpos':
	default:
		var weeks = cache.getWeeks();
		var currentWeek = weeks[weeks.length-1];
		sortFunction = function(a,b) {
			return direction * (a.positions[currentWeek] - b.positions[currentWeek]);
		};
		break;
	case 'searchvol':
		sortFunction = function(a,b) {
			return direction * (cache.getKeywordInfo(a.keywordUID).searchesLocal[a.system] - cache.getKeywordInfo(b.keywordUID).searchesLocal[b.system]);
		};
		break;
	case 'pages':
		sortFunction = function(a,b) {
			return direction * (cache.getKeywordInfo(a.keywordUID).pages[a.system] - cache.getKeywordInfo(b.keywordUID).pages[b.system]);
		};
		break;
	case 'cpc':
		sortFunction = function(a,b) {
			return direction * (cache.getKeywordInfo(a.keywordUID).cpc[a.system] - cache.getKeywordInfo(b.keywordUID).cpc[b.system]);
		};
		break;
	case 'trend26w':
		if(offset == null) {
			offset = 26;
		}
	case 'trend3w':
		if(offset == null) {
			offset = 3;
		}
	case 'trend2w':
		if(offset == null) {
			offset = 2;
		}
	case 'trend1w': 
		if(offset == null) {
			offset = 1;
		}
		var weeks 	 = cache.getWeeksToDisplayExtended();
		var toWeek 	 = weeks[weeks.length - 1];
		var fromWeek = weeks[weeks.length - 1 - offset];
		sortFunction = function(a,b) {
			return direction * (((a.positions[fromWeek] - a.positions[toWeek]) / a.positions[toWeek]) - ((b.positions[fromWeek] - b.positions[toWeek]) / b.positions[toWeek]));
		};
		break;
	case 'keyword':
		sortFunction = function(a,b) {
			if(cache.getKeywordInfo(b.keywordUID).name > cache.getKeywordInfo(a.keywordUID).name) {
				return direction * -1;
			} 
			else if(cache.getKeywordInfo(b.keywordUID).name < cache.getKeywordInfo(a.keywordUID).name) {
				return direction * 1;
			}
			else {
				return 0;
			}
		};
		break;
	case 'page':
		sortFunction = function(a,b) {
			if(a.page > b.page) {
				return direction * 1;
			} 
			else if(a.page < b.page) {
				return direction * -1;
			}
			else {
				return 0;
			}
		};
		break;
	}
	return sortFunction;
}

function showKeywordOverviewTablePage(nb, dir, sort) {
	var cache = Cache.getSingleton();
	var changed = false;
	
	if(nb != null) {
		if(cache.currentPage != nb-1) {
			cache.currentPage = nb-1;
			changed = true;
		}
	}
	else {
		changed = true;
	}
	
	if(sort != null) {
		
		changed = true;
		sortKeywordOverviewTableRows(sort);
	}
	
	if(changed) {
		var clumpy = new Clumpy();
		clumpy.once(
			function() {
				showAjaxLoading(true, 'Tabelle wird aktualisiert...', false);
			}
		).
		sleep(50).
		once(
			function() {
				buildKeywordOverviewTableString();
				$('#tableDiv').html(cache.tableString);
				if(cache.showKeywordCheckboxes) {
					$('span[sort]').html('<input class="kcb" type="checkbox">');
				}
				showAjaxLoading(false);
			}
		);
	}
}

function addKeyword() {
	var keyword = $("#keyword").val();
	var language = $("#addSingleKeywordTab select[id=language]").val();
	keyword = trim(keyword);
	if(keyword.length > 0) {
		var keywordUnescaped = keyword;
		keyword = keyword.replace(/&/g,"<<AMP>>");
		var selectedDomainInfo = Cache.getSingleton().getSelectedDomainInfo();
		showAjaxLoading(true, Text.msgAddingKeyword);
		$.ajax( {
			type : "POST",
			url : "/Programme/SuiteUI/GUI.php",
			data : "action=addKeyword&id=" + selectedDomainInfo.uid + "&keyword=" + keyword + "&language=" + language,
			async : true,
			success : function(result) {
				checkSession(result);
				var resArray = result.split("###");
				if (resArray[1] == "true" || resArray[1] == "true-sys") {
					$("#keyword").val('');
					
					if(resArray[1] == "true") {
						showMessage('#addKeywordResult', '<span class="msgSuccess">'+Text.msgKeywordAdded.replace('<keyword>', keywordUnescaped)+'</span>');
					}
					else {
						showMessage('#addKeywordResult', '<span class="msgSuccess">'+Text.msgKeywordAddedNotCounted.replace('<keyword>', keywordUnescaped)+'</span>', 10000);
					}
					Cache.getSingleton().addPositions(resArray[2], resArray[3]);
					buildKeywordOverviewTable();
					Cache.getSingleton().userKeywordCount = resArray[4];
					updateKeywordCount();
				}
				else if(resArray[1] == "dup") {
					showAjaxLoading(false);
					showMessage('#addKeywordResult', '<span class="msgError">'+Text.msgKeywordDup.replace('<keyword>', keywordUnescaped)+'</span>');
				} 
				else if(resArray[1] == "toLong") {
					showAjaxLoading(false);
					showMessage('#addKeywordResult', '<span class="msgError">'+Text.msgKeywordToLong.replace('<keyword>', keywordUnescaped)+'</span>');
				} 
				else {
					showAjaxLoading(false);
					showMessage('#addKeywordResult', '<span class="msgError">'+Text.msgKeywordError+'</span>');
				}
			}
		});
		trackEvent('UI', 'addKeyword', keyword);
	}
	else {
		showMessage('#addKeywordResult', '<span class="msgError">Geben Sie bitte zuerst das Keyword ein.</span>');
	}
}

function addMultipleKeywords() {
	var keywords = $("#multipleKeywords").val();
	var language = $("#addMultipleKeywordsTab select[id=language]").val();
	
	keywords = keywords.replace(/;|\n/g,",");
	var keywordsArray = keywords.split(",");
	for(i in keywordsArray) {
		keywordsArray[i] = trim(keywordsArray[i]);
		keywordsArray[i] = keywordsArray[i].replace(/&/g,"<<AMP>>");
	}
	var keywordsJoined = keywordsArray.join(",");
	
	if(keywordsJoined.length > 0) {
		var selectedDomainInfo = Cache.getSingleton().getSelectedDomainInfo();
		showAjaxLoading(true, Text.msgAddingMultipleKeywords);
		$.ajax( {
			type : "POST",
			url : "/Programme/SuiteUI/GUI.php",
			data : "action=addMultipleKeywords&id=" + selectedDomainInfo.uid + "&keywords=" + keywordsJoined + "&language=" + language,
			async : true,
			success : function(result) {
				showAjaxLoading(false);
				checkSession(result);
				var resArray = result.split("##-##");
				
				var resArrayOk     = resArray[1].split(";;");
				var resArrayDup    = resArray[2].split(";");
				var resArrayToLong = resArray[3].split(";");
				var resArrayDupSys = resArray[4].split(";;");
				var resArrayDupSysKeysOnly = resArray[5].split(";");
				
				var resultMsg = "";
				if(resArrayOk.length > 0 && resArrayOk[0] != "") {
					//resultMsg += '"' + resArrayOk.join("\", \"") + "\"<br>";
					resultMsg += "<br><b>" + resArrayOk.length + " Keywords wurden erfolgreich hinzugefügt.</b><br>";
					
					Cache.getSingleton().userKeywordCount = resArray[6];
					updateKeywordCount();
				}
								
				if(resArrayDup.length > 0 && resArrayDup[0] != "") {
					resultMsg += "<br><b>Folgende Keywords sind bereits als eigene Keywords vorhanden:</b><br>";
					resultMsg += '"' + resArrayDup.join("\", \"") + "\"<br>";
				}
				
				if(resArrayDupSysKeysOnly.length > 0 && resArrayDupSysKeysOnly[0] != "") {
					resultMsg += "<br><b>Folgende Keywords sind bereits im System-Keyword-Pool vorhanden:</b><br>";
					resultMsg += '"' + resArrayDupSysKeysOnly.join("\", \"") + "\"<br>";
				}
				
				if(resArrayToLong.length > 0 && resArrayToLong[0] != "") {
					resultMsg += "<br><b>Folgende Keywords sind zu lang:</b><br>";
					resultMsg += '"' + resArrayToLong.join("\", \"") + "\"<br>";
				}
				
				if(resArrayOk.length > 0 && resArrayOk[0] != "") {
					for(i in resArrayOk) {
						var subresult = resArrayOk[i];
						var subResArray = subresult.split("###");
						if (subResArray[1] == "true") {
							Cache.getSingleton().addPositions(subResArray[2], subResArray[3]);
						}
					}
					//resultMsg += "<br><br><input type=\"button\" value=\"" + Text.closeAndRefresh + "\" onclick=\"buildGui(1)\"></input>";
				}
				if(resArrayDupSys.length > 0 && resArrayDupSys[0] != "") {
					for(i in resArrayDupSys) {
						var subresult = resArrayDupSys[i];
						var subResArray = subresult.split("###");
						if (subResArray[1] == "true-sys") {
							Cache.getSingleton().addPositions(subResArray[2], subResArray[3]);
						}
					}
				}
				
				
				resultMsg += "<br><br><input type=\"button\" value=\"" + Text.closeAndRefresh + "\" onclick=\"buildGui(1)\"></input>";
				
				
				$("#addMultipleKeywordsTab").html(resultMsg);
			}
		});
		trackEvent('UI', 'addMultipleKeywords', keywordsJoined);
	}
	else {
		showMessage('#addMultipleKeywordsTab', '<span class="msgError">Geben Sie bitte zuerst die Keywords ein.</span>');
	}
}

function checkForNewPositions() {
	Cache.getSingleton().getUnscannedPositionsFromServer();
}

function showSingleKeyword(keyword) {
	Cache.getSingleton().setSelectedKeyword(keyword);
	$("#tabs").tabs('select', 2);
	window.scrollTo(0, 300);
}

function buildSingleKeywordGui(subselection, onlyDiagram) {
	
	var keywordUID = $("select#keyword").val();
	if(keywordUID == null) {
		keywordUID = '0';
	}
	buildKeywordOverviewTable(subselection, keywordUID, onlyDiagram);
}

function getTableActions(actions, params) {
	var result = "";
	for ( var nb = 0; nb < actions.length; nb++) {
		var actionArray = actions[nb].split("#"); 
		var action = actionArray[0];
		var desc   = actionArray[1];
		var icon   = action;
		if(actionArray.length > 2) {
			icon = actionArray[2];
		}
		var paramString;
		if(params != null && params.indexOf('#') != -1) {
			paramString = params.split("#").join("','");
		}
		else {
			paramString = params;
		}
		var href;
		var target = "";
		if(params != "openUrl") {
			href = "javascript:" + action + "('" + paramString + "')";
		}
		else {
			href = "javascript:openUrl(null, '" + action + "')";
			desc = Text.actionOpenUrl + ': ' + desc;
			//target = " target=\"_blank\" ";
		}
		result += "<a title=\"" + desc + "\" href=\"" + href + "\"" + target + ">"
				+ "<img border=\"0\" src=\"/images/gui/action-" + icon
				+ ".png\" alt=\"" + desc + "\"/></a> ";
	}
	return result;
}


function login() {
	document.body.style.cursor = "wait";
	$('#sessioninfo, #sessioninfo *').css('cursor', 'wait'); 
	var email = $("#email").val();
	email = trim(email, " \t");
	var password = $("#password").val();
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/login.php",
		data : "email=" + email + "&password=" + password,
		success : function(result) {
			document.body.style.cursor = "default";
			$('#sessioninfo, #sessioninfo *').css('cursor', 'default'); 
			var resArray = result.split("###");
			if (resArray[0] == "true") {
				//$('#sessioninfo').html(resArray[1]);
				//$('#productDesc').hide();
				//reloadPage();
				//buildGui();
				location.href = "/application/seo-suite.php";
			} 
			else {
				showMessage('#loginResult', resArray[1], 7000);
			}
		}
	});
};

function reloadPage(trim) {
	if(trim == null) {
		trim = "#";
	}
	var url = location.href;
	var anchorPos = url.indexOf(trim);
	if(anchorPos != -1) {
		url = url.substr(0, anchorPos);
	}
	location.href = url;
}

function getSeForDomain(domain) {
	var index = domain.lastIndexOf('.');
	var tld   = domain.substring(index+1);
	var se;
	switch(tld) {
	case 'de': 
	default: 
		if(domain.indexOf("google") != -1) {
			se = '5';
		}
		else {
			se = '1';
		}
		break;
	case 'ch': 
		se = '2'; 
		break;
	case 'at': 
		se = '3'; 
		break;
	//case 'it':
	//	se = '10';
	//	break;
	//case 'com':
	//	se = '6';
	//	break;
	}
	return se;
}

function logout() {
	document.body.style.cursor = "wait";
	$('#sessioninfo, #sessioninfo *').css('cursor', 'wait'); 
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/login.php",
		data : "logout=true",
		success : function(result) {
		document.body.style.cursor = "default";
		$('#sessioninfo, #sessioninfo *').css('cursor', 'default');
			var resArray = result.split("###");
			if (resArray[0] == "true") {
				if(location.href.indexOf("wise") != -1) {
					location.href = "http://www.wiseseosuite.de/";
				}
				else if(location.href.indexOf("localhost") != -1) {
					location.href = "http://localhost/";
				}
				else {
					location.href = "http://www.web-information-services.de/";
				}
				//$('#contentHeader').html("");
				//$('#sessioninfo').html(resArray[1]);
			}
		}
	});
};

function register() {

	$('#register [id=submit]').attr("disabled", "disabled");
	$('#register [id=submit]').attr("value", "Bitte warten...");
	document.body.style.cursor = "wait";
	var dataString = $('#form').serialize(); 
	if(dataString.indexOf("prod=") == -1) {
		dataString += "&prod=" + getUrlParam("prod");
	}
	//alert(dataString);
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/register.php",
		data : dataString,
		success : function(result) {
			document.body.style.cursor = "default";
			var resArray = result.split("###");
			if (resArray[1] == "true") {
				$('#register').html("<b>"+resArray[2]+"</b>");
				$('#error').html('');
				pageTracker._trackPageview("/registration-successful.html");
				pageTrackerMT._trackPageview("/registration-successful.html");
			}
			else {
				$('#register input[id=submit]').removeAttr("disabled");
				$('#register input[id=submit]').attr("value", "Account erstellen");
				showMessage('#error',resArray[2], 4000);
				trackEvent("Account", "registration-error", dataString);
			}
		}
	});
};

function changeProduct(group) {
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/Gui.php",
		data : "action=changeProduct&group=" + group,
		success : function(result) {
			checkSession(result);
			//document.body.style.cursor = "default";
			var resArray = result.split("###");
			$('#change-' + group).html(resArray[0]);
			$('#change-' + group).fadeIn();
		}
	});
};

function changePeriod() {
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/Gui.php",
		data : "action=changePeriod",
		success : function(result) {
			checkSession(result);
			//document.body.style.cursor = "default";
			var resArray = result.split("###");
			$('#change-1').html(resArray[0]);
			$('#change-1').fadeIn();
		}
	});
};

function transactionStep(step) {
	var period  = $('input[name=period]:radio:checked').val();
	var product = $('input[name=group-1]:radio:checked').val();
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/Gui.php",
		data : "action=transactionStep&step=" + step + "&period=" + period + "&productUID=" + product,
		success : function(result) {
			reloadPage();
		}
	});
};


function buildGui(selectedTab) {
	
	$('#annotations').html('');
	$('#csvExport').html('');
	$("#diagramOverlay").each().remove();
	
	//var se = $("select#se").val();
	var cache = Cache.getSingleton();
	var domainInfo = cache.getSelectedDomainInfo();
	if(domainInfo != null) {
		var settings = cache.getSettings(domainInfo.uid);
		if(settings != null) {
			var se = settings.getSE();
		}
	}
	
	if(loggedIn()) {
		
		$('#tableControlsFiltersDiv').hide();
		$('#tableControlsDiv').html('');
		$('#quickSettings').remove();
		$('#canvas').show();
		if(selectedTab == null) {
			selectedTab = $('#tabs').tabs('option', 'selected');
		}
		switch(selectedTab) {
		case 0:
			//var searchEngines = Cache.getSingleton().getSearchEngines();
			var html = //'Search Engine ' + buildSearchEngineSelect("*", searchEngines) + 
			'<br><div id="message"></div><br><div id="chartTitle"></div><br>';
			
			if(!isReport()) {
				var addHtml = '<table id="addTable"><tr><td><div id="addDomain"><h3><a href="#">' + Text.addDomain + '</a></h3><div id="addTableContent">' +
				'<table><tr><td>' + Text.addDomain + ': <input type="text" id="domain" title="' + Text.addDomainHelp + '"></input> <input type="button" value="' + Text.add + '" onclick="addDomain()"></input><div id="addDomainResult"></div></td><td></td>' +
				'</tr></table><span id="addDomainLimit"></span></div></div></td></tr></table>';
				
				if(cache.isDemoSuite()) {
					addHtml = '<table id="addTable"><tr><td><div id="addDomain"><h3><a href="#">' + Text.addDomain + '</a></h3><div id="addTableContent">' +
					'<i>SEO Suite Demo: Es können keine Domains hinzugefügt oder gelöscht werden.</i></div></div></td></tr></table>';
				}
				
				$('#addDiv').html(addHtml);
			}
			
			$('#contentHead').html(html);
			
			$('select#se').change(buildDomainOverviewTable);
			$('#addDomain').accordion({collapsible:true,active:false});
			$('#domain').tooltip({tip:'.tooltip', offset:[-5,0], predelay:300});
			$('#domain').keypress(function(e) {
		        if(e.which == 13) {
		            $(this).blur();
		        	addDomain();
		        }
		    });
			buildDomainOverviewTable();
		break;
		
		case 1:
			
			//var searchEngines = domainInfo.availableSearchEngines;
			var searchEngines = cache.userSettings.availableSearchEngines;
			
			
			var style = "";
			if(isReport()) {
				style = " style=\"display:none;\"";
			}
			
			var html = '<div id="subsection"' + style + '><ul>' +
		    		'<li><a href="#sub" title="' + Text.bestPositionHelp + '">' + Text.bestPosition + '</a></li>' +
		    		'<li><a href="#sub" title="' + Text.allPositionsHelp + '">' + Text.allPositions + '</a></li>' +
		    		'<li><a href="#sub" title="' + Text.positionDistributionHelp + '">' + Text.positionDistribution + '</a></li>' +
		    		'</ul><span id="sub"></span></div>' +
		    		'<div id="message"></div>' +
			    	'<table width="100%" ' + style + '>' + 
			    		'<tr valign="top"><td><span id="prevDomain"><img src="/design/spacer.gif" width="16"> </span><span id="domainName">' + buildDomainSelect(domainInfo.uid) + '</span><span id="nextDomain"></span></td><td width="57%">' +
			    		'<div id="settings"><h3><a href="#">' + Text.settingsAndFilters + '</a></h3><div>' +
							'<table style="border-collapse:collapse;">' +
								'<tr><td width="140px;">' + Text.settingsMode + '</td><td>' + buildModeSelect(settings.getMode()) + '</td></tr> ' +
								'<tr><td>' + Text.settingsPosition + '</td><td>' + buildDepthSelect(settings.getDepth()) + '</td></tr> ' +
								'<tr><td>' + Text.settingsSearches + '</td><td>' + buildSearchesSelect(settings.getSearches()) + '</td></tr> ' +
								'<tr><td valign="top">' + Text.settingsSearchEngine + '<br><span style="color:#777777"><i>' + Text.settingsSearchEngineHint + '</i></span></td><td>' + buildSearchEngineSelect(se, searchEngines) + '</td></tr>' + 
								'<tr id="tableMode"><td>' + Text.settingsTableMode + '</td><td>' + buildTableColumnsSelect(settings.columns) + '</td></tr>' +
								//'<tr><td>' + Text.settingsDiagramMode + '</td><td>' + buildDiagramModeSelect(settings.diagramMode) + '</td></tr>' +
								//'<tr><td>' + Text.settingsLabelsFilter + '</td><td>' + buildLabelsSelect(settings.keywordInfo) + '</td></tr>' +
								'<tr><td colspan="2"><input type="button" id="applySettings" onclick="buildKeywordOverviewTable()" value="' + Text.settingsApply + '"><input type="button" id="saveSettings" onclick="saveSettings()" value="' + Text.settingsSave + '" title="' + Text.settingsSaveHelp + '"><div id="saveSettingsResult"></div></td></tr>' +
								'<tr class="light"><td colspan="2">' + Text.settingsShowHidden + ' <input type="checkbox" id="showHidden"></td></tr>' +
							'</table><div id="info"></div>' +
						'</div></div></td></tr>' +
					'</table>' +
					'<br><br><div id="chartTitle"></div>' +
					//'<div id="chart"><canvas id="canvas" width="729" height="300">canvas</canvas></div>' +
					//'<br><div id="tableDiv"></div>' + 
				'';
			
			var keywordInfoLabelManagement = new KeywordInfo(-1, ""); // used for multiple keyword management
			cache.keywordInfoLabelManagement = keywordInfoLabelManagement;
			
			var addHtml = '<table id="addTable" ' + style + '><tr><td>' +
			'<div id="addKeyword"><h3><a href="#">' + Text.addKeyword + '</a></h3><div style="padding:10px;">' +
				'<div id="addKeywordTabs" style="border-width:0;font-size:0.9em;">' +
					'<span id="userKeywordsCount"></span><br><div id="userKeywordsMessage"></div>' + 
					'<ul style="background: none;">' +
						'<li><a href="#addSingleKeywordTab">' + Text.addSingleKeyword + '</a></li>' +
						'<li><a href="#addMultipleKeywordsTab">' + Text.addMultipleKeywords + '</a></li>' +
						'<li><a href="#manageFavorites">' + Text.manageFavorites + '</a></li>' +
						'<li><a href="#deleteKeywords">' + Text.deleteMultiple + '</a></li>' +
					'</ul>' +
					'<div id="addSingleKeywordTab">' +
						'<br><span style="width:80;display:inline-block;">' + Text.keyword + ':</span><input type="text" id="keyword" title="' + Text.addKeywordHelp + '" style="width:330px;"></input> <input id="refreshKeywords" type="button" id="refresh" value="' + Text.refreshKeywords + '" onclick="checkForNewPositions()" title="' + Text.refreshKeywordsHelp + '" style="float:right;"><br>' +
						'<span style="width:80;display:inline-block;">' + Text.language + ':</span>' + buildLanguageSelect() + '<br>' +
						'<span style="width:80;display:inline-block;"></span><input type="button" id="addKeywordButton" value="' + Text.add + '" onclick="addKeyword()" style="width:165px;margin-top:5px;"></input><br><span id="addKeywordResult"></span><span id="refreshResult"></span>' +					
					'</div>' +
					'<div id="addMultipleKeywordsTab">' +
						Text.addMultipleKeywords + '<br>' +
						'<span style="color:#777777"><i>' + Text.addMultipleKeywordsHint + '</i></span><br>' +  
						'<textarea id="multipleKeywords" title="' + Text.addMultipleKeywordsHelp + '" cols="50" rows="200" style="height:200px;width:400px;"></textarea><br>'+
						'<span style="width:70;display:inline-block;margin-top:5px;">' + Text.language + ':</span>' + buildLanguageSelect() + '<br>' +
						'<span style="width:230;display:inline-block;"></span><input type="button" id="addMultipleKeywordsButton" value="' + Text.addAll + '" onclick="addMultipleKeywords()" style="margin-top:5px;width:170;"></input>' +
					'</div>' +
					'<div id="manageFavorites">' +
						'<a href="javascript:selectAllKeywords();">' + Text.selectAllKeywords + '</a> <a href="javascript:deselectAllKeywords();">' + Text.deselectAll + '</a> <a href="javascript:toggleAllKeywords();">' + Text.toggleAll + '</a><br><br>' +
						Text.assignLabelToAll + ': ' + buildLabelsSelect(keywordInfoLabelManagement) +
					'</div>' +
					'<div id="deleteKeywords">' +
						'<a href="javascript:selectAllKeywords();">' + Text.selectAllKeywords + '</a> <a href="javascript:deselectAllKeywords();">' + Text.deselectAll + '</a> <a href="javascript:toggleAllKeywords();">' + Text.toggleAll + '</a><br><br>' +
						'<a href="javascript:showHideSelectedKeywordsDialog();" style="color:#444;">' + '<img style="position:relative;top:3px;margin-right:5px;" border="0" src="/images/gui/remove.png">' + Text.deleteSelectedKeywords + '</a>' +
						'<a id="addSelectedKeywords" href="javascript:unsetLabel(-1,-1);" style="color:#444;display:none;">' + '<img style="position:relative;top:3px;margin-right:5px;" border="0" src="/images/gui/add.png">' + Text.addSelectedKeywords + '</a>' +
					'</div>' +
				'</div>' +
			'</div></div>' +
			'</td></tr></table>';
			
			if(cache.isDemoSuite()) {
				addHtml = '<table id="addTable" ' + style + '><tr><td><div id="addKeyword"><h3><a href="#">' + Text.addKeyword + '</a></h3><div>' +
				'<i>SEO Suite Demo: Es können keine Keywords hinzugefügt oder entfernt werden.</i></div></div></td></tr></table>';
			}
			
			$('#contentHead').html(html);
			$('#addDiv').html(addHtml);
			
			if(cache.getMonitoringLimit("free") == "1") {
				$("#addMultipleKeywordsTab").html("Funktion verfügbar ab SEO Suite Silber.");
			}
			
			updateKeywordCount();
			
			if(cache.isDemoSuite()) {
				$('#saveSettings').attr('disabled', 'disabled');
			}
			
			
			$('#addKeyword').accordion({collapsible:true,active:false,autoHeight:false});
			
			$('#keyword').keypress(function(e) {
		        if(e.which == 13) {
		            $(this).blur();
		        	addKeyword();
		        }
		    });
			
			$('#subsection').tabs().bind('tabsselect', function (event, ui) {
		        event.stopPropagation();
		    });
			$('#subsection').bind('tabsselect',  function(event, ui) {
				buildKeywordOverviewTable(ui.index);
			});
			
			$('#addKeywordTabs').tabs();
			$('#addKeywordTabs').bind('tabsselect',  function(event, ui) {
				if(ui.index == 2 || ui.index == 3) {
					$('span[sort]').html('<input class="kcb" type="checkbox">');
					cache.showKeywordCheckboxes = true;
				} else {
					$('span[sort]').html('');
					cache.showKeywordCheckboxes = false;
				};
				$('#textFilter').width($('#keywordTh').outerWidth() + 2);
			});
			
			//$('select#mode').change(buildKeywordOverviewTable);
			//$('select#depth').change(buildKeywordOverviewTable);
			//$('select#se').change(buildKeywordOverviewTable);
			//$('select#tableColumns').change(buildKeywordOverviewTable);
			//$('select#diagramMode').change(buildKeywordOverviewTable);
			//$('select#searches').change(buildKeywordOverviewTable);
			
			$('input#showHidden').change(buildKeywordOverviewTable);
			//$('#textFilter').keyup(applyTextFilter);
			
			$('#keyword,#refreshKeywords').tooltip({opacity: 0.9, tip:'.tooltip', offset:[-5,0], predelay:300});
			$('a[href=#sub]').tooltip({opacity: 0.9, tip:'.tooltip', offset:[-5,0], predelay:500});
			$('#mode option').tooltip({position: 'center left', opacity: 0.9, tip:'.tooltipWide', offset:[-5,-5], predelay:0});
			$('#addSingleKeywordTab select[id=language], #addMultipleKeywordsTab select[id=language]').tooltip({opacity: 0.9, tip:'.tooltipWide', offset:[-15,0], predelay:0});
			$('#settings').accordion({collapsible:true,active:false});
			
			if(!isReport() && cache.getMonitoringLimit('export') == 1) {
				$('#tableDiv').after('<div id="csvExport"><a class="actionlink" href="csv-export.php?id=' + domainInfo.uid + '&domain=' + domainInfo.name.substr(7) + '">CSV Export der Ranking Daten</a></div>');
			}
			
			$("#domainName select").change(
				function() {
					var newDomainUID = $("#domainName select").val();
					setDomain(newDomainUID);
				}
			);
			
			buildKeywordOverviewTable();
		break;
		
		case 2:

			//var searchEngines = domainInfo.availableSearchEngines;
			var searchEngines = cache.userSettings.availableSearchEngines;
			var selectedKeyword = cache.getSelectedKeyword();
			
			var keywordSelectHtml = buildKeywordSelect(selectedKeyword, settings.getSE(), settings.getDepth(), settings.getSearches());
			if(keywordSelectHtml == null) {
				return;
			}
						
			var html = '<div id="subsection"><ul>' +
					'<li><a href="#sub">' + Text.bestPosition + '</a></li>' +
    				'<li><a href="#sub">' + Text.allPositions + '</a></li>' +
		    		//'<li><a href="#sub">Position Distribution</a></li>' +
		    		'</ul><span id="sub"></span></div>' +
			    	'<table width="100%">' + 
			    		'<tr valign="top"><td><span id="prevDomain"><img src="/design/spacer.gif" width="16"> </span><span id="domainName">' + buildDomainSelect(domainInfo.uid) + '</span><span id="nextDomain"></span><br>' +
			    		'<div id="keywordSelection"><b>Keyword: </b> ' + keywordSelectHtml + '</div>' +
						'<div id="keywordNavigation"><input id="prevKeyword" type="button" value=" &#x25c4; " onclick="stepSelect(\'#keyword\',\'up\')"><input id="nextKeyword" type="button" value=" &#x25ba; " onclick="stepSelect(\'#keyword\',\'down\')"></div>' +
						'</td><td width="57%">' +
						'<div id="quickSettings2" ' + style + '>' +
			    			Text.settingsLabelsFilter + ': ' + buildLabelsSelect(settings.keywordInfo) +
			    		'</div>' +
			    		'<div id="settings"><h3><a href="#">' + Text.settingsAndFilters + '</a></h3><div>' +
							'<table>' +
								'<tr><td>' + Text.settingsPosition + '</td><td>' + buildDepthSelect(settings.getDepth()) + '</td></tr> ' +
								'<tr><td>' + Text.settingsSearches + '</td><td>' + buildSearchesSelect(settings.getSearches()) + '</td></tr> ' +
								'<tr><td>' + Text.settingsSearchEngine + '</td><td>' + buildSearchEngineSelect(se, searchEngines) + '</td></tr>' + 
								'<tr id="tableMode"><td>' + Text.settingsTableMode + '</td><td>' + buildTableColumnsSelect(settings.columns) + '</td></tr>' +
								'<tr><td colspan="2"><input type="button" id="applySettings" onclick="updateKeywordSelect(true)" value="' + Text.settingsApply + '"></td></tr>' +
							'</table>' +
						'</div></div></td></tr>' +
					'</table>' +
					'<br><div id="chartTitle"></div>';
			
			$('#contentHead').html(html);
			$('#addDiv').html("");
			$('#subsection').tabs().bind('tabsselect', function (event, ui) {
		        event.stopPropagation();
		    });
			$('#subsection').bind('tabsselect',  function(event, ui) {
				buildSingleKeywordGui(ui.index);
			});
						
			$('select#keyword').change(buildSingleKeywordGui);
			//$('select#depth').change(updateKeywordSelect);
			//$('select#searches').change(updateKeywordSelect);
			//$('select#se').change(function() {updateKeywordSelect(true);});
			//$('select#tableColumns').change(buildSingleKeywordGui);
			$('#settings').accordion({collapsible:true,active:false});
			checkKeywordListBorders('#keyword');
			
			$("#domainName select").change(
				function() {
					var newDomainUID = $("#domainName select").val();
					setDomain(newDomainUID);
				}
			);
			
			buildSingleKeywordGui();
		break;
		
		case 3:
			$('#canvas').hide();
			$('#contentHead').html(
					"<h2>Allgemeine Einstellungen</h2><br>");
			$('#addDiv').html("");
			
			var cache = Cache.getSingleton();
			var domains = cache.getDomains();
			
			var disabled = "";
			if(Cache.getSingleton().isDemoSuite()) {
				disabled = "disabled";
			}
			
			//var selectedSearchEngines = cache.userSettings.irrelevantSearchEngines;
			
			var searchEngines = cache.userSettings.allAvailableSearchEngines;
			var searchEnginesOptions = buildSearchEngineSelect("", searchEngines, true);
			var searchEnginesOptionsDomainOverview = buildSearchEngineSelect("", ['1','2','3'], true);
			
			var html ='<form id="settingsForm">';
			html += '<table cellspacing="10">';
			
			html += '<tr>';
			html += '<td width="30%"><label for="pageSize">Zeilen pro Seite</label></td><td width="15%"><select name="pageSize"><option>50</option><option>100</option><option>250</option><option>500</option><option>1000</option><option>2500</option><option value="99999">unbegrenzt</option></select></td>';
			html += '<td>Anzahl Zeilen pro Tabellen-Seite. Das Ergebnis wird in Seiten dieser Größe aufgeteilt. Der Browser kann kleinere Tabellen deutlich schneller darstellen. Standard: 500</td>';
			html += '</tr>';
			
			html += '<tr>';
			html += '<td width="30%"><label for="onlyUserKeywords">Nur selbst hinzugefügte Keywords anzeigen</label></td><td width="15%"><select name="onlyUserKeywords"><option value="1">Ja</option><option value="0" selected="selected">Nein</option></select></td>';
			html += '<td>Wenn diese Option aktiviert wird, werden ausschließlich selbst hinzugefügte Keywords angezeigt. Platzierungen der Domains für Keywords aus dem Systempool werden nicht mehr beachtet. Dies ist nützlich für Domains mit sehr vielen Treffern (> 5000 Keywords), um die Ladezeiten stark zu verbessern. Ansonsten lassen sich die Keywords über die Favoritenlisten verwalten. Standard: Nein</td>';
			html += '</tr>';
			
			html += '<tr>';
			html += '<td><label for="irrelevantSearchEngines">Ignorierte Suchmaschinen</label><br><span style="color: gray;"><i>(Mehrfachselektion mit STRG)</i></span></td><td><select name="irrelevantSearchEngines" multiple="multiple">' + searchEnginesOptions + '</select></td>';
			html += '<td>Hier können Sie die Suchmaschinen selektieren, die für Sie keine Rolle spielen. Damit vermeiden Sie unnötige Wartezeiten für Datenbankabfragen, Datenübertragung und Auswertung von Positionsdaten der für Sie irrelevanten Suchmaschinen. Außerdem erscheinen abgewählte Suchmaschinen nicht mehr im Filter.<br>Die Daten stehen serverseitig nach wie vor zur Verfügung und Sie können jederzeit wieder umschalten. Standard: Keine</td>';
			html += '</tr>';
			
			html += '<tr>';
			html += '<td><label for="searchEngine">Suchmaschine für die Domainübersicht</label></td><td><select name="searchEngine">' + searchEnginesOptionsDomainOverview + '</select></td>';
			html += '<td>Hier können Sie die Suchmaschine selektieren, die in der Domainübersicht verwendet wird. Standard: google.de</td>';
			html += '</tr>';
			
			html += '<tr>';
			html += '<td><label for="subdomains">Subdomain "www" mit Domain gleichstellen</label></td><td><select name="subdomains"><option value="www">Ja</option><option value="none">Nein</option></select></td>';
			html += '<td>Die Domains "www.domain.de" und "domain.de" werden in der Ranking und Backlink Analyse zusammengefasst. Standard: ja</td>';
			html += '</tr>';
			
			html += '</table>';
			//html += '<label for="searchEngine">Suchmaschine für die Übersichtsseite "Alle Domains"</label><select name="onlyUserKeywords"><option value="1">Ja</option><option value="0">Nein</option></select>';
			html += '</form><br><br>';
			html += '<input id="saveSettingsButton" type="button" value="Speichern" onclick="saveUserSettings()" style="width:150px;" ' + disabled + '></input>';
			html += ' <span id="resultSaveSettings"></span><br><br>';
			html += '<i style="font-size:9pt;">Hinweis: Damit Änderungen an diesen Einstellungen wirksam werden, loggen Sie sich bitte neu ein.</i>';
			$('#tableDiv').html(html);
			
			for(var prop in cache.userSettings) {
				$('#settingsForm *[name=' + prop + ']').val(cache.userSettings[prop]);
			}
			
			for(var prop in cache.userSettings.settings) {
				$('#settingsForm *[name=' + prop + ']').val(cache.userSettings.settings[prop]);
			}
			
			//$('#settingsForm *[title]').tooltip({position: 'top right', opacity: 0.9, tip:'.tooltipWide', offset:[-5,-5], predelay:0});
			
		break;
			
		}
	}
	
	if(selectedTab != null) {
		trackEvent('UI', 'Tab selected', selectedTab);
	}
};

function buildDomainSelect(currentDomainUID) {

	var cache = Cache.getSingleton();
	var domains = cache.getDomains();
	var maxDomains = cache.getMonitoringLimit('domains');
	
	var html = "<select id=\"domains\">";

	var domainNb = 0;
	for(row in domains) {

		domainNb++;
		
		if(domainNb <= maxDomains) {

			var domain = domains[row];
			//var domainSettings = cache.getSettings(domain.uid);
			
			var selected = "";
			if(domain.uid == currentDomainUID) {
				selected = " selected=\"selected\"";
			}
			
			html += "<option value=\"" + domain.uid + "\"" + selected + ">" + domain.name.replace(new RegExp("^http://", "g"), "") + "</option>";
		}
	}
	
	html += "</select>";
	
	return html;
}

function buildSearchEngineSelect(currentSE, searchEngines, onlyOptions) {
	html = "";
	if(onlyOptions !== true) html += "<select id=\"se\" multiple=\"multiple\">";
	//html += "<option value=\"*\">alle</option>";
		
	var currentSEArray = currentSE.split("-");
	
	for(i in searchEngines) {
		var selected = "";
		if(arrayIndexOf(currentSEArray, searchEngines[i]) != -1) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + searchEngines[i] + "\" " + selected + ">" + getSearchEngineName(searchEngines[i]) + "</option>"; 
	}
	if(onlyOptions !== true) html += '</select>';
	return html;
}

function buildLanguageSelect() {
	html = "";
	html += "<select id=\"language\" title=\"" + Text.languageHelp + "\" style=\"width:330px;\">";
	html += "<option value=\"49\">" + getLanguageFromCode('49', true) + "</option>";
	html += "<option value=\"1\">" + getLanguageFromCode('1', true) + "</option>";
	html += "<option value=\"39\">" + getLanguageFromCode('39', true) + "</option>";
	html += "<option value=\"33\">" + getLanguageFromCode('33', true) + "</option>";
	html += "</select>";
	
	return html;
}

function buildDepthSelect(currentDepth) {
	html = "";
	var depths = [5,10,20,50,100,150,200,999];
	html += "<select id=\"depth\">";
	for(i in depths) {
		var selected = "";
		if(depths[i] == currentDepth) {
			selected = 'selected="true"';
		}
		if(depths[i] == 999) {
			name = "unbegrenzt";
		}
		else {
			name = depths[i];
		}
		html += "<option value=\"" + depths[i] + "\" " + selected + ">" + name + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildSearchesSelect(currentSearches) {
	html = "";
	var searches = [0,100,500,1000,2000,3000,4000,5000,7500,10000,20000,30000,40000,50000,75000,100000,200000,300000,400000,500000,1000000,2000000,5000000];
	html += "<select id=\"searches\">";
	for(i in searches) {
		var selected = "";
		if(searches[i] == currentSearches) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + searches[i] + "\" " + selected + ">" + searches[i] + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildPeriodSelect(currentPeriod) {
	html = "";
	var periods = {4:'1 Monat', 8:'2 Monate', 13:'3 Monate', 26:'6 Monate'};
	html += "<select id=\"searches\">";
	for(i in periods) {
		var selected = "";
		if(i == currentPeriod) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + i + "\" " + selected + ">" + periods[i] + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildModeSelect(currentMode) {
	html = "";
	var options = {'osr':Text.modeOSR, 'position':Text.modePosition, 'positionfav':Text.modePositionFav, 'positionfavsep':Text.modePositionFavSep};
	var help = {'osr':Text.modeOSRHelp, 'position':Text.modePositionHelp, 'positionfav':Text.modePositionFavHelp, 'positionfavsep':Text.modePositionFavSepHelp};
	html += "<select id=\"mode\">";
	for(i in options) {
		var selected = "";
		if(i == currentMode) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + i + "\" " + selected + " title=\"" + help[i] + "\">" + options[i] + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildTableColumnsSelect(currentColumns) {
	html = "";
	var options = {'time':Text.tableModeTime, 'keyword':Text.tableModeKeywordInfo, 'page':Text.tableModePage, 'trend':Text.tableModeTrend};
	html += "<select id=\"tableColumns\">";
	for(i in options) {
		var selected = "";
		if(i == currentColumns) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + i + "\" " + selected + ">" + options[i] + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildDiagramModeSelect(currentDiagramMode) {
	html = "";
	var options = {'se':Text.diagramModeSearchEngines, 'labels':Text.diagramModeLabels};
	html += "<select id=\"diagramMode\">";
	for(i in options) {
		var selected = "";
		if(i == currentDiagramMode) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + i + "\" " + selected + ">" + options[i] + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildLabelsSelect(keywordInfo) {
	html = "";
	html = keywordInfo.getLabelIcons();
	return html;
}

function updateKeywordSelect(refreshGui) {
	var searchEngine = $('select#se').val();
	var depth = $('select#depth').val();
	var searches = $('select#searches').val();
	var selectedKeyword = $('select#keyword').val();
	var html = buildKeywordSelect(selectedKeyword, searchEngine, depth, searches);
	$('select#keyword').replaceWith(html);
	$('select#keyword').change(buildSingleKeywordGui);
	$('select#keyword').show('highlight');
	// rebuild gui if current keyword is no more in list
	if(html.indexOf('selected="selected"') == -1 || refreshGui) {
		buildSingleKeywordGui();
	}
	checkKeywordListBorders('#keyword');
}

function buildKeywordSelect(selectedKeywordUID, searchEngine, depth, searches) {
	
	var cache = Cache.getSingleton();
	var selectedDomainInfo = cache.getSelectedDomainInfo();
	var html = '<select id="keyword">';
	
	var labelsFilterActive = false;
	var labelsFilter = [];
	domainSettings = cache.getSettings(selectedDomainInfo.uid);
	if(domainSettings != null) {
		labelsFilter = domainSettings.keywordInfo.labels;
		for(var i in labelsFilter) {
			if(labelsFilter[i] == true) {
				labelsFilterActive = true;
				break;
			}
		}
	}
	
	var filterSEMap = new Array();
	for(var i in searchEngine) {
		var se = searchEngine[i];
		filterSEMap[se] = true;
	}
	
	var processedKeywords = new Object();
	
	var positions = cache.getPositions(selectedDomainInfo.uid, "buildGui()", searchEngine);
	if(positions != null) {
		var keywords = new Array();
		for(var i in positions) {
			
			var position = positions[i];
			
			// keyword already processed?
			if(processedKeywords[position.keywordUID] == true) {
				continue;
			}
			processedKeywords[position.keywordUID] = true;
			
			var keywordInfo = cache.getKeywordInfo(position.keywordUID);
			if(keywordInfo == null) {
				continue;
			}
		
			// Keyword hidden?
			if(!keywordInfo.isVisible()) {
				continue;
			}
			
			// Label filter
			if(labelsFilterActive) {
				var match = null;
				for(var i in labelsFilter) {
					if(labelsFilter[i] == true) {
						match = false;
						if(keywordInfo.labels[i] == true) {
							match = true;
							break;
						}
					}
				}
				if(match === false) {
					continue;
				}
			}
			
			if(position.position <= depth && (filterSEMap["*"] == true || filterSEMap[position.system] == true)
					&& keywordInfo.getMaxSearchesLocal(searchEngine) >= parseInt(searches))
			{
				keywords.push(keywordInfo.name + "###" + position.keywordUID);
			}
		}
		
		keywords.sort();
		var keywordStringAndUID;
		
		for(var i in keywords) {
			keywordStringAndUID = keywords[i].split("###");
			(keywordStringAndUID[1] == selectedKeywordUID) ? selected = 'selected="selected"' : selected = '';
			html += "<option value=\"" + keywordStringAndUID[1] + "\" " + selected + ">" + keywordStringAndUID[0] + "</option>"; 
		}
		
		html += '</select>';
	}
	else {
		html = null;
	}
	
	return html;
	
}

function buildPageSelect(pageSize, lines) {
	html = "";
	html += "<select id=\"page\">";
	var maxPage = Math.ceil(lines / pageSize);
	for(var i = 1; i <= maxPage; i++) {
		var firstLine = (i-1)*pageSize + 1;
		var lastLine = i*pageSize;
		if(lastLine > lines) {
			lastLine = lines;
		}
		html += "<option value=\"" + i + "\">" + firstLine + "-" + lastLine + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildSortSelect() {
	html = "<select id=\"sort\">";
	html += "<option value=\"currentpos#1\">Aktuelle Position</option>";
	if(!isDomainInfo()) html += "<option value=\"searchvol#-1\">Suchvolumen</option>";
	html += "<option value=\"keyword#1\">Keyword</option>";
	html += "<option value=\"trend1w#-1\">Aufstieg % 1 Woche</option>";
	if(!isDomainInfo()) html += "<option value=\"trend2w#-1\">Aufstieg % 2 Wochen</option>";
	if(!isDomainInfo()) html += "<option value=\"trend3w#-1\">Aufstieg % 3 Wochen</option>";
	//html += "<option value=\"trend26w#-1\">Aufstieg % 1/2 Jahr</option>";
	html += "<option value=\"trend1w#1\">Abstieg % 1 Woche</option>";
	if(!isDomainInfo()) html += "<option value=\"trend2w#1\">Abstieg % 2 Wochen</option>";
	if(!isDomainInfo()) html += "<option value=\"trend3w#1\">Abstieg % 3 Wochen</option>";
	//html += "<option value=\"trend26w#-1\">Abstieg % 1/2 Jahr</option>";
	html += "<option value=\"page#1\">Rankende Seite</option>";
	if(!isDomainInfo()) html += "<option value=\"cpc#-1\">CPC</option>";
	if(!isDomainInfo()) html += "<option value=\"pages#-1\">Anzahl Seiten</option>";
	html += "</select>";
	return html;
}

function buildWeekSelect() {
	
	var cache = Cache.getSingleton();
	var html = "<select id=\"week\">";
	
	var weeksLength = cache.getWeeks().length;
	var currentValue = cache.weeksToDisplayOffset;
	
	var nb = 1;
	for(var i in cache.getWeeks()) {
		if(nb >= cache.displayedWeeks) {
			var week = "20" + cache.getWeeks()[i];
			var value = weeksLength - 1 - i;
			var selected = "";
			if(currentValue == value) {
				selected = " selected=\"selected\"";
			}
			html += "<option value=\"" + value + "\"" + selected + ">Bis KW " + week + "</option>";
		}
		nb++;
	}
	
	html += "</select>";
	return html;
}


function stepSelect( id, direction ){
    if( direction == 'down'){
            $(id+' option:selected').next().attr('selected','selected');
    }
    if( direction == 'up'){
            $(id+' option:selected').prev().attr('selected','selected');
    }
    checkKeywordListBorders(id);
    buildSingleKeywordGui();
}

function checkKeywordListBorders(id) {
	if($(id+' option:selected').next().length == 0) {
    	$('#nextKeyword').attr('disabled', 'disabled');
    }
	else {
		$('#nextKeyword').removeAttr('disabled');
	}
	
	if($(id+' option:selected').prev().length == 0) {
    	$('#prevKeyword').attr('disabled', 'disabled');
    }
	else {
		$('#prevKeyword').removeAttr('disabled');
	}
}

var textFilterTimer;
function applyTextFilter(e) {
	clearTimeout(textFilterTimer);
	textFilterTimer = setTimeout('buildKeywordOverviewTable()', 700);
}

function loggedIn() {
	return ($("#loggedIn").length);
}

function isReport() {
	return (report == true);
}

var domainInfo;
function isDomainInfo() {
	return (domainInfo == true);
}

function isDemo() {
	return false;
}

function showAjaxLoading(show, msg, animate) {
		
	if(msg == null) {
		msg = " " + Text.ajaxRetrieving;
	}
	
	if(animate == null) {
		animate = true;
	}
	
	if(show) {
		
		if(!isDemo()) {
			var position = $("#tabs").offset();
			//var height = $("#canvas").height();
			var width = $("#tabs").width();
			if(width > 990) width = 990;
			var height = $("#tabs").height();
			var opacity = 0.2;
		}
		else {
			var position = $("#demo").offset();
			position.top -= 15;
			var width = $("#demo").width();
			var height = $("#demo").height();
			var opacity = 0.5;
		}
		
		if(position == null) return;
		
		var boxPosition = position.top;
		var pixelsScrolled = $(document).scrollTop();
		if(pixelsScrolled > position.top) {
			boxPosition = pixelsScrolled;
		}
			
		//document.body.style.cursor = 'wait';
		
		if(pixelsScrolled > position.top) {
			$('#box').css({'border':'1px #888888 solid'});
		}
		else {
			$('#box').css({'border':'none'});
		}
		
		
		if(animate) {
			$('#screen').css({'display': 'block', 'top': position.top, 'left': position.left, 'opacity': opacity, 'width':width+7,'height':height+7});
		}
		
		if(!isDemo()) {
			var x = position.left+width-300;
		}
		else {
			var x = position.left+width-300;
		}
		
		$('#box').css({'display': 'block', 'top': boxPosition+6, 'left': x});
		
		var divWidth = 300;
		//position.top += 15;
		var img = "";
		var corr = '';
		if(animate === "progress") {
			img = '<div id="progressbar"><div></div></div>';
			corr = ' style="top:-1px;position:relative;"';
		}
		else if(animate == true) {
			img = "<img align='center' src='/images/gui/ajax-loader.gif' style='margin-bottom:3px;margin-top:4px;'><br>";
			corr = ' style="top:-1px;position:relative;"';
		}
		else {
			corr = ' style="top:10px;position:relative;"';
		}
		
		$('#box').html("<div class='ajax_loader'>" + img + "<span" + corr + "> &nbsp;<span id=\"progress-msg\">" + msg + "</span></span></div>");
		//$("#tabs").append("<div class='ajax_loader' style='position:absolute; width: 400px; left:" + (position.left + 450) + "px; top:" + position.top + "px;'>" + img + "<span" + corr + "> &nbsp;" + msg + "</span></div>");
	}
	else {
		//document.body.style.cursor = 'default';
		$('#screen').css({'display': 'none'});
		$('#box').css({'display': 'none'});
		$(".ajax_loader").each(function(i) {$(this).remove();});
	}
}

function showProgress(step, progress) {
	
	var start = 0;
	var end = 100;
	
	switch(step) {
	case 'K1':
		start = 10;
		end = 30;
		$('#progress-msg').html("Filter werden angewendet...");
		break;
	case 'K2':
		start = 30;
		end = 80;
		$('#progress-msg').html("Daten werden aufbereitet...");
		break;
	case 'K3':
		start = 80;
		end = 90;
		$('#progress-msg').html("Tabelle wird aktualisiert...");
		break;
	case 'K4':
		start = 90;
		end = 100;
		$('#progress-msg').html("Diagramm wird aktualisiert...");
		break;
	}
	
	var totalProgress = start + progress * (end-start);
	$('#progressbar div').css('width', totalProgress + "%");
}

function formatNumber(numberStr) {
	var sep = "";
	var formattedNumber = "";
	for (var i = numberStr.length - 3; i >0; i-=3){
		var sub = numberStr.substr(i, 3);
		if (formattedNumber) formattedNumber = sep + formattedNumber;
		formattedNumber =sub  +formattedNumber;
	}
	if (formattedNumber) formattedNumber = sep + formattedNumber;
	formattedNumber = numberStr.substr(0, (3+i)) + formattedNumber;
	return formattedNumber;
}

function saveSettings() {
	var selectedDomainInfo = Cache.getSingleton().getSelectedDomainInfo();
	var mode = $("select#mode").val();
	var diagramMode = $("select#diagramMode").val();
	var depth = $("select#depth").val();
	var se = $("select#se").val().join("-");
	var tableColumns = $("select#tableColumns").val();
	var searches = $("select#searches").val();
	var settings = new DomainSettings(selectedDomainInfo.uid, selectedDomainInfo.name, depth, se, tableColumns, searches, mode, diagramMode);
	settings.keywordInfo = Cache.getSingleton().getSettings(selectedDomainInfo.uid).keywordInfo;
	
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=saveSettings&"+settings.toPostParams(),
		async : true,
		success : function(result) {
			checkSession(result);
			var resArray = result.split("###");
			if(resArray[1] == "true") {
				Cache.getSingleton().addSettings(settings);
				showMessage("#saveSettingsResult", Text.settingsSaved);
			}
		}
	});
	
	buildKeywordOverviewTable();
	
	trackEvent('UI', 'saveSettings', settings.toPostParams());
}

function saveUserSettings() {
	//var data = $('#settingsForm').serialize();
	
	var cache = Cache.getSingleton();
	
	if($('#settingsForm select[name=irrelevantSearchEngines]').val() != null) {
		if($('#settingsForm select[name=irrelevantSearchEngines]').val().length == cache.userSettings.allAvailableSearchEngines.length) {
			
			alert("Es können nicht alle Suchmaschinen ignoriert werden!");
			return;
		}
	}
	
	cache.userSettings.searchEngine				= $('#settingsForm select[name=searchEngine]').val();
	cache.userSettings.onlyUserKeywords			= $('#settingsForm select[name=onlyUserKeywords]').val();
	cache.userSettings.setIrrelevantSearchEngines($('#settingsForm select[name=irrelevantSearchEngines]').val());
	
	for(var prop in cache.userSettings.settings) {
		cache.userSettings.settings[prop] = $('#settingsForm *[name=' + prop + ']').val();
	}
	
	data = "onlyUserKeywords=" + cache.userSettings.onlyUserKeywords;
	data += "&irrelevantSearchEngines=" + cache.userSettings.irrelevantSearchEngines.join("-");
	data += "&searchEngine=" + cache.userSettings.searchEngine;
		
	data += "&additionalSettings=" + cache.userSettings.serializeSettings();
	
	showAjaxLoading(true, "Einstellungen werden gespeichert...", false);
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=saveUserSettings&" + data,
		async : false,
		success : function(result) {
			showAjaxLoading(false);
			checkSession(result);
			var resArray = result.split("###");
			if (resArray[1] == "true") {
				showMessage("#resultSaveSettings", "Einstellungen erfolgreich gespeichert.");
				//Cache.getSingleton().positions = new Array();
			}
			else {
				showMessage("#resultSaveSettings", '<span class="msgError">An error occurred saving your settings, please try again later.</span>');
			}
		}
	});
}

function selectAllKeywords() {
	$('input.kcb[type=checkbox]').each(function() {this.checked = true;});
}

function deselectAllKeywords() {
	$('input.kcb[type=checkbox]').each(function() {this.checked = false;});
}

function toggleAllKeywords() {
	$('input.kcb[type=checkbox]').each(function() {this.checked = !this.checked;});
}

function showMessage(selector, message, time) {
	$(selector).hide();
	$(selector).html(message);
	//$(selector).show("highlight");
	$(selector).fadeIn();
	var waitTime = 4000;
	if(time != null) {
		waitTime = time;
	}
	setTimeout('$("'+selector+'").fadeOut()', waitTime);
}

function showHighlightedMessage(selector, message, time) {
	$(selector).hide();
	$(selector).html('<div class="ui-state-highlight ui-corner-all ui-widget" style="padding: 0pt 0.7em; margin-bottom: 10px;"><p><span style="float: left; margin-right: 0.3em;" class="ui-icon ui-icon-info"></span>' + message + '</p></div>');
	$(selector).show("highlight");
	if(time != null) {
		setTimeout('$("'+selector+'").fadeOut()', time);
	}
}

function showKeywordInfo(keywordUID, position, page, system) {
	
	var keywordInfo = Cache.getSingleton().getKeywordInfo(keywordUID);
	
	var pagesRows = "";
	for(i in keywordInfo.pages) {
		if(keywordInfo.pages[i] != null && keywordInfo.pages[i] != "") {
			pagesRows += "<tr><td> &nbsp;" + getSearchEngineName(i) + "</td><td>" + keywordInfo.pages[i] + "</td></tr>"; 
		}
	}
	var searchesPerMonthRows = "";
	for(i in keywordInfo.searchesLocal) {
		if(keywordInfo.searchesLocal[i] != null && keywordInfo.searchesLocal[i] != "") {
			searchesPerMonthRows += "<tr><td> &nbsp;" + getSearchEngineName(i) + "</td><td>" + keywordInfo.searchesLocal[i] + "</td></tr>"; 
		}
	}
	var avgCPCRows = "";
	for(i in keywordInfo.cpc) {
		if(keywordInfo.cpc[i] != null && keywordInfo.cpc[i] != "") {
			cpc = keywordInfo.cpc[i]/100;
			cpc = cpc.toFixed(2);
			avgCPCRows += "<tr><td> &nbsp;" + getSearchEngineName(i) + "</td><td>" + cpc + " &euro;</td></tr>"; 
		}
	}
	
	var content = "<table id=\"keywordinfoTable\" width=\"100%\">" + 
		"<tr id=\"keyword\"><td width=\"40%\">" + Text.keyword + "</td><td width=\"60%;\">" + keywordInfo.name + "</td></tr>" +
		"<tr><td><b>" + Text.language + "</b></td><td>" + getLanguageFromCode(keywordInfo.languageCode, true) + "</td></tr>" + 
		"<tr><td></td></tr>"; 
		
	if(pagesRows != "") {
		content += "<tr><td colspan=\"2\"><b>" + Text.keywordInfoResultPages + "</b></td></tr>" +
		pagesRows;
	}
	if(searchesPerMonthRows != "") {
		content += "<tr><td colspan=\"2\"><b>" + Text.keywordInfoSearchesPerMonth + "</b></td></tr>" +
		searchesPerMonthRows;
	}
	if(avgCPCRows != "") {
		content += "<tr><td colspan=\"2\"><b>" + Text.keywordInfoAvgCPC + "</td></tr>" +
		avgCPCRows;
	}
	
	content += "<tr><td></td></tr>" + 
		"<tr><td><b>" + Text.keywordInfoPosition + "</b></td><td>" + position + " (" + getSearchEngineName(system) + ")" + "</td></tr>" +
		"<tr><td><b>" + Text.keywordInfoPage + "</b></td><td>" + page + "</td></tr>" +
		"</table>";
	
	$("#dialog-keywordinfo-content").html(content);
	
	var dialogString = 
		'$("#dialog-keywordinfo").dialog({' +
		    'autoOpen : false,' +
		    'resizable: false,' +
		    'width    : 500,' +
			'modal : true, buttons : {' +
				'Ok'+' : function() {$(this).dialog("close");}' +
			'}'+
		'});';
	
	eval(dialogString);
	$("#dialog-keywordinfo").dialog("open");
}

function updateKeywordCount() {
	var cache = Cache.getSingleton();
	$('#userKeywordsCount').attr('title', Text.keywordCountHint.replace('<count>',cache.userKeywordCount).replace('<keywordslimit>',cache.getMonitoringLimit('keywords')));
	$('#userKeywordsCount').html(Text.keywordCount.replace('<count>',cache.userKeywordCount).replace('<keywordslimit>',cache.getMonitoringLimit('keywords')));
	
	var factor = cache.userKeywordCount / cache.getMonitoringLimit('keywords');
	if(factor > 1.2) {
		$('#userKeywordsMessage').css('display','block');
		$('#userKeywordsMessage').html("<img src=\"/images/gui/warning.png\"> " + Text.keywordCountMsg2.replace('<keywordslimit>',cache.getMonitoringLimit('keywords')) + "<br>");
		$('#addMultipleKeywordsButton').attr('disabled','disabled');
		$('#addKeywordButton').attr('disabled','disabled');
	}
	else if(factor > 1) {
		$('#userKeywordsMessage').css('display','block');
		$('#userKeywordsMessage').html("<img src=\"/images/gui/warning.png\"> " + Text.keywordCountMsg1.replace('<keywordslimit>',cache.getMonitoringLimit('keywords')) + "<br>");
		$('#addMultipleKeywordsButton').removeAttr('disabled');
		$('#addKeywordButton').removeAttr('disabled');
	}
	else {
		$('#userKeywordsMessage').css('display','none');
		$('#addMultipleKeywordsButton').removeAttr('disabled');
		$('#addKeywordButton').removeAttr('disabled');
	}
}

function showDeleteDomainDialog(domainUID) {
	
	Cache.getSingleton().setSelectedDomainUID(domainUID);
	var domainInfo = Cache.getSingleton().getSelectedDomainInfo(); 
	
	if(Cache.getSingleton().isDemoSuite()) {
		var dialogString = 
			'$("#dialog-confirm").dialog({' +
			    'autoOpen : false,' +
			    'resizable: false,' +
				'modal : true, buttons : {' +
					Text.cancelButton+' : function() {$(this).dialog("close");}' +
				'}'+
			'});';
	}
	else {
		var dialogString = 
			'$("#dialog-confirm").dialog({' +
			    'autoOpen : false,' +
			    'resizable: false,' +
				'modal : true, buttons : {' +
					Text.cancelButton+' : function() {$(this).dialog("close");},' +
					Text.deleteButton+' : function() {$(this).dialog("close");var domainUID = Cache.getSingleton().getSelectedDomainUID();deleteDomain(domainUID);}' +
				'}'+
			'});';
	}
	
	$('#dialog-confirm-content').html(Text.reallyDeleteDomain.replace("<domain>", domainInfo.name));
	eval(dialogString);	
	
	$("#dialog-confirm").dialog("open");
}

function showHideKeywordDialog(keywordUID) {
	
	if(Cache.getSingleton().isDemoSuite()) {
		var dialogHideKeywordString = 
			'$("#dialog-confirm-hide-keyword").dialog({' +
			    'autoOpen : false,' +
			    'resizable: false,' +
				'modal : true, buttons : {' +
					Text.cancelButton+' : function() {$(this).dialog("close");}' +
				'}'+
			'});';
	}
	else {
		var dialogHideKeywordString = 
			'$("#dialog-confirm-hide-keyword").dialog({' +
			    'autoOpen : false,' +
			    'resizable: false,' +
			    'width: 400,' +
				'modal : true, buttons : {' +
					Text.cancelButton +' : function() {$(this).dialog("close");},' +
					Text.deleteButton +' : function() {$(this).dialog("close");var keywordUID = Cache.getSingleton().getSelectedKeyword();setLabel(keywordUID,-2);},' +
					Text.hideButton   +' : function() {$(this).dialog("close");var keywordUID = Cache.getSingleton().getSelectedKeyword();setLabel(keywordUID,-1);}' +
				'}'+
			'});';
	}
	
	// init dialog
	eval(dialogHideKeywordString);
	
	Cache.getSingleton().setSelectedKeyword(keywordUID);
	$("#dialog-confirm-hide-keyword").dialog("open");
}

function showHideSelectedKeywordsDialog() {
	
	var dialogHideKeywordsString = 
		'$("#dialog-confirm-hide-keywords").dialog({' +
		    'autoOpen : false,' +
		    'resizable: false,' +
		    'width: 400,' +
			'modal : true, buttons : {' +
				Text.cancelButton +' : function() {$(this).dialog("close");},' +
				Text.deleteButton +' : function() {$(this).dialog("close"); setLabel(-1,-2);},' +
				Text.hideButton   +' : function() {$(this).dialog("close"); setLabel(-1,-1);}' +
			'}'+
		'});';
	
	eval(dialogHideKeywordsString);
	
	
	$("#dialog-confirm-hide-keywords").dialog("open");
}

function startDomainInfo() {
	
	var domain = $("#domain").val();
	domain = trim(domain);
	domain = domain.replace(new RegExp("^http://", "g"), "");
	
	var se = $("#se").val();
	
	$("#demoError").html("");
	$('#osrDiv').html("");
	$("#tableDiv").html("<div style=\"height:200px;\">");
	
	showAjaxLoading(true);
	this.domains = new Array();
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=getPositionsDataDomainInfo&domain=" + domain + "&se=" + se,
		async : true,
		success : function(result) {
		
			showAjaxLoading(false);
			var resArray = result.split("###");
			if (resArray[1] == "true") {
				
				var domainUID = resArray[2];
				var cache = Cache.getSingleton();
				cache.addPositions(domainUID, resArray[3]);
				cache.setWeeks(resArray[4].split("|"));
				domain = resArray[5];
				var osr = resArray[6];
				$('#osrDiv').html("Domain OSR: " + osr);

				cache.domains = new Array();
				cache.domains.push(new DomainInfo(domainUID, domain));
				cache.setSelectedDomainUID(domainUID);
				cache.addSettings(new DomainSettings(domainUID, domain));
				//buildGui(1);
				report = false;
				reportSubselection = null;
				domainInfo = true;
				buildKeywordOverviewTable(1);
				//buildKeywordOverviewTable("positionsDomain");
				
			}
			else if(resArray[1] == "dup") {
				showMessage('#demoError', '<span class="msgError">'+Text.msgDomainDup+'</span><br><br>', 8000);
			}
			else if(resArray[1] == "toLong") {
				showMessage('#demoError', '<span class="msgError">'+Text.msgDomainToLong+'</span><br><br>', 8000);
			}
			else if(resArray[1] == "unknown") {
				showMessage('#demoError', '<span class="msgError">'+Text.msgDomainUnknown+'</span><br><br>', 8000);
			}
			else if(resArray[1] == "exception") {
				showMessage('#demoError', '<span class="msgError">'+Text.msgSorry+'</span><br><br>', 8000);
			}
			else {
				showMessage('#demoError', '<span class="msgError">'+Text.msgDomainInvalid+'</span><br><br>', 8000);
			}
		}
	});
};

function buildReportsGui() {
	
	var cache = Cache.getSingleton();
	var singleSEAvailable = (cache.getMonitoringLimit("reportSingleSE") == 1);
	
	var types = [1, 2, 3, 4, 5, 101];
	
	// build report selection table
	var domains = cache.getDomains();
	if(domains != null) {
		
		
		var maxDomains = cache.getMonitoringLimit('domains');
		
		if(cache.getMonitoringLimit("free") == 1) {
			$('#tableDiv').html("<p><b>Verfügbar ab SEO Suite Silber.</b></p>");
		}
		else {
			
			var table = "<table id=\"reportsTable\" class=\"tablesorter\" cellspacing=\"1\">";
			table += "<thead><tr><th>Domain</th><th></th><th width=\"190px\">Report</th><th>Abonnieren (Mailversand)</th><th>Suchmaschinen</th><th>Direkt generieren und drucken</th>";
			table += "</tr></thead><tbody>";
			
			var selected = "";
			if(cache.reportSettings[0] != null && cache.reportSettings[0].send == true) {
				selected = " CHECKED";
			}
			//table += "<tr>";
			//table += 	"<td>Übersichtsreport aller Domains</td>";
			//table +=	"<td><form method=\"POST\" action=\"/programme/create-report.php\" target=\"_blank\"><input type=\"hidden\" name=\"email\" value=\"" + $('#x').html() + "\"><input type=\"submit\" value=\"Druckvorschau\"></form></td>";
			//table += 	"<td><img src=\"/images/pdf.gif\"> <input id=\"0\" type=\"checkbox\"" + selected + "/></td>";
			//table += "</tr>";
			
			var selection = "<b>Markieren:</b> <a id=\"all\" class=\"selectionLink\" href=\"#\">Alle</a>";
			
			for(i in types) {
				var type = types[i];
				selection += " <a id=\"" + type + "\" class=\"selectionLink\" href=\"#\" >" + getReportTypeName(type) + "</a>";
			}
			
			selection += " <a id=\"-\" class=\"selectionLink\" href=\"#\">Markierung entfernen</a><br>";
			var extendedSettings = "";
			if(singleSEAvailable) {
				extendedSettings = " <input type=\"checkbox\" id=\"singleSE\"> Pro Suchmaschine ein Report";
			}
			selection += "<div id=\"reportSettings\"><b>Markierte ändern zu:</b><br>" +
					"<table><tr><td>Abonnieren " + getReportPeriodSelect(0, 0) + "</td><td>Suchmaschinen<br><span style=\"color:gray;font-style:italic;\">(Mehrfachselektion mit STRG)</span></td><td>" + getSearchEngineSelect(0, 0) + "</td><td>" + extendedSettings + "</td><td><input type=\"button\" id=\"saveReportSettings\" value=\"Übernehmen\"></td></tr></table>";
			
			var domainNb = 0;
			for(row in domains) {

				domainNb++;
				var domain = domains[row];
				
				if(domainNb <= maxDomains) {
					
					var languageSelect = getReportLanguageSelect(domain.uid);
					
					for(i in types) {
						var type = types[i];
						var periodSelect = getReportPeriodSelect(domain.uid, type);
						var searchEngineSelect = getSearchEngineList(domain.uid, type);
						
						var singleSE = false;
						if(cache.reportSettings[domain.uid + "-" + type] != null && cache.reportSettings[domain.uid + "-" + type].singleSE == 1) {
							var singleSE = true;
						}
						
						var se = "";
						if(cache.reportSettings[domain.uid + "-" + type] != null && cache.reportSettings[domain.uid + "-" + type].se != '') {
							se = "<input type=\"hidden\" name=\"se\" value=\"" + cache.reportSettings[domain.uid + "-" + type].se + "\">";
						}	
						
						table += "<tr>";
						if(type == 1) {
							table += 	"<td rowspan=\"" + types.length + "\"> &nbsp;<b>" + domain.name.replace(new RegExp("^http://", "g"), "") + "</b>" + 
										"<div style=\"font-size:9pt;color:#777;margin-top:9px;\"> &nbsp;Reportsprache " + languageSelect + "</div></td>";
						}
						table +=    "<td><input type=\"checkbox\" id=\"cb-" + domain.uid + "-" + type + "\"></td>";
						table += 	"<td><img src=\"/images/pdf.gif\"> " + getReportTypeName(type) + "</td>";
						table += 	"<td>" + periodSelect + "</td>";
						table += 	"<td><span id=\"se-" + domain.uid + "-" + type + "\">" + searchEngineSelect + "</span></td>";
						
						if(singleSE == false) {
							var seValue = "";
							if(cache.reportSettings[domain.uid + "-" + type] != null && cache.reportSettings[domain.uid + "-" + type].se != '') {
								seValue = "<input type=\"hidden\" name=\"se\" value=\"" + cache.reportSettings[domain.uid + "-" + type].se + "\">";
							}
							table += 	"<td><form method=\"POST\" action=\"/programme/create-report.php\" target=\"_blank\"><input type=\"hidden\" name=\"email\" value=\"" + $('#x').html() + "\"><input type=\"hidden\" name=\"domainUID\" value=\"" + domain.uid + "\"><input type=\"hidden\" name=\"type\" value=\"" + type + "\"><input id=\"previewReportLanguage-" + domain.uid + "\" type=\"hidden\" name=\"language\" value=\"" + cache.getSettings(domain.uid).reportLanguage + "\">" + seValue + "<input type=\"submit\" value=\"Druckvorschau\"></form></td>";
						}
						else {
							var seArray = cache.getSettings(domain.uid).getSE().split("-");
							if(cache.reportSettings[domain.uid + "-" + type] != null && cache.reportSettings[domain.uid + "-" + type].se != '') {
								seArray = cache.reportSettings[domain.uid + "-" + type].se.split("-");
							}
							table += "<td>";
							for(i in seArray) {
								var se = seArray[i];
								var seName = getSearchEngineName(se); 
								seValue = "<input type=\"hidden\" name=\"se\" value=\"" + se + "\"><input type=\"hidden\" name=\"singleSE\" value=\"" + seName + "\">";
								table += "<form method=\"POST\" action=\"/programme/create-report.php\" target=\"_blank\"><input type=\"hidden\" name=\"email\" value=\"" + $('#x').html() + "\"><input type=\"hidden\" name=\"domainUID\" value=\"" + domain.uid + "\"><input type=\"hidden\" name=\"type\" value=\"" + type + "\"><input id=\"previewReportLanguage-" + domain.uid + "\" type=\"hidden\" name=\"language\" value=\"" + cache.getSettings(domain.uid).reportLanguage + "\">" + seValue + "<input type=\"submit\" value=\"D.\" title=\"Druckvorschau für " + seName + "\"></form> ";
							}
							table += "</td>";
						}
						table += "</tr>";
					}
					table += "<tr style=\"height:10px;\"><td colspan=\"6\"></tr>";
				}
			}
			table += "</tbody></table>";
			
			$('#tableDiv').html(table);
			$('#selectionDiv').html(selection);
			
			$('select[class=report]').change(function() {
				
				var values = $(this).attr('id').split("-");
				var domainUID = values[1];
				var type = values[2];
				var period = $(this).val();
				
				if(type == 0) {
					return;
				}
				
				showAjaxLoading(true, "Einstellung wird gespeichert...", false);
				
				$.ajax( {
					type : "POST",
					url : "/Programme/SuiteUI/GUI.php",
					data : "action=setReportSetting&domainUID=" + domainUID + "&type=" + type + "&period=" + period,
					async : true,
					success : function(result) {
						showAjaxLoading(false);
						$('select[class=report][id=sel-0-0]').val('-');
						checkSession(result);
						var resArray = result.split("###");
						if (resArray[1] == "true") {
							if(changeSelected) {
								for(var i in domainUIDArray) {
									domainUID = domainUIDArray[i];
									type = typeArray[i];
									$('#sel-' + domainUID + '-' + type).val(period);
									cache.reportSettings[domainUID + "-" + type].period = period;
								}
							}
							else {
								cache.reportSettings[domainUID + "-" + type].period = period;
							}
						}
						else {
							$('#errorMsg').html('<span class="msgError">An error occurred saving your settings, please try again later.</span>');
						}
					}
				});
			});
			
			$('select[class=reportLanguage]').change(function() {
				
				var domainUID = $(this).attr('id');
				var language  = $(this).val();
								
				showAjaxLoading(true, "Einstellung wird gespeichert...", false);
				
				$.ajax( {
					type : "POST",
					url : "/Programme/SuiteUI/GUI.php",
					data : "action=setReportSetting&domainUID=" + domainUID + "&language=" + language,
					async : true,
					success : function(result) {
						showAjaxLoading(false);
						checkSession(result);
						var resArray = result.split("###");
						if (resArray[1] == "true") {
							cache.getSettings(domainUID).reportLanguage = language;
							$('[id=previewReportLanguage-' + domainUID + ']').attr('value', language);
						}
						else {
							$('#errorMsg').html('<span class="msgError">An error occurred saving your settings, please try again later.</span>');
						}
					}
				});
			});
			
			$('#saveReportSettings').bind('click', function() {
				
				var period = $('#sel-0-0').val();
				var se = "";
				if($('#se-0-0').val() != null) {
					se = $('#se-0-0').val().join('-');
				}
				var singleSE = 0;
				var checked = $('#singleSE')[0].checked;
				if(checked != false) {
					singleSE = 1;
				}
				
				var domainUIDArray = new Array();
				var typeArray = new Array();
				$('#tableDiv input[type=checkbox]:checked').each(function() {
					var values = $(this).attr('id').split("-");
					var domainUID = values[1];
					var type = values[2];
					domainUIDArray.push(domainUID);
					typeArray.push(type);
				});
				
				if(domainUIDArray.length == 0) {
					alert("Wählen Sie bitte zuerst die Reports aus, die Sie ändern möchten.");
					$('select[class=report][id=sel-0-0]').val('-');
					return;
				}
				
				domainUID = domainUIDArray.join(",");
				type = typeArray.join(",");
				
				showAjaxLoading(true, "Einstellung wird gespeichert...", false);
				
				$.ajax( {
					type : "POST",
					url : "/Programme/SuiteUI/GUI.php",
					data : "action=setReportSetting&domainUID=" + domainUID + "&type=" + type + "&period=" + period + "&se=" + se + "&singleSE=" + singleSE,
					async : true,
					success : function(result) {
						showAjaxLoading(false);
						$('select[class=report][id=sel-0-0]').val('-');
						checkSession(result);
						var resArray = result.split("###");
						if (resArray[1] == "true") {
							/*
							for(var i in domainUIDArray) {
								domainUID = domainUIDArray[i];
								type = typeArray[i];
								$('#sel-' + domainUID + '-' + type).val(period);
								cache.reportSettings[domainUID + "-" + type].period = period;
							}
							*/
							Cache.getSingleton().getDomainsFromServer();
							buildReportsGui();
						}
						else {
							$('#errorMsg').html('<span class="msgError">An error occurred saving your settings, please try again later.</span>');
						}
					}
				});
			});
			
			$('#selectionDiv a[class=selectionLink]').click(function() {
				var type = $(this).attr('id');
				
				$('#tableDiv input[type=checkbox]').each(function() {
					if(type == "all" || $(this).attr('id').match('-' + type + "$") != null) {
						this.checked = true;
					}
					else if(type == "-"){
						this.checked = false;
					}
				});
			});
		}
	}
}

function getReportPeriodSelect(domainUID, type) {
	var cache = Cache.getSingleton();
	var periodSelect = "<select class=\"report\" id=\"sel-" + domainUID + "-" + type + "\">";
	if(type == 0) {
		periodSelect += "<option value=\"-\" style=\"font-style:italic;\">nicht ändern</option>";
	}
	for(var period in {0:0,1:0,4:0}) {
		var selected = "";
		if(cache.reportSettings[domainUID + "-" + type] != null && cache.reportSettings[domainUID + "-" + type].period == period) {
			selected = " SELECTED";
		}
		periodSelect += "<option value=\"" + period + "\"" + selected + ">" + getReportPeriodName(period) + "</option>";
	}
	periodSelect += "</select>";
	return periodSelect;
}

function getReportLanguageSelect(domainUID) {
	var cache = Cache.getSingleton();
	var languageSelect = "<select class=\"reportLanguage\" id=\"" + domainUID + "\">";
	for(var language in {'DE':0,'IT':0,'EN':0}) {
		var selected = "";
		if(cache.getSettings(domainUID).reportLanguage == language) {
			selected = " SELECTED";
		}
		languageSelect += "<option value=\"" + language + "\"" + selected + ">" + language + "</option>";
	}
	languageSelect += "</select>";
	return languageSelect;
}

function getSearchEngineList(domainUID, type) {
	var html = "";
	if(type <= 4) {
		var cache = Cache.getSingleton();
		var searchEngines = cache.userSettings.availableSearchEngines;
		if(cache.reportSettings[domainUID + "-" + type] != null && cache.reportSettings[domainUID + "-" + type].se != '') {
			se = cache.reportSettings[domainUID + "-" + type].se;
		}
		else {
			se = cache.getSettings(domainUID).getSE();
		}
		
		var currentSEArray = se.split("-");
		var namesArray = new Array();
		for(i in searchEngines) {
			var selected = "";
			if(arrayIndexOf(currentSEArray, searchEngines[i]) != -1) {
				namesArray.push(getSearchEngineName(searchEngines[i]));
			}
		}
		html = namesArray.join(", ");
		
		if(cache.reportSettings[domainUID + "-" + type] != null && cache.reportSettings[domainUID + "-" + type].singleSE == 1) {
			html += " <i>(je&nbsp;ein&nbsp;Report)</i>";
		}
	}
	else {
		html = "<span style=\"color:gray;\">-</span>";
	}
	return html;
}
function getSearchEngineSelect(domainUID, type) {
	var seSelect = "";
	if(type <= 4) {
		var cache = Cache.getSingleton();
		var searchEngines = cache.userSettings.availableSearchEngines;
		
		if(type != 0) {
			if(cache.reportSettings[domainUID + "-" + type] != null && cache.reportSettings[domainUID + "-" + type].se != null) {
				se = cache.reportSettings[domainUID + "-" + type].se;
			}
			else {
				se = cache.getSettings(domainUID).getSE();
			}
		}
		else {
			se = "";
		}
		
		var seSelect = "<select id=\"se-" + domainUID + "-" + type + "\" multiple=\"multiple\" size=\"3\" style=\"vertical-align:top;\">";
		if(type == 0) {
			seSelect += "<option value=\"-\" style=\"font-style:italic;\" selected=\"selected\">nicht ändern</option>";
		}
		seSelect += buildSearchEngineSelect(se, searchEngines, true);
		seSelect += "</select>";
	}
	return seSelect;
}

function getReportTypeName(type) {
	var name;
	switch(type) {
	case 1:
		name = 'Suchm. Ranking Individuell';
		break;
	case 2:
		name = 'Top 10 Keywords Report';
		break;	
	case 3:
		name = 'Potential Report';
		break;
	case 4:
		name = 'Positionsverteilungs Report';
		break;
	case 5:
		name = 'Domain OSR Report';
		break;
	case 101:
		name = 'Backlink Report';
		break;
	case 102:
		name = 'Backlink Änderungs Report';
		break;
	}
	return name;
}

function getReportPeriodName(period) {
	var name;
	switch(period) {
	case '0':
		name = 'nein';
		break;
	case '1':
		name = 'ja - wöchentlich';
		break;	
	case '4':
		name = 'ja - monatlich';
		break;
	default:
		name = period;
		break;
	}
	return name;
}

//general functions
function showDomainsSharingIp(ip) {
	
	var content = "<br><div id=\"loader\"><img src=\"/images/loader.gif\"> loading...</div><div id=\"result\"></div>"; 
	
	$("#dialog-bl-content").html(content);
	
	var dialogString = 
		'$("#dialog-bl").dialog({' +
		    'autoOpen : false,' +
		    'resizable: false,' +
		    'width    : 500,' +
			'modal : true, buttons : {' +
				'Ok'+' : function() {$(this).dialog("close");}' +
			'}'+
		'});';
	
	eval(dialogString);
	$("#dialog-bl").dialog("open");
	
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=getDomainsSharingIp&ip="+ip,
		async : false,
		success : function(result) {
			checkSession(result);
			$('#loader').hide();
			var domains = eval('(' + result + ')');
			if(domains.length > 1) {
				var resultHtml = "Folgende " + domains.length + " Domains teilen sich die IP " + ip + "<br><br>";
				resultHtml += "<div style=\"overflow:auto;max-height:300;\">";
				for(i in domains) {
					var domain = domains[i];
					resultHtml += domain + "<br>";
				}
				resultHtml += "</div>";
			}
			else {
				var resultHtml = "Die Domain " + domains[0] + " ist die einzige im System mit der IP " + ip + "<br>";
			}
			$('#result').html(resultHtml);
		}
	});
}

//some helper functions

function arrayIndexOf(array, el) {
    for(var i = 0; i < array.length; i++) {
    	if(el == array[i]) return i;
    }
	return -1;
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function trackEvent(category, action, label, value) {
	
	var x = $('#x').html();
	
	if(typeof(pageTracker) != "undefined") {
 		setTimeout(function() {pageTracker._trackEvent(category, action, x + "|" + label, value);},10);
 	}
}

function trackUserAction(actionUID, label, value) {
	
	if(label == null) label = "";
	if(value == null) value = 0;
	
	$.ajax( {
		type : "POST",
		url : "/Programme/SuiteUI/GUI.php",
		data : "action=trackUserAction&actionUID=" + actionUID + "&label=" + label + "&value=" + value,
		async : true,
		success : function(result) {
			result = result + " ";
		}
	});
}

var executingArray = new Array();
function executing(name, finished) {
	if(finished == null) {
		if(executingArray[name] == null || executingArray[name] == false) {
			executingArray[name] = true;
			return false;
		}
		else {
			return true;			
		}
	}
	else {
		executingArray[name] = false;
	}
}

function openUrl(name, url) {
	if(url == null) {
		url = $('#linkForm input[name=' + name + ']').val();
	}
	window.open(url, 'urlWindow');
}

function checkSession(result) {
	if(result == "SESSION_ENDED") {
		$('#dialogs').append('<div id="dialog-timeout" title="Session Timeout">' + Text.sessionExpired + '</div>');
		var dialogString = 
			'$("#dialog-timeout").dialog({' +
			    'autoOpen : false,' +
			    'resizable: false,' +
				'modal : true, buttons : {' +
					'OK : function() {$(this).dialog("close");reloadPage();}' +
				'},' +
				'close: function(event, ui) { reloadPage(); }' +
			'});';
		eval(dialogString);
		$("#tabs").hide();
		$("#dialog-timeout").dialog("open");
	}
}

function getUrlParam( name )
{
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var tmpURL = window.location.href;
  var results = regex.exec( tmpURL );
  if( results == null )
    return "";
  else
    return results[1];
}

