Event.observe(document, 'dom:loaded', function(e) {
  // navigate folders observer
  $$('.folder').each(function(folder) {
    folder.observe('click', function(e) {
      var el = $(this);
      toggleFilesAndFoldersFor(el);
    });
  });
  
  // open/close all observer
  $('group_name_header').observe('click', function(ev) {
    var group_name_header = $(this);
    if (group_name_header.hasClassName('close_folder')) {
      group_name_header.removeClassName('close_folder');
      group_name_header.down('.sign').update('+');
      hideAllFolders();
      return;
    }
    
    group_name_header.addClassName('close_folder');
    group_name_header.down('.sign').update('-');
    $$('.file').invoke('appear');
    $$('.sub_folder').each(function(el) {
      el.down('.sign').update('-');
      el.addClassName('close_folder');
      el.removeClassName('open_folder');
      el.appear();
    });
    $$('.top_folder').each(function(el) {
      el.down('.sign').update('-');
      el.addClassName('close_folder');
      el.removeClassName('open_folder');
    });
  });

  // perform search observer
  $('search_field').observe('keyup', function(ev) {
    if (Event.KEY_ESC==ev.keyCode) {
      this.value = '';
      $$('.file').invoke('hide');
      return;
    }

    if ([
      Event.KEY_TAB,
      Event.KEY_RETURN,
      Event.KEY_ESC,
      Event.KEY_LEFT,
      Event.KEY_UP,
      Event.KEY_RIGHT,
      Event.KEY_DOWN,
      Event.KEY_HOME,
      Event.KEY_END,
      Event.KEY_PAGEUP,
      Event.KEY_PAGEDOWN,
      Event.KEY_INSERT].any(function(k) {return ev.keyCode==k;})) {
      return;
    }
    
    var search_term = this.value;
    if (search_term.length < 3) {
      return;
    }
    
    var matches = $A($$('.file_name')).findAll(function(file_name) {
      return file_name.innerHTML.match(new RegExp(search_term, 'i'));
    });

    var file_ids = matches.collect(function(file_match) {
      //console.log(file_match.up('.file'));
      return file_match.up('.file').id;
    });

    //console.log(search_term);
    //console.log(file_ids);
    
    $$('.file').invoke('hide');
    
    file_ids.each(function(file_id) {
      $(file_id).appear();
    });
  });

  // initially hide all sub_folders and files
  hideAllFolders();
});

function hideAllFolders() {
  $$('.file').invoke('hide');
  $$('.sub_folder').each(function(el) {
    el.down('.sign').update('+');
    el.addClassName('open_folder');
    el.hide();
  });
  $$('.top_folder').each(function(el) {
    el.down('.sign').update('+');
    el.addClassName('open_folder');
  });
}

function toggleFilesAndFoldersFor(folder) {  
  //console.log(folder);

  if (folder.hasClassName('open_folder')) {
    folder.down('.sign').update('-');
    $$('.file.'+folder.id).invoke('show');
    $$('.folder.parent_'+folder.id).invoke('show');
  }
  else {
    folder.down('.sign').update('+');
    $$('.file.'+folder.id).invoke('hide');    
    $$('.folder.parent_'+folder.id).each(function(el) {
      el.hide();
      el.addClassName('close_folder');
      el.removeClassName('open_folder');
      toggleFilesAndFoldersFor(el);
    });
  }

  if (folder.hasClassName('open_folder')) {
    folder.addClassName('close_folder');
    folder.removeClassName('open_folder');
  }
  else {
    folder.addClassName('open_folder');
    folder.removeClassName('close_folder');
  }
}
