/*
=============================================================
						 COPY RIGHTS			
			-------------------------------------
			Przedsiebiorstwo Informatyczne WTSOFT
			-------------------------------------
=============================================================
*/

(function($){
	$.extend({
		wtsoftAJAX : function(settings){
			settings = jQuery.extend({
				// Ustawienie cache zapytan
				cache: true,
				cacheElements: {},
				// Elementy dla ktorych zostanie wykonane zapytanie
				jqSelector: null,
				jqLoaderSelector: null,
				// Nazwa przyciskow nawigacyjnych z opcjami
				navigation: 'wtsoftajax'
			},settings);
			if(!settings.jqSelector)
				return false;
			
			return new $.wtsAJAX(settings);
		},
		wtsAJAX : function(settings){
			this.genSets = settings;
			// Ustawienie nawigacji
			this.setNavigation();
		}
	});
	$.extend($.wtsAJAX.prototype, {
		setNavigation : function(){
			// Przepisanie obiektu
			var self = this;
			// Odswiearzanie dla linkow
			$('a['+self.genSets.navigation+'*="refresh"]').click(function(){
				makeHref = $(this).attr('href');
				self.make({
					href: makeHref,
					jqSelector: self.genSets.jqSelector,
					jqLoaderSelector: self.genSets.jqLoaderSelector
				});
				return false;
			});
			// Dla elementow click
			$('['+self.genSets.navigation+'*="refresh"]['+self.genSets.navigation+'*="click"]').click(function(){
				makeHref = $(this).attr(self.genSets.navigation+'-click');
				qData = {};
				i = 0;
				$('['+self.genSets.navigation+'*="addtorefresh"]').each(function(){
					if(typeof $(this).val == 'function'){
						val = $(this).val();
						qData[i] = val;
						i++;
					}
				});
				self.make({
					href: makeHref,
					queryData: qData,
					jqSelector: self.genSets.jqSelector,
					jqLoaderSelector: self.genSets.jqLoaderSelector
				});
				return false;
			});
			// Odswierzanie dla elementow dblclick
			$('['+self.genSets.navigation+'*="refresh"]['+self.genSets.navigation+'*="dblclick"]').dblclick(function(){
				makeHref = $(this).attr(self.genSets.navigation+'-dblclick');
				self.make({
					href: makeHref,
					jqSelector: self.genSets.jqSelector,
					jqLoaderSelector: self.genSets.jqLoaderSelector
				});
				return false;
			});
			// Odswierzanie dla elementow keyup
			$('['+self.genSets.navigation+'*="refresh"]['+self.genSets.navigation+'*="keyup"]').keyup(function(){
				val = $(this).val();
				// Trim
				val = val.replace(/^\s+/,'','gm').replace(/\s+$/,'','gm');
				// Sprawdzanie czy wartosc moze byc zerowa
				attributes = $(this).attr(self.genSets.navigation);
				if(attributes.indexOf('noempty') != -1 && val.length == 0){
					self.abort();
				}else{
					makeHref = $(this).attr(self.genSets.navigation+'-keyup')+val;
					self.make({
						href: makeHref,
						jqSelector: self.genSets.jqSelector,
						jqLoaderSelector: self.genSets.jqLoaderSelector
					});
				}
				
				return false;
			});
			// Odswierzanie dla elementow keydown
			$('['+self.genSets.navigation+'*="refresh"]['+self.genSets.navigation+'*="keydown"]').keydown(function(){
				val = $(this).val();
				// Trim
				val = val.replace(/^\s+/,'','gm').replace(/\s+$/,'','gm');
				// Sprawdzanie czy wartosc moze byc zerowa
				attributs = $(this).attr(self.genSets.navigation);
				if(attributs.indexOf('noempty') != -1 && val.length == 0){
					self.abort();
				}else{
					makeHref = $(this).attr(self.genSets.navigation+'-keydown')+val;
					self.make({
						href: makeHref,
						jqSelector: self.genSets.jqSelector,
						jqLoaderSelector: self.genSets.jqLoaderSelector
					});
				}
				
				return false;
			});
			// Odswierzanie dla elemento change
			$('['+self.genSets.navigation+'*="refresh"]['+self.genSets.navigation+'*="change"]').change(function(){
//				makeHref = $(this).attr(self.genSets.navigation+'-change');
				makeHref = $('option:selected',this).attr(self.genSets.navigation+'-change');
				self.make({
					href: makeHref,
					jqSelector: self.genSets.jqSelector,
					jqLoaderSelector: self.genSets.jqLoaderSelector
				});
				return false;
			});
			// Odswierzanie dla elementow submit
			$('['+self.genSets.navigation+'*="refresh"]['+self.genSets.navigation+'*="submit"]').submit(function(){
				makeHref = $(this).attr(self.genSets.navigation+'-submit')+$('['+self.genSets.navigation+'*="submitval"]',this).val();
				self.make({
					href: makeHref,
					jqSelector: self.genSets.jqSelector,
					jqLoaderSelector: self.genSets.jqLoaderSelector
				});
				return false;
			});
		},
		
		make : function(settings, callback){
			var sets = jQuery.extend({
				// Tym zapytania
				method: 'post',
				// Adres strony do wykonania
				href: null,
				// Dodatkowe opcje do zapytania
				queryData: {},
				dataType: 'html'
			},settings);
			
			// Przepisanie obiektu
			var self = this;
			
			// Zatrzymywanie poprzedniego zapytania
			self.cut();
			
			jqMatchedObj = $(self.genSets.jqSelector);
			if(jqMatchedObj.length == 0)
				return false;
			// Sprawdz poprawnosc url
			if(!sets.href || sets.href.length == 0 || typeof(sets.href) != 'string' || sets.href == '#')
				return false;
			// Sprawdzanie cache
			var cache = false;
			if(self.genSets.cache == true){
				for(i in self.genSets.cacheElements){
					element = self.genSets.cacheElements[i];
					if(element.href == sets.href){
						cache = true;
						data = element.data;
					}
				}
			}
			// Wczytywanie danych z cache
			if(cache == true){
				jqMatchedObj.html(data);
				// Funkcja uzytkownika
				if(typeof callback == 'function'){
					callback();
				}
				// Chowanie loadera
				if(self.genSets.jqLoaderSelector)
					$(self.genSets.jqLoaderSelector).fadeOut(300);
			}else{
				// Pokazywanie loadera
				if(self.genSets.jqLoaderSelector)
					$(self.genSets.jqLoaderSelector).fadeIn(300);
				// Wykonanie zapytania
				$(document).ready(function(){
					self.ax = $.ajax({
						type: sets.method,
						url: sets.href,
						dataType: sets.dataType,
						data: sets.queryData,
						success: function(data){
							jqMatchedObj.html(data);
							// Cache'owanie wynikow zapytan
							if(self.genSets.cache == true){
								self.genSets.cacheElements[sets.href] = {};
								self.genSets.cacheElements[sets.href].href = sets.href;
								self.genSets.cacheElements[sets.href].data = data;
							}
							// Funkcja uzytkownika
							if(typeof callback == 'function'){
								callback();
							}
							if(self.genSets.jqLoaderSelector)
								$(self.genSets.jqLoaderSelector).fadeOut(300);
						}
					});
				});
			}
			return false;
		},
		
		cut: function(){
			// Zatrzymuje zapytanie przed rozpoczeciem nastepnego
			if(this.ax && typeof this.ax.abort == 'function')
				this.ax.abort();
		},
		
		abort : function(){
			// Zatrzymywanie poprzedniego zapytania
			this.cut();
			if(this.genSets.jqLoaderSelector)
				$(this.genSets.jqLoaderSelector).fadeOut(300);
		}
	});
})(jQuery)