var table = null;
var plot;
var plotData;
var showLines = false;
var iDisplayStart = 0;
var sSearch = "";
var aaSorting = null;
var highlighted_colunms = new Array();
var highlight_position = -1;

$.fn.dataTableExt.oApi.fnGetTableData = function ( oSettings )
{
	//var maxI = oSettings.aoData.length > 5 ? 5 : oSettings.aoData.length;
	var data = new Array();
	var sort_column = oSettings.aaSorting[0][0];
	for ( var i=0 ; i < highlighted_colunms.length; i++ ) {
		data[i] = new Array();
		var row = oSettings.aoData[highlighted_colunms[i]];
		data[i][0] = row._aData[1];
		if(2 == sort_column) {
			// return download data
			data[i][1] = trimString(row._aData[2]);
		} else if(3 == sort_column) {
			// return upload data
			data[i][1] = trimString(row._aData[3]);
		} else if(5 == sort_column) {
			// return number of tests
			data[i][1] = trimString(row._aData[5]);
		} else {
			// return number of tests by default
			data[i][1] = trimString(row._aData[5]);
		}
	}
	highlighted_colunms = new Array();
	return {data: data, sort: sort_column};
}

$.fn.dataTableExt.oApi.fnReloadAjax = function ( oSettings, sNewSource, fnCallback )
{
	if ( typeof sNewSource != 'undefined' )
	{
		oSettings.sAjaxSource = sNewSource;
	}
	this.fnClearTable( this );
	this.oApi._fnProcessingDisplay( oSettings, true );
	var that = this;
	
	$.getJSON( oSettings.sAjaxSource, null, function(json) {
		/* Got the data - add it to the table */
		for ( var i=0 ; i < json.aaData.length ; i++ )
		{
			that.oApi._fnAddData( oSettings, json.aaData[i] );
		}
		
		oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
		that.fnDraw( that );
		that.oApi._fnProcessingDisplay( oSettings, false );
		
		/* Callback user function - for event handlers etc */
		if ( typeof fnCallback == 'function' )
		{
			fnCallback( oSettings );
		}
	} );
}

function renderGrid(dataSource, rows, sorting, filter, callback, row_callback, settings_column, aoColumns) {
	if(aaSorting == null) {
		aaSorting = sorting;
	}
	var gridOptions = {
		"bProcessing": true,
		"bAutoWidth": false,
		"bLengthChange": false,
		"bPaginate": true,
		"bServerSide": true,
		"iDisplayStart": iDisplayStart,
		"oSearch": {"sSearch": sSearch},
		"sAjaxSource": dataSource,
		"iDisplayLength": rows,
		"aaSorting": aaSorting,
		"sPaginationType": 'full_numbers',
		"oLanguage": {
			"oPaginate": {
				"sFirst": "Første",
				"sLast": "Siste",
				"sNext": "Neste",
				"sPrevious": "Forrige"
			},
			"sLengthMenu": "Vis _MENU_ registreringer ",
			"sInfoEmpty": "Ingen data å vise",
			"sProcessing": "Behandler data",
			"sSearch": "Søk:",
			"sZeroRecords": "Det finnes ingen statistikk for denne kombinasjonen",
			"sInfoFiltered": " - filtrerer fra _MAX_ registreringer",
			"sInfo": "Tabellen viser _START_ til _END_ av _TOTAL_ registreringer"
		},
		"fnHeaderCallback":  function ( nRow, aaData, iStart, iEnd, iDisplay ) {
			/*If chart exists on page invalidate it's content after table state change.*/
			table.fnDeepLink();
			var chart = $("#chart");
			if(0 != chart.size() && 'null' != callback) {
				var tableData = table.fnGetTableData();
				renderChart(tableData.data, true, tableData.sort);
			}
			//hide settings column on table load//
			if(settings_column != 'false') {
				if('statistic' == settings_column) {
					var column_no = 6;
				}
				table.fnSetColumnVis(column_no, false );
			}
		},
		"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
			if(row_callback == 'isps') {
				if ( aData[1] == 'Yes' ) {
					$(nRow).addClass('inactive');
				}
			}
			if(row_callback == 'countries') {
				if ( aData[3] == 'Yes' ) {
					$(nRow).addClass('inactive');
				}
			}
			if(row_callback == 'servers') {
				if ( aData[2] == 'Inactive' ) {
					$(nRow).addClass('inactive');
				}
			}
			if(row_callback == 'users') {
				if ( aData[3] == 'Inactive' ) {
					$(nRow).addClass('inactive');
				}
			}
			if(row_callback == 'connections') {
				if ( aData[4] == 'Yes' ) {
					$(nRow).addClass('inactive');
				}
			}
			if(settings_column != 'false') {
				if('statistic' == settings_column) {
					var column_no = 6;
				}
				var arr = aData[column_no].split('~DEL~');
				$(nRow).children(":nth-child(2)").attr('title', arr[0]);
				if('highlight=true' == arr[1]) {
					$(nRow).addClass('top5');
					highlighted_colunms.push(iDisplayIndex);
				}
				if('highlight-chart=true' == arr[2]) {
					$(nRow).addClass('highlight');
					highlight_position = $.inArray(iDisplayIndex, highlighted_colunms);
				}
			}
			return nRow;
		},
		"fnServerData": function ( sSource, aoData, fnCallback ) {
			var county = $('#county').val();
			var month = $('#month').val();
			var isp = $('#isp').val();
			if(null != county) {
				aoData.push( { "name": "iCounty", "value": county} );
			}
			if(null != month) {
				aoData.push( { "name": "iMonth", "value": month} );
			}
			if(null != isp) {
				aoData.push( { "name": "iIsp", "value": isp} );
			}
			$.getJSON( sSource, aoData, function (json) { 
				fnCallback(json)
			} );
		}
	}
	if(aoColumns != null) {
		gridOptions["aoColumns"] = aoColumns;
	}
	if(null != filter) {
		gridOptions["bFilter"] = filter;
	}
	table = $('#dataGrid').dataTable(gridOptions);
}

function renderClientGrid(id, rows, paginate, callback, bInfo) {
	if(paginate == null) {
		paginate = false;
	}
	if(bInfo == null) {
		bInfo = true;
	}
	table = $('#'+id).dataTable( {
		"bPaginate": paginate,
		"bInfo": bInfo,
		"sPaginationType": 'full_numbers',
		"iDisplayLength": rows,
		"bLengthChange": false,
		"bFilter": false,
		"bSort": false,
		"oLanguage": {
			"oPaginate": {
				"sFirst": "Første",
				"sLast": "Siste",
				"sNext": "Neste",
				"sPrevious": "Forrige"
			},
			"sLengthMenu": "Vis _MENU_ registreringer ",
			"sInfoEmpty": "Ingen data å vise",
			"sProcessing": "Behandler data",
			"sSearch": "Søk:",
			"sZeroRecords": "Ingen resultater å vise",
			"sInfoFiltered": " - filtrerer fra _MAX_ registreringer",
			"sInfo": "Tabellen viser _START_ til _END_ av _TOTAL_ registreringer"
		},
		"fnHeaderCallback":  function ( nRow, aaData, iStart, iEnd, aiDisplay ) {
			/** If chart exists on page invalidate it's content after table state change.
			 */
			var chart = $("#chart");
			if(0 != chart.size() && 'null' != callback) {
				var chartData = new Array();
				for ( var j=iStart ; j < iEnd ; j++ )
				{
					chartData[j-iStart] = new Array();
					chartData[j-iStart][0] = aaData[j][0];
					chartData[j-iStart][1] = trimString(aaData[j][2]);
					chartData[j-iStart][2] = trimString(aaData[j][3]);
					chartData[j-iStart][3] = trimString(aaData[j][4]);
				}
				//If there is only one result show bars chart by default
				var elNo = chartData.length;
				if(elNo == 1) {
					showLines = false;
				} else {
					chartType($.address.parameter('chart-type'));
				}
				renderChart(chartData);
			}
		}
	} );
}

function trimString(string) {
	var split = string.split(' ', 2);
	return parseFloat(split[0]); 
}

function renderChart(data, highlight_grid, sort) {
	var chartData = new Array();
	var suppliers = new Array();
	var xTicks = new Array();
	var yTicks = new Array();
	var elNo = data.length;
	var maxX = elNo*5 - 0.5;
	plotData = data;
	for(var i=0; i < elNo; i++) {
		x1 = i*5+1;
		chartData[i] = [x1, data[i][1]];
		xTicks[i] = [x1+1.5, data[i][0]];
		if($.inArray(data[i][0], yTicks) == -1) {
			yTicks.push(data[i][1]);
		}
	}
	$('#chart-label').text('');
	if(2 == sort) {
		$('#download_sort').css('color', '#f00');
		yaxis = { min: 0, tickFormatter: function (v, axis) {return Math.round(v*100)/100 + " Mbit/s"} }
	}
	if(3 == sort) {
		$('#upload_sort').css('color', '#f00');
		yaxis = { min: 0, tickFormatter: function (v, axis) {return Math.round(v*100)/100 + " Mbit/s"} }
	}
	if(5 == sort) {
		$('#chart-label').text('Number')
		$('#tests_sort').css('color', '#f00');
		yaxis = { min: 0, tickFormatter: function (v, axis) {
			var val = v;
			if(parseInt(val) < 1) {
				val = 0;
			}
			var val = Math.round(val+0.4);
			if(val == 0) {
				return "";
			}
			return val;
		} }
	}
	if(0 == elNo) {
		$("#chart").hide();
		$(".chart-info").hide();
		return;
	} else {
		$("#chart").show();
		$(".chart-info").show();
	}
	var options = {
		grid: {
			borderWidth: 1
		},
    	xaxis: {
    		mode: null,
    		min: 0,
    		max: maxX,
    		ticks: xTicks
    		
		},
		yaxis: yaxis
	}
	if(highlight_grid) {
		highlight_from = highlight_position * 5;
		highlight_to = highlight_position * 5 + 4.5;
		options['grid'] = { borderWidth: 1, markings: [ { xaxis: { from: highlight_from, to: highlight_to },  color: "#eaefff" } ] }
    }
    var plot = $.plot($("#chart"), [
    	{
    		color: '#003366',
            data: chartData,
            bars: { show: !showLines, barWidth: 3, lineWidth: 0,  fillColor: { colors: [ '#2E3191', '#3366E1' ] }},
    		lines: { show: showLines, barWidth: 0.5 }
        }
        ],
        options
    );
    highlight_position = -1;
}

function switchChartType() {
	showLines = !showLines;
	renderChart(plotData);
	if(showLines) {
		changeUrlParameter('chart-type','lines');
	} else {
		changeUrlParameter('chart-type','bars');
	}
}

function chartType(type) {
	if(type == 'lines') {
		changeUrlParameter('chart-type','lines');
		showLines = true;
	} else if(type == 'bars') {
		changeUrlParameter('chart-type','bars');
		showLines = false;
	}
}

function refreshCombos(element) {
	var data = $('#fancyComboHolder > :input').serializeArray();
	$.post('aggregation_items/combo_interdependency/'+element,
		data,
		function(data){
			markComboValues(data);
		}, 'json'
	);
}

function markComboValues(validData) {
	$('#fancyComboHolder > :input').each(function(i, object) {
		var elementID = $(object).attr('id');
		iterateCombo(elementID, validData[elementID]);
	});
}

function iterateCombo(comboID, data) {
	$('#' + comboID).prev().children().find('div.item').addClass("jquery-selectbox-item-error");
	$.each(data, function(index, value){
		$('.' + comboID + '-option-id-' + value).parent().parent().removeClass("jquery-selectbox-item-error");
	});
}

function markUsersIspCounty(isp, county) {
	if(isp) {
		$('#isp').prev().prev().children().each(function(e) {
			if($(this).text() == isp) {
				$(this).addClass('jquery-selectbox-item-highlight');
			}
		});
	}
	if(county) {
		$('#county').prev().prev().children().each(function(e) {
			if($(this).text() == county) {
				$(this).addClass('jquery-selectbox-item-highlight');
			}
		});
	}
}

function high_contrast() {
	$('head').append('<link rel="stylesheet" type="text/css" href="/css/high-contrast.css" />');
}

function text_resizer() {
	jQuery("#tool-txt a").click( function() { $("#nav-main span").css('height","'); });		
	jQuery( "#tool-txt a" ).textresizer({
		target: "body",
		type: "fontSize",
		sizes: [ "62.5%", "80%" ],
		selectedIndex: 1
	});
	equalHeight($("#nav-main span"));
	jQuery("#tool-txt a").click( function() {
			equalHeight($("#nav-main span"));
	});
}

function jsdebug(object) {
	if($('#jsdebug').length > 0) {
		$('#jsdebug').append(prettyPrint(object));
	}
}

(function($) {
	
    $.fn.NPTtooltip = function(options) {
		var qtipPosition = {
				corner: {target: 'topLeft', tooltip: 'bottomMiddle'},
				adjust: { x: 5 }
		}
    	if(undefined != options.position) {
    		qtipPosition = options.position;
    	}
    	var tipCorner = 'bottomMiddle';
    	if(undefined != options.corner) {
    		tipCorner = options.corner;
    	}
		$.fn.qtip.styles.npt = {
			border: {
				width: 15,
				color: '#eee'
		 	},
		 	padding: 10,
		 	background: '#eee',
		 	textAlign: 'left',
		 	color: '#444',
			tip: {
				corner: tipCorner,
     			color: '#eee'
			},
			width: {
				min: 520,
				max: 520
			},
			title: { 'padding': 0, 'margin-bottom': 10 },
			button: {
				'height': 30,
				'width': 30,
				'background': 'url("/img/fancybox/fancy_closebox.png")',
				'cursor': 'pointer',
				'position': 'absolute',
				'margin-left': 490,
				'margin-top': -28
			}
		}
		return this.each(
        	function() {
            $(this).qtip({
			   content: {
			   	text: options.text,
			   	title: {
			   		text: "",
			   		button: ''
			   	}
			   },
			   position: qtipPosition,
			   show: 'click',
			   hide: false,
			   style: 'npt'
			});
        });
    };

})(jQuery);
