 /* 
 * Copyright 2009 365 Media Services
 *
 * This code controls the code for anything related to the grid aspect of the calendar
 * This includes displaying events, generating the grid, and so forth
 *
 * vim:filetype=javascript: 
 * vim:sts=4:sw=4:et:
 */

 var Grid = {};


cached_data = Array();

Grid.AddEvents = function(encoded, this_day, func)
{
    calendar_month = $('#CalendarMonth').val();
    calendar_year = $('#CalendarYear').val();
    var events = eval(Base64.decode(encoded));

	$('#events').html("");

    if (events.length == 0) {
		$('#events').append("<span id='no-events'>No events were found in this date range.</span>");
        return;
	}
	
	$.each(events, function(i, e) {
        try {
			
			var dates = "";
			var tempDate = new Date();
		    selectedDate = false;	

            for(k = 0; e.Dates[k] != undefined; k++) {
				tempDate.setDate(e.Dates[k].date.split('-').slice(2, 3)[0]);
				tempDate.setMonth(e.Dates[k].date.split('-').slice(1, 2)[0] - 1);
				tempDate.setFullYear(e.Dates[k].date.split('-').slice(0, 1)[0]);
				
				formatted = tempDate.toLocaleDateString();
				
				if (e.Event.date_range == false) {
					r = formatted.length;
					formatted = formatted.substring(0, r-6);
				}
				else {
                    //Grid.highlightDaterange(e.Dates);
					r = formatted.indexOf(",");
					formatted = formatted.substring(r+1, formatted.length);
					if (k == 0)
						formatted += " - ";
				}
				if (this_day != undefined) {
					if (this_day.toLocaleDateString() == tempDate.toLocaleDateString() && (e.Event.date_range == false)) {
						formatted = "<span style='color:#990033'>" + formatted + "</span>";
                        selectedDate = true;
					}    
				}
				
				dates += formatted;
				
				dates += '<br />\n'
				};
			
			first_date = (e.first_date == undefined) ? false : true;
            
            for(j = 0; e.Dates[j] != undefined; j++) {					
				day = e.Dates[j].date.split('-').slice(2, 3)[0];
				month = e.Dates[j].date.split('-').slice(1, 2)[0];
				year = e.Dates[j].date.split('-').slice(0, 1)[0];
				
			    Grid.PrecacheData( e.Event.id, day,
						e.Event.name, e.Event.location, e.Event.description,
						e.Event.price, e.Event.website, e.Event.alt, dates, e.Photos, e.Event.date_range, selectedDate, e.Dates[j].start_time, e.Dates[j].end_time); 
				
				if (j == 0 )
					Grid.LoadEvents(day);
				if (func != undefined)
					func(day);
				else if (month == calendar_month && year == calendar_year)
					Grid.ApplyDay(day);
				
            };
        }
        catch(err) {
			try {
				console.error("Event " + e.Event['id'] + " threw an exception: " + err);
			}
			catch(console) {
			}
        }
	});
};

Grid.AddExhibitions = function(encoded, this_day, func)
{
	var events = eval(Base64.decode(encoded));
    $('#events').html("");
	$.each(events, function(i, e) {
        try {
			
			var dates = "";
			var tempDate = new Date();
			selectedDate = false;	

            for(k = 0; e.Dates[k] != undefined; k++) {
				tempDate.setDate(e.Dates[k].date.split('-').slice(2, 3)[0]);
				tempDate.setMonth(e.Dates[k].date.split('-').slice(1, 2)[0] - 1);
				tempDate.setFullYear(e.Dates[k].date.split('-').slice(0, 1)[0]);
				
				formatted = tempDate.toLocaleDateString();
				
				if (e.Event.date_range == false) {
					r = formatted.length;
					formatted = formatted.substring(0, r-6);
				}
				else {
					r = formatted.indexOf(",");
					formatted = formatted.substring(r+1, formatted.length);
					if (k == 0)
						formatted += " - ";
				}
				if (this_day != undefined) {
					if (this_day.toLocaleDateString() == tempDate.toLocaleDateString() && (e.Event.date_range == false)) {
						formatted = "<span style='color:#990033'>" + formatted + "</span>";
                        selectedDate = true;
					}	
				}
				
				dates += formatted;
				
				dates += '<br />\n'
				};
			

			first_date = (e.first_date == undefined) ? false : true;
            
            for(j = 0; e.Dates[j] != undefined; j++) {					
				day = e.Dates[j].date.split('-').slice(2, 3)[0];
				month = e.Dates[j].date.split('-').slice(1, 2)[0];
				year = e.Dates[j].date.split('-').slice(0, 1)[0];
				
				Grid.PrecacheData( e.Event.id, day,
						e.Event.name, e.Event.location, e.Event.description,
						e.Event.price, e.Event.website, e.Event.alt, dates, e.Photos, e.Event.date_range, selectedDate);
				
				if (j == 0 )
					Grid.LoadEvents(day, true);
				
				if (func != undefined)
					func(day);
				
            };
        }
        catch(err) {
			try {
				console.error("Event " + event.id + " threw an exception: " + err);
			}
			catch(console) {
			}
        }
	});
};

Grid.PrecacheData = function(id, day, name, location, description, price, website, alt, dates, photo, date_range, selectedDate, start_time, end_time) {
	day = day;
	
	if (cached_data[day] == undefined) {
		cached_data[day] = Array();
		cached_data[day]['count'] = 0;
	}
	
	cached_data[day]['id'] = id;
	cached_data[day]['name'] = name;
	cached_data[day]['price'] = price;
	cached_data[day]['website'] = website;
	cached_data[day]['description'] = description;
	cached_data[day]['location'] = location;
	cached_data[day]['alt'] = alt;
	cached_data[day]['dates'] = dates;
	cached_data[day]['photo'] = photo;
	cached_data[day]['date_range'] = date_range;
    cached_data[day]['selected_date'] = selectedDate;
    cached_data[day]['start_time'] = start_time;
    cached_data[day]['end_time'] = end_time;

}

Grid.Setup = function(logged_in, no_grid) {	 

    if (no_grid == undefined || no_grid == false) {
        for (i = 1; i <= 31; i++) {
            day = (i < 10) ? ('0'+i) : i;
            if ( $("#ev_' + day").length < 0 )
                break;

            $('#ev_' + day).attr('hasEvent', '0');
			$('#ev_' + day).attr('date', day);
            $('#ev_' + day).click(function(){
				marked_date = $('#range-start-date').html();
				g = marked_date.length;
				marked_date = marked_date.substring(g-8, g-6);
				$(".today").each( function(){
                   $(this).removeClass('today');
                   });
				$('#ev_' + $(this).attr('date')).addClass('today');			
				Grid.GetNewEvents($(this).attr('date'));
            });
            $('#ev_' + day).css('cursor', 'pointer');
        }
		
		$('#month-range').change(function(){
			marked_date = $('#range-start-date').html();
			g = marked_date.length;
			marked_date = marked_date.substring(g-8, g-6);
			Grid.GetNewEvents($('#ev_' + marked_date).attr('date'));
		});
    }
}

Grid.LoadEvents = function(day, exhibition) {
	e = cached_data[day];
	
	event_photo = (e.photo == undefined || e.photo.href_small == undefined) ? null : e.photo.href_small;

	html =  '<span class="event-listing" style="display: none; '+(e.selected_date ? "border: 1px solid #990033;" : "")+'">';
	if (event_photo != null) {
		html += '<span class="image"><img src="'+event_photo+'" /></span>';
	}
	
	l = e['description'].length;
	
	if ( l > 80 ) {
		l = 80;
	}
	
	shortdescription = e['description'].substring(0,l);
	
	if (l >=80 ) {
		shortdescription += " ...</em><br /><a href='javascript:readMore("+e['id']+")' eventid='"+e['id']+"'>[<em>click to read more</em>]</a>";
	}
	html += '<span class="text' + (event_photo == null ? " nophoto" : "") + '"><strong>';
    if (exhibition != true) {
        html += '<a href="#" id="listing_' + e['id'] + '" eventid="'+ e['id'] +'">'+e['name'] + '</a>';
    }
    else {
        html += '<a href="'+e['website']+'">'+e['name'] + '</a>';
    }
    html += '</strong><br /><span id="short-description-'+ e['id'] +'" >' + shortdescription + '<br /></span>';
	html += '<span id="long-description-' + e['id'] + '" style="display: none">' + e['description'] + '<br />';
	html += '<a href="javascript:readLess('+e['id']+')" eventid="'+e['id']+'">[<em>click to show less</em>]</a><br /></span>';
    if (e['location'] != '')
        html += '<br /><strong>Location: </strong>'+e['location']+'<br />';
	html += '</span>';
    html += '<span class="dates"><strong>' + (e['date_range']==true ? 'Dates:' : 'Date(s):' )+ '</strong><br />' + e['dates'] + '<br />';
    if (e['start_time'] != undefined) {
        start_time = e['start_time'].split(":");
        start_hour = parseInt(start_time[0]) > 12 ? parseInt(start_time[0]) - 12 :  start_time[0].replace(/0(.)/, "$1");
        start_minute = start_time[1] == "00" ? "" : ":" + start_time[1];
        start_ampm = parseInt(start_time[0]) >= 12 ? " PM" : " AM";
        html += start_hour + start_minute + start_ampm;
    }
    
   if (e['end_time'] != undefined) { 
        end_time = e['end_time'].split(":");
        end_hour = parseInt(end_time[0]) > 12 ? parseInt(end_time[0]) - 12 : end_time[0].replace(/0(.)/, "$1");
        end_minute = end_time[1] == "00" ? "" : ":" + end_time[1];
        end_ampm = parseInt(end_time[0]) >= 12 ? " PM" : " AM";
        html += " to " + end_hour + end_minute + end_ampm; 
    }
    if (e['start_time'] != undefined || e['end_time'] != undefined)
        html += "<br /><br />\n";
    if (e['price'] != '')
        html += '<strong>Cost: </strong>' + e['price'];
    html += '</span><br style="clear:both" /></span>';

 	$('#events').append(html);
    $('.event-listing').each(function(){
            $(this).fadeIn('fast');
            });
    $('#listing_' + e['id']).click(function(){
        Grid.ViewEvent($(this).attr('eventid'));
        });
	}
	
function readMore(id) {
		$('#short-description-'+id).hide();
		$('#long-description-'+id).show();
	};
	
function readLess(id) {
			$('#long-description-'+id).hide();
			$('#short-description-'+id).show();
	};

Grid.GetNewEvents = function(today) {
        $('.event-listing').each(function(){
            $(this).fadeOut('fast');
            });
		calendar_id = $('#CalendarId').val();
		calendar_month = $('#CalendarMonth').val();
		calendar_year = $('#CalendarYear').val();
		clickDate = new Date();
		clickDate.setDate(today);
		clickDate.setMonth(calendar_month-1);
		clickDate.setFullYear(calendar_year);
		selected = $("#month-range option:selected").text();
		var func = function() {};
		$.getJSON("/events/find_events_range/" + calendar_id + "/" + calendar_year + "/" + calendar_month + "/" + today + "/" + selected, {},
				function(json){
					if (json.status == false)
					{
						$('#calendar-error').show();
						$('#calendar-error').html('There was an error processing your request.');
					}
					else
					{
                        if ($('#calendar-title').html() == 'Exhibitions')
                            Grid.AddExhibitions(json.events, clickDate);
                        else
						    Grid.AddEvents(json.events, clickDate);
						start_date = clickDate.toLocaleDateString();
						j = start_date.indexOf(",") + 2;
						start_date = start_date.substring(j);
						nextDate = clickDate;
						nextDate.setMonth( calendar_month - 1 + parseInt(selected) );
						end_date = nextDate.toLocaleDateString();
						j = end_date.indexOf(",") + 2 ;
						end_date = end_date.substring(j);
						$('#range-start-date').html(start_date);
						$('#range-end-date').html(end_date);
						$('#calendars-error').hide();
					}
				  });
}

Grid.ViewEvent = function(id){
    $('#events').html("");
    $.get('/calendars/show_details/'+id, function (data) {
        $('#events').html(Base64.decode(data));
        $('#events-back').click( function() {
                today = $('.today').attr('date');
                Grid.GetNewEvents(today);
                });
    });

}

Grid.ApplyDay = function(day){
/*	var id = '#ev_' + day;
    if ($('#ev_' + day).hasClass('past_date') == false)
	    $('#ev_' + day).css('color', "#990033");
	$(id).attr('hasEvent', 1);
	$(id).css('cursor', 'pointer');
	
	document.getElementById('ev_' + day).href = '#calendar-pop-up-window';
*/
}

/*
Grid.highlightDaterange = function(daterange) {
    today = $('#CalendarYear').val() + "-" + $('#CalendarMonth').val() + "-" + $('.today').attr('date');
    calendar_end = $('#CalendarYear').val() + "-" + $('#CalendarMonth').val() + "-" + "31";
    if (today > daterange[0].date && daterange[1].date > calendar_end )
       $('.day:not(.past_date)').css('color', '#990033'); 
}
*/
