/*
=============================================================
						 COPY RIGHTS			
			-------------------------------------
			Przedsiebiorstwo Informatyczne WTSOFT
			-------------------------------------
=============================================================
*/

/**
 * -------------
 * -- FUNKCJE --
 * -------------
 * - $().jqForm()
 * - $().autoFill()
 * - $().maxlength()
 */

/**
 * Zarzadzanie formularzem, pokazywanie, chowanie itp.
 * 
 * WYMAGANIA
 * ---------
 * jquery.js
 * 
 * Przy starcie selectory sa chowane, pokazywane, lub wylaczane w zaleznosci od tego czy pola sa ustawione czy nie.
 * -------------------------------
 * OPCJE FUNKCJI $().jqForm({...})
 * -------------------------------
 * - showSpeed - szybkosc pokazywania elementu
 * - hideSpeed - szybkosc chowania elementu
 * - showAnimation - sposob animacji pokazywania elementu (fade, slide, show) domyslnie slide
 * - hideAnimation - sposob animacji chowania elementu (fade, slide, show) domyslnie slide
 * - navigation - tablica nawigacji elementow
 * 				navigation[id_el][visibility] - lista selektorow do pokazania / schowania
 * 				navigation[id_el][access] - lista selektorow do aktywowania / dezaktywowania
 * - noClear - tablica selektorow elementow ktore nie maja byc czyszczone przy chowaniu
 * 
 */
(function($){
	$.fn.jqForm = function(settings){
		var sets = jQuery.extend({
			// Szybkosc pokazywania
			showSpeed: 350,
			// Szybkosc chowania
			hideSpeed: 350,
			// Typ animacji
			showAnimation: 'slide',
			hideAnimation: 'slide',
			//---------------------------------
			// Navigacja - elemnty do nawigacji
			//---------------------------------
			navigation : false,
			//-----------------------------------------------
			// No clear - nie czysc tych elementow po zmianie
			//-----------------------------------------------
			noClear : []
		},settings);
		
		// Tablica elementow nawigacji
		var navigation = {};
		
		// Unikalny nr id dla obiektow
		var uniqId = 0;
		var idPref = 'wts_jqf-';
		// Unikalna kalsa dla elementow aktywnego formularza
		var uniqClassEle = 'wts-jqform-ele';
		// Unikalna kalsa dla nawigacji
		var uniqClassNav = 'wts-jqform-nav';
		
		// Przepisanie pasujacych elementow
		var self = this;
		
		// Tablica elementow zalezych dla select i radio
		var relElements = {};
		// Tablica statusow elementu na ktorych wykonywana jest akcja
		var elementStatus = {};
		// Tablica powiazan elementow - dzici dla elementow
		var elementChildren = {};
		
		// Tablica elementow do wykonania akcji
		var toAction = {};
		// Tablica elementow do czyszczenia
		var toClear = {};
		// Selektory elemenot do NIE czyszczenia
		var noClear = '';
		
		// Ustaw elementy do nawigacji
		var jqSelectSelectors 	= String();
		var jqRadioSelectors 	= String();
		var jqCheckboxSelectors = String();
		
		// Funkcja chowa jq obiekt
		function hideSelector(obj){
			if(!obj || typeof(obj) != 'object') return false;
			
			// Schowaj
			switch(sets.hideAnimation){
				case 'none':
				case 'no':
					obj.hide();
					break;
				case 'show':
					obj.hide(sets.showSpeed);
					break;
				case 'fade':
					obj.fadeOute(sets.showSpeed);
					break;
				case 'slide':
				default:
					obj.slideUp(sets.showSpeed);
					break;
			}
		}
		
		// Funkcja pokazuje jq object
		function showSelector(obj){
			if(!obj || typeof(obj) != 'object') return false;
			
			// Pokaz 
			switch(sets.showAnimation){
				case 'none':
				case 'no':
					obj.show();
					break;
				case 'show':
					obj.show(sets.hideSpeed);
					break;
				case 'fade':
					obj.fadeIn(sets.hideSpeed);
					break;
				case 'slide':
				default:
					if($.browser.msie) obj.show(sets.hideSpeed);
					else obj.slideDown(sets.hideSpeed);
					break;
			}
		}
		
		//-----------------------------------------------------
		// Funkcja zwraca i ewentualnie ustawia id dla elementu
		//-----------------------------------------------------
		function elementId(obj){
			if(typeof(obj) != 'object' || obj.length == 0) return false;
			var objId = obj.attr('id');
			if(!objId){
				objId = idPref+(uniqId++);
				obj.attr('id',objId);
			}
			return objId;
		}
		
		//---------------------------
		// Pobierz selektory atrybutu
		//---------------------------
		function getJQSelectors(jqSelector){
			if(typeof jqSelector == 'string'){
				jqSelector = jqSelector.replace(/^\s*/gi,'').replace(/$\s*/gi,'').replace(/,\s*/gi,',');
				jqSelectors = jqSelector.split(',');
				if(typeof(jqSelectors) == 'object'){
					var ret = [];
					for(var i in jqSelectors){
						var sel = jqSelectors[i];
						var obj = $(sel);
						if(obj.length){
							var objId = elementId(obj);
							// Dodaj unikalna klase dla elementu
							obj.addClass(uniqClassEle);
							if(!ret[objId]) ret[objId] = {};
							ret[objId] = obj;
						}
					}
					return ret;
				}
			}
			return false;
		}
		
		// ------------
		// Wyczysc pola
		// ------------
		function clear(){
			
		}
		
		//----------------------
		// Funkcja zwraca status
		//----------------------
		function checkStatus(obj){
			if(!obj) return -1;
			var stat = 0;
			for(var i in obj){
				if(obj[i] == 1){
					stat = 1;
					break;
				}
			}
			return stat;
		}
		
		//------------------------
		// Ustaw status poczatkowy
		//------------------------
		function setElementBeginStatus(jqObjs, type, rel){
			if(typeof(jqObjs) != 'object') return false;
			// Pobierz rodzica
			var parent = navigation[rel];
			if(!parent) return false;
			var parentObj = parent['obj'];
			// Sprawdz czy rodzic jest wybrany / zazanczony
			var stat = 0;
			if(parent['type'] == 'option'){
				if(parentObj.is(':selected')) stat = 1;
			}else if(parent['type'] == 'radio' || parent['type'] == 'checkbox'){
				if(parentObj.is(':checked')) stat = 1;
			}
			for(var i in jqObjs){
				var obj = jqObjs[i];
				// Zapisz element
				if(!elementStatus[i]) elementStatus[i] = {};
				if(!elementStatus[i][type]) elementStatus[i][type] = {};
				// Ustaw status poczatkowy
				elementStatus[i][type][rel] = stat;
			}
		}
		
		//---------------------------
		// Ustaw dzieci dla elementow
		//---------------------------
		function setChildren(){
			if(typeof(elementStatus) != 'object') return false;
			for(var i in elementStatus){
				if(!elementChildren[i]) elementChildren[i] = {};
				$('.'+uniqClassNav,$('#'+i)).each(function(){
					var elId = elementId($(this));
					elementChildren[i][elId] = elId;
				});
			}
		}
		
		//-------------------------------------------------
		// Uaktualnij status dla dzieci chowanych elementow
		//-------------------------------------------------
		function updateChildrenStatus(elId){
			if(!elId) return false;
			// Pobierz dzici nawigacyjne dla elementu
			if(elementChildren[elId] && typeof(elementChildren[elId]) == 'object')
				for(var i in elementChildren[elId]){
					var relVObj = navigation[i]['vObj'];
					for(var j in relVObj){
						if(typeof(relVObj) == 'object'){
							if(elementStatus[j]['visibility'][i] != 0) toAction[j] = j;
							elementStatus[j]['visibility'][i] = 0;
						}
					}
				}
		}
		
		//------------------
		// Uaktualnij status
		//------------------
		function updateStatus(elId){
			if(!elId) return false;
			// Pobierz element
			var el = navigation[elId];
			
			//-----------------------------------------------------
			// Uaktualnij status dla elementow powiazanych - OPTION
			//-----------------------------------------------------
			if(el['type'] == 'option'){
				// Uaktualnij elementy powiazane
				if(relElements[el['parentId']]['visibility']){
					for(var i in relElements[el['parentId']]['visibility']){
						var relElId = relElements[el['parentId']]['visibility'][i];
						if(relElId == elId) continue;
						
						var relVObj = navigation[relElId]['vObj'];
						if(typeof(relVObj) == 'object'){
							for(var j in relVObj){
								if(elementStatus[j]['visibility'][relElId] != 0) toAction[j] = j;
								elementStatus[j]['visibility'][relElId] = 0;
								// Uaktualnij status dzieci
								updateChildrenStatus(j);
							}
						}
					}
				}
				if(relElements[el['parentId']]['access']){
					for(var i in relElements[el['parentId']]['access']){
						var relElId = relElements[el['parentId']]['access'][i];
						if(relElId == elId) continue;
						
						var relVObj = navigation[relElId]['vObj'];
						if(typeof(relVObj) == 'object'){
							for(var j in relVObj){
								if(elementStatus[j]['access'][relElId] != 0) toAction[j] = j;
								elementStatus[j]['access'][relElId] = 0;
								// Uaktualnij status dzieci
								updateChildrenStatus(j);
							}
						}
					}
				}
				
				if(el['vObj']){
					for(var i in el['vObj']){
						if(elementStatus[i]['visibility'][elId] != 1) toAction[i] = i;
						elementStatus[i]['visibility'][elId] = 1;
					}
				}
				if(el['aObj']){
					for(var i in el['aObj']){
						if(elementStatus[i]['access'][elId] != 1) toAction[i] = i;
						elementStatus[i]['access'][elId] = 1;
					}
				}
			}else if(el['type'] == 'radio'){
			//----------------------------------------------------
			// Uaktualnij status dla elementow powiazanych - RADIO
			//----------------------------------------------------
				// Uaktualnij elementy powiazane
				if(relElements[el['name']]['visibility']){
					for(var i in relElements[el['name']]['visibility']){
						var relElId = relElements[el['name']]['visibility'][i];
						if(relElId == elId) continue;
						
						var relVObj = navigation[relElId]['vObj'];
						if(typeof(relVObj) == 'object'){
							for(var j in relVObj){
								if(elementStatus[j]['visibility'][relElId] != 0) toAction[j] = j;
								elementStatus[j]['visibility'][relElId] = 0;
								// Uaktualnij status dzieci
								updateChildrenStatus(j);
							}
						}
					}
				}
				if(relElements[el['name']]['access']){
					for(var i in relElements[el['name']]['access']){
						var relElId = relElements[el['name']]['access'][i];
						if(relElId == elId) continue;
						
						var relVObj = navigation[relElId]['vObj'];
						if(typeof(relVObj) == 'object'){
							for(var j in relVObj){
								if(elementStatus[j]['access'][relElId] != 0) toAction[j] = j;
								elementStatus[j]['access'][relElId] = 0;
								// Uaktualnij status dzieci
								updateChildrenStatus(j);
							}
						}
					}
				}
				
				if(el['vObj']){
					for(var i in el['vObj']){
						if(elementStatus[i]['visibility'][elId] != 1) toAction[i] = i;
						elementStatus[i]['visibility'][elId] = 1;
					}
				}
				if(el['aObj']){
					for(var i in el['aObj']){
						if(elementStatus[i]['access'][elId] != 1) toAction[i] = i;
						elementStatus[i]['access'][elId] = 1;
					}
				}
			}else if(el['type'] == 'checkbox'){
			//----------------------------------------------------------
			// Uaktualnij status dla elementow powiazanych typu CHECKBOX
			//----------------------------------------------------------
				if(el['vObj']){
					for(var i in el['vObj']){
						toAction[i] = i;
						if(elementStatus[i]['visibility'][elId] == 1) 
							elementStatus[i]['visibility'][elId] = 0;
						else
							elementStatus[i]['visibility'][elId] = 1;
					}
				}
				if(el['aObj']){
					for(var i in el['aObj']){
						toAction[i] = i;
						if(elementStatus[i]['visibility'][elId] == 1) 
							elementStatus[i]['visibility'][elId] = 0;
						else
							elementStatus[i]['visibility'][elId] = 1;
					}
				}
			}
			
			return true;
		}
		
		//----------------------------------------
		// Wykonaj akcje dla niezbednych elementow
		// Schowaj / pokaz / akatywuj / dezaktywuj
		//----------------------------------------
		function makeAction(start){
			if(!toAction && !start) return true;
			var toHide = [];
			var toShow = [];
			var toEnable = [];
			var toDisable = [];
			// Czyszczenie pol
			var toClear = [];
			if(start){
				for(var i in elementStatus){
					var toActEl = elementStatus[i];
					if(toActEl['visibility'])
						if(checkStatus(toActEl['visibility'])) toShow[toShow.length] = '#'+i;
						else toHide[toHide.length] = '#'+i;
					if(toActEl['access'])
						if(checkStatus(toActEl['access'])) toEnable[toEnable.length] = '#'+i;
						else toDisable[toDisable.length] = '#'+i;
				}
			}else{
				// Ustaw akcje dla elementow
				for(var i in toAction){
					var toActElId = toAction[i];
					if(elementStatus[toActElId]['visibility'])
						if(checkStatus(elementStatus[toActElId]['visibility'])) toShow[toShow.length] = '#'+toActElId;
						else{
							toHide[toHide.length] = '#'+toActElId;
							// Wyczysc pola
							if(noClear.length > 0){
								// Pomin pola dodane w tablicy sets.noClear
								toClear[toClear.length] = '#'+toActElId+' :text:not('+noClear+')';
								toClear[toClear.length] = '#'+toActElId+' :checkbox:not('+noClear+')';
								toClear[toClear.length] = '#'+toActElId+' :radio:not('+noClear+')';
								toClear[toClear.length] = '#'+toActElId+' select:not('+noClear+')';
								toClear[toClear.length] = '#'+toActElId+':not('+noClear+')';
							}else{
								toClear[toClear.length] = '#'+toActElId+' :text';
								toClear[toClear.length] = '#'+toActElId+' :checkbox';
								toClear[toClear.length] = '#'+toActElId+' :radio';
								toClear[toClear.length] = '#'+toActElId+' select';
								toClear[toClear.length] = '#'+toActElId;
							}
						}
					if(elementStatus[toActElId]['access'])
						if(checkStatus(elementStatus[toActElId]['access'])) toEnable[toEnable.length] = '#'+toActElId;
						else toDisable[toDisable.length] = '#'+toActElId;
				}
			}
			// Wyczysc tablice akcji
			toAction = {};
			// Wykonaj odpowiednia akcje
			// HIDE - Schowaj elementy
			if(toHide.length > 0){
				var toHideSel = toHide.join(', ');
				hideSelector($(toHideSel,self));
			}
			// SHOW - Pokaz elementy
			if(toShow.length > 0){
				var toShowSel = toShow.join(', ');
				showSelector($(toShowSel,self));
			}
			// CLEAR - Wyczysc elementy
			if(toClear.length > 0){
				var toClearSel = toClear.join(', ');
				$(toClearSel,self).val('');
			}
			return true;
		}
		
		//------------------------------------
		// Ustaw poczatkowe dane dla nawigacji
		//------------------------------------
		function start(){
			// Zakoncz jezeli nie jest podana nawigacja
			if(sets.navigation == false || typeof(sets.navigation) != 'object') return false;
			
			var tmpNavSelect = {};
			var tmpNavRadio = {};
			var tmpNavCheckbox = {};
			
			for(var i in sets.navigation){
				var nav = sets.navigation[i];
				$(i).each(function(){
					// Element nawigacyjny
					var navEl = $(this);
					
					// Pobierz id elementu nawigacyjnego
					var navId = elementId(navEl);
					// Przepisz element do globalnej tablicy
					navigation[navId] = nav;
					navigation[navId]['obj'] = navEl;
					
					//-----------------------------------------
					// Ustaw typ pola select / radio / checkbox
					//-----------------------------------------
					if(navEl.is('option')){
						navigation[navId]['type'] = 'option';
					}else if(navEl.is(':radio')){
						navigation[navId]['type'] = 'radio';
					}else if(navEl.is(':checkbox')){
						navigation[navId]['type'] = 'checkbox';
					};
					
					// Ustaw klase dle elementu nawigacji
					navEl.addClass(uniqClassNav);
					
					// Elementy do akcji VISIBILITY - pokaz / schowaj
					if(nav['visibility']){
						var vEl = nav['visibility'];
						// Pobeirz tablice obiektow do akcji
						navigation[navId]['vObj'] = getJQSelectors(vEl);
						// Ustaw status poczatkowy
						setElementBeginStatus(navigation[navId]['vObj'], 'visibility', navId);
					}
					// Elementy do akcji ACCESS - wlacz / wylacz
					if(nav['access']){
						var aEl = nav['access'];
					}
					
					// Pobierz rodzica elementu gdy select lub radio
					if(navigation[navId]['type'] && (navigation[navId]['type'] == 'option')){
						// Rodzic elementu
						var navElParentEl = navEl.parent();
						if(navElParentEl.length != 0){
							// ID rodzica elementu
							var navElParentId = elementId(navElParentEl);
							// Zapisz dane rodzica
							navigation[navId]['parent'] = navElParentEl;
							navigation[navId]['parentId'] = navElParentId;
							
							// Ustaw elementy do nawigacji
							tmpNavSelect[navElParentId] = navElParentId;
							
							// Ustaw zeleznosc dla VISIBLITY 
							if(vEl){
								if(!relElements[navElParentId])
									relElements[navElParentId] = {};
								if(!relElements[navElParentId]['visibility'])
									relElements[navElParentId]['visibility'] = [];
								relElements[navElParentId]['visibility'][relElements[navElParentId]['visibility'].length] = navId;
							}
							// Ustaw zeleznosc dla ACCESS 
							if(aEl){
								if(!relElements[navElParentId])
									relElements[navElParentId] = {};
								if(!relElements[navElParentId]['access'])
									relElements[navElParentId]['access'] = [];
								relElements[navElParentId]['access'][relElements[navElParentId]['access'].length] = navId;
							}
						}
					}else if(navigation[navId]['type'] && navigation[navId]['type'] == 'radio'){
						// Name dla elmentu radio
						var navElName = navEl.attr('name');
						// Zapisz nazwe
						navigation[navId]['name'] = navElName;
						
						// Ustaw elementy do nawigacji
						tmpNavRadio[navId] = navId;
						
						// Ustaw zeleznosc dla VISIBLITY 
						if(vEl){
							if(!relElements[navElName])
								relElements[navElName] = {};
							if(!relElements[navElName]['visibility'])
								relElements[navElName]['visibility'] = [];
							relElements[navElName]['visibility'][relElements[navElName]['visibility'].length] = navId;
						}
						// Ustaw zeleznosc dla ACCESS 
						if(aEl){
							if(!relElements[navElName])
								relElements[navElName] = {};
							if(!relElements[navElName]['access'])
								relElements[navElName]['access'] = [];
							relElements[navElName]['access'][relElements[navElName]['access'].length] = navId;
						}
					}else if(navigation[navId]['type'] && navigation[navId]['type'] == 'checkbox'){
						tmpNavCheckbox[navId] = navId;
					}
				});
			}
			
			// Ustaw puste elementy nawigacji dla rodzicow
			if(typeof(relElements) == 'object'){
				for(var i in relElements){
					var re = relElements[i];
					if($('option:not(.'+uniqClassNav+')',$('#'+i)).length){
						$('option:not(.'+uniqClassNav+')',$('#'+i)).each(function(){
							// Pobierz id elementu
							var elId = elementId($(this));
							// Ustaw opcje nawigacji
							navigation[elId] = {
								type : 'option',
								parentId : i
							};
						});
					}else if($(':radio[name=\''+i+'\']:not(.'+uniqClassNav+')').length){
						$(':radio[name=\''+i+'\']:not(.'+uniqClassNav+')').each(function(){
							// Pobierz id elementu
							var elId = elementId($(this));
							// Ustaw opcje nawigacji
							navigation[elId] = {
								type : 'radio',
								name : i
							};
							// selektor do nawigacji
							tmpNavRadio[elId] = elId;
						});
					}
				}
			}
			
			// Ustaw selektory do nawigacji
			if(typeof(tmpNavSelect) == 'object'){
				for(var i in tmpNavSelect){
					if(jqSelectSelectors.length > 0) jqSelectSelectors += ',';
					jqSelectSelectors += '#'+tmpNavSelect[i];
				}
			}
			if(typeof(tmpNavRadio) == 'object'){
				for(var i in tmpNavRadio){
					if(jqRadioSelectors.length > 0) jqRadioSelectors += ',';
					jqRadioSelectors += ':radio#'+tmpNavRadio[i];
				}
			}
			if(typeof(tmpNavCheckbox) == 'object'){
				for(var i in tmpNavCheckbox){
					if(jqCheckboxSelectors.length > 0) jqCheckboxSelectors += ',';
					jqCheckboxSelectors += ':checkbox#'+tmpNavCheckbox[i];
				}
			}
			
			// Ustaw selektroy no clear
			if(sets.noClear && sets.noClear.length > 0){
				noClear = sets.noClear.join(', ');
			}
			
			// Ustaw dzieci navigacji dla elementow
			setChildren();
			
			// Wykonaj akcje dla elementow poczatkowych
			makeAction(true);
		}
		
		//----------------
		// Ustaw nawigacje
		//----------------
		function setNavigation(){
			if(navigation == false || typeof(navigation) != 'object') return false;
			
			//--------------------
			//------ SELECT ------
			//--------------------
			if(jqSelectSelectors.length != 0){
				$(jqSelectSelectors).change(function(){
					// Pobierz id
					var sid = elementId($(this));
					var selected = $(':selected',this);
					var len = selected.length;
					if(typeof(selected) == 'object' && len > 0){
						if(len == 1){
							var sob = $(selected[0]);
							var sobid = sob.attr('id');
							// Uaktualnij status dla elementu
							updateStatus(sobid);
						}else{
							// MULTIPLE
							// Pobrac liste id i uaktualnic status dla wszystkich id na raz
						}
					}
					
					// Wykonaj akcje
					makeAction();
				});
			}
			//-------------------
			//------ RADIO ------
			//-------------------
			if(jqRadioSelectors.length != 0){
				$(jqRadioSelectors).click(function(){
					// Pobierz Id elementu
					var cid = elementId($(this));
					// Uaktualnij status dla elementu
					updateStatus(cid);
					makeAction();
				});
			}
			//----------------------
			//------ CHECKBOX ------
			//----------------------
			if(jqCheckboxSelectors.length != 0){
				$(jqCheckboxSelectors).click(function(){
					// Pobierz Id elementu
					var cid = elementId($(this));
					// Uaktualnij status dla elementu
					updateStatus(cid);
					makeAction();
				});
			}
		}
		
		// Ustawienia startowe
		start();
		
//		console.log(relElements);
//		console.log(elementStatus);
//		console.log(elementChildren);
//		console.log(jqCheckboxSelectors);
//		console.log(jqRadioSelectors);
		
		// Ustaw nawigacje
		setNavigation();
		return true;
	}
})(jQuery);


/**
 * Automatyczne uzupelnianie wartosci inputa
 * 
 * ---------
 * WYMAGANIA
 * ---------
 * - jquery.js
 * 
 * --------------------------------
 * OPCJE funkcji $().autoFill({..})
 * --------------------------------
 * - filltype - typ uzupelniania, keyup - domyslne - na chwile obecna jedyny sposob
 * - source - jqSelector elementu skad pobieramy wartosc
 * - notrim - brak czyszczenia bilych znakow (true / false), domyslnie false
 * - nopl - podmien polskie litery, domyslnie false
 * - alphanum - podmien wszystkie inne znaki niz alfanumeryczne
 * - lower - transformacja wartosci z source do malych liter (true / false), domyslnie false
 * - switchspace - podmien spacje na podany znak, domyslnie false - nie podmienia
 * - removefrombegin - podmien z poczatku ciagu podany ciag znakow, domyslnie false - nie podmienia
 * - fillonlyempty - uzupelnij gdy pole docelowe jest puste, domyslnie false - uzupelnia zawsze
 * 
 */
(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,
			alphanum : 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;
		}
		// Funkcja usuwa wszystkie znaki inne niz alfanumeryczne
		function alphanum(str){
			var signs = [';',',','.','<','>','"','\'','[',']','{','}','\\','|','/','?','!','@','#','$','%','^','&','*','(',')','-','=','+'];
			for(i in signs){
				str = str.replace(signs[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);
					}
					
					// Usun znaki inne niz alphanum
					if(settings.alphanum === true){
						retValue = alphanum(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
 * 
 * ---------
 * WYMAGANIA
 * ---------
 * - jquery.js
 * 
 * --------------------------------------
 * OPCJE DLA FUNKCJI $().maxlength({...})
 * --------------------------------------
 * - filltype - akcji (keyup, keydown), domyslnie "keyup"
 * - maxlength - maksymalna dlusco pola
 * - counter - jqSelector elementu gdzie ma byc pokazywana ilosc pozostalych znakow
 * 
 */
(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);