/* Dark Matter Behavioral layer

Requires: YUI DOM, Event, Animation and
Dav Glass' YUI Tools and YUI Effects (stripped version used)

Check out Dav's awesome stuff: http://blog.davglass.com/files/yui/effects/

This file Copyright 2008 by Marco van Hylckama Vlieg
http://www.i-marco.nl/weblog/
marco@i-marco.nl

*/

YAHOO.photoblog.behaviours = function () {

	var YUE = YAHOO.util.Event, YUA = YAHOO.util.Anim, YUD = YAHOO.util.Dom, YUC = YAHOO.util.Connect;	

	var bAnimating = false;
	var that = this;
	var oConfig = {};
	
	if(imagenode = YUD.get('dm_photo_id')) {
		this.imageid = imagenode.value;
	}

	var slideListener = function (sElem, nHeight, fnComplete, fnTween) {
		var slide = function (sElement, sHeight) {
			sHeight = parseInt(sHeight);
			animatorObj = new YUA(sElement, {height: {to: sHeight}}, 0.5, YAHOO.util.Easing.easeOut); 
			if(fnComplete) {
				animatorObj.onComplete.subscribe(fnComplete);
			}
			if(fnTween) {
				animatorObj.onTween.subscribe(fnTween);
			}
			animatorObj.animate();
		};
	(parseInt(YUD.getStyle(sElem, 'height')) > 0) ? slide(sElem, 0) : slide(sElem, nHeight);		
	};

	return  {
		init: function() {

			this.oConfig = YAHOO.photoblog.oConfig;			
			this.bAnimating = false;

			if(imagenode = YUD.get('dm_photo_id')) {
				this.imageid = imagenode.value;
			}
			
			function createTab(sParent, sTabId, sText, sBeforeElement) {
			
				if(!YUD.get(sParent)) {
					return;
				}
			
				elTab = document.createElement('div');
				elTab.id = sTabId;
				elLink = document.createElement('a');
				elLink.href = '#';
			
				if(sTabId == 'image-info-toggle') {
					elLink.id = 'image-info-toggle-link';
				}
			
				if(sTabId == 'thumbnail-navigator-toggle') {
					elLink.id = 'thumbnail-navigator-toggle-link';
				}
			
				if(sTabId == 'commentform-toggle') {
					elLink.id = 'commentform-toggle-link';
				}								
			
				elLink.appendChild(document.createTextNode(sText));
				elTab.appendChild(elLink);	
				(sBeforeElement) ? YUD.get(sParent).insertBefore(elTab, YUD.get(sBeforeElement)) : YUD.get(sParent).appendChild(elTab);
			}

			function toggleIEStatic() {
				YUD.setStyle('view-window', 'position', 'static');
				YUD.setStyle('slider', 'position', 'static');
				if(tranches = YUD.getElementsByClassName('tranche')) {
					YUD.setStyle(tranches, 'position', 'static');
				}
			}

			if(YUD.get('viewedphoto')) {	
				nThumbsHeight = this.oConfig.thumbsheight;
				nCommentFormHeight = 400;
				nInfoHeight = YUD.get('info').offsetHeight;
			
				YUD.setStyle(['info', 'cform'], 'height', 0);
				YUD.setStyle('cform', 'display', 'block');
			
				sCookie = YAHOO.util.Cookie.get('thumbslider');
			
				if(sCookie !== 'expanded') {
					YUD.setStyle('thumbs', 'height', 0);	
					toggleIEStatic();				
				}

				YUD.setStyle('thumbs', 'display', 'block');

				if(this.oConfig.fade == 1) {
					sPhotoSRC = YUD.get('viewedphoto').src;
					YUD.get('viewedphoto').src = 'templates/darkmatter/img/blank.gif';
					myImage = new Image();
					var that = this;
			
					myImage.onload = function() {
						YUD.get('viewedphoto').src = sPhotoSRC;
						YUD.setStyle('photo', 'background-image', 'none');			
					
						var opts = {
									seconds:that.oConfig.fadetime, 
									ease:YAHOO.util.Easing.easeOut, 
									delay: false
									};
					
						YUD.get('viewedphoto').onload = new YAHOO.widget.Effects.Appear('viewedphoto', opts);
					};
					myImage.src = sPhotoSRC;
				}
				else {
					YUD.setStyle('viewedphoto', 'visibility', 'visible');
				}
				
				function toggleThumbsCookie() {
					(YAHOO.util.Cookie.get('thumbslider') == 'expanded') ? YAHOO.util.Cookie.set('thumbslider', 'closed') : YAHOO.util.Cookie.set('thumbslider', 'expanded'); 		
				}
				createTab('image-info', 'image-info-toggle', this.oConfig.STR_IMAGE_INFO, false);
				
				eInfoLink = document.createElement('a');
				eInfoLink.id = 'i-link';
				eInfoLink.href = '#';
				eInfoLink.appendChild(document.createTextNode(this.oConfig.STR_IMAGE_INFO));
				YUD.get('titlebar').appendChild(eInfoLink);
				
				createTab('thumbnail-navigator', 'thumbnail-navigator-toggle', this.oConfig.STR_PHOTO_STREAM, false);
				createTab('commentform', 'commentform-toggle', this.oConfig.STR_COMMENT_FORM, 'cform');
				YUD.setStyle('image-info-toggle', 'visibility', 'hidden');

				if(YUD.get('thumbnail-navigator')) {
					YUD.setStyle(['image-info', 'thumbnail-navigator', 'cform'], 'visibility', 'visible');
				}
				else {
					YUD.setStyle(['image-info', 'cform'], 'visibility', 'visible');					
				}

				YUE.on(['photo', 'photo-prev', 'photo-next'], 'mouseover', function() {
					YUD.setStyle('image-info-toggle', 'visibility', 'visible');
				}
			);

			YUE.on(['photo', 'photo-prev', 'photo-next'], 'mouseout', function() {
				if(YUD.get('info').offsetHeight === 0) {
					YUD.setStyle('image-info-toggle', 'visibility', 'hidden');
				}
			});
			
				YUE.on('i-link', 'focus', function(e) {
					YUD.setStyle('image-info-toggle', 'visibility', 'visible');					
				});

				YUE.on('i-link', 'blur', function(e) {
					YUD.setStyle('image-info-toggle', 'visibility', 'hidden');					
				});			

				YUE.on(['i-link'], 'click', function(e) {
					YUE.preventDefault(e);				
					slideListener('info', nInfoHeight, function() {
						(YUD.get('info').offsetHeight > 0) ? YUD.setStyle(['photo-prev', 'photo-next'], 'top', '-1000px') : YUD.setStyle(['photo-prev', 'photo-next'], 'top', '115px');
						YUD.setStyle('image-info-toggle', 'visibility', 'visible');		
					});
				}
			);

			YUE.on(['image-info-toggle', 'i-link'], 'mouseover', function() {
				YUD.setStyle('image-info-toggle', 'visibility', 'visible');
				YUD.setStyle('photo-next', 'display', 'none');
			}
		);

		YUE.on(['image-info-toggle', 'i-link'], 'mouseout', function() {
			YUD.setStyle('image-info-toggle', 'visibility', 'visible');
			YUD.setStyle('photo-next', 'display', 'block');
		}
	);
	
	if(YUD.get('thumbnail-navigator-toggle')) {
		YUE.on('thumbnail-navigator-toggle', 'click', function(e) {
			if(YUD.get('thumbs').offsetHeight > 0) {
				toggleIEStatic();
				slideListener('thumbs', nThumbsHeight);
			}
			else {
				slideListener('thumbs', nThumbsHeight, function() {
					YUD.setStyle(['view-window', 'slider'], 'position', 'relative');
					YUD.setStyle(YUD.getElementsByClassName('tranche'), 'position', 'absolute');				
				});			
			}
			toggleThumbsCookie();
			YUE.preventDefault(e);
			}
		);
	}
	YUE.on('nav_left', 'focus', function(e) {
		if(YUD.get('thumbs').offsetHeight == 0) {
			slideListener('thumbs', nThumbsHeight, function() {
				YUD.setStyle(['view-window', 'slider'], 'position', 'relative');
				YUD.setStyle(YUD.getElementsByClassName('tranche'), 'position', 'absolute');				
			});			
		}
		}
	);

	YUE.on('image-info-toggle', 'click', function(e) {
		slideListener('info', nInfoHeight, function() {
			(YUD.get('info').offsetHeight > 0) ? YUD.setStyle(['photo-prev', 'photo-next'], 'top', '-1000px') : YUD.setStyle(['photo-prev', 'photo-next'], 'top', '115px');
		});
		YUE.preventDefault(e);
		});

	YUE.on('commentform-toggle', 'click', function(e) {
		slideListener('cform', nCommentFormHeight, function() {
			window.scrollTo(0,10000);
		}, function() {window.scrollTo(0,10000);});
	YUE.preventDefault(e);
	});

	YUE.on(['commentform-toggle-link', 'name', 'email', 'url', 'comment', 'csubmit'], 'focus', function(e) {
		if(YUD.get('cform').offsetHeight == 0) {
			slideListener('cform', nCommentFormHeight, function() {
				window.scrollTo(0,10000);
			}, function() {window.scrollTo(0,10000);});
		}
	});
	
	function linksList(sHTML) {
		sListHTML = sHTML.replace(/<a/g, '<li><a');
		sListHTML = sListHTML.replace(/<\/a>/g, '</li></a>');
		return ('<ul>' + sListHTML + '</ul>');
	}

	function replaceHTMLLeft(o) {
		that.bAnimating = true;
		if(o.responseText.replace(/^\s+|\s+$/g, '') != '') {
			if(dummies = o.responseText.match(/dummy-element/g)) {
				nDummies = dummies.length;
			}
		else {
			nDummies = 0;
		}

		var nNegOffSet = (600 - (nDummies * 120));

		YUD.get('slider').innerHTML = document.getElementById('slider').innerHTML + '<div class="tranche" id="ieleft">' + o.responseText + '</div>';						

		YUD.setStyle(YUD.getElementsByClassName('tranche')[1], 'right', 600 + 'px');
		animatorObj = new YUA('slider', {left: {to: nNegOffSet}}, 1, YAHOO.util.Easing.easeOut);						
		animatorObj.onComplete.subscribe(function() {

			if(nDummies == 0) {
				YUD.get('slider').innerHTML = '<div class="tranche">' + linksList(o.responseText) + '</div>';
				YUD.setStyle('slider', 'position', 'relative');
				YUD.setStyle('slider', 'left', '0');
				that.bAnimating = false;
				YUD.removeClass('nav_left', 'blinking');
				return false;
			}

			var eSlider = YUD.get('slider'); 
			aRawImages = eSlider.getElementsByTagName('img');

			if(aDummies = YUD.getElementsByClassName('dummy-element')) {
				nDummies = aDummies.length;
			}
			else {
				nDummies = 0;
			}
			nOffsetcount = 5 - nDummies;

			aImages = new Array();
			for(i=5;i<10;i++) {
				if((YUD.hasClass(aRawImages[i], 'thumbnails')) || (YUD.hasClass(aRawImages[i], 'current-thumbnail'))) {
					aImages.push(aRawImages[i].parentNode);
				}
			}

			for(i=0;i<(5 - nOffsetcount);i++) {
				if((YUD.hasClass(aRawImages[i], 'thumbnails')) || (YUD.hasClass(aRawImages[i], 'current-thumbnail'))) {
					aImages.push(aRawImages[i].parentNode);
				}
			}

			eNewDiv = document.createElement('div');
			eNewDiv.className = 'tranche';

			for(i=0;i<aImages.length;i++) {
				eNewDiv.appendChild(aImages[i]);
			}
			eSlider.innerHTML = '<div class="tranche">' + linksList(eNewDiv.innerHTML) + '</div>';
			YUD.setStyle('slider', 'position', 'relative');
			YUD.setStyle('slider', 'left', '0');
			that.bAnimating = false;
			YUD.removeClass('nav_left','blinking');
		});
		animatorObj.animate();	
		}
		else {
			YUD.removeClass('nav_left','blinking');
			YUD.addClass(YUD.get('nav_left'),'end');
			that.bAnimating = false;
		}
	}				

	function replaceHTMLRight(o) {
		that.bAnimating = true;
		if(o.responseText.replace(/^\s+|\s+$/g, '') != '') {
			if(dummies = o.responseText.match(/dummy-element/g)) {
				nDummies = dummies.length;
			}
		else {
			nDummies = 0;
		}

		var nNegOffSet = 0 - (600 - (nDummies * 120));

		YUD.get('slider').innerHTML = document.getElementById('slider').innerHTML + '<div class="tranche">' + o.responseText + '</div>';						
		YUD.setStyle(YUD.getElementsByClassName('tranche')[1], 'left', 600 + 'px');
		animatorObj = new YUA('slider', {left: {to: nNegOffSet}}, 1, YAHOO.util.Easing.easeOut);						
		animatorObj.onComplete.subscribe(function() {

			if(nDummies == 0) {
				YUD.get('slider').innerHTML = '<div class="tranche">' + linksList(o.responseText) + '</div>';
				YUD.setStyle('slider', 'position', 'relative');
				YUD.setStyle('slider', 'left', '0');
				YUD.removeClass('nav_right', 'blinking');
				that.bAnimating = false;
				return false;
			}

			var eSlider = YUD.get('slider'); 
			aRawImages = eSlider.getElementsByTagName('img');
			if(aDummies = YUD.getElementsByClassName('dummy-element')) {
				nDummies = aDummies.length;
			}
			else {
				nDummies = 0;
			}

			nOffsetcount = 5 - nDummies;

			aImages = new Array();
			for(i=0;i<aRawImages.length;i++) {
				if((YUD.hasClass(aRawImages[i], 'thumbnails')) || (YUD.hasClass(aRawImages[i], 'current-thumbnail'))) {
					if(nOffsetcount > 0) {
						nOffsetcount--;
					}
					else {
						aImages.push(aRawImages[i].parentNode);
					}
				}
			}

			eNewDiv = document.createElement('div');
			eNewDiv.className = 'tranche';
			for(i=0;i<aImages.length;i++) {
				eNewDiv.appendChild(aImages[i]);
			}							
		
			eSlider.innerHTML = '<div class="tranche">' + linksList(eNewDiv.innerHTML) + '</div>';
			YUD.setStyle('slider', 'position', 'relative');
			YUD.setStyle('slider', 'left', '0');
			YUD.removeClass('nav_right', 'blinking');
			that.bAnimating = false;
		});
		animatorObj.animate();	
		}
		else {
			YUD.removeClass('nav_right','blinking');
			YUD.addClass(YUD.get('nav_right'),'end');
			that.bAnimating = false;
		}
	}				

	function handleFailure(o) {
		return false;
	}

	YUE.on('nav_left', 'click', function(e)	{
		if(that.bAnimating) {
			YUE.preventDefault(e);
			return false;
		}
		YUD.removeClass('nav_right', 'end');
		YUD.addClass(YUD.get('nav_left'),'blinking');
		aLinks = YUD.getElementsByClassName('tranche')[0].getElementsByTagName('a');
		sIDString = '';
		for(i=0;i<aLinks.length;i++) {
			nID = aLinks[i].href.split("=")[1];
			if (i==0) {
				nStartID = nID;
			}
			if(parseInt(nID)) {
				sIDString = sIDString + nID;
				if(aLinks.length-1 > i) {
					sIDString = sIDString + ',';
				}
			}
		}

		var callback = {
			success: replaceHTMLLeft,
			failure: handleFailure
		};					
		objFetch = YUC.asyncRequest('GET', 'index.php?x=caroussel&direction=backwards&not=' + sIDString + '&startid=' + nStartID + '&current=' + that.imageid, callback);
		YUE.preventDefault(e);
	});

	YUE.on('nav_right', 'click', function(e)	{
		if(that.bAnimating) {
			YUE.preventDefault(e);
			return false;
		}
		YUD.removeClass('nav_left', 'end');
		YUD.addClass(YUD.get('nav_right'),'blinking');

		aLinks = YUD.getElementsByClassName('tranche')[0].getElementsByTagName('a');
		sIDString = '';
		for(i=0;i<aLinks.length;i++) {
			nID = aLinks[i].href.split("=")[1];
			if (i==aLinks.length-1) {
				nStartID = nID;
			}
			if(parseInt(nID)) {
				sIDString = sIDString + nID;
				if(aLinks.length-1 > i) {
					sIDString = sIDString + ',';
				}
			}
		}
		var callback = {
			success: replaceHTMLRight,
			failure: handleFailure
		};					
		objFetch = YUC.asyncRequest('GET', 'index.php?x=caroussel&direction=forward&not=' + sIDString + '&startid=' + nStartID + '&current=' + that.imageid, callback);
		YUE.preventDefault(e);
		});		
	}

	if(YUD.get('tag_cloud')) {
		nTagsHeight = YUD.get('tag_cloud').offsetHeight;
		YUD.setStyle('tag_cloud', 'height', 0);
		YUD.setStyle('tags-tab', 'visibility', 'visible');				
		createTab('tags-tab', 'tags-tab-toggle', this.oConfig.STR_TAGS, false);
		YUE.on('tags-tab-toggle', 'click', function(e){ 
			slideListener('tag_cloud', nTagsHeight);
			YUE.preventDefault(e);
			});
	}
	
	var docStr = String(document.location);
	
	if(docStr.match('longdescription')) {
		slideListener('info', nInfoHeight, function() {
			(YUD.get('info').offsetHeight > 0) ? YUD.setStyle(['photo-prev', 'photo-next'], 'top', '-1000px') : YUD.setStyle(['photo-prev', 'photo-next'], 'top', '115px');
		});
		YUD.setStyle('image-info-toggle', 'visibility', 'visible');
	}	
	}
	};
}();

YAHOO.util.Event.onDOMReady(YAHOO.photoblog.behaviours.init);

