﻿//Toggles the click event for the calendar
function ToggleCalendar(control,iframe)
{
	var ifCalendar = document.getElementById(iframe);

	if (ifCalendar.style.display == 'none') 
		{
			ifCalendar.style.display = '';
		}
	else 
		{
			ifCalendar.style.display = 'none';
		}
}

//Rewrite the date for the iFrame
function pushDate(element) 
{
	//Check to see if it's on object or the name
	if (element.id == null)
	{
		element = document.getElementById(element);
	}
	
	if (element.id.indexOf('Arrival') > 0 || element.id.indexOf('StartDate') > 0 || element.id.indexOf('From') > 0)
	{
		//Grab the date from the Arrival textbox
		var arrv = element.value;
		var d = new Date(parseDateString(arrv));
		
		//Add three days to the current date
		d.setHours(72)
		
		//Format the date
		var curr_date = d.getDate();
		var curr_month = (d.getMonth() + 1);
		var curr_year = d.getFullYear();
		var myDate = (curr_month + "/" + curr_date + "/" + curr_year);

		//Grab IFrame Src
		var iFrameDepart = document.frames[1].location.href;
		//Parse the date out
		var PStart = (iFrameDepart.indexOf('&s=') + 3);

		var srcBasic = iFrameDepart.substring(0, PStart);
		
		document.frames[1].location.href = srcBasic + myDate;
		refreshCalendar(element,document.frames[0]);

	}
	else
	{
		refreshCalendar(element,document.frames[1]);
	}
}

function refreshCalendar(element,iFrame)
{
	
	if (element.id == null)
	{
		element = document.getElementById(element);
	}

	dt = parseDateString(element.value);

	//Format the date
	var curr_date = dt.getDate();
	var curr_month = (dt.getMonth() + 1);
	var curr_year = dt.getFullYear();
	var myDate = (curr_month + "/" + curr_date + "/" + curr_year);
	
	//Grab IFrame Src
	var iFrameHref = iFrame.location.href;
	//Parse the date out
	var PStart = (iFrameHref.indexOf('&s=') + 3);
	var srcBasic = iFrameHref.substring(0, PStart);
	
	iFrame.location.href = srcBasic + myDate;
}

function parseDateString(s) {
    for (var i = 0; i < dateParsePatterns.length; i++) {
        var re = dateParsePatterns[i].re;
        var handler = dateParsePatterns[i].handler;
        var bits = re.exec(s);
        if (bits) {
            return handler(bits);
        }
    }
    throw new Error("Invalid date string");
}


/* Array of objects, each has 're', a regular expression and 'handler', a 
   function for creating a date from something that matches the regular 
   expression. Handlers may throw errors if string is unparseable. 
*/
var dateParsePatterns = [
    // Today
    {   re: /^tod/i,
        handler: function() { 
            return new Date();
        } 
    },
    // Tomorrow
    {   re: /^tom/i,
        handler: function() {
            var d = new Date(); 
            d.setDate(d.getDate() + 1); 
            return d;
        }
    },
    // Yesterday
    {   re: /^yes/i,
        handler: function() {
            var d = new Date();
            d.setDate(d.getDate() - 1);
            return d;
        }
    },
    // 4th
    {   re: /^(\d{1,2})(st|nd|rd|th)?$/i, 
        handler: function(bits) {
            var d = new Date();
            d.setDate(parseInt(bits[1], 10));
            return d;
        }
    },
    // 4th Jan
    {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i, 
        handler: function(bits) {
            var d = new Date();
            d.setDate(parseInt(bits[1], 10));
            d.setMonth(parseMonth(bits[2]));
            return d;
        }
    },
    // 4th Jan 2003
    {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
        handler: function(bits) {
            var d = new Date();
            d.setDate(parseInt(bits[1], 10));
            d.setMonth(parseMonth(bits[2]));
            d.setYear(bits[3]);
            return d;
        }
    },
    // Jan 4th
    {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i, 
        handler: function(bits) {
            var d = new Date();
            d.setDate(parseInt(bits[2], 10));
            d.setMonth(parseMonth(bits[1]));
            return d;
        }
    },
    // Jan 4th 2003
    {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i,
        handler: function(bits) {
            var d = new Date();
            d.setDate(parseInt(bits[2], 10));
            d.setMonth(parseMonth(bits[1]));
            d.setYear(bits[3]);
            return d;
        }
    },
    // next Tuesday - this is suspect due to weird meaning of "next"
    {   re: /^next (\w+)$/i,
        handler: function(bits) {
            var d = new Date();
            var day = d.getDay();
            var newDay = parseWeekday(bits[1]);
            var addDays = newDay - day;
            if (newDay <= day) {
                addDays += 7;
            }
            d.setDate(d.getDate() + addDays);
            return d;
        }
    },
    // last Tuesday
    {   re: /^last (\w+)$/i,
        handler: function(bits) {
            throw new Error("Not yet implemented");
        }
    },
    // mm/dd/yyyy (American style)
    {   re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
        handler: function(bits) {
            var d = new Date();
            d.setYear(bits[3]);
            d.setDate(parseInt(bits[2], 10));
            d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
            return d;
        }
    },
    // yyyy-mm-dd (ISO style)
    {   re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
        handler: function(bits) {
            var d = new Date();
            d.setYear(parseInt(bits[1]));
            d.setDate(parseInt(bits[3], 10));
            d.setMonth(parseInt(bits[2], 10) - 1);
            return d;
        }
    },
];