function processHoursData( $, data ) {

	// pre-existing container
	var hoursContainer = $( '#' + data.uuid );
	
	// clear it out
	hoursContainer.empty();
	
	// create the container div for the new content, and append it to the pre-existing container
	var containerDiv = $( '<div/>', {
		class: 'rps-contact-hours-of-operation'
	}).appendTo( hoursContainer );
	
	// the current status container
	var currentStatusContainerDiv = $( '<div/>' ).appendTo( containerDiv );
	
	// clock icon
	$( '<i/>', {
		class: 'material-icons',
		text: 'schedule'
	}).appendTo( currentStatusContainerDiv );
	
	// open or closed
	var nextSlot = {text: ''};
	var isOpen = getOpenClosed( $, data, nextSlot );
	
	$( '<strong/>', {
		text: getOpenClosedString( isOpen )
	}).appendTo( currentStatusContainerDiv );
	
	if ( !isOpen ) {
		nextSlot.text = getNextOpenString( $, data );
	}
	
	$( '<em/>', {
		text: nextSlot.text
	}).appendTo( currentStatusContainerDiv );
	
	// toggle button
	var toggleButton = $( '<i/>', {
		class: 'material-icons',
		id: 'rps-contact-hours-of-operation-schedule-toggle',
		text: 'expand_more'
	}).appendTo( currentStatusContainerDiv );
	
	$( '<label/>', {
		class: 'screen-reader-text',
		for: 'rps-contact-hours-of-operation-schedule-toggle',
		text: rps_contacts_directory_hours_of_operation.scheduleToggle
	}).appendTo( currentStatusContainerDiv );
	
	
	// the schedule table container
	var scheduleContainerTable = $( '<table/>', { class: 'tablepress' } ).appendTo( containerDiv );
	scheduleContainerTable.hide();
	
	toggleButton.css( 'cursor', 'pointer' );
	toggleButton.click( function( ev ) {
		if ( scheduleContainerTable.is(":visible") ) {
			toggleButton.text( 'expand_more' );
			scheduleContainerTable.hide();
		} else {
			toggleButton.text( 'expand_less' );
			scheduleContainerTable.show();
		}
		
		ev.preventDefault();
		ev.stopPropagation();
	});
	
	// header
	var scheduleContainerTableHeader = $( '<thead/>' ).appendTo( scheduleContainerTable );
	var scheduleContainerTableHeaderRow = $( '<tr/>' ).appendTo( scheduleContainerTableHeader );
	
	$( '<th/>', {
		text: rps_contacts_directory_hours_of_operation.day
	}).appendTo( scheduleContainerTableHeaderRow );
	
	$( '<th/>', {
		text: rps_contacts_directory_hours_of_operation.schedule
	}).appendTo( scheduleContainerTableHeaderRow );
	
	// body
	var scheduleContainerTableBody = $( '<tbody/>' ).appendTo( scheduleContainerTable );		
	var schedule = getSchedule( $, data );
		
    $.each( schedule, function( rowIndex, r ) {
	    
        var row = $( '<tr/>' ).appendTo( scheduleContainerTableBody );
        
        $.each( r, function( colIndex, c ) { 
            $( '<td/>', {
	            text: c
            }).appendTo( row );
        });
        
    });
		
}

function getOpenClosedString( isOpen ) {
	if ( isOpen ) {
		return rps_contacts_directory_hours_of_operation.open;
	} else {
		return rps_contacts_directory_hours_of_operation.closed;
	}
}
	
function getOpenClosed( $, data, closes ) {
	var isOpen = false;
		
	var currentDate = new Date();
	var hours = currentDate.getHours();
	var minutes = hours * 60 + currentDate.getMinutes();
	var dayIndex = currentDate.getDay() + 1;
		
    $.each( data.hours, function( i, day ) {
	    var dayOpen = getOpenClosedForDay( dayIndex, minutes, day );
	    
	    if ( dayOpen ) {
		    
		    if ( day.end == day.begin ) {
		    	closes.text = rps_contacts_directory_hours_of_operation.allDay;
		    } else {
		    	closes.text = rps_contacts_directory_hours_of_operation.closes + ' ' + getTimeString( day.end );
		    }
		    
	    }
	    
	    isOpen = isOpen || dayOpen;
    });
	
	return isOpen;
}

function getOpenClosedForDay( dayIndex, minutes, day ) {
	var isOpen = false;
	    
	var previousDay = dayIndex - 1;
	if ( previousDay == 0 ) {
		previousDay = 7;
	}	
		    
    if ( day.day == dayIndex ) {
	    
	    var end = day.end;
	    if ( day.duration > 0 ) {
		    end = day.begin + day.duration;
	    }
	    
	    if ( ( day.begin <= minutes ) && ( end >= minutes ) ) {
		    isOpen = true;
	    }
	    
    } else if ( previousDay == day.day ) {
	    
	    var end = day.end;
	    if ( day.duration > 0 ) {
		    end = day.begin + day.duration;
	    }
	    
	    if ( ( end > 1440 ) && ( end >= minutes ) ) {
		    isOpen = true;
	    }
	    
    }
    
    return isOpen;
	
}

function getNextOpenString( $, data ) {
	
	var currentDate = new Date();
	var hours = currentDate.getHours();
	var minutes = hours * 60 + currentDate.getMinutes();
	var dayIndex = currentDate.getDay() + 1;
	
	return getNextOpen( $, dayIndex, minutes, data );
	
}

function getNextOpen( $, dayIndex, minutes, data ) {
	var finalDay = 7;
	var finalMinutes = 1440;
	var weekInMinutes = 1440 * 8;
	var minimumMinutes = weekInMinutes;
	
    $.each( data.hours, function( i, day ) {
	    var adjustedDay = day.day - dayIndex;
	    
	    if ( adjustedDay < 0 ) {
		    adjustedDay = 7 + adjustedDay;
	    }
	    
	    var minutesFromCurrent = adjustedDay * 1440 + day.begin - minutes;
	    
	    if ( minutesFromCurrent < 0 ) {
		    minutesFromCurrent = weekInMinutes + minutesFromCurrent;
	    }
	    
	    if ( minutesFromCurrent < minimumMinutes ) {
		    
		    minimumMinutes = minutesFromCurrent;
			finalDay = day.day;
			finalMinutes = day.begin;
		    
	    }
	    
    });
    
    var timeString = getTimeString( finalMinutes );
    
    var finalString = rps_contacts_directory_hours_of_operation.opens + ' ';
    
    if ( ( finalDay == dayIndex ) && ( finalMinutes > minutes ) ) {
	    finalString = finalString + rps_contacts_directory_hours_of_operation.at;
    } else {
    	var days = [
    		rps_contacts_directory_hours_of_operation.sun,
    		rps_contacts_directory_hours_of_operation.mon,
    		rps_contacts_directory_hours_of_operation.tue,
    		rps_contacts_directory_hours_of_operation.wed,
    		rps_contacts_directory_hours_of_operation.thu,
    		rps_contacts_directory_hours_of_operation.fri,
    		rps_contacts_directory_hours_of_operation.sat
    	];
		var dayString = days[finalDay - 1];
	    finalString = finalString + dayString;
    }
    
    return finalString + ' ' + timeString;
    
}

function getTimeString( minutes ) {
    
    var hours = Math.floor( minutes / 60 );
    
    var ampm = '';
    
    var finalMinutes = minutes - hours * 60;
    
    if ( hours >= 12 ) {
	    hours = hours - 12;
	    if ( hours == 0 && finalMinutes == 0 ) {
		    hours = rps_contacts_directory_hours_of_operation.noon;
	    }
	    else {
	    	ampm = rps_contacts_directory_hours_of_operation.pm;
	    }
    }
    else {
	    if ( hours == 0 && finalMinutes == 0 ) {
			hours = rps_contacts_directory_hours_of_operation.midnight;
	    }
	    else {
		    ampm = rps_contacts_directory_hours_of_operation.am;
	    }
    }
    
    if (hours == 0) {
    	hours = 12;
    }
    
    var timeString = hours + '';
    
    if ( finalMinutes > 0 ) {
	    timeString = timeString + ':' + finalMinutes;
    }
    
    timeString = timeString + ampm;
    
    return timeString;
    
}

function getSchedule( $, data ) {
	// TODO	
	var dayStrings = ['', '', '', '', '', '', ''];	
    var days = [
    	rps_contacts_directory_hours_of_operation.sunday,
    	rps_contacts_directory_hours_of_operation.monday,
    	rps_contacts_directory_hours_of_operation.tuesday,
    	rps_contacts_directory_hours_of_operation.wednesday,
    	rps_contacts_directory_hours_of_operation.thursday,
    	rps_contacts_directory_hours_of_operation.friday,
    	rps_contacts_directory_hours_of_operation.saturday
    ];
		
    $.each( data.hours, function( i, day ) {
	    var beginString = getTimeString( day.begin );
	    var endString = getTimeString( day.end );
	    var completeString = beginString + ' - ' + endString;
	    
	    if ( beginString == endString ) {
		    completeString = rps_contacts_directory_hours_of_operation.allDay
	    }
	    
	    if ( dayStrings[ day.day - 1 ] != '' ) {
		    dayStrings[ day.day - 1 ] += ', ';
	    }
	    
	    dayStrings[ day.day - 1 ] += completeString;
    });
    
    var count = -1;
    var multiple = false;
    var last = '';
    var lastDay = -1;
    
	var output = [];
	    
    for ( var i = 0; i < 7; i++ ) {
	    
	    // go monday through sunday
	    var dayIndex = (i + 1);	    
	    if ( dayIndex == 7 ) {
		    dayIndex = 0;
	    }
	    
	    
	    if ( dayStrings[ dayIndex ] != '' ) { // we have hours for that day
		    
		    if ( dayStrings[ dayIndex ] == last ) {
			    multiple = true;
		    } else {
			    if ( multiple ) {
		   			output[ count ][0] += ' - ' + days[ lastDay ];
			    }
			    
			    multiple = false;
			    count++;
		    }
		    
		    if ( !multiple ) {
			    output[ count ] = [];
			    output[ count ][0] = days[ dayIndex ];
			    output[ count ][1] = dayStrings[ dayIndex ]
			    last = dayStrings[ dayIndex ];
		    } else {
			    lastDay = dayIndex;
		    }
		    
	    } else {
		    if ( multiple ) {
		   		output[ count ][0] += ' - ' + days[ lastDay ];
		    }
		    last = '';
		    multiple = false;
	    }
	    
    }
            
    if ( multiple ) {
	    output[ count ][0] += ' - ' + days[ lastDay ];
    }
    	
	return output;
}