window.onload = initAll;


/****** global vars ***********/

/******* formValidation global vars *********/
var formErrors = true;

/******** calendar gloabal vars ************/
var calendarXhr;

/********** page Preview global vars **********/
var xPos;
var yPos;
var xhr = false;

/******** projects global vars **********/

// to be used as toggle
var showPagePreview = false;


/*****************************/
  
  function initAll() {
  
  // for any forms
  initValidation();
  initPreviewPage();
  //initCalendar();
  initMiniCalendar();
  
  } 

  
/********** miniCalendar code *********/


/* Client-side access to querystring name=value pairs
	Version 1.3
	28 May 2008
	
	License (Simplified BSD):
	http://adamv.com/dev/javascript/qslicense.txt
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = {};
	
	if (qs == null) qs = location.search.substring(1, location.search.length);
	if (qs.length == 0) return;

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ');
	var args = qs.split('&'); // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i = 0; i < args.length; i++) {
		var pair = args[i].split('=');
		var name = decodeURIComponent(pair[0]);
		
		var value = (pair.length==2)
			? decodeURIComponent(pair[1])
			: name;
		
		this.params[name] = value;
	}
}

Querystring.prototype.get = function(key, default_) {
	var value = this.params[key];
	return (value != null) ? value : default_;
}

Querystring.prototype.contains = function(key) {
	var value = this.params[key];
	return (value != null);
}



function initMiniCalendar() {

  if (document.getElementById("miniCalendar-toggle")) {
  
      document.getElementById("miniCalendar-toggle").onclick = toggleMiniCalendar;
      document.getElementById("miniCalendar-toggle").onmouseover = function() { document.getElementById("miniCalendar-toggle").style.cursor = "pointer"; };
      document.getElementById("miniCalendar").style.display = "none";  
      
      // as using javascript we need to stop page refresh when given day is selected
      // and instead use the value to update the form
      
      var mini = document.getElementById("miniCalendar");
      var days = mini.getElementsByTagName("a");
      
      for (var x = 0; x < days.length; x++) {
      
      
          if (days[x].className == "days") {
          
              // stop page refresh and capture value
              days[x].onclick = parseURL;
          
          
          
          }
      
      
      
      }
      
  }
}

function parseURL() {


    var queryString = this.href;
    
    // find position of ? and add 1 to capture substring without it
    var shortString = queryString.substr(queryString.indexOf('?')+1);
    //document.getElementById("form-messages").innerHTML = shortString;
    //var shortString = shortString.substr(1);
  
    var qs = new Querystring(shortString);
    
    if (qs.contains("day")) {
    
      var day = qs.get("day");
      //document.getElementById("reservation-day").selectedIndex = day;
      var daySelect = document.reserve.day.options;
      var length = daySelect.length;
      
      for (var y = 0; y < length; y++ ) {
      
        if (daySelect[y].value == day) {
        
          document.reserve.day.selectedIndex = daySelect[y].index;
          
        }
      
      }
      
    }
    
    if (qs.contains("month")) {
    
      var month = qs.get("month");
      //document.getElementById("reservation-month").selectedIndex = month;
      var monthSelect = document.reserve.month.options;
      var monthLength = monthSelect.length;
      
      for (var y = 0; y < monthLength; y++ ) {
      
        if (monthSelect[y].value == month) {
        
          document.reserve.month.selectedIndex = monthSelect[y].index;
          
        }
      
      }
    }
    
    if (qs.contains("year")) {
    
      var year = qs.get("year");
      //document.getElementById("reservation-year").selectedIndex = year;
      var yearSelect = document.reserve.year.options;
      var yearLength = yearSelect.length;
      
      for (var y = 0; y < yearLength; y++ ) {
      
        if (yearSelect[y].value == year) {
          
          document.reserve.year.selectedIndex = yearSelect[y].index;
          
        }
      
      }
    }
    
    
    return false;



}

function toggleMiniCalendar() {

    if (document.getElementById("miniCalendar").style.display == "block") {
    
      document.getElementById("miniCalendar").style.display = "none";  
    
    } else {
    
    document.getElementById("miniCalendar").style.display = "block";
    
    }

}



/*************************************/

 
/*********** previewPage code ************/


 function initPreviewPage() {

  // using DOM to create DIV on page
  var previewDiv = document.createElement("div");
  previewDiv.id = "previewWin";
  var body = document.getElementsByTagName("body");
  body[0].appendChild(previewDiv);
  
  var allLinks = document.getElementsByTagName("a");
  
  for (var x = 0; x < allLinks.length; x++) {
  
    allLinks[x].onmouseover = showPreview;
  
  }
} // closing initPreviewPage

function setPagePreview() {

  // if already true, then assign to false, otherwise set to true
  if (showPagePreview == true) {
 
   showPagePreview = false;
   document.getElementById("page-preview-toggle").innerHTML = "page preview off";
   
   } else {
   
   showPagePreview = true;
    document.getElementById("page-preview-toggle").innerHTML = "page preview on";
   
   }

} // closing setPagePreview

function showPreview(evt) {

  if (showPagePreview == true) {

  getPreview(evt);
  
  }
  return false;


} // closing showPreview

function hidePreview() {

  document.getElementById("previewWin").style.visibility = "hidden";

} // close hidePreview

function getPreview(evt) {

  if (evt) {
  
    var url = evt.target;
  
  } else {
  
    evt = window.event;
    var url = evt.srcElement;
    
    }
    
    xPos = evt.clientX;
    yPos = evt.clientY;
    
    if (window.XMLHttpRequest) {
    
      xhr = new XMLHttpRequest();
    
     } else {
     
     if (window.ActiveXObject) {
     
      try {
      
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      
      
      } catch (e) {}
     
     }
    
     }
  
  
  if (xhr) {
  
      xhr.onreadystatechange = showContents;
      xhr.open("GET",url, true);
      xhr.send(null);
      
      } else {
      
      
      alert("Oops! We couldn't create an XMLHttpRequest object!");
      
      
      }
  
  
  
  } // closing getPreview
  
  
function showContents() {
 
  var prevWin = document.getElementById("previewWin");
  
  if (xhr.readyState == 4) {
  
    // here, we simply get the source code of the page and dump it into the div
    prevWin.innerHTML = (xhr.status == 200) ? xhr.responseText : "Oops! There was a problem fetching the preview page: " + xhr.status;
    prevWin.style.top = parseInt(yPos)+ 20 + "px";
    prevWin.style.left = parseInt(xPos)+ 20 + "px";
    prevWin.style.visibility = "visible";
    setOpacity(prevWin,0.8);
    //prevWin.style.opacity = 0.3;
    //prevWin.style.zoom = 0.5;
    prevWin.onmouseout = hidePreview;
  
  }
 
} // closing showContents


function setOpacity(elm,val) {
          if(window.attachEvent) {
               elm.style.zoom = 1;
               elm.style.filter = "alpha(opacity=" + parseFloat(val*100) + ")";
                return elm;
          }
          elm.style.opacity  = parseFloat(val); 
   return elm;
} // closing setOpacity

/****************************/


/****** form validation code ***********/




function initValidation() {


   
  if (document.getElementById("single-room-wrapper")) {
  
      document.getElementById("single-room-wrapper").style.display = "none";
  
  }
  
  if (document.getElementById("double-room-wrapper")) {
  
      document.getElementById("double-room-wrapper").style.display = "none";
  
  }
  
  if (document.getElementById("twin-room-wrapper")) {
  
      document.getElementById("twin-room-wrapper").style.display = "none";
  
  }
  
  if (document.getElementById("family-room-wrapper")) {
  
      document.getElementById("family-room-wrapper").style.display = "none";
  
  }
  
  if (document.getElementById("arrival-label-wrapper")) {
  
      document.getElementById("arrival-label-wrapper").style.display = "none";
  
  }
        
       
    //store forms in array
    var forms = document.getElementsByTagName("form");
    
   if (forms.length > 0) {
    
    // loop through each form
    for (var x=0; x < forms.length; x++) {
      
        // capture form elements
       // var elems = forms[x].getElementsByTagName("input");
       var elems = forms[x].elements;
       var addSubmit = false;

        // loop through each form input element and assign event listeners
        //for (var y=0; y < elems.length; y++) {
        for (var y=0; y < elems.length; y++) {
        
          // only assigning eventlisteners to fields marked as reqd
          if (elems[y].className == "reqd") {
                 
              //addEvent(elems[y],"blur",checkFieldEvent,true);
              //addEvent(elems[y],"change",checkFieldEvent,true);
              // make sure we add an onsubmit, here setting flag
              addSubmit = true;
          
          } // closing if
            
          if (elems[y].className == "email") {
            
              //addEvent(elems[y],"blur",checkEmailEvent,true);
              //addEvent(elems[y],"change",checkEmailEvent,true);
              // make sure we add an onsubmit, here setting flag
              addSubmit = true;
            
          } // closing if reqd
          
           
          
        } // closing element loop
        
        // if flag set to true, add onSubmit EventListener
        if (addSubmit == true) {
        
          // call function to add code in cross-browser way
          addOnsubmit(forms[x]);
        
            
            
            //addEvent(forms[x], "submit", checkForm, true);
        
        } // closing if
        
        
    } // closing form loop
    
    } 

} // closing init


function toggleHiddenField(id) {

  //document.write(id);

  if (document.getElementById(id)) {
  
    //document.write(id);
    if (document.getElementById(id).style.display == "none") {
  
      document.getElementById(id).style.display = "block";
      //document.getElementById(id).className = "hide-form-field";
      document.getElementById("arrival-label-wrapper").style.display = "block";
    
    } else {
    
      document.getElementById(id).style.display = "none";
    
    }
  
  } // closing if document.getElementById


} // closing toggle hidden field

// function handles calls from EventListeners
function checkFieldEvent(evt) {

  // if evt is false - ie browser, we use window.event.  If this returns something, we use it
  evt = (evt) ? evt : ((window.event) ? window.event : null);
  

  if (evt) {
      // here, we pass the correct object, so we don't need to double up on code
      var elem = (evt.target) ? evt.target : evt.srcElement;

  checkField(elem);

  }

} // closing function 

// function handles calls from EventListeners
function checkEmailEvent(evt) {

  // if evt is false - ie browser, we use window.event.  If this returns something, we use it
  evt = (evt) ? evt : ((window.event) ? window.event : null);
  

  if (evt) {
      // here, we pass the correct object, so we don't need to double up on code
      var elem = (evt.target) ? evt.target : evt.srcElement;

  // calling function now that performs any validation
  checkEmail(elem);

  }

} // closing function 



// due to IE not using W3C AddEventListener, we need to use window event object
function checkField(elem) {

 
  if (elem.value.replace(/\s/g, "") == "")  {
  
        // if error message already posted for this field, remove it...
        var old = "error" + elem.name;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
       
        }
  
        var message = document.createTextNode("Please complete " + elem.name + " field");
        var p = document.createElement("p");
        p.className = "error-message";
        p.id = "error" + elem.name;
        p.appendChild(message);
        document.getElementById("form-messages").appendChild(p);
       //document.getElementById("form-messages").innerHTML = 'please complete ' + elem.name + ' field';
       elem.value = "";
       // this line isn't working
       //elem.focus();
       
       return false;
        
  } else {
  
  // clear any error messages
  // document.getElementById("form-messages").innerHTML = '';
  var old = "error" + elem.name;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
          
        //formErrors = true;   
          return true;
       
        }
        
       
  
  }
  

} // closing function


function checkValidDate(day, month, year) {

    var currentTime = new Date();
    var currentTimestamp = currentTime.getTime();
    
    
    // set requested date...
    var requestedDate = new Date();
    requestedDate.setFullYear(year, month -1,day - 1);
    var requestedTimestamp = requestedDate.getTime();
    
    // due to problems with different timestamps running through identical functions

    
    if (requestedTimestamp > currentTimestamp) {
    
    return true;
    
    }

  return false; 

} // closing checkValidDate






function checkEmail(elem) {

  
  // keeping it simple, making sure there are chars before @ and between $ and . 
  //var reg = new RegExp("^[-/0-9a-zA-Z]+@[-0-9a-zA-Z]+[\.][-0-9a-zA-Z]+");
  var reg = new RegExp("^[-/0-9a-zA-Z_\.\-]+@[-0-9a-zA-Z_\.\-]+[\.][-0-9a-zA-Z_\.\-]+");
  if (reg.test(elem.value) == false) {
  
        // if error message already posted for this field, remove it...
        var old = "error" + elem.name;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
       
        }
  
  
        var message = document.createTextNode("Please correctly complete " + elem.name + " field");
        var p = document.createElement("p");
        p.className = "error-message";
        p.id = "error" + elem.name;
        p.appendChild(message);
        document.getElementById("form-messages").appendChild(p);
        
       // reset field value
       elem.value = "";
       // this line isn't working
       //elem.focus();
       
       return false;
        
  } else {
  
        // clear any error messages
        // document.getElementById("form-messages").innerHTML = '';
        var old = "error" + elem.name;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
          
       // formErrors = true;  
          return true;
       
        }
        
        
  }
  

} // closing function




function checkPhone(elem) {

  
  // keeping it simple, making sure there are only digits 
  var reg = new RegExp("^[0-9]+$");
  if (reg.test(elem.value) == false) {
  
        // if error message already posted for this field, remove it...
        var old = "error" + elem.name;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
       
        }
  
  
        var message = document.createTextNode("Please complete " + elem.name + " field");
        var p = document.createElement("p");
        p.className = "error-message";
        p.id = "error" + elem.name;
        p.appendChild(message);
        document.getElementById("form-messages").appendChild(p);
        
       // reset field value
       elem.value = "";
       // this line isn't working
       //elem.focus();
       
       return false;
        
  } else {
  
        // clear any error messages
        // document.getElementById("form-messages").innerHTML = '';
        var old = "error" + elem.name;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
          
       // formErrors = true;  
          return true;
       
        }
        
        
  }
  

} // closing function




function addFormError(id,messageIn) {

         // if error message already posted for this field, remove it...
        
        var message = document.createTextNode(messageIn);
        var p = document.createElement("p");
        p.className = "error-message";
        p.id = "error" + id;
        p.appendChild(message);
        document.getElementById("form-messages").appendChild(p);
        
        return true;
   

}

function clearAddFormError(id) {


        var old = "error" + id;
        if (document.getElementById(old)) {
          
          var oldElem = document.getElementById(old);
          var parent = document.getElementById(old).parentNode;
          parent.removeChild(oldElem);
       
        }



}






// due to IE not using W3C AddEventListener, we need to use window event object
function checkForm(form) {

    var errors = new Array();


    var elems = form.elements;
    
    
   
    
    
    
    
    
  
   // loop through each element
    for (var x = 0; x < elems.length; x++) {
        // if reqd, then call checkField
        if (elems[x].className == "reqd") {
            // if function returns false, then skip further checking and return false
            if (checkField(elems[x]) == false) {
            
                //return false;
                //formErrors = false;
                errors[x] = true;
            
            } // closing if
        
        } // closing if reqd
        
         if (elems[x].className == "phone") {
            // if function returns false, then skip further checking and return false
            if (checkPhone(elems[x]) == false) {
            
                //return false;
                //formErrors = false;
                errors[x] = true;
            
            } // closing if
        
        } // closing if reqd
        
         if (elems[x].className == "email") {
            // if function returns false, then skip further checking and return false
            if (checkEmail(elems[x]) == false) {
            
                //formErrors = false;
                errors[x] = true;
                //return false;
            
            } // closing if
        
        } // closing if email
    
    
    } // closing loop
    
    // add additional, specialised checks if necessary... 
    if (document.getElementById("reservation-day")) {
    
        
        var day = document.getElementById("reservation-day")[document.getElementById("reservation-day").selectedIndex].value;
        var month = document.getElementById("reservation-month")[document.getElementById("reservation-month").selectedIndex].value;
        var year = document.getElementById("reservation-year")[document.getElementById("reservation-year").selectedIndex].value;
      
        
        //document.write(day + ' ' + month + ' ' + year + '<br />');
        
        
        //document.write(requestedTimeStamp);
        
        //var requestedTimeStamp = mktime(0,0,0,month,day,year);
        
        //document.write(requestedTimeStamp);
        
        if (checkValidDate(day,month,year) == false) {
        
            // create error
            errors[errors.length] = true;
            var message = 'Please ensure that the date you enter is valid';
            
            // clear previous error message first...
            clearAddFormError('date');
            // then throw another one into the mix...
            addFormError('date',message);
        
        
        } else {
        
        
            clearAddFormError('date');
        
        
        }
        
        // check that a room type has been selected
        var type = false;
        
        if (document.getElementById("checkbox-single").checked == true) {
        
            type = true;
            
        } else if (document.getElementById("checkbox-double").checked == true) {
        
          type = true;
        
        
        } else if (document.getElementById("checkbox-twin").checked == true) {
        
          type = true;
        
        
        } else if (document.getElementById("checkbox-family").checked == true) {
        
          type = true;
        
        
        } else {
        
        type = false;
        
        }
        
            
            if (type == false) {
            
                clearAddFormError('type');
                addFormError('type','Please select the type of room you require');
            
            
            } else {
            
                clearAddFormError('type');
                
            }
        
        
      
        
        
   
    } // closing reservation part of form validation
    
    
    
    
    if (errors.length > 0) {
    
        return false;
    
    } else {
      
      // everything is okay, so let's submit the form
      
      // problems with Firefox not submitting on true, so explicitly calling
      form.submit();
      
      
         }

} // closing function

function addEvent(elem, evtType, func, captureEvt) {

  if (elem.addEventListener) {
    elem.addEventListener(evtType, func, captureEvt);
  } else if (elem.attachEvent) {
    elem.attachEvent("on" + evtType, func);
  } else {
    elem["on" + evtType] = func;
  }
} // closing function


function addOnsubmit(form) {

  // grab form object, we need this to pass a reference following onsubmit
  var thisForm = form;

  if (form.addEventListener) {

    form = addEventListener('submit', function(e) { e.preventDefault(true); return checkForm(thisForm); }, false); 

  } else if (form.attachEvent) {
  
    form.attachEvent("onsubmit", function() { return checkForm(thisForm); });
  
  } 

} // closing function 


/*************** calendar code *******************/



//window.onload = initCalendar;

//var calendarXhr;

function initCalendar() {

  if (document.getElementById("calendar-table")) {
  
      var events = document.getElementById("calendar-table").getElementsByTagName("a");
      
      // loop through any calendar anchor tags - ie ones that have an event...
      for (var x=0;x<events.length;x++) {
        
        addEvent(events[x],"mouseover",getEvent,true);
     
      }
  
  
  }
  
}  // closing function

  function getEvent(evt) {
  
   // if evt is false - ie browser, we use window.event.  If this returns something, we use it
  evt = (evt) ? evt : ((window.event) ? window.event : null);
  

  if (evt) {
      // here, we pass the correct object, so we don't need to double up on code
      var event = (evt.target) ? evt.target : evt.srcElement;
      
      var url = event.href;
      
      }
  
  
      if (window.XMLHttpRequest) {
    
        calendarXhr = new XMLHttpRequest();
      
       } else {
       
       if (window.ActiveXObject) {
       
        try {
        
          calendarXhr = new ActiveXObject("Microsoft.XMLHTTP");
        
        
        } catch (e) {}
       
       }
      
       }
    
        
      if (calendarXhr) {
      
          url = url + '/ajax-request/1/uid/' + Math.random();
          calendarXhr.onreadystatechange = displayEvent;
          calendarXhr.open("GET",url, true);
          calendarXhr.send(null);
            
          } else {
            
            
          alert("Oops! We couldn't create an XMLHttpRequest object!");
            
            
          }
      
 // }
 

}

function displayEvent() {

     if (calendarXhr.readyState == 4) {
  
      if (calendarXhr.status == 200) {
      
      // need to iterate over xml document and populate array with info....
      var xmlEvents = calendarXhr.responseXML;
      var html = '';
      
      
      for (var x=0; x < xmlEvents.getElementsByTagName("event").length; x++) {
          
         html += xmlEvents.getElementsByTagName("event")[x].childNodes[0].nodeValue;
          
          
      }
          
      if (document.getElementById("news")) {
        
        document.getElementById("news").innerHTML = html;
        
        }
      }
  }
}