function CalculateInStockShippingDate(){
	var month_names = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	var day_names = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
	var time_zones = new Array();
	time_zones["PST"] = -8;
	
	var now = new Date();
	
	var ship_date = calculate_ship_date(now);
	
	return formatDate(ship_date);
	
	
	function calculate_ship_date(date){
		return calculate_shipping_date(date, 0);
	}
	
	function calculate_shipping_date(date, count) //count is the number of repetitions that this function goes through
	{
		if (!weekend(date) && !holiday(date) && (!after3(date) || count > 0)) {
			return date;
		}
		else {
			return calculate_shipping_date(addDays(date, 1), count + 1);
		}
	}
	
	function weekend(date){
		date = convertToTimeZone(date, time_zones["PST"]);
		var day = date.getDay();
		var day_name = day_names[day];
		if (day_name == "Sunday" || day_name == "Saturday") {
			return true;
		}
		return false;
	}
	
	function holiday(dateObj){
		dateObj = convertToTimeZone(dateObj, time_zones["PST"]);
		var month = dateObj.getMonth();
		var date = dateObj.getDate();
		var day = dateObj.getDay();
		var month_name = month_names[month];
		var day_name = day_names[day];
		var holidays = new Array();
		holidays[0] = (month_name == "January" && day_name == "Monday" && date > 14 && date < 22); //Martin Luther King day
		holidays[1] = (month_name == "February" && day == "Monday" && date > 14 && date < 22); //Presidents day
		holidays[2] = (month_name == "May" && day_name == "Monday" && date > 24); //Memorial Day
		holidays[3] = (month_name == "July" && date == 4); //Independence day
		holidays[4] = (month_name == "September" && day_name == "Monday" && del_date < 8); //Labor day
		holidays[5] = (month_name == "November" && date == 11); //Veteran's day
		holidays[6] = (month_name == "November" && day_name == "Thursday" && date > 21 && date < 29); //Thanksgiving (November, Thursday after 21st and before 29th
		holidays[7] = (month_name == "November" && day_name == "Friday" && date > 22 && date < 30); //Black Friday (November, Friday after 22 and before 30th)
		holidays[8] = (month_name == "December" && date == 24); //Christmas eve (December, 24th)
		holidays[9] = (month_name == "December" && date == 25); //Christmas day (december, 25th)
		holidays[10] = (month_name == "December" && date == 31);
		holidays[11] = (month_name == "January" && date == 1);
		for (var i = 0; i < holidays.length; i++) {
			if (holidays[i]) {
				return true;
			}
		}
	}
	
	function after3(date){
		date = convertToTimeZone(date, time_zones["PST"]);
		var hours = date.getHours();
		if (hours >= 15) {
			return true;
		}
		else {
			return false;
		}
	}
	
	function addDays(date, days){
		var millisecond = 1;
		var second = 1000 * millisecond;
		var minute = 60 * second;
		var hour = 60 * minute;
		var day = hour * 24;
		var time = date.getTime();
		var new_date = new Date(time + day * days);
		return new_date;
	}
	
	function addHours(date, hours){
		var millisecond = 1;
		var second = 1000 * millisecond;
		var minute = 60 * second;
		var hour = 60 * minute;
		var time = date.getTime();
		var new_date = new Date(time + hour * hours);
		return new_date;
	}
	
	function getSuffix(date_num){
		var date_str = date_num.toString();
		var last_char = date_str[date_str.length - 1];
		var first_char = date_str[date_str.length - 2];
		
		var suffix;
		if (first_char!=1) //exclude 11, 12, 13
		{
		switch (last_char) {
			case "1":
				suffix = "st";
				break;
			case "2":
				suffix = "nd";
				break;
			case "3":
				suffix = "rd";
				break;
			default:
				suffix = "th";
		}
		}
		else 
			suffix = "th";
		return suffix;
	}
	
	function formatDate(date){
		var month = date.getMonth();
		var date_num = date.getDate();
		var today_date = new Date();
		var today = today_date.getDate();
		var tomorrow = addDays(today_date,1).getDate();
		if (date_num == today)
		{
			return "Today";
		}
		else if (date_num == tomorrow)
		{
			return "Tomorrow";
		}
		return month_names[month].substring(0,3) + " " + date_num + getSuffix(date_num);
	}
	
	function convertToTimeZone(dateObj, timeZone){
		var month = dateObj.getMonth();
		var date = dateObj.getDate();
		var day = dateObj.getDay();
		var day_name = day_names[day];
		
		var TimeZone = timeZone;
		if(month > 2 && month < 10) // After March and before November
		{
			TimeZone = TimeZone + 1; //daylight savings
		}
		else if(month == 2)
		{
			var lastsunday = date - day;
			if(lastsunday >= 8)
			{
				TimeZone  = TimeZone + 1; // daylight savings
			}
		}
		else if (month == 10)
		{
			var lastsunday = date - day;
			if(lastsunday < 6)
			{
				TimeZone  = TimeZone + 1; // daylight savings
			}
		}
		
		var gmtHours = -dateObj.getTimezoneOffset() / 60;
		var gmtDate = addHours(dateObj, -gmtHours);
		return addHours(gmtDate, TimeZone);
	}
	
}
