/**
 *	Ajaxowa wersja skryptu do obslugi tabel
 *
 *	Requires MooTools v1.2
 */
var CoolTableAjax = new Class ({
	/**
	 *	Konstruktor, inicjalizacja klasy, zmiennych
	 *	@param string el
	 *	@param object opt
	 *	@return void
	 */
	initialize : function(el, opt) {
		this.element = $(el);
		this.elementBody = $(el+'_BODY');
	//	this.headers = [];
	//	this.rows = [];
		
		this.currentPage = 1;
		this.pagesAll = 1;
		this.rowsAll = 0;
		this.rowsFrom = null;
		this.rowsTo = null;
		this.pagesMade = false;		//wskaznik, czy strony zostaly juz utworzone
		this.searchString = '';
		this.lastWord = '';			//ostatni ciag wyszukiwania
		
		this.lang = $H({
			quickSearchText: 'Szybkie wyszukiwanie',
			firstText: '‹‹ Pier',
			prevText: '‹ Poprz',
			nextText: 'Nast ›',
			lastText: 'Ost ››',
			ofText: 'z'
		});
		
		//Kolejnosc liter alfabetu (sortowanie) (UTF-8!)
	//	this.sortOrder = " !\"#$%&'()*+,-./0123456789:;<=>?@AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓóPpQqRrSsŚśTtUuVvWwXxYyZzŹźŻż[\\]^_`{|}~";
		
		//Opcje
		this.options = $H({
			useQuickSearch: true,
			quickSearchId: 'ct-quicksearch_field',
			usePaging: true,		//depends: useQuickSearch
			rowsPerPages: 20,
			tableWidth: '500',
			useAjax: true,
			ajaxFile: false,
			defaultSortField: '',
			defaultSortOrder: 'ASC'
		});
		this.options.extend(opt);
		
		this.sortField = this.options.defaultSortField;
		this.sortOrder = this.options.defaultSortOrder;
		
		//Nie moze byc dzielenia na strony, jezeli nie ma wyszukiwania - przynajmniej narazie
		if (this.options.usePaging && !this.options.useQuickSearch) {
			this.options.usePaging = false;
		}
		
		//przypisanie zdarzenia dla pola szybkiego wyszukiwania
		if (this.options.useQuickSearch) this._bindQuickSearch();
		
		//przypisanie akcji dla sortowania
		this._bindSortButtons();
		
		this.options.ajaxFile = this.options.ajaxFile+'.ajax.html';
		this._getData();
	},
	
	/**
	 *	Pokazywanie grafiki przedstawiającej ładowanie danych podczas wczytywania zawartości
	 *	@param string divID
	 *	@param int imgSize
	 */
	 //!!MUSZE TROCHE PRZEROBIC TE FUNKCJE!!//
	Loader : function(divID, imgSize) {
		divX = $(divID).getStyle('width');
		divY = $(divID).getStyle('height');
		
		if (imgSize == undefined || imgSize == null || imgSize == '' || imgSize > 32) {
			imgSize = 32;		//domyslna maksymalna wartosc
		} else if (imgSize < 12) {
			imgSize = 12;		//domyslna minimalna wartosc
		}
		
		imgLeft = (parseInt(divX) - imgSize) / 2;
		imgTop = (parseInt(divY) - imgSize) / 2;
		divX = parseInt(divX) - imgLeft;
		divY = parseInt(divX) - imgTop;
		
		var el = new Element('div'/*, {
			'styles': {
				'width': divX,
				'height': divY,
				'padding-left': imgLeft+'px',
				'padding-top': imgTop+'px'
			}
		}*/);
		el.injectTop(divID);
		
		var img = new Element('img', {
			'src': 'img/loader.gif',
			'width': imgSize+'px',
			'height': imgSize+'px'
		});
		img.injectInside(el);
	},
	
	/**
	 *	Funkcja zerujaca wszystkie ustawienia filtrow, numerow stron, pozycji na stronach
	 */
	_clearFilters : function() {
		$(this.options.quickSearchId).value = '';
		this._blurQuickSearch();
		this.currentPage = 1;
		this.pagesAll = 1;
		this.rowsAll = 0;
		this.rowsFrom = null;
		this.rowsTo = null;
		this.searchString = '';
		this.lastWord = '';
	},

		
	/**
	 *	Funkcja pobierajaca dane z pliku ajaxowego
	 */
	_getData : function() {
		var obj = this;
		var daneXHR = new Request({
			'url': obj.options.ajaxFile,		//dodalem dla 1.2
			'method': 'get',
			onRequest: function() {
				obj.Loader($('ct-quicksearch_loading'),18);
			},
			onSuccess: function() {
				responseTmp = this.response.text.split('|><|');
				obj.rowsAll = responseTmp[0];
				
				//wyswietlenie wynikow dzialania skryptu
				obj.elementBody.set('html', responseTmp[1]);
				
				if (obj.options.usePaging && !obj.pagesMade) {
					obj.pagesMade = true;
					obj._makePages();
					//obliczenie ilosci stron potrzebnych do wyswietlenia wszystkich danych
				}
				$('ct-quicksearch_loading').set('html', '');		//schowanie grafiki ladujacej
				obj._rebuild();
			}
		});
		
		//search narazie zostawie puste
		if (obj.options.usePaging) {
			daneXHR.send('page='+this.currentPage+'&pagesQ='+this.options.rowsPerPages+'&search='+this.searchString+'&sortField='+this.sortField+'&sortOrder='+this.sortOrder);
		} else {
			daneXHR.send('search='+this.searchString+'&sortField='+this.sortField+'&sortOrder='+this.sortOrder);
		}
		
	/*	//podzielenie tabelki na strony
		if (this.options.usePaging && !this.pagesMade) {
			this.pagesMade = true;
			this._makePages();
			//obliczenie ilosci stron potrzebnych do wyswietlenia wszystkich danych
		} else {
			this._rebuild();
		}
	*/	
	},
	
	/**
	 *	Funkcja testujaca wystepowanie zmiennych
	 *	@return void
	 */
	_ShowVariables : function() {
		alert(this.element);
		alert(this.headers);
		alert(this.rows);
	},
	
	/**
	 *	Sortowanie tabeli
	 *	@param int kolumna
	 *	@return void
	 */
/*	_sort: function(kolumna) {
		this.quicksort(this.rows, 1, this.rows.length-1, kolumna);
		
		//zmiana typu sortowania
		this.headers[kolumna].sortType = (this.headers[kolumna].sortType == 'asc') ? 'desc' : 'asc';
		
		this._rebuild();
	},
*/	
	/**
	 *	Algorytm sortujacy (porwnujacy) dwa ciagi znakow uwzgledniajac polskie literki oraz ustawiajace
	 *	je wg okreslonego wzorca
	 *	@param string a
	 *	@param string b
	 *	@return int
	 */
/*	cmp: function(a, b) {
		if (a == b) return 0;
		a = a+" "; b = b+" ";
		ile = (a.length >= b.length) ? b.length : a.length;
		for (numer=0;numer<ile;numer++) {
			if (this.sortOrder.indexOf(a.charAt(numer)) < this.sortOrder.indexOf(b.charAt(numer))) return -1;
			if (this.sortOrder.indexOf(a.charAt(numer)) > this.sortOrder.indexOf(b.charAt(numer))) return 1;
		}
	},
*/
	
	/**
	 *	Algorytm rekurencyjny szybkiego sortowania 'Quicksort'
	 *	@param array tab
	 *	@param int left
	 *	@param int kolumna
	 *	@return void
	 */
/*	quicksort: function(tab, left, right, kolumna) {
		var i = left;
		var j = right;
		var Index = parseInt((left+right)/2);
		var x = tab[Index][kolumna];
		do {
			if (this.headers[kolumna].sortType == 'asc') {
				while (this.cmp(tab[i][kolumna], x) == -1) i++;
				while (this.cmp(tab[j][kolumna], x) == 1) j--;
			//	while (tab[i][kolumna] < x) i++;
			//	while (tab[j][kolumna] > x) j--;
			} else if (this.headers[kolumna].sortType == 'desc') {
				while (this.cmp(tab[i][kolumna], x) == 1) i++;
				while (this.cmp(tab[j][kolumna], x) == -1) j--;
			//	while (tab[i][kolumna] > x) i++;
			//	while (tab[j][kolumna] < x) j--;
			}
			if (i <= j) {
				var tmp = [];
				tmp = tab[i];
				tab[i++] = tab[j];
				tab[j--] = tmp;
			}
		} while (i <= j);
		
		if (left < j) this.quicksort(tab, left, j, kolumna);
		if (i < right) this.quicksort(tab, i, right, kolumna);
	}, 
*/	
	/**
	 *	Aktualizacja tabeli
	 *	@return void
	 */
	_rebuild: function() {
		if (this.options.usePaging) {
			this.pagesAll = parseInt(this.rowsAll / this.options.rowsPerPages);
			if (this.rowsAll % this.options.rowsPerPages > 0) this.pagesAll++;
			
			//pokazanie lub schowanie linkow do nawigacji
			//ustawienie od ktorego do ktorego rekordu maja byc wyswietlone wyniki
			this.rowsFrom = (this.options.rowsPerPages * this.currentPage) - this.options.rowsPerPages+1;
			this.rowsTo = this.rowsFrom + this.options.rowsPerPages-1;
			var shows = this.rowsAll;
			
			//przyciski nawigacyjne
/*first*/	$(this.options.quickSearchId).getParent().getPrevious().getFirst().setStyle('display', (this.currentPage <= 2 || !this.options.usePaging) ? 'none' : 'inline');
/*prev*/	$(this.options.quickSearchId).getParent().getPrevious().getFirst().getNext().setStyle('display', (this.currentPage <= 1 || !this.options.usePaging) ? 'none' : 'inline');
/*next*/	$(this.options.quickSearchId).getParent().getPrevious().getFirst().getNext().getNext().getNext().setStyle('display', (this.currentPage >= this.pagesAll || !this.options.usePaging) ? 'none' : 'inline');
/*last*/	$(this.options.quickSearchId).getParent().getPrevious().getFirst().getNext().getNext().getNext().getNext().setStyle('display', (this.currentPage >= this.pagesAll-1 || !this.options.usePaging) ? 'none' : 'inline');
/*text*/	$(this.options.quickSearchId).getParent().getPrevious().getFirst().getNext().getNext().set('html', this.rowsFrom+'-'+((this.rowsTo < shows) ? this.rowsTo : shows)+' '+this.lang.ofText+' '+shows);
		}
		
		this.podswietlaj();
	},
	
	/**
	 *	Podswietlanie wierszy tabeli
	 *	@return void
	 */
	podswietlaj: function() {
		$$('.light').each(function(element){
			var efekt = new Fx.Tween(element, {duration:300, wait:false});
	 
			element.addEvent('mouseenter', function(){
				efekt.start('background-color', '#ffffff','#dbe9f1');
			});
	 
			element.addEvent('mouseleave', function(){
				efekt.start('background-color', '#dbe9f1','#ffffff');
			});
		});
	},
	
	/**
	 *	Funkcja konwertujaca ciag znakow na utf-8
	 *	@param string string
	 *	@return string utftext
	 */
	utf8_encode: function(string) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   improved by: sowberry
	    // +    tweaked by: Jack
	    // +   bugfixed by: Onno Marsman
	    // +   improved by: Yves Sucaet
	    // +   bugfixed by: Onno Marsman
	    // *     example 1: utf8_encode('Kevin van Zonneveld');
	    // *     returns 1: 'Kevin van Zonneveld'
	 
	    string = (string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
	 
	    var utftext = "";
	    var start, end;
	    var stringl = 0;
	 
	    start = end = 0;
	    stringl = string.length;
	    for (var n = 0; n < stringl; n++) {
	        var c1 = string.charCodeAt(n);
	        var enc = null;
	 
	        if (c1 < 128) {
	            end++;
	        } else if((c1 > 127) && (c1 < 2048)) {
	            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
	        } else {
	            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
	        }
	        if (enc != null) {
	            if (end > start) {
	                utftext += string.substring(start, end);
	            }
	            utftext += enc;
	            start = end = n+1;
	        }
	    }
	 
	    if (end > start) {
	        utftext += string.substring(start, string.length);
	    }
	 
	    return utftext;
	},
	
	/**
	 *	Funkcja konwertujaca ciag znakow na base64
	 *	@param string data
	 *	@return string enc
	 */
	base64_encode: function(data) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Tyler Akins (http://rumkin.com)
	    // +   improved by: Bayron Guevara
	    // +   improved by: Thunder.m
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)        
	    // -    depends on: utf8_encode
	    // *     example 1: base64_encode('Kevin van Zonneveld');
	    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
	 
	    // mozilla has this native
	    // - but breaks in 2.0.0.12!
	    //if (typeof window['atob'] == 'function') {
	    //    return atob(data);
	    //}
	        
	    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, enc="", tmp_arr = [];
	    data = this.utf8_encode(data);
	    
	    do { // pack three octets into four hexets
	        o1 = data.charCodeAt(i++);
	        o2 = data.charCodeAt(i++);
	        o3 = data.charCodeAt(i++);
	 
	        bits = o1<<16 | o2<<8 | o3;
	 
	        h1 = bits>>18 & 0x3f;
	        h2 = bits>>12 & 0x3f;
	        h3 = bits>>6 & 0x3f;
	        h4 = bits & 0x3f;
	 
	        // use hexets to index into b64, and append result to encoded string
	        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
	    } while (i < data.length);
	    
	    enc = tmp_arr.join('');
	    
	    switch( data.length % 3 ){
	        case 1:
	            enc = enc.slice(0, -2) + '==';
	        break;
	        case 2:
	            enc = enc.slice(0, -1) + '=';
	        break;
	    }
	 
	    return enc;
	},
		
	/**
	 *	Filtrowanie danych w tablicy na podstawie klucza (wyrazu)
	 *	@params string string
	 *	@return void
	 */
	_filtruj: function(string) {
		if (string != '') {
			this.searchString = this.base64_encode(string);
		} else {
			this.searchString = '';
		}
		this._getData();
	},
	
	/**
	 *	Dodanie akcji dla przyciskow sluzacych do sortowania
	 *	@return void
	 */
	_bindSortButtons: function() {
		var obj = this;
		$$('.ct-sortable').each(function(td){
			var TDpadding = td.getStyle('padding');
			var TDwidth = td.getStyle('width');
			var aElement = new Element('a', {
				'href': 'javascript:;',
				'class': 'ct-header',
				'style': 'width:100%; padding: '+TDpadding+'; width: '+TDwidth,
				'events': {
					'click': function() {
						oldSortField = obj.sortField;
						obj.sortField = td.getProperty('rel');
						
						obj.sortOrder = (obj.sortOrder == 'ASC') ? 'DESC' : 'ASC';		//##	przetestowac czy na pewno dobrze dziala!	##
						obj.sortOrder = (oldSortField != obj.sortField) ? 'ASC' : obj.sortOrder;
						obj._getData();
						
						//wizualizacja sortowania
						//skasowanie wszystkich najpierw
						if (obj.element.getElement('span[class=ct-sortasc]')) {
							obj.element.getElement('span[class=ct-sortasc]').removeClass('ct-sortasc');
						}
						if (obj.element.getElement('span[class=ct-sortdesc]')) {
							obj.element.getElement('span[class=ct-sortdesc]').removeClass('ct-sortdesc');
						}
						
						//i ustawienie nowego
						spanElement.addClass('ct-sort'+obj.sortOrder.toLowerCase());
					}
				}
			});
			var spanElement = new Element('span');
			var txt = td.innerHTML;
			td.innerHTML = '';
			aElement.injectInside(td);
			spanElement.injectInside(aElement);
			spanElement.set('html', txt);
			if (td.getProperty('rel') == obj.sortField) {
				spanElement.addClass('ct-sort'+obj.sortOrder.toLowerCase());
			}
			
			//usuniecie marginesow i wciec
			td.setStyle('padding', '0');
		});

		
		
/*		$$('.ct-sortable').addEvents({
			'click': function() {
				oldSortField = obj.sortField;
				obj.sortField = this.getProperty('rel');
				
				obj.sortOrder = (obj.sortOrder == 'ASC') ? 'DESC' : 'ASC';		//##	przetestowac czy na pewno dobrze dziala!	##
				obj.sortOrder = (oldSortField != obj.sortField) ? 'ASC' : obj.sortOrder;
				obj._getData();
				
				//wizualizacja sortowania
				//skasowanie wszystkich najpierw
				if (obj.element.getElement('span[class=ct-sortasc]')) {
					obj.element.getElement('span[class=ct-sortasc]').removeClass('ct-sortasc');
				}
				if (obj.element.getElement('span[class=ct-sortdesc]')) {
					obj.element.getElement('span[class=ct-sortdesc]').removeClass('ct-sortdesc');
				}
				
				//i ustawienie nowego
				var spanElement = this.getElement('span').addClass('ct-sort'+obj.sortOrder.toLowerCase());
				
				
			//	if (spanElement.hasClass('ct-sort'+obj.sortOrder.toLowerCase())) {
			//		this.getElement('span').removeClass('ct-sort'+obj.sortOrder.toLowerCase());
			//	}
			},
			'mouseover': function() {
				this.addClass('ct-mouseover');
			},
			'mouseleave': function() {
				this.removeClass('ct-mouseover');
			}
		});
*/	},
	
	/**
	 *	Dodanie pola quicksearch
	 *	Dodanie zdarzenia na puszczenie klawisza w polu quick-search
	 *	@return void
	 */
	_bindQuickSearch: function() {
		//dodanie pola quicksearch
		var obj = this;
		var el = new Element('div', {
			'styles': {
				'width': parseInt(this.options.tableWidth)+'px'
			},
			'class': 'ct-quicksearch_area'
		});
		el.injectBefore(this.element);
		
		var span = new Element('span', {
			'class': 'ct-quicksearch-listview'
		});
		span.injectInside(el);
		
		var l = new Element('a', {
			'href': 'javascript:;',
			'events': {
				'click': function() {
					$(obj.options.quickSearchId).value = '';
					this.setStyle('display', 'none');
					obj.currentPage = 1;
					obj._filtruj($(obj.options.quickSearchId).value);	//nowa funkcja wykorzystujaca tylko JavaScript
					obj._blurQuickSearch();
				},
				'focus': function() {
					this.blur();
				}
			}
		});
		l.injectInside(span);
		
		var span2 = new Element('span');
		span2.injectInside(l);
		
		var field = new Element('input', {
			'type': 'text',
			'id': this.options.quickSearchId,
			'class': this.options.quickSearchId+' ct-gray',
			'value': this.lang.quickSearchText,
			'events': {
				'focus': function() {
					obj._focusQuickSearch();
				},
				'blur': function() {
					obj._blurQuickSearch();
				},
				'keyup': function() {
					if (this.value != obj.lastWord) {
						if (this.value.length > 0) {
							this.getPrevious().setStyle('display', 'block');
						} else {
							this.getPrevious().setStyle('display', 'none');
						}
					//	$E('a', 'ct-quicksearch-listview').setStyle('display', 'block');
						last_search = new Date;
						(function() {
							current_search = new Date();
							if (current_search.getTime() - 250 > last_search.getTime()) {
								obj.currentPage = 1;
								obj._filtruj($(obj.options.quickSearchId).value);	//nowa funkcja wykorzystujaca tylko JavaScript
								last_search = new Date();
								obj.lastWord = $(obj.options.quickSearchId).value;
							}
							obj._rebuild();
						}).delay(500);
					}
				}
			}
		});
		field.injectInside(span);
		
		var loadDiv = new Element('div', {
			'class': 'ct-quicksearch_loading',
			'id': 'ct-quicksearch_loading'
		});
		loadDiv.injectTop(el);
	},
	
	/**
	 *	Zdarzenie wywolane po aktywacji pola input
	 *	@return void
	 */
	_focusQuickSearch: function() {
		if ($(this.options.quickSearchId).value == this.lang.quickSearchText) {
			$(this.options.quickSearchId).setProperty('value', '');
			$(this.options.quickSearchId).removeClass('ct-gray');
		}
	},
	
	/**
	 *	Zdarzenie wywolane po deaktywacji pola input
	 *	@return void
	 */
	_blurQuickSearch: function() {
		if ($(this.options.quickSearchId).value != this.lang.quickSearchText && $(this.options.quickSearchId).value == '') {
			$(this.options.quickSearchId).addClass('ct-gray');
			$(this.options.quickSearchId).setProperty('value', this.lang.quickSearchText);
		}
	},
	
	/**
	 *	Dzielenie tabelki na strony
	 *	@return void
	 */
	_makePages: function() {
		var obj = this;
		var wierszy = this.rowsAll;
		var pages = this.pagesAll;

		//ustawienie od ktorego do ktorego rekordu maja byc wyswietlone wyniki
		if (this.options.usePaging) {
			this.rowsFrom = (this.options.rowsPerPages * this.currentPage) - this.options.rowsPerPages+1;
			this.rowsTo = this.rowsFrom + this.options.rowsPerPages-1;
			this.pagesAll = pages;
		} else {
			this.rowsFrom = 1;
			this.rowsTo = wierszy;
			this.pagesAll = 1;
		}
		
		//pokazanie linkow ze stronami
		var div = new Element('div', {
			'class': 'ct-quicksearch-listview_nav'
		});
		div.injectBefore($(this.options.quickSearchId).getParent());
		
		var span = new Element('span');
		span.injectInside(div);
		span.set('html', this.rowsFrom+'-'+this.rowsTo+' '+this.lang.ofText+' '+wierszy);
		
		var linkNext = new Element('a', {
			'href': 'javascript:;',
			'class': 'pages next',
			'events': {
				'click': function() {
					obj._nextPage();
				}
			}
		});
		linkNext.injectAfter(span);
		linkNext.set('html', this.lang.nextText);
		
		var linkPrev = new Element('a', {
			'href': 'javascript:;',
			'class': 'pages prev',
			'events': {
				'click': function() {
					obj._prevPage();
				}
			}
		});
		linkPrev.injectBefore(span);
		linkPrev.set('html', this.lang.prevText);
		
		var linkFirst = new Element('a', {
			'href': 'javascript:;',
			'class': 'pages first',
			'events': {
				'click': function() {
					obj._firstPage();
				}
			}
		});
		linkFirst.injectBefore(linkPrev);
		linkFirst.set('html', this.lang.firstText);
		
		var linkLast = new Element('a', {
			'href': 'javascript:;',
			'class': 'pages last',
			'events': {
				'click': function() {
					obj._lastPage();
				}
			}
		});
		linkLast.injectAfter(linkNext);
		linkLast.set('html', this.lang.lastText);
		
		
	//	this._getData();
	}, 
	
	/**
	 *	Przejscie do nastepnej strony
	 *	@return void
	 */
	_nextPage: function() {
		this.currentPage++;
		this._getData();
	},
	
	/**
	 *	Przejscie do poprzedniej strony
	 *	@return void
	 */
	_prevPage: function() {
		this.currentPage--;
		this._getData();
	},
	
	/**
	 *	Przejscie do ostatniej strony
	 *	@return void
	 */
	_lastPage: function() {
		this.currentPage = this.pagesAll;
		this._getData();
	},
	
	/**
	 *	Przejscie do pierwszej strony
	 *	@return void
	 */
	_firstPage: function() {
		this.currentPage = 1;
		this._getData();
	}

});
