/*
=============================================================
						 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',
			// Wylacz pola
			disabledAccess: false,
			//---------------------------------
			// 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 wylacza element
		function disableSelector(obj){
			if(!obj || typeof(obj) != 'object') return false;
			
			// Wylacz
			obj.addClass('disabled');
			if(sets.disabledAccess){
				obj.attr('disabled','disabled');
			}else obj.attr('readonly','readonly');
		}
		
		// Funkcja wlacza element
		function enableSelector(obj){
			if(!obj || typeof(obj) != 'object') return false;
			
			// Wylacz
			obj.removeClass('disabled');
			if(sets.disabledAccess)
				obj.removeAttr('disabled');
			else obj.removeAttr('readonly');
		}
		
		//-----------------------------------------------------
		// 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){
							obj.each(function(){
								var objId = elementId($(this));
								// Dodaj unikalna klase dla elementu
								$(this).addClass(uniqClassEle);
								if(!ret[objId]) ret[objId] = {};
								ret[objId] = $(this);
							});
						}
					}
					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;
							updateChildrenStatus(i);
						}
					}
					var relAObj = navigation[i]['aObj'];
					for(var j in relAObj){
						if(typeof(relAObj) == 'object'){
							if(elementStatus[j]['access'][i] != 0) toAction[j] = j;
							elementStatus[j]['access'][i] = 0;
							updateChildrenStatus(i);
						}
					}
				}
		}
		
		//------------------
		// 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 relAObj = navigation[relElId]['aObj'];
						if(typeof(relAObj) == 'object'){
							for(var j in relAObj){
								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;
						// Uaktualnij status dzieci
						updateChildrenStatus(i);
					}
				}
				if(el['aObj']){
					for(var i in el['aObj']){
						toAction[i] = i;
						if(elementStatus[i]['access'][elId] == 1) 
							elementStatus[i]['access'][elId] = 0;
						else
							elementStatus[i]['access'][elId] = 1;
						// Uaktualnij status dzieci
						updateChildrenStatus(i);
					}
				}
			}
			
			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+'.is(:input), #'+i+' :input ';
						else toDisable[toDisable.length] = '#'+i+'.is(:input), #'+i+' :input ';
				}
			}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(sets.noClear !== true){
								if(noClear && noClear.length > 0){
									// Pomin pola dodane w tablicy sets.noClear
									toClear[toClear.length] = '#'+toActElId+' :input:not('+noClear+')';
									toClear[toClear.length] = '#'+toActElId+':not('+noClear+')';
								}else{
									toClear[toClear.length] = '#'+toActElId+' ';
								}
							}
						}
					if(elementStatus[toActElId]['access'])
						if(checkStatus(elementStatus[toActElId]['access'])) toEnable[toEnable.length] = '#'+toActElId+' :input, '+'#'+toActElId+'.is(:input)';
						else{
							toDisable[toDisable.length] = '#'+toActElId+' :input, #'+toActElId+'.is(:input)';
//							toDisable[toDisable.length] = '#'+toActElId+'.is(:input) ';
							// Wyczysc pola
							if(typeof(sets.noClear) == 'object'){
								for(j in sets.noClear){
									toClear[toClear.length] = sets.noClear[j]+' :input';
									toClear[toClear.length] = ':input('+sets.noClear[j]+')';
								}
							}else{
								toClear[toClear.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));
			}
			// DISABLE - wylacz
			if(toDisable.length > 0){
				var toDisableSel = toDisable.join(', ');
				disableSelector($(toDisableSel));
			}
			// ENABLE - wlacz
			if(toEnable.length > 0){
				var toEnableSel = toEnable.join(', ');
				enableSelector($(toEnableSel));
			}
			// CLEAR - Wyczysc elementy
			if(toClear.length > 0){
				var toClearSel1 = '';
				var toClearSel2 = '';
				var toClearSel3 = '';
				for(i in toClear){
					var tc = toClear[i];
					if(toClearSel1.length > 0) toClearSel1 += ', ';
					if(toClearSel2.length > 0) toClearSel2 += ', ';
					if(toClearSel3.length > 0) toClearSel3 += ', ';
					toClearSel1 += tc+' :text, '+tc+' textarea';
					toClearSel2 += tc+' :checked, '+$.trim(tc)+':checked';
					toClearSel3 += tc+' :selected, '+$.trim(tc)+':selected';
				}
				$(toClearSel1,self).val('');
				$(toClearSel2,self).removeAttr('checked');
				$(toClearSel3,self).removeAttr('selected');
			}
			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'];
						// Pobeirz tablice obiektow do akcji
						navigation[navId]['aObj'] = getJQSelectors(aEl);
						// Ustaw status poczatkowy
						setElementBeginStatus(navigation[navId]['aObj'], 'access', navId);
					}
					
					// 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 != true && 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(navigation);
//		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,
			translate: false,
			alphanum : false,
			lower: false,
			switchspace: false,
			switcher: {},
			removeformbegin: false,
			// Uzupelnij gdy pusty
			fillonlyempty: false
		},settings);
		
		// Usuwa polskie litery zastepujac je odpowiednikami
		function translate(str){
			var pl 		= ['ą','Ą','ć','Ć','ę','Ę','ł','Ł','ń','Ń','ó','Ó','ś','Ś','ż','Ż','ź','Ź'];
			var repPl 	= ['a','A','c','C','e','E','l','L','n','N','o','O','s','S','z','Z','z','Z'];
			var cyr		= ['а','б','в','г','д','e','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ь', 'ю','я','А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ь','Ю','Я','э'];
			var repCyr	= ['a','b','v','g','d','e','zh','z','i','y','k','l','m','n','o','p','r','s','t','u','f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'a' ,'y' ,'yu' ,'ya','A','B','V','G','D','E','Zh','Z','I','Y','K','L','M','N','O','P','R','S','T','U','F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'A' ,'Y' ,'Yu' ,'Ya','e'];
			var de 		= ['Ä','ä','Ö','ö','ß','Ü','ü'];
			var repDe 	= ['AE','ae','OE','oe','ss','UE','ue'];
			
			// Zmien polskie znaki
			for(i in pl){
				str = str.replace(pl[i],repPl[i],'gm');
			}
			// Zmien rosyjksie znaki
			for(i in cyr){
				str = str.replace(cyr[i],repCyr[i],'gm');
			}
			// Zmien niemieckie znaki
			for(i in de){
				str = str.replace(de[i],repDe[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 && destinationVal.length != 0)
				return true;
		}
		
		$(settings.source).bind(settings.filltype,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();
			}
					
			// Zmien litery na latin
			if(settings.translate === true){
				retValue = translate(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;
		});
		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,
			// Relacja dla licznika
			relative : 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,obj){
			if(settings.counter === false)
				return false;
			if(counterLen < 0) counterLen = 0;
			if(settings.relative === true){
				$(settings.counter,$(obj).parent()).html(String(counterLen));
			}else
				$(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,obj);
			return true;
		}
		switch(settings.filltype){
			case 'keyup':
				$(jqMatchedObj).live('keyup',function(){
					make(this);
				});
				break;
			case 'keydown':
				$(jqMatchedObj).live('keydown',function(){
					make(this);
				});
				break;
		}
		
		// Funkcja ustawia wartosci poczatkowe
		start();
		return true;
	}
})(jQuery);

/**
 * Funkcja do szybkiego filtrowania selecta z podanych wartosci
 * 
 * -------------------
 * WYMAGANIA jquery.js
 * -------------------
 * 
 * ------------------------------------
 * OPCJE DLA FUNKCJI $().seleftFilter()
 * ------------------------------------
 * action 		- typ akcji "keyup" domyslnie [keydown|keyup]
 * minlength	- minimalna dlugosc ciagu od ktorego zaczyna sie filtrowanie domyslnie 1
 * source		- zrodlo - selector wskazujacy na select do filtrowania
 * type			- typ filtrowania - [begin | end | middle]
 * 				  "begin" 	- zaczyna sie od podanego ciagu	- DOMYSLNE
 * 				  "end"		- konczy sie podanym ciagiem
 * 				  "middle"	- ciag znajduje sie w dowolnym miejscu
 * casesensitive- uwzglednij wielkosc liter - domysnie false
 * checkval		- sprawdz wartosc pola zamiast nazwy
 * 
 */
(function($){
	$.fn.selectFilter = function(settings){
		var settings = jQuery.extend({
			// Filtrowanie po akcji
			action: 'keyup',
			// Minimalna dlugosc ciagu do filtorowania
			minlength: 1,
			// Zrodlo do filtrowania
			source: '',
			// Typ filtrowania
			type: 'begin',
			// Uwzglednij wielkosc liter
			casesensitive: false,
			// Sprawdz wartosc zamiast nazwy
			checkval: false
		},settings);
		
		// Przepisanie pasujacych elementow
		var jqMatchedObj = this;
		// Wylacz jezeli nie jest ustawiona dlugosc minimalna
		if(settings.minlength <= 0)
			return false;
		// Wylacz jezeli nie jest ustawione zrodlo
		if(settings.source.length == 0)
			return false;
		var sobj = $(settings.source);
		if(sobj.length == 0)
			return false;
		
		function checkRegexp(q,val){
			// Wyrazenie
			var exp = '';
			var flags = 'gm';
			switch(settings.type){
			case 'end':
				exp = q+'$';
				break;
			case 'middle':
				exp = q;
				break;
			case 'begin':
			default:
				exp = '^'+q;
				break;
			}
			if(!settings.casesensitive)
				flags += 'i';
			if(val.search(new RegExp(exp,flags)) == -1) 
				return false;
			return true;
		}
		
		function action(){
			// Zapisz zapytanie
			var q = $(this).val();
			if(q.length > 0 && q.length >= settings.minlength){
				$('option',sobj).each(function(){
					// Pobierz wartosc do sprawdzenia
					var val = '';
					if(settings.checkval) val = $(this).attr('value');
					else val = $(this).html();
					// Sprawdz
					if(!checkRegexp(q,val)){
						$(this).hide();
					}else $(this).show();
				});
			}else $('option:hidden',sobj).show();
			// --------------------------------------------------
			// Dodaj pusty element do select zeby sie nie schowal
			// --------------------------------------------------
			if($('option:visible',sobj).length == 0)
				sobj.append('<option class="wts-selectfilter-empty"></option>');
			else $('.wts-selectfilter-empty',sobj).remove();
			return true;
		}
		
		function start(){
			switch(settings.action){
				case 'keydown':
					jqMatchedObj.keydown(action);
					break;
				case 'keyup':
				default:
					jqMatchedObj.keyup(action);
					break;
			}
		}
		
		start();
		return true;
	}	
})(jQuery);
