/**
 * @author Thomas Sømoen
 */

(function($) {
 	/**
	 * Funksjon som viser en modal dialog med automatisk lukking.
	 * 
	 * @param {Object} options {title:'Overskfit på feilmeldingen',text:'Nærmere beskrivelse'}
	 * @param {Object} callback funksjon som blir kalt etter at dialogen er lukket.
	 */
	$.extend({
		alert:function(settings,callback){
			var template = $.template.fetch('.modal-alert',settings);
			var blocker = template.find('.modal-blocker');
			var dialog = template.find('.alert');
			var options = {autoclose:true,delay:4000};
				options = $.extend(options,settings);
				
			
			/* Intern funksjon som lukker dialogen, fjerner blokkeren og kaller eventuelt fallback-funksjon */
			var close = function(e){
				
				/* Dersom funksjonen kalles via en event stoppes defaulteventet. */
				if(e != undefined){
					e.preventDefault();
				}
				
				/* Fader ut dialogboksen, og fjerner den fra html-en */
				dialog.fadeOut('fast',function(){$(this).remove()});
				
				/* Fader ut blokkeren, fjerner den, setter overflow:visible på body og kaller eventuelt callback.  */
				blocker.fadeOut(
					'fast',
					function(){
						blocker.remove();
						if($.browser.msie){
							$('body').css('overflow','visible');
							$('html').css('overflow','scroll');
						}
						if(callback != undefined){
							callback.call();	
						}
					}
				);
			}	
			
			if(options.tools == undefined){
				dialog.find('ul.tools').remove();
			}
				
			/* Legger lukk på lukkeanker */	
			dialog.find('.close').click(close);
			
			if($.browser.msie){
				if($.browser.version == '6.0'){
					var top = parseInt((parseInt($(window).height())/3));
					
					blocker.css('top',$(window).scrollTop());
					
					top += $(window).scrollTop();
					dialog.css('top',top);
				}
			}
			
			/* Setter overflow:hidden på body for å stoppe skrollemulighet når dialogen er synlig */
			$('body').append(blocker).append(dialog);
			if($.browser.msie){
				$('body').css('overflow','hidden');
				$('html').css('overflow','hidden');
			}
			
			
			
			if(options.autoclose){
				/* lukker boksen etter fire sekunder */
				blocker.delay(options.delay,function(){
					close();
				});
			}
		}
	});	


	$.fn.extend({
		
		/**
		 * Viser en bekreftelsesboks med ok og cancel, og kjører hendelser knyttet til elementet dersom man trykker ok. Lukker boksen dersom ikke.
		 * 
		 * Funksjonen looper gjennom alle elementene i seleksjonen og mellomlagrer funksjonene knyttet til hendelsestype.
		 * Hendelsen nullstilles og funksjon for visning av dialogvindu tildeles i stedet. Dialogboksens ok-knapp har en hendelse som
		 * igjen nullsller hendelsen på det opprinnelige elementet, rebinder de originale hendlesene og trigger klikk.
		 * 
		 * @param {Object} options
		 */
		confirm:function(options){
			var settings	= {
				title:'Tittel mangler',
				text:'Tekst mangler',
				type:'click'
			};
			
			$.extend(settings,options);
			
			var template	= $.template.fetch('.modal-confirm',options);
			var blocker		= template.find('.modal-blocker');
			var dialog		= template.find('.alert');
			var ok			= dialog.find('li.ok a');
			var cancel		= dialog.find('li.cancel a');
			
			var hideConfirm = function(e){
				if(e != undefined){
					e.preventDefault();	
				}
				// Fader ut dialogboksen, og fjerner den fra html-en
				dialog.fadeOut('fast',function(){$(this).remove()});
				
				// Fader ut blokkeren, fjerner den, setter overflow:visible på body og kaller eventuelt callback.
				blocker.fadeOut(
					'fast',
					function(){
						blocker.remove();
						if($.browser.msie){
							$('body').css('overflow','visible');
							$('html').css('overflow','scroll');
						}
						$('ul.recipes').delay(1000,function(){
							$(this).removeClass('no-hover');
						});
					}
				);
			};
			
			var showConfirm = function(){
				blocker.show().css('opacity','0.7');
				dialog.draggable().show();
				if($.browser.msie && $.browser.version == '6.0'){
					dialog.css('position','absolute');
				}else{
					dialog.css('position','fixed');
				}
				
				
				if($.browser.msie){
					$('ul.recipes').addClass('no-hover');
					$('body').css('overflow','auto');
					$('html').css('overflow','auto');
				}
				
				
				if($.browser.msie){
					if($.browser.version == '6.0'){
						blocker.css('top',$(window).scrollTop());
						var top = parseInt((parseInt($(window).height())/3));
						top += $(window).scrollTop();
						dialog.css('top',top);
					}
				}
				$('body').append(blocker).append(dialog);
				$('body div.alert ul.tools li.cancel a ,body div.alert a.close').one('click',hideConfirm);
			};
			
			var rebindEvents = function(target,eventHolder,dialog){
				var events = $.data(eventHolder.get(0), 'events');
				
				// Looper gjennom funksjonene for hver hendelse, og sjekker om navnet på den tilbundne funksjonen finnes som klassenavn i verktøylisten.
				// Gjør den det kobles funksjonen til elementet.
				// Hvis ikke kobles hendelsen til ok-knappen dersom den finnes.
				for(var type in events){
					for (var handler in events[type]){
						// Flytter bare klikkhendelser
						if(type == 'click'){
							var funcName = events[type][handler].getFunctionName();
							
							// Beholder for data som sendes inn i hendelsen
							var data = {
								eventHolder:eventHolder,
								type:type,
								target:target,
								funcName:funcName,
								func:events[type][handler]
							};
							
							// Dersom det finnes ett funksjonsnavn og det finnes i klassenavnet kobles funksjonen til elementet
							if(funcName != undefined && $(dialog).find('li.'+funcName+' a').length > 0){
								$(dialog).find('li.'+funcName+' a').bind(
									type,
									data,
									function(e){
										e.preventDefault();
										e.data.target.unbind(e.data.type);
										e.data.target.bind(
											e.data.type,
											e.data.func
										);
										e.data.target.trigger(e.data.type);
										hideConfirm();
										e.data.target.unbind(e.data.type);
										e.data.target.copyEvents(e.data.eventHolder).confirm(options);
									}
								);
								
							// Dersom funksjonen ikke har ett navn, eller det ikke finnes blandt de definerte verktøyene så kobles hendelsene til eventuelt ok-knapp
							}else{
								$('body div.alert ul.tools li.ok a').bind(
									type,
									data,
									function(e){
										e.preventDefault();
										hideConfirm();
										e.data.target.unbind(e.data.type);
										e.data.target.copyEvents(e.data.eventHolder).trigger(e.data.type);
									}
								);
							}
						}
					}
				}
			};
			
			return this.each(function() {
				var target = this;
				$.extend(target,{
					confirm:{
						type:settings.type,
						events:$('<a href=""></a>')
					}
				});
				
				
				var $target = $(target);
				//var type = 'click';
				//var tmpButton = ok.clone();
				
				// Mellomlagrer hendelser
				$target.copyEventsTo(target.confirm.events);
				
				// Fjerner klikkhendelsen fra det opprinnelige elementet
				$target.unbind(target.confirm.type);
				
				// Legger til en ny hendelse på det opprinnelige elementet
				$target.click(function(e){
					e.preventDefault();
					
					//Viser dialogvindu
					showConfirm();
					
					// Binder events til knapper i dialogvinduet
					rebindEvents($target,target.confirm.events,$('body div.alert ul.tools'));
					$('body div.alert ul.tools li.cancel a, body div.alert div.canvas a.close').click(hideConfirm);
				});
			});
		},
		

		/**
		 * Funksjonen kansellerer tilknyttet bekreftelsesfunksjon.
		 * 
		 * Funksjonen nullstiller elementets hendelse og rebinder hendelser mellomlagret på elementet.
		 */
		cancelConfirm:function(){
			$(this).each(function(){
				if(this.confirm != undefined){
					$(this).unbind(this.confirm.type);
					$(this).copyEvents(this.confirm.events);
				}
			});
		}
	});
	
	$.extend({
		info:function(settings,callback){
			var template = $.template.fetch('.modal-info',settings);
			var blocker = template.find('.modal-blocker');
			var dialog = template.find('.ew_infobox');
			var options = {autoclose:true};
				options = $.extend(options,settings);
			
			/* Intern funksjon som lukker dialogen, fjerner blokkeren og kaller eventuelt fallback-funksjon */
			var close = function(e){
				
				/* Dersom funksjonen kalles via en event stoppes defaulteventet. */
				if(e != undefined){
					e.preventDefault();
				}
				
				/* Fader ut dialogboksen, og fjerner den fra html-en */
				dialog.fadeOut('fast',function(){$(this).remove()});
				
				/* Fader ut blokkeren, fjerner den, setter overflow:visible på body og kaller eventuelt callback.  */
				blocker.fadeOut(
					'fast',
					function(){
						blocker.remove();
						$('body').css('overflow','visible');
						if(callback != undefined){
							callback.call();	
						}
					}
				);
			}	
				
			/* Legger lukk på lukkeanker */	
			dialog.find('.close').click(close);
			
			/* Setter overflow:hidden på body for å stoppe skrollemulighet når dialogen er synlig */
			$('body').append(blocker).css('overflow','hidden').append(dialog);
			
			if(options.autoclose){
				/* lukker boksen etter fire sekunder */
				blocker.delay(4000,function(){
					close();
				});
			}
		}
	});
	
})(jQuery);
