/*******************************
 * JS Form Validation Liblary  *
 *  part of greWall system     *
 *                             *
 *  version: 0.3a [03.11.2006] *
 *   (c) Speedy 2006           *
 *   http://pz.int.pl/         *
 *******************************/

/*
 * funckcja sprawdza, czy podany ciag znakow odpowiada
 * podanym regula i zwraca wynik
 */
function validate_str(str, rules, _return_obj) {
//  var uwagi = new Array;
//  var bledy = new Array;

  var rules = rules.split('|');
  var result = false;
  
  // definiujemy konstrukcję zawierającą zbiór reguł
  var rule = {
   // dane wejsciowe
  	'type' : rules[0],

  	'length' : rules[1],
  	
  	'min_length' : 0,
  	'max_length' : 255,
  	
  	'values' : rules[2],
  	'min_value' : 0,
  	'max_value' : 10000,
  	
  	'opt' : new String(rules.length >= 4 && rules[3].length > 0 ? rules[3].toLowerCase : ''),
  	
  	// wyniki
  	'uwagi' : new Array,
  	'bledy' : new Array,
  	
  	'wynik' : true,
  	
  	'new_str' : false
  }
  
  // sprawdzamy dlugosc pola...
  if (rule.length) {
	  rule.min_length = rule.length.split('-')[0];
	  rule.max_length = rule.length.split('-')[1];
	  
	  //alert(str.length + ' > ' + rule.length + '|'+rule.length.split('-')[0]);
	  if (str.length > rule.max_length)
	  	rule.bledy.push('Wartość za długa!');
	  if (str.length < rule.min_length)
	  	rule.bledy.push('Wartość zbyt krótka!');
  }
  
  if (rule.values) {
	  rule.min_value = rule.values.split('-')[0];
	  rule.max_value = rule.values.split('-')[1];
  }
  /*	type:
   *	 text
   *	 int
   *	 float
	 */
	switch (rule.type) {
		case 'text':
		case 'string':
			// wartosc tekstowa...
//			alert(rule.type + ' - od ' + rule.length_min + ' do ' + rule.length_max + ' znaków');

		break;
		 
		case 'number':
		case 'int':
			// wartosc liczbowa

			// ucinamy zera na poczatku
			while (str.substring(0,1) == '0' && str.length > 1) str = str.slice(1);
			if (str != parseInt(str))
				rule.bledy.push('To nie jest poprawna liczba!');
			else {
				if (parseInt(str) > rule.max_value) rule.bledy.push('Liczba jest za duża');
				if (parseInt(str) < rule.min_value) rule.bledy.push('Liczba jest zbyt mała');
			}
		break;

		case 'float':
			// wartosc liczbowa FLOAT

			// ucinamy zera na poczatku
			while (str.substring(0,1) == '0' && str.length > 1) str = str.slice(1);
			str = str.replace(',','.');
			if (str != parseFloat(str))
				rule.bledy.push('To nie jest poprawna liczba!');
			else {
				if (parseFloat(str) > rule.max_value) rule.bledy.push('Liczba jest za duża');
				if (parseFloat(str) < rule.min_value) rule.bledy.push('Liczba jest zbyt mała');
			}
		break;


		case 'email':
			// sprawdzenie adresu email
			if (/^([a-zA-Z0-9_\.-])+@([a-zA-Z0-9_\.-])+(\.[a-zA-Z0-9_-]+)+/.test(str) == false)
				rule.bledy.push('Adres e-mail jest niepoprawny');
		break;
		
		case 'ip':
			// adres IP
			var r = true;
			ip_values = str.split('.');
			if (ip_values.length !== 4) r = r && false;
			if (r) for (i=0;i<=3;i++) {
				if (/^[0-9]{1,3}$/.test(ip_values[i]) == false) { r = false; break; }
				if ((ip_values[i] < 0) || (ip_values[i] > 255)) { r = false; break; }
			}
			if (r == false) rule.bledy.push('Adres IP jest niepoprawny');
		break;
		
		case 'mac':
			// adres MAC
			var r = true;
			var mac = str.replace(/(\-|\.|\_|\:)/g,'');
			// console.log(mac);
			if (mac.length !== 12) r = false;
			if ((r) && (/^[0-9a-fA-F]{12}$/.test(mac) == true)) {
			mac = mac.split('');
				rule.new_str = mac[0]+mac[1]+':'+mac[2]+mac[3]+':'+mac[4]+mac[5]+':'+mac[6]+mac[7]+':'+mac[8]+mac[9]+':'+mac[10]+mac[11];
			} else {
				r = false;
			}
						
			if (r == false) rule.bledy.push('Adres MAC jest niepoprawny');
		break;

		case 'mac_std':
			// adres MAC
			var r = true;
			mac_values = str.split(':');
			if (mac_values.length !== 6) r = false;
			if (r) for (i=0;i<=5;i++) {
				if (/^[0-9a-fA-F]{2}$/.test(mac_values[i]) == false) { r = false; break; }
			}
			if (r == false) rule.bledy.push('Adres MAC jest niepoprawny');
		break;
		
		default:
			alert('Wystąpił bład w kodzie źródłowym - wymagana reguła "'+rule.type+'" nie istnieje.');
	}
	if (rule.opt && rule.opt.length > 0) {
		if (rule.opt.indexOf('w') > -1) {
			if (rule.bledy.length > 0) rule.uwagi.push(rule.bledy);
			rule.bledy = new Array; 
		}
	
		if ((rule.opt.indexOf('n') > -1) && (str.length == 0)) {
			rule.uwagi = new Array;
			rule.bledy = new Array;
		}
	}
  //alert(rule.uwagi + "\n" + rule.bledy);
  //return true;
   
   rule.wynik = ( (rule.uwagi.length == 0) && (rule.bledy.length == 0) ? true : false ); 

   if (_return_obj === null) {
//   	alert('simple');
   	return rule.wynik;
	}
	return rule;
}

function validate_field(field_, rules, user_func) {
	field_.style.borderColor = '#A00'; 
//return false;
// FORCE OLD BEHAVIOUR:
	var type = rules.split('|')[0];
	var res = ((type == 'text') || (type == 'string') || (type == 'number') || (type == 'int') || (type == 'ip') || (type == 'mac'));
	
	// pobieramy dane zwrotne
	var result =  validate_str(field_.value, rules, true);
	if (user_func!==undefined) {
		eval('result = '+user_func+'(field_, result);');
	}
	validate_field_set(field_, result);
}

function validate_field_set(field_, result) {
	
	var obj_id = field_.id;
	field_.style.background = 'top right no-repeat';
   result.wynik = ( (result.uwagi.length == 0) && (result.bledy.length == 0) ? true : false ); 

	if (result.wynik == true) {
		field_.style.backgroundImage = 'url(files/online.png)';
		field_.style.backgroundColor = '#EFE';
		field_.rel = '0';
		if (result.new_str !== false) field_.value = result.new_str;
		
		if (obj(obj_id+'_uwagi')) obj(obj_id+'_uwagi').style.display = 'none';
	}	
	if (result.wynik == false) {
		// mamy blad i/lub uwage
		//field_.style.backgroundImage = '';
		field_.style.backgroundColor = (result.bledy.length > 0 ? '#FDD' : '#FFB');
		field_.style.backgroundImage = (result.bledy.length > 0 ? 'url(files/offline.png)' : 'url(files/alert.png)');
		field_.rel = (result.bledy.length > 0 ? '2' : '1');
		
		// uwagi...
		if (!obj(obj_id+'_uwagi')) {
			// nie ma obiektu...
			var uwagi_obj = document.createElement('ul');
			uwagi_obj.setAttribute('id', obj_id+'_uwagi');
			uwagi_obj.setAttribute('class', 'uwagi');
			obj(obj_id).parentNode.appendChild(uwagi_obj);
//			uwagi_obj = obj(obj_id+'_uwagi');
		} else {
			// jest... 
			if (obj(obj_id+'_uwagi')) obj(obj_id+'_uwagi').style.display = 'block';
			var uwagi_obj = obj(obj_id+'_uwagi');
			// kasujemy istniejace podpunkty
			for(i=uwagi_obj.childNodes.length-1;i>=0;i--) {
				uwagi_obj.removeChild(uwagi_obj.childNodes[i]);
			}
		}
		// wiemy ze uwagi_obj istnieje, dodajemy uwagi, potem bledy
		for(i=0;i<result.uwagi.length;i++) {
			var li = document.createElement('li');
			li.setAttribute('class', 'uwaga');
			li.style.cursor = 'pointer';
			li.onclick = function() {
				obj(obj_id).focus();
			}
			var txt = document.createTextNode(result.uwagi[i]);
			li.appendChild(txt);
			uwagi_obj.appendChild(li);
		}
		for(i=0;i<result.bledy.length;i++) {
			var li = document.createElement('li');
			li.setAttribute('class', 'blad');
			li.style.cursor = 'pointer';
			li.onclick = function() {
				obj(obj_id).focus();
			}
			var txt = document.createTextNode(result.bledy[i]);
			li.appendChild(txt);
			uwagi_obj.appendChild(li);
		}

	}	
	
	field_.style.borderColor = ''; 


}

function jsvalidation_init() {
	// podpinamy do wszystkich INPUT mozliwosc walidacji po dblclick
	var forms=document.getElementsByTagName('form');

for (i=0;i<forms.length;i++) {
   	if (forms[i].getAttribute('rel') == 'validate') {
  			var inputs = forms[i].getElementsByTagName('input');
			for (j=0;j<inputs.length;j++) {
//				inputs[j].onkeydown = checkEnter; // function() { checkEnter(); };
				inputs[j].ondblclick = inputs[j].onchange;
			}
 		// dodajemy przycisk sprawdzajacy poprawnosc formularza...
   		//<input class="f_button" type="button" value="Sprawdź" onclick="this.form.onsubmit();" />
			inputs = forms[i].getElementsByTagName('input');
   		for (j=inputs.length-1;j>=0;j--) {
   			if (inputs[j].type == 'submit') {
   				var submit_btn = inputs[j];
   				break;
				}
   		}
   		if (submit_btn) {
	   		//var a = submit_btn.cloneNode(true);
	   		a = document.createElement('input');
	   		a.type = 'button';
	   		a.className = 'f_button';
	   		a.value = 'Sprawdź';
	   		a.style.fontWeight = 'normal';
	   		a.title = 'Sprawdza poprawność danych wpisanych w formularzu';
	   		a.onclick = function() { this.form.onsubmit(); return false;};
	   		submit_btn.parentNode.insertBefore(a, submit_btn);
	   		//submit_btn.parentNode.appendChild(a);
   		}
   		
   	  // podepnij akcje wywolywana przy wysylaniu formularza... 
   		forms[i].onsubmit = function() {
				inputs = this.getElementsByTagName('input');
				focused = bledy = uwagi = false;
				all_checked = true;
				for (j=0;j<inputs.length;j++) {
					if ( (inputs[j].type == 'text') || (inputs[j].type == 'password') ) {
						if ((!inputs[j].rel) && (inputs[j].onchange)) {
							all_checked = false;
							inputs[j].rel = '0';
							inputs[j].onchange();
						} else {
							// inputs[j].style.borderColor = '';
						}
						
						if ((uwagi === false) && (bledy === false) && (inputs[j].rel) && (inputs[j].rel!=='0') && (!focused)) {
							focused = true;
							inputs[j].focus(); }
						uwagi = uwagi || (inputs[j].rel ? (inputs[j].rel=='1' ? true : false) : false);
						bledy = bledy || (inputs[j].rel ? (inputs[j].rel=='2' ? true : false) : false);
					}
				} // eof for()
			
					if (bledy) {
						alert('W formularzu znajdują się błedy - musisz je poprawić.');
	//					if (_field_id) document.getElementById(_field_id).focus();
						return false;
					}
					
					if (uwagi) {
						var result = confirm('Prawdopodobnie nie wszystkie pola są prawdłowo uzupełnione. Czy chcesz kontynuować?');
	//					if (result==false) if (_field_id) document.getElementById(_field_id).focus();
						return result;
					}

				return true;
   		} // eof function()
   	} // eof if()
   } // eof for()
    
     }

