(function(sk, $){

	/*
		Vytvořil:
		18.09.2011 | Michal Matuška
		
		Změny:
		-
		
		Opravené bugy:
		-
		
		Vyžaduje:
		sk.utils.Position
		
		Popis:
		vytvoří vyskakovací okna. Volá se na element který má vyskakovací okno ovládat. Pokud jde o element "A" dialog se určí z hashe
		pokud není v options nastaveno jinak.
		
	*/
	
	
	sk.widgets.Dialog = function(control, options)
	{	
		this.options = $.extend({
			// pokud "control" není odkaz nebo chceme jiný box než co je uveden v hashi
			box: '',
			// selektor pro overlay
			overlay: '',
			// událost na kterou bude okno vyskakovat
			eventName: 'mousedown',
			// zakáže defaultní událost na click
			preventClickEvent: true,
			// najde uvniř "boxu" selektor
			closeSelector: '',
			// na selektor naváže událost
			closeEventName: 'mousedown',
			// zakáže defaultní událost na click
			closePreventClickEvent: true, 
			// třída, která se přidává na "control"
			classOpenControl: 'sk-dialog-active',
			// třída, která se přidává na "box"
			classOpenBox: 'sk-dialog-open',
			// animované zobrazení boxu
			animate: true,
			// rychlost animace
			animateSpeed: 200,
			// počáteční hodnoty animace
			animateStart: {
				'opacity': 0
			},
			// konečné hodnoty animace
			animateEnd: {
				'opacity': 1
			},
			// parametry pozice
			position: {
				// element ke kterému se má zarovnávat
				anchor: '',
				// zarovnání bloku [x, y] 
				// 0 - zleva, 0.5 - vystředit, 1- zprava | 0 - zhora, 0.5 - vystředit, 1- zespoda
				align: [0,0], 
				// určení místa v elementu ke kterému se bude zarovnávat  [x, y]
				// 0 - od leva, 0.5 - od středu, 1- od prava | 0 - od zhora, 0.5 - od středu, 1- od spodu
				place: [0,0],
				// offset nové pozice [x, y]
				offset: [0,0],
				// Rychlost animace. Nula animaci vypne
				speed: 0,
				// počítat x-souřadnici
				x: true,
				// počítat z-souřadnici
				y: true	
			},
			// zajistí zobrazení pouze jednoho dialogu
			unique: true,
			// callback volaný po otevření boxu
			onOpen: false,
			// callback volaný po zavření boxu
			onClose: false
		}, options)
		
		var o = this.options;
		
		this.$control = control.jquery ? control : $(control);
		this.$box = o.box ? $(o.box) : $( this.$control.prop('hash') );
		this.$overlay = o.overlay ? $(o.overlay) : false; 
		
		this.isBoxShown = this.$box.hasClass(this.options.classOpenBox) || this.$control.hasClass(this.options.classOpenControl);
		this.unique = o.unique;
	
		return this;
	};
	
	// otevřené instance
	sk.widgets.Dialog.instances = [];
	
	// přidání instance
	sk.widgets.Dialog.add = function(instance)
	{
		sk.widgets.Dialog.instances.push(instance);	
	};
	
	// odstranění instance
	sk.widgets.Dialog.remove = function(instance)
	{
		var arr = sk.widgets.Dialog.instances;
		
		for(var i = 0, l = arr.length; i < l; i++)
		{
			if(arr[i] === instance){
				break;
			}	
		}	
		
		arr.splice(i, 1);
	};
	
	// zavřít všechny otevřené instance
	sk.widgets.Dialog.close = function(instance)
	{
		var arr = sk.widgets.Dialog.instances;
		var help = [];
		
		for(var i = 0, l = arr.length; i < l; i++)
		{
			if(arr[i] !== instance){
				help.push(arr[i])
			}
		}
		
		for(var i = 0, l = help.length; i < l; i++)
		{
			help[i].isBoxShown = false;
			help[i].close();
		}
	}
	
	// PROTOTYPE
	var _fn = sk.widgets.Dialog.prototype;
	
	_fn.init = function()
	{
		if(!this.$control.length || !this.$box.length){
			return this;
		}
		
		var o = this.options;
		
		// event
		this.$control.bind(o.eventName, $.proxy(this.handle, this));
		o.preventClickEvent && this.$control.bind('click', $.proxy(this.handleClick, this));
		// event close
		o.closeSelector && this.$box.delegate(o.closeSelector, o.closeEventName, $.proxy(this.handle, this));
		o.closeSelector && o.closePreventClickEvent && this.$box.delegate(o.closeSelector, 'click', $.proxy(this.handleClick, this));
		
		// position
		o.position.element = this.$box;
		this.position = new sk.utils.Position(o.position);
		
		// počáteční aktivace boxu
		this.isBoxShown && this.open(true);
		
		
		
		// data
		this.$control.add(this.$box).data('sk-dialog', this);
		
		return this;
	};
	
	_fn.destroy = function()
	{
		var o = this.options;
		
		this.$control.unbind(this.options.eventName, this.handle);
		o.preventClickEvent && this.$control.unbind('click', this.handleClick);	
		o.closeSelector && this.$box.undelegate(o.closeSelector, o.closeEventName, this.handle);
		o.closeSelector && o.closePreventClickEvent && this.$box.undelegate(o.closeSelector, 'click', this.handleClick);
	};
	
	_fn.open = function(initCall)
	{
			var o = this.options; 
			
			if(!sk.widgets.Dialog.instances.length && this.$overlay)
			{
				this.$overlay.show();
			}
			
			// přidání instance do pole otevřených dialogů
			sk.widgets.Dialog.add(this);
			
			if(this.unique){
				// pokud má být box na stránce unikátní zavřu ostatní
				sk.widgets.Dialog.close(this);	
			}
			
			this.$control
				.addClass(o.classOpenControl);
			
			this.$box
				.addClass(o.classOpenBox);
			
			// nastavení pozice
			this.position.init();
			!initCall && o.animate && this.$box.css(o.animateStart).animate(o.animateEnd, o.animateSpeed);	
				
			// callback
			o.onOpen && o.onOpen.call(this);		
	},
		
	_fn.close = function(initCall)
	{
		var o = this.options;
		 
		this.$control
			.removeClass(this.options.classOpenControl);
			
		this.$box
			.removeClass(this.options.classOpenBox);
		
		// deferred pro provedení funkcí	
		var dfr = $.Deferred();
		
		$.when(dfr.promise()).then($.proxy(function(){
			
			this.position.destroy();
		
			// callback
			o.onClose && o.onClose.call(this);
			
			// overlay
			if(!sk.widgets.Dialog.instances.length && this.$overlay)
			{
				this.$overlay.hide();
			}
			
		}, this))
		
		if(!initCall && o.animate){
			this.$box.animate(o.animateStart, o.animateSpeed, dfr.resolve);
		}
		else{
			dfr.resolve();	
		}
		
		// odstranění instance z pole otevřených dialogů
		sk.widgets.Dialog.remove(this);			
	}, 
	
    _fn.handle = function()
	{
    	this.isBoxShown ? this.close() : this.open();
		this.isBoxShown = !this.isBoxShown;	
		return false;
	}; 
	
	_fn.handleClick = function(e)
	{ 
		e.preventDefault() 
	}

})(sk, jQuery);

