function external_urlEncode(clearString)
{
  if (typeof clearString == 'undefined') return '';
  var output = '';
  var x = 0;
  clearString = clearString.toString();
  var regex = /(^[a-zA-Z0-9_.]*)/;
  while (x < clearString.length)
  {
    var match = regex.exec(clearString.substr(x));
    if (match != null && match.length > 1 && match[1] != '')
    {
      output += match[1];
      x += match[1].length;
    }
    else
    {
      if (clearString[x] == ' ' || clearString.charCodeAt(x).toString(16).toUpperCase() == '20' || clearString.charCodeAt(x).toString(16).toUpperCase() == 'A0')
      {
        output += '+';
      }
      else
      {
        var charCode = clearString.charCodeAt(x);
        var hexVal = charCode.toString(16);
        output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
      }
      x++;
    }
  }
  return output;
}

function external_trim(str)
{
  if (typeof(str) != 'string') return str;
  return str.replace(/^\s+|\s+$/g, '');
}

function checkpositivenumber(x)
{
	var anum=/^\d+$/;
	return anum.test(x);
}

function checkdate()
{
	if (document.getElementById('date').value.length == 0)
	{
		alert('Please select activity date');
		return false;
	}

	return true;
}

function checkcancellation(cancellationpolicy)
{
    if (!cancellationpolicy.checked)
    {
        alert('You must check the box acknowledging our cancellation policy!');
        return false;
    }

	return true;
}

function checkextraitem(requested, limited, available, name)
{
  requested = external_trim(requested);
	if (!checkpositivenumber(requested))
	{
		alert('Please enter valid extra amount(s)');
		return false;
	}
	if (limited && parseInt(requested) > available)
	{
		alert('Sorry, only ' + available + ' ' + name + '(s) available');
		return false;
	}
	return true;
}

var query = '';
var mode = '';
var activitydate = '';
var guestCountMap;
var mode2Setup;
// Deprecated but still supported:
var seats1;
var seats2;
var seats3;
var seats4;
var seats5;

function reservation(dummy_referrerid, activityid, date, discountname, discountpercents)
{
  reservation_init(dummy_referrerid, activityid, date, discountname, discountpercents, 0.0, discountpercents, 0.0, discountpercents, 0.0, discountpercents, 0.0, discountpercents, 0.0, discountpercents, discountpercents, window.location.href);
}

function reservation2(dummy_referrerid, activityid, date, discountname, discountpercentage1, discountvalue1, discountpercentage2, discountvalue2, discountpercentage3, discountvalue3, discountpercentage4, discountvalue4, discountpercentage5, discountvalue5, discountpercentagetransportation, discountpercentageextras)
{
  reservation_init(dummy_referrerid, activityid, date, discountname, discountpercentage1, discountvalue1, discountpercentage2, discountvalue2, discountpercentage3, discountvalue3, discountpercentage4, discountvalue4, discountpercentage5, discountvalue5, discountpercentagetransportation, discountpercentageextras, window.location.href)
}

function reservation_init(dummy_referrerid, activityid, date, discountname, discountpercentage1, discountvalue1, discountpercentage2, discountvalue2, discountpercentage3, discountvalue3, discountpercentage4, discountvalue4, discountpercentage5, discountvalue5, discountpercentagetransportation, discountpercentageextras, referer)
{
  query =
    '&referer=' + external_urlEncode(referer) +
    '&activityid=' + external_urlEncode(activityid) +
    (date != undefined ? '&date=' + external_urlEncode(date) : '');
  mode = '';
  activitydate = external_trim(date);
  guestCountMap = Object();
  mode2Setup = false;
  // Deprecated:
  seats1 = 0;
  seats2 = 0;
  seats3 = 0;
  seats4 = 0;
  seats5 = 0;
}

function setGiftCertificate()
{
  mode = 'giftcertificate';
  query += "&mode=giftcertificate";
}

function addGuests(guestTypeId, guestCount)
{
  if (!mode2Setup)
  {
    query = query + '&externalpurchasemode=2';
    mode2Setup = true;
  }
  if (guestCount == 0)
  {
    return;
  }
  query = query + '&guests_t' + guestTypeId + '=' + external_urlEncode(external_trim(guestCount));
  guestCountMap[guestTypeId] = external_trim(guestCount);
}

// Deprecated but still supported:
function addseats1(seats, price, priceafterdiscount)
{
  query = query + '&seats1=' + external_urlEncode(external_trim(seats));
  seats1 = external_trim(seats);
}

function addseats2(seats, price, priceafterdiscount)
{
  query = query + '&seats2=' + external_urlEncode(external_trim(seats));
  seats2 = external_trim(seats);
}

function addseats3(seats, price, priceafterdiscount)
{
  query = query + '&seats3=' + external_urlEncode(external_trim(seats));
  seats3 = external_trim(seats);
}

function addseats4(seats, price, priceafterdiscount)
{
  query = query + '&seats4=' + external_urlEncode(external_trim(seats));
  seats4 = external_trim(seats);
}

function addseats5(seats, price, priceafterdiscount)
{
  query = query + '&seats5=' + external_urlEncode(external_trim(seats));
  seats5 = external_trim(seats);
}

function addseatsfromselect(select)
{
  var id = select.options[select.selectedIndex].value;
  if (id.match(/^t(\d+)$/))
  {
    var guestTypeId = RegExp.$1;
    addGuests(guestTypeId, 1);
  }
  else
  {
    query = query + '&seats' + id + '=1';
    if (id == '1') seats1 = 1;
    if (id == '2') seats2 = 1;
    if (id == '3') seats3 = 1;
    if (id == '4') seats4 = 1;
    if (id == '5') seats5 = 1;
  }
}

// Not supported, but may be used somewhere.
function addextras(name, amount, price, priceafterdiscount)
{
}

// Used internally.
function addextraitem(id, amount)
{
  query = query + '&extraitemid=' + id + '&extraitemamount=' + external_urlEncode(external_trim(amount));
}

function setdiscount(discountcode)
{
  query = query + '&discountcode=' + external_urlEncode(discountcode);
}

function setagency(agencyid)
{
  query = query + '&agencyid=' + agencyid;
}

function setgoldcard(goldcardnumber)
{
  query = query + '&goldcardnumber=' + external_urlEncode(external_trim(goldcardnumber));
}

function setpromotionalcode(promotionalcode)
{
  query = query + '&promotionalcode=' + external_urlEncode(external_trim(promotionalcode));
}

function setpaylater(paylater)
{
  query = query + '&paylater=' + paylater;
}

var googleanalyticsaccount = '';
function setgoogleanalytics(account)
{
  googleanalyticsaccount = account;
  query = query + '&googleanalyticsaccount=' + external_urlEncode(account);
}

function getBaseUrl()
{
	var myName = /^(.*[\/\\])external\/functions\.js(?:\?|$)/;
	var scripts = document.getElementsByTagName("script");
	for (var i = 0; i < scripts.length; i++) {
		var src = scripts[i].src;
		if (src && src.match(myName)) {
			return RegExp.$1;
		}
	}

  return '';
}

function getJsVersion()
{
  var scripts = document.getElementsByTagName('script');
  for (var i = 0; i < scripts.length; ++i)
  {
    if (scripts[i].src && /external\/functions.js\?(?:.*&)?jsversion=([^&]+)(?:&|$)/.test(scripts[i].src))
    {
      return RegExp.$1;
    }
  }

  return '';
}

var baseurl = 'https://www.hawaiifun.org/reservation/';
if (getBaseUrl().match(/^https?:\/\/[a-z]+[:\/]/) || getBaseUrl().match(/reservation_test/)) // single-word hostname
{
  baseurl = getBaseUrl();
}

var jsVersion = getJsVersion();

function availability_popup()
{
  if (!mode)
  {
    // old-style mode guessing
    var modefield = document.getElementById('mode');
    if(modefield != undefined) mode = modefield.value;
  }

  if (!mode) mode = 'reservation';

  if (mode == 'reservation' && activitydate == '')
  {
  	alert('Please select activity date');
  	return;
  }
  var haveMode2Errors = false;
  var activeMode2GuestsTypes = 0;
  for (var guestTypeId in guestCountMap)
  {
    var guestCount = guestCountMap[guestTypeId];
    if (!checkpositivenumber(guestCount))
    {
      haveMode2Errors = true;
      continue;
    }
    if (parseInt(guestCount) != 0)
    {
      activeMode2GuestsTypes++;
    }
  }
  // seats1 etc. are deprecated
  if (haveMode2Errors || !checkpositivenumber(seats1) || !checkpositivenumber(seats2) || !checkpositivenumber(seats3) || !checkpositivenumber(seats4) || !checkpositivenumber(seats5) ||
      (activeMode2GuestsTypes == 0 && parseInt(seats1) == 0 && parseInt(seats2) == 0 && parseInt(seats3) == 0 && parseInt(seats4) == 0 && parseInt(seats5) == 0))
  {
	  alert('Please enter valid guests number(s)');
	  return;
  }
  if (activeMode2GuestsTypes > 5)
  {
    alert('Sorry, you can\'t order seats for more than 5 different guest types');
    return;
  }

  var action = 'AVAILABILITYCHECKPAGE';
  if(mode == 'giftcertificate')
  {
    action = 'GIFTCERTIFICATECHECKEXTRAITEMS';
    if (!/&mode=giftcertificate(?:&|$)/.test(query)) query += "&mode=giftcertificate";
  }

  var d=window.open('', '_blank', 'width=500,height=200,scrollbars=no,resizable=yes,top=100,left=100').document;
  d.open("text/html", "replace");
  d.write("<html><head>"
    + "<script type='text/javascript'>var q='"+ query +"';</script>"
    + "<script type='text/javascript' src='"+ baseurl + "common/jquery/jquery-1.7.min.js'></script>"
    + "<script type='text/javascript' src='"+ baseurl + "common/innertext-v0.js'></script>"
    + "<script type='text/javascript' src='"+ baseurl + "external/functions.js?jsversion=" + jsVersion + "'></script>"
    + "<script type='text/javascript' src='"+ baseurl + 'externalservlet?action=' + action + query +"'></script>"
    + (googleanalyticsaccount == '' ? '' : "<script src='https://ssl.google-analytics.com/ga.js' type='text/javascript'></script><script type='text/javascript'>try { pageTracker = _gat._getTracker('" + googleanalyticsaccount + "'); pageTracker._setAllowLinker(true); pageTracker._setAllowHash(false); pageTracker._trackPageview(); } catch(err) {}</script>")
    + "</head><body onload='javascript:showContent();'><table width='100%' height=170><tr><td width=100% valign=center align=center><b>C h e c k i n g . . .</b></td></tr></table></body></html>");
  d.close();
}

function purchase(hotelid, room, transportationrouteid, payLaterString)
{
  var url = baseurl + 'externalservlet?action=EXTERNALPURCHASEPAGE' + query + '&hotelid=' + hotelid + '&room=' + external_urlEncode(room) + '&transportationrouteid=' + transportationrouteid + '&paylater=' + payLaterString;
  if (typeof pageTracker == 'undefined')
  {
    window.opener.location = url;
  }
  else
  {
    window.opener.location = pageTracker._getLinkerUrl(url);
  }
  window.close();
}

function replacePage(html, cssArray)
{
  jQuery("body").html(html).css(cssArray);
}

