Framework.Module=function(){

	var self=this;
	this.headerConfig=null;
	var chartConfig=null;
	this.headers=[];
	var userTimezoneOffset=(-new Date().getTimezoneOffset());
	var timer=-1;
	this.info={};
	this.data={};
	var dataId=null;
	this.el=null;
	self.editContent=null;
	self.editCollapse = null;
	self.editExpand = null;
	self.isExpanded = null;
	var moduleParams=null;
	var moduleTable=null;
	Framework.Module.PERIOD_CURRENT="0";
	Framework.Module.PERIOD_HISTORY="1";
	
	Framework.Module.prototype.drawTable=function(){
		//console.log("drawTable in Module");
	}
	Framework.Module.prototype.sendData=function(){
		var url="http://localhost:8083/monitis_lite2/resp.jsp";
		Request.sendGET(url, self.getData, null);
	}
	
	Framework.Module.prototype.getData=function(){
		//console.log(self);
	}
	
	Framework.Module.prototype.alertData=function(){
	//	alert("Module");
	}
	
	this.startWidget=function(){
		var action = self.config.infoAction ? "info" : "data";
		self.sendRequest(action);
	}
	Framework.Module.prototype.alertX=function(){
	//	alert(self.x);
	}
	this.sendRequest=sendRequest;
	this.parseInfo=parseInfo;
	this.loadData=loadData;
	this.parseData=parseData;
	this.displayData=displayData;
	this.loadTable=loadTable;
	this.loadLineChart=loadLineChart;
	this.loadBarChart=loadBarChart;
	this.loadAngleChart=loadAngleChart;
	this.init=init;
	this.loadBasicHTMLTable=loadBasicHTMLTable;
	this.edit=edit;
	this.saveChanges=saveChanges;
	this.propogateChanges=propogateChanges;
	this.acceptChanges=acceptChanges;
	this.loadPieChart=loadPieChart;
	this.getTitle=getTitle;
	this.saveView=saveView;
	
	this.initSelf=function(obj){
		self=obj;
	}
	
	function sendRequest(type,callback, date,param){
		var sendURL=self.config.serviceURL+ User.userId+"/";
		switch(type){
			case "info":
				sendURL+=self.config.infoAction+"/"+dataId+"/"+userTimezoneOffset;
				if(typeof callback=='undefined'|| callback==null){
					callback=self.parseInfo;
				}
			break;
			case "data":
					if(typeof date=='undefined' || date==null){
						date=new Date();
				}
				//sendURL=Framework.serverPath+"/"+self.config.dataAction+".xml";
				sendURL+=self.config.dataAction.url;
				switch(self.config.dataAction.dateType){
					case 'current':
						if(self.config.dataAction.unit=='day'){
							var date=new Date();
							sendURL+=+"/"+dataId+'/'+date.getFullYear()+'/'+(date.getMonth()+1)+'/'+date.getDate();
						}
					break;
					case 'last':
						sendURL+="last/"+dataId+'/'+self.config.dataAction.unit+'/'+self.config.dataAction.interval;
					break;
					default:
						sendURL+="/"+dataId;
					break;
					
				}
				sendURL+='/'+userTimezoneOffset;///*date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear()+"/"+*/
				if(typeof callback=='undefined' || callback==null){
					callback=self.parseData;
				}
			break;
		}
		Request.sendGET(sendURL,callback,param);
	}
	
	function parseInfo(response){
			var resp=eval("("+response.responseText+")");
			self.info=resp.data;
			
			self.info.period=Framework.Module.PERIOD_CURRENT;
			if(timer==-1 && typeof  self.config.refreshInterval!='undefined'){
				timer=setInterval(self.loadData,self.config.refreshInterval*1000);
			}
			self.obj.resizeTitle();
			self.loadData();
	}
	
	this.refreshDate = function(date){
		loadData(date);
	}
	
	function loadData(date){
		var currentDate;
		if(date){
			currentDate = date
		}else{
			currentDate = new Date();
		}
		self.sendRequest("data",null,currentDate,Framework.Module.PERIOD_CURRENT);
	}
	
	function parseData(resp,period){
		if(!period) period = self.info.period;
		var resp = eval("("+resp.responseText+")");		
		if(resp.status == STATUS_OK){
			self.data = resp.data;
			if (self.data.info){
				self.info = self.data.info;
				self.data = self.data.data;
				self.obj.resizeTitle();
			}
			self.displayData();
		}
	}
	
	function displayData(){
		self.info.view=self.info.view+"";
		switch(self.info.view){
			case LINE_VIEW:
				self.loadLineChart();
				break;
			case BAR_VIEW:
				self.loadBarChart();
				break;
			case ANGLE_VIEW:
				self.loadAngleChart();
				break;
			case TRACE_VIEW:
				self.loadTraceRoute();
				break;
			case PIE_VIEW:
				self.loadPieChart();
				break;
			default:
				self.loadTable();
		}
	}
	
		function loadTable(){
		
			self.el.innerHTML="";
			/*var moduleTable=new JQueryTable(self.el,self.headerConfig,self.data, false, false);
			moduleTable.drawTable();	
			*/
			var SnmpObjFlashTable= new FlashTable("module");
			
		 SnmpObjFlashTable.drawTable(self.el,self.headers, self.data,null)
		/*	var table= new Table(self.el,self.headerConfig,self.data, false, false);
			table.drawTable();*/
			self.info.view=TABLE_VIEW;
		}
	function loadLineChart(){
		self.info.view=LINE_VIEW;
		self.el.innerHTML="";
		self.el.style.height='100%';
		var maxValue=null;
		var minValue=null;
		if(self.config.dataAction.dateType=='last'){
			switch(self.config.dataAction.unit){
				case 'hour':
					var end=new Date();
					end.setMinutes(end.getMinutes()+20);
					start=new Date(end);
					start.setHours(start.getHours()-self.config.dataAction.interval-1);
					minValue=start.getTime();
					maxValue=end.getTime();
				break;
			}
		}
		if(minValue!=null){
			chartConfig[0]["x-axis"].minValue=minValue;
		}
		if(maxValue!=null) {
			chartConfig[0]["x-axis"].maxValue=maxValue;
		}
		var chart= new Chart(self.el,chartConfig,self.headerConfig,self.data);
		chart.drawLineChart();

	}
	function loadBarChart(){
		self.info.view=BAR_VIEW;
		self.el.innerHTML="";
		self.el.style.height='100%';
		var chart= new Chart(self.el,chartConfig,self.headerConfig,self.data);
		chart.drawBarChart();

	}
	function loadAngleChart(){
		self.info.view=ANGLE_VIEW;
		self.el.innerHTML="";
		self.el.style.height='100%';
		var chart= new Chart(self.el,chartConfig,self.headerConfig,self.data)
		chart.drawScaterChart();

	}
	
	function loadPieChart(){
		self.el.innerHTML="";
		var chart= new PieChart(self.el,chartConfig,self.headerConfig,self.data);
		chart.drawPieChart();
	}
	
	function loadBasicHTMLTable(){
		var innerTable="<table><thead><tr>";
		for(var j=0; j<self.headerConfig.length; j++){
			innerTable +="<th>"+self.headerConfig[j].headerName+"</th>";
		}
		innerTable+="</tr>";
		for(var i=0; i<self.data.length; i++){
			innerTable+="<tr>"; 
			for(var j=0; j<self.headerConfig.length; j++){
				innerTable +="<td>"+self.data[i][j]+"</td>";
			}
			innerTable+="</tr>";
		}
		self.el.innerHTML=innerTable;
	}
	
		function init(obj){
			self.obj=obj;
			self.config=obj.config;
			self.dataConfig=obj.data;
			dataId=self.dataConfig.dataId;
			moduleParams=self.config.moduleParams;
			
			self.headerConfig=self.config.tableConfig;
			chartConfig=self.config.charts;
			self.el=obj.elm_moduleContent;
			self.editContent=obj.elm_editContent;
			self.editCollapse = obj.editCollapse;
			self.editExpand = obj.editExpand;
			self.isExpanded = obj.isExpanded;
			self.headers=[];
			for(var i=0; i<self.headerConfig.length; i++){
				if(self.headerConfig[i].hidden!=true)
			self.headers.push({"dataField": decode(self.headerConfig[i].headerName),"headerText": decode(self.headerConfig[i].headerName),"sortable": self.headerConfig[i].sortable,"width":70})
			}
			
			self.startWidget();
		}
	
	function edit(){
		if(self.info==null){
			return;
		}
		self.editContent.innerHTML="";
		
		var table=document.createElement("table");
		self.editContent.appendChild(table);
		var tbody=document.createElement("tbody");
		table.appendChild(tbody);
		var tr,td;
		var input;
		for(var moduleName in moduleParams){
			if(typeof moduleParams[moduleName]!='undefined' &&   !moduleParams[moduleName].edit){
				continue;
			}
			if(typeof moduleParams[moduleName].active!='undefined' &&   !moduleParams[moduleName].active){
				continue;
			}
			tr=document.createElement("tr");
			tbody.appendChild(tr);
			td=document.createElement("td");
			tr.appendChild(td);
			td.innerHTML=moduleParams[moduleName].label+":";
			td=document.createElement("td");
			input=ModuleManager.getUIElement(moduleName,moduleParams[moduleName],self.info);
			input.inputName=moduleName;
			td.appendChild(input);
			tr.appendChild(td);
			if(moduleParams[moduleName].hidden){
				tr.style.display='none';
			}
			
		}
		var tr=document.createElement("tr");
		tbody.appendChild(tr);
		var td=document.createElement("td");
		td.colSpan=2;
		tr.appendChild(td);
		var saveButton=document.createElement("input");
		saveButton.type="button";
		saveButton.onclick=saveChanges;
		saveButton.value="Save Changes";
		td.appendChild(saveButton);
		
		
	}
	function saveChanges(){
		var table=self.editContent.firstChild;
		var rows=table.rows;
			
		var editString="";
		var row, uiElement,inputValue,inputName;
		var isChanged=false;
		var changedParams={};
		for(var i=0; i<rows.length-1; i++){
			row=rows[i];
			uiElement=row.cells[1].firstChild;
			inputValue=uiElement.getValue();
			inputName=uiElement.name;
			if(!moduleParams[inputName].edit){
				continue;
			}
			changedParams[inputName]=inputValue;
			if(self.info[inputName]!=inputValue){
				isChanged=true;
			}
		}
		if(isChanged){
			propogateChanges(changedParams);
		}
	}
		
	function propogateChanges(changedParams){
		var editString="";
		var sendURL=self.config.serviceURL+User.userId+"/"+self.config.editAction+"/"+ self.dataConfig.dataId+'?';
		for(var paramName in changedParams){
			editString+=paramName+"="+changedParams[paramName]+"&";
		}
		editString+="view="+self.info.view;
		//editString=editString.substring(0, editString.length-1);
		sendURL+=editString;
		Request.sendPUT(sendURL,acceptChanges,changedParams);
	}
	
	function acceptChanges(response, changedParams){
		var resp=eval("("+response.responseText+")");	
		if(resp.status==STATUS_OK){
			for(var objName in changedParams){
				self.info[objName]=changedParams[objName];
			}
		}
	}
	
	function getTitle(){
		var titleField = "name";
		if (self.config.titleInInfo) titleField = self.config.titleInInfo
		var titlecontent = self.info[titleField];
		if (titlecontent != "") titlecontent = "- "+titlecontent; 
		return self.config.title + " "+ titlecontent.escapeHTML();
 	}
	
	this.resizeHandler=function(e,width,height){
		self.displayData();
	}
	
	this.maximize=function(){
		 chartAnchorRadius=2;
		 MARGIN_BOTTOM=17;
		 hideDivHeight=21;
		 hideDivPaddingTop=5;
		 hideDivFontSize=15;
		 scale=3;
		 this.resizeHandler();
     }
     
	this.minimize=function(){
		chartAnchorRadius=1;
		MARGIN_BOTTOM=0;
		hideDivHeight=10;
		hideDivPaddingTop=2;
		hideDivFontSize=11;
		scale=2;
		this.resizeHandler();
	}
	
	function saveView(){
		var sendURL=self.config.serviceURL+User.userId+"/"+self.config.editAction+"view/"+ self.dataConfig.dataId+'?view='+self.info.view;
		Request.sendPUT(sendURL,acceptChanges,null);
	}

}
