/*********************************************************
* Used to copy arbitrary strings to the user's clipboard
*
* Usage: 
*   var cb = new ClipboardCopier("text to copy",options);
*
* Options:
*   
**********************************************************/

var ClipboardCopier = Class.create({
  initialize: function(copyText,options) {
    // default options
    if( !options ) options = {}
    if( !options.style ) options.style = "";
    if( !options.bottom && !options.top && !options.before && !options.after ) options.bottom = document.body;
    if( !options.buttonWidth ) options.buttonWidth = 16;
    if( !options.buttonHeight ) options.buttonHeight = 16;
    if( !options.upIcon ) options.upIcon = "/images/copyToClipboard.png";
    if( !options.downIcon ) options.downIcon = "/images/copiedToClipboard.png";

    this.upIcon = options.upIcon;
    this.downIcon = options.downIcon;
    this.onClickCallbacks = options.onClick ? [options.onClick] : [];
     
    // create the clipboard div
    var cb_outer = new Element("div",{"style":"overflow:hidden; position:relative; z-index: 1; width: " + options.buttonWidth + "px; height: " + options.buttonHeight + "px; " + options.style})
    cb_outer.id = "clipboard" + ClipboardCopier.numInstances + "_wrapper";
    var cb_replace = new Element("div");
    cb_replace.id = "clipboard" + ClipboardCopier.numInstances
    cb_outer.innerHTML = "<img style='position: absolute; z-index: -1; top:0px; left: 0px;' src='" + options.upIcon + "' />";
    cb_outer.insert({bottom:cb_replace});
    
    if( options.bottom )      Element.insert(options.bottom,{bottom:cb_outer});
    else if( options.top )    Element.insert(options.top,{top:cb_outer});
    else if( options.before ) Element.insert(options.before,{before:cb_outer});
    else if( options.after )  Element.insert(options.after,{after:cb_outer});
      
    // set up the copier swf
    var flashvars = {
      copyText: copyText,
      copierID: ClipboardCopier.numInstances,
      allowScriptAccess: "sameDomain"
    };
 
	  var params = { wmode: "transparent" };
	   
    var attributes = { };
    
	  // insert the swf
	  swfobject.embedSWF("/swf/Copier.swf", cb_replace.id, "100px", "100px", 
	                     "9.0.0", null, flashvars, params, attributes);
	  
    this.copier = $(cb_replace.id);
    this.img = cb_outer.down("img");
    
    ClipboardCopier.instances[ClipboardCopier.numInstances++] = this;
  },
  
  setStringToCopy: function(str) {
    if( this.copier ) 
      this.copier.setStringToCopy(str);
  },
  
  registerOnClickCallback: function(fn) {
    this.onClickCallbacks.push(fn);
  },
  
  onDown: function() {
    this.img.src = this.downIcon;
  },
  
  onUp: function() {
    this.img.src = this.upIcon;
    this.onClickCallbacks.each(function(fn) {
      try {
        fn();
      } catch(e) {
        ClipboardCopier.trace("CLIPBOARD ERROR: " + e.toString());
      }
    });
  }
});

ClipboardCopier.numInstances = 0;
ClipboardCopier.instances = [];

ClipboardCopier.onDown = function(id) {
  ClipboardCopier.instances[id].onDown();
}
ClipboardCopier.onUp = function(id) {
  ClipboardCopier.instances[id].onUp();
}

ClipboardCopier.DEBUG = false;
ClipboardCopier.trace = function(str) {
  if( ClipboardCopier.DEBUG == true ) {
    if( typeof(console) != "undefined" ) {
      console.info("CLIPBOARD: " + str);
    } else {
      alert("CLIPBOARD: " + str)
    }
  } 
}
