/* Biblioteka przydatnych klas i funkcji js */

/**
* Klasa Validate - klasa z metodami do przeróżnych walidacji
*/

function Validate() {
    this.field = null;
}

Validate.prototype.getCheckedRadioValue = function(radiogroup) {
	var val;
    this.field = radiogroup;
	if (radiogroup.length) {
		for (var i = 0; i < radiogroup.length; i++) {
			if (radiogroup[i].checked) {
				val = radiogroup[i].value;
				break;
			};
		};
	} else  if (radiogroup.checked) {
		val = radiogroup.value;
	};
	return val;
};

Validate.prototype.checkFieldProperties = function(field, check4) {
    var result = false;
    if (!field) {
        return true;
    }
    this.field = field;
    
    check4 = check4.replace("_","");
    
    switch (check4)
    {
        case 'text':
            result = field.value != '' ? true : false;
            break;
        case 'checked':
            var checked = 0;
            if (field.length) {
                for (var i = 0; i < field.length ; i++)
                {
                    if (field[i].checked)
                    {
                        checked = 1;
                        break;
                    }
                }
            } else if (field.checked) {
                checked = 1;
            };
            result = checked ? true : false;
            break;
        case 'selected':
            var selected = 0;
            if (field.type == 'select-one' || field.type == 'select-multiple') {
                if (field.options[field.selectedIndex].value != 0
                  && field.options[field.selectedIndex].value != '') {
                    result = true;
                } else {
                    result = false;
                }
            }
            break;
        case 'int':
            result = field.value.search(/^[0-9\.]+$/) >= 0 ? true : false;
            break;
        case 'value':
            switch (field.type) {
              case 'select-one':
              case 'select-multiple':
                result = field.selectedIndex >= 0 ? field.options[field.selectedIndex].value : undefined;
                break;
              case 'hidden':
              case 'password':
              case 'text':
              case 'textarea':
                result = field.value;
                break;
              // radio
              // checkbox
              case 'undefined':
                result = undefined;
                if (field.length) {
					result = this.getCheckedRadioValue(field);
                };
                break;
            };
            break;
    }
    return result;
};

Validate.prototype.CyfraKontrolna = function(numer, dl, modulo, waga, typ) {
  if (numer.length == dl) {
      suma = 0;
      i_lokalne = 0;
      while (i_lokalne < dl-1) {
             suma = suma + parseInt(numer.charAt(i_lokalne)) * waga[i_lokalne];
             i_lokalne++;
      }
      cyfra = suma % modulo;
      if (typ != 0) {
		  cyfra = modulo - cyfra;
		  cyfra = cyfra % modulo;
	  }
      if (cyfra == 10) cyfra = 0;
      return (parseInt(numer.charAt(dl-1)) == cyfra);
  } else return false;
}

/* Funkcja konwertuje datę podaną jako string na tablicę 
    tab[0] - rok
    tab[1] - miesiąc
    tab[2] - dzień
*/
Validate.prototype.getDate = function(s_Date) {
    var tab = new Array(3);
    if (s_Date=='' || s_Date == null) {
        czas = new Date();
        tab[0] = czas.getFullYear();
        var MYmonth = czas.getMonth() + 1;
	    MYmonth = MYmonth < 10 ? "0"+ MYmonth : MYmonth;
        tab[1] = MYmonth;
        tab[2] = czas.getDate() < 10 ? "0"+ czas.getDate() : czas.getDate();
        return tab;
    } else {
        tmp = s_Date.split("-");
        if (tmp.length!=3) 
            return false;
        if (tmp[0].length==4) {
            tab[0] = s_Date.substr(0, 4);
            tab[1] = s_Date.substr(5, 2);
            tab[2] = s_Date.substr(8, 2);
        } else if (tmp[2].length==4) {
            tab[0] = s_Date.substr(6, 4);
            tab[1] = s_Date.substr(3, 2);
            tab[2] = s_Date.substr(0, 2);
        } else 
            return false;
        return tab;
    }
}

/* Sprawdza poprawność numeru PESEL
   Dodatkowo można podać datęurodzenia i zostanie jeszcze sprawdzone czy się zgadza 
*/
Validate.prototype.PESEL = function(field, data_ur) {
    this.field = field;
    var waga=[1, 3, 7, 9, 1, 3, 7, 9, 1, 3];
    dlugosc = 11;
    modulo = 10;
    wariant = 1;
    if (field.value.length != 11) return false;
    if (data_ur.length == 10) {
        dodaj_do_mc = 0;
        tab = this.getDate(data_ur);
        rok     = tab[0];
        miesiac = tab[1];
        dd      = tab[2];
        if ((rok >= 1800) && (rok < 1900))      dodaj_do_mc = 80;
        else if ((rok >= 2000) && (rok < 2100)) dodaj_do_mc = 20;
        else if ((rok >= 2100) && (rok < 2200)) dodaj_do_mc = 40;
        else if ((rok >= 2200) && (rok < 2300)) dodaj_do_mc = 60;
        miesiac = parseInt(miesiac) + dodaj_do_mc;
        if (miesiac < 10) 
            miesiac = '0' + miesiac;
        pom = rok.substr(2, 2) + miesiac + dd;
        if (pom != field.substr(0, 6)) return false;
    }
    return this.CyfraKontrolna(field.value, dlugosc, modulo, waga, wariant);
}    
    
Validate.prototype.PESEL_Sex = function (field, sex) {
    var tmp = (field.value.substr(9,1) % 2)?'M':'K';
    return (tmp==sex)?true:false;
}

Validate.prototype.Regon = function (field) {
    this.field = field;
    var waga=[8, 9, 2, 3, 4, 5, 6, 7];
    dlugosc = 9;
    modulo = 11;
    wariant = 0;
    return this.CyfraKontrolna(field.value, dlugosc, modulo, waga, wariant);
}

Validate.prototype.NIP = function (nr) {
    this.field = field; 
    var waga=[6, 5, 7, 2, 3, 4, 5, 6, 7];
    dlugosc = 10;
    modulo = 11;
    wariant = 0;
    return this.CyfraKontrolna(nr, dlugosc, modulo, waga, wariant);
}

/* Dozwolony format DD-MM-YYYY lub YYYY-MM-DD */
Validate.prototype.Date = function (field) {
    this.field = field;
    var s_data = field.value;
    if (s_data.length != 10) 
        return false;
    else {
        tab = this.getDate(s_data);
        if (!tab)
            return false;
        dzien = tab[2];
        mies  = tab[1];
        rok   = tab[0];
        if (rok.length < 4 || mies.length < 2 || dzien.length < 2) 
            return false;
        data = new Date();
        data.setFullYear(rok, mies - 1, dzien);
        rok2 = data.getFullYear();
        mies2 = data.getMonth() + 1;
        dzien2 = data.getDate();
        //powinno byc to samo
        if (rok!=rok2 || mies!=mies2 || dzien!=dzien2) 
            return false;
        else 
            return true;
    }
}

Validate.prototype.DateYYYYMMDD = function (field) {
    this.field = field;
    var s_data = field.value;
    if (s_data.length != 10) 
        return false;
    else {
        tab = s_data.split('-');
        if (!tab || tab.length!=3)
            return false;
        if (tab[0]=='' || tab[1]=='' || tab[2]=='') 
            return false;
        dzien = tab[2];
        mies  = tab[1];
        rok   = tab[0];
        if (rok.length < 4 || mies.length < 2 || dzien.length < 2) 
            return false;
        data = new Date();
        data.setFullYear(rok, mies - 1, dzien);
        rok2 = data.getFullYear();
        mies2 = data.getMonth() + 1;
        dzien2 = data.getDate();
        //powinno byc to samo
        if (rok!=rok2 || mies!=mies2 || dzien!=dzien2) 
            return false;
        else 
            return true;
    }
}

Validate.prototype.DateCompare = function (field1, field2) {
    var s_data1 = field1.value;
    var s_data2 = field2.value;
    if (!this.Date(field1) || !this.Date(field2)) 
        return -2;
    // daty są stringami w formacie DD-MM-RRRR lub RRRR-MM-DD, zmieniam szyk do porównania
    tab1 = this.getDate(s_data1);
    tab2 = this.getDate(s_data2);
    sd1 = tab1.join('');
    sd2 = tab2.join('');
    if (sd1 > sd2)
        return 1;
    else if (sd1 < sd2) 
        return -1;
    else 
        return 0;
}

Validate.prototype.Mecz = function (field) {
    //var reg = /[0-9]{1,2}:[0-9]{1,2}/g;
    var reg = new RegExp("[0-9]{1,2}:[0-9]{1,2}","g");

    if (reg.test(field.value)) {
        return true;    
    } else {
        return false;
    }
}

Validate.prototype.email = function (field) {
    this.field = field;
    //var reg = /.+\@.+\...+/g;
    var reg = new RegExp(".+\@.+\...+","g");

    if (reg.test(field.value)) {
        return true;    
    } else { 
        return false;
    } 
}
