import de.dtele.control.MediaManager;
import de.dtele.control.events.SourceEvent;
import de.dtele.data.ISource;
import de.dtele.net.MediaRequest;
import de.dtele.providers.ProviderManager;
import de.dtele.settings.SettingsManager;
import de.dtele.ui.components.events.ResourceListEvent;
import de.dtele.ui.components.events.SourceInputEvent;
import de.dtele.ui.components.events.SourceListEvent;
import de.dtele.ui.components.events.UploadButtonEvent;
import de.dtele.ui.components.viewer.AudioResourceViewer;
import de.dtele.ui.components.viewer.ImageResourceViewer;
import de.dtele.ui.components.viewer.TextResourceViewer;
import de.dtele.ui.components.viewer.VideoResourceViewer;

import flash.events.Event;

import mx.managers.BrowserManager;
import mx.managers.IBrowserManager;

protected var browserManager:IBrowserManager = BrowserManager.getInstance();

/**
 * Provides the enabled state of the upload button
 * 
 * @param source The source to check
 * @return Whether upload is possible to the source
 */
protected function uploadButtonEnabledDataProvider(source:ISource):Boolean {
  
  if (!source) { return false; }
  
  return MediaRequest.ADD in source.allowed;
}

/**
 * Performs initial setups
 */
protected function onCreationComplete(e:Event):void {
  
  // Set up initial browser title
  browserManager.init("", "Medienverwaltung");
  
  MediaManager.instance.addEventListener(SourceEvent.SELECTED, this.onSourceSelected);
  
  SettingsManager.instance.setDefault("visibleProperties", ["title", "type", "size"]);
  
  ProviderManager.instance.addProvider("resourceViewer", "image", ImageResourceViewer);
  ProviderManager.instance.addProvider("resourceViewer", "text", TextResourceViewer);
  ProviderManager.instance.addProvider("resourceViewer", "audio", AudioResourceViewer);
  ProviderManager.instance.addProvider("resourceViewer", "video", VideoResourceViewer);
  
  // Restore state from settings if possible
  MediaManager.instance.restoreState();
}

/**
 * Updates the browser title after source selection
 */
protected function onSourceSelected(e:SourceEvent):void {
  
  var title:String = "Medienverwaltung";
  
  if (e.source) {
    
    title += ": " + e.source.properties.title;
  }
  
  // Uses ExternalInterface internally to
  // communicate with the embedding document
  browserManager.setTitle(title);
}

/**
 * Requests addition of a new source
 */
protected function onSourceInput(e:SourceInputEvent):void {
  
  MediaManager.instance.addSource(e.value);
}

/**
 * Updates the selected source
 */
protected function onSourceSelect(e:SourceListEvent):void {
  
  MediaManager.instance.selectedSource = e.source;
}

/**
 * Requests removal of a source
 */
protected function onSourceClose(e:SourceListEvent):void {
  
  MediaManager.instance.removeSource(e.source);
}

/**
 * Updates the selected resource
 */
protected function onResourceSelected(e:ResourceListEvent):void {
  
  if (e.resource) {
    
    this.focusManager.setFocus(this.resourceViewer);
  } else {
    
    this.focusManager.setFocus(null);
  }
  
  MediaManager.instance.selectedResource = e.resource;
}

/**
 * Requests addition of files after user selection
 */
protected function onUploadButtonFilesSelected(e:UploadButtonEvent):void {
  
  MediaManager.instance.addResources(e.files, MediaManager.instance.selectedSource);
}