// Wrapper ajaxové obsluhy

// Využití
// 1. submit tlačítko - serializuje formulář pokud nenastavím data v ajaxovém nastavení
// 2. odkaz - vezme href odkazu jako url ajaxu pokud ji nenastavím v ajaxovém nastavení
// 3. jakýkoliv jiný element - bez ajaxového nastavení nemá smysl

// Přednosti
// 1. Callbacky ajaxu jsou obalené tzn. přizpůsobení argumentů podle potřeb
// 2. Formulářová serializace
// 3. Kontrola odkazů
// 4. Přidávání parametru ajax=true pro snadnější zpracování v PHP
// 5. Ajax se nemusí vyvolávat pouze na click ale prakticky na jakoukoliv událost včetně vlastních událostí
// 6. Třída se stará pouze o odesílání co se s odpovědí stane je na vás :) 


// TODO
// pořešit navěšení submit události

// OPRAVY
// 1.6.2011 - IE < 8 nereagovalo na prázdnou url při posílání formuláře. doplněno lacation.href



sk.widgets.Ajax = function (element, ajax, options){
	
	this.selector = element;
	this.ajaxOptions = $.extend({

	}, ajax);
	this.options = $.extend({
		eventName: 'click',
		iframe: false,
		iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
		skipEncodingOverride: false
	}, options);
};

sk.widgets.Ajax.prototype = {
	
	constructor: sk.widgets.Ajax,
	
	// reference na jquery proxy
	proxy : $.proxy,
	
	// reference na jquery document
	$document : $(document),
	
	// reference na jquery ajax
	ajax : $.ajax,
		
	init: function()
	{
		
		// quick ref
		var o = this.options;

		this.$document
			.delegate(this.selector, o.eventName, this.proxy(this.handle, this));
			
	},
	// Příprava parametrů pro ajax - Odkaz
	prepareLink: function()
	{
		var a = this.ajaxOptions;
		var url = this.$target.attr('href').split('#')[0];
		url = ( url == '' ) ? '/' : url;
		
		this.url = a.url || url;
        this.type = a.type || 'GET';
		this.data = a.data ? a.data + '&ajax=true' : 'ajax=true';		
	},
	// Příprava parametrů pro ajax - Submit elementy
	prepareSubmit: function()
	{	
		
		var $form = this.$target.closest('form'),
            form = $form.get(0),
            // target button
            btn = !this.$target.is('form') && this.$target.attr('name') != '' ? this.$target.attr('name') + '=' + this.$target.val() : '',
            // form data
            data = $form.serialize() + '&' + btn + '&ajax=true',      
            // form url
            url = form.action.split('#')[0],
            
            // type
            type = form.method.toUpperCase() || 'GET',
            a = this.ajaxOptions;
         
        url = url == '' ? window.location.href : url;    
            
        this.$form = $form;   
        this.url = a.url || url;
        this.type = a.type || type;
		this.data = (typeof a.data != 'undefined') ? (a.data + '&ajax=true') : data;
		
		this.isIframe = this.options.iframe;
		
		if(this.isIframe){
			this.prepareIframe(btn);
		}
	},
	// Příprava parametrů pro ajax - Ostatní elementy
	prepareOthers: function()
	{
		var a = this.ajaxOptions;
		
		this.url = a.url || '';
        this.type = a.type || 'GET';
		this.data = a.data ? a.data + '&ajax=true' : 'ajax=true'; 		
	},
	handle: function(e)
	{	
		e.preventDefault();
		
		var a = this.ajaxOptions,
			that = this;
			
		this.$target = $(e.currentTarget);
		var type = this.getType(this.$target);
		this['prepare'+type]();
		
		// Ajax
		if(!this.isIframe){
			this.ajax({
				url: this.url,
				type: this.type,
				dataType: a.dataType || null,
				success: function(response){
	                if(typeof a.success == 'function'){
	                    a.success.call(that, response);
	                }
	            },
	            beforeSend: function(){
	            	if(typeof a.beforeSend == 'function'){
	            		return a.beforeSend.call(that);
	            	}
	            },
	            error: function(XMLHttpRequest, textStatus, errorThrown){
	            	if(console){
	            		for(var i in errorThrown){
	            			console.log(i + ': '+ errorThrown[i]);
	            		}
	            		for(var i in this){
	            			console.log(i + ': '+ this[i]);
	            		}
	            	}
	            },
	            data: this.data
			});
		}
		else{
			// before send
			if(typeof a.beforeSend == 'function'){
	            beforeSendReturn =  a.beforeSend.call(that);
	        }
	        // send
	        if( typeof beforeSendReturn == 'undefined' || beforeSendReturn !== false){
				this.$iframe.bind('load', function(){
					var doc = this.contentWindow ? this.contentWindow.document : this.contentDocument ? this.contentDocument : this.document;
					var response = doc.body ? doc.body.innerHTML : doc.documentElement ? doc.documentElement.innerHTML : null;
					
					if(typeof a.success == 'function'){
	                    a.success.call(that, response);
	                }
	                
	            	$(this).remove();
				});
				this.$form
					.prepend(this.$iframeInputs)
					.submit();
				this.$iframeInputs.remove();
			}	
		}
		
		return false;
	},
	// Test jaký element je cíl události
	getType: function($element)
	{
		if($element.is('a'))
		{
			return 'Link';
		}
		if($element.is(':submit, :image, form'))	
		{
			return 'Submit';
		}
		return 'Others';	
	},
	prepareIframe: function(btn){
		var o = this.options;
		
		// create iframe
		var id = 'sk-ajax-' + (new Date().getTime());
		this.$iframe = $('<iframe id="' + id + '" name="' + id + '" src="'+ o.iframeSrc +'" style="position:absolute; top:-5000px; left:-5000px;" />').appendTo('body');
		
		// set form attr
		this.$form
			.attr({
				'method':'POST',
				'target': id,
				'action': this.url,
				'encoding': 'multipart/form-data',
				'enctype': 'multipart/form-data'
			});
		
		// special inputs
		this.$iframeInputs = $([]);	
		this.$iframeInputs = this.$iframeInputs.add('<input type="hidden" name="ajax" value="true" />');
		if(btn){
		 this.$iframeInputs = this.$iframeInputs.add('<input type="hidden" name="'+ btn.split('=')[0] +'" value="' + btn.split('=')[1] + '" />');
		}

	}
};

