window.apiUrl = "../api";
window.apiProxyUrl = "api_proxy.jsp";

window.Util = {
		jsGoBack: function(){
			if($ && $.mobile && $.mobile.activePage){
				var currPageId = $.mobile.activePage.attr("id");
				if(currPageId == "index" || currPageId == "login") {
					if(window.JSInterface) {
						window.JSInterface.showQuitDialog();
					}
				}else{
					history.go(-1);
				}
			}
		},
		
		jsOrientationChange: window.onOrientationChange,
		
	getParameter: function(name) {
		var val = null;
		
		var currUrl = $.mobile.activePage.attr("data-url");
		var currPageId = $.mobile.activePage.attr("id");
		
		if(!currUrl || currUrl == currPageId) {
			currUrl = location.href;
		}
		
		var currLocSearch = $.mobile.path.parseUrl(currUrl).search;
		
		if(currLocSearch) {
			var path = currLocSearch;
			if(path.indexOf("?") != -1) {
				path = path.substring(path.indexOf("?")+1);
			}
			
			if(path.indexOf("#") != -1) {
				path = path.substring(0, path.indexOf("#"));
			}
			
			var params = path.split("&");
			var param;
			for(var i=0; i<params.length; i++) {
				param = params[i].split("=");
				
				if(param[0] == name) {
					val = param[1];
					break;
				}
			}
		}
		
		return val;
	}, 
	showError: function(msg, time, callback) {
		var $window = $(window);
		var cont = $.mobile.activePage;
		
		if(!callback) {
			callback = function(){};
		}
		
		if(!time) {
			time = 2000;	
		}
		
		$.mobile.hidePageLoadingMsg();

		//show error message
		$( "<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+ msg +"</h1></div>" )
			.css({ "display": "block", zIndex: 1000, "opacity": 0.96, "top": $window.scrollTop() + 100 })
			.appendTo( cont )
			.delay( time )
			.fadeOut( 400, function() {
				$( this ).remove();
				callback();
			});	
	}, 
	
	getViewportSize: function() {
		var viewportwidth;
		var viewportheight;
		// the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
		if (typeof window.innerWidth != 'undefined')
		{
			viewportwidth = window.innerWidth,
		    viewportheight = window.innerHeight
		}
		// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
		else if (typeof document.documentElement != 'undefined'
				&& typeof document.documentElement.clientWidth !=
		     'undefined' && document.documentElement.clientWidth != 0)
		{
			viewportwidth = document.documentElement.clientWidth,
			viewportheight = document.documentElement.clientHeight
		}
		// older versions of IE
		else
		{
			viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
		    viewportheight = document.getElementsByTagName('body')[0].clientHeight
		}
		return {w: viewportwidth, h: viewportheight};
	}, 
	
	getUTCDateFromString: function(dateStr,type){
		var date;
		switch(type){
		case 'long':
				var datesArr = dateStr.split("-");
				var currDate, day, month, year, hour, minute, second,hoursArr;			
				if(datesArr.length == 1) {
					currDate = new Date();
				    day = currDate.getDate();
					month = currDate.getMonth()+1;
					year = currDate.getFullYear();
					hoursArr = datesArr[0].split(":");
					hour = hoursArr[0];
					minute = hoursArr[1];
					second = hoursArr[2];
				    if(!second) second='00'	;				
				} else {
				    day = datesArr[2].substring(0, 2);
					month = datesArr[1];
					year = datesArr[0];
					hoursArr = datesArr[2].substring(3).split(":");
					hour = hoursArr[0];
					minute = hoursArr[1];
					second = hoursArr[2];
				    if(!second) second='00'	;
				}
				    date = Date.UTC(year, month-1, day, hour, minute, second);
			break;
		case 'short':
			 var day = '01';
			var month = '01';
			var year = '1980';
			var hoursArr = dateStr.split(":");
			var hour = hoursArr[0];
			var minute = hoursArr[1];
			var second = hoursArr[2];
		    if(!second) second='00'	;
			    date = Date.UTC(year, month-1, day, hour, minute, second);
			break;
	}
		
		return date;
	}, 
	
	roundNumber: function(num, dec) {
		var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
		return result;
	}, 
	
	createSparkline: function(data, type, settings){
		var noChartImg = "images/no_chart.png";
		if(!data || data.length == 0) {
			return noChartImg;
		}
		
		if(!settings) {
			settings = {
				width: 65,
				height: 33,
				chartColor: "2f576e",
				points: 48
			};
		}
		
		var curVal, avgVal;
		var maxValue = 0;
		var curData = [];
		var increment = Math.ceil(data.length/settings.points);		

		for(var i=0; i<data.length;i+=increment) {
		    var sum = 0;
		    for(var j=0; j<increment && i+j<data.length; j++) {
		       sum += parseInt(data[i+j][1]); 
		    }
		    
		    avgVal = Math.round(sum/j);
		    if( avgVal > maxValue ) maxValue = avgVal;
		    curData.push(avgVal);
		}				
		
		if(type == "cpu" || type == "processes")  {
			maxValue = 100;
		} else if(type == "drives") {
			var totalDrive=parseFloat(data[data.length-1][1]+data[data.length-1][2]);
			maxValue = totalDrive;		
		} else if(type == "memory") {
			for (var i = 0; i < data.length; i++) {
				var curValue = parseInt( data[i][2] );
				if( curValue > maxValue ) maxValue = curValue;
			}		
		} else if(type.toLowerCase().indexOf("http") != -1 || 
					type.toLowerCase().indexOf("ping") != -1 ||
					type.toLowerCase().indexOf("external") != -1) {
			if( maxValue%100 != 0 ) { 
				maxValue = maxValue - maxValue%100 + 100;
			}
			
			maxValue = maxValue > 500 ? maxValue : 500;
		}		
		
		var xAxisData = '-1';		
		var chartData = curData.join(",");				
		
		chartData = xAxisData+'|'+chartData;
		
		var googleImgChartsUrl = "http://chart.apis.google.com/chart";
		var sparklineUrl = 
				googleImgChartsUrl+"?t="+(new Date()).getTime()+
				"&cht=ls&chs="+settings.width + "x" + settings.height+
				"&chds=0," + maxValue+
				"&chco="+settings.chartColor+"&chd=t:"+chartData;
		return sparklineUrl;		
	},

	log: function(msg, id) {			
		if(id) {
			$("#"+id).append(msg+"</br>");
		} else {
			var logEl = $("#logarea");
		
			if($("#logarea").length==0) {
				logEl = $("<div id='logarea'></div>").css({position:"absolute", top:0, left:0, backgroundColor: "yellow", color: "green", zIndex: 100}).appendTo($(document.body));
			}
			logEl.append(msg+"</br>");
		}
	},
	
	isEmailValid: function(email) {
		var emailPattern = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		
		return emailPattern.test(email);
	}
}

window.Platform= {
		LINUX:"LINUX",
		LINUX_32:"32",
		LINUX_32_:"linux32",
		LINUX_64:"64",
		LINUX_64_:"linux64",
		WINDOWS_32:"win32",
		WINDOWS_64:"win64",
		SUN_32:"Sun8632",
		SUN_64:"Sun8664",
		SPARC_32:"SunSparc32",
		SPARC_64:"SunSparc64",
		FREE_BSD_X86:"FBSD32",
		FREE_BSD_X64:"FBSD64",
		FEDORA_10_32:"FDR32",
		FEDORA_10_64:"FDR64",
		UBUNTU_810_32:"UBUNTU81032",
		UBUNTU_810_64:"UBUNTU81064",
		DEBIAN_LENNY_32:"LENNY32",
		DEBIAN_LENNY_64:"LENNY64",
		
		isLinux32:function(platform){
			return Platform.LINUX_32==(platform) || Platform.LINUX_32_==(platform);
		},
		isLinux64:function(platform){
			return Platform.LINUX_64==(platform) || Platform.LINUX_64_==(platform);
		},
		isWindows32:function(platform){
			return Platform.WINDOWS_32==(platform);
		},
		isWindows64:function(platform){
			return Platform.WINDOWS_64==(platform);
		},
		isSun32:function(platform){
			return Platform.SUN_32==(platform);
		},
		isSun64:function(platform){
			return Platform.SUN_64==(platform);
		},
		isSparc32:function(platform){
			return Platform.SPARC_32==(platform);
		},
		isSparc64:function(platform){
			return Platform.SPARC_64==(platform);
		},
		isWindows:function(platform){
			return Platform.isWindows32(platform) || Platform.isWindows64(platform);
		},
		isLinux:function(platform){
			return Platform.isLinux32(platform) || Platform.isLinux64(platform) || platform == Platform.LINUX; 
		},
		isSolaris:function(platform){
			return Platform.isSparc32(platform) || Platform.isSparc64(platform) || Platform.isSun32(platform) || Platform.isSun64(platform);
		},
		
		isFreeBSD64:function(platform){
			return Platform.FREE_BSD_X64==platform;
		},
		
		isFreeBSD32:function(platform){
			return Platform.FREE_BSD_X86==platform;
		},
		
		isFreeBSD:function(platform){
			return Platform.isFreeBSD32(platform) || Platform.isFreeBSD64(platform);
		},
		isFedora1064:function(platform){
			return Platform.FEDORA_10_64==platform;
		},
		
		isFedora1032:function(platform){
			return Platform.FEDORA_10_32==platform;
		},
		
		isFedora10:function(platform){
			return Platform.isFedora1032(platform) || Platform.isFedora1064(platform);
		},
		isUbuntu81064:function(platform){
			return Platform.UBUNTU_810_64==platform;
		},
		
		isUbuntu81032:function(platform){
			return Platform.UBUNTU_810_32==platform;
		},
		
		isUbuntu810:function(platform){
			return Platform.isUbuntu81032(platform) || Platform.isUbuntu81064(platform);
		},
		isLenny64:function(platform){
			return Platform.DEBIAN_LENNY_64==platform;
		},
		
		isLenny32:function(platform){
			return Platform.DEBIAN_LENNY_32==platform;
		},
		
		isLenny:function(platform){
			return Platform.isLenny32(platform) || Platform.isLenny64(platform);
		},
		
		
		
		getName: function(platform){
			if (Platform.isWindows(platform)){
				return "Windows";
			}
			else if (Platform.isLinux(platform)){
				return "Linux";
			}
			else if(Platform.isSolaris(platform)){
				return "OpenSolaris";
			}
			else if(Platform.isFreeBSD(platform)){
				return "FreeBSD";
			}
			else if(Platform.isFedora10(platform)){
				return "Fedora";
			}
			else if(Platform.isUbuntu810(platform)){
				return "Ubuntu";
			}
			else if(Platform.isLenny(platform)){
				return "Debian Lenny";
			}
		}
	}

jQuery.support.cors = true;

$(document).ajaxSend(function(evt, request, settings){				
		if(window.JSInterface) {
			if(!window.JSInterface.isNetworkAvailable()) {					
				Util.showError("Network connection is not available", 6000);
				request.abort();
			};			
		}
});

window.SearchManager = (function() {
	var searchData = [];	
	
	var intTypes = [["memories", "memory", "Memory"], ["loads", "loadAvg", "Load Average"], 
	                ["drives", "drives", "Drive"], ["cpus", "cpu", "CPU"], 
	                ["httpTests", "httpTests", "Internal HTTP"], ["processes", "processes", "Process"], 
	                ["pingTests", "pingTests", "Internal Ping"] 
	                /* [<key from array>,<type for param>,<desc>*/];	
	
	return {
		EXTERNAL_TYPE: "external",
		TM_TYPE: "transaction",
		FPL_TYPE: "fullpageload",
		
		MEM_TYPE: "memory",
		LOAD_TYPE: "loadAvg",
		DRIVE_TYPE: "drives",
		CPU_TYPE: "cpu",
		PROC_TYPE: "processes",
		INT_HTTP_TYPE: "httpTests",
		INT_PING_TYPE: "pingTests",
		
		getData: function(){
			return searchData;
		}, 
		
		indexOf: function(id, type) {
			var index = -1;
			
			var curr;
			for(var i=0; i<searchData.length; i++) {
				curr = searchData[i];
				if(curr.id == id && curr.type == type) {
					index = i;
					break;
				}
			}
			
			return index;
		},
		
		addRecord: function(record) {			
			if(SearchManager.indexOf(record.id, record.type) == -1) {
				searchData.push(record);
			}
		},
		
		removeRecord: function(id, type) {			
			var index = SearchManager.indexOf(id, type);

			if(index != -1) {
				searchData.splice(index, 1);
			}
		},		
		
		editRecord: function(id, type, newLabel) {			
			var index = SearchManager.indexOf(id, type);

			if(index != -1) {
				var record = searchData[index];
				record.label = newLabel;
			}
		},			
		
		requestData: function() {
			searchData = [];
			
			var testsURL   =  window.apiUrl+"?action=tests&apikey="+window.userId+"&output=json&recordApiCall=false";
			var tmTestsURL =  window.apiUrl+"?action=transactionTests&apikey="+window.userId+"&output=json&recordApiCall=false";
			var fplTestURL =  window.apiUrl+"?action=fullPageLoadTests&apikey="+window.userId+"&output=json&recordApiCall=false";
			var intTestsURL = window.apiUrl+"?action=internalMonitors&apikey="+window.userId+"&output=json&recordApiCall=false";			
			
			$.when(					
					$.ajax({url: testsURL, dataType: "json"}),
					$.ajax({url: tmTestsURL, dataType: "json"}),
					$.ajax({url: fplTestURL, dataType: "json"}),
					$.ajax({url: intTestsURL, dataType: "json"})			
			).then(function(respTests, respTMTests, respFPLTests, respIntTestsURL) {	
				var extTests = respTests[0].testList;
				var tmTests = respTMTests[0];
				var fplTests = respFPLTests[0];
				var intTests = respIntTestsURL[0];
				
				var curr;
				for(var i=0; i<extTests.length; i++) {
					curr = extTests[i];
					
					searchData.push({
		                id: curr.id,
		                type: SearchManager.EXTERNAL_TYPE,
		                label: curr.name,
		                desc: "External "+(curr.type ? curr.type.toUpperCase()+" " : "")+"Monitor",
		                href: '../ext_monitor_detailed.html?id='+curr.id,
		                isSuspended: curr.isSuspended
					});
				}
				
				for(var i=0; i<tmTests.length; i++) {
					curr = tmTests[i];
					searchData.push({
						id: curr.id,
						type: SearchManager.TM_TYPE,
		                label: curr.name,
		                desc: "Transaction Monitor",		                
		                href: '../trans_monitor_detailed.html?id='+curr.id
					});
				}
				
				for(var i=0; i<fplTests.length; i++) {
					curr = fplTests[i];
					searchData.push({
						id: curr.id,
						type: SearchManager.FPL_TYPE,
		                label: curr.name,
		                desc: "Full Page Load Monitor",		                
		                href: '../fpl_mon_detailed.html?id='+curr.id
					});
				}

				var intTypes = [["memories", SearchManager.MEM_TYPE, "Memory"], ["loads", SearchManager.LOAD_TYPE, "Load Average"], 
				                ["drives", SearchManager.DRIVE_TYPE, "Drive"], ["cpus", SearchManager.CPU_TYPE, "CPU"], 
				                ["httpTests", SearchManager.INT_HTTP_TYPE, "Internal HTTP"], ["processes", SearchManager.PROC_TYPE, "Process"], 
				                ["pingTests", SearchManager.INT_PING_TYPE, "Internal Ping"] 
				                /* [<key from array>,<type for param>,<desc>*/];		
				var type, desc;
				for(var t=0; t<intTypes.length; t++) {
					type = intTypes[t][1], desc = intTypes[t][2];
					var intList = intTests[intTypes[t][0]];
					
					if(intList) {
						for(var i=0; i<intList.length; i++) {										
							curr = intList[i];
							searchData.push({
								type: type,
								id: curr.id,
				                label: curr.name,
				                desc: desc,				                
				                href: '../int_monitor_detailed.html?id='+curr.id+"&type="+type
							});					
						}
					}
				}
				
			}).fail(function(jqXHR, textStatus, errorThrown) {
			});				
		}
	};  
})();

if(location.href.indexOf("login.html") == -1) {
	if(Login.getCookie("userId")) {
		window.userId = Login.getCookie("userId"); 
	} else {
		location.href = "login.html";
	}

	SearchManager.requestData();
	
	setInterval(SearchManager.requestData, 1000*60*30);
}
