var saturday_delivery = 1;			// 1 = allow saturday delivery, 0 = do not do allow next day deliver on a saturday
var days_to_deliver = 1;			// how many days does it take to deliver your order
var deltime = new Array(14,00);		// must order before 14:00 hours (2:00pm) weekdays

var holidays= new Array(
	"22/12/2011/p",
	"23/12/2011/p",
	"26/12/2011/b",   // christmas day holiday
	"27/12/2011/b",   // christmas day holiday
	"28/12/2011/p",
	"29/12/2011/p",
	"30/12/2011/p",
	"02/01/2012/b",
	"06/04/2012/b",
	"09/04/2012/b",
	"07/05/2012/b",
	"04/06/2012/b",
	"05/06/2012/b",
	"27/08/2012/b",
	"25/12/2012/b",
	"26/12/2012/b"
);

var shortmontharray = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
var montharray = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var shortdayarray = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
var dayarray = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

var current_date;
var order_date;
var post_date;
var curr_ekm_date;

var days_closed=0;

var post_date_short = "";
var post_date_long = "";
var post_date_smart_short = "";
var post_date_smart_long = "";

var deliver_date_short = "";
var deliver_date_long = "";
var deliver_time = "";

var next_del_day = "";

var next_working_day_holiday = "";

function GetDayTh( day )
{
	var text="";
	
	switch(day) {
		case 1: 
		case 21: 
		case 31: 
			text = "st"; break;
		case 2: 
		case 22: 
			text = "nd"; break;
		case 3: 
		case 23: 
			text = "rd"; break;
		default: 
			text = "th"; break;
	}
	return day+text;
}

function MonthStringToNumber( month )
{
	for ( i=0; i<12; i++) {
		if(month == shortmontharray[i]) {
			return i+1;
		}
	}
	return -1;
}

function DayIsNonDeliveryDay ( date )
{
	var day = date.getDay();


	if(saturday_delivery) {
		return day==0;		// sunday delivery
	}
	else {
		if( day == 6 || day == 0 )	// if saturday (6) or sunday (0)
			return 1;
		else
			return 0;
	}
}

function DayIsWeekend( date )
{
	var day = date.getDay();
	if( day == 6 || day == 0 )	// if saturday (6) or sunday (0)
		return 1;
	else
		return 0;
}

function GetDeliveryDays( date )
{
	var day = date.getDay();

	if(saturday_delivery || day != 5) {	// friday(5)
		return days_to_deliver;
	}
	else {
		return days_to_deliver+2;
	}
}

function DayIsPublicHoliday( date )
{
	day = date.getDate();
	month = date.getMonth()+1;
	year = date.getFullYear();

	var datearray = new Array();

	for( i = 0; i < holidays.length; i++) {
		datearray = holidays[i].split('/');
		if( (day == datearray[0].valueOf()) && (month == datearray[1].valueOf()) && (year == datearray[2].valueOf()) && datearray[3]=='b' ) {
			return 1;
		}
	}
	return 0;
}


function DayIsPersonalHoliday( date )
{
	day = date.getDate();
	month = date.getMonth()+1;
	year = date.getFullYear();

	var datearray = new Array();

	for( i = 0; i < holidays.length; i++) {
		datearray = holidays[i].split('/');
		if( (day == datearray[0].valueOf()) && (month == datearray[1].valueOf()) && (year == datearray[2].valueOf()) && datearray[3]=='p' ) {
			return 1;
		}
	}
	return 0;
}


function DayIsHoliday( date )
{
	if(DayIsPublicHoliday(date)) {
		return 1;
	}

	return DayIsPersonalHoliday(date);
}

function PrintHolidays(all_years)
{
	var datearray = new Array();
	var holdatearray = new Array();
	datearray = curr_ekm_date.split('-');
	var hdate = new Date();
	var currdate = new Date(current_date);
    var curryear = 0;
	var printed_date = 0;

	document.write('<div>');
	for( i = 0; i < holidays.length; i++) {
		holdatearray = holidays[i].split('/');
		if( holdatearray[2].valueOf() == datearray[2].valueOf() || all_years ) {
			month = shortmontharray[(holdatearray[1] * 1)-1];
			hdate.setFullYear((holdatearray[2].valueOf()*1),(holdatearray[1].valueOf()*1)-1,(holdatearray[0].valueOf()*1));
			if(hdate >= currdate) { 
				if( (curryear != holdatearray[2].valueOf() && printed_date) || printed_date==0 ) {
					if(printed_date) {
						document.write('</table></div>');
					}
					document.write('<div style="border:1px solid #000; padding:4px; width:122px; float:left; margin-right:8px;"><table border="0" width="100" padding="4">');
					document.write('<tr><td colspan="4" align="center" bgcolor="#555555" style="color:#FFF"><b>'+holdatearray[2].valueOf()+'</td></tr>');
				}
				document.write('<tr><td>'+shortdayarray[hdate.getDay()]+'</td>');
				document.write('<td>'+holdatearray[0]+'</td><td>'+month+'</td><td>'+holdatearray[2]+'</td></tr>');
				curryear = holdatearray[2].valueOf();
				printed_date = 1;
			}
		}
	}
	
	document.write('</table></div>');
	document.write('</div><div style="clear:both"></div>');
	
}


function PrintHolidaysCurrYear()
{
	PrintHolidays(0);	// only print holidays for current year
}

function PrintHolidaysAllYear()
{
	PrintHolidays(1);	// only print holidays for all years
}


function DayIsAfterMaxTime ( curdate, deldate )
{
	return (curdate.getTime() > deldate.getTime());
}

function TestIfHoliday( )
{
	if(DayIsHoliday(current_date) || next_working_day_holiday!="") {
		return 1;
	}
	else {
		return 0;
	}
}

function GetDaysClosed()
{
	return days_closed;	
}

function InitDeliveryTimeAndDate( time, date )
{
	curr_ekm_date = date;

	var timearray = new Array();
	timearray = time.split(':');
	
	// remove the day (eg. Sunday, Monday) from EKM's date string
	datepos = date.search(/;/i);
	if(datepos==-1) {
		return;			// if we did not find day, exit as string format must have changed
	}
	date = date.substring(datepos+1);
	var datearray = new Array();
	datearray = date.split('-');

	// convert EKM date in to javascript date
	datearray[1]=MonthStringToNumber(datearray[1]);
	var ds = datearray[1]+'/'+datearray[0]+'/'+datearray[2];
	current_date = new Date(ds);
	
	// convert EKM time in to javascript time
	current_date.setHours( timearray[0].valueOf(), timearray[1].valueOf(), 0 );

	var timeok = 0;
	var daysadded = 0;
	order_date = new Date(current_date);
	order_date.setHours( deltime[0], deltime[1], 0 );
	
	// find first day that is not a weekend and isn't today after delivery time
	do {
		if(!DayIsWeekend(order_date) && !DayIsAfterMaxTime(current_date, order_date)) {
			timeok = 1;
		}
		else {
			order_date.setDate(order_date.getDate()+1);
			daysadded++;
			if(daysadded > 365) return;			// something went wrong, so exit
		}
	} while(timeok==0);
	
	if(DayIsHoliday(order_date)) {
		next_working_day_holiday = shortdayarray[order_date.getDay()]+' '+GetDayTh(order_date.getDate())+' '+shortmontharray[order_date.getMonth()];
	}
	else {
		next_working_day_holiday = "";
	}

	timeok = 0;
	do {
		if(!DayIsWeekend(order_date) && !DayIsHoliday(order_date) && !DayIsAfterMaxTime(current_date, order_date)) {
			timeok = 1;
		}
		else {
			order_date.setDate(order_date.getDate()+1);
			daysadded++;
			if(daysadded > 365) return;			// something went wrong, so exit
		}
	} while(timeok==0);

	days_closed = daysadded;

	// create our post dispatch dates
	post_date = order_date;
	post_date_smart_long = post_date_long = dayarray[order_date.getDay()]+' '+GetDayTh(order_date.getDate())+' '+montharray[order_date.getMonth()];
	post_date_smart_short = post_date_short = shortdayarray[order_date.getDay()]+' '+GetDayTh(order_date.getDate())+' '+shortmontharray[order_date.getMonth()];
	
	if(daysadded==0) {
		post_date_smart_long = post_date_smart_short = "Today";
	}
	else if(daysadded==1) {
		post_date_smart_long = post_date_smart_short = "Tomorrow";
	}

	// calculate the days, hours, minutes before we have to order
	var one_day=1000*60*60*24;
	var one_hour=1000*60*60;
	var one_minute=1000*60;

	days = Math.floor((order_date.getTime()-current_date.getTime())/one_day);
	hours = Math.floor((order_date.getTime()-current_date.getTime())/one_hour)%24;
	minutes = Math.floor((order_date.getTime()-current_date.getTime())/one_minute)%60;

	timeok = 0;
	daysadded = 0;
	deld = new Date(order_date);
	deld.setDate(order_date.getDate()+GetDeliveryDays(order_date));
	
	// when will item be delivered
	do {
		if(!DayIsNonDeliveryDay(deld) && !DayIsPublicHoliday(deld)) {
			timeok = 1;
		}
		else {
			deld.setDate(deld.getDate()+1);
			daysadded++;
			if(daysadded > 365) return;			// something went wrong, so exit
		}
	} while(timeok==0);

	deliver_date_short = shortdayarray[deld.getDay()]+' '+GetDayTh(deld.getDate())+' '+shortmontharray[deld.getMonth()];
	deliver_date_long = dayarray[deld.getDay()]+' '+GetDayTh(deld.getDate())+' '+montharray[deld.getMonth()];
	deliver_time = "";
	
	next_del_day = dayarray[deld.getDay()];

	if(days == 0 && hours == 0 && minutes == 0) {
		deliver_time = "1 minute ";
	}
	else {
		deliver_time = "";
		if(days > 1) 
			deliver_time += days+' days, ';
		else if (days > 0)
			deliver_time += days+' day, ';
		
		if(hours > 1) 
			deliver_time += hours+' hours, ';
		else if(hours > 0)
			deliver_time += hours+' hour, ';
		
		if(minutes > 1 )
			deliver_time += minutes+' minutes ';
		else if(minutes > 0 )
			deliver_time += minutes+' minute ';
	}
}

function ShowDeliveyDate ( msg )
{
	var long_date = 0;
	
	idx = msg.indexOf("[date]");

	if(idx == -1) {
		idx = msg.indexOf("[date-long]");
		long_date = 1;
	}
	
	if(idx!= -1) {
		msg_start = msg.slice(0,idx);
		if(long_date) {
			msg = msg.replace("[date-long]","");
			idx2 = msg.indexOf("[/date-long]");
		}
		else {
			msg = msg.replace("[date]","");
			idx2 = msg.indexOf("[/date]");
		}
		if(idx2 != -1) {
			if(long_date) {
				msg = msg.replace("[/date-long]","");
			}
			else {
				msg = msg.replace("[/date]","");
			}
			msg_end = msg.slice(idx2);
			days_buf_len = idx2-idx;
			days = parseInt(msg.substr(idx,days_buf_len));
			
			timeok = 0;
			daysadded = 0;
			deld = new Date(post_date);
			
			working_days_to_add = days.valueOf(); 

			// when will item be delivered
			do {
				if(!DayIsNonDeliveryDay(deld) && !DayIsPublicHoliday(deld)) {
					if(working_days_to_add==0) {
						timeok = 1;
					}
					else {
						working_days_to_add--;
						deld.setDate(deld.getDate()+1);
					}
				}
				else {
					deld.setDate(deld.getDate()+1);
					daysadded++;
					if(daysadded > 365) return;			// something went wrong, so exit
				}
			} while(timeok==0);			
			
			if(long_date) {
				deliver_date = dayarray[deld.getDay()]+' '+GetDayTh(deld.getDate())+' '+montharray[deld.getMonth()];
			}
			else {
				deliver_date = shortdayarray[deld.getDay()]+' '+GetDayTh(deld.getDate())+' '+shortmontharray[deld.getMonth()];
			}
			
			return msg_start+deliver_date+msg_end;
		}
	}
	return "";
}

function GetDeliveyNextDayMonFri( )
{
	var msg = "";
	
	if (next_del_day == "Saturday") {
		msg = "[date-long]2[/date-long]";
	}
	else {
		msg = "[date-long]1[/date-long]";
	}
	return msg;
}

function GetDeliveyNextDaySaturday( )
{
	daysadded=0;
	timeok = 0;
	deld = new Date(post_date);
	deldfriday = new Date(post_date);

	// when will item be delivered
	do {
		if(!DayIsNonDeliveryDay(deld) && !DayIsHoliday(deld)) {
			if(shortdayarray[deld.getDay()]=="Sat") {
				deldfriday.setDate(deld.getDate()-1);
				if(!DayIsHoliday(deldfriday)) {
					timeok = 1;
				}
				else {
					deld.setDate(deld.getDate()+1);
				}
			}
			else {
				deld.setDate(deld.getDate()+1);
			}
		}
		else {
			deld.setDate(deld.getDate()+1);
		}
		daysadded++;
		if(daysadded > 365) return;			// something went wrong, so exit
	} while(timeok==0);			
	
	deliver_date = dayarray[deld.getDay()]+' '+GetDayTh(deld.getDate())+' '+montharray[deld.getMonth()];
			
	return deliver_date;
}

function ShowDeliveryMsg( msg )
{
	msg = msg.replace("[post-long-smart]",post_date_smart_long);	
	msg = msg.replace("[post-long]",post_date_long);	
	msg = msg.replace("[post-short-smart]",post_date_smart_short);	
	msg = msg.replace("[post-short]",post_date_short);	
	
	msg = msg.replace("[deliver-long]",deliver_date_long);
	msg = msg.replace("[deliver-short]",deliver_date_short);
	msg = msg.replace("[deliver-time]",deliver_time);

	msg = msg.replace("[open-long]",post_date_long);	
	msg = msg.replace("[open-short]",post_date_short);	

	if(msg.indexOf("[nextday-weekday]") != -1) {
		msg = msg.replace("[nextday-weekday]",GetDeliveyNextDayMonFri());
	}

	if(msg.indexOf("[nextday-saturday]") != -1) {
		msg = msg.replace("[nextday-saturday]",GetDeliveyNextDaySaturday());
	}

	do {
		new_msg = ShowDeliveyDate ( msg );
		if(new_msg != "") {
			msg = new_msg;
		}
	} while (new_msg!="");

	document.write(msg);
}
