function tLD(layerID){
  // tLD = toggleLayerDisplay
  var showLayer = document.getElementById('c'+layerID);
  for ( i=0; i<numCities; i++ ) {

    var currentLayer = document.getElementById('c'+i);
    currentLayer.style.display = 'none';
  }
  showLayer.style.display = 'block';
  setFoot() ;
  return false;
}
function tILD( cityID, rating ) {
  // tLD = toggleInnerLayerDisplay
  var showLayer = document.getElementById( 'c' + cityID + '_' + rating );
  for ( j=0; j<numCities; j++ ) {

    if ( j==cityID ) {

      for ( i=0; i<6; i++ ) {

        var currentLayer = document.getElementById( 'c' + cityID + '_' + i );
        currentLayer.style.display = 'none';
      }
    }
  }
  showLayer.style.display = 'block';
  setFoot();
  return false;
}
function showNav() {

  var nav = document.getElementById('nav');
  nav.style.zIndex=100 ;
  nav.style.display='block' ;
  setFoot() ;
  return false;
}
function hideNav() {

  var nav = document.getElementById('nav');
  nav.style.display='none';
  nav.style.zIndex=1 ;
  setFoot() ;
  return false;
}
function setFoot () {

  var footer = document.getElementById("foot") ;
  footer.style.display = "none" ;

  var pageHeight;
  var sH = document.body.scrollHeight;
  var oH = document.body.offsetHeight
  if (sH > oH) {

    // all but Explorer Mac
  	pageHeight = document.body.scrollHeight;
  } else {

    // Explorer Mac;
    //would also work in Explorer 6 Strict, Mozilla and Safari
  	pageHeight = document.body.offsetHeight;
  }
  footer.style.top = ( pageHeight ) + "px" ;
  footer.style.display = "block" ;
  return false ;
}
function reposFoot () {
  var footer = document.getElementById("foot") ;
  footer.style.display = "none" ;
  footer.style.top = "0px" ;

  var pageHeight;
  var sH = document.body.scrollHeight;
  var oH = document.body.offsetHeight
  if (sH > oH) {

    // all but Explorer Mac
  	pageHeight = document.body.scrollHeight;
  } else {

    // Explorer Mac;
    //would also work in Explorer 6 Strict, Mozilla and Safari
  	pageHeight = document.body.offsetHeight;
  }
  footer.style.top = ( pageHeight - 30 ) + "px" ;
  footer.style.display = "block" ;
  return false ;
}
function printLayout () {
  var divNames = [] ;
  divNames[0] = 'hd' ;
  divNames[1] = 'hf' ;
  divNames[2] = 'rf' ;
  divNames[3] = 'ii' ;

  var divs = [] ;
  var cdivs = [] ;
  var bdivs = [] ;
  var tdivs = [] ;

  for( var x=0 ; x<divNames.length ; x++ ) {

    if ( document.getElementById( divNames[x] ) ) {

      divs[x] = document.getElementById( divNames[x] ) ;
      cdivs[x] = document.getElementById( divNames[x] + 'c' ) ;
      bdivs[x] = document.getElementById( divNames[x] + 'b' ) ;
      tdivs[x] = document.getElementById( divNames[x] + 't' ) ;
    }
  }

  for( var k=0 ; k<divs.length ; k++ ) {

    d = divs[k];
    cd = cdivs[k];
    bd = bdivs[k];
    td = bdivs[k];
    d.style.display = 'block' ; d.style.visibility = 'visible' ; //d.style.height = '10px' ;
    bd.style.display = 'block' ; bd.style.visibility = 'visible' ;// bd.style.height = '10px' ;
    cd.style.display = 'block' ; cd.style.visibility = 'visible' ; cd.style.height = '10px' ;
    td.style.display = 'block' ; td.style.visibility = 'visible' ;// td.style.height = '10px' ;
  }

  setFoot() ;
  return false;
}
function makeTop ( topID ) {

  var divNames = [] ;
  divNames[0] = 'hd' ;
  divNames[1] = 'hf' ;
  divNames[2] = 'rf' ;
  divNames[3] = 'ii' ;

  var divs = [] ;
  var cdivs = [] ;
  var bdivs = [] ;
  var tdivs = [] ;

  for( var x=0 ; x<divNames.length ; x++ ) {

    if ( document.getElementById( divNames[x] ) ) {

      divs[x] = document.getElementById( divNames[x] ) ;
      cdivs[x] = document.getElementById( divNames[x] + 'c' ) ;
      bdivs[x] = document.getElementById( divNames[x] + 'b' ) ;
      tdivs[x] = document.getElementById( divNames[x] + 't' ) ;
    }
  }
  var newTop = document.getElementById( topID ) ;
  var newTopC = document.getElementById( topID + 'c' ) ;
  var newTopB = document.getElementById( topID + 'b' ) ;
  var newTopT = document.getElementById( topID + 't' ) ;

  for( var k=0 ; k<divs.length ; k++ ) {

    d = divs[k];
    cd = cdivs[k];
    bd = bdivs[k];
    td = bdivs[k];
    d.style.display = 'none' ; d.style.visibility = 'hidden' ;
    bd.style.display = 'none' ; bd.style.visibility = 'hidden' ;
    cd.style.display = 'none' ; cd.style.visibility = 'hidden' ;
    td.style.display = 'none' ; td.style.visibility = 'hidden' ;
  }
  if ( newTop ) { newTop.style.display='block'; newTop.style.visibility='visible'; }
  if ( newTopB ) { newTopB.style.display='block'; newTopB.style.visibility='visible'; }
  if ( newTopC ) { newTopC.style.display='block'; newTopC.style.visibility='visible'; }
  if ( newTopT ) { newTopT.style.display='block'; newTopT.style.visibility='visible'; }

  setFoot() ;
  return false;
}
function fixHeights () {

  var divNames = [] ;
  divNames[0] = 'hd' ;
  divNames[1] = 'hf' ;
  divNames[2] = 'rf' ;
  divNames[3] = 'ii' ;

  var divs = [] ;
  var cdivs = [] ;
  var bdivs = [] ;

  for( var x=0 ; x<divNames.length ; x++ ) {

    if ( document.getElementById( divNames[x] ) ) {

      divs[x] = document.getElementById( divNames[x] ) ;
      cdivs[x] = document.getElementById( divNames[x] + 'c' ) ;
      bdivs[x] = document.getElementById( divNames[x] + 'b' ) ;
    }
  }

  var maxHeight = 0 ;
  var divHeight = 0 ;

  for( var i=0 ; i<divs.length ; i++ ) {

    var d = divs[i];
    var cd = cdivs[i];
    var bd = bdivs[i]
    cd.style.display = 'block' ;
    cd.style.visibility = 'visible' ;
    d.style.display = 'block' ;
    d.style.visibility = 'visible' ;

    if( cd.offsetHeight ) {

      divHeight = cd.offsetHeight;
    } else if ( cd.style.pixelHeight ) {

      divHeight = cd.style.pixelHeight;
    }
    maxHeight = Math.max(maxHeight,divHeight);

    d.style.display = 'none' ;
  }

  for( var k=0 ; k<divs.length ; k++ ) {

    d = divs[k];
    cd = cdivs[k];
    bd = bdivs[k];
    var newHeight = maxHeight + 10 + 'px' ;
    cd.style.height = newHeight ;
    cd.style.minHeight = newHeight ;
    d.style.visibility = 'hidden' ;
  }
  divs[0].style.display = 'block' ;
  divs[0].style.visibility = 'visible' ;
  return false;
}

function setBack ( element, id ) {

   var table = document.getElementById( element ) ;
   var rows = table.getElementsByTagName("td") ;
   var tableBack = '' ;
   for( var i=0 ; i<rows.length ; i++ ) {

    var r = ( i + 1 ) ;
    if ( id !== i ) {

      if ( rows[r] ) {
        rows[r].style.backgroundColor = '' ; ;
        rows[r].style.fontWeight = 'normal' ;
      }
    } else {

      rows[r].style.backgroundColor = '#FFFFCC' ;
      rows[r].style.fontWeight = 'bold' ;
    }
  }
  return false ;
}

function setMRTBack ( element ) {

return false;

  // alert ( "element: " + element ) ;
  var myrows = document.getElementById( element ) ;
  myrows.style.backgroundColor = '#FFFFCC' ; ;
  myrows.style.fontWeight = 'bold' ;
  return false ;
}

function updateArrivalAndNightsDisplay() {

    var firstArrDate = dateStringToJavascriptDate( document.forms.make_reservation_form.firstNightOption.value ) ;
    var arrivalDate = null ;
    var departureDate = null ;
    var numNights = 0 ;

    numOptions = document.forms.make_reservation_form.arrival_date.length ;
    for ( r = 0 ; r < numOptions ; r++ ) {
        if ( document.forms.make_reservation_form.arrival_date[r].checked ) {
            //make sure this is option has availability (a date value of '00-00-0000' means not available)
            if ( document.forms.make_reservation_form.arrival_date[r].value == '00-00-0000' ) {
                break ; //get out of the loop and let a later error catch this situation
            }
            //store the date as a javascript Date object
            arrivalDate = dateStringToJavascriptDate( document.forms.make_reservation_form.arrival_date[r].value ) ;
            break ; //we've found a match, no point looking further
        }
    }

    numOptions = document.forms.make_reservation_form.dep_date.length ;
    for ( r = 0 ; r < numOptions ; r++ ) {
        if ( document.forms.make_reservation_form.dep_date[r].checked ) {
            departureDate = dateStringToJavascriptDate( document.forms.make_reservation_form.dep_date[r].value ) ;
            break ; //we've found a match, no point looking further
        }
    }

    //check we found both an arrival and a departure date
    if ( ( arrivalDate == null ) || ( departureDate == null ) ) {
        alert( 'Please select both an arrival and a departure date' ) ;
        setDisplayArrDateAndNumNights( '--/--/----', '0' ) ;
        disableDepartureDates( firstArrDate, arrivalDate, departureDate )
        return false ;
    }

    //prepare the arrival date for display
    //dispArrDate = replaceAll( document.forms.make_reservation_form.arrival_date[r].value, '-', '/' ) ;
    dispArrDate = strPad( arrivalDate.getDate(), '0', 2 ) + '/' + strPad( ( arrivalDate.getMonth() + 1 ), '0', 2 ) +  '/' + arrivalDate.getFullYear() ;
    //calculate num nights
    numNights = Math.floor( ( departureDate.getTime() - arrivalDate.getTime() ) / 86400000 ) ; //86400000 = milliseconds in one day : 1000 x 60 x 60 x 24
    //update the date and number of nights displayed on the page
    if ( disableDepartureDates( firstArrDate, arrivalDate, departureDate ) ) {
        setDisplayArrDateAndNumNights( dispArrDate, numNights ) ;
    } else {
        setDisplayArrDateAndNumNights( dispArrDate, '0' ) ;
    }

    return true ;
}

function setDisplayArrDateAndNumNights( arrDate, numNights ) {
    //if a value is passed as false then do not modify the current value
    if ( arrDate != null ) {
        document.forms.make_reservation_form.availDisplayArrivalDay.value = arrDate ;
    }
    if ( numNights != null ) {
        //update the hidden nights field
        document.forms.make_reservation_form.nights.value = numNights ;
        //handle proper pluralisation of nights and update the visible nights field
        if ( parseInt( numNights, 10 ) == 1 ) {
            document.forms.make_reservation_form.availDisplayNumNights.value = numNights + ' night' ;
        } else {
            document.forms.make_reservation_form.availDisplayNumNights.value = numNights + ' nights' ;
        }
    }
    //disable the 'book' button if numNights is 0
    if ( numNights == 0 ) {
        document.forms.make_reservation_form.submitButton.disabled = true ;
    } else {
        document.forms.make_reservation_form.submitButton.disabled = false ; //enable the button
    }
    return true ;
}

function disableDepartureDates( firstPossibleArrDate, selectedArrDate, selectedDepDate ) {
    //ensure that at least an arrival date is supplied to the function
    if ( selectedArrDate == null ) {
        return false ;
    }

    //calculate num options to disable prior to the selected start date
    //disableThisManyDepDates = Math.floor( ( selectedArrDate.getTime() - firstPossibleArrDate.getTime() ) / 86400000 ) ; //86400000 = milliseconds in one day : 1000 x 60 x 60 x 24
    disableThisManyDepDates = 0 ; //disableThisManyDepDates ; //same thing but better label for use from here
    for ( i = 0 ; i < numOptions ; i++ ) {
        if ( document.forms.make_reservation_form.arrival_date[i].checked ) {
            disableThisManyDepDates = i ;
            break ;
        }
    }

    numOptions = document.forms.make_reservation_form.dep_date.length ;
    for ( r = 0 ; r < numOptions ; r++ ) {
        if ( r < disableThisManyDepDates ) {
            document.forms.make_reservation_form.dep_date[r].disabled = true ;
        } else {
            document.forms.make_reservation_form.dep_date[r].disabled = false ;
        }
    }

    //search for any unavailable nights after the selected arrival date and disable all departure
    //nights from the following night onwards (no gaps may exist in the stay period). No need to
    //deslect departure options prior to the selected date as this has already been done by the above code.
    selectedArrDateRadioOptPosition = disableThisManyDepDates ; //same thing but better label for use from here
    unbookableFromDepDateOptPosition = numOptions ;
    for ( r = selectedArrDateRadioOptPosition ; r < numOptions ; r++ ) {
        if ( document.forms.make_reservation_form.arrival_date[r].value == '00-00-0000' ) {
            unbookableFromDepDateOptPosition = r ;
            break ;
        }
    }
    //disable all the departure radio options from the discovered point forwards.
    //(if no point was discovered the for loop will fail to start as the while condition will be met immediately).
    previousOptSelectionValid = true ;
    for( r = unbookableFromDepDateOptPosition ; r < numOptions ; r++ ) {
        document.forms.make_reservation_form.dep_date[r].disabled = true ;
        //check to see if we are disabling the currently selected departure date
        if ( document.forms.make_reservation_form.dep_date[r].checked ) {
            previousOptSelectionValid = false ;
        }
    }

    if ( selectedArrDate == null ) {
        document.forms.make_reservation_form.submitButton.disabled = true ;
        return false ;
    }
    if ( selectedDepDate == null ) {
        document.forms.make_reservation_form.submitButton.disabled = true ;
        return false ;
    }

    //see if we disabled the previously selected departure date
    //and ensure that departure date is after the arrival date,
    //and ensure that departure date is not on the same date as the arrival date.
    if ( selectedDepDate.getTime() < selectedArrDate.getTime() ) {
        alert( 'Your departure date is before your new arrival date.\nPlease select a later departure date.' ) ;
        //disable the submit button
        document.forms.make_reservation_form.submitButton.disabled = true ;
        return false ;
    } else if ( selectedDepDate.getTime() == selectedArrDate.getTime() ) {
        alert( 'Your stay must be for at least 1 night.\nPlease select a later departure date.' ) ;
        document.forms.make_reservation_form.submitButton.disabled = true ;
        return false ;
    } else if ( !previousOptSelectionValid ) {
        alert( 'One of the nights between your arrival and departure dates is unavailable.\nPlease select an earlier departure date.' ) ;
        //disable the submit button
        document.forms.make_reservation_form.submitButton.disabled = true ;
        return false ;
    }

    document.forms.make_reservation_form.submitButton.disabled = false ;
    return true;
}

//a js search and replace function
function replaceAll( str, from, to ) {
    var idx = str.indexOf( from ) ;
    while ( idx > -1 ) {
        str = str.replace( from, to ) ;
        idx = str.indexOf( from ) ;
    }
    return str;
}

//convert a date string in the format dd-mm-yyyy to a JS date object
function dateStringToJavascriptDate( dateStr ) {
    dd = dateStr.substring(0, 2) ;
    dd = parseInt(dd, 10) ;
    if (dd.length < 2) { dd = "" + "0" + dd ; } //convert back to string and pad
    mm = dateStr.substring(3, 5) ;
    mm = parseInt(mm, 10) - 1 ; //correct for js months starting at 0
    mm = "" + mm ; //convert back to a string
    if (mm.length < 2) { mm = "" + "0" + mm ; } //convert back to string and pad
    yyyy = dateStr.substring(6, 10) ;

    theDate = new Date( yyyy, mm, dd ) ;

    return theDate ;
}

function strPad( str, pad, length ) {
    str = '' + str ; //force cast to string even if supplied an int
    while ( str.length < length ) {
        str = pad + str ;
    }
    return str;
}

function removeSearchingMessage() {
  document.getElementById('searchingDiv').style.display = 'none';
  return true;
}