text: // BackgroundImage plugin for Xinha
  // Sponsored by http://www.schaffrath-neuemedien.de
  // Implementation by Udo Schmal
  // based on TinyMCE (http://tinymce.moxiecode.com/) Distributed under LGPL by Moxiecode Systems AB
  //
  // Distributed under the same terms as Xinha itself.
  // This notice MUST stay intact for use (see license.txt).
  
  function BackgroundImage(editor) {
    this.editor = editor;
    var cfg = editor.config;
    var self = this;
    cfg.registerButton({
      id       : "bgImage",
      tooltip  : Xinha._lc("Set page background image",  'BackgroundImage'),
      image    : editor.imgURL("ed_bgimage.gif", "BackgroundImage"),
      textMode : false,
      action   : function(editor) {
        self.show();
      }
    })
    cfg.addToolbarElement("bgImage", "inserthorizontalrule", 1);
  }
  
  BackgroundImage._pluginInfo = {
    name          : "BackgroundImage",
    version       : "1.0",
    developer     : "Udo Schmal",
    developer_url : "http://www.schaffrath-neuemedien.de/",
    c_owner       : "Udo Schmal & Schaffrath NeueMedien",
    sponsor       : "L.N.Schaffrath NeueMedien",
    sponsor_url   : "http://www.schaffrath-neuemedien.de.de/",
    license       : "htmlArea"
  };
  
  BackgroundImage.prototype.onGenerateOnce = function(editor){
    // Load assets
    var self = BackgroundImage;
    if (self.loading) return;
  
    // A list of jpgs that are expected to be in ./backgrounds with thumbnails.
    var backgrounds = {blufur:'',palecnvs:'', ppplcnvs:'', ylwsand:''};
  
    self.loading = true;
    self.methodsReady = true;
  
    // When we get back from loading the dialog, we'll process our image template to handle as many images as specified.
    Xinha._getback(Xinha.getPluginDir('BackgroundImage') + '/dialog.html', function(getback) {
  
      // Replace the template line with one line per image.
      self.html = getback.replace(/<template>(.*?)<\/template>/ig, function(fullString, template) {
        var replacement = '';
  
        for (bg in backgrounds)
        {
          var thumbURL = Xinha.getPluginDir('BackgroundImage') + '/backgrounds/thumbnails/' + bg + '.jpg';
          var imageURL = Xinha.getPluginDir('BackgroundImage') + '/backgrounds/' + bg + '.jpg';
          replacement += template.replace(/%thumbnail%/,thumbURL).replace(/%image%/,imageURL);
        }
        return replacement;
      });
      self.dialogReady = true;
    });
  }
  
  BackgroundImage.prototype.onUpdateToolbar = function(editor){
    // Keep our toolbar image greyed until we're fully loaded.
    if (!(BackgroundImage.dialogReady && BackgroundImage.methodsReady))
    {
      this.editor._toolbarObjects.BackgroundImage.state("enabled", false);
    }
    else this.onUpdateToolbar = null;
  
  }
  
  BackgroundImage.prototype.prepareDialog = function(editor){
    var self = this;
    var editor = this.editor;
  
    var dialog = this.dialog = new Xinha.Dialog(editor, BackgroundImage.html, 'Xinha',{width:400})
    //
    // Hookup the buttons with our actions
    dialog.getElementById('set').onclick = function() {self.apply();}
    dialog.getElementById('delete').onclick = function() {self.deleteBg();}
    dialog.getElementById('cancel').onclick = function() { self.dialog.hide()};
    
    this.dialogReady = true;
  }
  
  BackgroundImage.prototype.show = function(editor){
   if (!this.dialog) this.prepareDialog();
  
    var editor = this.editor;
  
    // After clearing the background property, it returns the current URL, and so
    // we need to check the extension to find out if it really has a background.
    if (editor._doc.body.background.split('.').pop() in {jpg:'', gif:'', png:'', jpeg:'', tiff:''})
    {
      var background = editor._doc.body.background;
    }
    else
    {
      var background = '';
    }
    var values = 
    {
      "background"      : background
    }
  
    // now calling the show method of the Xinha.Dialog object to set the values and show the actual dialog
    this.dialog.show(values);
  }
  
  BackgroundImage.prototype.deleteBg = function(){
    var editor = this.editor;
    this.dialog.hide();
  
    if (Xinha.is_ie)
      editor.focusEditor();
  
      editor._doc.body.background = "";
  }
  
  BackgroundImage.prototype.apply = function(){
    var editor = this.editor;
    var doc = editor._doc;
    
    // selection is only restored on dialog.hide()
    var param = this.dialog.hide();
    // assign the given arguments
    
    if (Xinha.is_ie)
      editor.focusEditor();
  
    doc.body.background = param.background;
  };
  