Utils.createPackage(Framework.Modules, "SEOUrlConfig");

Framework.Modules.SEOUrlConfig = {
	CONSTANTS: {		
		ROUND_CHANGE_PERIOD: 15,
		ROUND_MAX_SIZE: 2
	},	
	Legend :{
		Normal: {
			showLegend: 0,
			columnCount: 2			
		},
		Maximized: {
			showLegend: 1,			
			coulmnCount: 9
		}
	},
	BarChart: {
		Normal: {
			bottomMargin: 0,
			showLegend: 0,			
			groupSize: 7,
			label: "Week",
			labelType: "multiple",
			show: "position" 
		},			
		Maximized: {
			bottomMargin: 5,
			showLegend: 1,
			groupSize: 1,
			label: "Days",
			labelType: "single",
			show: "position" 
		},
		Clicked: {
			bottomMargin: 5,
			showLegend: 0
		},
		UnClicked: {
			bottomMargin: 0,
			showLegend: 0
		}		
	}, 
	LineChart: {
		Normal: {
			bottomMargin: 0,
			anchorRadius: 2,
			maxLabelCount: 15,
			showLegend: 0,
			label: "Days",
			show: "position" 
		},
		Maximized: {
			bottomMargin: 10,			
			anchorRadius: 3,
			maxLabelCount: 30,
			showLegend: 1,
			label: "Days",
			show: "position"
		},
		Clicked: {
			bottomMargin: 10,
			showLegend: 0
		},
		UnClicked: {
			bottomMargin: 0,
			showLegend: 0
		}
	},
	AngleChart: {
		Normal: {
			showLegend: 0,			
			label: "Days",
			show: "position",
			anchorRadius: 3
		},			
		Maximized: {
			showLegend: 1,			
			label: "Days",
			show: "position",
			anchorRadius: 4
		},
		Clicked: {
			showLegend: 0
		},	
		UnClicked: {			
			showLegend: 0
		}			
	}, 	
	HorizontalBarChart: {
		Normal: {
			showLegend: 0,
			labelMaxLength: 10 
		},			
		Maximized: {
			showLegend: 1,
			labelMaxLength: -1 // means no abbreviation needed 
		},
		Clicked: {
			showLegend: 0,
			labelMaxLength: -1 // means no abbreviation needed 
		},		
		UnClicked: {			
			showLegend: 0,
			labelMaxLength: 10
		}		
	} 	
}

Framework.Modules.SEOUrl = function(){
	
	
	
	
		
	this.GROUP_TD_WIDTH="50%";	
	this.GROUPING_MENU_HOVERED_CLASS_NAME="groupingMenuHovered_125";
	this.LABEL_TD_WIDTH="5%";
	this.RIGHT_TD_WIDTH="45%";
		
		
	this.obj;	
		
	this.serviceUrl = Framework.seoRankingURL;
	
	this.info;	
	
	this.KEY_ID = "id";
	this.KEY_KEYWORD = "keyword";
	this.KEY_ENGINE = "engine";
	this.KEY_SITE = "site";
	this.KEY_RESULTS = "results";
	this.KEY_RANK = "rank";
	this.KEY_POSITION = "position";
	this.KEY_COUNT = "count";
	this.KEY_DATE = "date";
	
	
	
	this.SHOW_BAR_CHART = 1;
	this.SHOW_HORIZONTAL_BAR_CHART = 2;
	
	this.GROUP_TYPE_ENGINES = "1";
	
	
	this.SHOW_RANK = "rank";
	
	this.lineColors = ["AFD8F8", "F6BD0F", "8BBA00", "FF8E46", "008E8E", "D64646", "8E468E", "588526", "B3AA00", "008ED6", "9D080D", "A186BE", "CC6600", "FDC689", "ABA000", "F26D7D", "FFF200", "0054A6", "F7941C", "CC3300", "006600", "663300", "6DCFF6",
					  "AFD8F8", "F6BD0F", "8BBA00", "FF8E46", "008E8E", "D64646", "8E468E", "588526", "B3AA00", "008ED6", "9D080D", "A186BE", "CC6600", "FDC689", "ABA000", "F26D7D", "FFF200", "0054A6", "F7941C", "CC3300", "006600", "663300", "6DCFF6",
					  "AFD8F8", "F6BD0F", "8BBA00", "FF8E46", "008E8E", "D64646", "8E468E", "588526", "B3AA00", "008ED6", "9D080D", "A186BE", "CC6600", "FDC689", "ABA000", "F26D7D", "FFF200", "0054A6", "F7941C", "CC3300", "006600", "663300", "6DCFF6",
					  "AFD8F8", "F6BD0F", "8BBA00", "FF8E46", "008E8E", "D64646", "8E468E", "588526", "B3AA00", "008ED6", "9D080D", "A186BE", "CC6600", "FDC689", "ABA000", "F26D7D", "FFF200", "0054A6", "F7941C", "CC3300", "006600", "663300", "6DCFF6",
					  "AFD8F8", "F6BD0F", "8BBA00", "FF8E46", "008E8E", "D64646", "8E468E", "588526", "B3AA00", "008ED6", "9D080D", "A186BE", "CC6600", "FDC689", "ABA000", "F26D7D", "FFF200", "0054A6", "F7941C", "CC3300", "006600", "663300", "6DCFF6"
	];
	
	this.footerTable;	
	this.legendElement;
	this.showLegend = false;
	this.showHideDiv;
	
	this.noDataText;
	this.MARGIN_CHART=3;
	//****EDIT****
	
	this.lastResponse;
	
	this.maximized = false;
	this.clicked = false;	
	this.calendarList;
	this.activeIndex;
	this.calendarActiveIndex;
	
    this.HEADERS_WIDTH;
	
	this.serviceConfig = Framework.Modules.SEOUrlConfig;
	this.CONSTANTS = Framework.Modules.SEOUrlConfig.CONSTANTS;
	
	
	this.KEY_RESULT_COUNT = "resultCount";
	this.GROUP_TYPE_SITE = "3";
	

	
	var self = this;
		
	this.groupingList = [			
		{"id": 1, "realId":0, "show": self.SHOW_RANK, "name":"Links", "title": "Links", active:"true"},
		{"id": 2, "realId":1, "show": self.SHOW_RANK, "group":self.GROUP_TYPE_SITE, "name":"Links (URL)", "title": "Links Per URL"},			
		{"id": 3, "realId":2, "show": self.SHOW_RANK, "group":self.GROUP_TYPE_ENGINES, "name":"Links (Search Engine)", "title": "Links Per Search Engine"}
	];
		
	
	var hideShowTest = function(clickedElement, actionType){
		var td;
		var responseData = self.lastResponse.groupedData;
		var originalData = self.lastResponse.data;
		if(actionType == "multiple"){
			td = clickedElement.childNodes[1];
		} else {
			td = clickedElement;
		}
		var localIdArray = clickedElement.localIdArray;		
		var legendTd;
		var activeStatus = 1;
		for(var i=0; i<localIdArray.length; i++){
			legendTd = $("legend_"+localIdArray[i]);
			if(clickedElement.isDisabled == true){
				//show graphic
				clickedElement.title = "hide";
				td.className = "legendActive";
				if(Utils.exist(legendTd)){
					legendTd.className = "legendActive";
					legendTd.title = "hide";
					legendTd.isDisabled = false;
				}
				responseData[localIdArray[i]].disable = "false";
				activeStatus = 1;
			} else {
				//hide graphic
				clickedElement.title = "show";
				td.className = "legendInactive";
				if(Utils.exist(legendTd)){
					legendTd.className = "legendInactive";
					legendTd.title = "show";
					legendTd.isDisabled = true;
				}
				responseData[localIdArray[i]].disable = "true";
				activeStatus = 0;
			}
			if(Utils.exist(self.info.groupType) && self.info.groupType.length > 0 && Utils.exist(self.info.groupType[0])){
				var idArray = responseData[localIdArray[i]][self.KEY_ID];
				for(var j=0; j<idArray.length; j++){
					if(activeStatus == 0){
						originalData[idArray[j]].disable = "true";
					} else {
						originalData[idArray[j]].disable = "false";
					}
					self.saveActiveStatus(idArray[j], activeStatus);	
				}
			} else {
				self.saveActiveStatus(localIdArray[i], activeStatus);
			}
		}
		if (clickedElement.id != "legend_"+localIdArray[0]){
			clickedElement.isDisabled = !clickedElement.isDisabled;
		}
		
		self.drawChart();
	}
	
	this.init= function(){
		
		var	clickFunction = function(obj){
			var newActiveIndex = obj.getAttribute("arrayIndex")		
			if(newActiveIndex != self.activeIndex){				
			//	alert("self.info"+self.info);
				var groupTypeArray = self.info.groupType;
				var newArray = [];
				var group = obj.getAttribute("group");
				groupTypeArray = [group];
				newArray = groupTypeArray;
				self.activeIndex = newActiveIndex;
				self.info.groupType = newArray;
				self.info.show = obj.getAttribute("show");
				self.info.subView = obj.getAttribute("realId");
				if(Utils.exist(self.info.subView)){
					self.saveSubView(self.info.subView);
				}			
				self.displayData(true);								
			}		
		};	
		for(var i=0; i<this.groupingList.length; i++){
			this.groupingList[i].click = clickFunction;
			if(this.groupingList[i].active == "true"){
				this.activeIndex = i;
				this.info.show = this.groupingList[i].show;
			}		
		}
		
		
		var maximizeGlobalFunction =
			"maxMinPortlet_" + this.obj.params.id + " = function(){" +
				"self.changeClickedStatus();" +
			"}";	
		eval(maximizeGlobalFunction);
		if(this.obj.params.isNew==true){
			//noDataText="Data will be available in a few minutes";
			this.noDataText="No data to display";
		} else{
			this.noDataText="No data to display";
		}
		

	};
	
	
	
	this.seoCalendar;
	
	this.changeToNextMonth = function(){		
		self.seoCalendar.changeToNextMonth();
		self.sendRequest("data", null);
		var container = self.seoCalendar.getContainer();
		container.innerHTML = "";
		container.appendChild(SEO.Calendar.Renderer.getCalendarTable(self.seoCalendar));
	}
	this.changeToMonth = function(month){
		self.seoCalendar.setMonth(month);
		self.sendRequest("data", null);
	}
	this.changeToPreviousMonth = function(){
		self.seoCalendar.changeToPreviousMonth();
		self.sendRequest("data", null);
		var container = self.seoCalendar.getContainer();
		container.innerHTML = "";
		container.appendChild(SEO.Calendar.Renderer.getCalendarTable(self.seoCalendar));
	}

	
	
	this.loadData = function(){
	
		this.sendRequest("data", null);
	
	};
		
	
    this.getInfo=function(){
		return "";				
	}	
	
	
	this.clickFunctionMonth = function(obj){
	
		var newActiveIndex = obj.getAttribute("arrayIndex");
		if(newActiveIndex != self.calendarActiveIndex){
			self.calendarActiveIndex = newActiveIndex;
			self.changeToMonth(obj.getAttribute("number"));
			self.displayData();						
		}		
	};
	
	
	
	
	this.appendBottom = function(axisLabel){
		var legendConfig;	

		if(self.maximized){
			legendConfig = this.serviceConfig.Legend.Maximized;
		} else {
			legendConfig = this.serviceConfig.Legend.Normal;
		}
		var columnCount = legendConfig.columnCount;
						
		
	
		var responseData = this.lastResponse.data;
		var legendName;
		var legendCount = 0;
		var keywordTestResult;
	   
		if(this.footerTable!=null && typeof this.footerTable!='undefined' && this.footerTable.parentNode!=null){
			this.footerTable.parentNode.removeChild(this.footerTable);
		}
	
		this.footerTable=document.createElement("table");
		this.footerTable.width="100%";
		this.footerTable.cellSpacing = "0px";
		var dataBody=document.createElement("tbody");
		this.footerTable.appendChild(dataBody);
		var dataRow=document.createElement("tr");
		dataBody.appendChild(dataRow);
		var leftTd = document.createElement("td");
		leftTd.width = "4%";
		dataRow.appendChild(leftTd);
			
		leftTd.innerHTML=self.getLeftTdInnerHTML();
				
		var groupTd=document.createElement("td");
		groupTd.width=this.GROUP_TD_WIDTH;
		dataRow.appendChild(groupTd);
		
		legendInfo=document.createElement("table");
		legendInfo.style.lineHeight="14px";
		legendInfo.cellpadding="0px";
		legendInfo.cellspacing="0px";
		groupTd.appendChild(legendInfo);
		var tbody=document.createElement("tbody");
		legendInfo.appendChild(tbody);
		var tr=document.createElement("tr");
		tbody.appendChild(tr);
		
		
		var groupingType;


		groupingType = this.groupingList[this.activeIndex].name;	
		var td = document.createElement("td");			
		td.height="14px";
		var textNode = document.createTextNode(groupingType);
		td.style.fontSize = "11px";
		td.appendChild(textNode);
		tr.appendChild(td);		
		td.className = "groupingMenu";
		td.id = "groupingMenu_" + this.obj.params.id;
		td.vAlign = "top";
		td.align = "left";		

		var img = document.createElement("img");
		img.src = "images/seo/select_arrow.png";		
		img.style.marginLeft = "5px";
		img.style.marginTop = "5px";
		img.align = "top";
		td.appendChild(img);	
		
		
		td.onclick = function(event){					
			dropDownMenu.showList(self.groupingList, Utils.getEvent(event),this.offsetHeight, self.activeIndex);
		}
		td.onmouseover = function(){
			this.className = self.GROUPING_MENU_HOVERED_CLASS_NAME;
		}
		td.onmouseout = function(){
			this.className = "groupingMenu";
		}
		
		
		
		if(Utils.exist(axisLabel)){
			var labelTd = document.createElement("td");
			//labelTd.id = "Menu";
			labelTd.width=self.LABEL_TD_WIDTH;
			labelTd.align="center";			
			//labelTd.innerHTML = "aaaaa";
			//labelTd.className = "chartAxisLabel Menu";
			dataRow.appendChild(labelTd);
		}
		var rightTd=document.createElement("td");
		rightTd.width=self.RIGHT_TD_WIDTH;
		rightTd.align="left";		
		if(!Utils.exist(this.seoCalendar)){	
			this.seoCalendar = new SEO.Calendar(rightTd, this);
		} else {
			this.seoCalendar.setContainer(rightTd);
		}
		
		
		

		
		var clickFunctionWeek = function(obj){
		
			var newActiveIndex = obj.getAttribute("arrayIndex");
			if(newActiveIndex != self.calendarActiveIndex){
				
				self.calendarActiveIndex = newActiveIndex;
				self.changeToMonth(obj.getAttribute("number"));
				self.displayData();						
			}	
		};
				
		var lang = Framework.Lang;
		var calendarOptions = [
			{id: 0, label:"Last Week", number:12, title: "Last 7 Days", click: clickFunctionWeek},			
			{id: 1, label:lang.Calendar_Jan, number:0, title: lang.Calendar_Jan, click: self.clickFunctionMonth, active: "true"},
			{id: 2, label:lang.Calendar_Feb, number:1, title: lang.Calendar_Feb, click: self.clickFunctionMonth},
			{id: 3, label:lang.Calendar_March, number:2, title: lang.Calendar_March, click: self.clickFunctionMonth},
			{id: 4, label:lang.Calendar_April, number:3, title: lang.Calendar_April, click: self.clickFunctionMonth},
			{id: 5, label:lang.Calendar_May, number:4, title: lang.Calendar_May, click: self.clickFunctionMonth},
			{id: 6, label:lang.Calendar_June, number:5, title: lang.Calendar_June, click: self.clickFunctionMonth},
			{id: 7, label:lang.Calendar_Jul, number:6, title: lang.Calendar_Jul, click: self.clickFunctionMonth},		 
			{id: 8, label:lang.Calendar_Aug, number:7, title: lang.Calendar_Aug, click: self.clickFunctionMonth},
			{id: 9, label:lang.Calendar_Sep, number:8, title: lang.Calendar_Sep, click: self.clickFunctionMonth},
			{id: 10, label:lang.Calendar_Oct, number:9, title: lang.Calendar_Oct, click: self.clickFunctionMonth},
			{id: 11, label:lang.Calendar_Nov, number:10, title: lang.Calendar_Nov, click: self.clickFunctionMonth},
			{id: 12, label:lang.Calendar_Dec, number:11, title: lang.Calendar_Dec, click: self.clickFunctionMonth}
		];
		
		var currentMonth = this.seoCalendar.getCurrentMonth();
		if(!Utils.exist(this.calendarList)){
			this.calendarList = calendarOptions;			
			this.calendarActiveIndex = currentMonth+1;
			var currentMonthOption = this.calendarList[currentMonth+1];
			currentMonthOption.title = "<span style='font-weight:bold'>" + currentMonthOption.title + "</span>";
		}
		
	
		
		var monthName = document.createTextNode(this.seoCalendar.getMonthName(this.seoCalendar.getMonth()));
		rightTd.appendChild(monthName);
		rightTd.style.fontSize = "11px";
		rightTd.className = "calendarMenu";
		rightTd.id = "calendarMenu" + this.obj.params.id;
		rightTd.align = "right";
		var calendatArrowImg = document.createElement("img");
		calendatArrowImg.src = "images/seo/select_arrow.png";		
		calendatArrowImg.style.marginLeft = "5px";
		calendatArrowImg.style.marginTop = "5px";
		calendatArrowImg.style.marginRight = "5px";
		calendatArrowImg.align = "top";
		rightTd.appendChild(calendatArrowImg);		
		
		rightTd.onclick =function(event){	  
			dropDownMenu.showList(self.calendarList, Utils.getEvent(event), this.offsetHeight, self.calendarActiveIndex, "top", "right", this.offsetWidth);
		}		
		rightTd.onmouseover = function(){
			this.className = "groupingMenuHovered_85 background_right";
		}
		rightTd.onmouseout = function(){
			this.className = "groupingMenu";
		}
		
		dataRow.appendChild(rightTd);
		if(!Utils.exist(this.legendElement)){
			this.legendElement = this.getLegend();
		}	
		this.el.appendChild(this.legendElement);	
		this.el.appendChild(this.footerTable);
				
	}
	
	
	this.getLeftTdInnerHTML=function(){		
		return "";
	}
		
			
	
	
	this.loadLineChart = function(){
	
		var chartConfig;		
		if(this.maximized){
			chartConfig = this.serviceConfig.LineChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.LineChart.Normal;
		}		
		var label = chartConfig.label;
		
		this.el.innerHTML="";
		//this.appendTrend();
		var chartString;
		this.info.view = LINE_VIEW;
		var chartDiv = document.createElement("div");
		chartDiv.style.width = "100%";
		chartDiv.id = this.el.id+"_chart";
		this.el.appendChild(chartDiv);
		this.appendBottom(label);
		var chart = new FusionCharts("Charts/Flash/MSLine.swf", "Chartid", this.el.offsetWidth-this.MARGIN_CHART, this.el.offsetHeight - this.footerTable.offsetHeight - this.legendElement.offsetHeight, "0", "0");
    	var chartsXML = [];
		//if(chartsXML.lineChartXML==null || typeof chartsXML.lineChartXML=='undefined' ){
			chartsXML.lineChartXML = this.createLineChartXML();
		//}
		chart.setDataXML(chartsXML.lineChartXML);
    	chart.render(chartDiv.id);

	}
	

	
	this.loadAngleChart=function(){	
	
		var chartConfig;		
		if(this.maximized){
			chartConfig = this.serviceConfig.AngleChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.AngleChart.Normal;
		}		
		var label = chartConfig.label;
				
		this.el.innerHTML="";
		this.info.view=ANGLE_VIEW;
		var chartString;
		var chartDiv=document.createElement("div");
		chartDiv.style.width="100%";
		chartDiv.id=this.el.id+"_chart";
		this.el.appendChild(chartDiv);
		this.appendBottom(label);		
		var chart = new FusionCharts("Charts/Flash/Scatter.swf?ChartNoDataText="+this.noDataText, "Chartid", this.el.offsetWidth-this.MARGIN_CHART, this.el.offsetHeight - this.footerTable.offsetHeight - this.legendElement.offsetHeight, "0", "0");
    	var chartsXML=[];
		//if(chartsXML.scatterChartXML==null || typeof chartsXML.scatterChartXML=='undefined' ){
			chartsXML.scatterChartXML = this.createScatterChartXML();
		//}
		chart.setDataXML(chartsXML.scatterChartXML);
    	chart.render(chartDiv.id);
	}
	

	this.createTr=function(tbody){
		
	}
	
	this.changeClickedStatus = function(){
		self.clicked = !self.clicked;
		
		if(this.info.view == HORIZONTAL_BAR_VIEW){
			self.resizeHandler();
		} else {
			/*
			if(this.editContent.style.display == "none"){
				this.editContent.style.display = "block";	
			} else {
				this.editContent.style.display = "none";
			}
			*/
			if(Utils.exist(this.showHideDiv)){
				this.showHideDiv.onclick();
			}			
		}
	}
	
	this.parseData=function(xml,sel){		
	    self=sel;
		self.lastResponse = eval("("+xml.responseText+")");
		self.orderData();	
		self.displayData(true);		
	}
	

	this.drawChart = function(){
		switch(self.info.view){
			case LINE_VIEW:{
				this.loadLineChart();
				break;
			}
			case BAR_VIEW:
			case HORIZONTAL_BAR_VIEW:{
				this.loadBarChart();
				break;
			}
			case ANGLE_VIEW:{
				this.loadAngleChart();
				break;
			}
				
			default:
				this.loadTable();
		}
		this.obj.resizeTitle();
	}
	
	this.displayData = function(makeGrouping){
		this.legendElement = null;
		convertedData = this.lastResponse.data;
		var groupArray = self.info.groupType;
		if(Utils.exist(groupArray)) {
			if(makeGrouping){
				for(var i=0; i<groupArray.length; i++) {
					switch(groupArray[i]){
						case this.GROUP_TYPE_ENGINES:{
							self.info.groupType = this.GROUP_TYPE_ENGINES;
							convertedData = this.groupByKey(convertedData, this.KEY_ENGINE);
							break;
						}
						case this.GROUP_TYPE_SITE:{
							self.info.groupType = this.GROUP_TYPE_SITE;
							convertedData = this.groupByKey(convertedData, this.KEY_SITE);
							break;
						}
					}
				}
			} else {
				convertedData = this.lastResponse.groupedData;
			}
		}
		this.lastResponse.groupedData = convertedData;
	
		switch(self.info.view){
			case LINE_VIEW:{
				this.loadLineChart();
				break;
			}
			case BAR_VIEW:
			case HORIZONTAL_BAR_VIEW:{
				this.loadBarChart();
				break;
			}
			case ANGLE_VIEW:{
				this.loadAngleChart();
				break;
			}
				
			default:
				this.loadTable();
		}
		this.obj.resizeTitle();
		this.edit();
		
	}
	
	this.orderData = function(){
			
		var responseData = this.lastResponse.data;
			
		var alphabeticalSiteAsc = function(a, b) {
			
			var site1 = a[self.KEY_SITE].join('').toLowerCase();
			var site2 = b[self.KEY_SITE].join('').toLowerCase();
			var engine1 = a[self.KEY_ENGINE].join('').toLowerCase();
			var engine2 = b[self.KEY_ENGINE].join('').toLowerCase();
			
			if (site1 < site2) return -1;
			if (site1 > site2) return 1;
			if (engine1 < engine2) return -1;
			if (engine1 > engine2) return 1;

			return 0;
		}		
		this.lastResponse.data = ArrayUtils.sortAssocArray(responseData, alphabeticalSiteAsc);
		
	}
	
	this.loadBarChart=function(){		
		var chartConfig;
		if(this.maximized){
			chartConfig = this.serviceConfig.BarChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.BarChart.Normal;
		}		
		var label = chartConfig.label;	
		
		var graph = this.SHOW_BAR_CHART;
		
		
		this.el.innerHTML="";		
		this.info.view=BAR_VIEW;
		var chartDiv=document.createElement("div");
		chartDiv.style.width="100%";
		chartDiv.id=this.el.id+"_chart";
		this.el.appendChild(chartDiv);		
		this.appendBottom(label);
		
		var groupArray = this.info.groupType;
		
		if(Utils.exist(groupArray)) {
			switch(groupArray){					
				case this.GROUP_TYPE_ENGINES:{
					graph = this.SHOW_HORIZONTAL_BAR_CHART;
					break;
				}
				case this.GROUP_TYPE_SITE:{
					graph = this.SHOW_HORIZONTAL_BAR_CHART;
					break;
				}
			}
		}
				
		switch(graph){
			case this.SHOW_BAR_CHART: {
				var chart = new FusionCharts("Charts/Flash/MSColumn2D.swf?ChartNoDataText="+self.noDataText, "ChartId", self.el.offsetWidth-self.MARGIN_CHART, self.el.offsetHeight - self.footerTable.offsetHeight - this.legendElement.offsetHeight, "0", "0");
				var chartsXML=[];
				//if(chartsXML.barChartXML==null || typeof chartsXML.barChartXML=='undefined' ){
					chartsXML.barChartXML = this.createBarChartXml();
				//}
				chart.setDataXML(chartsXML.barChartXML);
		   		chart.render(chartDiv.id);
		   		
				break;
			}
			case this.SHOW_HORIZONTAL_BAR_CHART: {
				var chart = new FusionCharts("Charts/Flash/Bar2D.swf?ChartNoDataText="+self.noDataText, "ChartId", self.el.offsetWidth-self.MARGIN_CHART, self.el.offsetHeight - self.footerTable.offsetHeight - this.legendElement.offsetHeight, "0", "0");
				var chartsXML=[];
				//if(chartsXML.barChartXML==null || typeof chartsXML.barChartXML=='undefined' ){
					chartsXML.horizontalBarChartXML = this.createHorizontalBarChartXML();
				//}
				chart.setDataXML(chartsXML.horizontalBarChartXML);
		   		chart.render(chartDiv.id);		
				break;
			}
		}
				

	}	
	
	
	this.createLineChartXML = function(){
		var responseData = this.lastResponse.groupedData;
		var chartConfig;
		var clickConfig;		
		if(this.maximized){
			chartConfig = this.serviceConfig.LineChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.LineChart.Normal;
		}
		if(this.clicked){		
			clickConfig = this.serviceConfig.LineChart.Clicked;
		} else {
			clickConfig = this.serviceConfig.LineChart.UnClicked;
		}
		chartConfig.showLegend = clickConfig.showLegend;
		chartConfig.bottomMargin = clickConfig.bottomMargin;			

		var anchorRadius = chartConfig.anchorRadius;
		var labelMaxCount = chartConfig.maxLabelCount;
		var showLegend = chartConfig.showLegend;
		var label = chartConfig.label;
		var bottomMargin = chartConfig.bottomMargin;
						
		var rank;
		var resultCount;
		var date;
		var month;
		var day;		
		var time;
		var tooltipText;
		var chartStringArray = [];
		var chartsStringArray = [];
		var rankStringArray = [];
		var dateStringArray = [];
		var row;
		var keywordResultArray;	
		var keywordTestResult;
		var engineStr = "";
		var siteStr = "";
			
		var keywordCount = 0;
		var activeKeywordCount = 0;
		var dataLength = 1;
		var labelStep = 1;
		var seriesName = "";		
		var tagType;
		for(var keywordTestId in responseData){			
			keywordTestResult = responseData[keywordTestId];			
			if(keywordTestId != "toFlexJSONString"){
				if(keywordTestResult.disable != "true")	{
					tagType = this.info.tagType;
				
					siteStr = keywordTestResult[this.KEY_SITE].join(", ");
					engineStr = keywordTestResult[this.KEY_ENGINE].join(", ");
									
					seriesName = "";									
					if(tagType instanceof Array){
						for(var i=0; i<tagType.length; i++) {								
							if(i > 0){
								seriesName += " (";
							}
							seriesName += keywordTestResult[tagType[i]].join(", ");
						}
						seriesName += ")";
					} else {
						seriesName = keywordTestResult[tagType];
					}
					chartsStringArray.push("<dataset color='"+this.lineColors[keywordCount]+"' anchorBorderColor='"+this.lineColors[keywordCount]+"' seriesName='"+seriesName+"' anchorBgColor='FFFFFF'>");
					keywordCount++;
					activeKeywordCount++;
					keywordResultArray = keywordTestResult.results;
					rankStringArray = [];
					for(var i=0; i<keywordResultArray.length; i++){				
						if(dataLength <= 1){
							dataLength = keywordResultArray.length;
						}
						row = keywordResultArray[i];				
						rank = row.rank;
						resultCount = row.resultCount;
						if(resultCount == -1){
							resultCount = 0;
						}
						date = row.date.split(" ");
						month = date[0];
						day = date[1];
						time = date[2];					
						tooltipText=this.getLineChartXMLTooltipText(siteStr,engineStr,resultCount,row.date);									
						rankStringArray.push("<set value='" + rank + "' tooltext='" + tooltipText + "' link='JavaScript:maxMinPortlet_"+this.obj.params.id+"()'/>");
						if(activeKeywordCount <= 1){						
							dateStringArray.push("<category label='" + day + "'/>");
						}
					}
					if(activeKeywordCount <= 1){
						anchorRadius += Math.round(this.CONSTANTS.ROUND_MAX_SIZE - keywordResultArray.length / this.CONSTANTS.ROUND_CHANGE_PERIOD);
					}				
					chartsStringArray = chartsStringArray.concat(rankStringArray);
					chartsStringArray.push("</dataset>");
				} else {
					keywordCount++;
				}
			}			
		}
		
		dateStringArray.push("<category label='" + label + "'/>");
		
		var yMax="";		
		if(this.info.staticMax!=-1){
			//yMax=" yAxisMaxValue='"+info.staticMax+"'";
		}		
		labelStep = Math.round(dataLength/labelMaxCount + 0.49);
		if(Math.round(dataLength/labelStep) != dataLength/labelStep){
			dateStringArray.push("<category label='" + label + "'/>");
		}				
		chartStringArray.push("<chart palette='2'"+yMax+" chartTopMargin='6' captionPadding='0' showValues='0' showLegend='" + showLegend + "' bgColor='FFFFFF' chartBottomMargin='"+bottomMargin+"' chartRightMargin='12' xAxisNamePadding='0' labelPadding='4' chartLeftMargin='0'  showBorder='0' labelStep='"+labelStep+"' anchorRadius='" + anchorRadius + "' labelDisplay='NOWRAP'>");
		chartStringArray.push("<categories>");
		chartStringArray = chartStringArray.concat(dateStringArray);
		chartStringArray.push("</categories>");		
		chartStringArray = chartStringArray.concat(chartsStringArray);		
		chartStringArray.push("</chart>");		
		return chartStringArray.join('');
				
	};

	this.getLineChartXMLTooltipText=function(siteStr,engineStr,resultCount,rowDate){		
		return "";
	}

	this.createBarChartXml = function(){
	
		var responseData = this.lastResponse.groupedData;
		
		var chartConfig;
		var clickConfig;
		if(this.maximized){
			chartConfig = this.serviceConfig.BarChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.BarChart.Normal;
		}
		
		if(this.clicked){		
			clickConfig = this.serviceConfig.BarChart.Clicked;
		} else {
			clickConfig = this.serviceConfig.BarChart.UnClicked;
		}
		chartConfig.showLegend = clickConfig.showLegend;
		chartConfig.bottomMargin = clickConfig.bottomMargin;	
		
				
		var groupSize = chartConfig.groupSize;
		var showLegend = chartConfig.showLegend;
		var bottomMargin = chartConfig.bottomMargin;
		var label = chartConfig.label;
		var labelType = chartConfig.labelType;
		
		var engineStr = "";
		var siteStr = "";

		
		var rank = 0;
		var resultCount = -1;
		var date;
		var month;
		var day;		
		var time;
		var tooltipText;
		var chartStringArray = [];
		var chartsStringArray = [];
		var rankStringArray = [];
		var dateStringArray = [];
		var row;
		var keywordResultArray;	
		var keywordTestResult;	
		
		var keywordCount = 0;	
		var activeKeywordCount = 0;
		var averageRank;		
		var rowCount = 0;
		var weekCount = 0;
		var resultCountStr = "";
		
		var seriesName;
		var currentWeek;
		var tempWeek = 6;

		for(var keywordTestId in responseData){
			keywordTestResult = responseData[keywordTestId];
			if(keywordTestId != "toFlexJSONString"){
				if(keywordTestResult.disable != "true")	{
					tagType = this.info.tagType; 
					
					siteStr = keywordTestResult[this.KEY_SITE].join(", ");
					engineStr = keywordTestResult[this.KEY_ENGINE].join(", ");
											
					seriesName = "";									
					if(tagType instanceof Array){
						for(var i=0; i<tagType.length; i++) {								
							if(i > 0){
								seriesName += " (";
							}
							seriesName += keywordTestResult[tagType[i]].join(" ");
						}
						seriesName += ")";
					} else {
						seriesName = keywordTestResult[tagType];
					}									
					chartsStringArray.push("<dataset color='"+this.lineColors[keywordCount]+"' anchorBorderColor='"+this.lineColors[keywordCount]+"' seriesName='"+seriesName+"' anchorBgColor='FFFFFF'>");
					rankStringArray = [];
					activeKeywordCount++;
					keywordCount++;					
					keywordResultArray = keywordTestResult.results;				
					for(var i=0; i<keywordResultArray.length; i++){
						row = keywordResultArray[i];
						rowCount++;						
						rank += row.rank;
						date = row.date.split(" ");
						month = date[0];
						day = date[1];
						time = date[2];
						resultCount = row.resultCount;
						if(resultCount == -1){
							resultCount = 0;
						}					
						resultCountStr += ", " + resultCount;
						currentWeek = Math.round((parseInt(day)+1)/groupSize + 0.4999);
						if(i == 0){
							tempWeek = currentWeek;	
						}
						if(i == keywordResultArray.length - 1 || rowCount == groupSize || currentWeek > tempWeek){						
							averageRank = Math.round(rank/rowCount);
							resultCountStr = resultCountStr.substring(2);	
							tooltipText = this.getBarChartXmlTooltipText(siteStr,engineStr,averageRank);										
							rankStringArray.push("<set value='" + averageRank + "' tooltext='" + tooltipText + "' link='JavaScript:maxMinPortlet_"+this.obj.params.id+"()'/>");
							if(activeKeywordCount <= 1) {
								if(labelType == "multiple"){
									dateStringArray.push("<category label='" + label + " " + tempWeek + "'/>");
								} else {
									dateStringArray.push("<category label='" + tempWeek + "'/>");
								}
							}
							rowCount = 0;
							resultCountStr = "";
							rank = 0;
						}
						tempWeek = currentWeek;
					}
					chartsStringArray = chartsStringArray.concat(rankStringArray);
					chartsStringArray.push("</dataset>");
				} else {
					keywordCount++;
				}
			}
		}
		if(labelType == "single"){
			dateStringArray.push("<category label='" + label + "'/>");
		}		
		var yMax="";		
		if(this.info.staticMax!=-1){
			yMax=" yAxisMaxValue='"+this.info.staticMax+"'";
		}
		chartStringArray.push("<chart palette='2'"+yMax+" chartTopMargin='6' captionPadding='0' showValues='0' showLegend='"+showLegend+"' bgColor='FFFFFF' chartBottomMargin='"+bottomMargin+"' xAxisNamePadding='0' labelPadding='4' chartLeftMargin='0' chartRightMargin='5' showBorder='0' useRoundEdges='1'>");
		chartStringArray.push("<categories>");
		chartStringArray = chartStringArray.concat(dateStringArray);
		chartStringArray.push("</categories>");		
		chartStringArray = chartStringArray.concat(chartsStringArray);		
		chartStringArray.push("</chart>");
			
		return chartStringArray.join('');
	}

	this.getBarChartXmlTooltipText=function(siteStr,engineStr,averageRank){	
		return "";
	}
	
	
	this.createHorizontalBarChartXML = function(){
		this.info.view = HORIZONTAL_BAR_VIEW;
		var responseData = this.lastResponse.groupedData;
		var chartConfig;
		var clickConfig;
		if(this.maximized) {
			chartConfig = this.serviceConfig.HorizontalBarChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.HorizontalBarChart.Normal;
		}
		if(this.clicked){		
			clickConfig = this.serviceConfig.HorizontalBarChart.Clicked;
		} else {
			clickConfig = this.serviceConfig.HorizontalBarChart.UnClicked;
		}
		chartConfig.labelMaxLength = clickConfig.labelMaxLength;
		var labelMaxLength = chartConfig.labelMaxLength;
		
		var rankStringArray = [];
		var chartStringArray = [];
				
		var keywordTestResult;
		var keywordResultArray;

		var labelStr;		
		var labelStrShort;
		var siteStr;
		var engineStr;
		
		
		var rowCount = 0;
		var rank = 0;		
		var tooltipText;
		var keywordCount = 0;
		for(var keywordTestId in responseData){
			keywordTestResult = responseData[keywordTestId];
			if(keywordTestId != "toFlexJSONString"){
				if(keywordTestResult.disable != "true")	{
					siteStr = keywordTestResult[this.KEY_SITE].join(", ");							
					engineStr = keywordTestResult[this.KEY_ENGINE].join(", ");
					
					keywordResultArray = keywordTestResult.results;
					for(var i=0; i<keywordResultArray.length; i++){
						row = keywordResultArray[i];
						rowCount++;
						rank += row.rank;					
						if(i == keywordResultArray.length - 1){						
							averageRank = this.getAverageRank(rank,rowCount);
							switch(this.info.groupType){
								case this.GROUP_TYPE_SITE: {
									labelStr = siteStr;
									break;
								}  
								case this.GROUP_TYPE_ENGINES: {
									labelStr = engineStr;
									break;
								}
							}								
							if(labelMaxLength == -1){
								labelStrShort = labelStr;			
							} else {
								labelStrShort = StringUtils.abbreviate(labelStr, labelMaxLength);
							}
							tooltipText=this.getHorizontalBarChartXMLTooltipText(siteStr,engineStr,averageRank);						
							rankStringArray.push("<set color='"+this.lineColors[keywordCount]+"' label='" + labelStrShort + "' value='" + averageRank + "'  toolText='" + tooltipText+ "'/>");
							
							rowCount = 0;
							rank = 0;						
							break;
						}
					}
				}
				keywordCount++;
			}
		}
		
		chartStringArray=this.getHorizontalBarChartStringArray(this.obj.params.id,rankStringArray);			
		return chartStringArray.join('');
	}
						 				

	this.getHorizontalBarChartXMLTooltipText=function(siteStr,engineStr,averageRank){		
		return "";
	};
	this.getAverageRank=function(rank,rowCount){		
		return 0; 
	};
	
	this.getHorizontalBarChartStringArray=function(id,rankStringArray){		
		var chartStringArray = [];		
		return chartStringArray;		
	};
			
	
	
	this.createScatterChartXML = function(){
	
		var chartConfig;		
		if(this.maximized){
			chartConfig = this.serviceConfig.AngleChart.Maximized;
		} else {
			chartConfig = this.serviceConfig.AngleChart.Normal;
		}	
		if(this.clicked){		
			clickConfig = this.serviceConfig.AngleChart.Clicked;
		} else {
			clickConfig = this.serviceConfig.AngleChart.UnClicked;
		}
		chartConfig.showLegend = clickConfig.showLegend;
		chartConfig.bottomMargin = clickConfig.bottomMargin;
					
		var label = chartConfig.label;
		var showLegend = chartConfig.showLegend;
		var anchorRadius = chartConfig.anchorRadius;
						
		var responseData = this.lastResponse.groupedData;		
		var rank;
		var resultCount;
		var date;
		var month;
		var day;		
		var time;
		var hour;
		var tooltipText;
		var chartStringArray = [];
		var chartsStringArray = [];
		var rankStringArray = [];
		var dateStringArray = [];
		var row;
		var keywordResultArray;		
		var keywordTestResult;
		var keywordCount = 0;
		var activeKeywordCount = 0;
		var xCoordinate;
		var tagType = this.info.tagType;
		var seriesName;
		for(var keywordTestId in responseData){
			if(keywordTestId == "toFlexJSONString"){
				continue;
			}
			keywordTestResult = responseData[keywordTestId];
			if(keywordTestResult.disable != "true")	{
				rankStringArray = [];
				
				seriesName = "";
													
				if(tagType instanceof Array){
					for(var i=0; i<tagType.length; i++) {								
						if(i > 0){
							seriesName += " (";
						}
						seriesName += keywordTestResult[tagType[i]].join(", ");
					}
					seriesName += ")";
				} else {
					seriesName = keywordTestResult[tagType];
				}				
				chartsStringArray.push("<dataset seriesName='"+seriesName+"' color='"+this.lineColors[keywordCount]+"' anchorBorderColor='"+this.lineColors[keywordCount]+"' anchorBgColor='FFFFFF'>");
				keywordCount++;
				activeKeywordCount++;
				keywordResultArray = keywordTestResult.results;
				for(var i=0; i<keywordResultArray.length; i++){
					row = keywordResultArray[i];
					rank = row.rank;
					resultCount = row.resultCount;
					if(resultCount == -1){
						resultCount = 0;
					}
					date = row.date.split(" ");
					month = date[0];
					day = date[1];
					time = date[2];		
					hour = parseInt(time.substring(0, 2));				
					tooltipText=this.getScatterChartXMLTooltipText(keywordTestResult.site,keywordTestResult.engine,resultCount,row.date);				
					xCoordinate = parseInt(day) + hour/24;				
					rankStringArray.push("<set y='" + rank + "' x='" + xCoordinate +"' tooltext='" + tooltipText + "' link='JavaScript:maxMinPortlet_"+this.obj.params.id+"()'/>");
				}
				if(activeKeywordCount <= 1){
					anchorRadius += Math.round(this.CONSTANTS.ROUND_MAX_SIZE - keywordResultArray.length / this.CONSTANTS.ROUND_CHANGE_PERIOD);
				}
				chartsStringArray = chartsStringArray.concat(rankStringArray);
				chartsStringArray.push("</dataset>");
			} else {
				keywordCount++;
			}
		}
		var yMax="";		
		if(this.info.staticMax!=-1){
			yMax=" yAxisMaxValue='"+this.info.staticMax+"'";
		}		
		chartStringArray.push("<chart xAxisMaxValue='33'"+yMax+" showLegend='"+showLegend+"' chartTopMargin='6' captionPadding='0' showValues='0' showLegend='0' bgColor='FFFFFF' chartBottomMargin='5' xAxisNamePadding='0' labelPadding='4' chartLeftMargin='0' chartRightMargin='12' showBorder='0' labelStep='1' labelDisplay='NOWRAP' anchorRadius='" + anchorRadius + "'>");
		chartStringArray.push("<categories>");
		for(var i=1; i<32; i+=2){
			chartStringArray.push("<category label='"+Utils.appendZero(i,2)+"' x='"+i+"' showVerticalLine='1'/>");					
		}
		chartStringArray.push("<category x='33' label='"+label+"' showVerticalLine='1'/>");
		chartStringArray.push("</categories>");;
		
		chartStringArray = chartStringArray.concat(chartsStringArray);		
		chartStringArray.push("</chart>");		
		return chartStringArray.join('');
	}
	
	
	this.getScatterChartXMLTooltipText=function(site,engine,resultCount,rowDate){		
		return "";
	};
	

	this.loadTable = function(){
	
		var responseData = self.lastResponse.groupedData;		
		var keywordResultArray;
		var keywordTestResult;
		var row;
		var resultCount;
		var date;
		var month;
		var day;		
		var time;
		var hour;
		var hourStr;
		
		var headers=[
			{headerText: Framework.Lang.headers.day, dataField: 'time', type: 'num', sortable: true}								
		];		
		
		var tagType = self.info.tagType;
		
    
		if(tagType instanceof Array){
			for(var i=0; i<tagType.length; i++){
				switch(tagType[i]){
					case GROUP_BY_ENGINES: {
						headers[headers.length] = {headerText: Framework.Lang.headers.searchEngine, dataField: 'engine', align: 'center', sortable: true, renderer: statusColumnRenderer, "statuses" : { "OK" : "#529100" , "NOK" : "#FF4800" , "NA" : "#000000" }};
						break;
					}
					case GROUP_BY_SITES: {
						headers[headers.length] = {headerText: Framework.Lang.Monitoring_edit_site,	dataField: 'site', align:'left', color: "#529100", sortable: true, type: 'num'};
						break; 
					}		
				}				
			}
		} else {
			switch(tagType){
				case GROUP_BY_ENGINES: {
					headers[headers.length] = {headerText: Framework.Lang.headers.searchEngine, dataField: 'engine', align: 'center', sortable: true, renderer: statusColumnRenderer, "statuses" : { "OK" : "#529100" , "NOK" : "#FF4800" , "NA" : "#000000" }};
					break;
				}
				case GROUP_BY_SITES: {
					headers[headers.length] = {headerText: Framework.Lang.Monitoring_edit_site,	dataField: 'site', align:'left', color: "#529100", sortable: true, type: 'num'};
					break; 
				}	
			}
		}
		headers = headers.concat([			
			{headerText: self.getHeaderText(),   	dataField: 'resultCount',   align: 'center', sortable: true }	
		]);		
		var wd = parseInt( (self.el.offsetWidth-20) / headers.length);
		if(typeof wd!='undefined' && wd!=null && wd>0){
			for(var i=0; i<headers.length; i++){
				headers[i].width = wd; 
			}
			headers[0].width -= 35;			
			headers[headers.length-1].width -=self.HEADERS_WIDTH;
		}
		
		var config = toFlexJSONArrayString(headers);
		
	

		var data_ = "[";

		var dataItem;
		var tableData;		
		for(var keywordTestId in responseData){
			if(keywordTestId == "toFlexJSONString"){
				continue;
			}
			keywordTestResult = responseData[keywordTestId];
			if(keywordTestResult.disable != "true")	{
				keywordResultArray = keywordTestResult.results;
				for(var i=0; i<keywordResultArray.length; i++){				
					row = keywordResultArray[i];
					resultCount = row.resultCount;
					if(resultCount == -1){
						resultCount = 0;
					}				
					date = row.date.split(" ");
					month = date[0];
					day = date[1];
					time = date[2];
					hour = parseInt(time.substring(0, 2));
					if(hour >= 12){
						hourStr = Framework.Lang.SEO.after_midday;
					} else {
						hourStr = Framework.Lang.SEO.before_midday;
					}
					dataItem = "";
					dataItem += '{';
					dataItem += '"time" : "'+ day +'",';
					var tagType = self.info.tagType;
		
					if(tagType instanceof Array){
						for(var j=0; j<tagType.length; j++){
							switch(tagType[j]){										
								case GROUP_BY_ENGINES: {
									dataItem += '"engine" : "'+ keywordTestResult.engine +'",';
									break;
								}
								case GROUP_BY_SITES: {
									dataItem += '"site" : "'+ keywordTestResult.site +'",';						
									break; 
								}
							}
						}
					} else {
						switch(tagType){										
							case GROUP_BY_ENGINES: {
								dataItem += '"engine" : "'+ keywordTestResult.engine +'",';					
								break;
							}
							case GROUP_BY_SITES: {
								dataItem += '"site" : "'+ keywordTestResult.site +'",';						
								break; 
							}
						}					
					}				
					dataItem += '"resultCount" :  	"'+ resultCount +'"';
					dataItem += '},';
					data_ += dataItem;
				}
			}
		}
		
		data_ = data_.substr(0, data_.length-1);

		data_ += "]";
		var dataGrid = $( "datagrid_" + self.moduleId);

		self.el.innerHTML="";
		self.appendBottom();
		var chartDiv=document.createElement("div");
		chartDiv.style.width="100%";			
		chartDiv.style.height = self.el.offsetHeight - self.footerTable.offsetHeight - this.legendElement.offsetHeight + "px";
		chartDiv.id=self.el.id+"_chart";
		self.el.insertBefore(chartDiv, this.legendElement);			
		chartDiv.innerHTML = getGridFlashNode( "datagrid_" + self.moduleId, data_, config);

		self.info.view=TABLE_VIEW;		
	}
	
	this.edit = function(){
		var responseData = this.lastResponse.groupedData;
		this.editContent.innerHTML = "";
		var table = document.createElement("table");
		table.cellSpacing = 5;
		table.width = "98%";

		var tbody = document.createElement("tbody");
		this.editContent.appendChild(table);
		table.appendChild(tbody);

		var tr = document.createElement("tr");
		tr.className = "editTableRow";
		tbody.appendChild(tr);

		var td = document.createElement("td");
		td.innerHTML = "Name:";		
		tr.appendChild(td);
		td = document.createElement("td");		
		td.innerHTML = this.info.testName;
		tr.appendChild(td);

		tr = document.createElement("tr");
		tr.className ="editTableRow";
		tbody.appendChild(tr);
		td = document.createElement("td");
		td.vAlign = "top";
		td.innerHTML = "URL(s):";
		tr.appendChild(td);
		td = document.createElement("td");
		td.vAlign = "top";
		td.innerHTML = this.info.site.join('<br/>');
		tr.appendChild(td);
		
		tr = document.createElement("tr");
		tr.className ="editTableRow";
		tbody.appendChild(tr);		
		td = document.createElement("td");
		td.vAlign = "top";		
		td.innerHTML = "Search Engine(s):";
		tr.appendChild(td);
		td = document.createElement("td");
		td.vAlign = "top";
		td.innerHTML = "";
		var tdHtml = new Array();
		tdHtml.push('<table cellpadding="5" cellspacing="5">');
		for(var i=0; i<this.info.engine.length; i++){
			tdHtml.push('<tr>');	
			tdHtml.push(	'<td>');
			tdHtml.push(		'<img src="images/vtview/country/'+this.info.engine[i].country_flag+'.png" height="16px"/>');
			tdHtml.push(	'</td>');
			tdHtml.push(	'<td>');
			tdHtml.push(		'<img src="images/seo/logo/'+this.info.engine[i].icon+'" height="16px"/>');
			tdHtml.push(	'</td>');
			tdHtml.push(	'<td>');
			tdHtml.push(this.info.engine[i].name);
			tdHtml.push(	'</td>');
			tdHtml.push('</tr>');			
			
		}
		tdHtml.push('</table>');
		td.innerHTML += tdHtml.join('');
		tr.appendChild(td);
		
		
		tr = document.createElement("tr");
		tr.className ="editTableRow";
		tbody.appendChild(tr);
		td = document.createElement("td");
		td.colSpan = "2";
		td.align = "left";
		tr.appendChild(td);
				
		changeFormStyle(this.editContent, true, true, true, false, false, true, true);	
	}
	
	this.getLegend = function(){
		var responseData = this.lastResponse.groupedData;
		var tdHtml;
		var seriesName;
		var tagType;
		var keywordTestResult;
		var keywordCount = 0;
		var color;
		var parentDiv = document.createElement("div");
		
		var showHideDiv = document.createElement("div");
		showHideDiv.style.cursor = 'pointer';
		this.showHideDiv = showHideDiv;
		
		var legendDiv = document.createElement("div");
		legendDiv.className = "legendDiv";
		legendDiv.style.height = this.el.offsetHeight/3 + "px";

		
		var table = document.createElement("table");
		table.cellPadding = 5;
		table.cellSpacing = 5;
		table.style.width = "100%";
		legendDiv.appendChild(table);
		
		if(this.showLegend == true){
			legendDiv.style.display = "";
			showHideDiv.innerHTML = 'hide legend';
			showHideDiv.isHidden = false;
		} else {
			legendDiv.style.display = "none";
			showHideDiv.innerHTML = 'show legend';
			showHideDiv.isHidden = true;			
		}
		
		showHideDiv.legendTable = legendDiv;
		
		showHideDiv.className = "link";
		showHideDiv.style.paddingLeft = "5px";
		showHideDiv.onclick = function(){
			
			if(this.isHidden == true){
				this.legendTable.style.display = '';
				showHideDiv.innerHTML = "hide legend";
				self.showLegend = true;
			} else {
				this.legendTable.style.display = 'none';
				showHideDiv.innerHTML = "show legend";
				self.showLegend = false;
			}
			self.drawChart();
			this.isHidden = !this.isHidden;
		}

		var tr;
		var seriesNameTd;
		var tempUrl;
		var previousUrl = "";
		var urlAppearCount = 0;		
		for(var keywordTestId in responseData){
			tdHtml = new Array();
			keywordTestResult = responseData[keywordTestId];			
			if(keywordTestId != "toFlexJSONString"){
				tagType = this.info.tagType;								
				seriesName = "";									
				if(tagType instanceof Array){
					tempUrl = keywordTestResult[tagType[0]].join(", ");
					for(var i=0; i<tagType.length; i++) {								
						if(i > 0){
							seriesName += keywordTestResult[tagType[i]].join(", ");
						}
					}					
				} else {
					seriesName = keywordTestResult[tagType];
				}
				color = this.lineColors[keywordCount];				
				keywordCount++;
				if(previousUrl != tempUrl) {
					urlAppearCount = 1;
					previousUrl = tempUrl;
					var urlTr = document.createElement("tr");
					urlTr.className = "clickable";
					
					var urlTd = document.createElement("td");
					urlTd.colSpan = 8;
					urlTd.innerHTML = tempUrl;
					urlTd.className = "legendUrl";
					urlTd.title = "hide";
					urlTd.isDisabled = false;
					urlTd.localIdArray = new Array();
					urlTd.onclick = function(){
						hideShowTest(this);
					}					
					urlTr.appendChild(urlTd);
					tr = document.createElement("tr");					
					table.appendChild(urlTr);
					table.appendChild(tr);
					
					seriesNameTd = document.createElement("td");
					seriesNameTd.innerHTML = "";
					seriesNameTd.style.paddingLeft = "5px";
					tr.appendChild(seriesNameTd);
				} else {
					urlAppearCount++;
				}
				
				
				var oneSeriesDiv = document.createElement("div");
				oneSeriesDiv.className = "floatLeft";
				oneSeriesDiv.innerHTML = "";
				
				oneSeriesDiv.innerHTML += '<div class="legendSquare floatLeft" style="background-color:#'+color+';float:left">&nbsp;</div>';				
				
				var seriesNameDiv = document.createElement("div");
				seriesNameDiv.localIdArray = new Array()
				seriesNameDiv.localIdArray[0] = keywordTestId;
				seriesNameDiv.id = "legend_" + keywordTestId;
				urlTd.localIdArray[urlTd.localIdArray.length] = keywordTestId;
								
				seriesNameDiv.title = "hide";
				
				seriesNameDiv.onclick = function(){
					hideShowTest(this);
				}
				
				var fontStr = "";
				if(keywordTestResult.disable != "true"){
					seriesNameDiv.isDisabled = false;
					seriesNameDiv.className = "legendActive";
				} else {
					seriesNameDiv.isDisabled = true;
					seriesNameDiv.className = "legendInactive";
				}
				seriesNameDiv.innerHTML = seriesName;
				oneSeriesDiv.appendChild(seriesNameDiv);
				seriesNameTd.appendChild(oneSeriesDiv);
			}
		}
		parentDiv.appendChild(showHideDiv);
		parentDiv.appendChild(legendDiv);
		return parentDiv;
	}

	this.saveState=function(editObject){
//		var fullURL = serviceUrl + User.userId + "/" + info.userTagId;
//		RequestDispatcher.sendPUT(fullURL, this.editResponse, editObject);
	}			
	
	this.editResponse=function(response, editObject){
		var resp = eval("("+response.responseText+")");
		if(resp.status == STATUS_OK){
			this.info.keyword = editObject.keyword;			
		}
	}
	


	this.parseInfo = function(xml,sel){
		self=sel;				
		self.info = eval("("+xml.responseText+")");
		var subViewId = self.info.subView;
		if(!Utils.exist(subViewId)){
			subViewId = 0;
			self.info.subViewId = 0;
		}
		if(Utils.exist(self.groupingList)){
			for(var i=0; i<self.groupingList.length; i++){
				if(self.groupingList[i].realId == subViewId){
					var groupTypeArray = self.info.groupType;
					var newArray = [];
					var group = self.groupingList[i].group;
					groupTypeArray = [group];
					newArray = groupTypeArray;	
					self.activeIndex = i;
					self.info.groupType = newArray;
					self.info.show = self.groupingList[i].show;
					self.info.subView = self.groupingList[i].realId;
					break;
				}
			}
		}		
		self.loadData();
	}




	
	this.saveView=function(viewId){		
		var fullURL = this.serviceUrl + User.userId + "/saveView/" + this.info.userTagId + "/" + this.info.view;					
		RequestDispatcher.sendPUT(fullURL, null);
	}
	
	this.saveSubView = function(subViewId){
		var fullURL = this.serviceUrl + User.userId + "/saveSubView/" + this.info.userTagId + "/" + subViewId;
		RequestDispatcher.sendPUT(fullURL, null);
	}
	
	this.saveActiveStatus = function(tagId, activeStatus){
		var fullURL = this.serviceUrl + User.userId + "/saveActiveStatus/" + tagId + "/" + activeStatus;
		RequestDispatcher.sendPUT(fullURL, null);
	}
		
	this.resizeHandler = function(e,width,height){
		this.displayData();
	}
	
	this.onPageResize=function(){
		this.displayData();
	}	

	this.maximize=function(){
		this.maximized = true;
		this.resizeHandler();			
	}

	this.minimize=function(){
		this.maximized = false;
		this.resizeHandler();		
	}

	this.maxMin = function(){
		if(this.maximized){
			this.minimize();
		} else {
			this.maximize();
		}
	}
	
	
	this.groupByKey = function(responseData, groupKey){
	
		var generatedIndex;
		var allKeys = [];
		var oneKeyGroup = {};
		var keyArray = [];		
		var merge = false;
		var changedData = {};
		var changedKeywordTestResult;
		
		var changedKeywordResultArray;
		var changedRow;
		var changedRank;
		var changedResultCount;		
		var changedCount = 0;
		
		
		var keywordTestResult;
		var keywordCount = 0;
		var keywordResultArray;
		var row;
		var rank;
		var resultCount;
		for(var keywordTestId in responseData){
			if(keywordTestId == "toFlexJSONString"){
				continue;
			}
			keywordTestResult = responseData[keywordTestId];
			
			
			if(!Utils.exist(keywordTestResult.disable) || keywordTestResult.disable != "true"){
				groupKeysArray = keywordTestResult[groupKey];
				merge = false;
				for(var k=0; k<allKeys.length && !merge; k++){
					oneKeyGroup = allKeys[k];				
					keyArray = oneKeyGroup.keys;								
					for(var i=0; i<keyArray.length && !merge; i++){
						for(var j=0; j<groupKeysArray.length && !merge; j++){
							if(keyArray[i] == groupKeysArray[j]){
								merge = true;
								oneKeyGroup.keys = Utils.mergeArrays(keyArray, groupKeysArray);
								generatedIndex = oneKeyGroup.index;							
							}
						}
					}
				}
				
				if(!merge){
					generatedIndex = new Date().valueOf() + Math.random();
					oneKeyGroup = {};
					oneKeyGroup.index = generatedIndex;
					oneKeyGroup.keys = groupKeysArray;
					allKeys.push(oneKeyGroup);
					changedData[generatedIndex] = {};
					changedData[generatedIndex][this.KEY_ENGINE] = [];				
					changedData[generatedIndex][this.KEY_SITE] = [];
					changedData[generatedIndex][this.KEY_ID] = [];
				}
				
	
				changedKeywordTestResult = changedData[generatedIndex];		
				changedKeywordTestResult[this.KEY_ENGINE] = Utils.mergeArrays(changedKeywordTestResult[this.KEY_ENGINE], keywordTestResult[this.KEY_ENGINE]);
				changedKeywordTestResult[this.KEY_SITE] = Utils.mergeArrays(changedKeywordTestResult[this.KEY_SITE], keywordTestResult[this.KEY_SITE]);
				changedKeywordTestResult[this.KEY_ID][changedKeywordTestResult[this.KEY_ID].length] = keywordTestId;			
				
				if(!Utils.exist(changedKeywordTestResult[this.KEY_RESULTS])) {
					changedKeywordTestResult[this.KEY_RESULTS] = [];
				}
				
				changedKeywordResultArray = changedKeywordTestResult[this.KEY_RESULTS];
				keywordResultArray = keywordTestResult[this.KEY_RESULTS];
				for(var i=0; i<keywordResultArray.length; i++){
					changedRow = changedKeywordResultArray[i];
					if(!Utils.exist(changedRow)){
						changedKeywordResultArray[i] = {};
						changedRow = changedKeywordResultArray[i];
					}
					row = keywordResultArray[i];
					
					changedRank = changedRow[this.KEY_RANK];
					rank = row[this.KEY_RANK];
					
					changedResultCount = changedRow[this.KEY_RESULT_COUNT];
					resultCount = row[this.KEY_RESULT_COUNT];
				
					changedCount = changedRow[this.KEY_COUNT];					
					
					if(Utils.exist(changedCount) && Utils.exist(changedResultCount) && Utils.exist(changedRow)){					
						changedRank = Math.round((changedCount*changedRank + rank)/(changedCount+1));
						changedResultCount = Math.round((changedCount*changedResultCount + resultCount)/(changedCount+1));
						changedCount = changedCount + 1;
					} else {
						changedRank = rank;
						changedResultCount = resultCount;
						changedCount = 1;
					}
					changedRow[this.KEY_RANK] = changedRank;
					changedRow[this.KEY_RESULT_COUNT] = changedResultCount;
					changedRow[this.KEY_COUNT] = changedCount;
					changedRow[this.KEY_DATE] = row.date;
				}
			}
		
		}		
		return changedData;
	}
		
	this.getChangedRank=function(changedCount,changedRank,rank){		
		return 0;
	};	 
	
	this.getChangedResultCount=function(changedCount,changedResultCount,resultCount){				
		return 0;
	};

}