function KR() {}

// Constants
KR.imageBase = "images/";
KR.pImageBase = KR.imageBase + "portfolio/";
KR.pImagePrefix = "";
KR.pImageSuffix = "/thumb.jpg";

KR.portfolioInfoUrl = "active/portfolioinfo.js";
KR.feedUrl = "active/feed.php";

KR.SECTION = {
	MAIN:"main",
	PORTFOLIO:"portfolio"
};

KR.fetchFeed = function() {
	
	function transformDate(atomDate) {
		var shortDate = atomDate.replace(/T.*/gi,'');
		var month = shortDate.replace(/\d\d\d\d-/, '').replace(/-\d\d/, '');
		var day = shortDate.replace(/.*-/, '');
		var year = shortDate.replace(/-.*/, '').replace(/20/,'');
		return month + "." + day + "." + year;
	}
	
	jQuery.getFeed({
		url: KR.feedUrl,
		success: function(feed) {
			$("#blog-content-area").empty();
			
			var itemsAdded = 0;
			
			for (var i in feed.items) {
				if (feed.items.hasOwnProperty(i)) {
					if (itemsAdded < 3) {
						var item = feed.items[i];
						
						if (item.isDotCom) {
							var text = item.description.replace(/<\/?[^>]+>/gi, '');
							
							var formattedDate = transformDate(item.updated);
							
							$("#blog-content-area")
								.append($("<a/>").attr("href", item.link).addClass("redLink")
								.append(formattedDate)).append($("<br/>"))
								.append(text).append($("<br/><br/>"));
							itemsAdded++;
						}
					} else {
						break;
					}
				}
			}
			
			$("#blog-content-area").append(
				$("<a/>").attr("href", "http://www.kristinroyer.blogspot.com")
					.append($("<img/>").attr("src", "images/more.jpg").addClass("noStyle"))
			);
		}
	});
};

KR.ImagePreloader = function() {
	var loadedUrls = [];
	
	this.preload = function(url) {
		for (var i = 0; i < loadedUrls.length; i++) {
			if (loadedUrls[i] === url) {
				return;
			}
		}
		var img = new Image();
		img.src = url;
		loadedUrls.push(url);
	};
};

KR.PortfolioImage = function(entryNumber, fileName) {
	this.link = function() {
		return KR.pImageBase + entryNumber + "/" + fileName;
	};
	
	this.fileName = function() {
		return fileName;
	};
};

KR.PortfolioEntry = function(data) {
	this.images = [];
	
	for (var i = 0; i < data.images.length; i++) {
		this.images.push(new KR.PortfolioImage(data.order, data.images[i]));
	}
	
	this.order = function() {
		return data.order;
	};
	
	this.number = function() {
		return data.order;
	};
	
	this.title = function() {
		return data.title;
	};
	
	this.imageCount = function() {
		return this.images.length;
	};
	
	this.image = function(index) {
		return this.images[index];
	};
	
	this.firstImage = function() {
		return this.images[0];
	};
	
	this.eachImage = function(func, skipFirst) {
		for (var i = 0; i < this.images.length; i++) {
			func.apply(this.images[i], [this.images[i], i+1]);
		}
	};
	
	this.thumbLink = function() {
		return KR.pImageBase + KR.pImagePrefix + this.order() + KR.pImageSuffix;
	};
};

KR.Portfolio = function (json) {
	var data = json.portfolio;
	var entries = [];
	
	for (var i = 0; i < data.length; i++) {
		entries.push(new KR.PortfolioEntry(data[i]));
	}
	
	this.length = function() {
		return entries.length;
	};
	
	this.entry = function(orderNumber) {
		// Use actual entry number for find, not index
		for (var i = 0; i < entries.length; i++) {
			if (entries[i].order() === orderNumber) {
				return entries[i];
			}
		}
		return null;
	};
	
	// Iterate over portfolio entries in order, executing function on the entry
	this.each = function(func) {
		for (var i = 0; i < entries.length; i++) {
			if (func.call(entries[i], entries[i]) === false) {
				break;
			}
		}
	};
	
	this.slice = function(start, end) {
		// TODO: fix this hack to adjust 1 to 0 based
		start = start - 1;
		end = end - 1;
		var sliceEntries = [];
		for (var i = start; i < end; i++) {
			if (entries[i]) {
				sliceEntries.push(entries[i]);
			}
		}
		return sliceEntries;
	};
};

KR.PortfolioThumbsDisplay = function(portfolio) {
	var that = this;
	this.imageClickFunction = null;
	
	var thumbsContainer = $("#portfolio-thumbs");
	var backButton = $("#portfolio-back-button");
	var moreButton = $("#portfolio-more-button");
	var columns = 4;
	var rows = 3;
	var totalThumbsCount = columns * rows;
	var startingNumber = null;
	
	function hideButtons() {
		backButton.css("display", "none");
		moreButton.css("display", "none");
	}
	
	function hideThumbs(callback) {
		thumbsContainer.find(".pImage").each(function() {
			$(this).fadeOut(500, callback);
		});
	}
	
	this.render = function(newStartingNumber, animate) {
		startingNumber = newStartingNumber || 1;
		animate = animate === false ? false : true;
		
		hideButtons();
		thumbsContainer.empty();
		for (var i = 0; i < rows; i++) {
			var row = $("<div/>").addClass("pImageRow");
			
			var firstIndex = startingNumber + (i * columns);
			var lastIndex = firstIndex + columns;
			var rowEntries = portfolio.slice(firstIndex, lastIndex);
			for (var j = 0; j < rowEntries.length; j++) {
				var entry = rowEntries[j];
				var image = $("<img/>")
					.attr("src", KR.pImageBase + KR.pImagePrefix + entry.number() + KR.pImageSuffix)
					.attr("id", "pImage" + entry.number())
					.addClass("pImage")
					.css("display", "none");
				
				// Have an image click call the imageClickFunction, if set
				if (that.imageClickFunction) {
					image.click((function(entryNumber) {
						return function() {
							that.imageClickFunction.call(image, entryNumber);
						};
					})(entry.number()));
				}
				
				row.append(image);
			}
			thumbsContainer.append(row);
		}
		
		if (animate) {
			var speed = 100;
			thumbsContainer.find(".pImage").each(function() {
				$(this).fadeIn(speed);
				speed = speed + 100;
			});
		} else {
			thumbsContainer.find(".pImage").show();
		}
		
		if (startingNumber > 1) {
			backButton.fadeIn(750);
		}

		var highestDisplayed = startingNumber + (rows * columns) - 1;
		if (highestDisplayed < portfolio.length()) {
			moreButton.fadeIn(750);
		}
	};
	
	backButton.click(function() {
		hideButtons();
		var newStartingNumber = startingNumber - totalThumbsCount;
		newStartingNumber = (newStartingNumber > 0) ? newStartingNumber : 1;
		hideThumbs(function() {
			that.render(newStartingNumber);
		});
	});
	
	moreButton.click(function() {
		hideButtons();
		var newStartingNumber = startingNumber + totalThumbsCount;
		// TODO: check to make sure it doesn't exceed total number
		hideThumbs(function() {
			that.render(newStartingNumber);
		});
	});
};

KR.FancyPortfolioDisplay = function(portfolio) {
	var that = this;
	
	var preloader = new KR.ImagePreloader();
	
	var displayedEntry = null;
	var animating = false;
	
	var imageHolder1 = $("#big-portfolio-current-image-holder1");
	var imageHolder2 = $("#big-portfolio-current-image-holder2");
	
	var caption = $("#big-porfolio-current-image-caption");
	
	var backLinkArea = $("#big-portfolio-back-link-area");
	var forwardLinkArea = $("#big-portfolio-forward-link-area");
	
	var imagePicker = $("#big-portfolio-image-picker");
	
	backLinkArea.hover(function() {$(this).addClass("over")}, function() {$(this).removeClass("over")});
	forwardLinkArea.hover(function() {$(this).addClass("over")}, function() {$(this).removeClass("over")});
	
	function getPreviousEntry() {
		if (displayedEntry) {
			return portfolio.entry(displayedEntry.number() - 1);
		}
	}
	
	function getNextEntry() {	
		if (displayedEntry) {
			return portfolio.entry(displayedEntry.number() + 1);
		}
	}
	
	backLinkArea.click(function() {
		if (getPreviousEntry()) {
			that.openEntry(getPreviousEntry().number());
		}
	});
	forwardLinkArea.click(function() {
		if (getNextEntry()) {
			that.openEntry(getNextEntry().number());
		}
	});
	
	function getActiveImageHolder() {
		if (imageHolder2.find("img").size() > 0) {
			return imageHolder2;
		}
		return imageHolder1;
	}
	
	function getInactiveImageHolder() {
		if (getActiveImageHolder().attr("id") === "big-portfolio-current-image-holder1") {
			return imageHolder2;
		} else {
			return imageHolder1;
		}
	}
	
	function showButtons() {
		backLinkArea.empty();
		forwardLinkArea.empty();
		
		if (getPreviousEntry()) {
			backLinkArea.append($("<img/>").attr("src", getPreviousEntry().thumbLink()))
				.append($("<div/>").text("previous")).fadeIn(250);
		}
		if (getNextEntry()) {
			forwardLinkArea.append($("<img/>").attr("src", getNextEntry().thumbLink()))
				.append($("<div/>").text("next")).fadeIn(250);
		}
	}
	
	function hideButtons(callback) {
		backLinkArea.fadeOut(250, callback);
		forwardLinkArea.fadeOut(250);
		imagePicker.fadeOut(250);
		caption.fadeOut(250);
	}
	
	function updatePicker() {
		if (!displayedEntry) {
			return;
		}
		
		var currentImagePath = getActiveImageHolder().find("img").attr("src");
		var currentFileName = currentImagePath.substring(currentImagePath.lastIndexOf("/") + 1);
		
		imagePicker.empty();
		
		if (displayedEntry.imageCount() < 2) {
			return;
		}
		
		for (var i = 0; i < displayedEntry.images.length; i++) {
			var image = displayedEntry.images[i];
			var pick = $("<span/>").text(i + 1);
			if (image.fileName() === currentFileName) {
				pick.addClass("pickerNumberCurrent");
			} else {
				pick.hover(function() {$(this).addClass("over")}, function() {$(this).removeClass("over")});
				pick.click((function(theImage) {
					return function() {
						switchImage(theImage);
					};
				})(image));
			}
			imagePicker.append(pick);
			if (i < displayedEntry.images.length - 1) {
				imagePicker.append("|");
			}
		}
		imagePicker.fadeIn(250);
	}
	
	function switchImage(image) {
		getActiveImageHolder().find("img").attr("src", image.link());
		updatePicker();
	}
	
	function showCaption() {
		if (displayedEntry) {
			caption.html(displayedEntry.title());
			caption.fadeIn(250);
		}
	}
	
	this.openEntry = function(number) {
		if (animating) {
			return;
		}
		
		var newEntry = portfolio.entry(number);
		var url = newEntry.firstImage().link();
		
		if (!displayedEntry) {
			// If first opening, just show the image without any animation
			imageHolder1.empty().append($("<img/>").attr("src", url));
			displayedEntry = newEntry;
			showButtons();
			updatePicker();
			showCaption();
		} else {
			animating = true;
			if (newEntry.number() !== displayedEntry.number()) {
				var oldImageToPosition = (newEntry.number() > displayedEntry.number()) ? "-1000" : "1000";
				var newImageFromPosition = (newEntry.number() > displayedEntry.number()) ? "1000" : "-1000";
				
				displayedEntry = newEntry;
				
				hideButtons(function() {
					var oldHolder = getActiveImageHolder();
					oldHolder.find("img").animate({left:oldImageToPosition}, 1000, "swing",
						function(){
							oldHolder.find("img").remove();
							showButtons();
							updatePicker();
							showCaption();
							animating = false;
						}
					);

					var newHolder = getInactiveImageHolder();
					var newImage = $("<img/>").attr("src", url).css("left", newImageFromPosition);
					newHolder.empty().append(newImage);
					newImage.animate({left:"0"}, {duration:1000, easing:"swing"});
				});
			} else {
				// TODO: if it's the current entry, just make sure it's visible
				animating = false;
			}
		}
		
		// Preload adjacent images
		if (preloader) {
			var previous = getPreviousEntry();
			var next = getNextEntry();
			if (previous) {
				preloader.preload(previous.firstImage().link());
			}
			if (next) {
				preloader.preload(next.firstImage().link());
			}
		}
	};
};

KR.LyteBoxManager = function(portfolio) {
	this.openEntry = function(number) {
		var entry = portfolio.entry(number);
		$("#lbLinks").empty();
		
		entry.eachImage(function(image) {
			$("#lbLinks").append($("<a/>")
				.attr("href", image.link())
				.attr("title", entry.title())
				.attr("rel", "lytebox[port]"));
		});
		myLytebox.updateLyteboxItems();
		var link = document.createElement('a');
		link.href = entry.firstImage().link();
		link.title = entry.title();
		link.rel = "lytebox[port]";
		myLytebox.start(link);
	};
};

KR.Site = function() {
	var wholePage = $("#all-content");
	var portfolioSection = $("#big-portfolio-section");
	
	var currentSection = KR.SECTION.MAIN;
	
	
	this.getCurrentSection = function() {
		return currentSection;
	};
	
	this.setCurrentSection = function(newSection) {
		if (newSection !== currentSection) {
			if (newSection === KR.SECTION.PORTFOLIO) {
				wholePage.animate({top:"-560px"}, 1500, "swing");
				portfolioSection.fadeIn(1500);
				currentSection = newSection;
			} else if (newSection === KR.SECTION.MAIN) {
				wholePage.animate({top:"0px"}, 1500, "swing");
				portfolioSection.fadeOut(1500);
				currentSection = newSection;
			}
		}
	};
};

KR.initialize = function() {
	var site = new KR.Site();
	$.getJSON(KR.portfolioInfoUrl,
		function(data) {
			var pf = new KR.Portfolio(data);
			var ptd = new KR.PortfolioThumbsDisplay(pf);
			var fpd = new KR.FancyPortfolioDisplay(pf);
			var lbm = new KR.LyteBoxManager(pf);
			
			ptd.imageClickFunction =
				// IE cannot handle the fancy JavaScript, fall back on LyteBox
				$.browser.msie ?
					function(imageNumber) { lbm.openEntry(imageNumber); }
					:
					function(imageNumber) {
						fpd.openEntry(imageNumber);
						site.setCurrentSection(KR.SECTION.PORTFOLIO);
					};
			ptd.render();
		});
	
	$("#big-porfolio-back-to-main-link").click(function() {
		site.setCurrentSection(KR.SECTION.MAIN);
	});
	
	KR.fetchFeed();
};