//parkDates[regionid|parkid][array of opening and closing dates][(optional) json object of extra breaks eg festive, 2 nights etc...]
var parkDates = new Array();
//cornwall
parkDates["4|0"] = [[["2012-02-10", "2012-02-20"], ["2012-03-19", "2012-12-10"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-29", "2011-12-30"]}
    ],true];
//newquay
parkDates["4|12"] = [[["2012-03-19", "2012-11-05"]],
    [],true];
//holywell 
parkDates["4|10"] = [[["2012-03-23", "2012-11-05"]],
    [],false];
//crantock
parkDates["4|11"] = [[["2012-03-23", "2012-11-26"]],
    [],true];
//stminver
parkDates["4|9"]  = [[["2012-03-19", "2012-11-26"]],
    [],true];
//wa
parkDates["4|2"]  = [[["2012-03-16", "2012-12-10"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-29"]}
    ],true]; 
//sa
parkDates["4|3"]  = [[["2012-03-30", "2012-11-05"]],
    [],true];
//mullion
parkDates["4|936"]= [[["2012-03-26", "2012-11-05"]],
    [],true];
//looe
parkDates["4|937"]= [[["2012-02-10", "2012-02-20"], ["2012-03-19", "2012-11-05"]],
    [{ "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-30"]}
    ],true]; 
//devon
parkDates["5|0"] = [[["2012-03-16", "2013-01-14"]],
    [{ "name": "Christmas (4 nights)", "nights": "4", "depart": ["2011-12-23"] },
     { "name": "Twixmas (3 nights)", "nights": "3", "depart": ["2011-12-27"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-30"]}
    ],true];
//ruda
parkDates["5|1"] = [[["2012-03-16", "2012-12-21"], ["2013-01-04", "2013-01-25"]],
    [{ "name": "Christmas (4 nights)", "nights": "4", "depart": ["2012-12-23"] },
     { "name": "Twixmas (3 nights)", "nights": "3", "depart": ["2012-12-27"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2012-12-30"]}
    ],false];
//torquay
parkDates["5|16"] = [[["2012-03-16", "2012-11-12"]],
    [],false];
//challa
parkDates["5|13"] = [[["2012-03-19", "2012-11-05"]],
    [],true]; 
//dorset
parkDates["6|0"] = [[["2012-02-10", "2012-02-20"], ["2012-03-02", "2012-11-26"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-29"]}
    ],true];
//westbay
parkDates["6|5"]  = [[["2012-03-16", "2012-11-12"]],
    [],true];
//warmwell
parkDates["6|17"] = [[["2012-02-10", "2012-02-20"], ["2012-03-02", "2012-11-26"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-29"]}
    ],true];
//sandford
parkDates["6|938"] = [[["2012-02-10", "2012-02-20"], ["2012-03-02", "2012-11-26"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-29"]}
    ],true]; 
//norfolk
parkDates["12|0"] = [[["2012-03-19", "2012-11-05"]],
    []];
//cherrytree
parkDates["12|18"] = [[["2012-03-19", "2012-11-05"]],
    [],true]; 
//hampshire
parkDates["14|0"] = [[["2012-03-19", "2012-11-19"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-28"]}
    ],true];
//hayling
parkDates["14|939"] = [[["2012-03-19", "2012-11-19"]],
    [{ "name": "Christmas (5 nights)", "nights": "5", "depart": ["2011-12-23"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-28"]}
    ],true]; 
//scotland
parkDates["1|0"] = [[["2012-03-23", "2013-01-13"]],
    [{ "name": "Christmas (4 nights)", "nights": "4", "depart": ["2011-12-23"] },
     { "name": "Twixmas (3 nights)", "nights": "3", "depart": ["2011-12-27"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-30"]}
    ],true];
//tummel
parkDates["1|6"] = [[["2012-03-23", "2013-01-13"]],
    [{ "name": "Christmas (4 nights)", "nights": "4", "depart": ["2011-12-23"] },
     { "name": "Twixmas (3 nights)", "nights": "3", "depart": ["2011-12-27"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-30"] }
    ],true];
//sundrum
parkDates["1|7"] = [[["2012-03-23", "2012-11-03"]],
    [],true];
//nairn
parkDates["1|4"] = [[["2012-03-23", "2012-11-03"]],
    [],true];
//grannies
parkDates["1|14"] = [[["2012-03-23", "2012-11-03"]],
    [],true];
//southerness
parkDates["1|15"] = [[["2012-03-23", "2012-11-03"]],
    [],true];
//wemyss
parkDates["1|19"] = [[["2012-03-23", "2012-11-05"]],
    [],true]; 
//wales
parkDates["2|0"] = [[["2012-02-10", "2012-02-20"], ["2012-03-05", "2012-11-30"]],
    [{ "name": "Christmas (4 nights)", "nights": "4", "depart": ["2011-12-23"] },
     { "name": "Twixmas (2 nights)", "nights": "2", "depart": ["2011-12-27"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-30"]}
    ],true];
//trecco
parkDates["2|8"] = [[["2012-02-10", "2012-02-20"], ["2012-03-05", "2012-11-30"]],
    [{ "name": "Christmas (4 nights)", "nights": "4", "depart": ["2011-12-23"] },
     { "name": "Twixmas (2 nights)", "nights": "2", "depart": ["2011-12-27"] },
     { "name": "New Year (4 nights)", "nights": "4", "depart": ["2011-12-29"]}
    ],true];
//pendine
parkDates["2|20"] = [[["2012-03-19", "2012-11-09"]],
    [],true];

var departureDays = [
    { "dayOfWeek": 1, "nights": [4, 7, 14] },
    { "dayOfWeek": 5, "nights": [3, 7, 14] },
    { "dayOfWeek": 6, "nights": [7, 14] }
];

var departureDates = [];
var departureMonths = [];

$(function () {
    //prepopulate search panels
    $(".ddlPark").each(function () {
        if ($(this).val() != "") {
            populateMonthOfArrival($(this).parents("form"), "");
        }
    });

    $(".ddlMonth, .ddlNights, .ddlDate").val("");

    $(".ddlPark").change(function () {//populate month with available month for that park
        var form = $(this).parents("form");
        var currentlySelectedMonth = form.find("select.ddlMonth").val();
        var currentlySelectedDate = form.find("select.ddlDate").val();
        var park = form.find(".ddlPark").val();

        form.find("select.ddlMonth osption:gt(0)").remove();

        if (!parkDates[park][2]) {//pets available
            form.find("input#pet").attr("checked", "").attr("disabled", "disabled").siblings("label").text("Sorry, " + $.trim(form.find(".ddlPark option:selected").text()) + " is a non-pet park");
            //Cufon.refresh();
        }
        else {
            form.find("input#pet").attr("disabled", "").siblings("label").text("I'd like to take my pet");
            //Cufon.refresh();
        }

        if (park != "") {//can only calculate dates if park has been selected
            //next step is to populate the month drop down
            populateMonthOfArrival(form, currentlySelectedMonth);
        }
    });

    $(".ddlMonth").change(function () {
        var form = $(this).parents("form");
        populateNights(form);
    });

    $(".ddlNights").change(function () {
        var form = $(this).parents("form");
        populateDates(form);
    });

    $("form.val_bookingForm select").change(function () {
        var form = $(this).parents("form");
        var index = form.find("select").index(this);

        if ($(this).val() == "") {
            form.find("select:gt(" + index + ")").val("").attr("disabled", "disabled");
        }
        else {
            form.find("select:gt(" + index + "):first").removeAttr("disabled");
        }
    });
});

function populateMonthOfArrival(form, selectedMonth) {
    if (form.find(".ddlPark").val() != "") {
        var previousMonth = "";
        var currentMonth = "";

        form.find("select.ddlMonth option:gt(0)").remove();


        //buildDepartureMonths(form);
        buildDepartureDates(form);
        //need to sort departure dates so that months are displayed in correct order
        departureDates.sort(function (a, b) {
            return (a[0] - b[0]);
        });

        for (x in departureDates) {
            //work out the month of the departure date
            currentMonth = departureDates[x][1];
            if (previousMonth != currentMonth) {//check if month has changed from last iteration
                form.find("select.ddlMonth").append("<option>" + currentMonth + "</option>");
                previousMonth = currentMonth;
            }
        }
        departureDates.length = 0;//empty this array here to make more efficient

        //attempt to maintain currently selected month
        form.find("select.ddlMonth").attr("disabled", "").val(selectedMonth);

        populateNights(form);
    }
}

function populateNights(form) {
    if (form.find("select.ddlMonth").val() != "" && form.find(".ddlPark").val() != "") {
        //get month and park
        //populate nights ddl based on which breaks are available for selected month & park
        var park = form.find(".ddlPark").val();
        //get selected month
        //loop through departureDates until we find the month that has been selected
        var selectedMonth = form.find(".ddlMonth").val();
        var selectedNights = form.find(".ddlNights").val();
        var breakOnChange = false;

        //form.find(".ddlNights option.nightOption").hide();
        form.find("select.ddlNights option:gt(0)").remove();

        buildDepartureDates(form);

        var departureNights = [];
        departureNights[3] = ["3 Nights (Fri-Mon)", false];
        departureNights[4] = ["4 Nights (Mon-Fri)", false];
        departureNights[7] = ["7 Nights", false];
        departureNights[14] = ["14 Nights", false];

        for (x in departureDates) {
            if (departureDates[x][1] == selectedMonth) {
                if (departureDates[x][2] == -1) {//then this is not a break
                    //check day of week against nights array
                    var numberOfNightOptions = 0;
                    for (j in departureDays) {
                        if (departureDates[x][0].getDay() == departureDays[j].dayOfWeek) {//checking to see if incremented date is a valid departure day
                            for (i in departureDays[j].nights) {//loop through all the nights for that departure date and show
                                departureNights[departureDays[j].nights[i]][1] = true;
                                numberOfNightOptions++;
                            }
                        }
                        if (numberOfNightOptions >= 4) {//if all nights options are visible then break
                            break;
                        }
                    }
                }
                else {//find the break and add to the end of the select
                    var b = parkDates[park][1][departureDates[x][2]];
                    form.find("select.ddlNights").append('<option class="breakOptionNights" value="' + b.nights + '">' + b.name + '</option>');
                }

                breakOnChange = true;
            }
            else if (breakOnChange) {
                break;
            }
        }

        //now we know which night options are available, we can put them into the select list
        departureNights.reverse();
        var j = 0;
        for (j = 0; j < departureNights.length; j++) {
            if (departureNights[j] != null && departureNights[j][1] == true) {
                form.find(".ddlNights option:first").after('<option value="' + ((departureNights.length - 1) - j) + '">' + departureNights[j][0] + '</option>');
            }
        }

        departureDates.length = 0;
        
        //disable if only one night available
        if (form.find("select.ddlNights option:visible:gt(0)").length == 1) {//if there is only one date, then disable it
            form.find("select.ddlNights option:visible:eq(1)").attr("selected", "selected");
            form.find("select.ddlNights").attr("disabled", "disabled");
        }
        else {
            form.find("select.ddlNights").attr("disabled", "");
        }

        form.find("select.ddlNights").val(selectedNights);

        populateDates(form);
    }
}

function populateDates(form) {
    var park = form.find(".ddlPark").val();
    var previousDate = form.find(".ddlDate").val();

    form.find("select.ddlDate option:gt(0)").remove();
    if (form.find("select.ddlMonth").val() != "" && form.find("select.ddlNights").val() != "" && form.find(".ddlPark").val() != "") {
        var nights = form.find("select.ddlNights").val()*1;
        var validDepartureDays = [];
        buildDepartureDates(form)
        for (x in departureDays){
            if($.inArray(nights, departureDays[x].nights)>-1){//valid departure date
                validDepartureDays.push(departureDays[x].dayOfWeek);
            }
        }

        if (form.find(".ddlNights option:selected").hasClass("breakOptionNights")) {//this is a break
            var breakName = form.find(".ddlNights option:selected").text();

            for (x in parkDates[park][1]) {
                var b = parkDates[park][1][x];

                if (b.name == breakName) {//this is the break that has been selected
                    for (j in b.depart) {
                        var d = newDate(b.depart[j]);
                        form.find("select.ddlDate").append("<option value=\"" + d.getDate() + " " + monthNames[d.getMonth()].substr(0, 3) + " " + d.getFullYear() + "\">" + dayName[d.getDay()] + ", " + d.getDate() + " " + monthNames[d.getMonth()] + "</option>");
                    }
                }
            }
        }
        else{
            for (x in departureDates) {
                if (form.find("select.ddlMonth").val() == departureDates[x][1]) {
                    var d = departureDates[x][0];
                    //need to make sure that the day is a valid day of departure, and is not a break
                    if ($.inArray(d.getDay(), validDepartureDays) > -1 && departureDates[x][2] == -1) {
                        form.find("select.ddlDate").append("<option value=\"" + d.getDate() + " " + monthNames[d.getMonth()].substr(0, 3) + " " + d.getFullYear() + "\">" + dayName[d.getDay()] + ", " + d.getDate() + " " + monthNames[d.getMonth()] + "</option>");
                    }
                }
            }
        }

        if (form.find("select.ddlDate option:gt(0)").length == 1) {//if there is only one date, then disable it
            form.find("select.ddlDate option:eq(1)").attr("selected", "selected");
            form.find("select.ddlDate").attr("disabled", "disabled");
        }
        else {
            form.find("select.ddlDate").val(previousDate).attr("disabled", "");
        }

        departureDates.length = 0;
    }
}

function buildDepartureDates(form) {
    var park = form.find(".ddlPark").val();
    var month = form.find(".ddlMonth").val();
    var increment = 1;
    var uniqueMonths = false;

    if (month == "") {//then we only need to find unique months
        increment = 28;
        uniqueMonths=true;
    }


    if (park != "") {//can only build if park has been selected
        var today = new Date();
        var tomorrow = new Date();
        tomorrow.setDate(today.getDate() + 1);

        var d = new Date();

        departureDates.length = 0; //reset departureDates array

        for (x in parkDates[park][0]) {
            var startDate = newDate(parkDates[park][0][x][0]);
            var endDate = newDate(parkDates[park][0][x][1]);
            startDate = (tomorrow > startDate ? tomorrow : startDate);
            var nights = (form.find(".ddlNights").val() == "" ? 3 : form.find(".ddlNights").val()) * 1;

            var incrementedDate = startDate;
            endDate.setDate(endDate.getDate() - nights);

            while (incrementedDate <= endDate) {
                pushDepartureDate(incrementedDate, form);
                incrementedDate.setDate(incrementedDate.getDate() + increment);
            }
        } //end of for loop for multiple opening dates per park

        //now get all breaks departure dates
        for (x in parkDates[park][1]) {
            for (i in parkDates[park][1][x].depart) {
                if (parkDates[park][1][x].depart[i] > startDate) {
                    pushDepartureDate(newDate(parkDates[park][1][x].depart[i]), form, x);
                }
            }
        }
    }
}

function pushDepartureDate(d, form, breakIndex) {
    breakIndex = breakIndex || -1;
    var selectedMonth = form.find(".ddlMonth").val();
    var dateMonth = monthNames[d.getMonth()].substr(0, 3) + " " + d.getFullYear();

    if(selectedMonth==""||selectedMonth==dateMonth){
        departureDates.push([new Date(d), dateMonth, breakIndex]);
    }
}

var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var dayName = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
