// get host where this javascript runs
var host = $('script[data-main="content-js"]').attr('src');
host = host.substring(0,host.indexOf("/wps"));
var baseURL = '/wps/wcm/connect/Public+Content/SA+Health+Internet'.toLowerCase();
$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('accept-language', 'EN');
    }
});

/* HTML component definitions */
var pgNav = function(o) {
  return '<nav role="navigation" aria-label="pagination">' + o.prev + '<ul>' + o.pging + '</ul>' + o.next + '</nav>\
  <div class="search-result-count pagination">\
    Viewing <span class="results-displaying">' + o.first + ' - ' + o.last + '</span> of <span class="total-results">' + o.total + '</span> results</div></div>';
};
var pgCount = function(o) {
  return '<span class="results-displaying">' + o.first + ' - ' + o.last + '</span> of <span class="total-results">' + o.total + '</span> results' +
    o.cat && o.cat != '' ? (" for <span class='search-term-wrapper'><span class='search-term-inner'>'" + o.cat + "'</span></span>") : ("")
};
var pgNoResult = function(o) {
  return '<span class="results-displaying">No results' + o.cat && o.cat != '' ? (" for <span class='search-term-wrapper'><span class='search-term-inner'>'" + o.cat + "'</span></span>") : "";
};
var pgPrev = function(o) {
  return '<div class="pagingation-prev-wrapper">\
  <a class="pagination-item pagination-nav previous" aria-label="Goto previous page" href="#" onclick="' + o.fn + '(' + o.pg + ',' + o.ipp + ',this,\'' + (o.sel?o.sel.replace(/"/g,'&quot;'):'') + '\');return false;">Previous</a></div>'
};
var pgNext = function(o) {
  return '<div class="pagingation-next-wrapper">\
    <a class="pagination-item pagination-nav next" aria-label="Goto next page" href="' + o.pg + '" onclick="' + o.fn + '(' + o.pg + ',' + o.ipp + ',this,\'' + (o.sel?o.sel.replace(/"/g,'&quot;'):'') + '\');return false;">Next</a></div>';
};
var pgLi = function(o) {
  return '<li><a class="pagination-item" href="#" onclick="' + o.fn + '(' + o.pg + ',' + o.ipp + ',this,\'' + (o.sel?o.sel.replace(/"/g,'&quot;'):'') + '\');return false;" aria-label="Go to page ' + o.pg + '">' + o.pg + '</a></li>';
};
var pgLiCur = function(o) {
  return '<li><a class="pagination-item" onclick="return false;" aria-current="true" aria-label="Page ' + o.pg + ', Current Page">' + o.pg + '</a></li>';
};
var ell = '<span class="pagination__ellipsis">• • •</span>';

/* Partial refresh URL Parameter handlers */
function getParam(key) {
  var pStr = (new URLSearchParams(window.location.search)).get(key);
  if (pStr) return pStr;
  else return '';
}
function removeParam(key) {
  var urlParams = new URLSearchParams(window.location.search);
  urlParams.delete(key);
  var pStr = urlParams.toString();
  if (pStr.length > 0) pStr = '?' + pStr;
  window.history.replaceState(null, '', location.pathname + pStr);
}
function setParam(key, value) {
  var urlParams = new URLSearchParams(window.location.search);
  urlParams.set(key, value);
  window.history.replaceState(null, '', '?' + urlParams.toString());
}

function sortSelectOptions(selector, skip_first) {
    var options = (skip_first) ? $(selector + ' option:not(:first)') : $(selector + ' option');
    var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value, s: $(o).prop('selected') }; }).get();
    arr.sort(function(o1, o2) {
      var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase();
      return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
    }); 
    options.each(function(i, o) {
        o.value = arr[i].v;
        $(o).text(arr[i].t);
        if (arr[i].s) {
            $(o).attr('selected', 'selected').prop('selected', true);
        } else {
            $(o).removeAttr('selected');
            $(o).prop('selected', false);
        }
    }); 
}

/* Search Page START */
$('#searchIframe').on('load', function() {
  try {
    var iframeWin = this.contentWindow || ( this.contentDocument ? this.contentDocument.parentWindow : null);
    if (iframeWin && iframeWin.location.search)
      window.history.replaceState(null, '', iframeWin.location.search);
  } catch (e) {}
});

function loadSearchResults(f) {
  var q = f.q.value;
  if(q) {
    setParam("q",q);
    window.location.reload();
  }
  return false;
}
/* Search Page END */

/* Filtered Search START */
function filterSearch(f) {
  var sitearea_category = [];
  if (f.path && f.path.value) sitearea_category.push(decodeURIComponent(f.path.value));
  if (f.category && f.category.value)
    (decodeURIComponent(f.category.value).split(',')).forEach(function(a) {
      if (a) sitearea_category.push(a.replace(/^\//, ''));
    });
  $.post(host+"/apps/endpoint/filtered_search", {
      /* replace first / from each result */
      "sitearea_category": sitearea_category,
      "query_string": (f.q) ? decodeURIComponent(f.q.value) : ''
    },
    function(data) {
      window.location = '/wps/wcm/connect/public+content/sa+health+internet/search/' + (data);
    }
  ).fail(function() {
    /* fallback to simple search */
    window.location = '/wps/wcm/connect/public+content/sa+health+internet/search/' + (f.q.value);
  });
  return false;
}
/* Filtered Search END */

/* A-Z Lists */
function toTopAZ(t) {
  var p = $(t).closest('div[role=tabpanel]');
  $(this).blur();
  p.find('.a-z-key-list').focus();
  p.closest('.finder')[0].scrollIntoView({behavior: "smooth", block: "start"});
  return false;
}
function collapseAZ(t) {
  var p = $(t).closest('div[role=tabpanel]');
  p.find('.results-block,.results-all').hide();
  p.find('.finder-key').attr('aria-pressed',false);
  removeParam('az');
  $(this).blur();
  p.find('.a-z-key-list').focus();
  p.closest('.finder')[0].scrollIntoView({behavior: "smooth", block: "start"});
  return false;
}

function pageUI(pg, ipp, t, sel) {
  var wrap = $(t).closest('.pagination-wrapper').prev('.results-list,.panel-content__results-list,.a-z-links');
  if (wrap.length < 1) wrap = $(t).closest('.pagination-wrapper').closest('.results-list,.panel-content__results-list,.a-z-links');
  addUIPaging('pageUI', wrap, sel, ipp, pg);
}
function addUIPaging(fn, p, sel, ipp, cpg, cat) {
  var items = p.children(sel);
  if (items.length == 0) items = p.children('.results-block').children(sel);
  var total = items.length;
  if (!ipp) ipp = parseInt(p.closest('.results-list,.panel-content__results-list').data('rows')) || 25;
  if (!cpg) cpg = 1;
  var tpg = Math.ceil(total / ipp);
  var pager = {
    'first': ((cpg - 1) * ipp + 1),
    'last': Math.min(cpg * ipp, total),
    'total': total,
    'prev': '',
    'pging': '',
    'next': ''
  };
  if (tpg > 1) {
    if (cpg > 1) pager.prev = [{
      'fn': fn,
      'pg': (cpg - 1),
      'ipp': ipp,
      'sel': sel
    }].map(pgPrev).join('');
    if (cpg < tpg) pager.next = [{
      'fn': fn,
      'pg': (cpg + 1),
      'ipp': ipp,
      'sel': sel
    }].map(pgNext).join('');
    var pages = "";
    var x = 1;
    var show = 2;
    if (cpg == 2 || cpg == (tpg - 1)) show = 3;
    else if (cpg == 1 || cpg == tpg) show = 4;
    if (x == cpg) pages += [{
      'pg': x
    }].map(pgLiCur).join('');
    else pages += [{
      'fn': fn,
      'pg': x,
      'ipp': ipp,
      'sel': sel
    }].map(pgLi).join('');
    var needDots = true;
    for (x = 2; x < tpg; x++) {
      if (x == cpg) {
        pages += [{
          'pg': x
        }].map(pgLiCur).join('');
        needDots = true;
      } else if (Math.abs(x - cpg) < show) {
        pages += [{
          'fn': fn,
          'pg': x,
          'ipp': ipp,
          'sel': sel
        }].map(pgLi).join('');
        needDots = true;
      } else if (needDots) {
        pages += ell;
        needDots = false;
      }
    }
    var x = tpg;
    if (x == cpg) pages += [{
      'pg': x
    }].map(pgLiCur).join('');
    else pages += [{
      'fn': fn,
      'pg': x,
      'ipp': ipp,
      'sel': sel
    }].map(pgLi).join('');
    pager.pging = pages;
  }
  var wrap = p.children('.pagination-wrapper');
  if (wrap.length < 1) wrap = p.next('.pagination-wrapper');
  if (wrap.length < 1 && tpg > 1) {
    /* only create pager if > 1 page */
    var w = $('<div class="pagination-wrapper"></div>');
    p.after(w);
    wrap = p.next('.pagination-wrapper');
  }
  if (wrap && pager.total > 0) wrap.html([pager].map(pgNav).join(''));
  else if (wrap) wrap.html('');
  var ct = p.prev('.media-release-results-header');
  if (ct && ct.find('.search-result-count')) {
    pager.cat = cat ? cat : '';
    if (total > 0)
      ct.find('.search-result-count').html([pager].map(pgCount).join(''));
    else
      ct.find('.search-result-count').html([pager].map(pgNoResult).join(''));
  }
  if (tpg > 1) {
    items.hide();
    items.slice(pager.first - 1, pager.last).show();
  } else
    items.show();
}
var findOne = function(a, b) {
  return b.some(function(c) {
    return a.indexOf(c) >= 0;
  });
};
var findAll = function(a, b) {
  return b.every(function(c) {
    return a.indexOf(c) >= 0;
  });
};
function setUpAZ(_header, _section, _results) {
  var _alphabets = _header.find('button');
  if (_alphabets.length < 26) {
    /* ensure alphabet buttons have been loaded */
    setTimeout(function() {
      setUpAZ(_header, _section, _results)
    }, 100);
  } else {
    var _allRows = _results.children('a');
    if (_results.data('cat')) {
      var cats = _results.data('cat').split(',');
      if (_results.data('matchall') === 'true')
        _allRows.filter(function() {
          return !findAll($(this).data('cat').split(','), cats);
        }).remove();
      else
        _allRows = _allRows.filter(function() {
          return !findOne($(this).data('cat').split(','), cats)
        }).remove();
      _allRows = _results.children('a');
    }
    _allRows.each(function() {
      var c = this.text.replace(/[^A-Za-z0-9\s]/g, '').toLowerCase().trim();
      $(this).attr('data-sort', c);
      $(this).attr('data-letter', c[0].replace(/[0-9]/, '0-9'));
    });
    _allRows = $(_allRows.toArray().sort(function(a, b) {
      return ($(a).data('sort') > $(b).data('sort')) ? 1 : -1;
    }));
    _results.append(_allRows);

    _alphabets.each(function() {
      var _letter = $(this).data('search-key');
      $(this).attr('id', 'az-' + _letter);
      if (_letter != 'all') {
        var _letterRows = _allRows.filter(function() {
          return $(this).data('letter') == _letter;
        });
        if (_letterRows.length == 0) {
          _results.append('<div class="results-block results-' + _letter + '" style="display:none"><span class="result-key"><h4>' + _letter.toUpperCase() + '</h4></span><div class="a-z-links no-results"><span>No results found for ' + _letter.toUpperCase() + '.</span></div></div>');
        } else {
          $(this).addClass('hasResults');
          _letterRows.wrapAll('<div class="results-block results-all results-' + _letter + '"><ul class="a-z-links"/></div>');
          _letterRows.parent().before('<span class="result-key"><h4>' + _letter.toUpperCase() + '</h4></span>');
          _letterRows.parent().parent().after('<button class="repeatable back-to-top-button results-all results-' + _letter + '" role="button" tabindex="0" onClick="return toTopAZ(this)"><a onclick="return false" href="#maincontent"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 31.5 31.5" style="enable-background:new 0 0 31.5 31.5;" xml:space="preserve"><path class="st1" d="M21.2,5c-0.4-0.4-1.1-0.4-1.6,0c-0.4,0.4-0.4,1.1,0,1.6l8,8H1.1c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1 h26.6l-8,8c-0.4,0.4-0.4,1.2,0,1.6c0.4,0.4,1.2,0.4,1.6,0l10-10c0.4-0.4,0.4-1.1,0-1.6L21.2,5z"></path></svg><span>Back to top</span></a></button><button tabindex="0" class="icon-button finder-close collapse-az-button repeatable results-all results-'+_letter+'" role="button" onClick="collapseAZ(this)"><svg version="1.1" aria-label="close icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 47.971 47.971" style="enable-background:new 0 0 47.971 47.971;" xml:space="preserve"><g><path d="M28.228,23.986L47.092,5.122c1.172-1.171,1.172-3.071,0-4.242c-1.172-1.172-3.07-1.172-4.242,0L23.986,19.744L5.121,0.88 c-1.172-1.172-3.07-1.172-4.242,0c-1.172,1.171-1.172,3.071,0,4.242l18.865,18.864L0.879,42.85c-1.172,1.171-1.172,3.071,0,4.242 C1.465,47.677,2.233,47.97,3,47.97s1.535-0.293,2.121-0.879l18.865-18.864L42.85,47.091c0.586,0.586,1.354,0.879,2.121,0.879 s1.535-0.293,2.121-0.879c1.172-1.171,1.172-3.071,0-4.242L28.228,23.986z"></path></g></svg></button>');
        }
      } else {
        $(this).addClass('hasResults');
      }
    });
    _allRows.wrap('<li/>');

    _section.find('.results-list.a-z-category .a-z-links').each(function() {
      addUIPaging('pageUI', $(this), 'li');
    });

    _alphabets.click(function() {
      var _text = $(this).attr('data-search-key');
      var _section = $(this).closest('section');
      setParam('az', 'az-' + _text);
      if (_text == 'all') {
        _section.find('div.results-list .results-all').show().find('a').first().focus();
      } else {
        _section.find('div.results-list.a-z-category').children().hide();
        _section.find('div.results-list .results-' + _text).show().find('a').first().focus();
      }
    });

    /* Set up initial display */
    _header.prepend('<button tabindex="0" class="icon-button finder-close collapse-az-button repeatable" style="padding-top:0" role="button" onClick="collapseAZ(this)"><svg version="1.1" aria-label="close icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 47.971 47.971" style="enable-background:new 0 0 47.971 47.971;" xml:space="preserve"><g><path d="M28.228,23.986L47.092,5.122c1.172-1.171,1.172-3.071,0-4.242c-1.172-1.172-3.07-1.172-4.242,0L23.986,19.744L5.121,0.88 c-1.172-1.172-3.07-1.172-4.242,0c-1.172,1.171-1.172,3.071,0,4.242l18.865,18.864L0.879,42.85c-1.172,1.171-1.172,3.071,0,4.242 C1.465,47.677,2.233,47.97,3,47.97s1.535-0.293,2.121-0.879l18.865-18.864L42.85,47.091c0.586,0.586,1.354,0.879,2.121,0.879 s1.535-0.293,2.121-0.879c1.172-1.171,1.172-3.071,0-4.242L28.228,23.986z"></path></g></svg></button>');
    _section.find('div.results-list.a-z-category').children().hide();
    var id = null;
    if (window.location.hash && window.location.hash!== '#' && $(window.location.hash).length > 0) {
      id = _section.find(window.location.hash);
    } else if (getParam('az')) {
      id = _section.find('#'+getParam('az'));
    } else if (_section.find('#a-z-key-list button[aria-pressed="true"]').length > 0) {
      id = _section.find('#a-z-key-list button[aria-pressed="true"]').first();
    }
    if(id) {
      id.attr('aria-pressed',true);
      var _text = id.data('search-key');
      if (_text == 'all') {
        _section.find('div.results-list .results-all').show();
      } else {
       _section.find('div.results-list.a-z-category').children().hide();
       _section.find('div.results-list .results-' + _text).show();
      }
	}
    _section.find('div.results-list.a-z-category').show();
  }
}

/* Media Release START */
function getCatName(catPath) {
  var catOpt = $('#mediaReleaseCategories').find('[value="'+catPath+'"]');
  if (catOpt.length > 0)
    return catOpt[0].label;
  return  catPath.substring(('/' + catPath).lastIndexOf('/'));
}
function pageMediaUI(pg, ipp, t) {
  var wrap = $(t).closest('.media-releases');
  var res = wrap.children('.results-list');
  var cat = getParam('mr-cat');
  var catTxt = getCatName(cat);
  res.children('article').hide();
  setParam('mr-pg', pg);
  addUIPaging('pageMediaUI', res, 'article' + (cat ? '[data-cat*="' + cat + '"]' : ''), ipp, pg, catTxt);
}
function filterResults(catSel) {
  var cat = catSel.value;
  setParam('mr-cat', cat);
  pageMediaUI(1, 10, catSel);
}
function sortResults(sortSel) {
  var wrap = $(sortSel).closest('.media-releases');
  var res = wrap.children('.results-list');
  var sort = sortSel.value.split('-');
  var x = 1;
  if (sort[1] && sort[1] == 'desc') x = -1;
  res.append(res.children('article').sort(function(a, b) {
    return $(a).data(sort[0]).toLowerCase().trim() > $(b).data(sort[0]).toLowerCase().trim() ? x : -x
  }));
  setParam('mr-sort', sortSel.value);
  pageMediaUI(1, 10, sortSel);
}
/* Media Release END */

/* Finder START */
function closeFinder(t) {
  var s = $(t).closest('section.finder');
  s.find('button[role=tab]').attr('aria-selected',false);
  s.find('div[role=tabpanel]').attr('hidden', true);
}

function finderGetDetails(t) {
  var p = $(t).closest('div[role=tabpanel]');
  var det = {
    'title': $('#' + (p.attr('aria-labelledby'))).text().trim()
  };
  det.name = det.title.replace(/[^A-Za-z]/g, '').toLowerCase();
  det.namepg = det.name + '-pg';
  det.elCat = p.find('.panel-content.categories');
  det.elRes = p.find('.panel-content.results');
  if (det.elRes.length < 1) {
    p.append('<div class="panel-content results"></div>');
    det.elRes = p.find('.panel-content.results');
  }
  return det;
}

function finderBackToCats(t) {
  var det = finderGetDetails(t);
  var focus = getParam(det.name);
  removeParam(det.name);
  removeParam(det.namepg);
  det.elRes.hide();
  det.elCat.show();
  det.elCat.find('[data-name="' + focus + '"]').focus();
}

function finderGetResults(t, cat) {
  var det = finderGetDetails(t);
  if (det.elCat.length > 0) setParam(det.name, cat);
  removeParam(det.namepg);
  finderRenderResults(det);
  return false;
}

function finderAddPaging(det) {
  var pgnav = det.elRes.find(".pagination-wrapper nav");
  if (pgnav.length == 1) {
    var cpg = parseInt(pgnav.children('.currentPage').text());
    var tpg = parseInt(pgnav.children('.totalPages').text());
    var ipp = parseInt(pgnav.children('.itemsPerPage').text());
    var pages = "";
    if (tpg > 1) {
      if (cpg > 1) pages += [{
        'fn': 'finderGetPage',
        'pg': (cpg - 1),
        'ipp': ipp
      }].map(pgPrev).join('');
      pages += '<ul>';
      var x = 1;
      var show = 2;
      if (cpg == 2 || cpg == (tpg - 1)) show = 3;
      else if (cpg == 1 || cpg == (tpg)) show = 4;

      if (x == cpg) pages += [{
        'pg': x
      }].map(pgLiCur).join('');
      else pages += [{
        'fn': 'finderGetPage',
        'pg': x,
        'ipp': ipp
      }].map(pgLi).join('');
      var needDots = true;
      for (x = 2; x < tpg; x++) {
        if (x == cpg) {
          pages += [{
            'pg': x
          }].map(pgLiCur).join('');
          needDots = true;
        } else if (Math.abs(x - cpg) < show) {
          pages += [{
            'fn': 'finderGetPage',
            'pg': x,
            'ipp': ipp
          }].map(pgLi).join('');
          needDots = true;
        } else if (needDots) {
          pages += ell;
          needDots = false;
        }
      }
      var x = tpg;
      if (x == cpg) pages += [{
        'pg': x
      }].map(pgLiCur).join('');
      else pages += [{
        'fn': 'finderGetPage',
        'pg': x,
        'ipp': ipp
      }].map(pgLi).join('');
      pages += '</ul>';
      if (cpg < tpg) pages += [{
        'fn': 'finderGetPage',
        'pg': (cpg + 1),
        'ipp': ipp
      }].map(pgNext).join('');
    }
    pgnav.html(pages);
  }
  UpdateLinks(det.elRes);
}

function finderShowResults(det) {
  det.elCat.hide();
  finderAddPaging(det);
  det.elRes.show();
  det.elRes.find('.selected-filter').focus();
}

function finderRenderResults(det) {
  var cat = getParam(det.name);
  if (!cat) cat = det.elRes.data('cat');
  if (cat) {
    var title = det.elCat.find('[data-name="' + cat + '"]').text();
    if (!title) title = cat;
    var id = det.elCat.children('ul').data('menuid').trim();
    if (!id) id = det.elRes.data('menuid').trim();
    var urlParams = new URLSearchParams('source=library&srv=cmpnt&cmpntid=' + id);
    urlParams.set('cat', cat);
    urlParams.set('title', title);
    urlParams.set('type', det.title);
    var pg = getParam(det.namepg);
    if (pg) urlParams.set('WCM_Page.' + id, pg);
    det.elRes.load(baseURL + '?' + urlParams.toString(), function() {
      finderShowResults(det);
    });
  } else {
    det.elRes.hide();
    det.elCat.show();
    det.elCat.parent().focus();
  }
}
function finderGetPage(page, ipp, t) {
  var det = finderGetDetails(t);
  setParam(det.namepg, page);
  finderRenderResults(det);
}
/* Finder END */

/* Partial refresh paging */
function addPaging(fnName, parentSelector) {
  if ($(parentSelector + " .pagination-wrapper").length == 1) {
    var c = parseInt($(parentSelector + " .pagination-wrapper .currentPage").text());
    var t = parseInt($(parentSelector + " .pagination-wrapper .totalPages").text());
    var i = parseInt($(parentSelector + " .pagination-wrapper .itemsPerPage").text());
    var pages = "";
    if (t > 1) {
      if (c > 1) pages += '<div class="pagingation-prev-wrapper"><a class="pagination-item pagination-nav previous" aria-label="Go to page ' + (c - 1) + '" href="#" onclick="' + fnName + '(' + (c - 1) + ');return false;">Previous</a></div>';
      pages += '<ul>';
      var x = 1;
      var show = 2;
      if (c == 2 || c == (t - 1)) show = 3;
      else if (c == 1 || c == (t)) show = 4;

      if (x == c) pages += '<li><a class="pagination-item" aria-current="true" aria-label="Page ' + x + ', Current Page">' + x + '</a></li>';
      else pages += '<li><a class="pagination-item" href="#" onclick="' + fnName + '(' + x + ');return false;" aria-label="Go to page ' + x + '">' + x + '</a></li>';
      var needDots = true;
      for (x = 2; x < t; x++) {
        if (x == c) {
          pages += '<li><a class="pagination-item" aria-current="true" aria-label="Page ' + x + ', Current Page">' + x + '</a></li>';
          needDots = true;
        } else if (Math.abs(x - c) < show) {
          pages += '<li><a class="pagination-item" href="#" onclick="' + fnName + '(' + x + ');return false;" aria-label="Go to page ' + x + '">' + x + '</a></li>';
          needDots = true;
        } else if (needDots) {
          pages += ell;
          needDots = false;
        }
      }
      var x = t;
      if (x == c) pages += '<li><a class="pagination-item" aria-current="true" aria-label="Page ' + x + ', Current Page">' + x + '</a></li>';
      else pages += '<li><a class="pagination-item" href="#" onclick="' + fnName + '(' + x + ');return false;" aria-label="Go to page ' + x + '">' + x + '</a></li>';
      pages += '</ul>';

      if (c < t) pages += '<div class="pagingation-next-wrapper"><a class="pagination-item pagination-nav next" aria-label="Go to page ' + (c + 1) + '" href="#" onclick="' + fnName + '(' + (c + 1) + ');return false;">Next</a></div>';
    }
    $(parentSelector + " .pagination-wrapper nav").html(pages);
  }
}

/* Adds hover text to new window and external links */
function UpdateLinks(parent) {
  /* force wcm links lowercase */
  parent.find('a[href^="/wps/wcm/"').each(function(i, e) {
    var url = $(e).attr('href'); var q = '';
    if (url.indexOf('?') >-1) {
      q = url.substr(url.indexOf('?'));
      url = url.substr(0,url.indexOf('?'));
    }
    e.href = (url.toLowerCase()+q).replace(/ /g, '+').replace(/\/$/,'').replace('/?','?');
    $(e).attr('target', ''); /* force all internal links to same tab */
  });

  /* Old code to open in new window
  parent.find('a[target="_blank"]').attr('title', 'Link opens in a new window.');
  parent.find('a[href^="http"]').attr('target', '_blank').attr('title', 'Link to external site, opens in a new window.').addClass('external-link');*/
  /* New code to open in same */
  parent.find('a[target="_blank"]').attr('target',''); /* open ALL links in same window */
  parent.find('a[href^="http"]').attr('title', 'Link to external site.').addClass('external-link');
}

/* Autocomplete START */
var autoListTimeout = null, autoShowTimeout = null;
function searchAutocomplete(a,txt) {
  var form = $(a).closest('form');
  form.find('[name=q]').val(decodeURIComponent(txt.split('q=')[1].replace(/\+/g,' ')));
  form.submit();
  return false;
}
/* Autocomplete END */

/* Google Maps */
var customStyle = [{
  featureType: "water",
  elementType: "geometry",
  stylers: [{
    color: "#e9e9e9"
  }, {
    lightness: 17
  }]
}, {
  featureType: "landscape",
  elementType: "geometry",
  stylers: [{
    color: "#f5f5f5"
  }, {
    lightness: 20
  }]
}, {
  featureType: "road.highway",
  elementType: "geometry.fill",
  stylers: [{
    color: "#ffffff"
  }, {
    lightness: 17
  }]
}, {
  featureType: "road.highway",
  elementType: "geometry.stroke",
  stylers: [{
    color: "#ffffff"
  }, {
    lightness: 29
  }, {
    weight: .2
  }]
}, {
  featureType: "road.arterial",
  elementType: "geometry",
  stylers: [{
    color: "#ffffff"
  }, {
    lightness: 18
  }]
}, {
  featureType: "road.local",
  elementType: "geometry",
  stylers: [{
    color: "#ffffff"
  }, {
    lightness: 16
  }]
}, {
  featureType: "poi",
  elementType: "geometry",
  stylers: [{
    color: "#f5f5f5"
  }, {
    lightness: 21
  }]
}, {
  featureType: "poi.park",
  elementType: "geometry",
  stylers: [{
    color: "#dedede"
  }, {
    lightness: 21
  }]
}, {
  elementType: "labels.text.stroke",
  stylers: [{
    visibility: "on"
  }, {
    color: "#ffffff"
  }, {
    lightness: 16
  }]
}, {
  elementType: "labels.text.fill",
  stylers: [{
    saturation: 36
  }, {
    color: "#333333"
  }, {
    lightness: 40
  }]
}, {
  elementType: "labels.icon",
  stylers: [{
    visibility: "off"
  }]
}, {
  featureType: "transit",
  elementType: "geometry",
  stylers: [{
    color: "#f2f2f2"
  }, {
    lightness: 19
  }]
}, {
  featureType: "administrative",
  elementType: "geometry.fill",
  stylers: [{
    color: "#fefefe"
  }, {
    lightness: 20
  }]
}, {
  featureType: "administrative",
  elementType: "geometry.stroke",
  stylers: [{
    color: "#fefefe"
  }, {
    lightness: 17
  }, {
    weight: 1.2
  }]
}];
var customActiveStyle = [{
  elementType: "labels.icon",
  stylers: [{
    visibility: "off"
  }]
}];

function getOptions(lat, lng) {
  return {
    zoom: 16,
    zoomControl: false,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    fullscreenControls: true,
    streetViewControl: false,
    mapTypeControl: false,
    center: new google.maps.LatLng(lat, lng),
    styles: customStyle
  }
}
var geocoder;
var map;
var markers = [];

function initMaps() {
  var allMapPlaceholders = document.querySelectorAll('.map-wrapper');

  function createMap(mapPlaceholder) {
    var mapData = JSON.parse(mapPlaceholder.getAttribute('data-map').replace(/[\r\n]/g, '').replace(/},]/g, '}]'));
    var options = getOptions(+mapData[0].lat, +mapData[0].long);
    map = new google.maps.Map(mapPlaceholder, options);
    setUpList(mapData);
    for (var i = 0; i < mapData.length; i++) {
      addMapData(map, mapData[i]);
    }
  }

  for (var i = 0; i < allMapPlaceholders.length; i++) {
    createMap(allMapPlaceholders[i]);
  }

  function addMapData(mapElement, element) {
    var contentString = '<div class="map-popup">';
    contentString += '<div class="contact-detail"><a href="'+element.link+'"><h4>'+element.name+'</h4></a></div>';
    contentString += '<div class="contact-detail"><a href="https://www.google.com.au/maps?q='+element.lat+','+element.long+'" target="_blank" >'+element.address+'</a></div>';
    if(element.phone) {
      contentString += '<div class="contact-detail">Phone: ';
      contentString += '<a href="tel:'+element.phone+'">'+element.phone+'</a>';
      contentString += '</div>';
    }
    if(element.referral)
      contentString += '  <div class="chip-container"><span class="chip">'+element.referral+'</span></div>';



    if(element.email)
      contentString += '<div class="contact-detail">Email: <a href="mailto:'+element.email+'" >'+element.email+'</a></div>';
    if(element.fax)
      contentString += '<div class="contact-detail">Fax: <a href="fax:'+element.fax+'">'+element.fax+'</a></div>';

    contentString += '</div></div>';

    var infowindow = new google.maps.InfoWindow({
      content: contentString
    });

    var o_latlng = new google.maps.LatLng(element.lat, element.long);

    var svgCol = svg;
    if (element.primary)
      svgCol = '<svg version="1.1" width="40" height="40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 434.2 434.2" style="enable-background:new 0 0 434.2 434.2;" xml:space="preserve"><style type="text/css">.map-pin{fill:#' + (element.onprimary ? element.onprimary : 'FFFFFF') + ';}</style><g><path style="fill:#' + (element.primary ? element.primary : '3A75D3') + ';" d="M217.1,0C125.2,0,50.5,74.7,50.5,166.6c0,38.9,13.4,74.8,35.9,103.2l130.7,164.4l130.7-164.4 c22.5-28.4,35.9-64.2,35.9-103.2C383.7,74.7,309,0,217.1,0z M217.1,239.4c-41.4,0-75-33.6-75-75s33.6-75,75-75s75,33.6,75,75 S258.4,239.4,217.1,239.4z"/><circle class="map-pin" cx="217.1" cy="164.4" r="75.5"/></g></svg>';

    var marker = new google.maps.Marker({
      position: o_latlng,
      map: mapElement,
      title: element.name,
      icon: {
        url: 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svgCol),
        scaledSize: new google.maps.Size(40, 40)
      },
      closeBoxMargin: "10px 20px 2px 2px"
    });

    google.maps.event.addListener(marker, 'click', function() {
      infowindow.open(mapElement, marker);
      changeMapToDefaultStyles(mapElement);
    });
    markers.push(marker);

    setMapListeners(['click', 'dragstart'], mapElement);

  }
  var mapChangedOptions = myOptions = {
    zoomControl: true,
    gestureHandling: 'greedy',
    fullscreenControls: true,
    streetViewControl: false,
    mapTypeControl: false,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    styles: customActiveStyle
  }

  function setMapListeners(eventTypes, mapToListenTo) {
    var mapIsShowingDefaultStyles = false;
    var i;
    for (i = 0; i < eventTypes.length; i++) {
      if (!mapIsShowingDefaultStyles) {
        google.maps.event.addListener(mapToListenTo, eventTypes[i], function(e) {
          changeMapToDefaultStyles(this);
        });
      } else {
        return;
      }
    }
  }

  function changeMapToDefaultStyles(mapToChangeStyles) {
    mapToChangeStyles.setOptions(mapChangedOptions);
    mapIsShowingDefaultStyles = true;
  }
}

var mapIsActive = false;

function codeAddress(autocompleteAddress) {
  if (!mapIsActive) {
    mapIsActive = true;
  }
  var address = document.getElementById("location-search").value;
  if (autocompleteAddress) {
    toggleMapIsActive(address, true);
    map.setCenter(autocompleteAddress.geometry.location);
    var canSee = false;
    var zoom = 14;
    setTimeout(function() {
      map.setZoom(zoom);
      while (!canSee && zoom > 7) {
        markers.forEach(function(a) {
          canSee = canSee || map.getBounds().contains(a.position)
        });
        zoom -= 1;
        map.setZoom(zoom);
      }
    }, 500);
  } else {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode({
      'address': address,
      componentRestrictions: {
        country: 'AU',
        administrativeArea: 'SA'
      }
    }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        toggleMapIsActive(address, true);
        map.setCenter(results[0].geometry.location);
        var canSee = false;
        var zoom = 14;
        setTimeout(function() {
          map.setZoom(zoom);
          while (!canSee && zoom > 7) {
            markers.forEach(function(a) {
              canSee = canSee || map.getBounds().contains(a.position)
            });
            zoom -= 1;
            map.setZoom(zoom);
          }
        }, 500);
      } else {
        toggleMapIsActive(true, false);
        alert("Please use a valid address in South Australia.");
      }
    });
  }
}

function toggleMapIsActive(query, queryIsValid) {
  var mapPanel = $('#map-results-panel');
  var currentQueryText = $('#current-map-query');
  var mapSearchForm = $('#finder-search-button').parents('.find-site-panel');

  if (queryIsValid) {
    mapSearchForm.hide();
    mapPanel.show();
    currentQueryText.text(query);
  } else {
    mapSearchForm.show();
    mapPanel.hide();
    currentQueryText.text(query);
  }
}

function setUpList(mapData) {
  var mapList = document.getElementById("maps-site-list");
  if (mapList) {
    $(mapList).prepend('<button tabindex="0" class="icon-button finder-close" onClick="closeFinder(this)" data-active="true"><svg version="1.1" aria-label="close icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 47.971 47.971" style="enable-background:new 0 0 47.971 47.971;" xml:space="preserve"><g><path d="M28.228,23.986L47.092,5.122c1.172-1.171,1.172-3.071,0-4.242c-1.172-1.172-3.07-1.172-4.242,0L23.986,19.744L5.121,0.88 c-1.172-1.172-3.07-1.172-4.242,0c-1.172,1.171-1.172,3.071,0,4.242l18.865,18.864L0.879,42.85c-1.172,1.171-1.172,3.071,0,4.242 C1.465,47.677,2.233,47.97,3,47.97s1.535-0.293,2.121-0.879l18.865-18.864L42.85,47.091c0.586,0.586,1.354,0.879,2.121,0.879 s1.535-0.293,2.121-0.879c1.172-1.171,1.172-3.071,0-4.242L28.228,23.986z"></path></g></svg></button>');
    addUIPaging('pageUI', $(mapList).find('.panel-content__results-list'), 'li');
  }
}

function changeSiteListActive() {
  var tabs = $('[role="tab"]');
  var panels = $('[role="tabpanel"]');
  tabs.each(function(i, element) {
    element.setAttribute('tabindex', '-1');
    element.setAttribute('aria-selected', 'false');
  })
  panels.each(function(i, element) {
    element.setAttribute('hidden', 'true');
  })
  panels[1].removeAttribute('hidden');
  tabs[1].setAttribute('tabindex', '0');
  tabs[1].setAttribute('aria-selected', 'true');
}

function distance(lat1, lon1, lat2, lon2) {
  if ((lat1 == lat2) && (lon1 == lon2)) {
    return 0;
  } else {
    var radlat1 = Math.PI * lat1 / 180;
    var radlat2 = Math.PI * lat2 / 180;
    var theta = lon1 - lon2;
    var radtheta = Math.PI * theta / 180;
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    if (dist > 1) {
      dist = 1;
    }
    dist = Math.acos(dist);
    dist = dist * 180 / Math.PI;
    dist = dist * 60 * 1.1515 * 1.609344;
    return dist;
  }
}
var serviceResultHeader = function(o) {
  return '<h3>Displaying all results' + (o.cat ? " for selected service <span class='query'>'" + o.cat + "'" : "") + '</span>&nbsp;near&nbsp;<span class="query">\'' + o.loc + '\'</span></h3>';
};
var serviceNoResultHeader = function(o) {
  return '<h3>' + (o.msg ? o.msg : "No results found" + (o.cat ? " for selected service <span class='query'>'" + o.cat + "'" : "") + "</span>&nbsp;near&nbsp;<span class='query'>'" + o.loc + "'</span>") + '</h3>';
};

function filterServicePostcode() {
  var loc = $("#postcode").val();
  var lat = parseFloat(getParam('lat'));
  var lng = parseFloat(getParam('lng'));
  var cat = $("#selectServiceFinder").val();
  var catTxt = $("#selectServiceFinder option:selected").text();
  setParam('s_loc', loc);
  setParam('s_cat', cat);
  var res = $('.panel-content--location-search .panel-content__results-list');
  var pg = $('.panel-content--location-search .pagination-wrapper');
  var all = res.children('li');
  res.hide();
  pg.hide();
  all.hide();
  all.attr('aria-show', 'false');

  var filtered = all.filter(function() {
    return !(cat && $(this).data('cat').indexOf("~"+cat+"~") < 0)
  });
  if (!loc) {
    $('.panel-content--location-search .panel-content__results-header').html([{
      'cat': '',
      'loc': '',
      'msg': 'Please provide a location'
    }].map(serviceNoResultHeader).join(''));
    res.closest('[role="tabpanel"]').focus();
  } else if (filtered.length < 1) {
    $('.panel-content--location-search .panel-content__results-header').html([{
      'cat': (catTxt),
      'loc': loc,
      'msg': ''
    }].map(serviceNoResultHeader).join(''));
    res.closest('[role="tabpanel"]').focus();
  } else if (lat && lng) {
    filtered.each(function(i, a) {
      $(a).attr('aria-show', 'true');
      var dist = distance(lat, lng, $(a).data('lat'), $(a).data('lng'));
      if ($(a).data('important') == 'True') $(a).attr('data-dist', '-1');
      else {
        $(a).attr('data-dist', dist);
        var distStr = '';
        if (dist < 1) distStr = (Math.round(dist * 1000)).toFixed(0) + ' m';
        else if (dist < 10) distStr = (Math.round(dist * 10.0) / 10).toFixed(1) + ' km';
        else distStr = Math.round(dist).toFixed(0) + ' km';
        var p = $(a).find('.service-item__address');
        p.children('strong').remove();
        p.append('<strong>' + distStr + '</strong>');
      }
    });

    $('.panel-content--location-search .panel-content__results-header').html([{
      'cat': (catTxt),
      'loc': loc
    }].map(serviceResultHeader).join(''));
    $('.panel-content--location-search .panel-content__results-list').prepend($('.panel-content--location-search .panel-content__results-list li[aria-show=true]').sort(function(a, b) {
      if (a.getAttribute('data-dist') < 0 && b.getAttribute('data-dist') < 0)
        return (($(a).find('h3').text().trim().toLowerCase()) > ($(b).find('h3').text().trim().toLowerCase())) ? 1 : -1;
      else return a.getAttribute('data-dist') - b.getAttribute('data-dist')
    }));
    addUIPaging('pageUI', $('.panel-content--location-search .panel-content__results-list'), 'li[aria-show=true]', 10);
    res.show();
    pg.show();
    res.closest('[role="tabpanel"]').focus();
  } else {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode({
      'address': loc,
      componentRestrictions: {
        country: 'AU',
        administrativeArea: 'SA'
      }
    }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        loc = results[0].formatted_address;
        lat = results[0].geometry.location.lat();
        lng = results[0].geometry.location.lng();
        setParam('s_loc', loc);
        setParam('lat', lat);
        setParam('lng', lng);
        filtered.each(function(i, a) {
          $(a).attr('aria-show', 'true');
          var dist = distance(lat, lng, $(a).data('lat'), $(a).data('lng'));
          if ($(a).data('important') == 'True') $(a).attr('data-dist', '-1');
          else {
            $(a).attr('data-dist', dist);
            var distStr = '';
            if (dist < 1) distStr = (Math.round(dist * 1000)).toFixed(0) + ' m';
            else if (dist < 10) distStr = (Math.round(dist * 10.0) / 10).toFixed(1) + ' km';
            else distStr = Math.round(dist).toFixed(0) + ' km';
            var p = $(a).find('.service-item__address');
            p.children('strong').remove();
            p.append('<strong>' + distStr + '</strong>');
          }
        });

        $('.panel-content--location-search .panel-content__results-header').html([{
          'cat': (catTxt),
          'loc': loc
        }].map(serviceResultHeader).join(''));
        $('.panel-content--location-search .panel-content__results-list').prepend($('.panel-content--location-search .panel-content__results-list li[aria-show=true]').sort(function(a, b) {
          if (a.getAttribute('data-dist') < 0 && b.getAttribute('data-dist') < 0)
            return (($(a).find('h3').text().trim().toLowerCase()) > ($(b).find('h3').text().trim().toLowerCase())) ? 1 : -1;
          else return a.getAttribute('data-dist') - b.getAttribute('data-dist')
        }));
        addUIPaging('pageUI', $('.panel-content--location-search .panel-content__results-list'), 'li[aria-show=true]', 10);
        res.show();
        pg.show();
        res.closest('[role="tabpanel"]').focus();
      } else {
        $('.panel-content--location-search .panel-content__results-header').html([{
          'cat': '',
          'loc': loc,
          'msg': 'Could not find that location, please try again'
        }].map(serviceNoResultHeader).join(''));
        res.closest('[role="tabpanel"]').focus();
      }
    });
  }
}

/* called after google maps API loads */
function setupMaps() {
  var defaultBounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(-38.5, 129),
    new google.maps.LatLng(-25.9, 141));
  var options = {
      bounds: defaultBounds,
      fields: ["formatted_address", "geometry", "name"],
      strictBounds: true
    };

  initMaps();

  if (document.getElementById('postcode')) {
    var searchInput = document.getElementById('postcode');
    searchInput.onkeydown = (function(event) {
      if (event.keyCode == 13) {
        event.preventDefault();
        filterServicePostcode();
        return false;
      }
    });
    var autocomplete = new google.maps.places.Autocomplete(searchInput, options);
    autocomplete.addListener('place_changed', function() {
      var place = autocomplete.getPlace();
      if (place && place.geometry) {
        setParam('lat', place.geometry.location.lat());
        setParam('lng', place.geometry.location.lng());
        filterServicePostcode();
      }
    });
  }

  if (document.getElementById('location-search')) {
    var searchInput = document.getElementById('location-search');
    searchInput.onkeydown = (function(event) {
      if (event.keyCode == 13) {
        event.preventDefault();
        codeAddress();
        return false;
      }
    });
    var autocomplete = new google.maps.places.Autocomplete(searchInput, options);
    autocomplete.addListener('place_changed', function() {
      var place = autocomplete.getPlace();
      codeAddress(place);
    });
  }
}

/* iFrame manager */
var iframeid = 0;
$('iframe').on('load', function(a, b) {
  try {
    /* resize when iframe content size changes */
    setTimeout(function() {
      var iframeWin = this.contentWindow || ( this.contentDocument ? this.contentDocument.parentWindow : null);
      if(iframeWin && iframeWin.document.body.scrollHeight > 0)
        $(this).height(iframeWin.document.body.scrollHeight + 'px');
      if(iframeWin) {
        $(iframeWin).on('resize', function() {
          if(this.document.body.scrollHeight > 0)
            $(this.frameElement).height(this.document.body.scrollHeight + 'px');
        });
     }
    }, 100);    
  } catch (e) {
    if (!this.id) {
      this.id = "iframe" + iframeid;
      iframeid++;
    }
    iFrameResize({
      /* allow for external iFrames, iframe must load iframeResizer.contentWindow.min.js */
      inPagteLinks: true,
      heightCalculationMethod: 'bodyScroll'
    }, this.id);
  }
});
$(window).on('resize', function() {
  $('iframe').each(function() {
    /* resize when main window size changes */
    var iframeWin = this.contentWindow || this.contentDocument.parentWindow;
    try {
      $(this).height(iframeWin.document.body.scrollHeight + 'px');
    } catch (e) {}
  });
});


  /* START RECITEME */
  var setupReciteButtons = true;
  var serviceUrl = "//auapi.reciteme.com/asset/js?key=";
  var serviceKey = "536b754b293d9834d9d7301d88154bca6608c543";
  //OLD  var serviceKey = "000df56317caba8bf563c50a02cb51b62ca8957b";
  //Previously gave 403: "536b754b293d9834d9d7301d88154bca6608c543";
  var rmopts = { showBrand: false, Controls: { Core: { zoomThreshold: 100 } }, Tracker: {Ga: {enabled:true}} };
  var autoLoad = false;
  var enableFragment = "#reciteEnable";
  var showLangDrop = false;
  var loaded = [], frag = !1; window.location.hash === enableFragment && (frag = !0); function loadScript(c, b) { var a = document.createElement("script"); a.type = "text/javascript"; a.readyState ? a.onreadystatechange = function () { if ("loaded" == a.readyState || "complete" == a.readyState) a.onreadystatechange = null, void 0 != b && b() } : void 0 != b && (a.onload = function () { b() }); a.src = c; document.getElementsByTagName("head")[0].appendChild(a) } function _rc(c) { c += "="; for (var b = document.cookie.split(";"), a = 0; a < b.length; a++) { for (var d = b[a]; " " == d.charAt(0);)d = d.substring(1, d.length); if (0 == d.indexOf(c)) return d.substring(c.length, d.length) } return null } function loadService(c) { for (var b = serviceUrl + serviceKey, a = 0; a < loaded.length; a++)if (loaded[a] == b) return; loaded.push(b); loadScript(serviceUrl + serviceKey, function () { "function" === typeof _reciteLoaded && _reciteLoaded(); "function" == typeof c && c(); Recite.load(rmopts); Recite.Event.subscribe("Recite:load", function () { $('clevertar-chat').attr('data-recite-skip','true');Recite.enable() }) }) } "true" == _rc("Recite.Persist") && loadService(); (autoLoad && "false" != _rc("Recite.Persist") || frag) && loadService();

  function waitForElementToDisplay(selector, callback, checkFrequencyInMs, timeoutInMs) {
    var startTimeInMs = Date.now();
    (function loopSearch() {
      if (document.querySelector(selector) != null) {
        callback();
        return;
      }
      else {
        setTimeout(function () {
          if (timeoutInMs && Date.now() - startTimeInMs > timeoutInMs)
            return;
          loopSearch();
        }, checkFrequencyInMs);
      }
    })();
  }

  function loadShowLang(){
    waitForElementToDisplay("#recite-toolbar-button-language", function(){
      setTimeout(function() {
        $('#recite-toolbar-button-language').focus();
        $('#recite-toolbar-button-language').click();
      }, 100);
    },100,20000);
  }

  function _reciteLoaded() {
    /* only show when banner not displayed */
    if (setupReciteButtons && _rc("Recite.Persist") != "true") {
      setupReciteButtons = false;
      $('.accessibility-section').removeClass('hidden');
      $('.reciteme').css('display','');

      Recite.Event.subscribe("Preferences:load",function(){
        if (Recite.Preferences.get('language'))
          Recite.Language.Translate.translate(document.body, Recite.Preferences.get('language'));
      });
      Recite.Preferences.load();

      // Bind to select element click
      $('.myEle.lang').click(function () {
        var lang = $(this).data('lang');
        $('.lang-btn').removeClass('show');
        $('.language-options').removeClass('show');
        $('clevertar-chat').attr('data-recite-skip','true');
        Recite.Preferences.set('language',lang);
        Recite.Language.Translate.translate($('BODY')[0], lang);
      });
      $('.myEle.more').click(function () {
        var lang = $(this).data('lang');
        $('.lang-btn').removeClass('show');
        $('.language-options').removeClass('show');
        $('clevertar-chat').attr('data-recite-skip','true');
        loadService(loadShowLang);
        if ("function" === typeof _reciteLoaded) {
          loadShowLang();
        }
      });
      $('.lang-btn').click(function(){
        var t = $(this);
        var lo = t.closest('.lang').siblings('.language-options');
        if(t.hasClass('show')) {
          lo.removeClass('show');
          t.removeClass('show');
        } else {
          lo.addClass('show');
          t.addClass('show');
        }
      });
      $('.reciteme button').click(function(){
        $('.lang-btn').removeClass('show');
        $('.language-options').removeClass('show');
        $('clevertar-chat').attr('data-recite-skip','true');
        $('.accessibility-section').addClass('hidden');
        loadService();
        return false;
      });
    }
    $('clevertar-chat').attr('data-recite-skip','true');
    var ttsIgnore = document.getElementById('clWidget');
    if(ttsIgnore) {
      ttsIgnore.setAttribute('data-recite-skip', 'true');
    }
  }
  function _removeBtns(btns) {
    Recite.Util.each(btns, function (id, btn) {
      Recite.Util.each(Recite.Sizzle(".recite-sprite-button-" + btn), function (id, element) {
        element.remove();
      });
    });
  }
  /* END RECITEME*/


/* Exposure Locations START */
  var lt = null;
  function toJSDate(serial) {
    var utc_days  = Math.floor(serial - 25569);
    var utc_value = utc_days * 86400;                                        
    var date_info = new Date(utc_value * 1000);
    var fractional_day = serial - Math.floor(serial) + 0.0000001;
    var total_seconds = Math.floor(86400 * fractional_day);
    var seconds = total_seconds % 60;
    total_seconds -= seconds;
    var hours = Math.floor(total_seconds / (60 * 60));
    var minutes = Math.floor(total_seconds / 60) % 60;
    return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);
  }
  function getN(cell) {
    var str = 0;
    if(cell !== null)
      if(!isNaN(cell.v))
        str = Number(cell.v);
    return str;
  }
  function getT(cell) {
    var str = "";
    if(cell !== null)
      str += cell.v;
    return str.trim();
  }
  function getRT(cell, head) {
    var str = "";
    if(cell !== null) {
      if( typeof cell.h !== 'undefined')
        str += cell.h;
      else if( typeof cell.r !== 'undefined')
        str += cell.r;
      else
        str += cell.v;

      if( typeof cell.l !== 'undefined') {
        if(cell.l.Target.substr(0,5).toLowerCase() == '?head')
          str = '<a href="#" onClick="scrollToHeading('+cell.l.Target.substr(6)+');return false;">' + str + '</a>';
        else if(cell.l.Target.substr(0,1).toLowerCase() == '#')
          str = '<a href="'+cell.l.Target+'" onClick="$('+cell.l.Target+')[0].scrollIntoView({behavior: "smooth", block: "start"});return false;">' + str + '</a>';
        else
          str = '<a href="'+cell.l.Target+'">' + str + '</a>';
      }
    }
    return str.trim().replace('\r\n','<br/>').replace('\n','<br/>');
  }

  function getH2Link(cell) {
    var str = "";
    if(cell !== null) {
      str = (''+cell.v).trim();
      var h = $(".page-contents-list a:contains('"+str+"')");
      if(h.length > 1) {
        h = $(".page-contents-list a:contains('Tier "+str+"')");
      }
      if(h.length > 0) {
        str = '<a href="'+h[0].hash+'">'+h[0].innerText.trim()+'</a>';
      }
    }
    return str.trim().replace('\r\n','<br/>').replace('\n','<br/>');
  }

  function scrollToHeading(txt) {
	$(".page-contents-list a:contains('"+txt+"')").click();
  }
  function getDT(cell, fmt) {
    var str = "";
    if(cell !== null) {
      str = moment(toJSDate(cell.v)).format(fmt);
    }
    return str;
  }
  function getDoT(cell, fmtD, fmtT) {
    var str = "";
    if(cell !== null) {
      var dt = moment(toJSDate(cell.v));
      str = dt.format(fmtD);
      if(dt.format("HH:mm") !== '00:00')
        str += ' ' + dt.format(fmtT);
    }
    return str;
  }
  function getDTA(cellS, cellE, fmt) {
    var str = "";
    if(cellS !== null) {
      var s = Math.floor(cellS.v);
      var e = s;
      if(cellE !== null)
        e = Math.floor(cellE.v);
      for(var i=s; i<=e; i++)
        str += moment(toJSDate(i)).format(fmt) + ' ';
    }
    return str;
  }
  function getDTR(cellS, cellE, fmtD, fmtT) {
    var str = "";
    if(cellS !== null) {
      str = moment(toJSDate(cellS.v)).format(fmtD);
      str += '<br/>' + moment(toJSDate(cellS.v)).format(fmtT);
      if(cellE !== null) {
        str += ' - ';
        if (Math.floor(cellS.v) < Math.floor(cellE.v))
          str += '<br/>' + moment(toJSDate(cellE.v)).format(fmtD)+'<br/>';
        str += moment(toJSDate(cellE.v)).format(fmtT);
      }
    }
    return str;
  }
  function expSearch(t) {
    var p = $(t).closest('.media-release-controls');
    var suburb = $.fn.dataTable.util.escapeRegex(p.find('#locationSuburbs').val());
    if(suburb == '') suburb = '.*';
    var dateS = p.find('#exposureDate').val();
    if (dateS != '') dateS = moment(dateS, "ddd D MMMM YYYY").format("YYYY-MM-DD");
    lt.column(2).search(dateS).column(0).search('^'+suburb+'$',true,false).draw();
  }
  function expSearchClear(t) {
    var p = $(t).closest('.media-release-controls');
    p.find('#locationSuburbs').val('');
    p.find('#exposureDate').val('');
    lt.column(0).search('').column(2).search('').draw();
  }
/* Exposure Locations END */

$(function() {
    $('#map-results-panel').css('display', 'none');

    /* Alert Banner START */
    var ab = $(".alert-banner");
    if (ab.data('key') !== localStorage.getItem('closed-alert-banner')) {
      $(".alert-banner").show();
      ab.find('.close-alert').click(function() {
        localStorage.setItem('closed-alert-banner', ab.data('key'));
      });
    } else {
      ab.remove();
    }
    /* Alert Banner END */

    /* SORT: Popular Searches / Trending Topics / Related Information START */
    $('.results-list,.au-link-list,.panel-content__results-list').each(function() {
      var list = $(this);
      if (list.children().length < 1) {
        list.prev('h2').remove();
        list.remove();
      } else if (list.children(':first').data('text')) {
        list.children().sort(function(a, b) {
          return ($(a).data('text').toLowerCase()) > ($(b).data('text').toLowerCase()) ? 1 : -1;
        }).appendTo(list);
        sort = list.data('sort');
        if (sort) {
          ('' + sort).split(',').reverse().forEach(function(i) {
            list.children('[data-order="' + i.trim() + '"]').prependTo(list);
          });
        }
      }
    });
    $('.popular-searches').each(function() {
      if ($(this).find('a').length < 1) $(this).remove();
    });
    /* SORT: Popular Searches / Trending Topics / Related Information END */
    
    /* Latest News START */
    $('.newsCategories').each(function(i, n) {
      n.innerText.split('~').forEach(function(a) {
        var found = false;
        if (!found && a.indexOf('/News Types/') > 0){
          n.innerText = (a.substr(a.lastIndexOf('/') + 1));
          n.style.display = '';
          found = true;
        }
      });
    });
    /* Latest News END */

    /* Load results */
    $('ul.panel-content__results-list--location[data-menuid*="-"]').each(function() {
      var url = baseURL + '?source=library&srv=cmpnt&cmpntid=' + $(this).data('menuid').trim();
      var p = $(this);
      p.load(url, function() {
        p.find(".show-hide").tipso({
          position: "bottom",
          size: "small",
          background: "#FFFFFF",
          color: "#000000",
          speed: 200,
        }), p.find(".tool-tip").keydown((function(t) {
          27 !== t.keyCode && 13 !== t.keyCode && 32 !== t.keyCode || ($(this).hasClass("clicked") && ($(this).removeClass("clicked"),
            $(this).find(".show-hide").tipso("hide")), t.preventDefault()), 13 !== t.keyCode && 32 !== t.keyCode || ($(this).addClass("clicked"), $(this).find(".show-hide").tipso("show"), t.preventDefault())
        })), p.find(".tool-tip").on("click", (function(t) {
          $(this).hasClass("clicked") ? ($(this).removeClass("clicked"), $(this).find(".show-hide").tipso("hide")) : ($(this).addClass("clicked"), $(this).find(".show-hide").tipso("show")), t.preventDefault()
        }));
        $("#selectServiceFinder").val(getParam('s_cat'));
        $("#postcode").val(getParam('s_loc'));
        if (getParam('lat') && getParam('lng')) filterServicePostcode();
        UpdateLinks(p);
      });
    });
    /* A-Z lists */
    $('#a-z-key-list').each(function() {
      var _header = $(this);
      var _section = _header.closest('section');
      var _results = _section.find('div.results-list.a-z-category');
      if (!_results.data('menuid')) setUpAZ(_header, _section, _results);
      else {
        var url = baseURL + '?source=library&srv=cmpnt&cmpntid=' + _results.data('menuid').trim();
        if (_results.data('cat') && _results.data('limit') == true) {
          var cats = "&findcat=" + encodeURIComponent(_results.data('cat'));
          if (url.length+cats.length > 2000) {
              cats = {'findcat': _results.data('cat')};
              _results.load(url, cats, function() {
                setUpAZ(_header, _section, _results);
                UpdateLinks(_results);
              });
          } else {
              url = url+cats;
              _results.load(url, function() {
                setUpAZ(_header, _section, _results);
                UpdateLinks(_results);
              });
          }
        } else {
          _results.load(url, function() {
            setUpAZ(_header, _section, _results);
            UpdateLinks(_results);
          });
        }
      }
    });
    
    /* Media releases */
    $('.media-releases').each(function() {
      var wrap = $(this);
      var res = wrap.children('.results-list');
      var catSel = wrap.children('.media-release-results-header').find('.category');
      var sortSel = wrap.children('.media-release-results-header').find('.sort');
      catSel.children('option').each(function() {
        if (!this.text) {
          var p = $(this);
          var vs = this.value.split(',');
          vs.sort(function(a,b){
            var t1 = (a.substring(('/'+a).lastIndexOf('/'))).toLowerCase();
            var t2 = (b.substring(('/'+b).lastIndexOf('/'))).toLowerCase();
            return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
          });
          vs.forEach(function(a,i){
            p.after('<option value="'+a+'">'+a.substring(('/'+a).lastIndexOf('/'))+'</option>');
          });
          p.remove();
        }
      });
      if (getParam('mr-cat')) catSel.val(getParam('mr-cat'));
      if (getParam('mr-sort')) sortSel.val(getParam('mr-sort'));

      var url = baseURL + '?source=library&srv=cmpnt&cmpntid=' + res.data('menuid').trim();
      var cats = {};
      if (res.data('cat')) {
        cats = {'mediacat': res.data('cat')};
        res.load(url, cats, function() {
          if(sortSel.length) {
            sortResults(sortSel[0]);
          } else {
            pageMediaUI(1, 10, res);
          }
          UpdateLinks(res);
          wrap.show();
        });
      } else {
        res.load(url, function() {
          if(sortSel.length) {
            sortResults(sortSel[0]);
          } else {
            pageMediaUI(1, 10, res);
          }          UpdateLinks(res);
          wrap.show();
        });
      }
    });
    
    /* Finder */
    $('.panel-content.categories').each(function() {
      finderRenderResults(finderGetDetails(this));
    });
    
    /* Related info tabs START */
    $('#related-info-finder').each(function() {
      var rif = $(this);
      var tabs = rif.find('div[role="tablist"] button');
      var tabSel, panelSel;
      var total = 0;
      tabs.each(function() {
        var tab = $(this);
        var panel = rif.find('#' + tab.attr('aria-controls'));
        var items = panel.find('.panel-content ul li').length;
        total += items;
        if (items < 1) {
          tab.remove();
          panel.remove();
        } else if ((tab.text() === tab.parent().data('tab')) || !tabSel) {
          tabSel = tab;
          panelSel = panel;
        }
      });
      if (total > 0) {
        if (!getParam('finderTab')) {
          if (!tabSel) tabSel = $(tabs[0]);
          tabSel.attr('aria-selected', true);
          panelSel.attr('hidden', false);
        }
        rif.show();
      }
    });
    /* Related info tabs END */
    
    /* Select finder tab START */
    var finderTab = getParam('finderTab');
    if (finderTab) {
      $('.finder button[role="tab"]').attr('aria-selected', false);
      $('.finder div[role="tabpanel"]').prop('hidden', true);
      $('.finder #' + finderTab).attr('aria-selected', true);
      $('.finder #' + $('.finder #' + finderTab).attr('aria-controls')).attr('hidden', false);
    }
    $('.finder button[role="tab"]').click(function(e) {
      setParam('finderTab', e.target.id)
    });
    $('.finder').each(function() {
      var f = $(this);
      var pt = $(this).prev('h2');
      if (pt && pt.length > 0) {
        f.find('.finder-title h2').html(pt.html());
        pt.remove();
      }
    });
    /* Select finder tab END */

    /* Media Release Sort START */
    sortSelectOptions("#mediaReleaseCategories", true);
    /* Media Release Sort END */

    /* ED Widget START */
    if ($('.article-card-wait-time').length > 0) {
      $.getJSON(host+"/wps/themes/html/Portal/js/OBI_DATA/json/ED001.json", function(items) {
        $('.article-card-wait-time').each(function() {
          var article = $(this);
          var status = 'normal';
          var hosp = article.data('hosp');
          var data = items.filter(function(a) {
            return hosp === a.HOSP_SHORT
          })[0];
          if (data) {
            var aw = parseFloat(data.AVG_WAIT);
            var awtxt = '';
            if (aw < 60) awtxt = Math.round(Math.ceil(aw / 5) * 5) + " mins";
            else awtxt = Math.round(Math.ceil(aw / 15)) / 4 + " hours";
            article.find(".wait-time").text(awtxt);
            article.find(".wait-time").attr('data-time', awtxt);
            var vol = (parseInt(data.WTBS) + parseInt(data.COM_TREAT)) / parseInt(data.CAP);
            if (isNaN(vol)) {
              status = 'error';
            } else if (vol < .8) {
              status = 'normal';
            } else if (vol < .95) {
              status = 'busy';
            } else {
              status = 'vbusy';
            }
            article.attr("data-wait", status);
            article.find(".last-updated time").text(moment(new Date(data.DTM)).format('hh:mma D MMM YYYY'));
            article.find(".last-updated time").attr('datetime', data.DTM);
          }

        });
      });
    }
    /* ED Widget END */

    /* Anchor Lists START */
    $('#anchordata').each(function(index,adata){
      var listData = Papa.parse(adata.innerHTML).data;
      if(listData) {
        var GROUP=0, CAT=2, NAME=3, PHONE=4, MOBILE=5, EMAIL=6, LOC=7, CONCLASS=8, EXP=9, MSG=10;
        var cats = [];
        for(var i=1;i<listData.length;i++) {
          var g = listData[i][GROUP].trim(); var c = listData[i][CAT];
          if(c && !cats.some(function(x){return x.name===c;})) {
            cats.push({name:c,group:g});
            if($('section.main-content ul.anchor-list[data-group="'+g+'"]').length < 1)
            $('section.main-content').append('<ul class="anchor-list" data-group="'+g+'"></ul>');
          } /* finds groups and categories, appends any missing groups */
        }
        var contentContactItem = function(obj) {
			if(obj[MSG] && !obj[NAME])
			  return '<div class="content-item col-lg-12"><p>'+obj[MSG]+'</p></div>';
			var res = '<article class="contact-item col-lg-4 col-sm-6"><div class="contact-name">';
			if(obj[NAME]) res += '<h3>'+obj[NAME]+'</h3></div>';
			if(obj[PHONE] || obj[MOBILE] || obj[EMAIL]) {
			  res += '<ul class="contact-method-list">';
			  if(obj[PHONE]) obj[PHONE].split("~").forEach(function(o) {
				res += '<li><svg aria-label="phone" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 384 384" style="enable-background:new 0 0 384 384;" xml:space="preserve"><g><g><path d="M353.188,252.052c-23.51,0-46.594-3.677-68.469-10.906c-10.719-3.656-23.896-0.302-30.438,6.417l-43.177,32.594 c-50.073-26.729-80.917-57.563-107.281-107.26l31.635-42.052c8.219-8.208,11.167-20.198,7.635-31.448 c-7.26-21.99-10.948-45.063-10.948-68.583C132.146,13.823,118.323,0,101.333,0H30.813C13.823,0,0,13.823,0,30.813 C0,225.563,158.438,384,353.188,384c16.99,0,30.813-13.823,30.813-30.813v-70.323C384,265.875,370.177,252.052,353.188,252.052z"></path></g></g></svg><span class="sr-only">'+listData[0][PHONE]+'</span><a href="tel:'+o.trim()+'">'+o.trim()+'</a></li>';
			  });
			  if(obj[MOBILE]) obj[MOBILE].split("~").forEach(function(o) {
			  res += '<li><svg aria-label="phone" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 384 384" style="enable-background:new 0 0 384 384;" xml:space="preserve"><g><g><path d="M353.188,252.052c-23.51,0-46.594-3.677-68.469-10.906c-10.719-3.656-23.896-0.302-30.438,6.417l-43.177,32.594 c-50.073-26.729-80.917-57.563-107.281-107.26l31.635-42.052c8.219-8.208,11.167-20.198,7.635-31.448 c-7.26-21.99-10.948-45.063-10.948-68.583C132.146,13.823,118.323,0,101.333,0H30.813C13.823,0,0,13.823,0,30.813 C0,225.563,158.438,384,353.188,384c16.99,0,30.813-13.823,30.813-30.813v-70.323C384,265.875,370.177,252.052,353.188,252.052z"></path></g></g></svg><span class="sr-only">'+listData[0][MOBILE]+'</span><a href="tel:'+o.trim()+'">'+o.trim()+'</a></li>';
			  });
			  if(obj[EMAIL]) obj[EMAIL].split("~").forEach(function(o) {
			  res += '<li><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" aria-hidden="true"><title>Envelope</title><g><g><g><path d="M10.688,95.156C80.958,154.667,204.26,259.365,240.5,292.01c4.865,4.406,10.083,6.646,15.5,6.646 c5.406,0,10.615-2.219,15.469-6.604c36.271-32.677,159.573-137.385,229.844-196.896c4.375-3.698,5.042-10.198,1.5-14.719 C494.625,69.99,482.417,64,469.333,64H42.667c-13.083,0-25.292,5.99-33.479,16.438C5.646,84.958,6.313,91.458,10.688,95.156z"></path><path d="M505.813,127.406c-3.781-1.76-8.229-1.146-11.375,1.542c-46.021,39.01-106.656,90.552-152.385,129.885 c-2.406,2.063-3.76,5.094-3.708,8.271c0.052,3.167,1.521,6.156,4,8.135c42.49,34.031,106.521,80.844,152.76,114.115 c1.844,1.333,4.031,2.01,6.229,2.01c1.667,0,3.333-0.385,4.865-1.177c3.563-1.823,5.802-5.49,5.802-9.49V137.083 C512,132.927,509.583,129.146,505.813,127.406z"></path><path d="M16.896,389.354c46.25-33.271,110.292-80.083,152.771-114.115c2.479-1.979,3.948-4.969,4-8.135 c0.052-3.177-1.302-6.208-3.708-8.271C124.229,219.5,63.583,167.958,17.563,128.948c-3.167-2.688-7.625-3.281-11.375-1.542 C2.417,129.146,0,132.927,0,137.083v243.615c0,4,2.24,7.667,5.802,9.49c1.531,0.792,3.198,1.177,4.865,1.177 C12.865,391.365,15.052,390.688,16.896,389.354z"></path><path d="M498.927,418.375c-44.656-31.948-126.917-91.51-176.021-131.365c-4-3.26-9.792-3.156-13.729,0.24 c-9.635,8.406-17.698,15.49-23.417,20.635c-17.563,15.854-41.938,15.854-59.542-0.021c-5.698-5.135-13.76-12.24-23.396-20.615 c-3.906-3.417-9.708-3.521-13.719-0.24c-48.938,39.719-131.292,99.354-176.021,131.365c-2.49,1.792-4.094,4.552-4.406,7.604 c-0.302,3.052,0.708,6.083,2.802,8.333C19.552,443.01,30.927,448,42.667,448h426.667c11.74,0,23.104-4.99,31.198-13.688 c2.083-2.24,3.104-5.271,2.802-8.323C503.021,422.938,501.417,420.167,498.927,418.375z"></path></g></g></g></svg><span class="sr-only">'+listData[0][EMAIL]+'</span><a href="mailto:'+o.trim()+'" >'+o.trim()+'</a></li>';
			  });
			  res += '</ul>';
			}
			if(obj[LOC])
			  res += '<div class="contact-info"><h4>'+listData[0][LOC]+'</h4><ul class="au-link-list au-link-list--inline"><li>'+obj[LOC].replace(/~/g,'</li><li>')+'</li></ul></div>';
			if(obj[CONCLASS])
			  res += '<div class="contact-info"><h4>'+listData[0][CONCLASS]+'</h4><ul class="au-link-list au-link-list--inline"><li>'+obj[CONCLASS].replace(/~/g,'</li><li>')+'</li></ul></div>';
			if(obj[EXP])
			  res += '<div class="contact-info"><h4>'+listData[0][EXP]+'</h4><ul class="au-link-list au-link-list--inline"><li>'+obj[EXP].replace(/~/g,'</li><li>')+'</li></ul></div>';
			return res+'</article>';
        };
        var btnTop = '<a href="#maincontent"><button class="repeatable back-to-top-button" role="button" tabindex="0"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 31.5 31.5" style="enable-background:new 0 0 31.5 31.5;" xml:space="preserve"><path class="st1" d="M21.2,5c-0.4-0.4-1.1-0.4-1.6,0c-0.4,0.4-0.4,1.1,0,1.6l8,8H1.1c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1 h26.6l-8,8c-0.4,0.4-0.4,1.2,0,1.6c0.4,0.4,1.2,0.4,1.6,0l10-10c0.4-0.4,0.4-1.1,0-1.6L21.2,5z"></path></svg><span>Back to top</span></button></a>';
        var bodyList = $('section.content-lists-container');
        cats.forEach(function(cat, i){
		  var id = cat.name.replace(/[^A-Za-z]/g,'')+'-'+i;
		  var results = listData.filter(function(a){return a[CAT] === cat.name});
		  var anchorList = $('section.main-content ul.anchor-list[data-group="'+cat.group+'"]');
		  anchorList.append('<li><a href="#'+id+'" class="anchor-link">'+cat.name+'</a></li>');
		  bodyList.append('<div class="content-list"><div id="'+id+'" class="heading-container"><h2 tabindex="0">'+cat.name+'</h2></div><div class="content-container">'+results.map(contentContactItem).join('')+'</div>'+btnTop+'</div>');
        });
      }
      $(adata).remove();
    });
    /* Anchor Lists END */
    
    /* Autocomplete */
    $('input[type="search"][name!="location-search"]').attr('autocomplete', 'off'); // hide default suggestions
    $('input[type="search"][name!="location-search"]').parent().on('focusout', function() {
      var f = $(this);
      if (autoShowTimeout != null) clearTimeout(autoShowTimeout);
      autoShowTimeout = setTimeout(function() {
        autoShowTimeout = null;
        f.removeClass('focus');
      }, 500);
    }).on('focusin', function() {
      clearTimeout(autoShowTimeout);
      $(this).addClass('focus');
    });
    $('input[type="search"][name!="location-search"][data-autocomplete!="false"]').on('input', function() {
      if (autoListTimeout != null) clearTimeout(autoListTimeout);
      var t = $(this);
      autoListTimeout = setTimeout(function() {
        autoListTimeout = null;
        var n = '' + (Math.random() * 1e17);
        t.attr('data-acid', n);
        var f = t.parent();
        if (t.val().length == 0) {
          f.children('.autocomplete').remove();
        } else {
          $.getJSON(host+"/apps/searches/render_event_response?source=search_box&type=autocomplete&term=" + encodeURIComponent(t.val()),
            function(data) {
              if (t.attr('data-acid') === n) {
                if (f.children('.autocomplete').length == 0) f.append('<ul class="autocomplete" aria-title="Autocomplete search suggestions"></ul>');
                var a = f.find('.autocomplete');
                var as = '';
                data.forEach(function(a) {
                  as += '<li><a onClick="return searchAutocomplete(this,\''+a.url+'\')" href="#">' + a.header + '</a></li>';
                });
                a.height('');
                a.html(as);
                a.height(Math.min(a.height(),window.innerHeight-a[0].getBoundingClientRect().top-12));
              }
            }).fail(function() {
            if (t.attr('data-acid') === n) f.find('.autocomplete li').remove();
          });
        }
      }, 1000);
    });
    
    $('.current-map-query-wrapper').click(function() {
      $('#location-search').val("");
      toggleMapIsActive("", false);

    });
    $('#allSitesLink').click(function(e) {
      e.preventDefault();
      changeSiteListActive();
    });

    UpdateLinks($('body'));

    /* START COVID */
    if($('#convid-stats').length > 0) {
      var x = Math.random() * 10 + 1;
      var dataSource = "https://www.covid-19.sa.gov.au/__data/assets/file/0004/145849/covid_19_daily.json" + "?v=" + x;   
      $.getJSON( dataSource, function( data ) {
        function getUpdatedText(input) {
          var dt = moment(input.replace("Data current at ",""),"HH:mm D MMMM YYYY");
          return 'Updated <time datetime="'+dt.format('YYYY-MM-DDTHH:mm:ss')+'">'+dt.format('hh:mma DD MMM YYYY')+'</time>';
        }
        $('.nUpDate').html(getUpdatedText(data.hp_date));
        $('.nCasesa').text(data.newcase_sa);
        $('.nCaseau').text(data.newcase_au);
        $('.tCasesa').text(data.totalcase_sa);
        $('.tCaseau').text(data.totalcase_au);
        $('.hospCasesa').text(data.hosp_sa);
        $('.icuCasesa').text(data.icu_sa);
        $('.icuCaseau').text(data.icu_au);
        $('.testssa').text(data.tests_sa);
        $('.totaltestssa').text(data.totaltests_sa);
        $('.aCasesa').text(data.active_sa);
        $('.rCasesa').text(data.recovered_sa);
        $('.dCasesa').text(data.deaths_sa);
        $('.dCaseau').text(data.deaths_au);
      });
    }
    /* END COVID */

    UpdateLinks($('body'));

    /* Scroll heading into view */
    if(getParam("head") != "") {
      $(".page-contents-list a:contains('"+getParam("head")+"')").click();
    }


  /* START RECITEME */
  loadScript(serviceUrl + serviceKey, function () { _reciteLoaded(); });
  /* END RECITEME*/


/* Exposure Locations START */
  if(typeof exposureListTitle !== 'undefined' && typeof exposureListURL !== 'undefined') {
    var req = new XMLHttpRequest();
    req.open("GET", exposureListURL, true);
    req.responseType = "arraybuffer";
    req.onload = function(e) {
      var data = new Uint8Array(req.response);
      workbook = XLSX.read(data, {type:"array"});
      var sheet = workbook.Sheets[workbook.SheetNames[0]];
      var listData = [], rowNum, colNum;
      var range = XLSX.utils.decode_range(sheet['!ref']);
      var subs = [];
      for(rowNum = range.s.r+1; rowNum <= range.e.r; rowNum++) { // ignore header row
        var row = [];
        for(colNum=range.s.c; colNum<=range.e.c; colNum++) {
        var nextCell = sheet[ XLSX.utils.encode_cell({r: rowNum, c: colNum}) ];
        if( typeof nextCell === 'undefined' ||  nextCell.v == null || nextCell.v == ""){
          row.push(null);
        } else
          row.push(nextCell);
        }
        if(row[0] != null) {
        listData.push(row);
        var s = row[0].v.trim();
        if(s && !subs.some(function(x){return x===s;}))
          subs.push(s);
        }
      }
      subs.sort();
    
      var headings = ["Suburb", "Site", "Exposure period", "Notes", "Date added", "Health advice"];
      var SUBURB=0, SITE=1, EP_S=2, EP_E=3, NOTE=4, DADD=5, ADVICE=6, LAT=7, LNG=8;

      var optRow = function(obj){ return '<option value="'+obj+'">'+obj+'</option>'; };
      var headRow = function(obj) { return '<th>'+obj+'</th>'; };
      var dataRow = function(obj) {
        var res = '<tr>';
        res += '<td data-sort="'+getT(obj[SUBURB]).toLowerCase()+'">'+getRT(obj[SUBURB], 0)+'</td>';
        res += '<td data-sort="'+getT(obj[SITE]).toLowerCase()+'">'+getRT(obj[SITE], 0)+'</td>';
        res += '<td data-sort="'+getDT(obj[EP_S], "YYYY-MM-DD HH:mm")+' '+getDT(obj[EP_E], "YYYY-MM-DD HH:mm")+'" data-search="'+getDTA(obj[EP_S], obj[EP_E], "YYYY-MM-DD")+'">';
        res += getDTR(obj[EP_S], obj[EP_E],"ddd D MMMM YYYY", "h:mma")+'</td>';
        res += '<td data-sort="'+getT(obj[NOTE]).toLowerCase()+'">'+getRT(obj[NOTE], 0)+'</td>';
        res += '<td data-sort="'+getDT(obj[DADD], "YYYY-MM-DD")+'">'+getDoT(obj[DADD], "ddd D MMMM YYYY", "hh:mma")+'</td>';
        res += '<td data-sort="'+getT(obj[ADVICE]).toLowerCase()+'">'+getH2Link(obj[ADVICE])+'</td>';
        return res+'</tr>';
      };

      var btnTop = '<a href="#maincontent"><button class="repeatable back-to-top-button" role="button" tabindex="0"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 31.5 31.5" style="enable-background:new 0 0 31.5 31.5;" xml:space="preserve"><path class="st1" d="M21.2,5c-0.4-0.4-1.1-0.4-1.6,0c-0.4,0.4-0.4,1.1,0,1.6l8,8H1.1c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1 h26.6l-8,8c-0.4,0.4-0.4,1.2,0,1.6c0.4,0.4,1.2,0.4,1.6,0l10-10c0.4-0.4,0.4-1.1,0-1.6L21.2,5z"></path></svg><span>Back to top</span></button></a>';
      var html = '<div class="media-release-results-header"><div class="media-release-controls"><div class="au-control-input">';
      html += '<label for="locationSuburbs">Search by suburb</label>';
      html += '<select id="locationSuburbs" class="au-select au-select--block category" onchange="expSearch(this)">';
      html += '<option value="">All Suburbs</option>' + subs.map(optRow);
      html += '</select></div><div class="au-control-input"><label for="sortBy">Exposure date</label>'
      html += '<input id="exposureDate" class="au-text-input au-text-input--block pac-target-input" onchange="expSearch(this)"/>';
      html += '</div><div class="au-control-input" style="padding: 1.5rem 1rem 0 1rem;"><a href="#" onclick="return expSearchClear(this);return false;">Show&nbsp;All</a></div></div></div>';
      html += '<table><thead><tr>'+headings.map(headRow).join('')+'</tr></thead><tbody>'+listData.map(dataRow).join('')+'</tbody></table>';
      $('#locationTable').html(html);
    
      lt = $('#locationTable table').DataTable({
        dom: 'Brtip',
        lengthChange: false,
        pageLength: 25,
          order: [[4, 'desc']],
         responsive: {
          details: {
            display: $.fn.dataTable.Responsive.display.childRowImmediate,
            type: 'none',
            target: ''
          }
        },
        buttons: [
          {
            extend: 'excelHtml5',
            filename: exposureListTitle +'  '+moment(workbook.Props.ModifiedDate.toJSON()).format("YYYY-MM-DD HH.mm"),
            title: exposureListTitle,
            messageTop: moment(workbook.Props.ModifiedDate.toJSON()).format("ddd D MMMM YYYY  hh:mma")
          },
          {
            extend: 'pdfHtml5',
            filename: exposureListTitle+'  '+moment(workbook.Props.ModifiedDate.toJSON()).format("YYYY-MM-DD HH.mm"),
            title: exposureListTitle,
            messageTop: moment(workbook.Props.ModifiedDate.toJSON()).format("ddd D MMMM YYYY  hh:mma")
          }
        ],
      });
      $.fn.DataTable.ext.pager.numbers_length = 5;
    
      $('.dt-buttons').append("<div class='dtLastUpdate'>Last updated: "+moment(workbook.Props.ModifiedDate.toJSON()).format("ddd D MMMM YYYY hh:mma")+"</div>");
      var expDT = new DateTime(document.getElementById('exposureDate'), {
        format: 'ddd D MMMM YYYY',
        buttons: {
        today: false,
        clear: true
        }
      });
      // Handle scrolling on paging
      $(document).scroll(function(){
        dtOff = $('.dataTables_paginate').offset().top - $(document).scrollTop();
      });
      $(document).on('click', '.paginate_button', function() {
        $(document).scrollTop($('.dataTables_paginate').offset().top - dtOff);
      });

      /* Location Map */
      lmfeatures = [];
      /* 'Other', Tier 1..4 */
      var tierColours = ['CDCDCD', 'F02D60', 'F69900', 'FFD451', '3A75D3'];
      listData.forEach(function(element, i){
        if(getT(element[LNG]) !== '' && getN(element[LNG]) != 0 &&
          getT(element[LAT]) !== '' && getN(element[LAT]) != 0) {
          var c = tierColours[0];
          if(! isNaN(getT(element[ADVICE])))
            c = tierColours[getN(element[ADVICE])];
          var res = '<b>'+getRT(element[SUBURB])+'</b><br/>';
          res += getRT(element[SITE])+'<br/><br/>';
          res += '<b>Exposure period</b><br/>'+getDTR(element[EP_S], element[EP_E],"ddd D MMMM YYYY", "h:mma")+'<br/><br/>';
          res += '<b>Notes</b><br/>'+getRT(element[NOTE])+'<br/><br/>';
          res += '<b>Date added</b><br/>'+getDoT(element[DADD], "ddd D MMMM YYYY", "hh:mma")+'<br/><br/>';
          res += '<b>Health advice</b><br/>'+getH2Link(element[ADVICE])+'<br/>';
          var feature = new ol.Feature({
            geometry: new ol.geom.Point(ol.proj.fromLonLat([ getN(element[LNG]), getN(element[LAT]) ])),
            popup: res,
            color: c,
          });
          lmfeatures.push(feature);
        }
      });

      // Popup overlay
      var popup = new ol.Overlay.Popup ({
	popupClass: "default",
        closeBox: true,
        positioning: 'auto',
        autoPan: true,
        autoPanAnimation: { duration: 250 }
      });
      var lmSites = new ol.layer.Vector({
        name: 'Exposure Sites',
        source: new ol.source.Vector({
          features: lmfeatures
        }),
        style: function(f) {
          return new ol.style.Style({
            image: new ol.style.Icon({
              anchor: [0.5, 1],
              src: "data:image/svg+xml,%3Csvg width='40' height='40' version='1.1' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Cpath d='m20 40 11.2-12.6h-22.4l11.2 12.6' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='16' ry='16' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='7' ry='7' fill='%23"+f.get('color')+"' stroke='%23FFFFFF' stroke-width='1'/%3E%3C/g%3E%3C/svg%3E"
            })
          })
        },
      });
      var lmMap = new ol.layer.Tile({
        source: new ol.source.OSM()
      });
      lm = new ol.Map({
        layers: [
          lmMap,
          lmSites
        ],
        target: 'locationMap',
        view: new ol.View({
          center: [0,0],
          zoom: 1
        }),
        overlays: [popup]
      });

      // Define a new legend
      var legend = new ol.legend.Legend({
        title: 'Exposure Sites',
        style: new ol.style.Style({
          image: new ol.style.Icon({
            anchor: [0.5, 1],
            src: "data:image/svg+xml,%3Csvg width='40' height='40' version='1.1' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Cpath d='m20 40 11.2-12.6h-22.4l11.2 12.6' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='16' ry='16' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='7' ry='7' fill='%23FFFFFF' stroke='%23FFFFFF' stroke-width='1'/%3E%3C/g%3E%3C/svg%3E"
          })
        })
      });
      var legendCtrl = new ol.control.Legend({ 
        legend: legend,
        collapsed: false
      });
      lm.addControl(legendCtrl);
      for(var i=1; i < tierColours.length; i++) {
        legend.addItem({
          title: (i > 0 ? 'Tier '+i : 'Other'),
          typeGeom: 'Point',
          style: new ol.style.Style({
            image: new ol.style.Icon({
              anchor: [0.5, 1],
              src: "data:image/svg+xml,%3Csvg width='40' height='40' version='1.1' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Cpath d='m20 40 11.2-12.6h-22.4l11.2 12.6' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='16' ry='16' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='7' ry='7' fill='%23"+tierColours[i]+"' stroke='%23FFFFFF' stroke-width='1'/%3E%3C/g%3E%3C/svg%3E"
            })
          })
        });
      }
      legend.addItem({
        title: 'Other',
        typeGeom: 'Point',
        style: new ol.style.Style({
          image: new ol.style.Icon({
            anchor: [0.5, 1],
            src: "data:image/svg+xml,%3Csvg width='40' height='40' version='1.1' viewBox='0 0 40 40' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Cpath d='m20 40 11.2-12.6h-22.4l11.2 12.6' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='16' ry='16' fill='%23"+themePrimary+"'/%3E%3Cellipse cx='20' cy='16' rx='7' ry='7' fill='%23"+tierColours[0]+"' stroke='%23FFFFFF' stroke-width='1'/%3E%3C/g%3E%3C/svg%3E"
          })
        })
      });

      var layerExtent = lmSites.getSource().getExtent();
      if (layerExtent && lmfeatures.length > 0)
        lm.getView().fit(layerExtent, {padding:[60,40,50,60]});

      // Control Select 
      var select = new ol.interaction.Select({});
      lm.addInteraction(select);


      // hover hand
      lm.on('pointermove', function(e){
        var pixel = lm.getEventPixel(e.originalEvent);
        var hit = lm.hasFeatureAtPixel(pixel);
        lm.getViewport().style.cursor = hit ? 'pointer' : '';
      });

      // On selected => show/hide popup
      select.getFeatures().on(['add'], function(e) {
        var feature = e.element;
        popup.show(feature.getGeometry().getFirstCoordinate(), feature.get("popup")); 
      });
      select.getFeatures().on(['remove'], function(e) {
        popup.hide(); 
      });

      /* Gray map */
      var lmFilter = new ol.filter.Colorize();
      lmMap.addFilter(lmFilter);
/*  colour on focus
      var mapElement = $("#locationMap");
      mapElement.on('focusin mouseover', function() {
        lmFilter.setActive(false);
        lm.render();
      });*/
      /* Location Map */
    }
    req.send();
  }
/* Exposure Locations END */
});