function round_number(number, dec_places)
{
    //(c) Copyright 2008, Russell Walker, Netshine Software Limited. www.netshinesoftware.com   
    //Version 2.0. Change log:
    //18/12/08 Fixed bug where digits after decimal point greater than 995
    //29/01/09 Added support for negative numbers (symmetrical rounding) and strip white space
    //12/03/09 Fixed bug where first digit is a 9 and needs to be rounded up
    var new_number = '';
    var i = 0; //Just used in loops
    var sign = ""; //If negative, a minus sign will be prefixed to the result
    number = number.toString(); //We need to operate on and return a string, not a number
    number = number.replace(/^\s+|\s+$/g, ''); //Remove any excess white space
    
    //Do we have a negative number?
    if (number.charCodeAt(0) == 45) //minus sign
    {
        sign = '-';
        number = number.substr(1).replace(/^\s+|\s+$/g, '');
    }
    
    dec_places = dec_places * 1; //We need an integer
    dec_point_pos = number.lastIndexOf(".");
   
    //If there is nothing before the decimal point, prefix with a zero
    if (dec_point_pos == 0)
    {
        number = "0" + number;
        dec_point_pos = 1;
    }
   
    //Has an integer been passed in?
    if (dec_point_pos == -1 || dec_point_pos == number.length - 1)
    {
        if (dec_places > 0)
        {
            new_number = number + ".";
            for(i=0; i<dec_places; i++)
            {
                new_number += "0";
            }
            if (new_number == 0)
            {
                sign = "";
            }
            return sign + new_number;
        }
        else
        {
            return sign + number;
        }
    }
   
    //Do we already have the right number of decimal places?
    var existing_places = (number.length - 1) - dec_point_pos;
    if (existing_places == dec_places)
    {
        return sign + number; //If so, just return the input value
    }
   
    //Do we already have less than the number of decimal places we want?
    if (existing_places < dec_places)
    {
        //If so, pad out with zeros
        new_number = number;
        for(i=existing_places; i<dec_places; i++)
        {
            new_number += "0";
        }
        if (new_number == 0)
        {
            sign = "";
        }
        return sign + new_number;
    }
   
    //Work out whether to round up or not
    var end_pos = (dec_point_pos * 1) + dec_places;
    var round_up = false; //Whether or not to round up (add 1 to) the next digit along
    if ((number.charAt(end_pos + 1) * 1) > 4)
    {
        round_up = true;
    }
   
    //Record each digit in an array for easier manipulation
    var digit_array = new Array();
    for(i=0; i<=end_pos; i++)
    {
        digit_array[i] = number.charAt(i);
    }
   
    //Round up the last digit if required, and continue until no more 9's are found
    for(i=digit_array.length - 1; i>=0; i--)
    {
        if (digit_array[i] == ".")
        {
            continue;
        }
        if (round_up)
        {
            digit_array[i]++;
            if (digit_array[i] < 10)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
   
    //Reconstruct the string, converting any 10's to 0's (except for first digit which can stay as a 10)
    for (i=0; i<=end_pos; i++)
    {
        if (digit_array[i] == "." || digit_array[i] < 10 || i == 0)
        {
            new_number += digit_array[i];
        }
        else
        {
            new_number += "0";
        }
    }
   
    //If there are no decimal places, we don't need a decimal point
    if (dec_places == 0)
    {
        new_number = new_number.replace(".", "");
    }
   
    if (new_number == 0)
    {
        sign = "";
    }
   
    //That should do it!
    return sign + new_number;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

function validate()
{
	var number_p = document.getElementById("number_p").value;
	var number_n = document.getElementById("number_n").value;
	var cost_pp = document.getElementById("cost_pp").value;
	var err = "";
	
	if (number_p.length == 0) 
       err = err + '\'Number of people\' input required \r\n';
	
	if (number_n.length == 0) 
       err = err + '\'Number of nights\' input required \r\n';
	
	if (cost_pp.length == 0) 
       err = err + '\'Cost p/p/n\' input required \r\n';
	
	
	if (err.length > 0)
    {
       alert('Please correct the following before attempting a calculation\r\n' + err);
    }
	else
	{
		calculate();
	}
}

function calculate()
{
	var lme = document.getElementById("lme").checked;
	var number_p = document.getElementById("number_p").value;
	var number_n = document.getElementById("number_n").value;
	var cost_pp = document.getElementById("cost_pp").value;
	var discount = 0.15;
	var cost = 0;
	if (lme)
	{
		discount = 0.50;
	}
	sub_cost = number_p * number_n * cost_pp;
	cost = sub_cost - (discount * sub_cost);
	save = sub_cost - cost;
	document.getElementById("non_member").innerHTML = round_number(sub_cost,2);
	document.getElementById("honey_member").innerHTML = round_number(cost,2);
	document.getElementById("save_member").innerHTML = round_number(save,2);
}

function clearText()
{
	document.getElementById("number_p").value = "2";
	document.getElementById("number_n").value = "3";
	document.getElementById("cost_pp").value = "400";
	validate();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

function validate1()
{
	var nights_high = document.getElementById("nights_high").value;
	var nights_low = document.getElementById("nights_low").value;
	var nights_booked = document.getElementById("nights_booked").value;
	var err = "";
	
	if (nights_high.length == 0) 
       err = err + ' - \'High Season Rate\' input required \r\n';
	
	if (nights_low.length == 0) 
       err = err + ' - \'Low Season Rate\' input required \r\n';
	
	if (nights_booked.length == 0) 
       err = err + ' - \'Nights booked in high season by HG members\' input required \r\n';
	
	
	if (err.length > 0)
    {
       alert('Please correct the following before attempting a calculation\r\n' + err);
    }
	else
	{
		calculate1();
	}
}

function calculate1()
{
	var nights_low = document.getElementById("nights_low").value;
	var nights_high = document.getElementById("nights_high").value;
	var nights_booked = document.getElementById("nights_booked").value;
	
	var discount = 0.15;
	var cost = 0;
	
	discount_value = discount * nights_high * nights_booked;
	nights_outseason = discount_value / nights_low;
	nights_lme = discount_value / (nights_low / 2);

	
	document.getElementById("discount_value").innerHTML = "R" + round_number(discount_value,2);
	document.getElementById("nights_outseason").innerHTML = round_number(nights_outseason,2);
	document.getElementById("nights_lme").innerHTML = round_number(nights_lme,2);
}

function clearText1()
{
	document.getElementById("nights_low").value = "800";
	document.getElementById("nights_high").value = "1000";
	document.getElementById("nights_booked").value = "8";
	validate1();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

function validate2()
{
	
	var nights_high = document.getElementById("nights_high").value;
	var nights_low = document.getElementById("nights_low").value;
	var discount_value = document.getElementById("discount_value").value;
	var err = "";
	
	if (nights_high.length == 0) 
       err = err + ' - \'High Season Rate\' input required \r\n';
	
	if (nights_low.length == 0) 
       err = err + ' - \'Low Season Rate\' input required \r\n';
	if (discount_value.length == 0) 
       err = err + ' - \'total "Rand" value of discounts you have given high season\' input required \r\n';
	
	
	if (err.length > 0)
    {
       alert('Please correct the following before attempting a calculation\r\n' + err);
    }
	else
	{
		calculate2();
	}
}

function calculate2()
{
	
	var nights_low = document.getElementById("nights_low").value;
	var nights_high = document.getElementById("nights_high").value;
	var discount_value = document.getElementById("discount_value").value;
	
	people_outseason = discount_value / nights_high;
	nights_for2 = people_outseason / 2;

	document.getElementById("people_outseason").innerHTML = round_number(people_outseason,1);
	document.getElementById("nights_for2").innerHTML = round_number(nights_for2,1);
}

function clearText2()
{
	document.getElementById("nights_low").value = "550";
	document.getElementById("nights_high").value = "1000";
	document.getElementById("discount_value").value = "2300";
	validate2();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

function validate3()
{
	var nights_high = document.getElementById("nights_high").value;
	var nights_low = document.getElementById("nights_low").value;
	var days_high = document.getElementById("days_high").value;
	var nights_booked = document.getElementById("nights_booked").value;
	
	
	var err = "";
	
	if (nights_high.length == 0) 
       err = err + '\'High Season Rate\' input required \r\n';
	
	if (nights_low.length == 0) 
       err = err + '\'Low Season Rate\' input required \r\n';
	
	if (days_high.length == 0) 
       err = err + '\'High season days\' input required \r\n';
	
	if (nights_booked.length == 0) 
       err = err + '\'Nights booked in high season by HG members\' input required \r\n';
		
	
	
	if (err.length > 0)
    {
       alert('Please correct the following before attempting a calculation\r\n' + err);
    }
	else
	{
		calculate3();
	}

}

function calculate3()
{
	var nights_low = document.getElementById("nights_low").value;
	var nights_high = document.getElementById("nights_high").value;
	var days_high = document.getElementById("days_high").value;
	var nights_booked = document.getElementById("nights_booked").value;

	var discount = 0.15;
	
	days_low = 365 - days_high;
	discount_value = discount * nights_high * nights_booked;
	nights_outseason = discount_value / nights_low;
	nights_lme = discount_value / (nights_low / 2);
	outseason_availability = nights_outseason / days_low * 100;
	lme_availability = nights_lme / days_low * 100;
	
	document.getElementById("days_low").innerHTML = days_low;
	document.getElementById("discount_value").innerHTML = "R" + round_number(discount_value,2);
	document.getElementById("nights_outseason").innerHTML = round_number(nights_outseason,1);
	document.getElementById("nights_lme").innerHTML = round_number(nights_lme,1);
	document.getElementById("outseason_availability").innerHTML = round_number(outseason_availability,2);
	document.getElementById("lme_availability").innerHTML = round_number(lme_availability,2);

}

function clearText3()
{
	document.getElementById("nights_low").value = "550";
	document.getElementById("nights_high").value = "1000";
	document.getElementById("days_low").innerHTML = "28";
	document.getElementById("nights_booked").value = "8";
	validate3();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////