/**
 * Lazy loading of soundmanager
 */
window.SM2_DEFER = true;

/**
 * Switch between debug on/off with 
 * true or false
 */

var NTNUdeveloper = {
	debug : true, // PRIVATE MEMEBER
	log : function(msg) {
		if (this.hasConsole()) {
			console.log(msg);
		}
	},
	debugEnabled : function() {
		return this.debug;
	},
	hasConsole : function() {
		if (console) {
			return true;
		}
		return false;
	}
};

/*
 * Event object that triggers several method
 * calls when the DOM is fully loaded.
 */
Event.observe(document, 'dom:loaded', function () {
	
	/**
	 * Organiserer bilder og bildetekst	 
	 * Legger på bildetekst og styrer align av bilder	 
	 */
	Ntnu_imageHandling.prosessImageElements();
	/**
	 * Skalerer bilder i høyrespalte slik at de passe med gridmal
	 * Fix på grunn av missmatch i import av bilder.
	 */
	ImageScaling.doRightColumn();
	
/**
 * Run custom Alloy start
 * 
 * Fordi Alloy scriptene lastes senere enn themescriptene
 * kan ikke AUI() objektet brukes for DOMen er klar
 */	

	NtnuAlloy.Plugins.defaultSearchInput();
	NtnuAlloy.Plugins.dateConversion(); 
	NtnuAlloy.Utillity.keyToggleElement();
	NtnuAlloy.Plugins.SoundManager();
	NtnuAlloy.Plugins.ArticleCarousel();
	/* Run custom Alloy end */
});

/** 
 * @author Christian Skaiaa
 * @class ImageScaling
 * @requires Prototype.js 
 */
var ImageScaling = {
	doRightColumn: function () {
		if ($('column-4')) {
			var images = $('column-4').select('img');
			images.each(function (image) {
				if (image.readAttribute('width') == '229') {
					image.height = image.height * 0.94;
					image.width = 216;
					image.up().setStyle({
						'width': '216px'
					});
				}
			});
		}
	}
};

/** 
 * @author Christian Skaiaa
 * @class Ntnu_imageHandling
 * @requires Prototype.js 
 */
var Ntnu_imageHandling = {
	prosessImageElements: function () {
		//var images = $$('img[longdesc]', 'img[txtcaption]');
		var images = $$('.journal-content-article img','.asset-abstract img');
		images.each(function (image) {
			
			var image = Ntnu_imageHandling.consolidateImageTextAttributes(image);
			
			// Bilder uten undertekst uten lenke
			if (!Ntnu_imageHandling.imageHasCaption(image)) {									
				Ntnu_imageHandling.addCSSFloatStyles(image, Ntnu_imageHandling.getAlignOrFloatStyle(image));
			
			// Bilder med undertekst uten lenke	
			} else if (Ntnu_imageHandling.imageHasCaption(image) && !Ntnu_imageHandling.imageHasLink(image)) {
				Ntnu_imageHandling.createNonLinkCaptionElement(image, image.readAttribute('longdesc'));
				
			// Bilder med undetekst og lenke
			} else if (Ntnu_imageHandling.imageHasCaption(image) && Ntnu_imageHandling.imageHasLink(image)) {				
				Ntnu_imageHandling.createCreateCaptionClickableElement(image, image.readAttribute('longdesc'));
			}
		});
	},
	
	imageHasLink : function(image) {
		var aElement = image.up();
		if (aElement && aElement.hasAttribute('href')) {
			return true;
		} else {
			return false;
		}
	},
	
	imageHasCaption : function(image) {
		if (image.hasAttribute('longdesc') && image.readAttribute('longdesc').length > 0) {
			return true;
		} else {
			return false;
		}
	},

	/**
	 * Sørger for at bildetekst som kan forekomme i både longdesc og
	 * txtcaption av historiske årsaker blir konsolidert til longdesc attributtet
	 */
	consolidateImageTextAttributes : function(image) {
		if (image.hasAttribute('longdesc') && image.readAttribute('longdesc').length > 0) {
			return image;
		}
		if (image.hasAttribute('txtcaption') && image.readAttribute('txtcaption').length > 0) {
			image.writeAttribute('longdesc', image.readAttribute('txtcaption'));
		}
		return image;
	},

	addCSSFloatStyles: function (_element, _align) {
		if (!_align) {
			_align = '';
		}
		switch (_align.toLowerCase()) {
		case 'right':
			_element.addClassName('artImageRight');
			break;
		case 'left':
			_element.addClassName('artImageLeft');
			break;
		case 'middle':
			_element.addClassName('artImageCenter');
			break;
		case 'inline':
			_element.addClassName('artImageInline');
			break;
		default:
			_element.addClassName('artImageNone');
		}
	},
	createNonLinkCaptionElement: function (_image, _caption) {
		if (_image && _caption.length > 0) {
			var div = new Element('div');
			var captionElement = new Element('span');
				captionElement.update(_caption);
			var width = Ntnu_imageHandling.getAttributeOrStyle(_image, 'width');
			if (width && width.length > 0) {
				div.setStyle({'width': width});
			}
			Ntnu_imageHandling.addCSSFloatStyles(div, Ntnu_imageHandling.getAlignOrFloatStyle(_image));
			Ntnu_imageHandling.removeFloat(_image);
			_image.wrap(div);
			div.insert(captionElement);
		}		
	},
	createCreateCaptionClickableElement: function (_image, _caption) {
		var div = new Element('div');
		var captionElement = new Element('span');
			captionElement.update(_caption);
		var linkElement = $(_image).up();
		linkElement.wrap(div);
		var width = Ntnu_imageHandling.getAttributeOrStyle(_image, 'width');		
		if (width && width.length > 0) {
			div.setStyle({'width': width});
		}		
		Ntnu_imageHandling.addCSSFloatStyles(div, Ntnu_imageHandling.getAlignOrFloatStyle(_image));
		Ntnu_imageHandling.removeFloat(_image);
		div.insert(captionElement);
	},
	
	removeFloat : function (_image) {
		try {
			var width = _image.getStyle('width');
			var height = _image.getStyle('height');			
			_image.writeAttribute('style');
			_image.setStyle({
				'width':width,		
				'height':height
			});
		} catch (err) {
			NTNUdeveloper.log('Error removing float: '+err);
		}
	},

	/**
	 * Returns an elements attribute or style if attribute is not present
	 */
	getAttributeOrStyle : function (_image, _attr) {
		return (_image.readAttribute(_attr) ? _image.readAttribute(_attr) : _image.getStyle(_attr)); 
	},

	/**
	 * Returns an elements align attribute or float style if align is not present
	 */
	getAlignOrFloatStyle : function (_image) {
		return (_image.readAttribute('align') ? _image.readAttribute('align') : _image.getStyle('float'));
	}
};

/**
 * Bekreftelse ved endring av templat
 */
var Ntnu_templateChange = {
	submit: function (_elementID) {
		var answer = confirm("Er du sikker du vil endre templat?");
		if ($(_elementID && answer)) {
			$(_elementID).submit();
		} else {
			// do nothing
		}
	}
};

/**
 * @author Christian Skaiaa
 * @requires Yahoo YUI, Liferay Alloy UI
 * @class NtnuAlloy
 * Pupose: Use existing NtnuAlloy object or instanciate a new on if not.
 * Usage: Custom Namespace for NTNU Alloy components.
 * Add all plugins as properties on this object.
 */
 
//(function(window) {
//	if (!window.NtnuAlloy) {
		var NtnuAlloy = {};
			NtnuAlloy.Plugins = {};
			NtnuAlloy.Utillity = {};
//	}
//}(window));
	
	
	
/**
 * @author Christian Skaiaa
 * @return String
 * 
 * Pupose: Formatere dato fra
 * full dato med millisekund til
 * forkortet format på formen
 * 
 * @requires Yahoo YUI, Liferay Alloy UI
 */

NtnuAlloy.Plugins.dateConversion = function () {
		AUI().use('aui-node', 'aui-plugin', 'datatype', function(A) {
			var dateConversionPlugin = function(config) {
				var node = config.host;
	
				var timeInMilliseconds = 0;
				var dateString = node.text();
				
				function getMonth(monthnumber) {
					var x = new Number(monthnumber);
					var intNumber = x.valueOf(x) - 1;
					
					var norwegianMonths = ['januar', 'februar', 'mars',
					                       'april', 'mai', 'juni',
					                       'juli', 'august', 'september',
					                       'oktober', 'november', 'desember'
					                       ];
					return norwegianMonths[intNumber];					
				}

				try {			
					if (dateString) {
						var myDate = new Date(dateString);
						
						if (myDate) {
							if (themeDisplay.getLanguageId() == "nb_NO"){ 
								var correctDate = A.DataType.Date.format(myDate, {format:"%m-%d-%Y"});
								var dateFragArray = correctDate.split('-');
								
								if (dateFragArray && dateFragArray.length > 2) {
									var pubMonth = getMonth(dateFragArray[0]);
									correctDate = dateFragArray[1] + '. ' + pubMonth + ' ' + dateFragArray[2];
								}
							} 
							else {
								correctDate = A.DataType.Date.format(myDate, {format:"%d.%B %Y"});
							}
							node.text(correctDate);							
						}
					}
				} catch(error) {
					A.log('The input string: ' + dateString + ' is not av valid date to convert');
				}
			};
								
			/* Add a namespace */
			dateConversionPlugin.NS = 'dateConversion';
			
			/* Add plugin to all date elements i journal content portles */
			A.all('span.endretdato').plug(dateConversionPlugin);
	});
};

/**
 * @author Christian Skaiaa
 * 
 * Pupose: Koble tastatureventer
 * til funksjonalitet i websiden
 * 
 * @requires Yahoo YUI, Liferay Alloy UI
 */
NtnuAlloy.Utillity.keyToggleElement = function() {
	AUI().use('aui-base', 'aui-node', function(A){
		/* Toggle controls function */
		var keyToggleControls = function(event) {

			var docBody = A.getBody();
			var trigger = A.one('.toggle-controls');
			var hiddenClass = 'controls-hidden';
			var visibleClass = 'controls-visible';
			var currentClass = visibleClass;

			if (Liferay._editControlsState != 'visible') {
				currentClass = hiddenClass;
			}

			docBody.addClass(currentClass);
			docBody.toggleClass(visibleClass).toggleClass(hiddenClass);
			
			Liferay._editControlsState = (docBody.hasClass(visibleClass) ? 'visible' : 'hidden');

			A.io.request(
				themeDisplay.getPathMain() + '/portal/session_click',
				{
					data: {
						'liferay_toggle_controls': Liferay._editControlsState
					}
				}
			);
		};
		/* Define new function below*/
		
		/* Add eventtype, handler, element on the Alloy object */
		A.on('key', keyToggleControls, document, 'down:113'); 
		/* 	35 = shift+1, 40 = Shift+2, 34 = Shift+3 , 37 = Shift+4, 12 = Shift+5, 113 = F2, 13 = Enter, 39 = Shift+6 */
	});	
};

/**
 * @author Christian Skaiaa
 * Pupose: Sørge for default tekst i søkefeltet
 * @requires Yahoo YUI, Liferay Alloy UI
 */

NtnuAlloy.Plugins.defaultSearchInput = function() {
	AUI().use('aui-plugin', 'aui-node', function(A){
		var defaultinput = function(config) {
			var node = config.host;
			
			var defaultValue = node.getAttribute('data-defaultValue');

			var startingValue = node.val();

			if (!startingValue) {
			      node.val(defaultValue);
			}
			
			node.on('focus', function(event) {
				var value = node.val();

				if (value == defaultValue) {
					node.val('');
				}
			});

			node.on('blur', function(event) {
				var value = node.val();
				if (value == '') {
					node.val(defaultValue);
				}
			});
						
		};
		defaultinput.NS = 'defaultSearchInput';
		A.all('input.defaultplugin').plug(defaultinput);
	});
};


/**
 * @author Christian Skaiaa
 * Pupose: Skalere bilder i høyrekolonne slik at 
 * de passer gridmalen vår
 * TODO: Integrere plugin som en del av en større
 * bildehåndteringsplugin.
 * @requires Yahoo YUI, Liferay Alloy UI
 */

NtnuAlloy.Plugins.LeftCollumnScaling = function() {
	AUI().use('aui-plugin', 'aui-node', function(A){
		var leftCollumnScaling = function(config) {
			var node = config.host;

			var images = node.all('img');
			/*
			images.each(function(image) {
				var width = image.getAttribute('width');
				var height = image.getAttribute('height');
				if (width == '229') {
					var newheight = (height * 0.94);
					image.setAttribute('height', newheight);
					image.setAttribute('width', '216');
					image.parentNode.setStyle('width', '216px');
				}
			}
			*/
		};
		leftCollumnScaling.NS = 'leftCollumnScaling';
		if (A.one('#column-4')) {
			A.one('#column-4').plug(leftCollumnScaling);
		}
	});	
};


/**
 * @author Christian Skaiaa
 * Pupose: Modal centered feedback/notification box.
 * react on explicit call and custom event
 * @requires Yahoo YUI, Liferay Alloy UI
 */

NtnuAlloy.Utillity.UserNotification = function() {
	AUI().use('aui-tooltip', 'aui-io-plugin', 'event-custom', function(A) {
		var userNotification = function(config) {
			var node = config.host;		

			var instanceToolTip = new A.Overlay({
				centered: true,
				bodyContent: 'Intet nytt er godt nytt',
				showArrow: false,
				cssClass: '.portlet-msg-error'
			});
			
		instanceToolTip.subscribe('ntnu:notify');
						
		A.on('ntnu:notify', function(arg1) {
				instanceToolTip.set('bodyContent', arg1);
				instanceToolTip.render('body');
				instanceToolTip.show();	
			});
		};
		userNotification.NS = 'userNotification';
		A.one('body').plug(userNotification);
	});
};

/**
 * @author Christian Skaiaa
 * @requires Yahoo YUI, Liferay Alloy UI, SoundManager 2: http://www.schillmania.com/projects/soundmanager2/
 * @class NtnuAlloy.Plugins.SoundManager
 * Purpose: Enable mp3/flash player in an article or other content
 */
NtnuAlloy.Plugins.SoundManager = function() {
	AUI().use('aui-node', 'aui-plugin', 'aui-button-item', 'aui-toolbar', function(A) {

		NtnuAlloy.Plugins.SoundManager.mp3nodes = A.all('a[href$=".mp3"].playcontrols', 'a[href$=".MP3"].playcontrols', 'a[href$=".mp3"].advancedcontrols', 'a[href$=".MP3"].advancedcontrols');
		
		if (!NtnuAlloy.Plugins.SoundManager.mp3nodes.isEmpty()) {
	        window.soundManager = new SoundManager();       
			        
			soundManager.url = '/ntnu-theme/javascript/soundmanager/swf/';
	        soundManager.flashVersion = 9; // optional: shiny features (default = 8)
	        soundManager.useFlashBlock = false;
	        
	        soundManager.beginDelayedInit();
	        
	        soundManager.onready(function(){
				
	        	var soundControl = function(config) {
					
					/* Get nodeRef, Url, NodeText and Create unique ID*/
					var node = config.host;
					var mp3url = node.getAttribute('href');			
					var mp3linkTxt = node.text();
					var soundID = generateUniqeID(mp3linkTxt);
					
					/* CSS literal object*/
					var cssText = {
							'fontWeight': 'lighter',					
							'paddingLeft': '1em',
							'fontSize': '1.2em'
						};
					
					/* Sound name link node */  
					var mp3Name = A.Node.create('<a></a>');
						mp3Name.text(mp3linkTxt);
						mp3Name.setAttribute('href', mp3url);
						mp3Name.setStyles(cssText);
						
					var wrapper = A.Node.create('<span></span>');
				
					/* Create SMSound Object literal */
					var soundObject = {
							id: soundID,
							url : mp3url,
							stream: true,
							autoplay: false
					};
					
					/* Create SMSound Object instance */
					var soundInstance = window.soundManager.createSound(soundObject);
								
					/* Creating a soundControl toolbar */
					var soundControlToolbar = new A.Toolbar({
						defaultState: true,
						children : [
							{ icon: 'play', handler: playHandler }, 
							{ icon: 'pause', handler: pauseHandler }, 
							{ icon: 'stop', handler: stopHandler }
						]
					}).render(wrapper);
					
					/* SoundControl Handlers */
					function stopHandler() {
						soundInstance.stop(soundInstance);
					}
					
					function playHandler() {
						soundInstance.play(soundInstance);
					}
					
					function pauseHandler() {
						soundInstance.pause(soundInstance);
					}
								
					function generateUniqeID(_string) {
						var newDate = new Date;
						return escape(_string + newDate.getTime());
					}
								
					function hasAdvancedControls(_node) {
						/* .playcontrols, .advancedcontrols */
						if (_node.hasClass('advancedcontrols')) {
							return true;
						} 
						return false; 
					}
					
					/* Add components to GUI */
					wrapper.appendChild(mp3Name);
					node.replace(wrapper);			
				};

				/* Add pluginNamespace and add plugin to All mp3 links */
				soundControl.NS = 'soundControl';
				NtnuAlloy.Plugins.SoundManager.mp3nodes.plug(soundControl);
	        });
		}
	});	
};

/**
 * @author Kyrre Myrbostad
 * @requires Yahoo YUI, Liferay Alloy UI
 * @class NtnuAlloy.Plugins.ArticleCarousel
 * NB! Delay blir felles hvis man har flere karuseller på en side, minste delay vinner...
 * Purpose: Used with article template "artikkelkarusell" to make certain articles change based on a timer
 */
NtnuAlloy.Plugins.ArticleCarousel = function() {
	AUI().use('aui-node', 'aui-plugin', function(A) {
		
		var articleNodes = A.all('div.artikkel-karusell');

		NtnuAlloy.Plugins.ArticleCarousel.running = true;
		NtnuAlloy.Plugins.ArticleCarousel.stopSpin = false;
		
		NtnuAlloy.Plugins.ArticleCarousel.toggleRun = function(iterator){
			if (NtnuAlloy.Plugins.ArticleCarousel.running) {
				NtnuAlloy.Plugins.ArticleCarousel.stopSpin = true;
				stopRunning();
			} else {
				NtnuAlloy.Plugins.ArticleCarousel.running = true;
				NtnuAlloy.Plugins.ArticleCarousel.stopSpin = false;
				NtnuAlloy.Plugins.ArticleCarousel.spin(iterator);
				articleNodes.each(function(node){
					var subNodes = node.all('a.play');
					subNodes.each(function(subSubNode) {
						subSubNode.removeClass('play');
						subSubNode.addClass('pause');
					});
				});
			}
		};

		NtnuAlloy.Plugins.ArticleCarousel.previous = function(iterator,end){
			if (NtnuAlloy.Plugins.ArticleCarousel.running) {
				stopRunning();
			}
			NtnuAlloy.Plugins.ArticleCarousel.stopSpin = true;
			var numberToHide = iterator;
			var numberToShow = iterator - 1;
			if (numberToShow < 1) {
				numberToShow = end;
			}
			articleNodes.each(function(node){
				node.one('ul.karusell-artikkel-nummer-' + numberToHide).hide();
				node.one('ul.karusell-artikkel-nummer-' + numberToShow).show();
			});
		};

		NtnuAlloy.Plugins.ArticleCarousel.next = function(iterator) {
			if (NtnuAlloy.Plugins.ArticleCarousel.running) {
				stopRunning();
			}
			NtnuAlloy.Plugins.ArticleCarousel.stopSpin = false;
			NtnuAlloy.Plugins.ArticleCarousel.spin(iterator);
		};
		
		NtnuAlloy.Plugins.ArticleCarousel.spin = function(iterator) {	
			if (!NtnuAlloy.Plugins.ArticleCarousel.stopSpin) {				
				articleNodes.each(function(node){
					var numArticles = node.getAttribute('data-num-articles') || 0;
					var numberToHide = iterator;
					var numberToShow = iterator + 1;
					if (numberToShow > numArticles) {
						numberToShow = 1;
					}				
					if (numberToShow == 1) {
						numberToHide = numArticles;
					}
					if (numberToHide > 0) {
						node.one('ul.karusell-artikkel-nummer-' + numberToHide).hide();
					}
					node.one('ul.karusell-artikkel-nummer-' + numberToShow).show();					
					if (NtnuAlloy.Plugins.ArticleCarousel.running) {
						var delay = node.getAttribute('data-article-delay')*1000 || 2000;
						setTimeout("NtnuAlloy.Plugins.ArticleCarousel.spin(" + numberToShow + ")", delay);
					}
				});
			}			
		};
		
		function stopRunning() {			
			NtnuAlloy.Plugins.ArticleCarousel.running = false;
			articleNodes.each(function(node){
				var subNodes = node.all('a.pause');
				subNodes.each(function(subSubNode) {
					subSubNode.removeClass('pause');
					subSubNode.addClass('play');
				});
			});				
		}
		
		if (articleNodes && !articleNodes.isEmpty()) {
			var carousel = function(config) {
				var node = config.host;
				var numArticles = node.getAttribute('data-num-articles') || 0;
				var manualStart = node.getAttribute('data-article-manualstart') || false;
							
				if (numArticles > 0) {
					if (!manualStart) {
						NtnuAlloy.Plugins.ArticleCarousel.spin(0);
					} else {
						NtnuAlloy.Plugins.ArticleCarousel.next(0);
					}
				}
			};
			carousel.NS = 'carousel';
			articleNodes.plug(carousel);
		}		
	});
};
