function showContactForm()
{
	var formElement = document.getElementById('new_contact');
	formElement.style.display = 'block';
	var formButton = document.getElementById('contactButton');
	formButton.value = 'hide form';
	formButton.onclick = hideContactForm;
}

function hideContactForm()
{
	var formElement = document.getElementById('new_contact');
	formElement.style.display = 'none';
	var formButton = document.getElementById('contactButton');
	formButton.value = 'Add Contact';
	formButton.onclick = showContactForm;
}

function showDetailsForm()
{
	var formElement = document.getElementById('edit_details');
	formElement.style.display = 'block';
	var formButton = document.getElementById('detailsButton');
	formButton.value = 'hide form';
	formButton.onclick = hideDetailsForm;
}

function hideDetailsForm()
{
	var formElement = document.getElementById('edit_details');
	formElement.style.display = 'none';
	var formButton = document.getElementById('detailsButton');
	formButton.value = 'edit details';
	formButton.onclick = showDetailsForm;
}

function selectAll()
{
	for(i=0; i<document.getElementById("shareform").elements.length; i++)
	{
		if(document.getElementById("shareform").elements[i].name == "contact[]")
		{
			document.getElementById("shareform").elements[i].checked = document.getElementById("shareform").shareall.checked;
		}
	}
}

function hide(elementId)
{
	elementToHide = document.getElementById(elementId);
	elementToHide.style.display = 'none';
}

function reloadLogGraph(route_id, lang_code)
{
	showGraphElement = document.getElementById('showtrend');
	if(showGraphElement.checked){
		var param = 'on';
	}else{
		var param = 'off';
	}
	graphElement = document.getElementById('logGraph');
	graphElement.src = '/'+lang_code+'/images/log_graph'+route_id+param+'.gif';
}

function updateSearchable(route_id)
{
	var searchableElement = document.getElementById('searchable'+route_id);
	if(searchableElement.checked == true){
		var isSearchable = '1';
	}else{
		var isSearchable = '0';
	}
	var request = GXmlHttp.create();
	request.open('GET', '/en/account/ajax_searchable/'+route_id+'/'+isSearchable, true);
	request.setRequestHeader("Connection", "close");
//	request.onreadystatechange = function() 
//	{
//		if (request.readyState == 4 && request.status == 200) 
//		{
//alert(request.responseText);
//		}	
//	} //function	
	request.send(null);
}

function importGPS()
{
	// need to centre the pop-up properly
	window.open('/en/account/import_gps', 'GPS_import', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,width=600,height=350,left=340,top=212');	
}

function exportGPS(route_id)
{
	// need to centre the pop-up properly
	window.open('/en/main/export_gps/'+route_id, 'GPS_Export', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,width=600,height=350,left=340,top=212');	
}

function showSportSelect(){
	document.getElementById('sportSelectRadio').checked = true;
	document.getElementById('sport_popup').style.display = 'block';
}
function hideSportSelect(){
	document.getElementById('sportSelectRadio').checked = true;
	document.getElementById('sport_popup').style.display = 'none';
}
function sportSelect()
{
//alert("sportSelect");
	if(document.getElementById('sportSelectRadio').checked){
		document.getElementById('sport_popup').style.display = 'block';
	}else{
		document.getElementById('sport_popup').style.display = 'none';
	}
}

var tabledata = null;
var table = null;
var chartdata = null;
var chart = null;
var filteredData = new Array();
var columnColours = new Array();
var columnLookup = new Object();

function initialiseActivityData()
{
 	tabledata = new google.visualization.DataTable();
	tabledata.addColumn('string', tableColumnHeadings[0]);
	tabledata.addColumn('date', tableColumnHeadings[1]);
	tabledata.addColumn('string', tableColumnHeadings[2]);
	tabledata.addColumn('number', tableColumnHeadings[3]);
	tabledata.addColumn('timeofday', tableColumnHeadings[4]);
	tabledata.addColumn('number', tableColumnHeadings[5]);

	table = new google.visualization.Table(document.getElementById('table_div'));
  	google.visualization.events.addListener(table, 'select', selectHandler);	

	chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
	chartdata = new google.visualization.DataTable();

	updateActivitySelection();
}

function updateActivitySelection()
{
	var sport = $('#include_sport').val();
	var route = $('#include_route').val();
	filteredData.length = 0;
	for(var i=0; i<activities.length; i++){
		if(activities[i][1] == sport || sport == 'all'){
			if(activities[i][0] == route || route== 'all'){
				if(inRange(activities[i][2])){
					filteredData.push(activities[i]);
				}
			}	
		}
	}

	setTableData();
	table.draw(tabledata, {allowHtml:true, page:'enable', sort:'enable', sortAscending:false, sortColumn:0});	
  	
	setChartData();
	chart.draw(chartdata, {width:475, height:250, colors: columnColours});
	
	updateRecentActivities();
}

function selectHandler() 
{
	var selections = table.getSelection();
	var selectedRow = selections[0].row;
	if(confirm('Edit this activity?')){
		showActivityEditor(filteredData[selectedRow]);
	}
}

function showActivityEditor(activity)
{
	if(activity){
		if(activity[7] != 0){
			window.location = '#page_top';
			$('#activityEditor h3').html('Edit activity &nbsp;&nbsp; <input id="_log_new_activity_button" type="button" value="Log new Activity" style="font-size:12pt;" onclick="hideActivityEditor();" />');
			$('#delete_activity_button').show();
		}
		else{
			$('#delete_activity_button').hide();
		}
		$('#activityEditor').css('background-color', '#f8f8f8');
		$('#activityId').val(activity[7]);
		$('#new_sports').val(activity[1]);
		$.ajax({
			url: "/en/account/ajax_getRoutes/"+encodeURIComponent(activity[1]),
			dataType: "html",
			success: function(routeOptions){
//alert(routeOptions);
				$('#new_routes').html(routeOptions);
				if(activity[0] != '' ){
					var updateRoute = function(){ $('#new_routes').val(activity[0]); }
					setTimeout(updateRoute, 50);}
				}	
			});
		$('#new_date').datepicker('setDate',  activity[2]);
		var timeArray = secsToTimeArray(activity[5]);
		$("select[name='Time_Hour']").val(timeArray[0].toString().padL(2,'0'));
		$("select[name='Time_Minute']").val(timeArray[1].toString().padL(2,'0'));
		$("select[name='Time_Second']").val(timeArray[2].toString().padL(2,'0'));
		$('#new_effort').val(activity[6]);
		$('#comments').val(activity[8]);
		$('#new_activity_button').removeAttr('disabled');
	}
}

function hideActivityEditor()
{
	showActivityEditor(['','all', todayString, '', 0,0,5,0,'']);
	$('#activityEditor h3').text('Log new activity');
	$('#activityEditor').css('background-color', '#ffffff');
	$('#new_activity_button').attr('disabled','disabled');
}

function updateRecentActivities()
{
	var html = '';
	for(var i = activities.length -1; i > activities.length -10 && i >=0; i--){
		var sport_img = '/images/'+ activities[i][1].replace(/ /, '_')+'_35.png';
		var time = secsToTimeArray(activities[i][5]);
		var editorLink = '<a href="#" onclick="if(confirm(\'Edit this activity?\')){ showActivityEditor([\''+activities[i][0]+"','"+activities[i][1]+"','"+activities[i][2]+"','"+activities[i][3]+"',"+activities[i][4]+","+activities[i][5]+","+activities[i][6]+","+activities[i][7]+",'"+safeHTML(activities[i][8])+"'"+'])}; return false;">';
		if(unit == 'Miles'){
			var distance = activities[i][4] / 1609.344;
		}else{
			var distance = activities[i][4] / 1000.0;
		}
		html += '<div style="background-color:';
		if(i%2==0){
			html += '#fff">';
		}else{
			html += '#e8e8e8">';		
		}
		html += editorLink + '<img style="float:left;margin:5px 5px 0 0;vertical-align:middle;border:0 solid;" src="'+sport_img+'" width="35" height="35" alt="'+activities[i][1]+'" /></a>';
		html += '<div style="width:160px;margin-left:40px;line-height:110%;padding:4px 0;overflow:hidden;">'+ editorLink;
//*** date format ***//
		html += activities[i][2]+'<br />';

		html += safeHTML(activities[i][3])+'<br />';
		html += distance.toFixed(2) + unitText +' '+inText+' '+ time[0]+':'+time[1].toString().padL(2,'0') +':'+ time[2].toString().padL(2,'0');
		html += '</a></div><div class="clear"></div></div>';
	}
	$('#recent_activities').html(html);
}
function safeHTML(str) 
{
	return str.replace(/'/g, "\\'").replace(/&#039;/g, "\\'").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace("\n", "\\n");
}

function setTableData()
{
	if(tabledata.getNumberOfRows() > 0){
		tabledata.removeRows(0,tabledata.getNumberOfRows()); // remove all rows
	}
	for(var i=0; i<filteredData.length; i++){
		if(unit == 'Miles'){ 
			var distance = filteredData[i][4]/1609.344;
		}else{
			var distance = filteredData[i][4]/1000.0;
		}
		var date = getDateObject(filteredData[i][2], date_format.visualization);
		tabledata.addRow([{v:filteredData[i][1], f:'<img width="35" height="35" title="'+filteredData[i][1]+'" alt="'+filteredData[i][1]+'" src="/images/'+filteredData[i][1].replace(/ /, '_')+'_35.png"/>'} ,date, filteredData[i][3], {v:filteredData[i][4], f: distance.toFixed(2)+' '+ unit}, secsToTimeArray(filteredData[i][5]), filteredData[i][6] ]);
	}
	var formatter = new google.visualization.DateFormat({pattern: date_format.visualization});
	formatter.format(tabledata, 1);
}

function secsToTimeArray(seconds){
	var hours = Math.floor((seconds/3600));
	var minutes = Math.floor((seconds%3600)/60);
	var secs = seconds - (hours *3600) - (minutes*60);
	return [hours, minutes, secs, 0];
}

function setChartData()
{
	var sportColours = {'running':'#4dac27', 'walking':'#ff1b00', 'cycling':'#095ca6', 'mountain biking':'#650d4c', 'swimming':'#090c46', 'canoeing':'#239f97', 'downhill skiing':'#826a75', 'cross-country skiing':'#f23c9b', 'horse riding':'#5e2211' };
	
	// clear previous data
	if(chartdata.getNumberOfRows() > 0){
		chartdata.removeRows(0, chartdata.getNumberOfRows()); // clear data
	}	
	if(chartdata.getNumberOfColumns() > 0){
		chartdata.removeColumns(0, chartdata.getNumberOfColumns()); // clear columns
	}

	// find period starting point
	var firstDate =  getDateObject($('#date_range_start').val(), date_format.visualization);
	if(firstDate == null){
		firstDate = getDateObject(activities[0][2], date_format.visualization);
	}
	var lastDate =  getDateObject($('#date_range_end').val(), date_format.visualization);
	if(lastDate == null){
		lastDate = new Date();
	}
	
	// set columns
	var statistic = $('#group_fn').val();
	var attribute =  $('#group_attribute').val();
	var colType = 'number';
	if(attribute == 'time'){
		colType = 'timeofday';
	}

	chartdata.addColumn('date', 'Date');
	
	var columns = new Object();
	for(var i=0; i<filteredData.length; i++){
		columns[filteredData[i][1]] = 1;
	}
	columnColours.length = 0; // clear column colours
	for(var sport in columns){
		chartdata.addColumn(colType, sportsText[sport]);
		columnColours.push(sportColours[sport]);
		columnLookup[sport] = chartdata.getNumberOfColumns()-1;
	}
	if(chartdata.getNumberOfColumns() == 1){ // add dummy column if no real rows
			chartdata.addColumn(colType, '');			
	}
	

	if($('#dayRadio').attr('checked') == true){
		collateDay(firstDate, lastDate, statistic, attribute);
	}else if ($('#monthRadio').attr('checked') == true){
		collateMonth(firstDate, lastDate, statistic, attribute);
	}else{ // default to week
		collateWeek(firstDate, lastDate, statistic, attribute);
	}

}

function getDateString(date, format)
{
	var dateString = '';
	switch(format){
		case 'MM/dd/yyyy':
			dateString = (date.getUTCMonth()+1).toString().padL(2,"0") + '/' + date.getUTCDate().toString().padL(2,"0") + '/' + date.getUTCFullYear(); 
			break;
		case 'MM/yyyy':
			dateString = (date.getUTCMonth()+1).toString().padL(2,"0") + '/' + date.getUTCFullYear(); 
			break;
		default:
			dateString = date.getUTCDate().toString().padL(2,"0") + '/' + (date.getUTCMonth()+1).toString().padL(2,"0") + '/' + date.getUTCFullYear(); 
	}
	return dateString;
}

function getDateObject(dateString, format)
{
	var date = null;
	var dateParts = dateString.split('/');
	if(dateParts.length == 3){
		switch(format){
			case 'MM/dd/yyyy':
				date = new Date(dateParts[2], dateParts[0]-1, dateParts[1]);
				break;
			default:
				date = new Date(dateParts[2], dateParts[1]-1, dateParts[0]);
		}
	}
	return date;
}


function collateDay(startDate, endDate, statistic, attribute)
{
	var columnCount = chartdata.getNumberOfColumns();
	var date = new Date();
	var emptyRow = new Array(columnCount);
	var i = 0;
	for(i=1; i<columnCount; i++){
		emptyRow[i] = null;
	}

	var date = new Date(startDate.getTime()+12*3600*1000);
	var	rows = new Object();
	while(date.getTime() <= endDate.getTime() +  12*3600*1000){
		var dateString =  getDateString(date, date_format.visualization); 
		row = emptyRow.slice(0); // copy empty array
		row[0] = new Date(date.getTime());
		rows[dateString] = row;
		date.setTime(date.getTime() + 24*3600*1000);
	}
//	for(i=startDate.getTime()+12*3600*1000; i<= endDate.getTime()+12*3600*1000; i+= 24*60*60*1000){
//		date.setTime(i);
//		var dateString = getDateString(date, date_format.visualization);
//		row = emptyRow.slice(0);
//		row[0] = new Date(date.getTime());
//		rows[dateString] = row;
//	}
	
	for(i=0; i<filteredData.length; i++){
		if(!rows[filteredData[i][2]][columnLookup[filteredData[i][1]]]){
			rows[filteredData[i][2]][columnLookup[filteredData[i][1]]] = new Array();
		}
		rows[filteredData[i][2]][columnLookup[filteredData[i][1]]].push(filteredData[i]);
	}
	var j = 0;
	for(row in rows){
		for(i=1; i<rows[row].length; i++){
			if(rows[row][i] != null){
				switch(statistic){
					case 'total': rows[row][i] = total(rows[row][i], attribute); break;
					case 'average': rows[row][i] = average(rows[row][i], attribute); break;
					case 'maximum': rows[row][i] = maximum(rows[row][i], attribute); break;
					case 'minimum': rows[row][i] = minimum(rows[row][i], attribute); break;
					default: rows[row][i] = 0;
				}	
			}else{
				if(attribute == 'time'){
					rows[row][i] = [0,0,0,0];
				}else{
					rows[row][i] = 0;
				}	
			}
		}
		chartdata.addRow(rows[row]);
	}
	var formatter = new google.visualization.DateFormat({pattern: date_format.visualization});
	formatter.format(chartdata, 0);
}


function collateWeek(startDate, endDate, statistic, attribute)
{
	var columnCount = chartdata.getNumberOfColumns();
	var date = new Date();
	var emptyRow = new Array(columnCount);
	for(var i=1; i<columnCount; i++){
		emptyRow[i] = null;
	}

	var date = new Date( startDate.getTime() - startDate.getDay()* 24*3600*1000 +  12*3600*1000);
	var	rows = new Object();
	while(date.getTime() <= endDate.getTime() +  12*3600*1000){
		var dateString =  getDateString(date, date_format.visualization); 
		row = emptyRow.slice(0);
		row[0] = new Date(date.getTime());
		rows[dateString] = row;
		date.setTime(date.getTime() + 7*24*3600*1000);
	}

	for(var i=0; i<filteredData.length; i++){
		var date = getDateObject(filteredData[i][2], date_format.visualization);
		date.setTime(date.getTime() + 12*3600*1000); // move to midday to avoid daylight savings issues
		var weekdate = new Date( date.getTime() - date.getDay()* 24*3600*1000);
		var weekString = getDateString(weekdate, date_format.visualization); 
		if(!rows[weekString][columnLookup[filteredData[i][1]]]){
			rows[weekString][columnLookup[filteredData[i][1]]] = new Array();
		}
		rows[weekString][columnLookup[filteredData[i][1]]].push(filteredData[i]);
	}
	for(row in rows){
		for(var i=1; i<rows[row].length; i++){
			if(rows[row][i] != null){
				switch(statistic){
					case 'total': rows[row][i] = total(rows[row][i], attribute); break;
					case 'average': rows[row][i] = average(rows[row][i], attribute); break;
					case 'maximum': rows[row][i] = maximum(rows[row][i], attribute); break;
					case 'minimum': rows[row][i] = minimum(rows[row][i], attribute); break;
					default: rows[row][i] = 0;
				}	
			}else{
				if(attribute == 'time'){
					rows[row][i] = [0,0,0,0];
				}else{
					rows[row][i] = 0;
				}	
			}
		}
		chartdata.addRow(rows[row]);
	}
	var formatter = new google.visualization.DateFormat({pattern: date_format.visualization});
	formatter.format(chartdata, 0);
}

function collateMonth(startDate, endDate, statistic, attribute)
{
	var columnCount = chartdata.getNumberOfColumns();
	var date = new Date();
	var emptyRow = new Array(columnCount);
	for(var i=1; i<columnCount; i++){
		emptyRow[i] = null;
	}

	var	rows = new Object();
	var date=startDate;
	while(date.getUTCFullYear() < endDate.getUTCFullYear() || (date.getUTCFullYear() == endDate.getUTCFullYear() && date.getUTCMonth() <= endDate.getUTCMonth())){
		var datesString =  getDateString(date, 'MM/yyyy'); 
		row = emptyRow.slice(0);
		row[0] = new Date(date.getTime());
		rows[datesString] = row;
		// increment month
		if(date.getUTCMonth() <11){
			date.setUTCMonth(date.getUTCMonth() +1);
		}else{
			date.setUTCMonth(0);
			date.setUTCFullYear(date.getUTCFullYear()+1); 
		}
	}
	
	for(var i=0; i<filteredData.length; i++){
		var dateString = getDateString(getDateObject(filteredData[i][2], date_format.visualization), 'MM/yyyy');
		if(!rows[dateString][columnLookup[filteredData[i][1]]]){
			rows[dateString][columnLookup[filteredData[i][1]]] = new Array();
		}
		rows[dateString][columnLookup[filteredData[i][1]]].push(filteredData[i]);
	}
	for(row in rows){
		for(var i=1; i<rows[row].length; i++){
			if(rows[row][i] != null){
				switch(statistic){
					case 'total': rows[row][i] = total(rows[row][i], attribute); break;
					case 'average': rows[row][i] = average(rows[row][i], attribute); break;
					case 'maximum': rows[row][i] = maximum(rows[row][i], attribute); break;
					case 'minimum': rows[row][i] = minimum(rows[row][i], attribute); break;
					default: rows[row][i] = 0;
				}	
			}else{
				if(attribute == 'time'){
					rows[row][i] = [0,0,0,0];
				}else{
					rows[row][i] = 0;
				}	
			}
		}
		chartdata.addRow(rows[row]);
	}
	var formatter = new google.visualization.DateFormat({pattern: 'MM/yyyy'});
	formatter.format(chartdata, 0);
}


function inRange(dateString)
{
	var date = getDateObject(dateString, date_format.visualization);
	var firstDate =  getDateObject($('#date_range_start').val(), date_format.visualization);
	var lastDate =  getDateObject($('#date_range_end').val(), date_format.visualization);
	var result = false;
	if(firstDate && lastDate){
		result = isAfter(date, firstDate) && isAfter(lastDate, date);
	}else if(lastDate){
		result = isAfter(lastDate, date);
	}
	return result;
}


function isAfter(date1, date2)
{
	var after = false;
	date1Parts = date1
	if(date1.getUTCFullYear() >= date2.getUTCFullYear()){
		if(date1.getUTCFullYear() > date2.getUTCFullYear()){
			after = true
		}else if(date1.getUTCMonth() >= date2.getUTCMonth()){
			if(date1.getUTCMonth() > date2.getUTCMonth()){
				after = true;
			}else if(date1.getUTCDate() >= date2.getUTCDate()){
				after = true;
			}
		}
	}
	return after;
}

function total(activities, attrib)
{
	var total = 0;
	for(var i=0; i<activities.length; i++){
		total += getActivityAttrib(activities[i], attrib);
	}
	return getFormatedValue(total, attrib);
}
function average(activities, attrib)
{
	var total = 0;
	for(var i=0; i<activities.length; i++){
		total += getActivityAttrib(activities[i], attrib);
	}
	return getFormatedValue(total/activities.length, attrib);
}
function maximum(activities, attrib)
{
	var max = 0;
	for(var i=0; i<activities.length; i++){
		var value = getActivityAttrib(activities[i], attrib);
		if(value > max){
			max = value;
		}
	}
	return getFormatedValue(max, attrib);
}
function minimum(activities, attrib)
{
	var min = 99999999;
	for(var i=0; i<activities.length; i++){
		var value = getActivityAttrib(activities[i], attrib);
		if(value < min){
			min = value;
		}
	}
	return getFormatedValue(min, attrib);
}

function getFormatedValue(value, attrib)
{
	switch(attrib){
		case 'distance': 
			var formatted = value.toFixed(2) +' '+ unit;
			break;
		case 'time':  
			var timeParts = secsToTimeArray(value);
			value = [timeParts[0], timeParts[1],Math.floor(timeParts[2]),0];
//			var formatted = (timeParts[0]>0 ? timeParts[0]+':' : '') +timeParts[1].toString().padL(2,'0')+':'+timeParts[2].toString().padL(2,'0');
			break;
		case 'calories': 
			var formatted = value.toFixed(0) +' '+ energy_unit;
			break;
		case 'speed': 
			var formatted = value.toFixed(2) + ' '+ unit+'/Hour'; // unit! currently meters per second
			break;
		case 'effort': 
			var formatted = value.toFixed(2).toString();
			break;
	}
	if(formatted){
		return {v:value, f:formatted};		
	}else{
		return value;
	}
}

function getActivityAttrib(activity, attrib)
{
	var value = 0;
	switch(attrib){
		case 'activities': 
			value = 1;
			break;
		case 'distance': 
			if(unit == 'Miles'){ 
				value = activity[4]/1609.344;
			}else{
				value = activity[4]/1000.0;
			}
			break;
		case 'time':  // need to allow for units!  Currently just in seconds
			value = activity[5];
			break;
		case 'calories': 
			value = calcEnergy(activity);
			break;
		case 'speed': 
			if(unit == 'Miles'){ 
				value = (activity[4]/1609.344) / (activity[5]/3600);
			}else{
				value = (activity[4]/1000.0) / (activity[5]/3600);
			}
			break;
		case 'effort': 
			value = activity[6];
			break;
		default: 
			value = 0;
	}
	return value;
}

function calcEnergy(activity)
{
	var cals = {running:0.999, cycling:0.403, walking:0.699, 'mountain biking':0.544, swimming: 2.941, 'horse riding': 0.502, canoeing: 0.765, 'cross-country skiing': 1.211, 'downhill skiing': 0.118 };
	var calsKmKg = cals[activity[1]];
	var energy =  calsKmKg * user_weight * activity[4] / 1000;
	if(energy_unit == 'joules')
	{
		energy = energy * 4.184;
	}
	return energy;
}


String.prototype.padL = function(width,pad)
{
    if (!width ||width<1)
        return this;   
    if (!pad) pad=" ";        
    var length = width - this.length
    if (length < 1) return this.substr(0,width);
    return (String.repeat(pad,length) + this).substr(0,width);    
}   
String.repeat = function(chr,count)
{    
    var str = ""; 
    for(var x=0;x<count;x++) {str += chr}; 
    return str;
}