// Plugin do obsługi formularza
// All rights reserved Przedsiębiorstwo Informatyczne WTSOFT
/**
 * jq-toggle = "jqSelector"
 * - podajemy jako atrybut pola "checkbox" lub "radio", jako wartosc podajmy selectory jQuery, kolejne oddzielamy przecinkami
 * - po zaznaczeniu elementy podane jako jqSelector zostana pokazane / schowane
 * 
 * jq-show = "jqSelector"
 * jq-hide = "jqSelector"
 * - podajemy jako atrybut pola "checkbox" lub "radio", wartosc to selectory jQuery, odzielane przecinkami
 * - "jq-show" po kliknieciu pokaze pole, "jq-hide" po kliknieciu schowa selecotory
 * 
 * jq-disabled-on = "jqSelector"
 * jq-disabled-off = "jqSelector"
 * - podajemy jako atrybut pola "checkbox" lub "radio", wartosc to selectory jQuery, odzielane przecinkami
 * - "jq-disabled-on" - oznaczan iż wszystkie selectory zostana wylaczone gdy ten element jest zaznaczony
 * - "jq-disabled-off" - oznaczan iż wszystkie selectory zostana wylaczone gdy ten element nie jest zaznaczony
 * 
 * jq-no-clear="jq-no-clear"
 * - wartosc tego pola nie bedzie czyszczona przy jq-toogle, jq-hide, jq-disabled-on/off
 * 
 * Przy starcie selectory sa chowane, pokazywane, lub wylaczane w zaleznosci od tego czy pola sa ustawione czy nie.
 * 
 */
(function($){
	$.fn.jqForm = function(settings){
		var sets = jQuery.extend({
			selected: {}
		},settings);
		
		// Przepisanie pasujacych elementow
		var self = this;
		
		// Funkcja czysci howanych pol
		function clearFields(jqSelector){
			$('textarea[jq-no-clear!="jq-no-clear"]',$(jqSelector)).val('');
			$(':text[jq-no-clear!="jq-no-clear"]',$(jqSelector)).val('');
			$(':checkbox:checked[jq-no-clear!="jq-no-clear"], :radio:checked[jq-no-clear!="jq-no-clear"]',$(jqSelector)).each(function(){
					$(this).get(0).checked = false;
			});
			
//			$(':checkbox, :radio',$(jqSelector)).each(function(){
//				if($(this).get(0).checked == true){
//					$(this).get(0).checked = false;
//				}
//			});
		}
		
		// Funkcja chowa pola
		function hideFieldGroups(selector){
			// Schowaj warstwe
			$(selector,self).slideUp();
			clearFields(selector);
			// Uaktualinij powiazane elementy
			updateChildren(selector);
		}
		
		// Funkcja pokazuje pola
		function showFieldGroups(selector){
			if($.browser.msie){
				$(selector).show(300);
			}else{
				$(selector).slideDown();
			}
		}
		
		// Pobierz selektory atrybutu
		function getJQSelectors(jqSelector){
			if(typeof jqSelector == 'string'){
				jqSelectors = jqSelector.split(',');
				return jqSelectors;
			}
			return false;
		}
		
		// Funkcja deaktywuje elementy wraz z dziecmi elementow
		function disableSelectors(jqSelector){
			var jqSelectors = getJQSelectors(jqSelector);
			if(typeof jqSelectors == 'object'){
				for(i in jqSelectors){
					var selector = $.trim(jqSelectors[i]);
					// Wylacz pole
					$(selector,self).attr('disabled','disabled');
					$(selector,self).parent().addClass('disabled');
					// Wyczysc pola 
					clearFields($(selector).parent());
					// Uaktualnij dzieci
					updateChildren(selector);
				}
			}
		}
		
		// Funkcja aktywuje elementy
		function enableSelectors(jqSelector){
			var jqSelectors = getJQSelectors(jqSelector);
			if(typeof jqSelectors == 'object'){
				for(i in jqSelectors){
					var selector = $.trim(jqSelectors[i]);
					// Wlacz pole
					$(selector,self).attr('disabled','');
					$(selector,self).parent().removeClass('disabled');
				}
			}
		}
		
		// Funkcja sprawdza czy dzieci elementu nie maja opcji do wylaczenia, schowania, pokazania itp...
		function updateChildren(jqSelector){
			// Sprawdz czy sa pola ktore rozwijaj podwarstwy i schowaj je
			$(jqSelector+'[jq-toggle]',self).each(function(){
				var jqToggleSelector = $(this).attr('jq-toggle');
				hideFieldGroups(jqToggleSelector);
			});
			$(jqSelector+'[jq-hide]',self).each(function(){
				var jqHideSelector = $(this).attr('jq-hide');
				hideFieldGroups(jqHideSelector);
			});
		}
			
		// Funkcja ustawia nawivacje
		function setNavigation(){
			// Pokaz / schowaj
			$(':input[jq-toggle]',self).click(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-toggle');
				if(typeof jqSelector == 'string'){
					jqSelectors = jqSelector.split(',');
				}
				// Wyczysc pola dla chowajacych sie pol
				if($(this).get(0).checked != true){
					if(typeof jqSelectors == 'object'){
						for(i in jqSelectors){
							var hide = true;
							var selector = $.trim(jqSelectors[i]);
							$(':input[jq-toggle*='+selector+']',self).each(function(){
								if($(this).get(0).checked == true){
									hide = false;
								}
							});
							if(hide){
								hideFieldGroups(selector);
							}
						}
					}
				}else{
					// Pokaz
					showFieldGroups(jqSelector);
				}
			});
			$('select',self).change(function(){
				$('option[jq-toggle]',this).each(function(){
					// Selector jQuery
					jqSelector = $(this).attr('jq-toggle');
					jqSelectors = getJQSelectors(jqSelector);
					// Wyczysc pola dla chowajacych sie pol
					if($(this).get(0).selected != true){
						if(typeof jqSelectors == 'object'){
							for(i in jqSelectors){
								var hide = true;
								var selector = $.trim(jqSelectors[i]);
								$(':input[jq-toggle*='+selector+']',self).each(function(){
									if($(this).get(0).checked == true){
										hide = false;
									}
								});
								if(hide){
									hideFieldGroups(selector);
								}
							}
						}
					}else{
						// Pokaz
						showFieldGroups(jqSelector);
					}
				})
			});
			
			// Pokaz
			$(':input[jq-show]',self).click(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-show');
				// Pokaz
				showFieldGroups(jqSelector);
			});
		
			// Schowaj
			$(':input[jq-hide]',self).click(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-hide');
				// Schowaj
				hideFieldGroups(jqSelector);
			});
			
			// Dezaktywuj gdy pole zaznaczone
			$(':input[jq-disabled-on]',self).click(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-disabled-on');
				// Wylacz / wlacz
				if($(this).get(0).checked == true){
					disableSelectors(jqSelector);
				}else{
					enableSelectors(jqSelector);
				}
			});
			
			// Dezaktywuj gdy pole niezaznaczone
			$(':input[jq-disabled-off]',self).click(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-disabled-off');
				// Wylacz / wlacz
				if($(this).get(0).checked == false){
					disableSelectors(jqSelector);
				}else{
					enableSelectors(jqSelector);
				}
			});
		}
		
		// Fukcja ustawia poczatkowe ustawienia
		function start(){
			// Ustawienie wybranych elementow poczatkowych
			if(typeof sets.selected == 'object'){
				for(i in sets.selected){
					var selected = String(sets.selected[i]);
					var name = '';
					var val = '';
					var tab = [];
					
					if(selected.indexOf('=') != -1){
						tab = selected.split('=');
						name = tab[0];
						val = tab[1];
					}else{
						name = selected;
					}
					
					$(':input[name="'+name+'"]'+(val.length > 0? '[value="'+val+'"]' : '')).get(0).checked = true;
				}
			}
			
			$(':input[jq-toggle]',self).each(function(){
				if($(this).get(0).checked == true){
					jqSelector = $(this).attr('jq-toggle');
					showFieldGroups(jqSelector);
				}
			});
			$('option[jq-toggle]',self).each(function(){
				if($(this).get(0).selected == true){
					jqSelector = $(this).attr('jq-toggle');
					showFieldGroups(jqSelector);
				}
			});
			$(':input[jq-show]',self).each(function(){
				if($(this).get(0).checked == true){
					jqSelector = $(this).attr('jq-show');
					showFieldGroups(jqSelector);
				}
			});
			
			// Dezaktywuj gdy pole zaznaczone
			$(':input[jq-disabled-on]',self).each(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-disabled-on');
				// Wylacz / wlacz
				if($(this).get(0).checked == true){
					disableSelectors(jqSelector);
				}else{
					enableSelectors(jqSelector);
				}
			});
			
			// Dezaktywuj gdy pole niezaznaczone
			$(':input[jq-disabled-off]',self).each(function(){
				// Selector jQuery
				jqSelector = $(this).attr('jq-disabled-off');
				// Wylacz / wlacz
				if($(this).get(0).checked == false){
					disableSelectors(jqSelector);
				}else{
					enableSelectors(jqSelector);
				}
			});
		}
		
		// Ustaw nawigacje
		setNavigation();
		// Ustawienia startowe
		start();
		return true;
	}

})(jQuery);


// Automatyczne uzupelnianie wartosci inputa
(function($){
	$.fn.autoFill = function(settings){
		var settings = jQuery.extend({
			// Uzupelnij automatycznie podczas pisania
			filltype: 'keyup',
			// JQElementy
			// Zrodlo - skad pobieramy wartosc - jqSelector
			source: '',
			// Sposoby transformacji 
			notrim: false,
			nopl: false,
			lower: false,
			switchspace: false,
			switcher: {},
			removeformbegin: false,
			// Uzupelnij gdy pusty
			fillonlyempty: false
		},settings);
		
		// Usuwa polskie litery zastepujac je odpowiednikami
		function nopl(str){
			var pl 		= ['ą','Ą','ć','Ć','ę','Ę','ł','Ł','ń','Ń','ó','Ó','ś','Ś','ż','Ż','ź','Ź'];
			var repPl 	= ['a','A','c','C','e','E','l','L','n','N','o','O','s','S','z','Z','z','Z'];
		
			for(i in pl){
				str = str.replace(pl[i],repPl[i],'gm');
			}
			
			return str;
		}
		
		// Przepisanie pasujacych elementow
		var jQueryMatchedObj = this;
		
		if(typeof settings.source != 'string')
			return false;
		
		var sourceElement = $(settings.source);
		if(sourceElement.length != 1)
			return  false
		
		// Przerwij jezeli dest jest wypelnione a flaga umozliwiajaca wypelnienie tylko pustego pola jest ustawiona
		if(settings.fillonlyempty === true){
			var destinationVal = jQueryMatchedObj.val();
			if(destinationVal.length != 0)
				return true;
		}
		
		switch(settings.filltype){
			case 'keyup':
				$(settings.source).keyup(function(){
					var retValue = sourceElement.val();
					
					// Usun biale znaki z poczatku i konca wartosci
					if(settings.notrim === false){
						retValue = jQuery.trim(retValue);
					}
					
					// Zamien na male litery gdy jest wlaczona flaga
					if(settings.lower === true){
						retValue = retValue.toLowerCase();
					}
					
					// Usun polskie litery
					if(settings.nopl === true){
						retValue = nopl(retValue);
					}
					
					// Podmien spacje
					if(settings.switchspace !== false && typeof settings.switchspace == 'string'){
						retValue = retValue.replace(/\s+/gmi,settings.switchspace);
					}
					
					// Usun znak z poczatku
					if(settings.removefrombegin !== false && typeof settings.removefrombegin == 'string'){
						var re = new RegExp('^'+settings.removefrombegin+'+','gmi');
						retValue = retValue.replace(re,'');
					}
					
					// przypisz wartosc
					jQueryMatchedObj.val(retValue);
					
					return true;
				});
				break;
		}
		
		
		return true;
	}
})(jQuery);

// Funkcja dla texarea do obcinania ilosci znakow i do informowania uzytkownika ile znakow pozostalo
(function($){
	$.fn.maxlength = function(settings){
		var settings = jQuery.extend({
			// Uzupelnij automatycznie podczas pisania
			filltype: 'keyup',
			// Maksymalna dlugosc
			maxlength: false,
			// JQElementy
			// jqElement wskazujacy gdzie ma pokazywac informacje ile zostalo znakow
			counter: false
		},settings);
		
		// Przepisanie pasujacych elementow
		var jqMatchedObj = this;
		// Wylacz jezeli nie jest ustawiona dlugosc maksymalna
		if(settings.maxlength == false)
			return false;
		
		// Funkcja zwraca aktualna dlugosc wpisanego ciagu
		function getLength(obj){
			return $(obj).val().length;
		}
		// Funkcja zwraca ilosc znakow ktora pozostala do wpisania
		function getLeftLength(obj){
			var len = getLength(obj);
			return settings.maxlength - len;
		}
		// Funkcja obcina tekst o okreslona liczbe znakow i zwraca nowy tekst
		function cutText(obj,cutLen){
			if(!cutLen) cutLen = 1;
			var value = $(obj).val();
			return value.substr(0,(value.length - cutLen));
		}
		// Funkcja ustawia licznik informacyjny
		function setCounter(counterLen){
			if(settings.counter === false)
				return false;
			if(counterLen < 0) counterLen = 0;
			$(settings.counter).html(String(counterLen));
		}
		
		// Funkcja ustawiajaca dane poczatkowe
		function start(){
			$(jqMatchedObj).each(function(){
				make(this);
			});
		}
		
		
		// Funkcja wykonujaca
		function make(obj){
			var leftLen = getLeftLength(obj);
			var counterLen = leftLen;
			if(leftLen < 0){
				// Przekroczono dozwolona dlugosc
				// Przytnij tekst do dozwolonej dlugosci
				var newText = cutText(obj,Math.abs(leftLen));
				// Przypisz nowy tekst
				$(obj).val(newText);
			}
			// Ustaw licznik informacyjny
			setCounter(counterLen);
			return true;
		}
		switch(settings.filltype){
			case 'keyup':
				$(jqMatchedObj).keyup(function(){
					make(this);
				});
				break;
			case 'keydown':
				$(jqMatchedObj).keydown(function(){
					make(this);
				});
				break;
		}
		
		// Funkcja ustawia wartosci poczatkowe
		start();
		return true;
	}
})(jQuery);
