var Resizer = function(divId, attr,callback){
	this.addResizer=function(){
		$("#" + divId).resizable({
			handles: attr.handles,
			minWidth: attr.minWidth,
			minHeight: attr.minHeight,
			maxWidth: attr.maxWidth,
			height: "auto",
			
			stop: function(e, ui) { 
			    callback(e, ui);
            } 
		});
	}
	
	this.disableResizer=function(){
		$("#" + divId).resizable("disable")
	}
	
	this.enableResizer=function(){
		$("#" + divId).resizable("enable")
	}
}
var TabManager=function(contId,callback,closeTab){
	var self=this;
	var $tabs;
	
	this.generateTab=function(){
		var self=this;
		var tabContainer=$id('tabContainer');
		var tabDefcont=document.createElement('div');
		var newTabTxt=document.createElement('txt');
		tabDefcont.innerHTML=' <div id="tabs"  class="flora"><ul id="tab_ul" class="jcarousel-skin-tango" style="float:left"><li  style="display:none" ><a href="#fragment-1"><span>One</span></a></li></ul><br> <img title="Click to Add new tab" id="new_tab" style="cursor:pointer;" onclick="Layouter.createNewTab()" src="images/new_tab.png" /><div  id="fragment-1" ></div></div>'
		tabContainer.appendChild(tabDefcont);
		$tabs=$("#tab_ul").tabs({
		    event: 'click',
			select: function(e, ui) {
		    			callback(ui.panel.id,ui.index);
	        		}
			});
		window.onresize = self.resize;
		//window.onresizeend = self.resize;
	}
		
	this.removeTab=function(index){
		$("#tab_ul").tabs("remove", index);

	}
	
	this.changeTabEvent=function(dragEvent){
		$tabs=$("#tab_ul").tabs({
			event: dragEvent,
			select: function(e, ui) {
		    			callback(ui.panel.id,ui.index);
	        		}
		});
	}
			
	this.createTab=function(contdivId,tabName){
		var spanEdit=document.createElement('span');
		spanEdit.appendChild(tabName);
		closeTab.firstChild.id='close_'+contdivId.substring(4);
	    $id(contdivId).style.display="none";
		$("#tab_ul").tabs('add', '#'+contdivId, spanEdit.innerHTML+' '+closeTab.innerHTML);
		$("#tab_ul")[0].lastChild.id='li_'+contdivId.substring(4);
		self.resize();
	//jQuery('#tab_ul').jcarousel()
		

	}
		
	this.getTabsObj=function(){
		return $("#tab_ul")[0];
	}
	
	this.activateTab=function(index){
		if(index!=null){
			$("#tab_ul").tabs("select", parseInt(index));
		}
		else{
			$("#tab_ul").tabs("select", 1);
		}
	}
	
	this.resize = function(){
		var tabs = $(".tabdiv", $("#tabs"));
		var height = 0;
	    if( typeof( window.innerHeight ) == 'number' ) {
	        height = window.innerHeight;
	    }else if(document.documentElement.clientHeight ) {
	        height = document.documentElement.clientHeight;
	   	}
		for (var i=0;i<tabs.length;i++){
			tabs[i].style.height = (height-80)+"px"; 
		}
	}
}

var Calendar=function(container,callback){
	this.showCalendar=function(){
		var inputCal=document.createElement('input');
			inputCal.style.display='';
			inputCal.id='input_'+container.id;
			container.appendChild(inputCal);
			inputCal.className = "calendarInputs";
			input = inputCal;
		 $('#'+inputCal.id).datepicker({ 
		    showOn: "button", 
		//	onSelect:callback,
		    buttonImage: "images/calendar.gif", 
		    buttonImageOnly: true 
		});
	}
}

var Tooltip=function(){
	this.activateTooltip=function(cont){
	$('#'+cont+' *').tooltip({
	track: true,
	delay: 0,
	showURL: false,
	fade: 50
});
		
	}
}

var Dialog = function(cont,callback, buttons){
	var dialogCont=document.createElement("div");//$id('dialogContainer');
	dialogCont.className="flora";
	document.body.appendChild(dialogCont);
	var container;
	var self = this;
	var dialogButtons;
	var bottonsList;
	var dialogCallback;
	var errorDiv=document.createElement('div')
	   	errorDiv.className="dialogErrorDiv";
	if (typeof cont!='undefined'&&cont!=null) {
		container = cont;
		container.obj = self;
		dialogCont.appendChild(errorDiv)
		dialogCont.appendChild(cont);
	}
	if (typeof buttons!='undefined'&&buttons!=null) {
		bottonsList = buttons;
	}
	
	if (typeof callback!='undefined'&&callback!=null) {
		dialogCallback = callback;
	}
	

	this.openDialog = function(cont,callback,buttons,title,width,height){
		if(typeof cont!='undefined'&&cont!=null){
			if(cont.parentNode){			
				cont.parentNode.removeChild(cont);
			}
			container=cont;
			container.obj=self;
			dialogCont.innerHTML="";
			dialogCont.appendChild(errorDiv);
			dialogCont.appendChild(cont);
			cont.style.height = "90%";
			self.dialogError("");
		}
		
		if(typeof buttons != 'undefined'){
			if (buttons == "ok"){
				bottonsList = {"Ok": function(){self.closeDialog()}};
			}else if (buttons != null){
				bottonsList = buttons;
			}
		}
		
		if (typeof callback!='undefined'&&callback!=null) {
			dialogCallback = callback;
		}
	
		if(typeof bottonsList=='undefined'){
			dialogButtons={"Ok":dialogCallback ,"Cancel": function(){self.closeDialog()}};
		}else{
			dialogButtons=bottonsList;
		}
		$(dialogCont).dialog({
			modal: true,
			title:title,
			resizable: false,
			minHeight:100,
			minWidth:100,
			width:width,
			height:height,
			overlay: {
				opacity: 0.5,
				background: "gray"
			},
			buttons: dialogButtons
		});
		

	}
	this.disableDialogButton=function(buttonName){
		$(":button:contains('"+buttonName+"')").attr("disabled","disabled");
	}
	
	this.enableDialogButton=function(buttonName){
		$(":button:contains('"+buttonName+"')").attr("disabled","");
	}
	
	this.hideDialogButton=function(buttonName){
		$(":button:contains('"+buttonName+"')").hide();
	}
	
	this.showDialogButton=function(buttonName){
		$(":button:contains('"+buttonName+"')").show();
	}
	
	this.closeDialog = function(){
		$(dialogCont).dialog("close");
	}
	
	this.dialogError=function(error){
		errorDiv.innerHTML='';
		if (!error || error == "") return;
		var errorStr="<ul>";
		if (typeof error == "string"){
			errorStr += "<li>"+error+"</li>";
		}else{
			for(var i=0; i<error.length; i++){
				errorStr += "<li>"+error[i]+ "</li>";
			}
		}
		errorStr+="</ul>";
		var errorText=document.createElement('div');
		errorText.innerHTML=errorStr;
		errorDiv.appendChild(errorText);
	}
	
	this.getDialogElements=function(){
		var dialogFormData={};
		var dialogInputs=container.getElementsByTagName('input');
		var dialogeSelects=container.getElementsByTagName('select');
		var dialogeTextAreas=container.getElementsByTagName('textarea');
		for(var i=0; i<dialogInputs.length; i++){
			var name=dialogInputs[i].name;
			if(typeof name!='undefined' && name!=null){
				if (dialogInputs[i].type == "checkbox" || dialogInputs[i].type == "radio"){
					dialogFormData[name] = dialogInputs[i].value == "on";
				}else{
					dialogFormData[name] = dialogInputs[i].value;	
				}
			}
		}
		for(var i=0; i<dialogeTextAreas.length; i++){
			var name=dialogeTextAreas[i].name;
			if(typeof name!='undefined' && name!=null){
				dialogFormData[name]=dialogeTextAreas[i].value;
			}
		}
			
		for(var i=0; i<dialogeSelects.length; i++){
			var name=dialogeSelects[i].name;
			if(typeof name!='undefined' && name!=null){
				dialogFormData[name]=dialogeSelects[i].value;

			}
		}
		return dialogFormData;
	}
	
	this.validate = function(){
		var dialogInputs=container.getElementsByTagName('input');
		var mailfilter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        var numberFilter = /^[0-9]{1,}$/;
		var oIdFilter = /^.*\.([a-zA-Z0-9]+)$/;
		for(var i=0; i<dialogInputs.length; i++){
			var value = dialogInputs[i].value.trim();
			var type = dialogInputs[i].getAttribute("dataType");
			if (value == "") {
				if (dialogInputs[i].getAttribute("required") == "true" ||
					dialogInputs[i].getAttribute("required") == true)
					return "Fill in required fields";
			}else if ((type == "num" && !numberFilter.test(value)) ||
					  (type == "mail" && !mailfilter.test(value))
					 
					  ){
				return "Not valid "+dialogInputs[i].getAttribute("label");
			}
		}
		return "success";
	}
	
}


var Tree = function(){
	this.addTree=function(cont){
		$(cont).treeview({
		control: "#treecontrol",
		persist: "cookie",
		cookieId: "treeview-black"
	});
	}
	
	this.addLazyLoadingTree=function(cont,url){
		$(cont).treeview({
		url: url,
		persist: "cookie",
		cookieId: "treeview-black"
	});
	}
	
	
}


var Chart=function(cont,charts,tableConfig,data){

	var chartAnchorRadius=1;
	var warningColor = "#DEC474";
	var failedColor = "#FF4800";
	var okColor="#529100";
	var minValue=null;
	var maxValue=null;
	if(typeof charts[0]["x-axis"].minValue!='undefined' && charts[0]["x-axis"].minValue!=null){
		minValue=charts[0]["x-axis"].minValue;
	}
	if(typeof charts[0]["x-axis"].maxValue!='undefined' && charts[0]["x-axis"].maxValue!=null){
		maxValue=charts[0]["x-axis"].maxValue;
	}
	//var tableConfig=[{"headerName":"Time","dataType":"num","sortable":true,"name":"time"},{"headerName":"Response Time","dataType":"string","sortable":true,"name":"responseTime"},{"headerName":"Oid","dataType":"string","sortable":true,"name":"oid"},{"headerName":"Status","dataType":"string","sortable":true,"name":"status"},{"headerName":"Value","dataType":"num","sortable":true,"name":"value"}];
	//var data =[["00:03",345.0,"OK"],["00:08",341.0,"OK"],["00:13",348.0,"OK"],["00:18",340.0,"OK"],["00:23",375.0,"OK"],["00:28",344.0,"OK"],["00:33",339.0,"OK"],["00:38",343.0,"OK"],["00:43",339.0,"OK"],["00:48",351.0,"OK"],["16:28",338.0,"OK"]];
//	var data =[["15:28","15003","Timeout: No response from 10.137.25.130:161","NOK"],["15:23","15003","Timeout: No response from 10.137.25.130:161","OK"],["15:18","15003","Timeout: No response from 10.137.25.130:161","NOK"],["15:13","15003","Timeout: No response from 10.137.25.130:161","NOK"],["15:08","15003","Timeout: No response from 10.137.25.130:161","NOK"],["15:03","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:58","15063","Timeout: No response from 10.137.25.130:161","NOK"],["14:53","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:48","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:43","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:38","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:33","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:28","15007","Timeout: No response from 10.137.25.130:161","NOK"],["14:23","15007","Timeout: No response from 10.137.25.130:161","NOK"],["14:18","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:13","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:08","15003","Timeout: No response from 10.137.25.130:161","NOK"],["14:03","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:58","15002","Timeout: No response from 10.137.25.130:161","NOK"],["13:53","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:48","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:43","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:38","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:33","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:28","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:23","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:18","15011","Timeout: No response from 10.137.25.130:161","NOK"],["13:13","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:08","15003","Timeout: No response from 10.137.25.130:161","NOK"],["13:03","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:58","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:53","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:48","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:43","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:38","15007","Timeout: No response from 10.137.25.130:161","NOK"],["12:33","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:28","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:23","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:18","15003","Timeout: No response from 10.137.25.130:161","NOK"],["12:13","15107","Timeout: No response from 10.137.25.130:161","NOK"],["12:08","15007","Timeout: No response from 10.137.25.130:161","NOK"],["12:03","15003","Timeout: No response from 10.137.25.130:161","NOK"],["11:58","15003","Timeout: No response from 10.137.25.130:161","NOK"],["11:53","15028","Timeout: No response from 10.137.25.130:161","NOK"],["11:48","15003","Timeout: No response from 10.137.25.130:161","NOK"],["11:43","15008","Timeout: No response from 10.137.25.130:161","NOK"],["11:38","15003","Timeout: No response from 10.137.25.130:161","NOK"],["11:33","15003","Timeout: No response from 10.137.25.130:161","NOK"]];

	var x_axis=charts[0]['x-axis'].name;
	var y_axis=charts[0]['y-axis'].name[0];
    var statuses=charts[0]['statuses'].name;

	var chartColor=charts[0]['y-axis'].color;
	var x_index;
	var y_index;
	var status_index;
	for(var i=0;i<tableConfig.length;i++){
		if(tableConfig[i]['name']==x_axis){
			x_index=i
		}
		if(tableConfig[i]['name']==y_axis){
			y_index=i
		}
		if(tableConfig[i]['name']==statuses){
			status_index=i
		}
	}
	var Xarray=[];
	var Yarray=[];
	var StatusArray=[];
		
	for(var i=0;i<data.length;i++){
		var timeArray=(data[i][x_index]).split(":");
		
		if(charts[0]['x-axis'].type=="time"){
			Xarray.push(parseInt(timeArray[0])+parseInt(timeArray[1])/60);
		}else{
			Xarray.push(data[i][x_index]);
		}
		
		Yarray.push(data[i][y_index]);
		StatusArray.push(data[i][status_index]);
	}

var createLineChartXML=function(){
	var chartStringArray=[];
    var chartStringArray2=[];
    var chartSring="";
    var isShowName=0;
    var locData;
    var dataColor="";
    var yMax="4";
    var isCategoriesSet=false;
	var xAxisMinValue="";
	var xAxisMaxValue="";
	if(minValue!=null){
		 xAxisMinValue=" xAxisMinValue='"+minValue+"' ";
		 if(charts[0]['x-axis'].type=="timestamp"){
			 chartStringArray.push("<categories>");
			 var startValue=(new Date());
			 startValue.setTime(minValue);
			 startValue.setHours(startValue.getHours()+1);
			 startValue.setMinutes(0);
			 for(var value=startValue.getTime(); value<=maxValue; value+=3600*1000){
			 		var date=new Date();
					date.setTime(value);
					date=date.getHours();
					if(date<10){
						date="0"+date;
					}
					date+=":00";
					chartStringArray.push("<category label='"+date+"' x='"+value+"' />");
			 }
			 chartStringArray.push("</categories>");
		 }
	}
	if(maxValue!=null){
		 xAxisMaxValue=" xAxisMaxValue='"+maxValue+"' ";
	}
    chartStringArray2.push("<chart palette='2' chartTopMargin='6'"+xAxisMinValue+xAxisMaxValue+"captionPadding='0' showValues='0' showLegend='0' bgColor='FFFFFF' chartBottomMargin='0' xAxisNamePadding='0' labelPadding='0'   chartLeftMargin='0' chartRightMargin='2' showBorder='0' labelDisplay='STAGGER' labelStep='2'  anchorRadius='"+chartAnchorRadius+"'>");
     chartStringArray.push("<dataset lineThickness='2' color='529100' seriesName='response'  >");
     
     for (var i = 0; i < Xarray.length; i++) {
	 	if(charts[0]['x-axis'].type=="timestamp"){
			time=new Date();
			time.setTime(Xarray[i]);
			var hours=time.getHours();
			if(hours<10){
				hours="0"+hours;
			}
			var minutes=time.getMinutes();
			if(minutes<10){
				minutes="0"+minutes;
			}
			time=hours+":"+minutes;
		}
		else{
			time=Xarray[i];
		}
	 	toolText = time+" "+Yarray[i]+" "+StatusArray[i];
			if (StatusArray[i] == TEST_STATUS_NOK_STRING) {
				dataColor = " anchorRadius='2' anchorBgColor='" + failedColor.substring(1) + "'" + " anchorBorderColor='" + failedColor.substring(1) + "'";
			chartStringArray.push("<set label='"+time+"'" + dataColor + " toolText='" + toolText + "' x='"+Xarray[i] + "'  value='0'/>");
			}
			else {
				dataColor = "";
				chartStringArray.push("<set label='"+time+"'" + dataColor + " toolText='" + toolText + "' x='"+Xarray[i]+"'  value='" + Yarray[i] + "'/>");
			}
		}
     isCategoriesSet=true;
     chartStringArray.push("</dataset>");
   
   chartStringArray=chartStringArray2.concat(chartStringArray);
   chartStringArray.push("</chart>");
   chartString=chartStringArray.join('');
	return chartString;
   }
	
	this.drawGoogleLineChart = function(){
		var lineChartHeight=cont.offsetHeight-22;
		var lineChartWidth=cont.offsetWidth;

    
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Year');
        data.addColumn('number', 'Time');
        data.addRows(Xarray.length);
		for(var i = 0; i<Xarray.length; i++){
			data.setValue(i, 0,Xarray[i].toString());
		}
       	for(var i = 0; i<Yarray.length; i++){
			data.setValue(i, 1, parseInt(Yarray[i],10));
        
		}
        var chart = new google.visualization.LineChart(cont);
		chart.draw(data, {width: lineChartWidth, height: lineChartHeight, legend: 'bottom', title: ''});
		cont.setAttribute("align","center");
	}
	
	this.drawLineChart = function(){
	var chartDiv=document.createElement("div");
			chartDiv.style.width="100%";
			chartDiv.id=cont.id+"_chart";
			cont.appendChild(chartDiv);
			var lineChartHeight=cont.offsetHeight-22;
			var lineChartWidth=cont.offsetWidth-10;
			var chart = new FusionCharts(Framework.serverPath+"/Charts/Flash/MSLine.swf", "Chartid", lineChartWidth, lineChartHeight, "0", "0");
			chart.setDataXML(createLineChartXML());
			chart.render(chartDiv.id);
	}
	
	
	this.drawBarChart = function(){
		var lineChartHeight=cont.offsetHeight-22;
		var lineChartWidth=cont.offsetWidth-5;
		var chart = document.createElement('img');
		chart.src = 'http://chart.apis.google.com/chart?cht=bvs&chs='+lineChartWidth+'x'+lineChartHeight+'&chd=t:' + Xarray.toString() + '|' + Yarray.toString() + '&chco='+chartColor+'&chxt=x,y'
		cont.setAttribute("align","center");
		cont.appendChild(chart)
	}
	this.drawScaterChart = function(){
		var lineChartHeight=cont.offsetHeight-22;
		var lineChartWidth=cont.offsetWidth;
		var chart = document.createElement('img');
		chart.src = 'http://chart.apis.google.com/chart?cht=s&chs='+lineChartWidth+'x'+lineChartHeight+'&chd=t:' + Xarray.toString() + '|' + Yarray.toString() + '&chco=FF0000&chxt=x,y'
		cont.setAttribute("align","center");
		cont.appendChild(chart)
	}
}

ChartManager={
	inited:false,
	init:function(callback){
		google.load("visualization", "1", {packages:["linechart"]});
		if(typeof callback!='undefined' && callback!=null){
			google.setOnLoadCallback(callback);
		}
		else{
			google.setOnLoadCallback(ChartManager.initCallback);
		}
      	
	},
	initCallback:function(){
		ChartManager.inited=true;
	}
};


var PieChart=function(cont,charts,tableConfig,data){
	var x_axis=charts[0]['x-axis'].name;
	var label_axis=charts[0]['label-axis'];
	var x_index;
	var label_index;
	for(var i=0;i<tableConfig.length;i++){
		if(tableConfig[i]['name']==x_axis){
			x_index=i;
		}
		if(tableConfig[i]['name']==label_axis){
			label_index=i;
		}
	}
	var Xarray=[];
	
	var Labelarray=[];
	
	for(var i=0;i<data.length;i++){
		Xarray.push((data[i][x_index]))
		
		Labelarray.push(data[i][label_index]);
	}
	
	this.drawPieChart = function(){
		var pieChartHeight=cont.offsetHeight-22;
		var pieChartWidth=cont.offsetWidth;
		var chart = document.createElement('img');
		chart.src = 'http://chart.apis.google.com/chart?cht=p3&chs=400x125&chd=t:' + Xarray.toString() + '&chl=' + Labelarray.join('|');
		cont.setAttribute("align","center");
		cont.appendChild(chart);
	}
}



var MenuManager = function(containerObj, dataObj){
	var container = null;
	
	var menuArray = new Array();
	
	menuConfig = null;
	
	var options = {
					minWidth:100,
					offsetTop: 14,
					arrowSrc:"../libs/jquery/css/i/menu/arrow_right.gif",
					onClick: function(ev, menuItem){
								if(menuItem.callback){
									menuItem.callback(menuItem.param);
									menuItem.parentMenu.hide();
								}
							}
					};
	
	this.init = function(containerObj, dataObj){
		container = containerObj;
		
		for(var k = 0; k < dataObj.length; k++){
			var children = new Array();
			
			for(var i = 0; i < dataObj[k].childItems.length; i++){
				var child = dataObj[k].childItems[i];
				var item = new $.MenuItem({src:child.name, url:child.url}, options);
				item.callback = child.callback;
				item.param = child.param;
				craeteTree(item, child);
				children.push(item);			
			}
			if(children.length==0){
				children = null;
			}
		    var menu_div = newTag("span");
			menu_div.className = "menu_header";
			var font = newTag("font");
			font.className = "menu_font";
			font.innerHTML = dataObj[k].name;
			menu_div.appendChild(font);
			if(children!=null){
				var imgArrow = newTag("img");
				imgArrow.src = "images/arrow.png";
				menu_div.appendChild(imgArrow);
			}
			container.appendChild(menu_div);
			menu = new $.Menu($(menu_div), children, options);
			menuArray.push(menu);

		}

		for(var i = 0; i < menuArray.length; i++){
			if(menuArray[i].menuItems.length==0){
				for(var j = 0; j < dataObj.length; j++){
					if(dataObj[j].name==$(menuArray[i].target).text()){
						if(dataObj[j].callback){
							container.childNodes[i].param = dataObj[j].param;
							container.childNodes[i].callback = dataObj[j].callback;
						}
						container.childNodes[i].onclick = emptyMenuCallback;
						break;
					}
				}
			}
		}
		
		menuSwitcher();

	}

	var emptyMenuCallback = function(){
		this.callback(this.param);
		menuArray[this.index].hide();
	}
	
	var menuSwitcher = function(){
		for(var i = 0; i < menuArray.length; i++){
			menuArray[i].target[0].index = i;
			menuArray[i].target[0].onmouseover = function(){
				for(var k = 0; k < menuArray.length; k++){
					if(menuArray[k].visible && k!=this.index){
						menuArray[k].hide();
						menuArray[this.index].show();
						break;
					}
				}
			};
			menuArray[i].target[0].isVisible = false;
			menuArray[i].target[0].onmousedown = function(){
				if(menuArray[this.index].visible){
					this.isVisible = true;
				}else{
					this.isVisible = false;
				}
			};
			menuArray[i].target[0].onmouseup = function(){
				if(this.isVisible){
					menuArray[this.index].show();
				}else{
					menuArray[this.index].hide();
				}
			};
		}
	}
	

	var addExistingItem = function(menuItem){
		this.menu.addItem(menuItem);
	}
	
	this.addItem = function(curMenu, itemObj){
		var item = new $.MenuItem({src:itemObj.name, url:itemObj.url}, options);
		item.callback = itemObj.callback;
		item.param = itemObj.param;
		
		curMenu.addItem(item);
	}
	
	var addItems = function(itemsArray){
		this.menu.addItems(itemsArray);
	}
	
	this.addMenus = function(newMenus){
		var index = 0;
		for(var k = 0; k < newMenus.length; k++){
			var children = new Array();
			
			for(var i = 0; i < newMenus[k].childItems.length; i++){
				var child = newMenus[k].childItems[i];
				var item = new $.MenuItem({src:child.name, url:child.url}, options);
				item.callback = child.callback;
				item.param = child.param;
				craeteTree(item, child);
				children.push(item);			
			}
			if(children.length==0){
				children = null;
			}
//			var font = newTag("font");
//			font.className = "menu_font";
//			font.innerHTML = newMenus[k].name;
			var imgArrow = newTag("img");
			imgArrow.src = "images/arrow.png";
			var menu_div = newTag("span");
			menu_div.className = "menu_header";
//			menu_div.appendChild(font);
			menu_div.appendChild(newText(newMenus[k].name));
			menu_div.appendChild(imgArrow);
			container.appendChild(menu_div);
			if(index%2==0){
				container.insertBefore(menu_div, container.childNodes[0]);
			}else{
				container.insertBefore(menu_div, container.childNodes[0].nextSibling);
			}
			index++;
			menu = new $.Menu($(menu_div), children, options);
			menuArray.push(menu);
		}	
	}
	
	this.getMenuArray = function(){
		return menuArray;
	}
	
	var craeteTree = function(parentMenu, dataObj){
		var children = getChildren(parentMenu, dataObj);
		
		for(var i = 0; i < dataObj.childItems.length; i++){
			craeteTree(children[i], dataObj.childItems[i]);
		}
		
		return;
	}

	var getChildren = function(parentMenu, parentObj){
		var children = new Array();
		
		for(var i = 0; i  < parentObj.childItems.length; i++){
			var child = parentObj.childItems[i];
			var item = new $.MenuItem({src:child.name, url:child.url}, options);
			item.callback = child.callback;
			item.param = child.param;
			children.push(item);
		}
		if(children.length!=0){
			new $.Menu(parentMenu, children, options);
		}
		
		return children;
	}
	
	this.init(containerObj, dataObj);
	
}

//-------------------------------FlashTable-------------------------------------


var FlashTable= function(tableType){

 this.drawTable=function(divEl,headers,data,checkactiv){
 	// var data =[[3243, 1, 2,3,4], [3243, "val2", "owner2","owner1","owner1"], [65456, "val3", "owner3","owner1","owner1"], [76985, "val4", "owner4","owner1","owner1"], [54658, "val5", "owner5","owner1","owner1"], [5468, "val6", "owner6","owner1","owner1"], [23789, "val7", "owner7","owner1","owner1"]];
	             data_ = "[";
				 var dataItem;
				   switch(tableType)
							{
							case "module":
								for (var i = 0; i < data.length; i++) {
							  	var st=","
								dataItem = "";
								dataItem += '{';
								for (var j = 0; j < headers.length; j++) {
  									var comma=","
									if(j==headers.length-1) comma="";
  								 dataItem += '"' + headers[j].headerText + '": "' + data[i][j] + '"'+comma;
  						        }	
								dataItem += '},';
								data_ += dataItem;
							
					}
							  break;
							case "my":
								for (var i = 0; i < data.length; i++) {
							  	var st=","
								dataItem = "";
								dataItem += '{';
								dataItem += '"cellOnclick": "' + "ModuleMyManager.checkUncheckRow:" + i + ':' + data[i][0] + '",';
								dataItem += '"checkboxOnclick": "' + "ModuleMyManager.checkUncheckRow:" + i + ':' + data[i][0] + '",';
								dataItem += '"active": "' + checkactiv + '",';
  								for (var j = 1; j < headers.length; j++) {
  									var comma=","
									if(j==headers.length-1) comma="";
  								 dataItem += '"' + headers[j].headerText + '": "' + data[i][j] + '"'+comma;
  						        }	
								dataItem += '},';
								data_ += dataItem;
							
					}
							  break;
							
							}
				
						data_ = data_.substr(0, data_.length-1);
						data_ += "]";
	 config = toFlexJSONArrayString(headers);	
	 divEl.style.overflow="auto";
	 divEl.innerHTML = getGridFlashNode( "datagrid_TagCloud", data_ , config );
		
		}
	

}

var ContactFlashTable = function(){
	this.drawTable=function(el,headers,data,doDelete, showEdit, doActivate,sendConf,confSent,ACCOUNT_NAMES){
	
			if(data != undefined){
			
		
		
			
			var config = toFlexJSONArrayString(headers);	
			var data_ = "[";
			var dataItem;
			
			for( var i=0; i<data.length; i++ ) {
					
				dataItem = "";
				dataItem += '{';
				dataItem += '"src": "http://monitis.com/images/monitis/edit.gif",';//http://monitis.com/images/monitis/edit.gif
				dataItem += '"src1": "http://monitis.com/modules/test/img/cancel.gif",';
				dataItem += '"cellOnclick": "'  + "flashCellCallback:cellOnclick:" + el.id + ":" + i +":"+data[i][0]+ '",';
				dataItem += '"checkboxOnclick": "'  + "flashCheckboxCallback:doActivate:" + el.id + ":" + i +":"+data[i][0]+ '",';
				dataItem += '"imgOnclick": "'  + "flashImageCallback:showEdit:" + el.id + ":" + i +":"+data[i][0]+ '",';
				dataItem += '"imgOnclick1": "'  + "flashImageCallback:doDelete:" + el.id + ":" + i +":"+data[i][0]+ '",';
				
				if(data[i][5] == 1)	dataItem += '"checkBoxTooltip": "Deactivate contact",';
				else dataItem += '"checkBoxTooltip": "Activate contact",';
				dataItem += '"imgTooltip": "Edit contact",';
				dataItem += '"img1Tooltip": "Delete contact",';
					
				var confText = "Yes";
			if (!data[i][4]){
					if (confSent||data[i][3] == ACCOUNT_NAMES[1]){
						confText = "Sent";
					}else{
						confText = "Resend Confirmation";
						//dataItem += '"urlOnclick": "'  + "flashCellCallback:sendConf:" + el.id + ":" + i +":"+data[i][0]+ '",';
					}
				}
				dataItem += '"enable": "'  + data[i][4] + '",';
				dataItem += '"firstName": "'  + data[i][1] + '",';
				dataItem += '"account": "'  + data[i][2] + '",';
				dataItem += '"name": "'  + confText + '",';
				dataItem += '"active": "'    + data[i][5] + '",';
				dataItem += '"types": "'     + data[i][3] + '"';
				dataItem += '},';
				data_ += dataItem;
			}
			data_ = data_.substr(0, data_.length-1);
			data_ += "]";
			
			var dataGrid = $id( "datagrid_" + el.id);
			el.innerHTML = getGridFlashNode( "ChartId" + el.id, data_ , config );
			
		}	
	}
}


//--------------------------------------------------------------------
Table = function(cont,headerConfig,tableData,selectable,isContact, asObject){
	var headers =headerConfig;//[{"headerName":"Time","dataType":"num","sortable":true},{"headerName":"Response Time","dataType":"string","sortable":true},{"headerName":"Oid","dataType":"string","sortable":true},{"headerName":"Value","dataType":"num","sortable":true},{"headerName":"Status","dataType":"string","sortable":true}];
	var data = tableData;//[[3243, "val1", "owner1","owner1","owner1"], [3243, "val2", "owner2","owner1","owner1"], [65456, "val3", "owner3","owner1","owner1"], [76985, "val4", "owner4","owner1","owner1"], [54658, "val5", "owner5","owner1","owner1"], [5468, "val6", "owner6","owner1","owner1"], [23789, "val7", "owner7","owner1","owner1"]];
	var container = cont;
	var tableId="table_"+container.id;
	var str = new Array();
	var width;
	var newWidth;
	var drawingIndexArray=[];
	var visibleCount=0;
	for(var i=0; i<headers.length; i++){
		if(!headers[i].hidden){
			visibleCount++;
		}
	}
	var contOffsWid=parseInt(container.offsetWidth);
		if(contOffsWid ==0){
			contOffsWid=615
		}
	var tbWidth=contOffsWid/visibleCount-18 + 'px';
	
	str.push("<table id='"+tableId+"'><thead><tr>");

	for(i = 0; i < headers.length; i++){
		newWidth=headerConfig[i].width;
		if (typeof newWidth != 'undefined' && newWidth != null) {
			width = newWidth;
		}else{
			width = tbWidth;
		}
		if(!headerConfig[i].hidden){
			drawingIndexArray.push(i);
			str.push("<th  width='"+width+"'>"+headers[i].headerName+"</th>");
		}
	
	}
	str.push("</tr></thead>");
	str.push("<tbody>");
	if (asObject){
		for(var j = 0; j < data.length; j++){
			str.push("<tr>");
			for(var k = 0; k < headers.length; k++){
				if (headers[k].hidden) continue;
				if (headers[k].dataType == "link"){
					if (data[j][headers[k].paramName]){
						str.push("<td title='"+data[j][headers[k].name]+"'><a href='javascript:showModule(\""+headers[k].moduleToOpen+"\", "+
								data[j][headers[k].paramName]+")'>"+data[j][headers[k].name]+"</a></td>");	
					}else{
						str.push("<td></td>");
					}
				}else{
					str.push("<td title='"+data[j][headers[k].name]+"'>"+data[j][headers[k].name]+"</td>");				
				}
			}
			str.push("</tr>");
		}
	}else{	
		for(var j = 0; j < data.length; j++){
			str.push("<tr>");
			for(var k = 0; k < drawingIndexArray.length; k++){
				var col = drawingIndexArray[k];
				if (headers[col].dataType == "link"){
					if (data[j][headers[col].paramIndex]){
						str.push("<td title='"+data[j][col]+"'><a href='javascript:showModule(\""+headers[col].moduleToOpen+"\", "+
								data[j][headers[col].paramIndex]+")'>"+data[j][col]+"</a></td>");	
					}else{
						str.push("<td></td>");
					}
				}else{
					str.push("<td title='"+data[j][col]+"'>"+data[j][col]+"</td>");				
				}
			}
			str.push("</tr>");
		}
	}
	str.push("</tbody></table>");
	str = str.join("");
	var tableDiv = newTag("div");
	tableDiv.id = "tableDiv";
	tableDiv.innerHTML = str;
	
	this.drawTable=function(){
		var tableHeight=container.offsetHeight-31;
		container.appendChild(tableDiv)
		try{
			$('#'+tableId).tablesorter(); 
				$('#'+tableId).flexigrid(
				{	height:tableHeight,
					striped:true,
				    resizable: false
		
				}
				);
		}catch(ex){}
		return tableHeight>0;
		
	}
}

var pagerIndex = 0;
JQueryTable = function(cont,headerConfig,tableData,selectable,isContact,editHandler){
	if(typeof(selectable)=="undefined"){
		selectable = false;
	}
	if(typeof(isContact)=="undefined"){
		isContact = false;
	}
	var editable = false;
	if(typeof(editHandler)!="undefined"){
		editable = true;
	}
	var hasID = selectable || isContact;
	var pageSize;
	var container = cont;
	//container.style.height = container.parentNode.offsetHeight+"px";
	var tableDiv = newTag("div");
	tableDiv.id = "tableDiv";
	tableDiv.setAttribute("style", "height:100%;");
	var table;// = newTag("table");
/*	table.className ="tablesorter";
	tableDiv.appendChild(table);*/
	var self = this;
/*	$(table).scrollodex({
		maxRows: 1,
	    matchHeight: true
	});*/
	
	var headers = headerConfig; //[{"headerName":"Time","dataType":"num","sortable":true},{"headerName":"Value","dataType":"num","sortable":true},{"headerName":"Owner","dataType":"string","sortable":true}];
	var data = tableData; //[[3243, "val1", "owner1"], [3243, "val2", "owner2"], [65456, "val3", "owner3"], [76985, "val4", "owner4"], [54658, "val5", "owner5"], [5468, "val6", "owner6"], [23789, "val7", "owner7"]];	

	var selectAll = function(){
		var self = $(table).find("input")[0];
		var checkBoxes = $(table).find("input");
		for(var i = 1; i < checkBoxes.length; i++){
			checkBoxes[i].checked = self.checked;
		}
	}
	
	var fillTable = function(){
		var str = new Array();
		str.push("<table class='tablesorter'><thead><tr>");
		if(selectable && !isContact){
			str.push("<th><input type='checkbox' /></th>");
		}
		for(i = 0; i < headers.length; i++){
			str.push("<th"+((headers[i].hidden==true) ? " style='display:none'><div title='"+headers[i].headerName+"' style='overflow:hidden' name='thName'" : "><div title='"+headers[i].headerName+"' style='overflow:hidden' name='thName' class='thName'")+">"+headers[i].headerName+"</div></th>");
		}
		if(editable && !isContact){
			str.push("<th></th>");
		}
		str.push("</tr></thead>");
		
		str.push("<tbody>");
		for(var j = 0; j < data.length; j++){
			str.push("<tr>");
			for(var k = 0; k < data[j].length; k++){
				if(hasID){
					if(k!=0){//data[j].length-1){
						var title = headers[k-1].headerName=="" || headers[k-1].headerName=="Confirmed" ? "" : data[j][k];
						str.push("<td"+((headers[k-1].hidden==true) ? " style='display:none'" : "")+"><div title='"+title+"' style='overflow:hidden'>"+data[j][k]+"</div></td>");								
					}else if(selectable){
						var checked = "";
						if (typeof data[j][0] == "string"){
							checked = data[j][0].substr(data[j][0].length-1, 1) == "1" ? "checked" : "";
						}
						var tmp = "<td><input "+checked+" type='checkbox' rowNumber='"+j+"' idVal='"+data[j][0]+"'></td>";
						str.push(tmp);
					}
				}else{
					str.push("<td"+((headers[k].hidden==true) ? " style='display:none'" : "")+"><div style='overflow:hidden'>"+data[j][k]+"</div></td>");				
				}
			}
			if (editable){
				str.push("<td><img style='cursor: pointer' src=images/table/edit.gif onclick='"+editHandler.replace(":id", data[j][0])+"' ></img></td>");								
			}
			str.push("</tr>");
		}
		
		str.push("</tbody></table>");
		str = str.join("");
		
		tableDiv.innerHTML = str;
		if($(".tablesorter", container).length==0){
			container.appendChild(tableDiv);
		}
		table = $(tableDiv).find("table")[0];
		
		if(selectable){
			var selAll = $(table).find("input")[0];
			selAll.onclick = selectAll;
		}
		
		$.tablesorter.defaults.widgets = ["zebra"];
		var startIndex = 0;
		if(selectable){
			$.tablesorter.defaults.headers[0] = {sorter: false};
			startIndex = 1;
		}
		for (var i=0;i<headers.length;i++){
			var sorter = headers[i].sortable ? headers[i].dataType : false;
			$.tablesorter.defaults.headers[i+startIndex] = {sorter: sorter};
		}
		if(editable){
			$.tablesorter.defaults.headers[i+startIndex] = {sorter: false};
		}
	}
	
	fillTable();
	
	this.drawTable=function(page_size){
		var colSize = [];
		var shownThs = $(".thName", table);
		if(selectable){
			shownThs.length++;
		}
		var contWidth = container.offsetWidth;
		if (editable){
			contWidth -= 10;
		}
		if (contWidth <= 0){
			setTimeout(self.drawTable, 200);
			return;
		}
	
		if(selectable){
			var cellWidth = (contWidth)/shownThs.length-10;
		}else{
			var cellWidth = (contWidth-30)/shownThs.length-10;
		}
		if(selectable){
			colSize[0] = 30;
		}
		for(var i = (selectable? 1 : 0); i < headers.length+(selectable? 1 : 0); i++){
			if(!headers[selectable ? i-1 : i].hidden){
				colSize[i] = cellWidth;
			}else{
				colSize[i] = 0;
			}
		}
		if (editable){
			colSize[colSize.length] = 10;
		}
		$(table).grid({
			navigate:{
				maintainSelection:false
			},
			scroll:{
				width: container.offsetWidth,
				height: container.offsetHeight-30,
				colWidths: clone(colSize, true)
			},
			stripe:true,
			columnResize:false
		});

		var ths = $(table).find("th");
		var tds = $(table).find("td");
		for(var i = 0; i < tds.length; i++){
			var wd = colSize[i%(data[0].length-(selectable ? 0 : 1))]+"px";
			tds[i].style.width = wd;
			var div = $(tds[i]).find("div")[0];
			if(div){
				div.style.width = wd;
			}
		}
		for(var i = ths.length-1; i >=0 && tds.length>0; i--){
			if (colSize[i] > 0){
				var wd = tds[i].offsetWidth-10;
				if (wd > 0){
					ths[i].style.width = wd+"px";
				}
				var div = $(ths[i]).find("div");
				if (div[0]){
					div[0].style.width = colSize[i]+"px";
				}
			}
		}
		var g = 0;
		
		pageSize = page_size;
//		if(typeof page_size=="undefined"){
			$(table).tablesorter({
				sortMultiSortKey:"ctrlKey",
				debug: false
			});
/*		}else{
			var pager = newTag("div");
			pager.id = "pager"+pagerIndex;
			pager.className = "pager";
			pager.innerHTML = "<form>"+
									"<img class='first' src='images/tablePager/first.png'/>"+
									"<img class='prev' src='images/tablePager/prev.png'/>"+
									"<input class='pagedisplay' type='text'/>"+
									"<img class='next' src='images/tablePager/next.png'/>"+
									"<img class='last' src='images/tablePager/last.png'/>"+
									"<select class='pagesize'>"+
										"<option value='10' selected='selected'>10</option>"+
										"<option value='20'>20</option>"+
									"</select>"+
								"</form>";
			if($(".pager", container).length==0){
				container.appendChild(pager);
			}
			$.tablesorterPager.defaults.size = page_size;
			$(table).
				tablesorter({
					sortMultiSortKey:"ctrlKey",
					debug: false
				}).
				tablesorterPager({
					container: $("#pager"+pagerIndex)[0]
				});
			pagerIndex++;
		}*/
		
		$(table).bind(
			"sortStart", function(){
				//$(link).hide();
			}
		).bind(
			"sortEnd", function(){
				//$(link).show();
			}
		)
		
/*		var resizer = new Resizer("tableDiv",{handles: "s" , minHeight: 90},
								tableResizeHandler);
		resizer.addResizer();*/
		
/*		for(var i = 0; i < headers.length; i++){
			if(headers[i].hidden==true){
				var resizer= new Resizer("sort_"+i,{handles: "w" , minHeight: 90},
									tableResizeHandler);
				resizer.addResizer();
			}
		}*/
	}
	
	this.getTable = function(){
		
		return table;
	}
	
	var tableResizeHandler = function(){}
	
	this.editRow = function(){
		var id = this.getAttribute("idVal");
		this.editCallback(id);
		return id;
	}
	
	this.activateRow = function(){
		var id = this.getAttribute("idVal");
		this.activateCallback(id, this.checked);
		return id;
	}
	
	this.sendConfirm = function(){
		var id = this.getAttribute("idVal");
		this.sendConfirm(id);
		return id;
	}	
	
	this.deleteRow = function(){
		var id = this.getAttribute("idVal");
		this.deleteCallback(id);
	}
	
	this.deleteRows = function(deleteCallback){
		var obj = this.getSelectedRows();
		var ids = obj.ids;
		var rowNumbers = obj.rowNumbers;
		var delCount = 0;
		for(var i = 0; i < rowNumbers.length; i++){
			deleteData(rowNumbers[i]-delCount);
			delCount++;
		}
		fillTable();
		this.drawTable(pageSize);
		
		deleteCallback(ids);
	}
	
	this.updateData = function(newData){
		data = newData;
		fillTable();
		this.drawTable(pageSize);
	}
	
	var deleteData = function(index){
		data.splice(parseInt(index), 1);
	}
	
	this.getSelectedRows = function(){
		var checkBoxes = $(table).find("input");
		var ids = [];
		var rowNumbers = [];
		var retObj = {"ids":ids, "rowNumbers":rowNumbers};
		
		for(var i = 0; i < checkBoxes.length; i++){
			if(checkBoxes[i].checked && checkBoxes[i].getAttribute("idVal")){
				retObj.ids.push(checkBoxes[i].getAttribute("idVal"));
				retObj.rowNumbers.push(checkBoxes[i].getAttribute("rowNumber"));
			}
		}
		
		return retObj;
	}
	

}

var ContactTable = function(cont,headerConfig,tableData,selectable,isContact, deleteCallback, editCallback, activateCallback, sendConfirm){
	var headers = headerConfig;
	var data = clone(tableData, true);
	
	var editData = function(){
		for(var i = 0; i < headers.length; i++){
			if(headers[i].headerName=="Confirmed"){
				for(var j = 0; j < data.length; j++){
					if(data[j][i+1]==1){
						data[j][i+1] = "yes";
					}else if(data[j][i+1]==0){
						data[j][i+1] = "<span class=resend name='confirm' idVal='"+data[j][0]+"'>Resend</span>";
					}
				}
			}else if(headers[i].headerName==""){
				for(var j = 0; j < data.length; j++){
					data[j][i+1] = "<input title='activate/inactivate' type='checkbox' name='activeImg' "+(data[j][i+1]==1 ? "checked=true" : "")+" idVal='"+data[j][0]+"'>"+
									"<img title=edit style='padding-left:5px;' idVal='"+data[j][0]+"' name='editImg' src='images/table/edit.gif'>&nbsp&nbsp"+
									"<img title=delete width=13px idVal='"+data[j][0]+"' name='deleteImg' src='images/table/delete.gif'>";
				}
			}
		}
	}
	
	var putEvents = function(){
		var table = contact.getTable();
		var imgs = $(table).find("img");
		for(var i = 0; i < imgs.length; i++){
			if(imgs[i].name=="editImg"){
				imgs[i].onclick = contact.editRow;
				imgs[i].editCallback = editCallback;
			}else if(imgs[i].name=="deleteImg"){
				imgs[i].deleteCallback = deleteCallback;
				imgs[i].rowNumberCallback = editData;
				imgs[i].putEventsCallback = putEvents;
				imgs[i].onclick = contact.deleteRow;
			}
		}
		
		var spans = $(table).find("span");
		for(var i = 0; i < spans.length; i++){
			if(spans[i].getAttribute("name") == "confirm"){
				spans[i].sendConfirm = sendConfirm;
				spans[i].onclick = contact.sendConfirm;
			}
		}
		
		var inputs = $(table).find("input");
		for(var i = 0; i < inputs.length; i++){
			if(inputs[i].type == "checkbox" && inputs[i].name=="activeImg"){
				inputs[i].activateCallback = activateCallback;
				inputs[i].onclick = contact.activateRow;
				inputs[i].className = contact;
			}
		}
	}

	editData();
	
	var contact = new JQueryTable(cont,headerConfig,data,selectable,isContact);
	contact.drawTable();
	
	var table = contact.getTable();
	putEvents();	
}