/**
 * Do obsługi formularzy. Sprawdza czy zostały wypełnione pola oraz czyści pola przy pierwszym kliknieciu.
 * Narazie wersja wczesna alfa :)
 * 
 * <form class="formbox" ...
 *     <input type="text" rel="off" ... (tak się wyłącza, aby nie sprawdzało danego pola)
 * </form>
 * 
 * aby wyłączyć opcję usuwania wartości pola po kliknieciu należy dodać <form ... rel="reloaded" ...>
 * 
 * do pół można dodawać warunki np. <input ... rel="imie=darek" ...>
 * w takim przypadku, dane pole będzie sprawdzane tylko gdy pole 'imie' będzie miało wartość 'darek'
 * 
 * @author Paweł Macander, E-Line Systemy Internetowe, www.e-line.pl
 */

/******************************************** F O R M B O X ® *****************************************start**/
/**
 * Zapisuje, które pola formularza zostały wyczyszczone przez klikniecie
 */
var czyscFormularz = new Array();

/**
 * Zappisuje wartości startowe pól
 */
var wartoscStartowa =new Array();

/**
 * Dane o polach formularzy
 */
var polaFormularza = new Array();

/**
 * Czy dany formularz jest z wcześniejszą treścia
 */
var reloaded = new Array();

/**
 * Warunki dla danego pola
 */
var required = new Array();

/**
 * Zapisanie wartości maski dla danego pola
 */
var maska = new Array();

/**
 * Wyszukanie formularzy formBox® i obsługa ich
 */ 
$(document).ready(function(){
	var pola; 

	//alert('zaczyna');
	
	// załadowanie wszystkich formularzy formBox®
	var forms = $('form.formbox');
	
	// przelecenie :) wszystkich formularzy
	for(var i=0 ; i<forms.length ; i++) {
		wartoscStartowa[i] = new Array();
		polaFormularza[i] = new Array();
		maska[i] = new Array();
		required[i] = new Array();
		reloaded[i] = forms.eq(i).attr('rel')=='reloaded'?true:false;
		
		// zapisanie pól tekstowych
		pola = $('input[@type=text]', forms.eq(i));
		for(var j=0 ; j<pola.length ; j++) {
			if (pola.eq(j).attr('mask') != undefined) {
				_maska = pola.eq(j).attr('mask');
				maska[i][pola.eq(j).attr('name')] = _maska;
				
				if (_maska == 'e-mail' || _maska == 'mail' || _maska == 'email') {}
				else pola.eq(j).mask(pola.eq(j).attr('mask'));
			}
				
				
			wartoscStartowa[i][pola.eq(j).attr('name')] = reloaded[i]?'':pola.eq(j).val();
			if (pola.eq(j).attr('rel') != 'off') {
					polaFormularza[i][pola.eq(j).attr('name')] = 'text';
					if (pola.eq(j).attr('rel') != undefined)	
						required[i][pola.eq(j).attr('name')] = pola.eq(j).attr('rel').split(';');	
				
			}		
		}
		
		// zapisanie obszarów tekstowych
		pola = $('textarea', forms.eq(i));
		for(var j=0 ; j<pola.length ; j++) {
			wartoscStartowa[i][pola.eq(j).attr('name')] = reloaded[i]?'':pola.eq(j).val();			
			if (pola.eq(j).attr('rel') != 'off') {
				
					polaFormularza[i][pola.eq(j).attr('name')] = 'textarea';
					if (pola.eq(j).attr('rel') != undefined)		
						required[i][pola.eq(j).attr('name')] = pola.eq(j).attr('rel').split(';');	
				
			}		
		}

		// zapisanie wymagań i warunków
		pola = $('select', forms.eq(i));
		for(var j=0 ; j<pola.length ; j++) {
			if (pola.eq(j).attr('rel') != 'off') {
				polaFormularza[i][pola.eq(j).attr('name')] = 'select';
				if (pola.eq(j).attr('rel') != undefined)		
					required[i][pola.eq(j).attr('name')] = pola.eq(j).attr('rel').split(';');	
			}		
		}

		// obsługa czyszczenia tekstów, czyści tylko za pierwszym klikiem  / można potem zrobić na .one('click', ... )
		if (reloaded[i]==false) {
		//alert(reloaded[i]);
		$('textarea, input[@type=text]', forms.eq(i)).click(function(){			
		if (!(czyscFormularz[i] instanceof Array)) czyscFormularz[i] = new Array();	
			if (!(czyscFormularz[i] instanceof Array)) czyscFormularz[i] = new Array();	
			
			if (czyscFormularz[i][$(this).attr('name')] != true) {
				czyscFormularz[i][$(this).attr('name')] = true;
				$(this).val('');
			}
		});	
		}
		
		// obsługa onsubmit, gdzie sprawdza czy wypełnione są pola
		forms.eq(i).bind('submit', {nb: i}, function(event){
			return obsluzFormularz(event.data.nb);
		});	
			
	}
});

function sprawdzMaske(i, name, formus) {
	//return true;
	var _maska = maska[i][name];

  	var dobryEmail=/^[^@]+@([a-z0-9\-]+\.)+[a-z]{2,4}$/i; 
 	var dobryTelefon = /^([0-9]+[ -]?)+$/i;
	
	if (_maska == 'mail' || _maska == 'email' || _maska == 'e-mail') {
		_var = $("input[@name='"+name+"']", formus).val();
		if (dobryEmail.test(_var) == '') return false;
	}
	
	return true;
}

/*
 * 
 */
function sprawdzWymagania(i, name, formus) {
	if (required[i][name] == undefined || required[i][name][0] == '' || required[i][name][0] == undefined) return true;
	
	var ilosc = required[i][name].length;
	var tmp, val, obj;
	
	for (var j=0 ; j<ilosc ; j++)
	{
		tmp = required[i][name][j].split('==');
		var znak = '==';
		
		if (tmp.length == 1) { required[i][name][j].split('>='); znak = '>='; }
		if (tmp.length == 1) { required[i][name][j].split('<='); znak = '<='; }
		if (tmp.length == 1) { required[i][name][j].split('!='); znak = '!='; }
		if (tmp.length == 1) { required[i][name][j].split('>'); znak = '>'; }
		if (tmp.length == 1) { required[i][name][j].split('<'); znak = '<'; }
		
		obj = $("[@name='"+tmp[0]+"']", formus);
		if (obj.attr('type') == 'radio' || obj.attr('type') == 'checkbox') val = $("[@name='"+tmp[0]+"']:checked", formus).val();
		else val = obj.val();
		
		//alert(tmp[1]+' , '+val);
		if (tmp.length > 1) {
			if (znak == '==' && tmp[1] == val) return true;
			if (znak == '>=' && parseInt(tmp[1]) >= parseInt(val)) return true;
			if (znak == '<=' && parseInt(tmp[1]) <= parseInt(val)) return true;
			if (znak == '!=' && parseInt(tmp[1]) != parseInt(val)) return true;
			if (znak == '>' && parseInt(tmp[1]) > parseInt(val)) return true;
			if (znak == '<' && parseInt(tmp[1]) < parseInt(val)) return true;
		} else
			if (val == '' || val == undefined) return false;
	}
	
	return false;
}

/**
 * sprawdza formularz formularz czy jest wypelniony 
 * @param {Integer} i - id formularza
 */
function obsluzFormularz(i) {
	var niepoprawne = 0;
	var formus = $('form.formbox:eq('+i+')');
	
	//alert('to: '+reloaded[i]);
	for(var name in polaFormularza[i]) {
		//alert(polaFormularza[i][name]+', '+wartoscStartowa[i][name]+', '+$("[@name='"+name+"']", formus).val()+', '+"select[@name='"+name+"']");
		
		//$("select, input, textarea", formus).removeClass('selected');
		
		if (polaFormularza[i][name] == 'select')
			if (sprawdzWymagania(i, name, formus) && $("select[@name='"+name+"']", formus).val() == 0) {
				niepoprawne++;
				$("select[@name='"+name+"']", formus).addClass('formboxSelected');
			} else $("select[@name='"+name+"']", formus).removeClass('formboxSelected');
			
		else if (polaFormularza[i][name] == 'text')
			if (sprawdzWymagania(i, name, formus) && (!sprawdzMaske(i, name, formus) || $("input[@name='"+name+"']", formus).val() == '' || ($("input[@name='"+name+"']", formus).val() == wartoscStartowa[i][name]))) {
				niepoprawne++;
				$("input[@name='"+name+"']", formus).addClass('formboxSelected');
			} else $("input[@name='"+name+"']", formus).removeClass('formboxSelected');
			
		else if (polaFormularza[i][name] == 'textarea')
			if (sprawdzWymagania(i, name, formus) && ($("textarea[@name='"+name+"']", formus).val() == '' || ($("textarea[@name='"+name+"']", formus).val() == wartoscStartowa[i][name]))) {
				niepoprawne++;
				$("textarea[@name='"+name+"']", formus).addClass('formboxSelected');
			} else $("textarea[@name='"+name+"']", formus).removeClass('formboxSelected');
	}
	
	// można dołożyć htmlowy komunikat
	if (niepoprawne) {
		alert('Liczna pól niewypełnionych poprawnie: '+niepoprawne+"\nProszę wypełnić pola ozaczone na czerwono");
		return false;
	}
	else return true;
}

/******************************************** F O R M B O X ® ******************************************end***/
