/*
 * CMAX.gg
 * General scripts
 */

/*************** payment stuff ******************/

/**
 * Functions to update the credit fields when some
 * of them is changed.
 * When changing credit field, call updatePaymentEuroFields(),
 * When changing one of the euro fields, call updatePaymentCreditField()
 */ 
 
/**
 * You can add anything that may appear statically to banks array,
 * entries that are not found on page, are automatically skipped.
 */
var paymentCreditField = null;
var paymentEuroFields = [];
var paymentEuroMultipliers = [];
var paymentFieldKeys = [];

function populatePaymentFieldArrays()
{
	if (paymentCreditField != null)
	{
		return;
	}
	paymentCreditField = document.getElementById("creditSum");
	var j = 0;
	for (var i = 0; i < banks.length; i++)
	{
		field = document.getElementById("priceMapVal1_"+banks[i]);
		if (field == null)
		{
			continue;
		}
		paymentEuroFields[j] = field;
        paymentFieldKeys[j] = i;

		field = document.getElementById("paymentMultiplier_"+banks[i]);
		if (field != null)
			paymentEuroMultipliers[j] = field;
		j++;
	}	
}

function _fixField(v)
{
	if (isNaN(v))
		v = '';
	if (v < 0)
		v = -v;
	return v;
}

function fixIntField(field)
{
	if (field == undefined)
	{
		return;
	}
		
	var v;
	v = field.value;
	v = parseInt(v);
	v = _fixField(v);
	if (v > 999996)
	{
		v = 999996;
	}
	field.value = v;
}

function fixFloatField(field)
{
	var v;
	v = field.value;
	v = '' + v;
	v = v.replace(/,/, "."); 
	if (v != parseFloat(v))
		v = parseFloat(v);
	if (v == 0)
		v = '';
	v = _fixField(v);
	field.value = v;
}

/**
 * @param larger if true, searches for closest larger instead. (useful for sms)
 *
 * @return price border found in the array, or -1 on fail
 */
function _findClosestSmallerPriceBorder(arr, amount, larger)
{
    var i;
    if (arr == null)
        return -1;
    var smallest = -1;
    var smallestKey = -1;
    var compareMod = 1;
    if (larger)
    	compareMod = -1;
    for (i = 0; i < arr.length; i++)
    {
        if (compareMod * amount >= compareMod * arr[i][0])
        {
            if (arr[i] < smallest || smallest < 0)
            {
                smallest = arr[i][0];
                smallestKey = i;
            }
        }
    }
    if (smallest == -1 && larger)
    	return arr.length - 1;
    else
	    return smallestKey;
}

function _transformWithPriceBorders(inMoney, bankKey, bankArr, inverse)
{
	var outMoney = 0;
	var multiplier = 1;
	var strict = (bankPrice_strict[bankKey] && inverse);
    var borderPrice = _findClosestSmallerPriceBorder(bankArr[bankKey], inMoney, strict);
    if (borderPrice < 0)
    {
    	if (bankArr[bankKey] != null
    	    && bankArr[bankKey].length)
		{
			borderPrice = 0;
			inMoney = bankArr[bankKey][0][0];
		}
    }
    if (strict)
    {
    	if (inMoney > bankArr[bankKey][borderPrice][0])
    	{
    		// we'll need several payments
    		multiplier = Math.ceil(inMoney / bankArr[bankKey][borderPrice][0]);
    	}
    	inMoney = bankArr[bankKey][borderPrice][0];
    }
    if (borderPrice >= 0)
    {
        var m = bankArr[bankKey][borderPrice][1];
        var c = bankArr[bankKey][borderPrice][2];
        if (inverse)
			outMoney = inMoney * m - c;
		else
			outMoney = (inMoney - c) * m;
    } else {
          outMoney = 0;
    }
	return [outMoney, multiplier];
}

function _updatePaymentEuroFields(source)
{
	populatePaymentFieldArrays();
	fixIntField(paymentCreditField);
	for (var i = 0; i < paymentEuroFields.length; i++)
	{
		if (i == source)
		{
			// clearing multiplier if there is a field for it.
			if (paymentEuroMultipliers[i] != null)
			{
				paymentEuroMultipliers[i].firstChild.nodeValue = '';
			}
			continue;
		}
		var euroArr = _transformWithPriceBorders(paymentCreditField.value, paymentFieldKeys[i], bankPrice_i, true);
		euro = (Math.ceil(euroArr[0] * 100) / 100).toFixed(2);
		// ceil euro to 2 decimals
		if (bankPrice_strict[paymentFieldKeys[i]] == true)
		{
			for (var k = 0; k < paymentEuroFields[i].length - 1; k++)
			{
                // we'll have to use ceil, due to x.99 prices' calculation accuracy
                // in de_sms
				if (Math.ceil(parseFloat(paymentEuroFields[i].options[k].value)) == parseFloat(euro))
					break;
			}
			paymentEuroFields[i].selectedIndex = k;
		} else {
			paymentEuroFields[i].value = euro;
		}
		if (euroArr[1] != 1 && paymentEuroMultipliers[i] != null)
		{
			var	tail = 'x';
			if (euroArr[1] < 9)
			{
				paymentEuroMultipliers[i].firstChild.nodeValue = euroArr[1] + tail;
			} else {
				paymentEuroMultipliers[i].firstChild.nodeValue = '...';
			}
		} else if (paymentEuroMultipliers[i] != null)
		{
			paymentEuroMultipliers[i].firstChild.nodeValue = '';
		}
	}
}

function updatePaymentEuroFields()
{
	_updatePaymentEuroFields(-1);
}

/**
 * @param updateSource the input field whose change is causing this event.
 */
function updatePaymentCreditField(updateSource)
{
	populatePaymentFieldArrays();
	updateSource;
	if (updateSource == null)
	{
		return;
	}
	sourceNum = -1;
	for (var i = 0; i < paymentEuroFields.length; i++)
	{
		if (paymentEuroFields[i].id == updateSource.id)
		{
			sourceNum = i;
			break;
		}
	}
	fixFloatField(updateSource);
	creditArr = _transformWithPriceBorders(updateSource.value, paymentFieldKeys[sourceNum], bankPrice, false);
	// floor credit to 0 decimals
	paymentCreditField.value = Math.floor(creditArr[0]);
	_updatePaymentEuroFields(sourceNum);
}

var _priceUpdatesFrozen = 0;
var _origColor = '#000000';

function freezePriceUpdate(elem)
{
	populatePaymentFieldArrays();
	_priceUpdatesFrozen = 0;
	updatePriceMap(elem);
	if (_origColor == '')
	{
		_origColor = paymentCreditField.style.color;
	}
	paymentCreditField.style.setProperty('color','#00800B',null);
	var date = new Date();
	_priceUpdatesFrozen = date.valueOf()
}

function unfreezePriceUpdate()
{
	populatePaymentFieldArrays();
	if (_origColor != '')
	{
		// IE7 ei tue:
		if(document.implementation.hasFeature('StyleSheets', '2.0'))
			paymentCreditField.style.setProperty('color',_origColor,null);
	}
	_priceUpdatesFrozen = 0;
}

function priceUpdateFrozen()
{
	if (_priceUpdatesFrozen == 0)
	{
		return false;
	}
	var date = new Date();
	now = date.valueOf();
	if (now - _priceUpdatesFrozen > 5000)
	{
		unfreezePriceUpdate();
		return false;
	}
	return true;
}

/**
 *
 * @author arto
 */
function updatePriceMap(input)
{
	if (priceUpdateFrozen())
	{
		return;
	}
	populatePaymentFieldArrays();
	var c = input.value;

	/* taking into account day prices that are formatted with whitespace */	
	c = '' + c;
	c = c.replace(/ /, ""); 
	
	if (c != parseInt(c))
	{
		return;
	}

	var cost = 0;
	var balance = accountBalance;

	if (balance < c) 
	{
		cost = c-balance;
	}
	
	paymentCreditField.value = cost;
	updatePaymentEuroFields();
}

/*************** end payment stuff ******************/

/**
 * When user touches the password field, we make it one.
 */
function touchPasswordField(field, generatingField)
{
	if (!generatingField)
		generatingField = field;
	// IE doesn't support changing field type
	if (!document.implementation.hasFeature('HTML', '2.0'))
		return;
	if (field.type != 'password')
	{
		field.type = 'password';
		field.value = '';
		generatingField.focus(); // <- opera needs
	}
}
/**
 * For showing plaintext 'password' in password field.
 */
function untouchPasswordField()
{
	// usability: focus username field on page load
	username = document.getElementById('loginName');
	if (username != null)
	{
		username.select();
	}
/* disabled for now 

	// IE doesn't support changing field type
	if (!document.implementation.hasFeature('HTML', '2.0'))
		return;
	field = document.getElementById('loginPassword');
	if (field != null)
	{
		field.type = 'text';
		field.value = 'password';
	}
*/
}

function getFieldValueByElementId(id)
{
	el = document.getElementById(id);
	if (!el)
		return '';
	return el.value;
}