/**
 * 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.selectedDomainUID = null;
	this.selectedDomainInfo = null;
	this.selectedKeyword = null;
	this.selectedSearchEngine = null;
	this.currentWeek = null;
	this.weeks = null;
	this.weeksToDisplay = null;
	this.weeksToDisplayExtended = null;
	this.searchEngines = null;
	
	
	this.setWeeks = function(weeks) {
		this.weeks = weeks;
		this.weeksToDisplay = new Array();
		this.weeksToDisplayExtended = new Array();
		var count = 1;
		for(var i = weeks.length-1; i >= 0 && count <= 4; i--) {
			this.weeksToDisplay.push(weeks[i]);
			count++;
		}
		var count = 1;
		for(var i = weeks.length-1; i >= 0 && count <= 8; i--) {
			this.weeksToDisplayExtended.push(weeks[i]);
			count++;
		}
		this.weeksToDisplay = this.weeksToDisplay.reverse();
		this.weeksToDisplayExtended = this.weeksToDisplayExtended.reverse();
	};
	
	this.getWeeks = function() {
		return this.weeks;
	};
	
	this.getWeeksToDisplay = function() {
		return this.weeksToDisplay;
	};
	
	this.getWeeksToDisplayExtended = function() {
		return this.weeksToDisplayExtended;
	};
	
	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[limit] == null) {
			$.ajax( {
				type : "POST",
				url : "/Programme/UI/GUI.php",
				data : "action=getUserProductLimit&group=1&limit="+limit,
				async : false,
				success : function(result) {
					Cache.getSingleton().limitsMonitoring[limit] = result;
				}
			});
		}
		return this.limitsMonitoring[limit];
	};
	
	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]);
				this.keywords[colsArray[1]] = currentKeywordInfo;
				keywordCount++;
				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]);
				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) {
		if(this.positions[domainUID] == null) {
			if(callback != null) {
				this.getPositionsFromServer(domainUID, callback);
			}
			return null;
		}
		return this.positions[domainUID];
	};  
	
	this.getPositionsFromServer = function(domainUID, callback) {
		
		showAjaxLoading(true);
		$.ajax( {
			type : "POST",
			url : "/Programme/UI/GUI.php",
			data : "action=getPositionsData&id="+domainUID,
			async : true,
			success : function(result) {
				showAjaxLoading(false);
				Cache.getSingleton().addPositions(domainUID, result);
				if(callback != null) eval(callback);
			}
		});
	};
	
	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/UI/GUI.php",
				data : "action=getPositionsDataForKeywords&id="+domainUID+"&keywords="+unscannedKeywords.join("|"),
				async : true,
				success : function(result) {
					showAjaxLoading(false);
					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", "All displayed keywords are already scanned.", 5000);
		}
	};
	
	this.addDomains = function(domains) {
		
		var resArray = domains.split("###");
		this.setWeeks(resArray[0].split("|"));
		domains = resArray[1];
		
		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]);
				this.addSettings(settings);
				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]] = new ReportSettings(true);
				break;
			}
		}
	};
	
	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) {
		showAjaxLoading(true);
		this.domains = new Array();
		$.ajax( {
			type : "POST",
			url : "/Programme/UI/GUI.php",
			data : "action=getUserDomainOverview",
			async : (callback != null),
			success : function(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;
			}
		}
	};
	
	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) {
		this.settings[settings.domainUID] = settings;
	};
	
	this.getSettings = function(domainUID) {
		return this.settings[domainUID];
	};
	
	this.getLabelName = function(labelNb) {
		return "Label " + (parseInt(labelNb)+1);
	};
}

/**
 * @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 = parseInt(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", "5");
	
	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) {
	this.uid = uid;
	this.name = name;
	this.scan = parseInt(scan);
	this.searchDepth = parseInt(searchDepth) + 20;
	
	this.cpc = new Array();
	this.pages = new Array();
	this.searchesLocal = new Array();
	
	this.labels = new Array();
	
	this.addSearchEngineData = function(se, cpc, pages, searchesLocal) {
		this.cpc[se] = cpc;
		this.pages[se] = pages;
		this.searchesLocal[se] = searchesLocal;
	};
	
	this.wasScanned = function() {
		return (this.scan == 0);
	};
	
	this.getLowerSearchDepth = function(currentDepth) {
		return currentDepth>this.searchDepth ? this.searchDepth : currentDepth; 
	};
	
	this.getMaxSearchesLocal = function() {
		
		var maxSearches = 0;
		for(var i in this.searchesLocal) {
			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 = "Keyword ausblenden";
		//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 id="labels' + this.uid + '"';
		//result += this.getVisibilityIcon();
		for(var i = 0; i < 3; i++) {
			
			var icon;
			switch(i) {
			case 0: icon = "blue"; break;
			case 1: icon = "green"; break;
			case 2: icon = "red"; break;
			}
			
			var action;
			var active = false;
			var desc = "Label " + (i+1) + " setzen";
			if(this.labels[i] != null && this.labels[i] == true) {
				active = true;
				desc = "Label " + (i+1) + " entfernen";
				icon += "-active";
				action = "unsetLabel(" + this.uid + "," + i + ")";
			}
			else {
				icon += "-inactive";
				action = "setLabel(" + this.uid + "," + i + ")";
			}
			
			result += "<a title=\"" + desc + "\" href=\"javascript:" + action + "\">"
			+ "<img border=\"0\" src=\"/images/gui/label-" + icon + ".png\"/></a> ";
		}
		result += "</span>";
		return result;
	};
	
	this.setLabel = function(label, active) {
		this.labels[label] = active;
		$('#labels' + this.uid).replaceWith(this.getLabelIcons());
	};
}

function setLabel(keywordUID, label, active) {
	
	if(active == null) {
		active = true;
	}
	
	if(keywordUID != 0) {
		var keywordInfo = Cache.getSingleton().getKeywordInfo(keywordUID);
		
		if(label >= 0) {
			keywordInfo.setLabel(label, active);
		}
		else if(label == -1) {
			//alert("Are you sure?");
			keywordInfo.labels[-1] = active;
			$('#labels' + keywordUID).parents('tr').remove();
		}
		
		var $tabs = $('#tabs').tabs();
		var selected = $tabs.tabs('option', 'selected');
		switch(selected) {
		case 1:
			buildKeywordOverviewTable(null, null, true);
			break;
		case 2:
			buildSingleKeywordGui(null, true);
			break;
		}
		
		// save to db
		if(loggedIn()) {
			showAjaxLoading(true, "Einstellung wird gespeichert...", false);
			$.ajax( {
				type : "POST",
				url : "/Programme/UI/GUI.php",
				data : "action=setLabel&domainUID=" + Cache.getSingleton().getSelectedDomainUID() + "&keywordUID=" + keywordUID + "&label=" + label + "&active=" + active,
				async : false,
				success : function(result) {
					showAjaxLoading(false);
					var resArray = result.split("###");
					if (resArray[1] == "true") {
						
					}
					else {
						showMessage('#labels' + keywordUID, '<span class="msgError">An error occurred saving your label, please try again later.</span>', 6000);
					}
				}
			});
		}
	}
	else {
		// 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;
		}
		
	}
}

function unsetLabel(keywordUID, label) {
	setLabel(keywordUID, label, false);
}

/**
 * Class DomainSettings
 */
function DomainSettings(domainUID, name, depth, se, columns, searches, mode) {
	
	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.diagramMode = "se";
	
	this.toPostParams = function() {
		return "id="+this.domainUID+"&depth="+this.depth+"&se="+this.se+"&columns="+this.columns+"&searches="+this.searches+"&mode="+this.mode;
	};
	
	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.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 == '') ? 'position' : this.mode;
	};
}

function ReportSettings(send) {
	this.send = send;
}

/**
 * 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] = Text.week + " " + weeksToDisplay[i]; 
		}
		for(i in weeks) {
			weeksLabelsChart[i] = Text.week + " " + weeks[i]; 
		}
		
		var seUIDs = new Array();
		var allSeUIDs = new Array();
		
		var maxDomains = cache.getMonitoringLimit('domains');
		
		var weeksHeaderString = '<th title="' + Text.weekHelp + '">' + weeksHeader.join('</th><th 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=\"9\"><i>Bitte auf ein größeres Paket <a id=\"link\" href=\"/kontoverwaltung/konto-pakete-buchen.html\">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") + "" + domain.name.replace(new RegExp("^http://", "g"), "") + "</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") + domain.name.replace(new RegExp("^http://", "g"), "") + "</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.7,  
		    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=\"/kontoverwaltung/konto-pakete-buchen.html\">upgraden</a>.");
			}
			else {
				$('#addTableContent').css('height', '60px');
				$('#addTable input').attr('disabled', false);
				$('#addDomainLimit').html("");
			}
		}
		else {
			showHighlightedMessage("#message", Text.noDomainsMessage);
			$('#addDomain').accordion( 'activate' , 0 );
		}
				
		// 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.7,  
		    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 '*': 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 '*': return "#464646";
	}
}

function getLabelColor(uid) {
	switch(uid) {
	case '0': return "#007FE8";
	case '1': return "#109618";
	case '2': return "#D62408";
	case '3': return "#7B0099";
	case '4': return "#FFA614";
	case '5': return "#464646";
	}
}

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/UI/GUI.php",
		data : "action=deleteDomain&id=" + domainUID,
		async: false,
		success : function(result) {
			showAjaxLoading(false);
			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 addDomain() {
	var domain = $("#domain").val();
	domain = trim(domain);
	domain = domain.replace(new RegExp("^http://", "g"), "");
	showAjaxLoading(true, Text.msgAddingDomain);
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/GUI.php",
		data : "action=addDomain&domain=" + domain,
		async : true,
		success : function(result) {
			showAjaxLoading(false);
			var resArray = result.split("###");
			if (resArray[1] == "true") {
				$("#domain").val('');
				showMessage('#addDomainResult', '<span class="msgSuccess">'+Text.msgDomainAdded+'</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 = null;
	this.page;
	
	this.addPosition = function(week, position) {
		if(this.positions == null) {
			this.positions = new Array();
		}
		this.positions[week] = position;
	};
}

function buildKeywordOverviewTable(subselection, keywordUID, onlyDiagram) {
	
	if(subselection == null || subselection instanceof Object) {
		var $tabs = $('#subsection').tabs();
		var selected = $tabs.tabs('option', 'selected');
		subselection = selected;
	}
	
	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 positions = cache.getPositions(selectedDomainInfo.uid, 'buildKeywordOverviewTable("' + subselection + '",' + keywordUID + ')');
	
	if(positions != null) {
		if(!isDemo()) {
			showAjaxLoading(true, Text.ajaxUpdating, false);
			setTimeout('proceedBuildingKeywordOverviewTable("' + subselection + '",' + keywordUID + ',' + onlyDiagram + ')',20);
		}
		else {
			//showAjaxLoading(true, Text.ajaxUpdating);
			proceedBuildingKeywordOverviewTable(subselection, keywordUID, false);
		}
		
	}
}

function proceedBuildingKeywordOverviewTable(subselection, filterKeywordUID, onlyDiagram) {
	
	var cache = Cache.getSingleton();
	var selectedDomainInfo = cache.getSelectedDomainInfo();
	var positions = cache.getPositions(selectedDomainInfo.uid);
	
	if(!loggedIn()) {
		checkLimitations();
	}
	
	var mode = $("select#mode").val();
	var filterDepth = $("select#depth").val();
	filterDepth = parseInt(filterDepth);
	var filterSE = $("select#se").val();
	var filterSearches = $("select#searches").val();
	var tableColumns = $("select#tableColumns").val();
	var diagramMode = $("select#diagramMode").val();
	if(diagramMode == null) {
		diagramMode = 'se'; 
	}
	var showHidden = $("input#showHidden").attr('checked');
	var filterText = "";
	if($("#textFilter").length != 0 && $("#textFilter").val() != "") {
		filterText = $("#textFilter").val();
		try {
			"".match(filterText);
		}
		catch(e) {
			showMessage("#info", "Invalid regular expression: " + e, 5000);
			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;
			domainName += '<a href="javascript:nextDomain(-1)" title="Zurück zu ' + name + '"><img src="/images/navigate_left.png" border="0"></a> ';
		}
		else {
			domainName += '<img src="/images/navigate_left_disabled.png" border="0" title="Dies ist die erste Domain.">';
		}
	}
	domainName += selectedDomainInfo.name.replace(new RegExp("^http://", "g"), "");
	if(!isReport()) {
		if(nextDomainUID[0] != -1) {
			var name = cache.domains[nextDomainUID[1]].name;
			domainName += ' <a href="javascript:nextDomain(1)" title="Weiter zu ' + name + '"><img src="/images/navigate_right.png" border="0"></a>';
		}
		else {
			domainName += '<img src="/images/navigate_right_disabled.png" border="0" title="Dies ist die letzte Domain.">';
		}
	}
	$("#domainName").html(domainName);
	
	
	if(positions != null) {
		
		var weeks = cache.getWeeks();
		var week1 = weeks[weeks.length-1];
		var week2 = weeks[weeks.length-2];
		
		var weeksToDisplay;
		if(tableColumns == "time") {
			weeksToDisplay = cache.getWeeksToDisplayExtended();
		}
		else {
			weeksToDisplay = cache.getWeeksToDisplay();
		}
		
		if(subselection == 'distribution') {
			var distribution = new Array();
			
			var nbOfRanges = 10;
			if(filterDepth < 50) nbOfRanges = 5;
			var step = Math.round(filterDepth / nbOfRanges);
			var distributionRanges = new Array();
			for(var i = 1; i <= nbOfRanges; i++) {
				distributionRanges.push(step*i);
			}
		}
		
		// prepare table data
		var debug = "";
		var tableRows = new Array();
		var keywordUIDs = new Array();
		var positionsAvailable = false;
		for(row in positions) {
			var position = positions[row];
			
			keywordUIDs[position.keywordUID] = true;
			
			positionsAvailable = true;
			
			var keywordInfo = cache.getKeywordInfo(position.keywordUID);
			
			//TODO
			if(keywordInfo == null) {
				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 local searches volume
			if(mode == "osr" && (keywordInfo.searchesLocal[position.system] == null || keywordInfo.searchesLocal[position.system] == 0)) {
				continue;
			}
			
			// Search Engine filter
			if(filterSE != "*" && arrayIndexOf(filterSE.split("-"),position.system) == -1) {
				continue;
			}
			
			// Local Searches filter
			if(filterSearches != "0" && keywordInfo.getMaxSearchesLocal() < parseInt(filterSearches)) {
				continue;
			}
			
			// Single keyword filter
			if(filterKeywordUID != null && filterKeywordUID != position.keywordUID) {
				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 keyword = keywordInfo.name;
				 try {
					 var result = keyword.match(filterText);
					 if(!result) {
						 continue;
					 }
				 }
				 catch(e) {
				 }
			}
			
			var key = position.keywordUID + "#" + position.system;
			if(subselection == "positionsPages") {
				key += "#" + position.page;
			}
			
			if(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);
				tableRows[key] = tableRow;
			}
			else {
				if(tableRows[key].positions[position.week] == null || position.position < tableRows[key].positions[position.week]) {
					tableRows[key].addPosition(position.week, position.position);
					tableRows[key].page = position.page;
				}
			}
			
			//$('#debug').html(debug);
		}
		
		// 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 && !showHidden && cache.userKeywords[selectedDomainInfo.uid] != null) {
			for(keywordUID in cache.userKeywords[selectedDomainInfo.uid]) {
				if(keywordUIDs[keywordUID] == null) {
					if(filterText != "") {
						 var keyword = "* " + cache.getKeywordInfo(keywordUID).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(cache.getKeywordInfo(keywordUID).labels[i] == true) {
								labelMatched = true;
								break;
							}
						}
					}
					if(labelMatched === false) {
						continue;
					}
					var tableRow = new KeywordOverviewTableRow();
					tableRow.keywordUID = keywordUID;
					tableRow.system = "*";
					tableRows[keywordUID] = tableRow;
				}
			}
		}
		
		
		// build table header
		var table = "<table width=\"100%\" class=\"tablesorter\" cellspacing=\"1\">";
		
		var weeksHeader = new Array();
		var weeksLabelsChart = new Array();
		var nbOfWeeks = 0;
		
		for(i in weeksToDisplay) {
			weeksHeader[i] = Text.week + " " + weeksToDisplay[i];
			nbOfWeeks++;
		}
		for(i in weeks) {
			weeksLabelsChart[i] = Text.week + " " + weeks[i]; 
		}
		var indexCurrentWeek = weeks.length-1;
		var index1WeekAgo    = weeks.length-2;
		if(!isDemo()) {
			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 averages = new Array();
		var distinctKeywords = new Array();
		
		var keywordColumn = "";
		//if(filterKeywordUID == null) {
			keywordColumn = "<th title=\"" + Text.keywordHelp + "\">" + Text.keyword + "</th>";
			if(!isDemo()) {
				keywordColumn += "<th title=\"" + Text.labelsHelp + "\">" + Text.labels + "</th>";
			}
		//}
		
		table += "<thead><tr>" + keywordColumn + "<th title=\"" + Text.seHelp + "\">" + Text.searchEngine + "</th>" + weeksHeaderString;
		
		if(subselection == "positionsPages" || tableColumns == "page") {
			table += "<th title=\"" + Text.pageHelp + "\">" + 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.oneWeekTrend + "</th><th title=\"" + Text.fullTrendHelp + "\">" + Text.fullTrend + "</th>";
		}
		
		// add actions only if not in single keyword tab
		if(filterKeywordUID == null && !isReport() && !isDemo()) {
			table += "<th>" + Text.actions + "</th>";
		}
		table += "</tr>";
		
		
		table += "</thead><tbody>";
		for(row in tableRows) {
			var tableRow = tableRows[row];
			var keywordInfo = cache.getKeywordInfo(tableRow.keywordUID);
				
			tableRowString = "<tr>";
			
			var isUserKeyword = false;
			if(cache.userKeywords[selectedDomainInfo.uid] != null && cache.userKeywords[selectedDomainInfo.uid][keywordInfo.uid] != null) {
				isUserKeyword = true;
			}
			
			//if(filterKeywordUID == null) {
				var mark = "";
				if(isUserKeyword) mark = "* ";
				tableRowString += "<td><b>" + mark + keywordInfo.name + "</b></td>";
				if(!isDemo()) {
					tableRowString += "<td>" + keywordInfo.getLabelIcons() + "</td>";
				}
			//}
			if(tableRow.system != null) {
				tableRowString += 	"<td>" + getSearchEngineName(tableRow.system) + "</td>";
			}
			else {
				tableRowString += "<td>" + Text.noResultsSoFar + "</td>";
			}
			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;
				}
			}
			
			for(i in weeks) {
				var interpolated = false; 
				var position = '';
				var positionStr = '';
				var tdClass = '';
				var tdTitle = '';
				
				if(tableRow.positions != null && tableRow.positions[weeks[i]] != null) {
					position = tableRow.positions[weeks[i]];
				}
				else {
					tdClass = ' id="est"';
						
					// value missing
					if(i == indexCurrentWeek) {
						// value missing for current week, check if keyword was already scanned
						if(keywordInfo.wasScanned()) {
							position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
							tdClass = '';
						}
						else {
							position = lastPosition;
							tdTitle = Text.unscannedPositionHelp;
						}
					}
					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;
								tdTitle = Text.unknownPositionHelp;
							}
							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;
									tdClass = '';
									if($("#x").html() == "wise") {
										interpolated = true; 
									}
									//alert(weeks[i] + ":" + interpolationStep + "," + interpolatedValue);
								}
								else {
									// we assume it was scanned but > max
									position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
									tdClass = '';
								}
							}
						}
						else {
							// no position data at all so far for this keyword
							position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
							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;
					}
				}
				
				positionOrig = position;
				lastPosition = position;
				positionStr = position;
				
				if(interpolated) {
					positionStr = "~" + positionStr + "~";
				}
				
				
				if(parseInt(position) <= filterDepth){
					allPositionsOverDepth = false;
				}
				
				if(parseInt(position) > keywordInfo.getLowerSearchDepth(filterDepth)) {
					positionStr = "&gt;" + (keywordInfo.getLowerSearchDepth(filterDepth));
					position = keywordInfo.getLowerSearchDepth(filterDepth)+1;
				}
				
				// OSR (Organic Serp Ranking) Calculation
				if(mode == "osr") {
					var basePosition = position;
					var searchesLocal = keywordInfo.searchesLocal[tableRow.system];
					if(searchesLocal != 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);
						position = Math.log(searchesLocal)/Math.pow((0.1*position+0.9),1.5);
					}
					else {
						position = 0;
					}
					positionStr = Math.round(position*100)/100;
					tdTitle = "Position: " + basePosition + " " + tdTitle;
				}
				
				// add week column if week has to be displayed
				if(arrayIndexOf(weeksToDisplay, weeks[i]) != -1) {
					if(tdTitle != '') {
						tdTitle = " title=\"" + tdTitle + "\"";
					}
					tdOldweek = '';
					if(isDemo()) {
						if(i >= indexCurrentWeek-1) {
							if(i != indexCurrentWeek) {
								tdOldweek = ' class="oldweek"';
							}
							tableRowString += 	"<td" + tdOldweek + tdClass + tdTitle + ">" + positionStr + "</td>";
						}
					}
					else {
						tableRowString += 	"<td" + tdClass + tdTitle + ">" + positionStr + "</td>";
					}
				}
				tmpPositions[weeks[i]] = position;
				
				// compute trends if this is one of the two desired weeks
				if(i == indexCurrentWeek && tableColumns == 'trend') {
					var oneWeekTrend    = ((position1WeekAgo-position) / position1WeekAgo * 100).toFixed(1);
					if(mode == 'osr') {
						oneWeekTrend = -oneWeekTrend;
					}
					if(oneWeekTrend > 0) oneWeekTrend = "+" + oneWeekTrend;
					var fullTrend       = ((firstPosition-position) / firstPosition    * 100).toFixed(1);
					if(mode == 'osr') {
						fullTrend = -fullTrend;
					}
					if(fullTrend > 0) fullTrend = "+" + fullTrend;
					tableRowString += 	"<td>" + oneWeekTrend + " %</td><td>" + fullTrend + " %</td>";
				}
				else if(i == 0) {
					var firstPosition = position;
				}
				else if(i == index1WeekAgo) {
					var position1WeekAgo = 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(subselection == "positionsPages" || tableColumns == "page") {
				var url = selectedDomainInfo.name + tableRow.page;
				tableRowString += "<td>" + getTableActions([url + "#" + url + "#openUrl"], "openUrl") + tableRow.page + "</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") {
				
			}
			
			
			if(filterKeywordUID == null && !isReport() && !isDemo()) {
				tableRowString += 	"<td> ";
				tableRowString += keywordInfo.getVisibilityIcon();
				// add actions if not single keyword and positions are available
				if(tableRow.positions != null) {
					tableRowString += getTableActions(["showSingleKeyword#"+Text.actionShowKeyword], keywordInfo.uid);
				}
				tableRowString += "</td>";
			}
			
			tableRowString += "</tr>";
			
			if(!allPositionsOverDepth || isUserKeyword) {
				table += tableRowString;
				if(arrayIndexOf(distinctKeywords, keywordInfo.uid) == -1) {
					distinctKeywords.push(keywordInfo.uid);
				}
				if(tableRow.system != null && tableRow.system != "*") {
					for(week in tmpPositions) {
						position = tmpPositions[week];
						
						var keys = new Array();
						if(diagramMode == "se") {
							keys.push(tableRow.system);
						}
						else {
							for(var i in keywordInfo.labels) {
								if(i >= 0 && keywordInfo.labels[i] == true) {
									keys.push(i);
								}
							}
						}
						
						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);
						}
					}
				}
			}
		}
		table += "</tbody></table>";
		
		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 <a href=\"http://www.web-information-services.de\">WISE SEO Suite</a></h2>"		
				+ table
				+ "<br>");
				
				if(distinctKeywords.length == 0) {
					$('#tableDiv').append("<div style=\"font-size=1.1em;\">Leider wird <b>keine Seite dieser Domain</b> für eines der über 150.000 Keywords aus unserem Keyword-Pool von einer Suchmaschine <b>unter den ersten 200-300 Positionen gelistet.</b><br>" +
							"Die WISE SEO Suite bietet jedoch die Möglichkeit, beliebig viele eigene Keywords und Kombinationen zu erfassen und scannen zu lassen.</div>");
				}
			}
			else {
				$('#tableDiv').html(table);
			}
			if(distinctKeywords.length > 0) {
				//$('#tableDiv table').tablesorter({headers: {2: {sorter:"currency"}}});
				var lastWeekColumn = 2 + nbOfWeeks;
				var sortOrder = 0;
				if(mode == 'osr') {
					sortOrder = 1;
				}
				if(isDemo()) {
					lastWeekColumn -= 3;
				}
				$('#tableDiv table').tablesorter({'sortList': [[lastWeekColumn, sortOrder]]});
			}
			else {
				$('#tableDiv table').tablesorter();
			}
			
			$("#tableDiv th[title],#tableDiv td[title][id]").tooltip({  
			    position: "top center",  
			    offset: [-2, 10],  
			    effect: "fade",  
			    opacity: 0.7,  
			    tip: '.tooltip',
			    lazy: true,
			    predelay:300
			});
			
			//if(isDemo()) {
			//	$('.oldweek').hide();
			//}
		}
		if(positionsAvailable) {
			$('#message').html('');
		}
		else {
			showHighlightedMessage("#message", Text.noPositionsMessage);
			$('#addKeyword').accordion( 'activate' , 0 );
		}
		
		
		// draw chart if not in demo mode
		if(!isDemo()) {
			var textFilterTitle = '';
			if(filterText != '') {
				textFilterTitle = ' (' + Text.filter + ': "' + filterText + '")';
			}
			
			switch(subselection) {
			case 'positionsDomain':
			case 'positionsPages':	
				if(filterKeywordUID == null) {
					if(mode != "osr") {
						var text = Text.singleDomainChartTitle;
					}
					else {
						var text = Text.singleDomainOSRChartTitle;
					}
					
					text = text.replace('<nb>', distinctKeywords.length).replace('<pos>', filterDepth);
					text += textFilterTitle;
					$("#chartTitle").html(text);
					//$("#chartTitle").html("Average Position of all " + distinctKeywords.length + " Keywords " + textFilterTitle + "down to Position " + filterDepth);
				}
				else {
					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);
				}
				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) {
							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);
					}
					
					var seriesName;
					var seriesColor;
					
					if(diagramMode == 'se') {
						seriesName = getSearchEngineName(seUID);
						seriesColor = getSearchEngineColor(seUID);
					}
					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>', distinctKeywords.length).replace('<pos>', filterDepth);
				text += textFilterTitle;
				$("#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 + " " + week, weeksDistribution);
				}
						
				chart.draw(false, "bar");
			break;
			}
		}
	}
	showAjaxLoading(false);

	// event tracking
	var action = 'buildSingleDomainTab';
	if(filterKeywordUID != null) {
		action = 'buildSingleKeywordTab';
	}
	
	if(isReport()) {
		$('#tableDiv').append(" <span style=\"display:none;\">Report ist erstellt</span>");
	}
	
	trackEvent('UI', action, 'maxp:'+filterDepth + ',mins:' + filterSearches + ',tmode:' + tableColumns + ',se:' + filterSE + ',filter:' + filterText + ',#keyw:' + distinctKeywords.length);
}

function addKeyword() {
	var keyword = $("#keyword").val();
	keyword = trim(keyword);
	var selectedDomainInfo = Cache.getSingleton().getSelectedDomainInfo();
	showAjaxLoading(true, Text.msgAddingKeyword);
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/GUI.php",
		data : "action=addKeyword&id=" + selectedDomainInfo.uid + "&keyword=" + keyword,
		async : true,
		success : function(result) {
			var resArray = result.split("###");
			if (resArray[1] == "true") {
				$("#keyword").val('');
				showMessage('#addKeywordResult', '<span class="msgSuccess">'+Text.msgKeywordAdded+'</span>');
				Cache.getSingleton().addPositions(resArray[2], resArray[3]);
				buildKeywordOverviewTable();
			}
			else if(resArray[1] == "dup") {
				showAjaxLoading(false);
				showMessage('#addKeywordResult', '<span class="msgError">'+Text.msgKeywordDup+'</span>');
			} 
			else if(resArray[1] == "toLong") {
				showAjaxLoading(false);
				showMessage('#addKeywordResult', '<span class="msgError">'+Text.msgKeywordToLong+'</span>');
			} 
			else {
				showAjaxLoading(false);
				showMessage('#addKeywordResult', '<span class="msgError">'+Text.msgKeywordError+'</span>');
			}
		}
	});
	trackEvent('UI', 'addKeyword', keyword);
}

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 = action;
			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();
	var password = $("#password").val();
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/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();
				location.href = "http://www.seo-keyword-tools.de/seo-suite.html";
				//buildGui();
			} else {
				showMessage('#loginResult', resArray[1], 5000);
			}
		}
	});
};

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;
	}
	return se;
}

function startDemo() {
	
	if(!executing("demo")) {
	
		var domain = $("#demoDomain").val();
		domain = trim(domain);
		domain = domain.replace(new RegExp("^http://", "g"), "");
		
		var se = getSeForDomain(domain);
		
		showAjaxLoading(true);
		this.domains = new Array();
		$.ajax( {
			type : "POST",
			url : "/Programme/UI/GUI.php",
			data : "action=getPositionsDataForDemo&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];
					$('#demo').hide();
					
					$('#demo').after("<span style=\"float:right;\"><a href=\"javascript:reloadPage()\">Neue Analyse starten</a></span><br>");
					$('#demo').after("<h1><img src=\"/images/check.png\"> Ranking Daten für " + domain + " verfügbar</h1>");
					cache.domains = new Array();
					cache.domains.push(new DomainInfo(domainUID, domain));
					cache.setSelectedDomainUID(domainUID);
					cache.addSettings(new DomainSettings(domainUID, domain));
					buildGui(1);
					
				}
				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);
				}
				executing("demo", "finished");
			}
		});
	}
};

function logout() {
	document.body.style.cursor = "wait";
	$('#sessioninfo, #sessioninfo *').css('cursor', 'wait'); 
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/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") {
				reloadPage();
				//$('#contentHeader').html("");
				//$('#sessioninfo').html(resArray[1]);
			}
		}
	});
};

function register() {

	document.body.style.cursor = "wait";
	var dataString = $('#form').serialize(); 
	//alert(dataString);
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/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"); 
			}
			else {
				showMessage('#error',resArray[2], 4000);
			}
		}
	});
};

function selectProduct(group, uid) {
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/Gui.php",
		data : "action=selectProduct&productUID=" + uid + "&group=" + group,
		success : function(result) {
			//document.body.style.cursor = "default";
			var resArray = result.split("###");
			$('#sum-' + group).html(resArray[0]);
		}
	});
};

function changeProduct(group) {
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/Gui.php",
		data : "action=changeProduct&group=" + group,
		success : function(result) {
			//document.body.style.cursor = "default";
			var resArray = result.split("###");
			$('#change-' + group).html(resArray[0]);
			$('#change-' + group).fadeIn();
		}
	});
};

function selectPeriod(group) {
	var period = $('#period-' + group).val();
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/Gui.php",
		data : "action=selectPeriod&period=" + period + "&group=" + group,
		success : function(result) {
			//document.body.style.cursor = "default";
			var resArray = result.split("###");
			$('#sum-' + group).html(resArray[0]);
		}
	});
};

function transactionStep(step, useSpiderCredit) {
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/Gui.php",
		data : "action=transactionStep&step=" + step + "&useSpiderCredit=" + useSpiderCredit,
		success : function(result) {
			//document.body.style.cursor = "default";
			//var resArray = result.split("###");
			//$('#sum-' + group).html(resArray[0]);
			reloadPage();
		}
	});
};


function buildGui(selectedTab) {
	
	$('#annotations').html('');
	
	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);}' +
		'}'+
	'});';
	
	var dialogHideKeywordString = 
		'$("#dialog-confirm-hide-keyword").dialog({' +
		    'autoOpen : false,' +
		    'resizable: false,' +
			'modal : true, buttons : {' +
				Text.hideButton+' : function() {$(this).dialog("close");var keywordUID = Cache.getSingleton().getSelectedKeyword();setLabel(keywordUID,-1);},' +
				Text.cancelButton+' : function() {$(this).dialog("close");}' +
			'}'+
		'});';
		
	
	// init dialogs
	eval(dialogString);
	eval(dialogHideKeywordString);
	
	//var se = $("select#se").val();
	var domainInfo = Cache.getSingleton().getSelectedDomainInfo();
	if(domainInfo != null) {
		var settings   = Cache.getSingleton().getSettings(domainInfo.uid);
		if(settings != null) {
			var se = settings.getSE();
		}
	}
	
	if(isReport()) {
		$('#canvas').after("<img src=\"/design/spacer.gif\" height=\"300\">");
	}
	
	if(!loggedIn()) {
		
		
		//$("#tabs").tabs('disable', 0);
		//$("#tabs").tabs('disable', 3);
		
		if(domainInfo == null) {
			var html = '<br>' + Text.notLoggedInMessage;
			$('#contentHead').html(html);
			$('#canvas').hide();
		}
		else {
			
			var settings = new DomainSettings(domainInfo.uid, domainInfo.name);
			
			//var searchEngines = domainInfo.availableSearchEngines;
			switch(selectedTab) {
			case 1:
				//$('#canvas').show();
				var html = '<table width="100%" style="display:none;">' + 
			    		'<tr valign="top"><td><div id="domainName"></div></td><td width="57%">' +
			    		'<div id="settings"><h3><a href="#">' + Text.settingsAndFilters + '</a></h3><div>' +
							'<table style="border-collapse:collapse;">' +
								'<tr><td>' + Text.settingsMode + '</td><td>' + buildModeSelect("Position") + '</td></tr> ' +
								'<tr><td>' + Text.settingsPosition + '</td><td>' + buildDepthSelect(999) + '</td></tr> ' +
								'<tr><td>' + Text.settingsSearches + '</td><td>' + buildSearchesSelect(0) + '</td></tr> ' +
								'<tr><td>' + Text.settingsSearchEngine + '</td><td>' + buildSearchEngineSelect(settings.getSeTldBased(false), ['1', '2', '3', '5'], null) + '</td></tr>' + 
								'<tr id="tableMode"><td>' + Text.settingsTableMode + '</td><td>' + buildTableColumnsSelect("page") + '</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="saveSettings" onclick="saveSettings()" value="' + Text.settingsSave + '" title="' + Text.settingsSaveHelp + '" disabled><div id="saveSettingsResult"></div></td></tr>' +
								'<tr class="light"><td>' + Text.filterText + '</td><td><input type="text" id="textFilter" title="' + Text.filterTextHelp + '"></td></tr>' +
							'</table><div id="info"></div>' +
						'</div></div></td></tr>' +
					'</table>';
							
				var addHtml = '<table id="addTable"><tr><td><div id="addKeyword"><h3><a href="#">' + Text.addKeyword + '</a></h3><div>' +
				'<table><tr><td>' + Text.addKeyword + ': <input type="text" id="keyword" title="' + Text.addKeywordHelp + '" disabled></input> <input type="button" value="' + Text.add + '" onclick="addKeyword()" disabled></input> <input id="refreshKeywords" type="button" id="refresh" value="' + Text.refreshKeywords + '" onclick="checkForNewPositions()" title="' + Text.refreshKeywordsHelp + '" disabled></td></tr><tr><td><span id="addKeywordResult"></span><span id="refreshResult"></span></td><td>&nbsp;</td>' +
				'</tr></table></div></div></td></tr></table>';
				
				$('#contentHead').html(html);
				//$('#addDiv').html(addHtml);
				
				//$('#addKeyword').accordion({collapsible:true,active:false,change: function(event, ui) { showRegistrationHint(); }});
			
				//$('#subsection').tabs().bind('tabsselect', function (event, ui) {
			    //    event.stopPropagation();
			    //});
				//$('#subsection').bind('tabsselect',  function(event, ui) {
				//	buildKeywordOverviewTable(ui.index);
				//});
				
				//$('select#mode').change(buildKeywordOverviewTable);
				//$('select#mode').change(showRegistrationHint);
				//$('select#depth').change(buildKeywordOverviewTable);
				//$('select#se').change(buildKeywordOverviewTable);
				//$('select#tableColumns').change(buildKeywordOverviewTable);
				//$('select#searches').change(buildKeywordOverviewTable);
				//$('select#diagramMode').change(buildKeywordOverviewTable);
				//$('#textFilter').keyup(applyTextFilter);
				
				//$('#textFilter,#keyword,#refreshKeywords').tooltip({opacity: 0.8, tip:'.tooltip', offset:[-5,0], predelay:300});
				$('a[href=#sub]').tooltip({opacity: 0.8, tip:'.tooltip', offset:[-5,0], predelay:500});
				//$('#mode option').tooltip({position: 'center left', opacity: 0.8, tip:'.tooltipWide', offset:[-5,-5], predelay:0});
				//$('#settings').accordion({collapsible:true, active:false, change:function(event, ui) {trackUserAction(16);}});
			
				buildKeywordOverviewTable(1);
			break;
			case 2:
				
				var searchEngines = domainInfo.availableSearchEngines;
				var selectedKeyword = Cache.getSingleton().getSelectedKeyword();
				
				var keywordSelectHtml = buildKeywordSelect(selectedKeyword, "1", 220, 0);
				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><div id="domainName"></div>' +
				    		'<b>Keyword ' + keywordSelectHtml + ' </b>' +
							'<div id="keywordNavigation"><input type="button" value=" <- " onclick="stepSelect(\'#keyword\',\'up\')"><input type="button" value=" -> " onclick="stepSelect(\'#keyword\',\'down\')"></div>' +
							'</td><td width="57%">' +
				    		'<div id="settings"><h3><a href="#">' + Text.settingsAndFilters + '</a></h3><div>' +
								'<table>' +
									'<tr><td>' + Text.settingsPosition + '</td><td>' + buildDepthSelect(220) + '</td></tr> ' +
									'<tr><td>' + Text.settingsSearches + '</td><td>' + buildSearchesSelect(0) + '</td></tr> ' +
									'<tr><td>' + Text.settingsSearchEngine + '</td><td>' + buildSearchEngineSelect('1', ['1', '2', '3'], null) + '</td></tr>' + 
									'<tr id="tableMode"><td>' + Text.settingsTableMode + '</td><td>' + buildTableColumnsSelect("page") + '</td></tr>' +
									'<tr><td>' + Text.settingsLabelsFilter + '</td><td>' + buildLabelsSelect(settings.keywordInfo) + '</td></tr>' +
									'<tr><td colspan="2"><input type="button" id="saveSettings" onclick="saveSettings()" value="' + Text.settingsSave + '" title="' + Text.settingsSaveHelp + '" disabled><div id="saveSettingsResult"></div></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, change:function(event, ui) {trackUserAction(16);}});
				buildSingleKeywordGui();
			break;
			}
		}
	}
	else {
		$('#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>';
				$('#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 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%">' + 
			    		'<tr valign="top"><td><div id="domainName"></div></td><td width="57%">' +
			    		'<div id="settings" ' + style + '><h3><a href="#">' + Text.settingsAndFilters + '</a></h3><div>' +
							'<table style="border-collapse:collapse;">' +
								'<tr><td>' + 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>' + Text.settingsSearchEngine + '</td><td>' + buildSearchEngineSelect(se, searchEngines, settings) + '</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="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>' +
								'<tr class="light"><td>' + Text.filterText + '</td><td><input type="text" id="textFilter" title="' + Text.filterTextHelp + '"></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 addHtml = '<table id="addTable" ' + style + '><tr><td><div id="addKeyword"><h3><a href="#">' + Text.addKeyword + '</a></h3><div>' +
			'<table><tr><td>' + Text.addKeyword + ': <input type="text" id="keyword" title="' + Text.addKeywordHelp + '"></input> <input type="button" value="' + Text.add + '" onclick="addKeyword()"></input> <input id="refreshKeywords" type="button" id="refresh" value="' + Text.refreshKeywords + '" onclick="checkForNewPositions()" title="' + Text.refreshKeywordsHelp + '"></td></tr><tr><td><span id="addKeywordResult"></span><span id="refreshResult"></span></td><td>&nbsp;</td>' +
			'</tr></table></div></div></td></tr></table>';
			
			$('#contentHead').html(html);
			$('#addDiv').html(addHtml);
			
			$('#addKeyword').accordion({collapsible:true,active: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);
			});
			
			$('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);
			
			$('#textFilter,#keyword,#refreshKeywords').tooltip({opacity: 0.8, tip:'.tooltip', offset:[-5,0], predelay:300});
			$('a[href=#sub]').tooltip({opacity: 0.8, tip:'.tooltip', offset:[-5,0], predelay:500});
			$('#mode option').tooltip({position: 'center left', opacity: 0.8, tip:'.tooltipWide', offset:[-5,-5], predelay:0});
			$('#settings').accordion({collapsible:true,active:false});
			buildKeywordOverviewTable();
		break;
		
		case 2:

			var searchEngines = domainInfo.availableSearchEngines;
			var selectedKeyword = Cache.getSingleton().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><div id="domainName"></div>' +
			    		'<b>Keyword ' + keywordSelectHtml + ' </b>' +
						'<div id="keywordNavigation"><input type="button" value=" <- " onclick="stepSelect(\'#keyword\',\'up\')"><input type="button" value=" -> " onclick="stepSelect(\'#keyword\',\'down\')"></div>' +
						'</td><td width="57%">' +
			    		'<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, settings) + '</td></tr>' + 
								'<tr id="tableMode"><td>' + Text.settingsTableMode + '</td><td>' + buildTableColumnsSelect(settings.columns) + '</td></tr>' +
								'<tr><td>' + Text.settingsLabelsFilter + '</td><td>' + buildLabelsSelect(settings.keywordInfo) + '</td></tr>' +
								'<tr><td colspan="2"><input type="button" id="saveSettings" onclick="saveSettings()" value="' + Text.settingsSave + '" title="' + Text.settingsSaveHelp + '"><div id="saveSettingsResult"></div></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});
			buildSingleKeywordGui();
		break;
		
		case 3:
			$('#canvas').hide();
			$('#contentHead').html(
					"<h2>Reports Konfiguration</h2>" +
					"Die <b>PDF Reports</b> werden wöchentlich am Wochenende generiert und <b>per E-Mail</b> verschickt, so dass sie am Montag bereits in Ihrem Postfach für Sie bereitliegen.<br><br>");
			$('#addDiv').html("");
			
			
			// build report selection table
			var cache = Cache.getSingleton();
			var domains = cache.getDomains();
			if(domains != null) {
				var table = "<table id=\"mainTable\" class=\"tablesorter\" cellspacing=\"1\">";
				
				var maxDomains = cache.getMonitoringLimit('domains');
				
				table += "<thead><tr><th>Report</th><th>Ein/Aus</th>";
								
				table += "</tr></thead><tbody>";
				
				
				var selected = "";
				if(cache.reportSettings[0] != null && cache.reportSettings[0].send == true) {
					selected = " CHECKED";
				}
				table += "<tr>";
				table += 	"<td><img src=\"/images/pdf.gif\"> Übersichtsreport aller Domains</td>";
				table += 	"<td><input id=\"0\" type=\"checkbox\"" + selected + "/></td>";
				table += "</tr>";
				
				var domainNb = 0;
				for(row in domains) {

					domainNb++;
					var domain = domains[row];
					
					if(domainNb <= maxDomains) {
						
						var selected = "";
						if(cache.reportSettings[domain.uid] != null && cache.reportSettings[domain.uid].send == true) {
							selected = " CHECKED";
						}
						
						table += "<tr>";
						table += 	"<td><img src=\"/images/pdf.gif\"> Einzelreport für " + domain.name.replace(new RegExp("^http://", "g"), "") + "</td>";
						table += 	"<td><input id=\"" + domain.uid + "\" type=\"checkbox\"" + selected + "/></td>";
						table += "</tr>";
					}
				}
				table += "</tbody></table>";
				
				$('#tableDiv').html(table);
				$('#tableDiv input').change(function() {
					showAjaxLoading(true, "Einstellung wird gespeichert...", false);
					var domainUID = $(this).attr('id');
					var send = false;
					if ($(this).attr('checked')) {
					    send = true;
					}
					$.ajax( {
						type : "POST",
						url : "/Programme/UI/GUI.php",
						data : "action=setReportSetting&domainUID=" + domainUID + "&send=" + send,
						async : false,
						success : function(result) {
							showAjaxLoading(false);
							var resArray = result.split("###");
							if (resArray[1] == "true") {
								cache.reportSettings[domainUID].send = send;
							}
							else {
								$(this).html('<span class="msgError">An error occurred saving your setting, please try again later.</span>');
							}
						}
					});
				});
			}
				
		break;
			
		}
	}
	
	if(selectedTab != null) {
		trackEvent('UI', 'Tab selected', selectedTab);
	}
};

function buildSearchEngineSelect(currentSE, searchEngines, settings) {
	html = "";
	html += "<select id=\"se\">";
	html += "<option value=\"*\">alle</option>";
	
	if(settings != null) {
		var allTldBased = settings.getSeTldBased();
		searchEngines = [allTldBased].concat(searchEngines);
	}
	for(i in searchEngines) {
		var selected = "";
		if(searchEngines[i] == currentSE) {
			selected = 'selected="true"';
		}
		html += "<option value=\"" + searchEngines[i] + "\" " + selected + ">" + getSearchEngineName(searchEngines[i]) + "</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 = "alle zeigen";
		}
		else {
			name = depths[i];
		}
		html += "<option value=\"" + depths[i] + "\" " + selected + ">" + name + "</option>"; 
	}
	html += '</select>';
	return html;
}

function buildSearchesSelect(currentSearches) {
	html = "";
	var searches = [0,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 = {'position':Text.modePosition, 'osr':Text.modeOSR};
	var help = {'position':Text.modePositionHelp, 'osr':Text.modeOSRHelp};
	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();
	}
}

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 positions = cache.getPositions(selectedDomainInfo.uid, "buildGui()");
	if(positions != null) {
		var keywords = new Array();
		for(var i in positions) {
			
			var position = positions[i];
			var keywordInfo = cache.getKeywordInfo(position.keywordUID);
			
			if(keywordInfo == null) {
				continue;
			}
			
			// Keyword hidden?
			if(!keywordInfo.isVisible()) {
				continue;
			}
			
			// Label filter
			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 && (searchEngine == "*" || arrayIndexOf(searchEngine.split("-"),position.system) != -1)
					&& arrayIndexOf(keywords, position.keywordUID) == -1
					&& keywordInfo.getMaxSearchesLocal() >= parseInt(searches))
			{
				keywords.push(cache.getKeywordInfo(keywords[i]).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 stepSelect( id, direction ){
    if( direction == 'down'){
            $('#'+id+' option:selected').next().attr('selected','selected');         }
    if( direction == 'up'){
            $('#'+id+' option:selected').prev().attr('selected','selected');
    }
    buildSingleKeywordGui();
}

var textFilterTimer;
function applyTextFilter(e) {
	clearTimeout(textFilterTimer);
	textFilterTimer = setTimeout('buildKeywordOverviewTable()', 700);
}

function loggedIn() {
	return ($("#loggedIn").length);
}

function isReport() {
	return (report == true);
}

function isDemo() {
	return !loggedIn();
}

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();
			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;
		}
		
		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) {
			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;" + msg + "</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 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 depth = $("select#depth").val();
	var se = $("select#se").val();
	var tableColumns = $("select#tableColumns").val();
	var searches = $("select#searches").val();
	var settings = new DomainSettings(selectedDomainInfo.uid, selectedDomainInfo.name, depth, se, tableColumns, searches, mode);
	
	$.ajax( {
		type : "POST",
		url : "/Programme/UI/GUI.php",
		data : "action=saveSettings&"+settings.toPostParams(),
		async : false,
		success : function(result) {
			var resArray = result.split("###");
			if(resArray[1] == "true") {
				Cache.getSingleton().addSettings(settings);
				showMessage("#saveSettingsResult", Text.settingsSaved);
			}
		}
	});
	
	trackEvent('UI', 'saveSettings', settings.toPostParams());
}

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);
	}
}

//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 showDeleteDomainDialog(domainUID) {
	Cache.getSingleton().setSelectedDomainUID(domainUID);
	$("#dialog-confirm").dialog("open");
}

function showHideKeywordDialog(keywordUID) {
	Cache.getSingleton().setSelectedKeyword(keywordUID);
	$("#dialog-confirm-hide-keyword").dialog("open");
}

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/UI/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 checkLimitations() {
	
	var changed = false;
	var cache = Cache.getSingleton();
	var selectedDomainInfo = cache.getSelectedDomainInfo();
	var domainSettings = cache.getSettings(selectedDomainInfo.uid);
	
	var mode = $("select#mode").val();
	var filterDepth = $("select#depth").val();
	filterDepth = parseInt(filterDepth);
	var filterSE = $("select#se").val();
	var filterSearches = $("select#searches").val();
	var tableColumns = $("select#tableColumns").val();
	var diagramMode = $("select#diagramMode").val();
	var filterText = $("#textFilter").val();
	
	if(mode != null && mode != 'position') {
		$("select#mode").val('position');
		changed = true;
	}
	
	if(filterSE != domainSettings.getSeTldBased(false)) {
		$("select#se").val(domainSettings.getSeTldBased(false));
		changed = true;
	}
	
	if(filterSearches != null && filterSearches > 0) {
		$("select#searches").val(0);
		changed = true;
	}
	
	if(tableColumns != 'page') {
		$("select#tableColumns").val('page');
		changed = true;
	}
	
	if(diagramMode != null && diagramMode != 'se') {
		$("select#diagramMode").val('se');
		changed = true;
	}
	
	if(filterText != null && filterText != "") {
		$("#textFilter").val('');
		changed = true;
	}
	
	
	if(changed) {
		showRegistrationHint();
	}
}

function showRegistrationHint() {
	$("#dialog-reginfo").dialog('open');
	trackUserAction(20);
}
