jQuery(document).ready(function() {
	gce_tooltips('.gce-has-events');

  controller.init();
	
	if ($('#photoPage').length > 0) {
		//controller.showPhotos('text', ['cyn-cyn','cyncyn','pons']);
		controller.showPhotos('owner', controller.settings.flickr.userID);
	} else if ($('#videoPage').length > 0) {
		controller.showVideos('playlist', ['cyn-cyn','cyncyn','pons']);
	} else if ($('#calendarPage').length > 0) {
		controller.pullCalendar();
	}
});

function typeOf(value) {
	var s = typeof value;
	if (s === 'object') {
		if (value) {
			
			if (value instanceof Array) {
				s = 'array';
			}
		} else {
			s = 'null';
		}
	}
	return s;
} // typeOf()

var controller = {
	lastSearchType: {},
	urls: {
		flickrTextSearch: function(search_crit, page_number) {
			var search;
			if (typeOf(search_crit) == 'array') {
			  search = '&text=' + search_crit.join('+OR+');
			} else {
				search = '&text=' + search_crit;
			}
			return 'http://api.flickr.com/services/rest/?format=json&method=flickr.photos.search&extra=owner_name&per_page=100&sort=relevance' + search + '&api_key=' + controller.settings.flickr.APIKey + '&page=' + page_number;
		},
		flickrUserPhotos: function(user_id, page_number) {
			return 'http://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=' + controller.settings.flickr.APIKey + '&user_id=' + user_id + '&per_page=100&format=json&page=' + page_number
		}
	},
	spinner: {},
	init: function() {
		controller.spinner = $('<img/>');
		controller.spinner.attr('src', '/wp-content/themes/cyncyn/images2/ajax-loader.gif').attr('alt','spinner').attr('id','ajax-loader');
	},
	settings: {
		flickr: {
			APIKey: 'e7af5967b6f94809cd2670bfb1418559',
			userID: '52749625%40N02'
		}
	},
	showPhotos: function(search_type, search_crit, page_number) {		
		var api_call_script;
		
		if (page_number == undefined) {
			page_number = 1;
		}
		
		if (search_type == 'last') {
			search_type = controller.lastSearch.type;
			search_crit = controller.lastSearch.criteria;
		}
		
		if (search_type == 'text') {
			api_call_script = controller.urls.flickrTextSearch(search_crit, page_number);
		} else if (search_type == 'owner') {
			api_call_script = controller.urls.flickrUserPhotos(search_crit, page_number);
		} else {
			return;
		}
		
		controller.lastSearch = {type: search_type, criteria: search_crit, url: api_call_script, page: page_number};
		
		controller.addSpinner();
		$('head').append('<script id="flickAPIScript" src="' + api_call_script + '"></script>');
	},
	showVideos: function(action, search_crit) {
		var search = search_crit.join('+');
		var api_call_script = '';
		if (action == 'search') {
		  api_call_script = 'http://gdata.youtube.com/feeds/api/videos?q=' + search + '&v=2&alt=jsonc&callback=youtubeSearchCallback';
		} else {
			api_call_script = 'http://gdata.youtube.com/feeds/api/playlists/5732BE03B5F28E24?v=2&alt=jsonc&orderby=position&callback=youtubeSearchCallback';
		}
		controller.addSpinner();
		$('head').append('<script id="youtubeAPIScript" src="' + api_call_script + '"></script>');
	},
	error: function(msg) {
		alert("ERROR:\n" + msg);
	},
	addSpinner: function() {
		$('.entry-content').css({'text-align':'center'}).html(controller.spinner).append('<h2>Loading...</h2>');
	},
	audioPlayback: function() {
		//console.log(arguments.join(', '));
	},
	gaEvent: function(event) {
		if (pageTracker && pageTracker._trackPageview && typeof pageTracker._trackPageview == 'function') {
			if (typeOf(event) == 'array') {
				event = event.join('/');
			}
			pageTracker._trackPageview(event);
		}
	},
	pullCalendar: function() {
		var api_call_script = 'http://www.google.com/calendar/feeds/cyncyn.www%40gmail.com/public/full?alt=json-in-script&callback=controller.displayCalendar&orderby=starttime&max-results=15&singleevents=true&sortorder=ascending&futureevents=true';
		controller.addSpinner();
		$('head').append('<script id="gCalAPIScript" src="' + api_call_script + '"></script>');
	},
	displayCalendar: function(cal) {
		var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];		
		$('#gCalAPIScript').remove();
		$('.calendarPage').remove();
		
		//console.log(cal);
		
		if (!cal.feed) {
			controller.displayError('No Calendar Feed', 'The Google calendar feed appears to be broken currently.  Please try again later');
			return false;
		}
		
		var entry_content = $('.entry-content');
		var cal_entries = $('<ul/>');
		
		cal_entries.addClass('calendar-entries');
		
		entry_content.html('').css({'text-align':'left'}).prepend(cal_entries);
		
		var clrfx = '<div class="clearfix underline"></div>';
		
		var items = cal.feed.entry;
		for (var i = 0; i < items.length; i++) {
			var item = toSimpleEventObj(items[i]);
			var minutes = item.when.getMinutes();
			var hours = item.when.getHours();
			var ampm = 'am';
			if (hours == 12) {
				ampm = 'pm';
			} else if (hours > 12) {
				ampm = 'pm';	
				hours -= 12;
			} else if (hours == 0) {
				hours = 12;
			}
			if (minutes < 10) { minutes = "0" + minutes; }
			var timestamp = months[item.when.getMonth()] + ' ' + item.when.getDate() + ', ' + item.when.getFullYear() + ' @ ' + hours  + ':' + minutes + ampm; 
			var entry = $('<li/>');
			entry.append('<h2>' + item.title+ '</h2>');
			entry.append('<div class="lf label"><strong>When:</strong></div><div class="lf the-when">' + timestamp + '</div>' + clrfx);
			entry.append('<div class="lf label"><strong>Where:</strong></div><div class="lf the-where">' + item.where + ' <a href="http://maps.google.com/maps?q=' + escape(item.address) + '" rel="map" target="_blank" class="map"><img src="/images/mapIcon.png" width="16" height="16" alt="map" /></a></div>' + clrfx);
			entry.append('<div class="lf label"><strong>Details:</strong></div><div class="lf the-details">' + item.details+ '</div>' + clrfx);
 			entry.append('<div class="lf label"><strong>Calendar:</strong></div><div class="lf"><a href="' + item.url + '" target="_blank">View in Google Calendar</a></div>' + clrfx);
			cal_entries.append(entry);
		}
		
		//$('a[rel=map]').fancybox({
		//	'transitionIn'	:	'fade',
		//	'transitionOut'	:	'fade',
		//	'speedIn'		    :	600, 
		//	'speedOut'      :	200,
		//	'width'         : 800,
		//	'height'        : 600,
		//	'type'					: 'iframe'
		//});
	},
	displayError: function(err_title, err_content) {
		var entry_content = $('.entry-content');
		var h = $('<h2/>');
		var c = $('<div/>');
		
		h.innerHTML(err_title);
		c.innerHTML(err_content).prepend(h);
		entry_content.html('').append(c);
	},
	log: function(obj) {
		if (console && console.log) {
			console.log(obj);
		}
	}
} // controller

function toSimpleEventObj(e) {
	var where = e.gd$where[0].valueString;
	var address = where;
	if (address.match(/(\d+.+?)$/g)) {
		address = address.replace(/^.*?(\d+.+?)$/g, '$1');
	}
	var details = e.content.$t.replace(/[\r\n]/g, '<br/>');
	var when = DateFromIso8601(e.gd$when[0].startTime);
	var title = e.title.$t;
	var url = e.link[0].href;
	
	var event = {
		'where':   where,
		'address': address,
		'when':    when,
		'title':   title,
		'url':     url,
		'details': details
	};
	
	return event;
} // toSimpleEventObj()

function DateFromIso8601(s) {
  var parsed = '';
  if (parsed = s.match(new RegExp(/(\d{4})(-)?(\d{2})(-)?(\d{2})(T)?(\d{2})(:)?(\d{2})(:)?(\d{2})(\.\d+)?(Z|([+-])(\d{2})(:)?(\d{2}))?/))) {
    if (parsed[13] === 'Z') {
      var date = new Date();
      date.setUTCFullYear(parsed[1]);
      date.setUTCMonth(parseInt(parsed[3], 10) - 1);
      date.setUTCDate(parsed[5]);
      date.setUTCHours(parsed[7]);
      date.setUTCMinutes(parsed[9]);
      date.setUTCSeconds(parsed[11]);
      return date;
    } else {
      return new Date(
          parsed[1],
          parseInt(parsed[3], 10) - 1,
          parsed[5],
          parsed[7],
          parsed[9],
          parsed[11]);
    }

  } else if (parsed = s.match(new RegExp(/(\d{4})(-)?(\d{2})(-)?(\d{2})/))) {
    // Parse as just a date, no time.
    return new Date(parsed[1], parseInt(parsed[3], 10) - 1, parsed[5]);

  } else if (parsed = s.match(new RegExp(
      /(\d{1,2})(:)?(\d{2})(:)?(\d{2})(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))?/))) {
    // Parse as just a time, no date.
    var now = new Date();
    return new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate(),
        parsed[1],
        parseInt(parsed[3], 10) - 1,
        parsed[5]);

  } else {
    return null;
  }
} // DateFromIso8601()

function youtubeSearchCallback(rsp) {
	
	$('.videoPage').remove();
	$('ul.thumbs').remove();
	
	var entry_content = $('.entry-content');
	var video_list = $('<ul/>');
	
	video_list.addClass('thumbs');
	
	entry_content.html('').css({'text-align':'center'}).prepend(video_list);
	
	if (rsp.error || !rsp.data) {
		entry_content.html("<h2>YouTube is currently experiencing issues</h2><p><strong>Error:</strong> " + rsp.error.code + " : " + rsp.error.message + "<br/>Please try again later.</p>");
		$('#youtubeAPIScript').remove();
		return false;
	}
	
	var items = rsp.data.items;
	
	for (var i = 0; i < items.length; i++) {
		var vid = items[i].hasOwnProperty('video') ? items[i].video : items[i];
		var title = vid.title;
		var thumb = vid.thumbnail.sqDefault;
		var video_id = vid.id;

		var markup = '<li><a rel="gallery" class="galleryThumb youtubeThumb" href="http://www.youtube.com/v/' + video_id + '&enablejsapi=1&playerapiid=ytplayer&fs=1"><img src="' + thumb + '" title="' + title + '" alt="' + title + '" /></a></li>';
		
		video_list.append(markup);
  }
	
	
	$("a[rel=gallery]").fancybox({
		'transitionIn'		: 'fade',
		'transitionOut'		: 'fade',
		'titlePosition' 	: 'outside',
		'overlayOpacity'  : 0.8,
		'showNavArrows'   : false,
		'autoDimensions'  : true,
		'onStart'         : function(event) {
			controller.gaEvent('/youtube/' + this.href);
		},
		'titleFormat'		  : function(title, currentArray, currentIndex, currentOpts) {
			return '<span id="fancybox-title-over">Video ' + (currentIndex + 1) + ' / ' + currentArray.length + (title.length ? ' &nbsp; ' + title : '') + '</span>';
		},
		'type'            : 'swf',
		'swf'             : {
			'allowfullscreen' : true
		}
	});
	
	$('#youtubeAPIScript').remove();
} // youtubeSearchCallback()



function getPhotoThumb(thumb_url, full_url, title) {
	return '<li><a href="' + full_url + '" rel="gallery" class="galleryThumb flickrThumb"><img src="' + thumb_url + '" alt="' +  title + '" title="' + title + '" /></a></li>';
}


function flickrCallbackPre(rsp) {
	$('.photoPage').remove();
	$('ul.thumbs').remove();
	
	var photo_count = rsp.photos.photo.length;
	var page_count = rsp.photos.pages;
	
	var entry_content = $('.entry-content');
	var photo_list = $('<ul/>');
	
	photo_list.addClass('thumbs');
	
	var ownerClass = '';
	var textClass = '';
	
	if (controller.lastSearch.type == 'text') {
		ownerClass = '';
		textClass = 'active';
	} else {
		ownerClass = 'active';
		textClass = '';
	}

	var optional = "<div class=\"pageNav\"><a class=\"" + ownerClass + "\" href=\"javascript:controller.showPhotos('owner', '52749625@N02');\">Our Photos</a> | <a class=\"" + textClass + "\" href=\"javascript:controller.showPhotos('text', ['cyn-cyn','cyncyn','pons']);\">Other Photos</a></div>";
	optional += controller.lastSearch.type == 'text' ? '<div class="note">This search is based on tags other users have applied to their photos.  As a result, not all of these may be of the band.</div>' : '';
	fwd_back = [];
	if (controller.lastSearch.page > 1 || controller.lastSearch.page < page_count) {
		if (controller.lastSearch.page > 1) {
	  	fwd_back.push("<a href=\"javascript:controller.showPhotos('last', '' , " + (parseInt(controller.lastSearch.page) - 1) + ");\">&lt; Previous</a> ");
		}
		
		if (page_count > 1) {
			var pg_sel = '<select id="pageSelector">';
			for(var i = 1; i < page_count; i++) {
				pg_sel += '<option value="' + i + '"' + (i == controller.lastSearch.page ? ' selected' : '') +'>Page ' + i + '</option>';
			}
			pg_sel += '</select>';
			
			fwd_back.push(pg_sel);
		}
		
		if (controller.lastSearch.page < page_count) {
		  fwd_back.push("<a href=\"javascript:controller.showPhotos('last', '' , " + (parseInt(controller.lastSearch.page) + 1) + ");\">Next &gt;</a>");
		}
		optional += '<div class="pageNav">' + fwd_back.join(' | ') + '</div>';
	}
	
	entry_content.html('').css({'text-align':'center'}).prepend(photo_list).prepend(optional);
	
	window.location.hash = '#page-' + controller.lastSearch.page;
	
	return photo_list;
} // flickrCallbackPre()

function flickrCallbackPost() {
	$("a[rel=gallery]").fancybox({
		'transitionIn'		: 'fade',
		'onStart'  : function(event) {
			controller.gaEvent('/flickr/' + this.href);
		},
		'transitionOut'		: 'fade',
		'titlePosition' 	: 'over',
		'overlayOpacity'  : 0.6,
		'titleFormat'		: function(title, currentArray, currentIndex, currentOpts) {
			return '<span id="fancybox-title-over">Image ' + (currentIndex + 1) + ' / ' + currentArray.length + (title.length ? ' &nbsp; ' + title : '') + '</span>';
		}
	});
	
	$('#flickrAPIScript').remove();
} // flickrCallbackPost()

function jsonFlickrApi(rsp) {	
	if (rsp.stat != "ok"){
		controller.error('Flickr API call failure');
		return;
	}
	
	var photo_list = flickrCallbackPre(rsp);
	
	for (var i=0; i < rsp.photos.photo.length; i++) {
		var photo = rsp.photos.photo[ i ];
		
		var t_url = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_" + "s.jpg";
		var p_url = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg";
		
		//var markup = '<li><a href="' + p_url + '" rel="gallery" class="galleryThumb flickrThumb"><img src="' + t_url + '" alt="' +  photo.title + '" title="' + photo.title + '" /></a></li>';
		var markup = getPhotoThumb(t_url, p_url, photo.title);
		
		photo_list.append(markup);
	} // for(;;)
	
	$('#pageSelector').change(function() {
	  controller.showPhotos('last', '', $(this).val());	
	});
	
	flickrCallbackPost();
} // jsonFlickrApi()

function jsonFlickrFeed(rsp) {
	var photo_list = flickrCallbackPre();
	
	for (var i = 0; i < rsp.items.length; i++) {
		var photo = rsp.items[i];
		var url = photo.media.m;
		var t_url = url.replace(/_m/, '_t');
		var p_url = url.replace(/_m/, '');
		
		var markup = getPhotoThumb(t_url, p_url, photo.title);
		photo_list.append(markup);
	}
	
	flickrCallbackPost();
} // jsonFlickrFeed()
