// Lokalt skop for all funksjonalitet på z-it.no
var Z = (function () {
	var pub = {};
	
	var activeProject = null;
	
	// Zoom-størrelser er ca. 2.2x av normale og 5.8x av små bilder
	var zoomWidth = 658,
		zoomHeight = 327;
		
	/**
	 * Setter opp zoom/lukk-ikoner for et prosjekt. Lukke-ikonet skjules umiddelbart.
	 * @public
	 * @static
	 * @scope Element<li> for prosjektet.
	 */
	pub.initZoom = function () {
		$(this)
			// Opprett img-elementer med ikoner
			.append('<img class="zoom" src="img/ikon_zoom.png" alt="Vis større skjermklipp" />')
			.append('<img class="close" src="img/ikon_lukk.png" alt="Lukk stort skjermklipp" />')
			// Skjul lukke-ikonet umiddelbart
			.children('img.close').css('display', 'none');
		
		// Fiks gjennomsiktighet for Explorer som ikke støtter det native
		if (!$.support.opacity) {
			$(this).children('img.close, img.zoom').css('opacity', '0.4');
		}
	}

	/**
	 * Zoomer et prosjekt-skjermklipp inn eller ut, avhengig av hvilken tilstand det er i for øyeblikket.
	 * @public
	 * @static
	 * @scope Element<img> med prosjekt-skjermklipp.
	 */
	pub.toggleZoom = function () {
		if (activeProject != null && activeProject != this) return;
	
		// jQuery-objekter for prosjekt- og skjermklipp-elementer
		var project = $(this),
			img = project.find('img[src*=img/portfolio]');
		
		// Les inn faktisk bredde på skjermklippet for øyeblikket
		var width = parseInt(img.css('width')),
			isSmall = project.hasClass('small');

		// Definér normalbredde og -høyde
		var baseWidth = (isSmall ? 118 : 298),
			baseHeight = (isSmall ? 58 : 148);

		var isZoomed = (width != baseWidth);
		
		// Variabler for ny posisjon og størrelse på bildet
		var xPos = 0, yPos = 0,
			newWidth = (isZoomed ? baseWidth : zoomWidth),
			newHeight = (isZoomed ? baseHeight : zoomHeight);
		
		if (!isZoomed) {
			$().add(project).add(img).css('z-index', '1');
			
			// Små bilder må få justert venstreposisjon ut i fra kolonnen de står i
			if (project.hasClass('small')) {
				// Finner antallet prosjekter bakover til nærmeste separator, altså kolonnen for dette prosjektet
				var index = project.prevAll().index(project.prevAll('li.separator:first').eq(0));
				xPos = -(180 * index);
			}
			else if (project.next().hasClass('separator')) {
				// Bilder som står i høyrekolonnen (rett før separator) skal skyves mot venstre også
				xPos = -360;
			}
			
			// Bilder som ikke er på første rad skal flyttes oppover også
			if (project.prevAll().length > 2) {
				yPos = -(newHeight - baseHeight);
				// Sjekk om det er plass til ny vertikal posisjonering (ikke går utenfor topp av vindu)
				if ($(document).scrollTop() > (img.offset().top + yPos)) {
					yPos = 0;
				}
			}
		
			project.children('img.close').css({left: 636 + xPos, top: 305 + yPos});
			
			activeProject = this;
		}
		else {
			project.children('img.close').css('display', 'none');
			
			activeProject = null;
		}
		
		var animProps = {
			width: newWidth,
			height: newHeight,
			left: xPos,
			top: yPos
		};
		
		img.animate(animProps, 200, 'swing', function () {
			if (isZoomed) {
				$().add(project).add(img).css('z-index', 0);
			}
			else {
				project.children('img.close').css({display: 'block', opacity: 0.8});
			}
		});

		var cssProps = {opacity: (isZoomed ? '1.0' : '0.4')};
		if (isZoomed && !$.support.opacity) {
			// Slå av alpha-filter helt for Explorer etter gjenoppretting opacity til 1.0
			cssProps.filter = "alpha(enabled='false')";
		}
		project.siblings().css(cssProps);
	};

	/**
	 * Belyser zoom-/lukkeikon avhengig av hvilken tilstand skjermklippet er i når musepekeren er over det.
	 * @public
	 * @static
	 * @scope Element<img> med ikon eller prosjekt-skjermklipp innenfor prosjektets LI.
	 */
	pub.highlightZoom = function () {
		var project = $(this).closest('li');
		
		if (activeProject == null) {
			project.children('img.zoom').css('opacity', '0.8');
		}
		else if (activeProject == project.get(0)) {
			project.children('img.close').css('opacity', '0.8');
		}
	}
	
	/**
	 * Dimmer zoom-/lukkeikon.
	 * @public
	 * @static
	 * @scope Element<img> med ikon eller prosjekt-skjermklipp innenfor prosjektets LI.
	 */
	pub.dimZoom = function () {
		$(this).closest('li').children('img.zoom, img.close').css('opacity', '0.4');
	}
	
	pub.hasActiveProject = function () {
		return (activeProject != null);
	}
	
	return pub;
})();

// ---

$(document).ready(function () {
	$('ul.projects li:not([class=separator])')
		// Legg til ikoner på prosjekter
		.each(Z.initZoom)
		// Knytt opp klikk-lyttere på prosjekter
		.click(function (e) {
			if ($(e.target).is('img')) {
				e.preventDefault();
				Z.toggleZoom.call(this);
			}
			else if ($(e.target).is('a') && Z.hasActiveProject()) {
				e.preventDefault();
			}
		})
		// Knytt opp over/utenfor-lyttere for skjermklipp og ikoner for prosjekter
		.find('img').hover(Z.highlightZoom, Z.dimZoom);
});
