var load, rename_box, confirm_box;

document.addEvent("domready", function() {
    load = new Fx.Tween($("load-indicator"), {link: "cancel"});
    load.set("opacity", 0);

    rename_box = new Fx.Tween($('rename_box'));
    confirm_box = new Fx.Tween($('confirm_box'));
    $('rename_reset').addEvent('click', function() {
        hide_rename_box()
    });
    $('delete_reset').addEvent('click', function() {
        hide_confirm_box()
    });
        
    /*$('filemanager_actions_list').getChildren("li").each(function(action) {
      var action_name = action.className;
      if(functions[action.className] != undefined)
      {
	action.addEvent('click', functions[action.className]);
      }
    });*/
});

function indicateLoad() {
    //$("load-indicator").reveal();
    load.start("opacity", 1)
}

function indicateFinish() {
    load.start("opacity", 0)
}

function indicateSuccess() {
    indicateFinish();
    notify.alert('{{_("Success")}}.', {
             'className': 'success'
    });
}

function indicateFail() {
    indicateFinish();
    notify.alert('{{_("Failed")}}.', {
             'className': 'error'
    });
}

function show_rename_box() {
    bg_show();
    $("rename_box").setStyle('display', 'block');
    rename_box.start('opacity', 1)
}

function hide_rename_box() {
    bg_hide();
    rename_box.start('opacity', 0).chain(function() {
        $('rename_box').setStyle('display', 'none');
    });
}

function show_confirm_box() {
    bg_show();
    $("confirm_box").setStyle('display', 'block');
    confirm_box.start('opacity', 1)
}

function hide_confirm_box() {
    bg_hide();
    confirm_box.start('opacity', 0).chain(function() {
        $('confirm_box').setStyle('display', 'none');
    });
}

var FilemanagerUI = new Class({
    initialize: function(url, type) {
        this.url = url;
        this.type = type;
        this.directories = [];
	this.files = [];
        this.parseChildren();
    },

    parseChildren: function() {
        $("directories-list").getChildren("li.folder").each(function(ele) {
            var path = ele.getElements("input.path")[0].get("value");
            var name = ele.getElements("input.name")[0].get("value");
            this.directories.push(new Item(this, path, name, ele))
        }.bind(this));
	
	$("directories-list").getChildren("li.file").each(function(ele) {
            var path = ele.getElements("input.path")[0].get("value");
            var name = ele.getElements("input.name")[0].get("value");
            this.files.push(new Item(this, path, name, ele))
        }.bind(this));
    }
});

var Item = new Class({
    initialize: function(ui, path, name, ele) {
        this.ui = ui;
	this.path = path;
	this.name = name;
        this.ele = ele;
	this.directories = [];
	this.files = [];
	this.actions = new Array();
	this.actions["delete"] = this.del;
	this.actions["rename"] = this.rename;
	this.actions["mkdir"] = this.mkdir;
        this.parseElement();
        
        var pname = this.ele.getElements("span")[0];
        this.buttons = new Fx.Tween(this.ele.getElements(".buttons")[0], {link: "cancel"});
        this.buttons.set("opacity", 0);

        pname.addEvent("mouseenter", function(e) {
            this.buttons.start("opacity", 1)
        }.bind(this));

        pname.addEvent("mouseleave", function(e) {
            this.buttons.start("opacity", 0)
        }.bind(this));

    },

    parseElement: function() {
        this.ele.getChildren('span span.buttons img').each(function(img) {
	  img.addEvent('click', this.actions[img.className].bind(this));
	}, this);

	//click on the directory name must open the directory itself
	this.ele.getElements('b')[0].addEvent('click', this.toggle.bind(this));
	
	//iterate over child directories
	var uls = this.ele.getElements('ul');
	if(uls.length > 0)
	{
	  uls[0].getChildren("li.folder").each(function(fld) {
	    var path = fld.getElements("input.path")[0].get("value");
	    var name = fld.getElements("input.name")[0].get("value");
	    this.directories.push(new Item(this, path, name, fld));
	  }.bind(this));
	  uls[0].getChildren("li.file").each(function(fld) {
	    var path = fld.getElements("input.path")[0].get("value");
	    var name = fld.getElements("input.name")[0].get("value");
	    this.files.push(new Item(this, path, name, fld));
	  }.bind(this));
	}
    },

    reorderElements: function() {
      //TODO sort the main ul again (to keep data ordered after renaming something)
    },
    
    del: function(event) {
        $("confirm_form").removeEvents("submit");
        $("confirm_form").addEvent("submit", this.deleteDirectory.bind(this));

	$$("#confirm_form p").set('html', '{{_(("Are you sure you want to delete the selected item?"))}}');
	
        show_confirm_box();
        event.stop();
    },
    
    deleteDirectory: function(event) {
        hide_confirm_box();
	new Request.JSON({
            method: 'POST',
            url: "/json/filemanager/delete",
	    data: {"path": this.path, "name": this.name},
            onSuccess: function(data) {
		if(data.response == "success")
		{
		  new Fx.Tween(this.ele).start('opacity', 0);
		  var ul = this.ele.parentNode;
		  this.ele.dispose();
		  //if this was the only child, add a "empty folder" div
		  if(!ul.getChildren('li')[0])
		  {
		    var div = new Element("div", { 'html': '{{ _("Folder is empty") }}' });
		    div.replaces(ul);
		  }
		  
		  indicateSuccess();
		} else
		{
		  //error from json code...
		  indicateFail();
		}
            }.bind(this),
            onFailure: indicateFail
        }).send();
	
        event.stop();
    },
    
    rename: function(event) {
        $("rename_form").removeEvents("submit");
        $("rename_form").addEvent("submit", this.renameDirectory.bind(this));

	$("path").set("value", this.path);
        $("old_name").set("value", this.name);
        $("new_name").set("value", this.name);
        
        show_rename_box();
        event.stop();
    },

    renameDirectory: function(event) {
        hide_rename_box();
	new Request.JSON({
            method: 'POST',
            url: "/json/filemanager/rename",
            onSuccess: function(data) {
		if(data.response == "success")
		{
		  this.name = $("new_name").get("value");
		  this.ele.getElements("b")[0].set('html', $("new_name").get("value"));
		  this.reorderElements();
		  indicateSuccess();
		} else
		{
		  //error from json code...
		  indicateFail();
		}
            }.bind(this),
            onFailure: indicateFail
        }).send($("rename_form").toQueryString());
	
        event.stop();
    },
    
    mkdir: function(event) {
      new Request.JSON({
	  method: 'POST',
	  url: "/json/filemanager/mkdir",
	  data: {"path": this.path + "/" + this.name, "name": '{{_("New folder")}}'},
	  onSuccess: function(data) {
	      if(data.response == "success")
	      {
		new Request.HTML({
		    method: 'POST',
		    url: "/filemanager/get_dir",
		    data: {"path": data.path, "name": data.name},
		    onSuccess: function(li) {
			//add node as first child of ul
			var ul = this.ele.getChildren('ul')[0];
			if(!ul)
			{
			  //remove the "Folder Empty" div
			  this.ele.getChildren('div').dispose();
			  
			  //create new ul to contain subfolder
			  ul = new Element("ul");
			  ul.inject(this.ele, 'bottom');
			}
			li[0].inject(ul, 'top');
			
			//add directory as a subdirectory of the current item
			this.directories.push(new Item(this.ui, data.path, data.name, ul.firstChild));
		    }.bind(this),
		    onFailure: indicateFail
		}).send();
		indicateSuccess();
	      } else
	      {
		//error from json code...
		indicateFail();
	      }
	  }.bind(this),
	  onFailure: indicateFail
      }).send();
      
      event.stop();
    },
    
    toggle: function() {
        var child = this.ele.getElement('ul');
	if(child == null)
	  child = this.ele.getElement('div');
	
	if(child != null)
	{
	  if (child.getStyle('display') == "block") {
	      child.dissolve();
	  } else {
	      child.reveal();
	  }
	}
    }
});
