var clipboard;
function Clipboard (ty, files) {
    this.type = ty;
    this.files = files;
}

function copyToClipboard(files) {
    if (clipboard) {
	for (var i = 0; i < clipboard.files.length; i++) {
	    mainPanel.getComponent(0).removeDashed(clipboard.files[i]);
	}
    }

    clipboard = new Clipboard("copy", files);
    var result = "<br />";
    var i;
    for (i = 0; i < files.length; i++) {
	var filename = files[i].substring(files[i].lastIndexOf("/") + 1);
	filename = escapeName(filename);
	result += filename + "<br />";
    }

    if (i < copycut_thresh_n) {
	myAlert("", maketextHandle.maketext("add clipboard", result));
    } else {
	myAlert("", maketextHandle.maketext("add clipboard n", i));
    }
}

function cutToClipboard(files) {
    if (clipboard) {
	for (var i = 0; i < clipboard.files.length; i++) {
	    mainPanel.getComponent(0).removeDashed(clipboard.files[i]);
	}
    }

    clipboard = new Clipboard("cut", files);
    var result = "<br />";
    var i;
    for (i = 0; i < files.length; i++) {
	var filename = files[i].substring(files[i].lastIndexOf("/") + 1);
	filename = escapeName(filename);
	mainPanel.getComponent(0).addDashed(files[i]);
	result += filename + "<br />";
    }

    if (i < copycut_thresh_n) {
	myAlert("", maketextHandle.maketext("cut clipboard", result));
    } else {
	myAlert("", maketextHandle.maketext("cut clipboard n", i));
    }
}

function pasteFromClipboard() {
    if (clipboard) {
	var sources = clipboard.files;
	var destination = treePanel.selModel.selNode.path;
	if (clipboard.type == "copy") {
	    rpc_with_existancecheck(destination, sources,
				    function(files) {
					if (files.length < copycut_thresh_n) {
					    myAlert("", maketextHandle.maketext("paste file copy", files.map(escapeName).join("<br />")));
					} else {
					    myAlert("", maketextHandle.maketext("paste file n copy", files.length));
					}

					var _files = new Array();
					var _files_dup = new Array();
					for (var i = 0; i < files.length; i++) {
					    if (files[i] && files[i].startsWith(destination) &&
						!files[i].substring(destination.length + 1).include("/")) {
						_files_dup.push(files[i]);
					    } else {
						_files.push(files[i]);
					    }
					}

					rpc_cp(_files, destination,
					       function (response, request) {
						   var cb = function() {
						       if (_files_dup.length != 0) {
							   var file = _files_dup.pop();
							   rpc_ls(destination,
								  function (response, request) {
								      var dir = eval(response.responseText);
								      rpc_cp([file], destination + "/" + makeNewFileName(file, dir),
									     function() {
										 cb();
									     },
									     error_on_rpc_cp);
								  },
								  error_on_rpc_ls);
						       } else {
							   var destNode = treePanel.getNodeById(escapeName(destination));
							   treePanel.loader.load(destNode,
										 function() {
										     destNode.expand();
										     treePanel.getSelectionModel().select(destNode);
										     mainPanel.getComponent(0).updateView(destNode);
										 });
						       }
						   };
						   cb();
					       }, error_on_rpc_cp);

					
				    });
	} else if (clipboard.type == "cut") {
	    rpc_with_existancecheck(destination, sources,
				    function(files) {
					if (files.length < copycut_thresh_n) {
					    myAlert("", maketextHandle.maketext("paste file cut", files.map(escapeID).join("<br />")));
					} else {
					    myAlert("", maketextHandle.maketext("paste file n cut", files.length));
					}

					rpc_mv(files, destination,
					       function (response, request) {

						   var _files = files.map(function(file) {
									      return file.substring(0, file.lastIndexOf("/"));
									  }).uniq();
						   var i = 0;
						   var cb = function() {
						       if (i < _files.length) {
							   var node = treePanel.getNodeById(escapeID(_files[i]));
							   i++;
							   treePanel.loader.load(node, cb);
						       } else {
							   var destNode = treePanel.getNodeById(escapeID(destination));
							   treePanel.loader.load(destNode,
										 function() {
										     destNode.expand();
										     treePanel.getSelectionModel().select(destNode);
										     mainPanel.getComponent(0).updateView(destNode);
										 });

						       }
						   };
						   cb();

						   // Ctrl-X されたものを繰り返し Ctrl-V しようとするときには，
						   // 2 回目以降は Ctrl-C のように振舞う
						   sources = sources.map(function(file) {
									     return destination + file.substring(file.lastIndexOf("/"), file.length);
									 });
						   clipboard = new Clipboard("copy", sources);
					       }, error_on_rpc_mv);

				    });
	}
    }
}
