/* XUL code based on http://www.xulplanet.com/tutorials/xultu/clipboard.html */

/* Clipboard class */
function Clipboard() {
	this.defaults = function() {
		return {
			html: false,
			mozErrMessage: "Please, set option 'signed.applets.codebase_principal_support' to true in your about:config"
		}};

	/* clipboard operations */
	this.content = function() {
		var options = $.extend($.clipboard.defaults(), options);
		if (arguments.length > 0) {
			/* set clipboard content */
			var copyText = arguments[0];
			if (window.clipboardData) {
				window.clipboardData.setData("Text", copyText);
				return true;
			} else if (window.netscape) {
				try {
					netscape.security.PrivilegeManager
						.enablePrivilege('UniversalXPConnect');
				} catch (e) {
					alert(options["mozErrMessage"]);
					return false;
				}
				var str = Components.classes["@mozilla.org/supports-string;1"]
					.createInstance(Components.interfaces.nsISupportsString);
				if (!str) {
					return false;
				}
				str.data = copyText;
				var trans = Components.classes["@mozilla.org/widget/transferable;1"]
					.createInstance(Components.interfaces.nsITransferable);
				if (!trans) {
					return false;
				}
				trans.addDataFlavor("text/unicode");
				trans.setTransferData("text/unicode",str, copyText.length * 2);
				var clipid = Components.interfaces.nsIClipboard;
				var clip = Components.classes["@mozilla.org/widget/clipboard;1"]
					.getService(clipid);
				if (!clip) {
					return false;
				}
				clip.setData(trans, null, clipid.kGlobalClipboard);
				return true;
			}
			return false;
		} else {
			/* get clipboard content */
			var content = false;
			if (window.clipboardData) {
				content = window.clipboardData.getData("Text")
			} else if (window.netscape) {
				try {
					netscape.security.PrivilegeManager
						.enablePrivilege('UniversalXPConnect');
				} catch (e) {
					alert(options["mozErrMessage"]);
					return false;
				}
				var clip = Components.classes["@mozilla.org/widget/clipboard;1"]
					.getService(Components.interfaces.nsIClipboard);
				if (!clip) {
					return false;
				}
				var trans = Components.classes["@mozilla.org/widget/transferable;1"]
					.createInstance(Components.interfaces.nsITransferable);
				if (!trans) {
					return false;
				}
				trans.addDataFlavor("text/unicode");

				clip.getData(trans, clip.kGlobalClipboard);
				var str = new Object();
				var strLength = new Object();
				trans.getTransferData("text/unicode", str, strLength);
				if (str) {
					str = str.value.QueryInterface(
							Components.interfaces.nsISupportsString);
					if (str) {
						content = str.data.substring(0,
								strLength.value / 2);
					}
				}
			}
			return content;
		}
	}
	return;
};

$.clipboard = new Clipboard();

$.fn.copy = function(options) {
	var options = $.extend($.clipboard.defaults(), options);

	var nodeName = this[0].nodeName.toLowerCase();
	var copyText;
	if (nodeName == "input" || nodeName == "textarea") {
		copyText = this.val();
	} else {
		if (options["html"]) {
			copyText = this.html();
		} else {
			copyText = this.text();
		}
	}

	return $.clipboard.content(copyText);
};

$.fn.cut = function(options) {
	var options = $.extend($.clipboard.defaults(), options);

	var nodeName = this[0].nodeName.toLowerCase();
	var copyText;
	if (nodeName == "input" || nodeName == "textarea") {
		copyText = this.val();
		this.val("");
	} else {
		if (options["html"]) {
			copyText = this.html();
		} else {
			copyText = this.text();
		}
		this.empty();
	}

	return $.clipboard.content(copyText);
};

$.fn.paste = function(options) {
	var options = $.extend($.clipboard.defaults(), options);
	var pasteText = $.clipboard.content();
	if (pasteText) {
		var nodeName = this[0].nodeName.toLowerCase();
		if (nodeName == "input" || nodeName == "textarea") {
			this.val(pasteText);
		} else {
			if (options["html"]) {
				this.html(pasteText);
			} else {
				this.text(pasteText);
			}
		}
	}
};

