noop = '#';

var translations = {
  'go': 'go',
  'open': 'Open',
  'close': 'Close',
  'yes_submit': 'Yes, submit my guide to DK',
  'no_submit': 'No, take me back to my options',
  'share_guide': 'Share your guide',
  'download_guide': 'Download your guide',
  'buy_guide': 'Buy your guide',
  'view_guide': 'View your guide',
  'manage_guides': 'Manage my guides',
  'added_ok': 'Successfully added to your guide',
  'need_create_new': 'You need to create a new guide for this destination.'
}

// Don't hardcode URLs: Reference by id and pass them in from standard.kid
var scripts_url_to = {}
function scripts_set_urls(url_map) {
  scripts_url_to = url_map;  
}

function linkButton(content, attrs, onclick) {
  var button = A(attrs, content);
    connect(button, 'onclick', function (event) {onclick(event); return event.preventDefault();});
  return button;
}

function roundButton(buttonprefix, content) {
  return DIV({'class':buttonprefix+'-top'},
	     DIV({'class':buttonprefix+'-bottom'}, content));
}

function listItemLinkButton(innercls, buttonprefix, label, onclick, id) {
  var attrs = {title: label, href: noop};
  if (id) attrs.id = id;
  var link = linkButton(label, attrs, onclick);
  return LI({'class':innercls},
            roundButton(buttonprefix, link));
}

function listLinkButtonMaker(outercls, innercls, buttonprefix) {
  return function(cls, label, onclick, id) {
    return UL({'class': outercls + ' ' + cls},
              listItemLinkButton(innercls, buttonprefix, label, onclick, id));
  };
}

var greenbutton = listLinkButtonMaker('button-list-slim', 'button-75 bg-63ad3f', 'button-green-75');
var widegreenbutton = listLinkButtonMaker('button-list', 'button-150 bg-63ad3f', 'button-green-150');
var beigebutton = listLinkButtonMaker('button-list-slim margin-top-20', 'button-150 bg-b6aba3', 'button-beige-150');

function shareyesbutton(onclick) {
  return UL({'class' : 'button-list-stacked'},
            LI({'class' : 'button-232 bg-63ad3f'},
               DIV({'class' : 'button-green-232-top'},
                   DIV({'class' : 'button-green-232-bottom'},
                       DIV({'class' : 'button-submit-step'},
                           linkButton(translations['yes_submit'], {'href' : '#'}, onclick))))));
}

function sharenobutton(onclick) {
  return UL({'class' : 'button-list-stacked'},
            LI({'class' : 'button-232 bg-b7aba2'},
               DIV({'class' : 'button-grey-232-top'},
                   DIV({'class' : 'button-grey-232-bottom'},
                       DIV({'class' : 'button-cancel-step'},
                           linkButton(translations['no_submit'], {'href' : '#'}, onclick))))));
}

function sharebutton(onclick) {
  return UL({'class' : 'button-list-stacked'},
            LI({'class' : 'button-232 bg-63ad3f'},
               DIV({'class' : 'button-green-232-top'},
                   DIV({'class' : 'button-green-232-bottom'},
                       DIV({'class' : 'button-submit-step'},
                           linkButton(translations['share_guide'], {'href' : '#'}, onclick))))));
}

function downloadbutton(onclick) {
  return UL({'class' : 'button-list-stacked'},
            LI({'class' : 'button-232 bg-63ad3f'},
               DIV({'class' : 'button-green-232-top'},
                   DIV({'class' : 'button-green-232-bottom'},
                       DIV({'class' : 'button-submit-step'},
                           linkButton(translations['download_guide'], {'href' : '#'}, onclick))))));
}

function buybutton(onclick) {
  return UL({'class' : 'button-list-stacked'},
            LI({'class' : 'button-232 bg-63ad3f'},
               DIV({'class' : 'button-green-232-top'},
                   DIV({'class' : 'button-green-232-bottom'},
                       DIV({'class' : 'button-submit-step'},
                           linkButton(translations['buy_guide'], {'href' : '#'}, onclick))))));
}

function replace(replaced, button) {
  replaced = $(replaced);
  var parent = replaced.parentNode
  parent.replaceChild(button, replaced);
}

function submitForm(frm) {
  return function (event) {return $(frm).submit();};
}

var EM = createDOMFunc('em');

function replaceGoButton(frm, kind) {
  frm = $(frm);
  var containercls = 'go-button-' + kind + '-container';
  var noscriptId = frm.getAttribute('id') + '_noscript';
  var button = linkButton([EM(), translations['go']], //,'go'
    {'id': 'go-button-' + kind, href: noop, title: translations['go']}, //'class':'replace',
    submitForm(frm));
  replace(noscriptId, DIV({'class': containercls}, button));
}

function submitWithActionMaker(frm, action_input) {
  return function(action) {
    frm = $(frm);
    act = $(action_input); // make sure we have elements and not IDs
    return function(event) {
      act.value = action;
      return frm.submit();
    };
  }
}

function xhrPOSTForm(url, keys, values) {
  var content = queryString(keys, values);
  var req = getXMLHttpRequest();
  req.open('POST', url, true);
  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", content.length);
  req.setRequestHeader("Connection", "close");
  return sendXMLHttpRequest(req, content);
}

function refreshDrawer() {
  doSimpleXMLHttpRequest(scripts_url_to["PersonalGuideDrawer"]).addCallback(
    function(xhr) {
      $('personal-guide-drawer').innerHTML =
        xhr.responseText.substring(xhr.responseText.indexOf('<body>') + 7,
                                   xhr.responseText.indexOf('</body>'));
    });
}

function isSafari() {
  return (navigator.userAgent.toLowerCase().indexOf("applewebkit/") != -1);
}

function addToGuide(item_type, item_id, show_view) {
  var keys = [item_type];
  var values = [item_id];
  var dfrd = xhrPOSTForm(scripts_url_to['PersonalGuideAdd'], [item_type], [item_id]);
  function onSuccess(xhr) {
	
    var replacethis = $('add_to_pguide_submit_' + item_type + '_' + item_id);
    var newDiv = document.createElement("div");
    newDiv.setAttribute("class", "added-to-guide");
    var newText = document.createTextNode(translations['added_ok']);
    newDiv.appendChild(newText);
    
    var theform = replacethis.parentNode;
    theform.replaceChild(newDiv, replacethis);

    if (show_view) {
        var viewGuideDiv = document.createElement("div");
        viewGuideDiv.setAttribute("class", "added-to-guide-view");
        var linktoGuide = document.createElement('a');
        linktoGuide.setAttribute("class", "view-your-guide");
        linktoGuide.setAttribute("href", "#");
        var linktoGuideText = document.createTextNode(translations['view_guide']);
        linktoGuide.appendChild(linktoGuideText);
        viewGuideDiv.appendChild(linktoGuide);
        insertSiblingNodesAfter(newDiv, viewGuideDiv);
    }

    Highlight(newDiv, {startcolor: '#ffffcc'});
    refreshDrawer();
    enableViewGuideLinks();
  }
  dfrd.addCallback(function(xhr) {
    if (xhr.status == 200) {
      onSuccess(xhr);
    }
  });
  dfrd.addErrback(function(err) {
    if (isSafari() && (err.req.status == undefined)) {
      onSuccess(err.req);
    }
  });
}

var blindUp = document.all ? function(elm) {setStyle(elm, {'display' : 'none'})} : blindUp;
var blindDown = document.all ? function(elm) {setStyle(elm, {'display' : 'block'})} : blindDown;

function fullWarning(item_type, item_id) {
  var fullWarningForm = $('add_to_pguide_form_' + item_type + '_' + item_id);
  var parent = fullWarningForm.parentNode
  var yesNo = DIV(translations['need_create_new'],
                  A({'href' : 'javascript:void(0)',
                     'class' : 'continue',
                     'id' : 'full-warning-yes-' + item_type + '-' + item_id}, translations['manage_guides']));
  parent.replaceChild(yesNo, fullWarningForm);
  connect('full-warning-yes-' + item_type + '-' + item_id, 'onclick', function() {
    scroll(0,0);
    togglePguigeTab = $('toggle-pguige-tab');
    if (togglePguigeTab._state_ == 'open') {
      toggleElementClass('open', togglePguigeTab);
      toggleElementClass('close', togglePguigeTab);
      togglePguigeTab._state_ = 'close';
      togglePguigeTab.title = translations['close'];
      togglePguigeTab.innerHTML = togglePguigeTab.title;
      blindDown('personal-guide-drawer');
    }
    parent.replaceChild(fullWarningForm, yesNo);
  });
}

function linkSelects(parent, child) {
  var parent = $(parent);
  var child  = $(child);
  var cloned = child.cloneNode(true);
  removeEmptyTextNodes(cloned);
  refreshDynamicSelectOptions(parent, child, cloned);
  connect(parent, 'onchange', function(event) {
    refreshDynamicSelectOptions(parent, child, cloned);
  });
}

function refreshDynamicSelectOptions(parent, child, optionholder) {
  var alreadySelectedValue = (child.selectedIndex >= 0) && child.options[child.selectedIndex].value;
  replaceChildNodes(child);
  var selectedLabel = strip(scrapeText(parent.options[parent.selectedIndex]));
  for (var i=0; i < optionholder.childNodes.length; i++) {
    var opt = optionholder.childNodes[i];
    if (opt.tagName.toLowerCase() == "option") {
      var newopt = opt.cloneNode(true);
      if (newopt.value == alreadySelectedValue) newopt.selected = true;
      appendChildNodes(child, newopt);
    }
    else if (opt.tagName.toLowerCase() == "optgroup" && opt.label==selectedLabel) {
      for (var j=0; j < opt.childNodes.length; j++) {
	var newopt = opt.childNodes[j].cloneNode(true);
	if (newopt.value == alreadySelectedValue) newopt.selected = true;
	appendChildNodes(child, newopt);
      }
    }
  }
}

function initPguideToggleButton(initOpen) {

  $('toggle-pguige-tab')._state_ = initOpen ? 'close' : 'open';

	connect('toggle-pguige-tab', 'onclick',
          function(event) {
            togglePguigeTab = $('toggle-pguige-tab');
            toggleElementClass('open', togglePguigeTab);
            toggleElementClass('close', togglePguigeTab);
            togglePguigeTab._state_ = (togglePguigeTab._state_ == 'open' ? 'close' : 'open');
            togglePguigeTab.title = translations[togglePguigeTab._state_];
            togglePguigeTab.innerHTML = togglePguigeTab.title;
            (togglePguigeTab._state_ == 'open' ? blindUp : blindDown)('personal-guide-drawer');
            return event.preventDefault();
          });
}

function enableViewGuideLinks() {
  getalllinks = document.getElementsByTagName('a');
  for (var i=0; i < getalllinks.length; i++) {
    if(getalllinks[i].className == "view-your-guide"){
      connect(getalllinks[i], 'onclick',
              function(event) {
		if($('toggle-pguige-tab').className == "open"){
		  document.location.href="#top";
	   	  togglePguigeTab = $('toggle-pguige-tab');
            	  toggleElementClass('open', togglePguigeTab);
		  toggleElementClass('close', togglePguigeTab);
		  togglePguigeTab._state_ = 'close';
		  togglePguigeTab.title = translations['close'];
		  togglePguigeTab.firstChild.nodeValue = translations['close'];
		  (togglePguigeTab._state_ == 'open' ? blindUp : blindDown)('personal-guide-drawer');
		  return event.preventDefault();
		}
              });
    }
  }
}

function displayFlashPguide(jsonData) {
  var so = new SWFObject('/flash/preloader.swf', 'dktravelapp', '100%', '100%', '8', '#f3eee9');
  so.useExpressInstall('/flash/expressinstall.swf');
  so.addVariable( 'JSONVars', jsonData);
  so.addParam('menu', 'false');
  so.addParam('scale', 'noscale');
  so.addParam('salign', 'lt');
  if(so.write('organiser')) {
    setStyle('organiser', {'height' : '965px'});
  }
}

function flashAppHeight( height ){
	setStyle('organiser', {'height' : height+'px'});
}

function deletePguide(guide_id) {
  disconnectAll('are-you-sure-yes', 'onclick');
  connect('are-you-sure-yes', 'onclick', function() {
    deletePguideYes(guide_id);
  });
  blindDown('are-you-sure-box');
}

function deletePguideYes(guide_id) {
  blindUp('are-you-sure-box');
  xhrPOSTForm(scripts_url_to["PersonalGuideDeleteGuide"], ['guide_id'], [guide_id]).addCallback(function() {
    refreshDrawer();
    var buttons = document.getElementsByTagName("input");
    for (var i = 0; i < buttons.length; i++) {
      buttons[i].has_full = false;
    }
  });
}

function deletePguideNo() {
  disconnectAll('are-you-sure-yes')
  blindUp('are-you-sure-box');
}

function connectCountryPriceSelect() {
  connect('country', 'onchange', function() {
    $('total').innerHTML = $('country').value == 'UK' ? '99p' : '$1.99';
  });
}

function star(base_score) {
  var img = IMG();
  var container = A({'href':noop, 'class':'star'}, img)
  var obj = {view: container};
  var state;
  var change_state = function(newstate) {
    state = newstate;
    switch (newstate) {
    case 0:
      img.src = '/images/rating-star-empty.gif'; img.alt = ' - ';
      break;
    case 1:
      img.src = '/images/rating-star-active-half.gif'; img.alt = '\u00bd';
      break;
    case 2:
      img.src =  '/images/rating-star-active-full.gif'; img.alt = '\u2605';
      break;
    }
  }

  connect(img, 'onclick',
          function(event) {
            var s = (state+1) % 3;
            signal(obj, 'starchange', base_score + s);
            return event.preventDefault();
          });
  change_state(0);
  
  obj.change_rating = function(score) {
    var args = arguments;
    var adj = score - base_score;
    if (adj <= 0) {
      change_state(0);
    }
    else if (adj == 1) {
      change_state(1);
    }
    else {
      change_state(2);
    }
  };
  return obj;
}

function starblock(input_to_update) {
  var stars = map(star, [0, 2, 4, 6, 8]);
  var block = DIV({'class':'starblock'});
  input_to_update = $(input_to_update);
  for (var s in stars) {
    var st = stars[s];
    connect(st, 'starchange', function(score) {
      input_to_update.value = score;
      for (var s in stars) {
        stars[s].change_rating(score);
      }
    });
    appendChildNodes(block, st.view);
  }
  return block;
}

function checkPdfStatus(queue_id) {
  var dfrd = loadJSONDoc(scripts_url_to['PersonalGuideStatus'], {'queue_id' : queue_id});
  dfrd.addCallback(function(json) {
    if (json.status == 100) {
      // Insert queue_id into URL
      location.href=(queue_id+'').replace(/(.*)/, scripts_url_to['PersonalGuideGenerate'])
    } else {
      callLater(2, function() {
        checkPdfStatus(queue_id);
      });
    }
  });
  dfrd.addErrback(function() {
    callLater(2, function() {
      checkPdfStatus(queue_id);
    });
  });
}

function clearOnFocus(input) {
  var ctrl = $(input);
  var message = ctrl.value;
  connect(ctrl, 'onfocus', function (e) { if (ctrl.value == message) ctrl.value = ''; });
  connect(ctrl, 'onblur', function (e) { if (ctrl.value.length == 0) ctrl.value = message; });
}

addLoadEvent(function(event) {
  forEach(getElementsByTagAndClassName('ul', 'shuffle'),
          function(elem) {
            makeAccordion(getElementsBySelector('a.shuffle-switch', elem),
                getElementsBySelector('*.shuffle-item', elem),
                {'hash': true});
          });
});

addLoadEvent(function(event) {
  forEach(getElementsByTagAndClassName('ul', 'tabbed'), 
          function(elem) {
            var tabs = getElementsBySelector('li', elem);
            var getTabInfo = function (tab) {
              var link = getFirstElementByTagAndClassName('a', null, tab);
              return {
                tab: tab,
                link: link, 
                target: $(link.hash.substring(1))
              };
            }
            var tabInfo = map(getTabInfo, tabs);

            function showjust(ind) {
              return function(event) {
                forEach(tabInfo, function (t) {
                    hideElement(t.target);
                    removeElementClass(t.tab, 'active');
                });
                var tab = tabInfo[ind];
                showElement(tab.target);
                addElementClass(tab.tab, 'active');
                signal(tab.link, 'tabactivated');
                return event.preventDefault();
              };
            }

            for (var tabInd=0; tabInd < tabInfo.length; tabInd++) {
              connect(tabInfo[tabInd].link, 'onclick', showjust(tabInd));
              }
          });
});
