
config.messages.loginToEdit = 'You must be logged in to make changes. Click OK to log in now.';
config.messages.errorDeleting = 'An error has occurred. Review your Zope error log for details.';
config.messages.errorSaving = 'An error has occurred. Review your Zope error log for details. If you navigate away from this page now, you will lose your changes.';
config.messages.revisionsButtonLabel = 'revisions';
config.messages.revisionsTooltip = 'View an older revision.';
config.messages.viewRevisionTooltip = 'View this revision.';
config.messages.rssLink = 'Available in RSS';
config.messages.loginLinkLabel = 'log in';
config.messages.loginLinkPrompt = 'Log in.';
config.messages.logoutLinkLabel = 'log out';
config.messages.logoutLinkPrompt = 'Log out.';
config.messages.exportLinkLabel = 'export';
config.messages.exportLinkPrompt = 'Export to a TiddlyWiki file.';
config.messages.importLinkLabel = 'import';
config.messages.importLinkPrompt = 'Import a TiddlyWiki file.';
config.messages.noChangesMade = 'No changes were made, so nothing was saved.'

config.shadowTiddlers.AdvancedOptions = '<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkToggleLinks>> Clicking on links that are already open causes them to close\n^^(override with Control or other modifier key)^^';
config.shadowTiddlers.OptionsPanel = 'These options are saved in your browser\n\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\n<<option chkAnimate>> EnableAnimations\n\nSee AdvancedOptions';
config.shadowTiddlers.SideBarOptions = "<<gradient vert #ffffff #cc9900>><<search>><<closeAll>><<permaview>><<slider chkSliderOptionsPanel OptionsPanel options 'Change advanced options'>><<exportLink>><<importLink>><<login>>>>";

config.protectedTiddlers = ['DefaultTiddlers', 'MainMenu', 'SiteTitle', 'SiteSubtitle', 'StyleSheet'];
config.messages.protectedTiddler = 'Only an administrator can edit this tiddler.';

ie = navigator.appVersion.indexOf('MSIE') > -1;
ieurl = ie ? 'ie=1&' : '';

config.macros.login = {
  label: config.messages.loginLinkLabel,
  loggedInLabel: 'logged in: ',
  prompt: config.messages.loginLinkLabel,
  handler: function(place) {
    if(loggedIn) {
      var loginStatus = createTiddlyElement(place,'div',null,null,this.loggedInLabel);
      loginStatus.className = 'button';
      createTiddlyLink(loginStatus, username, true);
    } else {
      createTiddlyButton(place,this.label,this.prompt,function(){setTimeout("location.replace('?action=login&' + ieurl + 'redirect_to=' + getZiddlyURL())", 10)});
    }
  }
};

config.macros.logout = {
  label: config.messages.logoutLinkLabel,
  prompt: config.messages.logoutLinkLabel,
  handler: function(place) { if(loggedIn) createTiddlyButton(place,this.label,this.prompt,function(){setTimeout("location.replace('?action=logout&' + ieurl + 'redirect_to=' + getZiddlyURL())", 10)}) }
};

config.macros.exportLink = {
  label: config.messages.exportLinkLabel,
  prompt: config.messages.exportLinkPrompt,
  handler: function(place) { createTiddlyButton(place,this.label,this.prompt,function(){location.href='?action=export'}) }
};

config.macros.importLink = {
  label: config.messages.importLinkLabel,
  prompt: config.messages.importLinkPrompt,
  handler: function(place) { if(loggedIn) createTiddlyButton(place,this.label,this.prompt,function(){location.href='?action=import'}) }
};

function ziddlyStatus(message) {
  if(!window.statusElm) { // create the "status" element
    statusElm = document.createElement('div');
    statusElm.id = 'statusMessage';
    statusElm.style.display = 'none';
    document.body.appendChild(statusElm);
  }
  if(message) {
    statusElm.innerHTML = message;
    statusElm.style.display = 'block';
  } else {
    setTimeout("statusElm.style.display = 'none'", 100);
  }
};

TiddlyWiki.prototype._removeTiddler = TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler = function(title) {
  ziddlyStatus('deleting...');
  var callback = function(r){
    ziddlyStatus(false);
    if(r!='success') alert(config.messages.errorDeleting);
  };
  ajax.post(getZiddlyURL(true), callback, 'action=delete&id=' + title + '&' + noCache());
  return this._removeTiddler(title);
};

TiddlyWiki.prototype._saveTiddler = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {
  ziddlyStatus('saving...');
  var callback = function(r){
    ziddlyStatus(false);
    if(r == 'no changes') displayMessage(config.messages.noChangesMade);
    else if(r != 'success') alert(config.messages.errorSaving);
  };
  ajax.post(getZiddlyURL(true), callback, 'action=save&id=' + title + '&title=' + encodeURIComponent(newTitle) + '&body=' + encodeURIComponent(newBody) + '&tags=' + encodeURIComponent(tags) + '&' + noCache());
  return this._saveTiddler(title,newTitle,newBody,username,modified,tags);
};

function noCache() {return new String((new Date()).getTime())};

function ziddlyCreateTiddlerToolbar(title,editor) {
  _createTiddlerToolbar(title,editor);
  var theToolbar = document.getElementById("toolbar" + title);
  if(!editor) {
    createTiddlyButton(theToolbar,config.messages.revisionsButtonLabel,config.messages.revisionsTooltip,onClickToolbarRevisions);
    insertSpacer(theToolbar);
  }
};
_createTiddlerToolbar = createTiddlerToolbar;
createTiddlerToolbar = ziddlyCreateTiddlerToolbar;

currentTiddlerRevisions = [];
function displayTiddlerRevision(title, revision, src) {
  ziddlyStatus('loading...');
  currentTiddlerRevisions[title] = revision;
  revision = revision ? '&revision=' + revision : '';
  ajax.get('?action=get&id=' + title + revision + '&' + noCache(), displayTiddlerRevisionCallback)
};

function displayTiddlerRevisionCallback(encoded) {
  if(encoded != '-') {
    var parts = encoded.split('\n');
    var tiddler = new Tiddler();
    var title = parts[0];
    tiddler.set(title, parts[1].replace(regexpBackSlashEss, '\\').replace(regexpBackSlashEn, '\n').replace(/&lt;/g, '<').replace(/&gt;/g, '>'), parts[2], Date.convertFromYYYYMMDDHHMM(parts[3]), parts[4]);
    store.tiddlers[title] = tiddler;
    refreshTiddler(title);
    store.tiddlers[title].revisionKey = currentTiddlerRevisions[title];
  }
  ziddlyStatus(false);
};

function onClickToolbarRevisions(e) {
  if(!e) var e = window.event;
  clearMessage();
  var theTarget = resolveTarget(e);
  var target = this;
  if(this.parentNode.id) {
    var title = this.parentNode.id.substr(7);
    var callback = function(r) {
      var popup = createTiddlerPopup(target);
      var revisions = r.split('\n');
      for(var i=0; i<revisions.length; i++) {
        var parts = revisions[i].split(' ');
        if(parts.length>1) {
          var modified = Date.convertFromYYYYMMDDHHMM(parts[0]);
          var key = parts[1];
          var button = createTiddlyButton(createTiddlyElement(popup,"li"), modified.toLocaleString(), config.messages.viewRevisionTooltip, function(){displayTiddlerRevision(this.getAttribute('tiddlerTitle'), this.getAttribute('revisionKey'), this); return false;}, 'tiddlyLinkExisting tiddlyLink');
          button.setAttribute('tiddlerTitle', title);
          button.setAttribute('revisionKey', key);
          var tiddler = store.tiddlers[title];
          if(tiddler.revisionKey == key || (!tiddler.revisionKey && i==0))
            button.className = 'revisionCurrent';
        }
      }
      scrollToTiddlerPopup(popup,false);
    };
    ajax.get('?action=get_revisions&id=' + title + '&' + noCache(), callback);
  }
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
  return(false);
};

function initZiddly() {
  // run the early skin init method (if it exists)
  if(window.skinInitEarly) window.skinInitEarly();

  _main();

  var sidebar = document.getElementById('sidebar');

  // add the XML and YAML icons
  var xmlIcon = document.createElement('div');
  xmlIcon.id = 'xmlIcon';
  xmlIcon.innerHTML = 'alternate formats:<br/><a href="?format=xml" title="RSS"><img src="http://parmenides.objectis.net/reason/ZiddlyWiki/images/xml.gif" border="0"/></a> <a href="?format=yaml" title="YAML"><img src="http://parmenides.objectis.net/reason/ZiddlyWiki/images/yaml.gif" border="0"/></a>';
  sidebar.appendChild(xmlIcon);

  // add the ZW badge graphic
  var zwBadge = document.createElement('div');
  zwBadge.id = 'zwBadge';
  zwBadge.innerHTML = '<a href="http://ziddlywiki.com/" title="powered by ZiddlyWiki"><img src="http://parmenides.objectis.net/reason/ZiddlyWiki/images/badge.png" alt="powered by ZiddlyWiki" border="0"/></a>';
  sidebar.appendChild(zwBadge);
};
_main = main;
main = initZiddly;

function ziddlyOnClickToolbarDelete(e) {
  if(confirm('Are you sure you want to delete this tiddler?'))
    _onClickToolbarDelete.call(this, e);
  return false;
};
_onClickToolbarDelete = onClickToolbarDelete;
onClickToolbarDelete = ziddlyOnClickToolbarDelete;

function permaviewHash() {
  var tiddlerDisplay = document.getElementById("tiddlerDisplay");
  var links = [];
  for(var t=0; t<tiddlerDisplay.childNodes.length; t++) {
    var tiddlerName = tiddlerDisplay.childNodes[t].id.substr(7);
    links.push(String.encodeTiddlyLink(tiddlerName));
  }
  return encodeURIComponent(links.join(" "));
}

function getZiddlyURL(without_hash) {
  var p = location.pathname;
  if(p.substring(p.length-1) != '/') p += '/';
  var url = location.protocol + '//' + location.host + p;
  if(!without_hash) url += '%23' + permaviewHash();
  return url
};

function askToLogin() {
  if(confirm(config.messages.loginToEdit)) setTimeout("location.replace('?action=login&' + ieurl + 'redirect_to=' + getZiddlyURL());", 10);
};

_onClickToolbarEdit = onClickToolbarEdit;
onClickToolbarEdit = function(e) {
  if(loggedIn || anonEdit) {
    if(isProtectedTiddler(this.parentNode.id.substr(7)))
      alert(config.messages.protectedTiddler)
    else
      _onClickToolbarEdit.call(this, e);
  } else {
    askToLogin();
  }
  return false;
};
_onDblClickTiddler = onDblClickTiddler;
onDblClickTiddler = function(e) {
  if(loggedIn || anonEdit) {
    if(isProtectedTiddler(this.id.substr(7)))
      alert(config.messages.protectedTiddler)
    else
      _onDblClickTiddler.call(this, e);
  } else {
    askToLogin();
  }
  return false;
};

function isProtectedTiddler(name) {
  if(isAdmin) return false;
  for(var i=0;i<config.protectedTiddlers.length;i++) {
    if(config.protectedTiddlers[i] == name) return true;
  }
};

function checkUnsavedChanges() {};