// ********************************************************************************************************************
// These are the constants used on this page - error messages, defaults, etc.
var max_opps_to_show = 10;
var default_search_helptext = "Click here to search volunteer opportunities";
var results_page_min = 1;
//var constant_sign_in_feedback_must_enter_email = "Please enter an email.";


// ********************************************************************************************************************
// These are the globals used on this page
var opps = false;
var results_page = 1;
var results_page_max = false;
var last_filter_text = false;

// Google Maps globals
var map = false;
var geocoder = false;
var mgr = false;


// ********************************************************************************************************************
// These functions deal with the UI itself - getting values to send, putting values in, showing user feedback, etc.
$(document).ready(function() {

	// PAGE UI
	$('.tabs li a[href=#tab1]').click();
	
	$('.filterbar').focus(function(){
		var t = $(this);
		if(t.val() == default_search_helptext) {
			t.val('');
			t.removeClass('helptext');
		}
	}).blur(function(){
		var t = $(this);
		if(t.val() == '') {
			t.val(default_search_helptext);
			t.addClass('helptext');
		}		
	}).focus().blur();
	
	/*
	$.post('ajax_opps.php', function(data) {
		opps = $.secureEvalJSON(data);
		filter_opps(opps);
	});
	*/

	$.getJSON('ajax.php?a=getEvents', function(data) {
		opps = data;
		filter_opps(opps);
	});
	
	$('.filterbar').keypress(function(e){
		if( e.charCode!=0 || e.keyCode==8 || e.keyCode==46 || e.keyCode==63272 ) {
			setTimeout(function(){filter_opps(opps);},10);
		}
	});
	
	$('.opp-row').click(function(){
		var opp = $(this).data('opp');
		show_opp_info(opp);
	});
	
	var setPagination = function() {
		$('.pagination .current').removeClass('current');
		$('.pagination .action-results-page[href=#'+results_page+']').addClass('current');
		filter_opps(opps);
	};
	
	$('.pagination-container').delegate('a.action-results-first','click',function(){
		if($('.pagination .action-results-page').length) {
			results_page = results_page_min;
			setPagination();
		}
		return false;
	}).delegate('a.action-results-last','click',function(){
		if($('.pagination .action-results-page').length) {
			results_page = results_page_max;
			setPagination();
		}
		return false;
	}).delegate('a.action-results-next','click',function(){
		if($('.pagination .action-results-page').length) {
			results_page = Math.min(results_page+1,results_page_max);
			setPagination();
		}
		return false;
	}).delegate('a.action-results-prev','click',function(){
		if($('.pagination .action-results-page').length) {
			results_page = Math.max(results_page-1,results_page_min);
			setPagination();
		}
		return false;
	}).delegate('a.action-results-page','click',function(){
		results_page = Math.min(Math.max(parseInt($(this).attr('href').split('#')[1]),results_page_min),results_page_max);
		setPagination();
		return false;
	});

	// CALENDAR
	//$('#calendar').fullCalendar({
        // put options here
	//});
	

	/* MAP STUFF BELOW
	map = new GMap2($("#map").get(0));
	var universityplaceWA = new GLatLng(47.2356536,-122.550404);
	map.setCenter(universityplaceWA, 10);
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    //*/
			
/*
	// setup 10 random points
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var lngSpan = northEast.lng() - southWest.lng();
	var latSpan = northEast.lat() - southWest.lat();
	var markers = [];
	for (var i = 0; i < 10; i++) {
	    var point = new GLatLng(southWest.lat() + latSpan * Math.random(),
	        southWest.lng() + lngSpan * Math.random());
		marker = new GMarker(point);
		map.addOverlay(marker);
		markers[i] = marker;
	}
	
	$(markers).each(function(i,marker){
		$("<li />")
			.html("Point "+i)
			.click(function(){
				displayPoint(marker, i);
			})
			.appendTo("#list");
		
		GEvent.addListener(marker, "click", function(){
			displayPoint(marker, i);
		});
	});
	
	// Create new geocoding object
	geocoder = new GClientGeocoder();
	
	// Marker manager
	mgr = new MarkerManager(map);
*/	
});


// ********************************************************************************************************************
// These functions make a lot of shit happen

var filter_opps = function(opps) {

	if(viewingTab!=false && opps!=false) {
	
		var filter_text = $('.filterbar').val();
		if(filter_text == default_search_helptext) {
			filter_text = '';
		}
		filter_text = filter_text.replace(/\s/ig,' ');
		
		if(filter_text !== last_filter_text) {
			results_page = 1;
		}

		var i = (results_page - 1)*max_opps_to_show;

		var sorted_opps = sort_and_filter(opps, filter_text);
		var match_count = sorted_opps['opps'].length;

		if(viewingTab=='#tab1') {
		
			var displayed_count = 0;
			var opp_table = $('#opp-table-to-clone').clone(true).attr('id','');

			$('#tab1').empty().append(opp_table);
			
			if(sorted_opps['opps']) {
				for(;i<sorted_opps['opps'].length && displayed_count < max_opps_to_show;i++) {
					var opp = sorted_opps['opps'][i];
					if(opp['match']==0) {
						match_count=i;
						break;
					}
					var opp_row = $('#opp-row-to-clone').clone(true).attr('id','');
					opp_row.find('.opp-title').text(opp['event_name']);
					opp_row.find('.opp-org').text(opp['organization_name']);
					opp_row.find('.opp-date').text(opp['event_date']!='0000-00-00' ? opp['formatted_datetime'] : 'Ongoing');
					opp_row.data('opp',opp);
					opp_table.append(opp_row);
					displayed_count++;
				}			
			}
			
			zebra_stripe_table();
		
		}
		else if(viewingTab=='#tab2') {
			var displayed_count = 0;
			var opp_events = Array();
			
			if(sorted_opps['opps']) {
				for(;i<sorted_opps['opps'].length && displayed_count < max_opps_to_show;i++) {
					var opp = sorted_opps['opps'][i];
					if(opp['match']==0) {
						match_count=i;
						break;
					}
					opp_events[displayed_count] = {
						id: opp['event_id'],
						title: opp['event_name'],
						start: opp['RFC1123'], // new Date(opp['RFC1123']),
						//end: opp['end_RFC1123'], // new Date(opp['end_RFC1123']),
						//allDay: opp['RFC1123']==opp['end_RFC1123'],
						opportunity: opp
					};
					//	end: opp['opp_datetime_start']
					//var opp_row = $('#opp-row-to-clone').clone(true).attr('id','');
					//opp_row.find('.opp-title').text();
					//opp_row.find('.opp-org').text(opp['org_name']);
					//opp_row.find('.opp-date').text(opp['event_date']!='0000-00-00' ? opp['formatted_datetime'] : 'Ongoing');
					//opp_row.data('opp',opp);
					//opp_table.append(opp_row);
					displayed_count++;
				}
			}
			
			$('#calendar').empty().fullCalendar({
				header: {
					left: 'prev,next today',
					center: 'title',
					right: 'month,agendaWeek,agendaDay'
				},
				eventClick: function(calEvent, jsEvent, view) {

			        show_opp_info(calEvent.opportunity);
			        //alert('Event: ' + calEvent.title);
			        //alert('Coordinates: ' + jsEvent.pageX + ',' + jsEvent.pageY);
			        //alert('View: ' + view.name);
			
			        // change the border color just for fun
			        //$(this).css('border-color', 'red');
			
			    },
				editable: false,
				events: opp_events
			});
		}
		else if(viewingTab=='#tab3') {
		
			var displayed_count = 0;
			var markers = [];
			//map.clearOverlays();
			
			if(sorted_opps['opps']) {
				for(;i<sorted_opps['opps'].length && displayed_count < max_opps_to_show;i++) {
					var opp = sorted_opps['opps'][i];
					if(opp.match==0) {
						match_count=i;
						break;
					}
					if( opp.latitude_deg != null && opp.latitude_deg != 0 && opp.longitude_deg != null && opp.longitude_deg != 0 ){
						markers.push({
										latitude: opp.latitude_deg,
										longitude: opp.longitude_deg,
		                      			html: "<a href='#' onclick='show_opp_info_by_index("+opp.index+");' style='color:#0000ff;text-decoration:underline;'>"
		                      					+ opp.event_name + "</a><br /><br />" + opp.formatted_datetime
	//	     ,                 			data: opp
		                      		});
						displayed_count++;
					}/*
					else {
						var addr = create_address(opp);
						if( addr != '' ){
							markers.push({
											address: addr,
			                      			html: '<a href="#" onclick="show_opp_info_by_index('+opp.index+');">' + opp.event_name + '</a>'
	//		 ,                     			data: opp
			                      		});
							displayed_count++;
						}
					}*/
				}
			}

			$('#map').gMap({
									markers: 	markers,
				                  	zoom:		13
                				});
						
			// Retrieve location information, pass it to addToMap()
			
		}
		
		if(filter_text !== last_filter_text) {
			results_page_max = Math.ceil(match_count / max_opps_to_show);
			$('.pagination .action-results-page').remove();
			for(i=results_page_min;i<=results_page_max;i++) {
				$('.pagination .action-results-next').closest('li').before(template('pagination-page',{page:i}));
			}
			$('.pagination .action-results-page[href=#'+results_page_min+']').addClass('current');
			last_filter_text = filter_text;
		}

	}

};

var get_date_string = function(date_tp) {
	var time_text = ''+date_tp.getMinutes();
	if(time_text.length==1) {
		time_text = '0'+time_text;
	}
	if(date_tp.getHours() > 12) {
		time_text = date_tp.getHours()-12 + ':' + time_text + 'pm';
	}
	else {
		time_text = date_tp.getHours() + ':' + time_text + 'am';
	}
	return $.datepicker.formatDate('M d', date_tp)+' '+time_text;
};

var match_sort = function(a, b) {
	return b['match'] - a['match'];
};

var sort_and_filter = function(opps_to_sort, filter_text) {
	
	var sortable_opps = $.extend(true, {}, opps_to_sort);
	
	var keywords = filter_text.split(' ');

	if(sortable_opps['opps']) {
		for(var i=0;i<sortable_opps['opps'].length;i++) {
			var opp = sortable_opps['opps'][i];
			sortable_opps['opps'][i].index = i;
			opp['opp_js_date'] = mysqlTimeStampToDate(opp['event_date']);
			var match = 0;
			
			opp['full_match'] = true;
	
			for(var j=0;j<keywords.length;j++) {
				var keyword_match = 0;
				var keyword = keywords[j];
				if( opp['event_name']!=null && opp['event_name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				if( opp['event_description']!=null && opp['event_description'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				if( opp['event_location']!=null && opp['event_location'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				if( opp['event_notes']!=null && opp['event_notes'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				if( opp['long_formatted_date']!=null && opp['long_formatted_date'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				if( opp['long_formatted_time']!=null && opp['long_formatted_time'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				
				/*
				if( opp['opp_name']!=null && opp['org_name'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				if( opp['opp_skills']!=null && opp['opp_skills'].toLowerCase().indexOf(keyword.toLowerCase()) != -1 ) {
					keyword_match++;
				}
				*/
				if(keyword_match==0) {
					opp['full_match'] = false;
				}
				match+=keyword_match;
			}
			
			if(opp['full_match']) {
				sortable_opps['opps'][i]['match'] = match;	
			}
			else {
				sortable_opps['opps'][i]['match'] = 0;
			}
		}
	
		sortable_opps['opps'].sort(match_sort);
	}
	
	return sortable_opps;

};




// ********************************************************************************************************************
// These functions make calls to the APIs


// ********************************************************************************************************************
// These functions are called by the APIs, and manage the data on the client side
