
if(!Array.indexOf)
{
    Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
        return -1;
    }
}

IMG_SERVING_SIZES = [
          32, 48, 64, 72, 80, 90, 94, 104, 110, 120, 128, 144,
          150, 160, 200, 220, 288, 320, 400, 512, 576, 640, 720,
          800, 912, 1024, 1152, 1280, 1440, 1600];

IMG_SERVING_CROP_SIZES = [32, 48, 64, 72, 80, 104, 136, 144, 150, 160];

function addressDidChange(e)
{
	var current = $(currentSelector(e.value));
	$.address.title($.address.title().split(' | ')[0] + ' | ' + current.text());
	current.removeClass('selected');
}

function externalAddressDidChange(e)
{
	$(currentSelector(e.value)).click( );

	// make sure #home gets shown.  don't know why it isn't
	if(e.value === '/') $('#home').removeClass('ui-tabs-hide');
}

function postForm(e)
{
	var data = {}, fields = [], form = e.target || this, el,
		i, field, errors=false, elements = $('*[name]', form);

	elements.each(function( )
	{
		el = $(this);
		if((!el.val( ) || el.val( ) === "") && el.hasClass('required'))
		{
			el.addClass('error');
			el.val('Required field');
			errors = true;
		}
		else
		{
			el.removeClass('error');
		}

		data[el.attr('name')] = el.val( );
	});

	if(errors) return false;

	$.post(mailer_url, data, function(data)
	{
		$('.success', form).dialog({modal: true});
	});

	e.preventDefault( );
}

function initAuth( )
{
	var body = $('body');
	if(logged_in)
	{
		body.addClass("authenticated");

		if(is_admin) body.addClass('admin');

		var logout = $('<a></a>').attr('href', logout_url).
				attr('title', 'Logout').addClass('logout').text('Sign Out');
		body.prepend(logout);
	}
	else
	{
		var login = $('<a></a>').attr('href', login_url).
				attr('title', 'Login').addClass('login').text('Sign In');
		body.prepend(login);
	}

	if(headboxed_admin)
	{
		var sites = $('<a></a>').attr('href', sites_url).
				attr('title', 'Sites List').addClass('sites').text('Sites');
		body.prepend(sites);

		var edit = $('<a></a>').attr('href', edit_url).
				attr('title', 'Edit Site').addClass('edit').text('Edit');
		body.prepend(edit);

		var download = $('<a></a>').attr('href', download_url).
				attr('title', 'Download Site Zip').addClass('download').text('Download');
		body.prepend(download);
	}
}

function fromMarkdown(index)
{
	var e = $(this),
		from = content_url + e.attr('id');

	$.getJSON(from + '?format=markdown&callback=?', function(data)
	{
		var container = e;
		container.html(data);
		$('a[href^=http]', container).click(openInNewWindow);
	});

	if(is_admin)
	{
		$(this).editable(from, {type: 'textarea', 
			loadDataType: 'jsonp', loadurl: from, submit: 'OK'});
	}
}

function initContent( )
{
	$('.copy').each(fromMarkdown);
}

function didGetImageUrl(url, c)
{
	if(!url)
	{
		c.addClass('no-image');
	}
	else
	{
		var img = $('<img />'),
			width = c.width(),
			height = c.height(),
			s;

		for(var i=0; i < IMG_SERVING_SIZES.length; i++)
		{
			var size = IMG_SERVING_SIZES[i];
			if(size > width && size > height)
			{
				s = size;
				break;
			}
		}

		img.attr('src', url + '=s' + s);
		img.appendTo(c).hide();
		img[0].onload = fadeIn;
	}
}

function initImage( )
{
	var img = $(this);
	$.getJSON(content_url + img.attr('id') + '?format=url&callback=?', 
									function(d){ didGetImageUrl(d, img); });
}

function didUploadImage(id, filename, response)
{
	console.log(response);
}

function didGetBlobstoreUrl(url, c)
{
	var e = $('<div></div>').appendTo(c),
		uploader = new qq.FileUploader
		({
			element: e[0], action: url,
			onComplete: didUploadImage,
			allowedExtensions: ['jpg', 'jpeg', 'png', 'gif']
		});
}

function initImageAdmin( )
{
	var c = $(this),
		url = content_url + c.attr('id');
		blobstore_url = blobstore_generator + '?url=' + escape(url) + '&callback=?';
	$.getJSON(blobstore_url, function(d){ didGetBlobstoreUrl(d, c); });
}

function initImages( )
{
	$('.image').each(initImage);
	$('.admin .image').each(initImageAdmin);
}

function init( )
{
	initAuth( );
	initContent( );
	initImages( );
	initRandomImage( );
	initTabView( );
	initGallery( );
	initForms( );
}

function initForms( )
{
	$('form').submit(postForm);
}

function initGallery( )
{
	imageDescription = $('#image-description');
	imageTitle = $('#image-title');
	imageView = $('#image-view');
	loadingAnimation = $('#loading');
	thumbnails = $('#thumbnails');

	if(imageView.length)
	{
		imageView[0].onload = function( ){ loadingAnimation.removeClass('loading'); };
	}
}

function didGetRandomImageDetails(data)
{
	randomImage.hide( );
	randomImage.attr('src', getImageUrl(data.photo, 'original'));
}

function randomFromPhotoset(data)
{
	var index = Math.floor(Math.random( ) * data.photoset.photo.length),
		photo = data.photoset.photo[index];

	var url = "http://api.flickr.com/services/rest/?&method=flickr.photos.getInfo&api_key=" 
				+ flickrApiKey + "&photo_id=" + photo.id + "&format=json&jsoncallback=?";
	$.getJSON(url, didGetRandomImageDetails);
}

function initRandomImage( )
{
	randomImage = $('#random-image img');
	randomImage.hide( );
	if(randomImage.length)
	{
		randomImage[0].onload = fadeIn;
		getPhotoset('72157624657963344', randomFromPhotoset);
	}
}

$(document).ready(init);

function tabsSelectionDidChange(e, ui)
{
	var previous = tabView.tabs('option', 'selected'), url;
	if(ui.index === 1) selectPhotoset($(setsLinks[0]).attr('class').substr(8));
	if(ui.index === 10) url = 'http://blog.adambridgland.co.uk/';
	if(ui.index === 11) url = 'http://www.flickr.com/photos/26760790@N04';

	var galleries = [1,2,3,4,5,6];

	$('.selected').removeClass('selected');
	$('.ui-tabs-selected').removeClass('ui-tabs-selected').removeClass('ui-tabs-active');
	if(galleries.indexOf(previous) > -1 && galleries.indexOf(ui.index) > -1 && $('#images').css('display') !== 'none')
	{
		$(ui.tab).addClass('selected').parent('li').addClass('ui-tabs-selected').addClass('ui-tabs-active');
		e.preventDefault( );
	}

	if(galleries.indexOf(ui.index) > -1)
	{
		$('#images-link').addClass('selected');
	}
	else
	{
		$('#images-link').removeClass('selected');
	}

	if(ui.index === 1)
	{
		$('#first-gallery').addClass('selected');
	}

	if(url)
	{
		window.open(url, '_blank');
		return false;
	}
}

function selectHomepage(e)
{
	e.preventDefault( );
	tabView.tabs('select', '#home');
	return false;
}

function initTabView( )
{
	var fx = { };
	if(jQuery.support.opacity) fx = {opacity: 'toggle'};
	tabView = $('#body').tabs({ select: tabsSelectionDidChange, fx: fx }),
	setsLinks = $('a.gallery-link');

	setsLinks.each(function(i, item)
	{
		$(item).click(function( ){ selectPhotoset($(item).attr('class').substr(8)); });
	});

	$('#header h1 a').click(selectHomepage);

	$.address.change(addressDidChange)
			.externalChange(externalAddressDidChange)
			.history(true);
}

function getPhotoset(photoset_id, callback)
{
	var url = "http://api.flickr.com/services/rest/?&method=flickr.photosets.getPhotos&api_key=" 
				+ flickrApiKey + "&photoset_id=" + photoset_id + "&format=json&jsoncallback=?";
	$.getJSON(url, callback)
}

function clearThumbnails( )
{
	thumbnails.empty( );
}

function fadeIn( )
{
	$(this).fadeIn( );
}

function setThumbnails(photos)
{
	clearThumbnails( );

	$.each(photos, function(i, item)
	{
		var url = getImageUrl(item, 'square'),
			img = $("<img/>").attr("src", url),
			div = $("<div/>").addClass('thumbnail').addClass('photo' + item.id).append(img).appendTo("#thumbnails");

			div.bind('click', item, function(evt)
			{
				selectImage(evt.data.id);
			});

			img.css('display', 'none');
			img[0].onload = fadeIn;
	});
}

function setPhotoset(photoset_id)
{
	var photoset = store[photoset_id];
	currentPhotoset = photoset;
	selectImage(photoset.photo[0].id);
	setThumbnails(photoset.photo);
}

function didGetPhotoset(data)
{
	$.each(data.photoset.photo, function(i, item)
	{
		store[item.id] = item;
	});

	store[data.photoset.id] = data.photoset;
	setPhotoset(data.photoset.id);
}

function selectPhotoset(photoset_id)
{
	var photoset = store[photoset_id];
	clearThumbnails( );
	if(photoset) return setPhotoset(photoset_id);
	getPhotoset(photoset_id, didGetPhotoset);
}

function selectImage(photo_id)
{
	if(currentImage && photo_id !== currentImage.id)
	{
		loadingAnimation.addClass('loading')
				.css('top', imageView.height( )/2)
				.css('left', imageView.width( )/2);
	}
	$('.thumbnail').removeClass('selected');
	$('.photo' + photo_id).addClass('selected');
	currentImage = store[photo_id]
	setImage(photo_id);
	setImageDetails(photo_id);
}

function didGetImageDetails(data)
{
	imageTitle.html(data.photo.title._content);
	imageDescription.html(data.photo.description._content.replace(/\n/g, '<br />'));
	$('a', imageDescription).click(openInNewWindow);
}

function getImageUrl(photo, size)
{
	var url = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_";

	if(size === 'original') return url + photo.originalsecret + "_o.jpg";

	url += photo.secret;
	if(size === 'square') 
	{
		return thumbnailer + '?url=' + url + ".jpg";
	}
	if(size === 'small') return url + "_t.jpg";
	if(size === 'large') return url + "_b.jpg";
	return url + ".jpg"
}

function getImageDetails(photo_id, callback)
{
	var url = "http://api.flickr.com/services/rest/?&method=flickr.photos.getInfo&api_key=" 
				+ flickrApiKey + "&photo_id=" + photo_id + "&format=json&jsoncallback=?";
	$.getJSON(url, callback)
}

function setImageDetails(photo_id)
{
	getImageDetails(photo_id, didGetImageDetails);
}

function setImage(photo_id)
{
	var photo = store[photo_id];
	imageView.attr('src', getImageUrl(photo, 'medium'));
}

function openInNewWindow(e)
{
	e.preventDefault(); 
	window.open(this.href, '_blank');
}



