function intImageViewer(vwrImgs) {
	
	var dragElWin = $('viewer');
	var dragEl = $('viewerImages');
	var dragElCont = $('viewerImagesContainer');
	var mskLft = $('maskLeft');
	var mskRgt = $('maskRight');
	var mskLftBG = $('maskLeftBG');
	var mskRgtBG = $('maskRightBG');
	var loadProg = $('loadProgress');
	var loadProgBar = $('loadProgressBar');
	var captionCont = $('containerLowerLeft');
	var controlsCont = $('containerLowerRight');
	
	var resizeTimeout;
	var winSize;
	var winCenter;
	var aptWid = 680;
	var mskOffset = 0;
	var winWid = 0;
	var dragElSize;
	var dragElWid = 0;
	var dragElX = 0;
	var dragElContX = 0;
	var dragElContWid = 0;
	var fstHlfWid = 0;
	var lstHlfWid = 0;
	var imgLoadIndex = 0;
	var imgLoaded;
	var currPrjIndex = vwrImgs[0][0];
	var prevPrjIndex = vwrImgs[0][0];
	var currImgIndex = 0;
	var totalImgs = vwrImgs.length;
	var imgsLoaded = false;
	var imgXs = new Array();
	
	
	function showCaption() {
		var caption = $('caption' + currImgIndex);
		caption.fade('in');
	}
	function removeCaption() {
		var caption = $('caption' + currImgIndex);
		caption.fade('out');
	}
	
	// DRAG METHODS
	document.ondragstart = function() {
		return false;
	};
	var dragEldrag;
	var maxTwnDest = 0;
	var prevXPos = '0px';
	var currXPos = '0px';
	var distance = 0;
	var duration = 0;
	var tweenDistance = 0;
	var tweenDestination = 0;
	var dragFxTween = new Fx.Tween(dragEl, {fps: 60, link: 'cancel', duration: 1250, transition: 'quad:out', onComplete: showCaption, onStart: removeCaption});
	dragEl.addEvent('mousedown', function() {
		dragFxTween.cancel();
	});
	function getNearestNumberIndex(refArray, refNum) {
		if ((l = refArray.length) < 2) {
			return l - 1;
		}
		for (var l, p = Math.abs(refArray[--l] - refNum); l--;) {
			if (p < (p = Math.abs(refArray[l] - refNum))) {
				break;
			}
		}
		return l + 1;
	}
	function defineCurrImgIndex(refNum) {
		for (var i = 0; i < totalImgs; i++) {
			if (vwrImgs[i][4] == refNum) {
				currImgIndex = i;
				break;
			}
		}
	}
	dragEl.setStyle('left', currXPos);
	function initDrag() {
		dragEldrag = new Drag.Move(dragEl, {
			modifiers:{x:'left', y:''},
			container: dragElCont,
			onStart: function(el) {
				removeCaption();
				initDragElFxTween.cancel();
				dragFxTween.cancel();
				currXPos = (dragEl.getStyle('left')).toInt();
				distance = 0;
				duration = 0;
				tweenDistance = 0;
			},
			onDrag: function(el) {
				duration++;
			},
			onComplete: function(el) {
				prevXPos = currXPos;
				currXPos = (dragEl.getStyle('left')).toInt();
				if (currXPos > prevXPos) {
					distance = currXPos - prevXPos;
					tweenDistance = ((distance / duration) * 20).toInt() - 50;
					tweenDestination = currXPos + tweenDistance;
					if (tweenDestination > maxTwnDest) {
						tweenDestination = maxTwnDest;
					}
				} else {
					distance = prevXPos - currXPos;
					tweenDistance = ((distance / duration) * 20).toInt() - 50;
					tweenDestination = currXPos - tweenDistance;
					if (tweenDestination < 1) {
						tweenDestination = 0;
					}
				}
				var destIndex = getNearestNumberIndex(imgXs, tweenDestination);
				tweenDestination = imgXs[destIndex];
				defineCurrImgIndex(tweenDestination);
				dragFxTween.start('left', tweenDestination + 'px');
			}
		});
		dragEl.setStyle('cursor', 'move');
	}
	
	
	// WINDOW RESIZE METHODS
	winSize = dragElWin.getSize();
	mskOffset = 0 - (1000 - Math.ceil((winSize.x - aptWid) / 2));
	mskLft.setStyle('left', mskOffset + 'px');
	mskRgt.setStyle('right', mskOffset + 'px');
	var reformatFxTween = new Fx.Tween(dragElCont, {fps: 60, link: 'cancel', duration: 1250, transition: 'quad:out'});
	var mskLftFxTween = new Fx.Tween(mskLft, {fps: 60, link: 'cancel', duration: 950, transition: 'quad:out'});
	var mskRgtFxTween = new Fx.Tween(mskRgt, {fps: 60, link: 'cancel', duration: 950, transition: 'quad:out'});
	function prepareResize() {
		$clear(resizeTimeout); 
		resizeTimeout = executeResize.delay(500);
	}
	function executeResize() {
		winSize = dragElWin.getSize();
		winHalfSize = Math.ceil(winSize.x / 2);
		reformatViewer();
		reformatMasks();
	}
	function reformatMasks() {
		mskOffset = 0 - (1000 - Math.ceil((winSize.x - aptWid) / 2));
		mskLftFxTween.start('left', mskOffset + 'px');
		mskRgtFxTween.start('right', mskOffset + 'px');
	}
	function reformatViewer() {
		reformatFxTween.cancel();
		winSize = dragElWin.getSize();
		winWid = winSize.x;
		dragElContX = 0 - (dragElWid - (lstHlfWid + Math.ceil(winWid / 2)));
		reformatFxTween.start('left', dragElContX + 'px');
	}
	
	
	// IMAGE LOAD METHODS
	var initDragElContFxTween = new Fx.Tween(dragElCont, {fps: 60, link: 'cancel', duration: 750, transition: 'quad:out'});
	var initDragElFxTween = new Fx.Tween(dragEl, {fps: 60, link: 'cancel', duration: totalImgs * 100, transition: 'quad:out', onComplete: imagesReady});
	function loadImage() {
		var imgTitle = '';
		if (vwrImgs[imgLoadIndex][2].length > 0) {
			imgTitle = vwrImgs[imgLoadIndex][2];
			if (vwrImgs[imgLoadIndex][3].length > 0) {
				imgTitle = imgTitle + ' | ' + vwrImgs[imgLoadIndex][3];
			}
		}
		var vwrImg = new Asset.image(vwrImgs[imgLoadIndex][1], {title: imgTitle, onload: insertImage});
		imgLoaded = vwrImg;
	}
	function insertImage() {
		var tempDragElContWid = dragElContWid + 690 + 90;
		dragElCont.setStyle('width', tempDragElContWid + 'px');
		currPrjIndex = (vwrImgs[imgLoadIndex][0]).toInt();
		if (currPrjIndex != prevPrjIndex) {
			var newEl = new Element('li', {id: 'projectEnd' + currPrjIndex, 'class': 'projectEnd'});
			newEl.inject(dragEl, 'bottom');
			prevPrjIndex = currPrjIndex;
			dragElWid += 90;
		}
		var newEl = new Element('li', {'id': 'vwrImg' + imgLoadIndex});
		newEl.inject(dragEl, 'bottom');
		imgLoaded.inject(newEl, 'bottom');
		imgLoaded.fade('hide');
		var totalImageSize = newEl.getSize();
		if (imgLoadIndex == 0) {
			fstHlfWid = Math.ceil(totalImageSize.x / 2);
		}
		lstHlfWid = Math.ceil(totalImageSize.x / 2);
		vwrImgs[imgLoadIndex][4] = dragElWid + lstHlfWid;
		dragElSize = dragEl.getSize();
		dragElWid = dragElSize.x;
		dragElContWid = (dragElWid * 2) - (fstHlfWid + lstHlfWid);
		dragElCont.setStyle('width', dragElContWid + 'px');
		advanceLoadBar();
		imgLoadIndex++;
		imgLoaded.fade('in');
		winSize = dragElWin.getSize();
		winWid = winSize.x;
		dragElContX = 0 - (dragElWid - (lstHlfWid + Math.ceil(winWid / 2)));
		initDragElContFxTween.start('left', dragElContX + 'px');
		if (imgLoadIndex < totalImgs) {
			loadImage();
		} else {
			fadeOutLoadBar();
			dragElX = dragElContWid - dragElWid;
			initDragElFxTween.start('left', dragElX + 'px');
			maxTwnDest = dragElContWid - dragElWid;
			defineImgXValues();
			injectCaptions();
		}
	}
	function defineImgXValues() {
		for (var i = 0; i < totalImgs; i++) {
			var imgX = dragElContWid - dragElWid + fstHlfWid - vwrImgs[i][4];
			vwrImgs[i][4] = imgX;
			imgXs.push(imgX);
		}
		imgXs = imgXs.sort(function(a, b) {
			return a - b;
		});
	}
	function injectCaptions() {
		for (var i = 0; i < totalImgs; i++) {
			var newEl = new Element('div', {'id': 'caption' + i, 'class': 'caption'});
			newEl.inject(captionCont, 'bottom');
			newEl.fade('hide');
			if (vwrImgs[i][2].length > 0) {
				var newElH = new Element('h4', {'text': vwrImgs[i][2]});
				newElH.inject(newEl, 'bottom');
			}
			if (vwrImgs[i][3].length > 0) {
				var newElP = new Element('p', {'text': vwrImgs[i][3]});
				newElP.inject(newEl, 'bottom');
			}
		}
	}
	function imagesReady() {
		mskLftBG.fade(0.91);
		mskRgtBG.fade(0.91);
		showCaption();
		dragEl.fade(1);
		controlsCont.fade('in');
		initDrag();
		imgsLoaded = true;
	}
	
	
	// IMAGE LOAD PROGRESS BAR METHODS
	loadProg.fade('hide');
	var loadProgBarFxTween = new Fx.Tween(loadProgBar, {fps: 60, link: 'cancel', duration: 600, transition: 'linear'});
	function fadeInLoadBar() {
		loadProg.fade('in');
	}
	function advanceLoadBar() {
		loadProgBarFxTween.cancel();
		loadProgBarFxTween.start('width', Math.ceil((148 / totalImgs) * imgLoadIndex) + 'px');
	}
	function fadeOutLoadBar() {
		loadProg.fade('out');
	}
	
	
	// CONTROLS METHODS
	var tweenNextImg = function() {
		if (currImgIndex < totalImgs - 1) {
			removeCaption();
			initDragElFxTween.cancel();
			currImgIndex++;
			dragFxTween.start('left', vwrImgs[currImgIndex][4] + 'px');
		}
	}
	var tweenPrevImg = function() {
		if (currImgIndex > 0) {
			removeCaption();
			initDragElFxTween.cancel();
			currImgIndex--;
			dragFxTween.start('left', vwrImgs[currImgIndex][4] + 'px');
		}
	}
	var keyStrokeEvent = function(event) {
		if (imgsLoaded) {
			if (event.key == 'left') { 
				tweenPrevImg();
				$('prevImage').setStyle('background-position', '0px -18px');
			}
		    if (event.key == 'right') { 
				tweenNextImg();
				$('nextImage').setStyle('background-position', '0px -18px');
			}
		}
	}
	var keyStrokeEventEnd = function(event) {
		if (imgsLoaded) {
			if (event.key == 'left') { 
				$('prevImage').setStyle('background-position', '0px 0px');
			}
		    if (event.key == 'right') { 
				$('nextImage').setStyle('background-position', '0px 0px');
			}
		}
	}
	$('nextImage').addEvent('click', tweenNextImg);
	$('prevImage').addEvent('click', tweenPrevImg);
	window.addEvent('keydown', keyStrokeEvent);
	window.addEvent('keyup', keyStrokeEventEnd);
	window.addEvent('resize', prepareResize);
	
	
	// INITIALIZE VIEWER
	mskLftBG.fade('hide');
	mskRgtBG.fade('hide');
	dragEl.fade('hide');
	dragEl.fade(0.075);
	loadImage();
	fadeInLoadBar();
	controlsCont.fade('hide');
}