function date_compare(test_date_value,min_date_value,max_date_value){
	var min_date 	= min_date_value.split('/');
	var max_date 	= max_date_value.split('/');
	var field_date 	= test_date_value.split('/');

	min_date_year 	= parseInt(min_date[0]);
	min_date_month 	= parseInt(min_date[1]);
	min_date_day 	= parseInt(min_date[2]);

	max_date_year 	= parseInt(max_date[0]);
	max_date_month 	= parseInt(max_date[1]);
	max_date_day 	= parseInt(max_date[2]);

	date_year 			= parseInt(field_date[0]);
	date_month 		= parseInt(field_date[1]);
	date_day 			= parseInt(field_date[2]);

	if(date_year >= min_date_year && date_year <= max_date_year){
		if(date_month >= min_date_month && date_month <= max_date_month){
			if(date_day >= min_date_day && date_day <= max_date_day){
				return true;
			}
		}
	}
	return false;
}


function buttonForward(type,backId,parentId,minRepeats,maxRepeats,actRepeat,noGroupId){

	var srvID = bdo_form.getAttribute('srvID');

	if( type == 'forward'){
		new_group = document.getElementsByName('ID_'+srvID+'_'+parentId+'_'+actRepeat);

		document.getElementById('BTN_ID_'+srvID+'_'+parentId+'_'+(actRepeat-1)).style.display='none';
		document.getElementById('BTN_ID_'+srvID+'_'+parentId+'_'+(actRepeat)).style.display='block';

		for(var i=0; i< new_group.length; i++){
			new_group[i].style.display='block';
		}

		for(a=0; a<bdo_form.elements.length; a++){
			if( bdo_form.elements[a].getAttribute('group_name') == backId){
				bdo_form.elements[a].setAttribute('field_required','1');
			}
		}
	}

	if( type == 'back' && actRepeat > minRepeats){
		new_group = document.getElementsByName('ID_'+srvID+'_'+parentId+'_'+(actRepeat-1));
		document.getElementById('BTN_ID_'+srvID+'_'+parentId+'_'+(actRepeat)).style.display='none';
		document.getElementById('BTN_ID_'+srvID+'_'+parentId+'_'+(actRepeat-2)).style.display='block';
		for(var i=0; i< new_group.length; i++){
			new_group[i].style.display='none';
		}
	}

}



function array_search(array_name,name){
	var z = 0;
	array_count = array_name.length;

	for(count=0; count<array_count; count++){
		test = array_name[count];
		if(test==name){
			z += 1;
		}
	}
	return z;
}

function prepare_form(){
	var bdo_form 			= document.forms['bdo_form'];
	var srvID 				= bdo_form.getAttribute('srvID');
	var elementsCount		= bdo_form.elements.length;
	var toHide				= new Array();
	var x = 0;

	for(var i=0; i<elementsCount; i++){
		elementName 	= bdo_form.elements[i].getAttribute('name');
		elementValue 	= bdo_form.elements[i].value;
		groupName		= bdo_form.elements[i].getAttribute('group_name');
		groupMaxRepeats	= bdo_form.elements[i].getAttribute('group_max_repeats');
		groupMinRepeats	= bdo_form.elements[i].getAttribute('group_min_repeats');
		groupActRepeat	= bdo_form.elements[i].getAttribute('group_act_repeat');

		if( groupName ){

			document.getElementById('BTN_'+groupName).style.display='none';

			if( groupActRepeat && groupActRepeat == groupMinRepeats){
				document.getElementById('BTN_'+groupName).style.display='inline';
			}
			else if( groupActRepeat && groupActRepeat > groupMinRepeats){
				for( z = 0; z < document.getElementsByName(groupName).length; z++){
					document.getElementsByName(groupName)[z].style.display='none';
				}

				// jezeli element formularza znajduje sie w grupie ktora jest ukryta
				// to przestaje byc wymagany
				for(a=0; a<elementsCount; a++){
					if( bdo_form.elements[a].getAttribute('group_name') == groupName){
						bdo_form.elements[a].setAttribute('field_required','0');
					}
				}
			}
		}
	}
}

function check_form(bdo_form){
	//sorry...
	bdo_form=document.forms['bdo_form'];
	var srvID 				= bdo_form.getAttribute('srvID');
	var elementsCount	= bdo_form.elements.length;
  // tablica z bledami znalezionymi podczas sprawdzania formularza
	var errorMsg 	   	= new Array();
  // ilosc bledow - sprawdzic czy potrzebne
	var errorCount	   	= 0;
	var errorAlert		= '';
	var errorAlertMsg	= '';

  // kolor tla i czcionki dla bledu i defaultowo
	var errorStrColor   = 'red';
	var errorBgColor    = 'yellow';
	var defaultBgColor  = 'white';
	var defaultStrColor = 'black';
//  'alert' - wyswietla alert ,'text' - wyswietla tekst bledu w tabeli formularza
	var errorMsgMethod  = 'alert';


	for( i=0; i<elementsCount; i++){
		var formElement 			= bdo_form.elements[i];
		var fieldId                	= formElement.getAttribute('ID');
		var fieldType               = formElement.getAttribute('field_type_id');
		var fieldName				= formElement.getAttribute('field_user_name');
		var fieldRequired	  		= formElement.getAttribute('field_required');
		var fieldStyle             	= formElement.style;

		var connID 					= formElement.getAttribute('conn_id');
		var connType				= formElement.getAttribute('conn_type');
		var connToFieldType  		= formElement.getAttribute('conn_field_type_id');
		var connToDictValue  		= formElement.getAttribute('conn_dict_value');
		var connToRegX				= formElement.getAttribute('conn_masktext_value');
		var connToMaxDate			= formElement.getAttribute('conn_datetime_max_value');
		var connToMinDate			= formElement.getAttribute('conn_datetime_min_value');

	// jezeli jest typu maska
	// tu trzeba sie zastanowic co sie ma dziac jezeli pole nie jest wymagane
		if( fieldType=='Mask'){
			var fieldValue 				= formElement.value;
			var fieldRegXValue			= formElement.getAttribute('field_reg_exp_value');
		// jezeli pole jest wymagane
			if(parseInt(fieldRequired) == 1 ){
			// jezeli pole nie jest wypełnione
				if( fieldValue.length == '' ){
					errorMsg[i] = 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
				  // wyroznienie bledu
					fieldStyle.background=errorBgColor;
				}
				else{
				  // jezeli za drugim przeladowaniem formularza poprawiono blad
				  // ktory ewentualnie zaistnial zmiana koloru na bialy
					fieldStyle.background=defaultBgColor;
				}
			}
			// jezeli pole posiada jakis warunek ktory nalezy sprawdzic
			// nie wiem jak postepowac w przypadku gdy pole nie jest wymagane
			// ale nie spelnia warunku, moze je czyscic i wyrzucac alerta ze pole zostało wyczyszczone
			// albo mozna pokazywac okienko z prosba o poprawienie typu confirm

			 if(fieldValue.length != 0){
				if(fieldRegXValue != null && !errorMsg[i] ){
					var regExpMask = new RegExp (fieldRegXValue);
					var regExpResult = regExpMask.exec (fieldValue);
				 // jezeli warunek nie został spełniony
					if( regExpResult == null ){
						errorMsg[i] = 'Wartość pola "'+fieldName+'" jest błędna.\n';
					  // wyroznienie bledu
						fieldStyle.color = errorStrColor;
					}
					else{
						fieldStyle.color = defaultStrColor;
					}
				}
			}
		}


	// pole typu dictionary
	// chwilowo wylaczam testowanie czy pole typu dictionary jest potrzebne
	//
		if(fieldType=='Dictionary' && parseInt(fieldRequired) == 1 && !formElement.disabled){

			var fieldValue = formElement.options[formElement.selectedIndex].value;

			if( fieldValue == '' ){
				 errorMsg[i] = 'Wybierz wartość z listy pola "'+fieldName+'".\n';
				fieldStyle.background = errorBgColor;
			}
			else{
				fieldStyle.background = defaultBgColor;
			}

		}

	 // pole typu date lub time
		if(fieldType=='Date' && parseInt(fieldRequired) == 1){
			var fieldValue 	    	= formElement.value;
			var dateMin        		 	= formElement.getAttribute('MinimumValue');
			var dateMax       		  	= formElement.getAttribute('MaximumValue');
			var dateRegXValue	= formElement.getAttribute('DateValue');

			// jezeli nic nie wpisano
			if(fieldValue == ''){
				errorMsg[i] = 'Podanie daty w polu "'+fieldName+'" jest wymagane.\n';
				fieldStyle.background = errorBgColor;
			}
			else{
				fieldStyle.background = defaultBgColor;
			}

			if( dateRegXValue != null && !errorMsg[i]){
			// jezeli podano - zamiast / nie ma sensu zatrzymywac formularza
			// nie potrzeba tez badac czy pole zawiera znaki -
				fieldValue = fieldValue.replace(/\-/gi,"/" );
				var regExpMask = new RegExp (dateRegXValue);
				var regExpResult = regExpMask.exec (fieldValue);
				if( regExpResult == null ){
				// tutaj sa standardowe wartosci dla daty - po tych wartościach rozpoznaje i podaje przyjazny format daty
				// jezeli nie da sie rozpoznac formatu daty zostaje podany standardowy komunikat
					var dateFormat = '';
					if( dateRegXValue=='^([0-9][0-9][0-9][0-9])/(0[1-9]|1[0-2])/(0[1-9]|1[0-9]|2[0-9]|3[0-1])$'){
						dateFormat = 'YYYY/MM/DD';
					}
					else if( dateRegXValue=='^([0-9][0-9][0-9][0-9])/(0[1-9]|1[0-2]))$'){
						dateFormat = 'YYYY/MM/DD';
					}

					errorMsg[i] = 'Data podana w polu "'+fieldName+'" jest błędna.\n';

				 // jezeli rozpoznano format daty 1
					if( dateFormat != '' ){
						errorMsg[i] += 'Data powinna być w następującym formacie: '+dateFormat+'.\n';
					}
					else{
						errorMsg[i] += 'Upewnij się czy prawidłowo podałeś datę.\n';
					}
					fieldStyle.color = errorStrColor;
				}
				else{
					fieldStyle.color = defaultStrColor;
				}
			}

		  // jezeli nie wystapil blad z niepoprawnym formatem daty
			if( !errorMsg[i] ){

			// jezeli podano dwie graniczne daty
				if(dateMin && dateMax){

					dateTestValue      = parseInt(fieldValue.replace(/\//gi,"" ));
					dateTestMinValue   = parseInt(dateMin.replace(/\//gi,"" ));
					dateTestMaxValue   = parseInt(dateMax.replace(/\//gi,"" ));

					if( dateTestValue < dateTestMinValue || dateTestValue > dateTestMaxValue){
						errorMsg[i] = 'Data podana w polu "' +fieldName+ '" nie mieści się w zakresie od ' +dateMin+ ' do ' +dateMax+ '.\n';
					}
				}
		   // jezli podano tylko date minimalna
				else if ( dateMax == '' ){
					dateTestValue      = parseInt(fieldValue.replace(/\//gi,"" ));
					dateTestMinValue   = parseInt(dateMin.replace(/\//gi,"" ));

					if( dateTestValue < dateTestMinValue ){
						errorMsg[i] = 'Data podana w polu "' +fieldName+ '" musi być większa niż '+ dateMin +'.\n';
					}
				}
		   // jezli podano tylko date maksymalna
				else if ( dateMin == '' ){
					dateTestValue      = parseInt(fieldValue.replace(/\//gi,"" ));
					dateTestMaxValue   = parseInt(dateMax.replace(/\//gi,"" ));

					if( dateTestValue > dateTestMaxValue ){
						errorMsg[i] = 'Data podana w polu "' +fieldName+ '" musi być mniejsza niż '+ dateMax +'.\n';
					}
				}
			}
		}


		if( fieldType == 'Attachment' && parseInt(fieldRequired) == 1 ){
			var fieldValue 	    = formElement.value;
		// w dokumencie xml regExp dla plików jest podawany z | na koncu ( moze byc wiecej formatow)
		// ten znaczek nalezy usunac bo przez niego sie nie waliduje
			var fieldExt        = formElement.getAttribute('field_attach_ext').replace(/\|$/,'');

		// jezeli nie dolaczono zadnego pliku
			if( fieldValue == '' ){
				errorMsg[i] = 'Musisz załączyć plik w polu "' +fieldName+ '".\n';
				fieldStyle.background = errorBgColor;
			}
			else{
				fieldStyle.background = defaultBgColor;
			}
		// jezeli sa jakies wskazania dotycz?ce typu pliku oraz
		// plik jest napewno wrzucony do formularza
			if(fieldExt != '' && !errorMsg[i] ){
				var regExpMask = new RegExp (fieldExt);
				var regExpResult = regExpMask.exec (fieldValue);
				if( regExpResult == null ){
				// nalezy wyczyscic liste rozszerzen z regexpa alby
				// byla czytelna dla uzytkownika
					cleanExtReg = /([()\[\].^$+])/gi;
					cleanedExt  = fieldExt.replace(cleanExtReg,'').split('|');
					errorMsg[i] = 'Plik dołączony do pola "' +fieldName+ '" musi być w formacie: ' +cleanedExt+ '.\n';
					fieldStyle.background = errorBgColor;
				}
				else{
					fieldStyle.background = defaultBgColor;
				}
			}
		}

		if(connID && connID != '0'){
				var fieldValue 				= formElement.value;
				var connToID 					= 'ID_'+srvID+'_'+connID+'_0';
				var connToValue 			= document.getElementById(connToID).value;
				var connToRequired	  	= document.getElementById(connToID).getAttribute('field_required');

				if(connToFieldType=='Dictionary' && !formElement.disabled){
					var regDictMask = new RegExp (connToDictValue);
					var regDictResult = regDictMask.exec (connToValue);

				// jezeli pole jest wymagane wtedy gdy nie spełniono warunku
					if( connType == 1 ){
						if(regDictResult == null){
							if(fieldValue.length == 0){
								errorMsg[i]			= 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
							}
						}
					}
				// jezeli pole jest wymagane wtedy gdy spełniono warunek
					else if( connType == 0 ){
						if(regDictResult != null){
							if(fieldValue.length == 0){
								errorMsg[i]			= 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
							}
						}
					}

				}

			// jezeli pole typu maska
				if(connToFieldType=='Mask' && connToRequired == 1 && connToValue != '' ){

					var regMask 			= new RegExp(connToRegX);
					var regMaskResult 	= regMask.exec(connToValue);

					if( connType == 1 ){
						if(regMaskResult == null){
							if(fieldValue.length == 0){
								errorMsg[i]			= 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
							}
						}
					}
					else if( connType == 0 ){
						if(regMaskResult != null){
							if(fieldValue.length == 0){
								errorMsg[i]			= 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
							}
						}
					}
				}
			// jezeli pole typu data

				if(connToFieldType=='Date' ){
					if( connType == 0 ){
						if(date_compare(connToValue,connToMinDate,connToMaxDate)){
							if(fieldValue.length == 0){
								errorMsg[i]			= 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
							}
						}
					}
					else if( connType == 1 ){
						if(!date_compare(connToValue,connToMinDate,connToMaxDate)){
							if(fieldValue.length == 0){
								errorMsg[i]			= 'Wypełnienie pola "'+fieldName+'" jest wymagane.\n';
							}
						}
					}
				}
		}
// koniec petli
	}


// Wyswietlanie komunikatu o bledach w formularzu
	if( errorMsg.length > 0 ){
		errorsCount = 0;

		for(i=0; i<errorMsg.length; i++){
			if(errorMsg[i]){

				errorAlertMsg += errorMsg[i] + '\n';

				if( errorMsgMethod == 'text'){
					errorMsgFieldContainer = 'TR_Margin_'+bdo_form.elements[i].getAttribute('ID');
					errorMsgField = 'TD_Margin_'+bdo_form.elements[i].getAttribute('ID');

					errorMsgDisplay = errorMsg[i].replace('\n','<br>');
					document.getElementById(errorMsgFieldContainer).style.display='inline';
					document.getElementById(errorMsgField).innerHTML=errorMsgDisplay;
				}

			  // focus na pierwszy blad jaki wystapil
				if(errorsCount == 0 && !bdo_form.elements[i].disabled){
					bdo_form.elements[i].focus();
				}
				errorsCount++;
			}
			else if( errorMsgMethod == 'text' ){
				errorMsgField = 'TR_Margin_'+bdo_form.elements[i].getAttribute('ID');
				document.getElementById(errorMsgField).style.display='none';
			}
		}

	  // wyswietlanie alertu z bledami jezeli tak ustawiono
	  // wyswietla rozne teksty w zaleznosci od ilosci bledow

	  if(errorMsgMethod == 'alert'){
			if(errorsCount.length > 1){
				errorAlert  = 'W formularzu wystąpiły błędy, musisz je poprawić aby kontynuować.\n';
				errorAlert  += 'Pola które należy poprawić zostały oznaczone innym kolorem.\n\n';
				errorAlert  += errorAlertMsg;
				errorAlert  += '\nPo poprawieniu błędów ponownie wyślij dane.';
			}
			else{
				errorAlert  = 'W formularzu wystąpił błąd, musisz go poprawić aby kontynuować.\n';
				errorAlert  += 'Pole które należy poprawić zostało oznaczone innym kolorem.\n\n';
				errorAlert  += errorAlertMsg;
				errorAlert  += '\nPo poprawieniu błędu ponownie wyślij dane.';
			}
			alert(errorAlert);
		}

		return false;
	}

  // formularz wypelniony poprawnie
  // wylaczam przycisk submit aby zminimalizowac powtorne wyslanie
  	//(zmiana value sie gryzie z superbajer turboajax)
	//bdo_form.btnForm.value = 'Trwa transfer danych';
	bdo_form.btnForm.disabled = true;

	return true;
}
