function wymiary(szer, wys){
	this.szer = szer
	this.wys = wys
}

function rnd(liczba){
	liczba_rnd0 = Math.round(liczba)
	liczba_rnd1 = Math.round(liczba*10)/10;
	liczba_rnd2 = Math.round(liczba*100)/100;
	liczba_rnd3 = Math.round(liczba*1000)/1000;

	if (liczba_rnd3==liczba) 	return liczba_rnd3;
	if (liczba_rnd2==liczba) 	return liczba_rnd2;
	if (liczba_rnd1==liczba) 	return liczba_rnd1;
	if (liczba_rnd0==liczba) 	return liczba_rnd0;
 	return liczba_rnd3;

}

function index(obiekt, nazwa_pelna ){
// zwraza nazwę skróconą odpowiadającą nazwie papieru

	for(property in obiekt){
		if (obiekt[property].Nazwa == nazwa_pelna) {
			return property;
		}
	}
}


function parametryPalet(tabelaPapierow, papier, gramatura){
// funkcja sprawdza z jakich palet papierów można uzyskać żądany papier do druku
// parametry wejściowe (string: pełna nazwa papieru, int: gramatura)
// zwraca tablice obiektów (palet) o właściwościach: index, nazwa, cena, szer, wys, gramatura, grubosc]

	for(i in tabelaPapierow[papier].Gramatura){
		if (tabelaPapierow[papier].Gramatura[i]==gramatura) {
			IndexGramatury=i;
		}
	}
	var wynik = new Array();
	for (i in tabelaPapierow[papier].ListaPalet[IndexGramatury]){
		var pal = new Object()
		pal.index = tabelaPapierow[papier].ListaPalet[IndexGramatury][i][6];
	//	pal.index = i;
		pal.nazwa = tabelaPapierow[papier].ListaPalet[IndexGramatury][i][0];
		pal.cena  = tabelaPapierow[papier].ListaPalet[IndexGramatury][i][1];
		pal.szer  = Math.max(tabelaPapierow[papier].ListaPalet[IndexGramatury][i][2],tabelaPapierow[papier].ListaPalet[IndexGramatury][i][3]);
		pal.wys   = Math.min(tabelaPapierow[papier].ListaPalet[IndexGramatury][i][2],tabelaPapierow[papier].ListaPalet[IndexGramatury][i][3]);
		pal.gramatura = tabelaPapierow[papier].ListaPalet[IndexGramatury][i][4];
		pal.grubosc = tabelaPapierow[papier].ListaPalet[IndexGramatury][i][5];
		wynik[i] = pal;
	}
	return wynik;
}
function mozliweArkusze(Palety,maxWymiary,bezMaxMaszyny){
// funkcja sprawdza na jakich arkuszach możliwy jest druk przez podział wszystkich palet na połowę
// parametry wejściowe  (object Palety , object maxWymiary, bool bezMaxMaszyny)
// obj palety zwracany przez funkcję parametryPalet()
// obj maxWymiary o właściwościach this.szer oraz this.wys
// bezMaxMaszyny zmienna czy kalkulować maksymalny rozmian na maszynie
// zwraca tablice arkuszy o elementach (obiect: [this.szer,this.wys])
	var listaMozliwychArkuszy = new Array();
	if (maxWymiary.szer<maxWymiary.wys) {
		tmp=maxWymiary.szer;
		maxWymiary.szer=maxWymiary.wys;
		maxWymiary.wys=tmp;
	}

	max_szer_pal = 0; max_wys_pal = 0;
	for(i in Palety){
		if (Palety[i].szer>max_szer_pal)  max_szer_pal = Palety[i].szer;
		if (Palety[i].wys>max_wys_pal)  max_wys_pal = Palety[i].wys;
	}

	for(i in Palety){
		tmp_szer = Math.max(Palety[i].szer,Palety[i].wys);
		tmp_wys = Math.min(Palety[i].szer,Palety[i].wys);
		while(tmp_wys>=210){
			if (tmp_szer<=maxWymiary.szer && tmp_wys<=maxWymiary.wys) {

				listaMozliwychArkuszy.push( new wymiary(tmp_szer,tmp_wys));
			}
			tmp= Math.min(tmp_wys,tmp_szer);
			tmp_wys = Math.max(tmp_wys,tmp_szer)/2;
			tmp_szer = tmp;

		}
	}
	listaMozliwychArkuszy = listaMozliwychArkuszy.reverse()

	if (!bezMaxMaszyny)	{
		if (max_szer_pal > maxWymiary.szer && max_wys_pal>maxWymiary.wys) {
			listaMozliwychArkuszy.push( new wymiary(maxWymiary.szer,maxWymiary.wys));
		}
	}
//	alert('start');
		for(i in listaMozliwychArkuszy){
//		alert(listaMozliwychArkuszy[i].szer + ' x '+ listaMozliwychArkuszy[i].wys)
		}

	return listaMozliwychArkuszy;
}
function wybor_arkusza(uzytek, listaArkuszy, marginesy){
// wybieramy arkusz do druku na którym jest optymalne rozłożenie użytków
// parametry wejściowe  (object uzytek, array: listaArkuszy, object marginesy)
// object uzytek o właściwościach this.szer oraz this.wys
// tablica listaArkuszy zwracana przez funkcję mozliweArkusze();
// object marginesy o właściwościach this.szer oraz this.wys określa sumaryczne marginesy zadruku
// zwraca arkusz do druku jako obiekt wymiary(this.szer, this.wys)

	if(!marginesy){		marginesy = new wymiary(0,0);	}

	//sortowanie

	for (count=0; count<listaArkuszy.length; count++){
		for (i=0; i<listaArkuszy.length-1; i++){
			if (listaArkuszy[i].szer > listaArkuszy[i+1].szer) {
				temp = listaArkuszy[i];	listaArkuszy[i] = listaArkuszy[i+1]; listaArkuszy[i+1] = temp;
			}
		}
	}

	Luz=0;
	var Arkusz_do_druku = new wymiary();
	var Max_Arkusz_do_druku = new wymiary();
	Arkusz_do_druku.szer=0;
	Arkusz_do_druku.wys=0;

	for(i in listaArkuszy){
		lb_uz_na_bierzacym_arkuszu = liczba_uzytkow(listaArkuszy[i].szer-marginesy.szer, listaArkuszy[i].wys-marginesy.wys, uzytek.szer, uzytek.wys);
		if (lb_uz_na_bierzacym_arkuszu.luz>Luz) {
			Arkusz_do_druku = listaArkuszy[i]
			Luz =lb_uz_na_bierzacym_arkuszu.luz;
			continue;
		}
		if (lb_uz_na_bierzacym_arkuszu.luz==Luz) {
			if (listaArkuszy[i].szer*listaArkuszy[i].wys<Arkusz_do_druku.szer*Arkusz_do_druku.wys) {
				Arkusz_do_druku = listaArkuszy[i]
				Luz =lb_uz_na_bierzacym_arkuszu.luz;
			}
		}
		Max_Arkusz_do_druku.szer=listaArkuszy[i].szer;
		Max_Arkusz_do_druku.wys=listaArkuszy[i].wys;
	}
	if (Arkusz_do_druku.wys*Arkusz_do_druku.szer ==0) {
		return Max_Arkusz_do_druku;
	}
	return Arkusz_do_druku;
}

function wybor_palety(Palety, ArkuszDoDruku){
// z pośród listy palet wybierą tę na której mieści się najwięcej arkuszy drukarskich
// Parametry wejściowe:  tablica palety[] obiektów paleta o własciwościach (this.szer, this.wys ,[...]), obiekt ArkuszDoDruku o własciwościach (this.szer, this.wys)
// zwraca jeden z elementów tablicy Paety

	var luz = 0; var luz_palety; var Paleta = false;
	for (i in Palety){
		luz_palety  = liczba_uzytkow(Palety[i].szer, Palety[i].wys, ArkuszDoDruku.szer, ArkuszDoDruku.wys);
		if (luz_palety.luz > luz) {
			Paleta = Palety[i];
			luz = luz_palety.luz;
		}
	}
	Paleta.luz=luz;
	return Paleta;
}

function liczba_uzytkow(Szer_Arkusza, Wys_Arkusza, SzerUzytku, WysUzytku, IstotnoscOrietacji)
//zwraca  Liczba_uzytkow_na_arkuszu , Liczba_ciec, macierz, obrot
//jako obiekt o właściwościach :  this.luz , this.ciecia , this.macierz , this.obrot
{
	//ustalamy że szerokość jest  mniejsza od wysokości

	if (!IstotnoscOrietacji && SzerUzytku>WysUzytku) {
		tmp=SzerUzytku;
		SzerUzytku=WysUzytku;
		WysUzytku=tmp;
	}
	// obliczamy ile uzytków zmiesci nie na arkuszu w zaleznoci od orietacji strony
	S1 = Math.floor( Szer_Arkusza / SzerUzytku );
	W1 = Math.floor( Wys_Arkusza / WysUzytku );
	S2 = Math.floor( Wys_Arkusza / SzerUzytku );
	W2 = Math.floor( Szer_Arkusza / WysUzytku );

	if ((S1*W1>S2*W2) || IstotnoscOrietacji) {
		Liczba_uzytkow_na_arkuszu= S1*W1;
		Liczba_ciec = S1+W1;	// cięcie liczone jest bez wycinki
		macierz= S1 +' x ' +W1;
		var obrot=1
	}else{
		Liczba_uzytkow_na_arkuszu= S2*W2;
		Liczba_ciec = S2+W2;
		macierz= S2 +' x ' +W2;
		var obrot=0
	}

	tmp = new Object()
	tmp.luz = Liczba_uzytkow_na_arkuszu;
	tmp.ciecia = Liczba_ciec;
	tmp.macierz = macierz;
	tmp.obrot = obrot;
	return tmp;
}
