// przez ile mnożymy i dzielimy liczby (dla lepszej precyzji przy zwiększaniu i zmniejszaniu)
var gMultiplyBy = Math.pow(10, 9);
// ile ma być miejsc po przecinku przy zmiennych typu float (dla których UOM_IS_INT == 'N')
var gDecimalPlaces = 3;
// przez ile mnożymy i dzielimy właściwą wartość, żeby otrzymać wartoś float - zależy od gDecimalPlaces
var gDecimalPlacesMultiplier = Math.pow(10, gDecimalPlaces);


$(document).ready(function(){
	// klikanie w plusiki i minusiki
	$('img.increment, img.decrement').click(function(){
		// kod towaru dla klikniętego plusa/minusa
		var vCode = $(this).parent().parent().parent().find(':hidden[name^=prod_code]').get(0).name.substr(9);
		// sprawdzamy, czy wpisana ilość jest prawidłowa i ewentualnie poprawiamy ją
		verify(vCode,true);
		// w zależności czy zwiększamy, czy zmniejszamy wywołujemy odpowiednie funkcje
		if ($(this).hasClass('increment')) 
		{
			increment(vCode);
			if($('.count_'+vCode) != 'undefined')
				$('.count_'+vCode).val(parseInt($('.count_'+vCode).val()) + 1);
		}
		else
		{ 
			decrement(vCode);
			if($('.count_'+vCode) != 'undefined')
				$('.count_'+vCode).val(parseInt($('.count_'+vCode).val()) - 1);
		}
		// przeliczamy cenę
		price();
		//alert($(this).parent().find(':hidden[name^=amount]').attr('value'));
	});
	// opuszczanie pola z ilością
	$(':text[id^=amount]').blur(function(){
		verify($(this).parent().find(':hidden[name^=amount]').get(0).name.substr(6));
		// przeliczamy cenę
		price();
	});
	// naciśnięcie entera w polu z ilością
	$(':text[id^=amount]').keypress(function(event){
		// kod wciśniętego klawisza
		var vCode = undefined;
		if (event.keyCode) 
			vCode = event.keyCode;
		else if (event.which) 
			vCode = event.which;
		
		// jeśli nie jest ENTER, to olewamy
		if (vCode != 13)  // - enter
			return;
		
		// id guzika do kliknięcia
		var vId = '#addtocart' + this.id.substr(6);
		// opuszczamy pole
		this.blur();
		// symulujemy wciśnięcie dodawania do koszyka - z opóźnieniem
		$('div.wait').css('display', 'block');
		setTimeout('$(\'' + vId + '\').click();', 1000);
	});
});

/**
 * Funkcja dla podanego kodu towaru sprawdza, czy wpisana ilość jest prawidłowa
 * i ewentualnie zaokrągla/redukuje do prawidłowej
 *
 * @param String pCode - kod towaru
 */
function verify(pCode,pMode)
{
	// pole testowe, w które wpisujemy ilość
	var vInput = $('#amount'+pCode);
	// pole hidden, w którym jest niezaokrąglona ilość
	var vHidden = $('#amount_hid'+pCode);
	// aktualnie wpisana ilość
	if(pMode)
		var vAmountIn = unformat(vHidden.attr('value'));
	else
		var vAmountIn = unformat(vInput.attr('value'));		
	if(vAmountIn < 0)
		vAmountIn = 0;
	// wielkość, wielokrotnością której, powinna być ilość towaru
	var vUndiv = parseFloat($('#uom_undiv'+pCode).attr('value'));
	// czy przedstawiać ilość jako wielkość całkowitą
	var vIsInt = ($('#uom_is_int'+pCode).attr('value') == 'T');
	
	// jeśli ilość w polu tekstowym zgadza się z ilością w polu ukrytym, to przepisujemy jeszcze raz
	if (vAmountIn == Math.round(parseFloat(vHidden.attr('value'))*gDecimalPlacesMultiplier)/gDecimalPlacesMultiplier)
	{
		vInput.attr('value',format(parseFloat(vHidden.attr('value')), vIsInt));
		return;
	}
	
	// ilość poprawiona
	var vAmountOut = Math.round(vAmountIn/vUndiv)*vUndiv;
	
	vHidden.attr('value', vAmountOut + '');
	vInput.attr('value', format(vAmountOut, vIsInt));
	//alert(vHidden.attr('value'));
}


/**
 * Zwiększ ilość towarów o jedną jednostkę niepodzielną
 *
 * @param String pCode - kod towaru
 */
function increment(pCode)
{
	// pole testowe, w które wpisujemy ilość
	var vInput = $('#amount'+pCode);
	// pole hidden, w którym jest niezaokrąglona ilość
	var vHidden = $('#amount_hid'+pCode);
	// aktualna ilość	
	var vAmountIn = parseFloat(vHidden.attr('value'));
	if (isNaN(vAmountIn))
		vAmountIn = 0;
	// wielkość, wielokrotnością której, powinna być ilość towaru
	var vUndiv = parseFloat($('#uom_undiv'+pCode).attr('value'));
	// czy przedstawiać ilość jako wielkość całkowitą
	var vIsInt = ($('#uom_is_int'+pCode).attr('value') == 'T');
	
	vAmountOut = (vAmountIn*gMultiplyBy + vUndiv*gMultiplyBy)/gMultiplyBy;

	vHidden.attr('value', vAmountOut + '');
	vInput.attr('value', format(vAmountOut, vIsInt));
}

/**
 * Zmniejsz ilość towarów o jedną jednostkę niepodzielną
 *
 * @param String pCode - kod towaru
 */
function decrement(pCode)
{
	// pole testowe, w które wpisujemy ilość
	var vInput = $('#amount'+pCode);
	// pole hidden, w którym jest niezaokrąglona ilość
	var vHidden = $('#amount_hid'+pCode);
	// aktualna ilość
	var vAmountIn = parseFloat(vHidden.attr('value'));
	if (isNaN(vAmountIn))
		vAmountIn = 0;
	// wielkość, wielokrotnością której, powinna być ilość towaru
	var vUndiv = parseFloat($('#uom_undiv'+pCode).attr('value'));
	// czy przedstawiać ilość jako wielkość całkowitą
	var vIsInt = ($('#uom_is_int'+pCode).attr('value') == 'T');
	
	vAmountOut = Math.max((vAmountIn*gMultiplyBy - vUndiv*gMultiplyBy)/gMultiplyBy, 0);
	
	vHidden.attr('value', vAmountOut + '');
	vInput.attr('value', format(vAmountOut, vIsInt));
}


/**
 * Funkcja zwracająca liczbę float jako string z 0 (int), lub 3 (float) miejscami po przecinku
 *
 * @param mixed pValue - nasza wartość (float, lub int)
 * @param boolean pInt - czy przedstawić liczbę jako "float" (przecinek, 3 m. po przeciku), czy "int"
 * @return String - liczba po formatowaniu
 */
function format(pValue, pInt)
{
	// jeśli wartość jest 0, to jej nie wyświetlaj
	if (pValue == 0)
		return '';
	
	pValue = parseFloat(pValue);
	// jeśli ma być wartość całkowita, to zaokrągl ją
	if (pInt)
		return parseInt(Math.round(pValue)) + '';
	else
	{
		// mnożymy przez 10*ilość miejsc po przecinku, jaka ma być
		vRound = Math.round(pValue*gDecimalPlacesMultiplier) + '';
		
		// to, co ma się pokazywać przed przecinkiem...
		vPref = vRound.substr(0, vRound.length - gDecimalPlaces);
		if (vPref == '')
			vPref = '0';
		
		// ...i reszta
		vSuf = vRound.substr(vRound.length - gDecimalPlaces);
		if (vSuf != '')
			vSuf = ',' + vSuf;
		
		return vPref + vSuf;
	}
}

/**
 * Funkcja odwrotna do w/w - na podstawie stringa "zgaduje" liczbę jako float
 *
 * @param String pNumber - "liczba"
 * @return float - wynik
 */
function unformat(pNumber)
{
	if (isNaN(pNumber) || pNumber == '')
		return 0;
	return parseFloat(pNumber.replace(',', '.'));
}


/**
 * Przelicz i wyświetl cenę - funkcja tylko dla koszyka
 */
function price()
{
	// łączna wartość
	var vSum = 0;
	// czy jesteśmy w koszyku
	var vExists = false;
	
	$(':hidden[id^=price]').each(function(i){
		// jesteśmy w koszyku
		vExists = true;
		
		// pobieramy kod towaru dla danej ceny
		var vCode = this.id.substr(5);
		// wyliczamy wartość dla jednego elementu...
		var vValue = parseFloat($('#amount_hid' + vCode).attr('value'))*parseFloat(this.value);
		// ...wpisujemy ją w odpowiednie miejsce...
		$(this).parent().find('span:first').html(priceFormat(vValue));
		// ...i dodajemy do łącznej wartości
		vSum += vValue;
	});
	
	// jeśli jesteśmy w koszyku, to przypisujemy łączną wartość w odpowiednie miejsce
	if (vExists)
		$(this.form).find('td#cartSum span').html(priceFormat(vSum));
}

/**
 * Liczbę typu float przekształć na odpowiedni dla ceny łańcuch
 *
 * @param float pValue
 * @return String
 */
function priceFormat(pValue)
{
	// wyciągamy ilość groszy
	var vRet = Math.round(pValue*100) + '';
	
	// jeżeli nic nie znaleźliśmy, to 0
	if (vRet == '')
		return '0,00';
	// jeżeli jest mniej niż 10 groszy, to zwracamy tak
	if (vRet.length == 1)
		return '0,0' + vRet;
	// jeżeli jest mniej niż 1zł, to zwracamy tak
	if (vRet.length == 2)
		return '0,' + vRet;
	
	var vPrefix = vRet.substr(0, vRet.length - 2);
	var vPref = '';
	for (var k=vPrefix.length-1;k>-1;k--)
		if ((vPrefix.length-k) % 3 == 0)
			vPref = ' ' + vPrefix.charAt(k) + vPref;
		else
			vPref = vPrefix.charAt(k) + vPref;
	
	return vPref + ',' + vRet.substr(vRet.length - 2);
}
