/***********************************************************************************
 * Author:	Charles Dorner, on behalf of Blue Blanket Studio
 * Copyright (c) 2008-2010 Blue Blanket Studio.  All Rights Reserved.
 * This file contains Original Code and/or Modifications of Original Code as defined
 * in and that are subject to the UPVC Source License (the 'License').  You may not
 * use this file except in compliance with the License.  Please read the License
 * below before using this file.
 * 
 * The Original Code and all software distributed under the License are provided
 * on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND
 * BLUE BLANKET HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION,
 * ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
 * ENJOYMENT OR NON-INFRINGEMENT.  Please see the License for the specific language
 * governing rights and limitations under the License.
 *
 * 
 * UPVC SOURCE LICENSE
 * 
 * Please read this License carefully before using this software.  By using this
 * software, you are agreeing to be bound by the terms of this License.  If you do
 * not or cannot agree to the terms of this License, please do not use the software.
 * 
 * 1.	General; Definitions.  This License applies to any program or other work
 * 		which Blue Blanket Studio ("Blue Blanket") provides and which contains a
 *		notice placed by Blue Blanket identifying such program or work as
 * 		"Original Code" and stating that it is subject to the terms of this UPVC
 *		Source License ("License").  As used in this License:
 * 
 * 1.2	"Contributor" means any person or entity that creates or contributes to the
 * 		creation of Covered Code.
 * 
 * 1.3	"Covered Code" means the Original Code, Modifications, the combination of
 * 		Original Code and any Modifications, and/or any respective portions thereof.
 * 
 * 1.4	"Externally Deploy" means: (a) to sublicense, distribute or otherwise make
 * 		Covered Code available, directly or indirectly, to anyone other than You;
 * 		and/or (b) to move Covered Code to a server not owned or leased by You;
 * 		and/or (c) to use Covered Code, alone or as part of a Larger Work, in any way
 * 		to provide a service, including but not limited to delivery of content,
 * 		through electronic communication with a client other than You.
 * 
 * 1.5	"Larger Work" means a work which combines Covered Code or portions thereof
 * 		with code not governed by the terms of this License.
 * 
 * 1.6	"Modifications" mean any addition to, deletion from, and/or change to, the
 * 		substance and/or structure of the Original Code, any previous Modifications,
 * 		the combination of Original Code and any previous Modifications, and/or any
 * 		respective portions thereof.  When code is released as a series of files, a
 * 		Modification is:  (a) any addition to or deletion from the contents of a file
 * 		containing Covered Code; and/or (b) any new file or other representation of
 * 		computer program statements that contains any part of Covered Code. 
 * 
 * 1.7	"Original Code" means (a) the Source Code of a program or other work as
 * 		originally made available by Blue Blanket under this License, including the
 * 		Source Code of any updates or upgrades to such programs or works made
 * 		available by Blue Blanket under this License, and that has been expressly
 * 		identified by Blue Blanket as such in the header(s) of such work; and
 * 		(b) any code compiled from such Source Code.
 * 
 * 1.8	"Source Code" means the human readable form of a program or other work that is
 * 		suitable for making modifications to it, including all modules it contains.
 * 
 * 1.9	"You" or "Your" means an individual or a legal entity exercising rights under
 * 		this License, in this case the Unviersity Place Volunteer Center ("UPVC").
 * 		For legal entities, "You" or "Your" includes any entity which controls, is
 * 		controlled by, or is under common control with, You, where "control" means (a)
 * 		the power, direct or indirect, to cause the direction or management of such
 * 		entity, whether by contract or otherwise, or (b) ownership of fifty percent
 * 		(50%) or more of the outstanding shares or beneficial ownership of such entity.
 * 
 * 2.	Permitted Uses; Conditions & Restrictions.   Subject to the terms and
 * 		conditions of this License, Blue Blanket hereby grants You, effective on the
 * 		date You accept this License and begin use of the Original Code, a world-wide,
 * 		royalty-free, non-exclusive license, to the extent of Blue Blanket's
 * 		copyrights covering the Original Code, to do the following:
 * 
 * 2.1	Unmodified Code.  You may use, reproduce, display, perform, and internally
 * 		distribute within Your organization unmodified copies of the Original Code,
 * 		for Your non-commercial use only, provided that in each instance:
 * 
 * 		(a)	You must retain and reproduce in all copies of Original Code the copyright
 * 		and other proprietary notices and disclaimers of Blue Blanket as they appear in
 * 		the Original Code, and keep intact all notices in the Original Code that refer
 * 		to this License; and
 * 
 * 		(b) You must include a copy of this License with every copy of Source Code of
 * 		Covered Code You distribute, and You may not offer or impose any terms on such
 * 		Source Code that alter or restrict this License or the recipients' rights
 * 		hereunder, except as permitted under Section 6; and
 * 
 * 		(c) You must not Externally Deploy the Unmodified Code.
 * 
 * 2.2	Modified Code.  You may modify Covered Code and use, reproduce, display,
 * 		perform, and internally distribute within Your organization, Your Modifications
 * 		and Covered Code, for Your non-commercial use only, provided that in each
 * 		instance You also meet all of these conditions:
 * 
 * 		(a)	You must satisfy all the conditions of Section 2.1 with respect to the
 * 		Source Code of the Covered Code; 
 * 
 * 		(b)	You must duplicate, to the extent it does not already exist, this UPVC
 * 		Source License, verbatim, in each file of the Source Code of all Your
 * 		Modifications, and cause the modified files to carry prominent notices stating
 * 		that You changed the files and the date of any change; and
 * 
 * 		(c)	You must not Externally Deploy the Modified Code.
 * 
 * 2.3	Third Party Rights.  You expressly acknowledge and agree that although
 * 		Blue Blanket and each Contributor grants the licenses to their respective
 * 		portions of the Covered Code set forth herein, no assurances are provided by
 * 		Blue Blanket or any Contributor that the Covered Code does not infringe the
 * 		patent or other intellectual property rights of any other entity. Blue Blanket
 * 		and each Contributor disclaim any liability to You for claims brought by any
 * 		other entity based on infringement of intellectual property rights or otherwise.
 * 		As a condition to exercising the rights and licenses granted hereunder, You
 * 		hereby assume sole responsibility to secure any other intellectual property
 * 		rights needed, if any. For example, if a third party license is required, it is
 * 		Your responsibility to acquire that license before using the Covered Code. 
 * 
 * 3.	Larger Works.  You may create a Larger Work by combining Covered Code with other
 * 		code not governed by the terms of this License.  In each such instance, You must
 * 		make sure the requirements of this License, are fulfilled for the Covered Code
 * 		including, but not limited to section 2.2 of this License.
 * 
 * 4.	NO WARRANTY OR SUPPORT.  The Covered Code may contain in whole or in part
 * 		pre-release, untested, or not fully tested works.  The Covered Code may contain
 * 		errors that could cause failures or loss of data, and may be incomplete or
 * 		contain inaccuracies.  You expressly acknowledge and agree that use of the
 * 		Covered Code, or any portion thereof, is at Your sole and entire risk.
 * 		THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT
 * 		OF ANY KIND AND BLUE BLANKET AND BLUE BLANKET'S LICENSOR(S) (COLLECTIVELY
 * 		REFERRED TO AS "BLUE BLANKET" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL
 * 		CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR
 * 		IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS
 * 		OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE,
 * 		OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
 * 		BLUE BLANKET AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR
 * 		ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE
 * 		WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE
 * 		UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED.
 * 		NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY BLUE BLANKET, A BLUE BLANKET
 * 		AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY.
 * 		You acknowledge that the Covered Code is not intended for use in the operation of
 * 		nuclear facilities, aircraft navigation, communication systems, or air traffic
 * 		control machines in which case the failure of the Covered Code could lead to death,
 * 		personal injury, or severe physical or environmental damage.
 * 
 * 5.	LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL
 * 		BLUE BLANKET OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR
 * 		CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR
 * 		INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY
 * 		OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR
 * 		OTHERWISE, EVEN IF BLUE BLANKET OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE
 * 		POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE
 * 		OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF
 * 		INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU.
 * 		In no event shall Blue Blanket's total liability to You for all damages (other
 * 		than as may be required by applicable law) under this License exceed the amount of
 * 		fifty dollars ($50.00).
 * 
 * 6.	Ownership. Blue Blanket retains all rights, title and interest in and to the
 * 		Original Code and any Modifications made by or on behalf of Blue Blanket
 * 		("Blue Blanket Modifications").  Blue Blanket may, at its sole discretion, choose
 * 		to license such Blue Blanket Modifications under this License, or on different
 * 		terms from those contained in this License or may choose not to license them at all.  
 * 
 * 7.	Termination.  
 * 
 * 7.1	Termination.  This License and the rights granted hereunder will terminate:
 * 
 * 		(a)	automatically without notice from Blue Blanket if You fail to comply with any
 * 		term(s) of this License and fail to cure such breach within 30 days of becoming
 * 		aware of such breach; or
 * 		
 * 		(b)	immediately in the event of the circumstances described in Section 13.5(b); or
 * 		
 * 		(c)	automatically without notice from Blue Blanket if You, at any time during the
 * 		term of this License, commence a legal action against Blue Blanket; provided that
 * 		Blue Blanket did not first commence a legal action against You in that instance.
 * 
 * 7.2	Effect of Termination.  Upon termination, You agree to immediately stop any further
 * 		use, reproduction, and modification of the Covered Code.  Provisions which, by
 * 		their nature, should remain in effect beyond the termination of this License shall
 * 		survive, include but are not limited to Sections 4, 5, 6, 7.2, and 8.  No party
 * 		will be liable to any other for compensation, indemnity or damages of any sort
 * 		solely as a result of terminating this License in accordance with its terms, and
 * 		termination of this License will be without prejudice to any other right or remedy
 * 		of any party.
 * 
 * 8. 	Miscellaneous.
 * 
 * 8.1	Government End Users.   The Covered Code is a "commercial item" as defined in
 * 		FAR 2.101.  Government software and technical data rights in the Covered Code
 * 		include only those rights customarily provided to the public as defined in this
 * 		License. This customary commercial license in technical data and software is
 * 		provided in accordance with FAR 12.211 (Technical Data) and
 * 		12.212 (Computer Software) and, for Department of Defense purchases,
 * 		DFAR 252.227-7015 (Technical Data -- Commercial Items) and
 * 		227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation).
 * 		Accordingly, all U.S. Government End Users acquire Covered Code with only those
 * 		rights set forth herein.
 * 
 * 8.2	Relationship of Parties.  This License will not be construed as creating an
 * 		agency, partnership, joint venture or any other form of legal association between
 * 		or among You, Blue Blanket or any Contributor, and You will not represent to the
 * 		contrary, whether expressly, by implication, appearance or otherwise.
 * 
 * 8.3	Independent Development.   Nothing in this License will impair Blue Blanket's right
 * 		to acquire, license, develop, have others develop for it, market and/or distribute
 * 		technology or products that perform the same or similar functions as, or otherwise
 * 		compete with, Modifications, Larger Works, or technology that You may develop for
 * 		Your use.
 * 
 * 8.4	Waiver; Construction.  Failure by Blue Blanket or any Contributor to enforce any
 * 		provision of this License will not be deemed a waiver of future enforcement of that
 * 		or any other provision.  Any law or regulation which provides that the language of
 * 		a contract shall be construed against the drafter will not apply to this License.
 * 
 * 8.5	Severability.  (a) If for any reason a court of competent jurisdiction finds any
 * 		provision of this License, or portion thereof, to be unenforceable, that provision
 * 		of the License will be enforced to the maximum extent permissible so as to effect
 * 		the economic benefits and intent of the parties, and the remainder of this License
 * 		will continue in full force and effect.  (b) Notwithstanding the foregoing, if
 * 		applicable law prohibits or restricts You from fully and/or specifically complying
 * 		with Sections 2 and/or 3 or prevents the enforceability of either of those
 * 		Sections, this License will immediately terminate and You must immediately
 * 		discontinue any use of the Covered Code and destroy all copies of it that are in
 * 		your possession or control.
 * 
 * 8.6	Dispute Resolution.  Any dispute resolution between You and Blue Blanket relating
 * 		to this License shall first take place in partnership with the
 * 		Pierce County Center for Dispute Resolution. Any litigation between You and
 * 		Blue Blanket relating to this License shall take place in the
 * 		King County District Court, and You and Blue Blanket hereby consent to the
 * 		personal jurisdiction of, and venue in, the state and federal courts within that
 * 		District with respect to this License.
 * 
 * 8.7	Entire Agreement; Governing Law.  This License constitutes the entire agreement
 * 		between the parties with respect to the subject matter hereof.  This License shall
 * 		be governed by the laws of the United States and the State of Washington, except
 * 		that body of Washington law concerning conflicts of law.
 */ 
 
// ********************************************************************************************************************
// 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'],
						allDay: opp['long_formatted_time']=='',
						start: opp['RFC1123'],
						opportunity: opp
					};
					if(opp['long_formatted_end_time']!='') {
						$.extend(opp_events[displayed_count],{end: opp['end_RFC1123']});
					}
					//	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++;
						}
					}*/
				}
			}

			if(displayed_count > 0) {
				$('#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

