/**
 * @author Thomas Sømoen
 *
 * Inneholder en del kjekke funksjoner som brukes her og der.
 *
 */
 
Function.prototype.getFunctionName = function(){
	var m = this.toString().match(/^\s*function\s+([^\s\(]+)/);
	return  m ? m[1].trim() : undefined;
};

 
 
 (function($) {
 	$.ajaxSetup({
 		error:function(){
 			$.alert($.settings.cookbook.alert.error);
 		}
 	});
 	
 	$.fn.extend({
		/**
		 * Kopierer hendelser fra elementet angitt som argument til elementet,
		 * @param {Object} from	jQuery objekt
		 */
		copyEvents: function(from) {
			$.event.copy( $(from), this );
			return this;
		},
		
		/**
		 * Kopierer hendelser fra element til element angitt som arguement.
		 * @param {Object} to jQuery objekt
		 */
		copyEventsTo: function(to) {
			$.event.copy( this, $(to) );
			return this;
		},
		
		wait:function(on){
			return $(this).each(function(){
				if(on == undefined){on = true};
				if(on){
					$(this).addClass('wait');
				}else{
					$(this).removeClass('wait');
				}
			});
		}
	});
	
	/**
	 * Kopierer hendelser fra ett element til et annet
	 * 
	 * @param {Object} from jQuery objekt
	 * @param {Object} to	jQuery objekt
	 */
	$.event.copy = function(from, to) {
		var events = $.data(from[0], 'events');
		if ( !from.size() || !events || !to.size() ) return;
	
		to.each(function() {
			for (var type in events)
				for (var handler in events[type])
					$.event.add(this, type, events[type][handler], events[type][handler].data);
		});
	};

	$.fn.extend({
		/**
		 * Returnerer z-index til det første morelementet som har satt z-index.
		 */
		layerPos: function() {
			var zIndex = $(this).css('z-index');
			if(zIndex == 'auto'){
				if($(this).parent() != $('body')){
					zIndex = $(this).parent().layerPos();
				}else{
					zIndex = 'auto';
				}
			}
			return zIndex;
		},
		
		/**
		 * Posisjonerer ett element gitt med offset
		 * @param {Object} {top:'',left:''}
		 */
		positionAt: function(offset) {
			return $(this).each(function(){
				var position = $(this).css('position');
				if(position == 'static'){
					$(this).css('position','absolute');
				}
				$(this).css('bottom','auto');
				$(this).css(offset);
			});
		}
	});

/**
 * Padder en streng/tall med gitt tegn
 * 
 * @param {Object} input Streng eller tall som skal paddes
 * @param {String} dir 'left' og 'right'
 * @param {Integer} length hvor lang man vil ha strengen
 * @param {Char} char tegnet som skal brukes til paddingen
 * @return String  Ny paddet streng
 */
	$.extend({
		strpad: function(input, dir, length, char){
			var result = input.toString();
		
			if(result.length < length){
				var charstr = '';
				for(var I=0;I<length;I++){
					charstr += char;
				}
				
				if(dir == 'left'){
				    result = (charstr + result).substr((result.length), length);
				}else{
					result = (result+charstr).substr(0,length);
				}
			}
			return result;
		}
	});	

	/**
	 * Gir en forsinkelse på gitt tid og kaller så gitt funksjon
	 * 
	 * @param {Object} millis
	 * @param {Object} callBack
	 * @return {Object} jQuery objekt
	 */
	$.fn.extend({
		delay:function(millis,callBack){
			var object = $(this);
		   $.extend(object,{callBack:callBack});
		   return window.setTimeout(function() {
		       object.callBack();
		       return object;
		   }, millis);
		}
	});	

	/**
	 * Funksjon som leter etter attributtet rel i en selection og returerer det som et objekt
	 * 
	 * @param {Object} 	selector
	 * @param {Boolean} asJson	true dersom returverdien skal være et javascriptobjekt. Default er true
	 * @return {Var} 			En streng eller et objekt
	 */
	$.fn.extend({
		getSettings:function(selector,asJson){
			if(asJson == undefined){
				asJson = true;
			}
			if(selector == undefined){
				var settings = $(this).attr('rel');
			}else{
				var settings = $(this).find(selector).attr('rel');
			}
			
			if(asJson){
				settings = eval('('+settings+')');
			}
			return settings;
		}
	});
	
	$.extend({
		postJSON:function(url, data, callback){
			$.post(url, data, callback, "json");
		}
	});
 	
 	$(document).ready(function(){
 		var spinner = $('<div><img src="elm/loader_hvit.gif" width="54" height="19" alt="" /><div>Venligst vent</div></div>').addClass('spinner').appendTo('body');
 		spinner.hide();
 		spinner.ajaxStart(function(){
 			$(this).show();
 		});
 		
 		spinner.ajaxStop(function(){
 			$(this).hide();
 		});
		$('a[rel="external"]').attr('target','_blank');
 	});
 	
 })(jQuery);
