function isEmailAddress(elem) {

  var str = elem.value;
	var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	
	if(!str.match(re)) {
	  alert("Please enter a valid email address so we'll be able to write back.");
		return false;
	}
	
	return true;
}

function isNotEmpty(elem) {

  var str = elem.value;
	var re = /.+/;

	if(!str.match(re)) {
	  //alert("Please fill in the required field");
		return false;
	}

	return true;
}	

function isNumber(elem) {

  var str = elem.value;
	var re = /^[0-9]+$/;
	
	return str.match(re);
}

function isZIP(elem) {

  var str = elem.value;
	var re = /^[0-9]{5}$/;
	
	return str.match(re);
}

function checkEmpty(elem) {

  if(elem.value == '') {
	  elem.value = 0;
	}
	
	return true;
}

function isValidDate(elem) {
  var str = elem.value;
	var re = /^(0?[1-9]|1[0-2])[\\\/\-](0?[1-9]|[1-2][0-9]|3[0-1])[\\\/\-](20)?([0-9]{2})$/;

  var d = str.match(re);
	
	if(d == null) {
	  return false;
	}
	
	var currentDate = new Date();
	
  // make sure valid month
	if(d[1]<1 || d[1]>12) {
	  return false;
	}
	
	// make sure valid day
	var vDate = new Date(2000+parseInt(d[4]),d[1],1);
	vDate.setHours(vDate.getHours()-3);
	if(d[2]<1 || d[2]>vDate.getDate()) {
	  return false;
	}
	
	// check year >= current Year
	if(2000+parseInt(d[4]) < currentDate.getFullYear()) {
	  return false;
	}
	
	// if current year check month
	if(2000+parseInt(d[4]) == currentDate.getFullYear()) {
	  if(d[1]-1 < currentDate.getMonth()) {
		  return false;
		}
		
		if(d[1]-1 == currentDate.getMonth() &&
		   parseInt(d[2]) < currentDate.getDate()) {
		  return false;
		}
	}

	elem.value = d[1]+'/'+d[2]+'/20'+d[4];
	return true;
}

function isPhoneNumber(elem) {

  var str = elem.value;
	var re = /[\(]?([0-9]{3})\)?[ \-]?([0-9]{3})[ \-]?([0-9]{4})$/;
	
	var phone = str.match(re);

	if(phone == null) {
	  return false;
	}
	
	elem.value = '('+phone[1]+')'+phone[2]+'-'+phone[3];
	
	return true;
}

function verifyForm() {
  var formOK = true;

	// Check Name and Email address
  if(!isNotEmpty(document.getElementById('fname'))) {
	  formOK = false;
		document.getElementById('fnamelabel').style.color = '#c33';
	} else {
		document.getElementById('fnamelabel').style.color = '#000';
	}
	if(!(isNotEmpty(document.getElementById('email')) 
	     && isEmailAddress(document.getElementById('email')))) {
    formOK = false;
		document.getElementById('emaillabel').style.color = '#c33';
	} else {
		document.getElementById('emaillabel').style.color = '#000';
	}
	
	// if reservation then check other fields
	if(document.getElementById('topic').value == 'reservation') {
	
	  // verify a type has been selected
		if(!(document.getElementById('rtyperv').checked ||
		     document.getElementById('rtypetent').checked ||
				 document.getElementById('rtypecabin').checked)) {
		  formOK = false;
			document.getElementById('rtypelabel').style.color = '#c33';
		} else {
			document.getElementById('rtypelabel').style.color = '#000';
		}
		
		// verify arrival date
		if(!(isNotEmpty(document.getElementById('arrival')) &&
		     isValidDate(document.getElementById('arrival')))) {
		  formOK = false;
			document.getElementById('arrivallabel').style.color = '#c33';
			document.getElementById('arrival').value = 'mm/dd/yyyy';
		} else {
			document.getElementById('arrivallabel').style.color = '#000';
		}

		// verify nights
		if(!(isNotEmpty(document.getElementById('nights')) &&
		     isNumber(document.getElementById('nights')))) {
		  formOK = false;
			document.getElementById('nightslabel').style.color = '#c33';
		} else {
			document.getElementById('nightslabel').style.color = '#000';
		}

		// verify adults/kids
		if(!(checkEmpty(document.getElementById('adults')) &&
		     isNumber(document.getElementById('adults')) &&
				 checkEmpty(document.getElementById('kids')) &&
				 isNumber(document.getElementById('kids')) &&
				 document.getElementById('adults').value-0 > 0)) {
		  formOK = false;
			document.getElementById('guestslabel').style.color = '#c33';
		} else {
			document.getElementById('guestslabel').style.color = '#000';
		}
		
		// verify address
		if(!(isNotEmpty(document.getElementById('address')) &&
		     isNotEmpty(document.getElementById('city')) &&
				 isZIP(document.getElementById('zip')))) {
		  formOK = false;
			document.getElementById('addresslabel').style.color = '#c33';
		} else {
			document.getElementById('addresslabel').style.color = '#000';
		}
		
		// verify phone
		if(!isPhoneNumber(document.getElementById('phone'))) {
		  formOK = false;
			document.getElementById('phonelabel').style.color = '#c33';
		} else {
			document.getElementById('phonelabel').style.color = '#000';
		}

		document.getElementById('mlabel').style.color = '#000';
		
	} else {
	  // verify there is a message body
		if(!isNotEmpty(document.getElementById('mbody'))) {
		  formOK = false;
			document.getElementById('mlabel').style.color = '#c33';
		} else {
			document.getElementById('mlabel').style.color = '#000';
		}
	}
	
	if(!formOK) {
	  alert("There are errors in the form.  Please correct them and try again.");
		return false;
	}
	
	return true;

}

function toggleMessageType() {
  
	if(document.getElementById('tquestion').selected) {
	  document.getElementById('mlabel').innerHTML = "Your Question";
	  document.getElementById('submitbutton').innerHTML = "Send Question";
	}

	if(document.getElementById('treservation').selected) {
	  document.getElementById('mlabel').innerHTML = "Additional Info";
	  document.getElementById('submitbutton').innerHTML = "Make Request";
		document.getElementById('restype').style.display = '';
	  document.getElementById('rtyperv').checked = false;
	  document.getElementById('rtypetent').checked = false;
	  document.getElementById('rtypecabin').checked = false;
	  document.getElementById('styperv').style.display = 'none';
	  document.getElementById('stypetent').style.display = 'none';
	  document.getElementById('stypecabin').style.display = 'none';
	  document.getElementById('rarrival').style.display = '';
	  document.getElementById('rlength').style.display = '';
	  document.getElementById('rpeople').style.display = '';
	  document.getElementById('raddress').style.display = '';
	  document.getElementById('rphone').style.display = '';

	} else {
		document.getElementById('restype').style.display = 'none';
	  document.getElementById('rtyperv').checked = false;
	  document.getElementById('rtypetent').checked = false;
	  document.getElementById('rtypecabin').checked = false;
	  document.getElementById('styperv').style.display = 'none';
	  document.getElementById('stypetent').style.display = 'none';
	  document.getElementById('stypecabin').style.display = 'none';
	  document.getElementById('rarrival').style.display = 'none';
	  document.getElementById('rlength').style.display = 'none';
	  document.getElementById('rpeople').style.display = 'none';
	  document.getElementById('raddress').style.display = 'none';
	  document.getElementById('rphone').style.display = 'none';
	
	}

  if(document.getElementById('tcomment').selected) {
	  document.getElementById('mlabel').innerHTML = "Your Comment";	
	  document.getElementById('submitbutton').innerHTML = "Send Comment";
	}

}

function toggleResType(evt) {
  evt = (evt) ? evt : event;
	var target = (evt.target) ? evt.target : evt.srcElement;

	if(target.id == 'rtyperv') {
	  document.getElementById('styperv').style.display = '';
	  document.getElementById('stypetent').style.display = 'none';
	  document.getElementById('stypecabin').style.display = 'none';
		return;
	}

	if(target.id == 'rtypetent') {
	  document.getElementById('styperv').style.display = 'none';
	  document.getElementById('stypetent').style.display = '';
	  document.getElementById('stypecabin').style.display = 'none';
		return;
	}

	if(target.id == 'rtypecabin') {
	  document.getElementById('styperv').style.display = 'none';
	  document.getElementById('stypetent').style.display = 'none';
	  document.getElementById('stypecabin').style.display = '';
		return;
	}
}

/////////////////////////////////////////////////////
// Calendar picker script from Javascript Cookbook //
/////////////////////////////////////////////////////

/*******************
 Utility Functions
********************/
// day of week of month's first day
function getFirstDay(theYear, theMonth){
   var firstDate = new Date(theYear,theMonth,1);
   return firstDate.getDay( );
}

// number of days in the month
function getMonthLen(theYear, theMonth) {
   var nextMonth = new Date(theYear, theMonth + 1, 1);
   nextMonth.setHours(nextMonth.getHours( ) - 3);
   return nextMonth.getDate( );
}

// read position of an element in regular document flow
function getElementPosition(elemID) {
   var offsetTrail = document.getElementById(elemID);
   var offsetLeft = 0;
   var offsetTop = 0;
   while (offsetTrail) {
       offsetLeft += offsetTrail.offsetLeft;
       offsetTop += offsetTrail.offsetTop;
       offsetTrail = offsetTrail.offsetParent;
   }
   if (navigator.userAgent.indexOf("Mac") != -1 &&
       typeof document.body.leftMargin != "undefined") {
       offsetLeft += document.body.leftMargin;
       offsetTop += document.body.topMargin;
   }
   return {left:offsetLeft, top:offsetTop};
}

// position and show calendar
function showCalendar(evt) {
   evt = (evt) ? evt : event;
   if (evt) {
       if (document.getElementById("calendar").style.visibility != "visible") {
           var elem = (evt.target) ? evt.target : evt.srcElement;
           var position = getElementPosition(elem.id);
           shiftTo("calendar", position.left + elem.offsetWidth, position.top-50);
					 //setZIndex("calendar",1);
					 populateTable('curr');
					 //document.getElementById("calendar").style.display = "block";
           show("calendar");
       } else {
			     //document.getElementById("calendar").style.display = "none";
           hide("calendar");
       }
   }
}

/************************
 Draw Calendar Contents
*************************/
// clear and re-populate table based on form's selections
function populateTable(whichMonth) {

  // pick up date form choices
  var theMonth = parseInt(document.getElementById('calMonth').value);
  var theYear = parseInt(document.getElementById('calYear').value);

  // change month as needed
	switch(whichMonth) {
	  case 'prev':
		  theMonth-=1;
			if(theMonth<0) {
			  theMonth=11;
				theYear-=1;
			}
			break;
		case 'curr':
		  var d = new Date();
			theMonth = parseInt(d.getMonth());
			theYear = parseInt(d.getFullYear());
			break;
		case 'next':
		  theMonth+=1;
			if(theMonth>11) {
			  theMonth=0;
				theYear+=1;
			}
			break;
	}
	
	// update hidden fields
  document.getElementById('calMonth').value = theMonth;
  document.getElementById('calYear').value = theYear;
	
  // initialize date-dependent variables
  var firstDay = getFirstDay(theYear, theMonth);
  var howMany = getMonthLen(theYear, theMonth);
  var today = new Date( );

  // fill in month/year in table header
	var monthStr;
	switch(theMonth) {
	  case 0: monthStr='January'; break;
	  case 1: monthStr='February'; break;
	  case 2: monthStr='March'; break;
	  case 3: monthStr='April'; break;
	  case 4: monthStr='May'; break;
	  case 5: monthStr='June'; break;
	  case 6: monthStr='July'; break;
	  case 7: monthStr='August'; break;
	  case 8: monthStr='September'; break;
	  case 9: monthStr='October'; break;
	  case 10: monthStr='November'; break;
	  case 11: monthStr='December'; break;
		default: monthStr='Error';
	}
  document.getElementById("tableHeader").innerHTML =
    monthStr + " " + theYear;

  // initialize vars for table creation
  var dayCounter = 1;
  var TBody = document.getElementById("tableBody");
  // clear any existing rows
  while (TBody.rows.length > 0) {
    TBody.deleteRow(0);
  }
  var newR, newC, dateNum, dayClass, dayHref;
  var done=false;
  while (!done) {
    // create new row at end
    newR = TBody.insertRow(TBody.rows.length);
    if (newR) {
      for (var i = 0; i < 7; i++) {
        // create new cell at end of row
        newC = newR.insertCell(newR.cells.length);
        if (TBody.rows.length == 1 && i < firstDay) {
          // empty boxes before first day
          newC.innerHTML = '<a class="disabled">&nbsp;</a>';
          continue;
        }
        if (dayCounter == howMany) {
          // no more rows after this one
          done = true;
        }
        // plug in link/date (or empty for boxes after last day)
        if (dayCounter <= howMany) {
          if (today.getFullYear() == theYear &&
              today.getMonth() == theMonth &&
              today.getDate() == dayCounter) {
            dayClass = 'class="today" ';
					  dayHref = 'href="#" ';
          } else if (today.getFullYear() > theYear ||
					           (today.getFullYear() == theYear &&
                      (today.getMonth() > theMonth ||
                       (today.getMonth() == theMonth &&
											  today.getDate() > dayCounter)))) {
            dayClass = 'class="disabled" ';
						dayHref = '';
          } else {
					  dayClass = "";
						dayHref = 'href="#" ';
					}
          newC.innerHTML = '<a ' + dayHref + dayClass + 'onclick="chooseDate(' +
                           dayCounter + ',' + theMonth + ',' + theYear +
                           '); return false;">' + dayCounter + '</a>';
          dayCounter++;
        } else {
          newC.innerHTML = '<a class="disabled">&nbsp;</a>';
        }
      }
    } else {
      done = true;
    }
  }
}

/*******************
 Initializations
********************/
// create dynamic list of year choices
function fillYears( ) {
   var today = new Date( );
   var thisYear = today.getFullYear( );
   var yearChooser = document.dateChooser.chooseYear;
   for (i = thisYear; i < thisYear + 2; i++) {
       yearChooser.options[yearChooser.options.length] = new Option(i, i);
   }
   setCurrMonth(today);
}
// set month choice to current month
function setCurrMonth(today) {
   document.dateChooser.chooseMonth.selectedIndex = today.getMonth( );
}

/*******************
  Process Choice
********************/
function chooseDate(date, month, year) {
   document.messageForm.arrival.value = (month+1)+'/'+date+'/'+year;
   hide("calendar");
}



////////////////////////////////////////////
// DHTML Library from Javascript Cookbook //
////////////////////////////////////////////

// Global variables
var isCSS, isW3C, isIE4, isNN4, isIE6CSS;

// Initialize upon load to let all browsers establish content objects
function initDHTMLAPI( ) {
   if (document.images) {
       isCSS = (document.body && document.body.style) ? true : false;
       isW3C = (isCSS && document.getElementById) ? true : false;
       isIE4 = (isCSS && document.all) ? true : false;
       isNN4 = (document.layers) ? true : false;
       isIE6CSS = (document.compatMode &&
document.compatMode.indexOf("CSS1") >= 0) ?
           true : false;
   }
}

// Set event handler to initialize API
window.onload = initDHTMLAPI;

// Seek nested NN4 layer from string name
function seekLayer(doc, name) {
   var theObj;
   for (var i = 0; i < doc.layers.length; i++) {
       if (doc.layers[i].name == name) {
           theObj = doc.layers[i];
           break;
       }
       // dive into nested layers if necessary
       if (doc.layers[i].document.layers.length > 0) {
           theObj = seekLayer(document.layers[i].document, name);
       }
   }
   return theObj;
}

// Convert object name string or object reference
// into a valid element object reference
function getRawObject(obj) {
   var theObj;
   if (typeof obj == "string") {
       if (isW3C) {
           theObj = document.getElementById(obj);
       } else if (isIE4) {
           theObj = document.all(obj);
       } else if (isNN4) {
           theObj = seekLayer(document, obj);
       }
   } else {
       // pass through object reference
       theObj = obj;
   }
   return theObj;
}

// Convert object name string or object reference
// into a valid style (or NN4 layer) reference
function getObject(obj) {
   var theObj = getRawObject(obj);
   if (theObj && isCSS) {
       theObj = theObj.style;
   }
   return theObj;
}

// Position an object at a specific pixel coordinate
function shiftTo(obj, x, y) {
   var theObj = getObject(obj);
   if (theObj) {
       if (isCSS) {
           // equalize incorrect numeric value type
           var units = (typeof theObj.left == "string") ? "px" : 0;
           theObj.left = x + units;
           theObj.top = y + units;
       } else if (isNN4) {
           theObj.moveTo(x,y)
       }
   }
}

// Move an object by x and/or y pixels
function shiftBy(obj, deltaX, deltaY) {
   var theObj = getObject(obj);
   if (theObj) {
       if (isCSS) {
           // equalize incorrect numeric value type
           var units = (typeof theObj.left == "string") ? "px" : 0;
           theObj.left = getObjectLeft(obj) + deltaX + units;
           theObj.top = getObjectTop(obj) + deltaY + units;
       } else if (isNN4) {
           theObj.moveBy(deltaX, deltaY);
       }
   }
}

// Set the z-order of an object
function setZIndex(obj, zOrder) {
   var theObj = getObject(obj);
   if (theObj) {
       theObj.zIndex = zOrder;
   }
}

// Set the background color of an object
function setBGColor(obj, color) {
   var theObj = getObject(obj);
   if (theObj) {
       if (isNN4) {
           theObj.bgColor = color;
       } else if (isCSS) {
           theObj.backgroundColor = color;
       }
   }
}

// Set the visibility of an object to visible
function show(obj) {
   var theObj = getObject(obj);
   if (theObj) {
       theObj.visibility = "visible";
   }
}

// Set the visibility of an object to hidden
function hide(obj) {
   var theObj = getObject(obj);
   if (theObj) {
       theObj.visibility = "hidden";
   }
}

// Retrieve the x coordinate of a positionable object
function getObjectLeft(obj)  {
   var elem = getRawObject(obj);
   var result = 0;
   if (document.defaultView) {
       var style = document.defaultView;
       var cssDecl = style.getComputedStyle(elem, "");
       result = cssDecl.getPropertyValue("left");
   } else if (elem.currentStyle) {
       result = elem.currentStyle.left;
   } else if (elem.style) {
       result = elem.style.left;
   } else if (isNN4) {
       result = elem.left;
   }
   return parseInt(result);
}

// Retrieve the y coordinate of a positionable object
function getObjectTop(obj)  {
   var elem = getRawObject(obj);
   var result = 0;
   if (document.defaultView) {
       var style = document.defaultView;
       var cssDecl = style.getComputedStyle(elem, "");
       result = cssDecl.getPropertyValue("top");
   } else if (elem.currentStyle) {
       result = elem.currentStyle.top;
   } else if (elem.style) {
       result = elem.style.top;
   } else if (isNN4) {
       result = elem.top;
   }
   return parseInt(result);
}

// Retrieve the rendered width of an element
function getObjectWidth(obj)  {
   var elem = getRawObject(obj);
   var result = 0;
   if (elem.offsetWidth) {
       result = elem.offsetWidth;
   } else if (elem.clip && elem.clip.width) {
       result = elem.clip.width;
   } else if (elem.style && elem.style.pixelWidth) {
       result = elem.style.pixelWidth;
   }
   return parseInt(result);
}

// Retrieve the rendered height of an element
function getObjectHeight(obj)  {
   var elem = getRawObject(obj);
   var result = 0;
   if (elem.offsetHeight) {
       result = elem.offsetHeight;
   } else if (elem.clip && elem.clip.height) {
       result = elem.clip.height;
   } else if (elem.style && elem.style.pixelHeight) {
       result = elem.style.pixelHeight;
   }
   return parseInt(result);
}

// Return the available content width space in browser window
function getInsideWindowWidth( ) {
   if (window.innerWidth) {
       return window.innerWidth;
   } else if (isIE6CSS) {
       // measure the html element's clientWidth
       return document.body.parentElement.clientWidth;
   } else if (document.body && document.body.clientWidth) {
       return document.body.clientWidth;
   }
   return 0;
}

// Return the available content height space in browser window
function getInsideWindowHeight( ) {
   if (window.innerHeight) {
       return window.innerHeight;
   } else if (isIE6CSS) {
       // measure the html element's clientHeight
       return document.body.parentElement.clientHeight;
   } else if (document.body && document.body.clientHeight) {
       return document.body.clientHeight;
   }
   return 0;
}