////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////

package mx.net
{

 import org.apache.royale.file.FileProxy;
 import org.apache.royale.file.beads.FileBrowserWithFilter;
 import mx.utils.ByteArray;
 import org.apache.royale.file.beads.FileLoader;
 import org.apache.royale.file.beads.FileModel;
 import org.apache.royale.events.Event;
 import org.apache.royale.net.URLRequest;
 import org.apache.royale.file.beads.FileUploader;
 import mx.net.beads.FileUploaderUsingFormData;
 import mx.net.supportClasses.ByteArrayFileLoader;
 import mx.net.beads.FileLoaderAndUploader;

   public class FileReference extends FileProxy
   {
      
      private var _model:FileModel;
      private var _browser:FileBrowserWithFilter;
      private var _loader:FileLoader;
      private var _uploader:FileLoaderAndUploader;
      public function FileReference()
      {
		  super();
		  _model = new FileModel();
		  _browser = new FileBrowserWithFilter();
		  _uploader = new FileLoaderAndUploader();
		  addBead(new FileUploaderUsingFormData());
		  addBead(_model);
		  addBead(_browser);
		  addBead(_uploader);
		  var uploadBead:FileUploader = getBeadByType(FileUploader) as FileUploader;
		  uploadBead.contentType = "multipart/form-data";
		  addEventListener("modelChanged", modelChangedHandler);
	  }
  
      
      public function browse(typeFilter:Array = null):Boolean
      {
         var allFilters:Array = [];
         if (typeFilter)
		 {
			for (var i:int = 0; i < typeFilter.length; i++)
			{
				var fileFilter:FileFilter = typeFilter[i] as FileFilter;
				var filters:Array = fileFilter.extension.split(";");
				for (var j:int = 0; j < filters.length; j++)
				{
					var filter:String = filters[j];
					if (filter.charAt(0) == '*')
					{
						filter = filter.substring(1);
						filters[j] = filter;
					}
				}
				allFilters = allFilters.concat(filters);
			}
			_browser.filter = allFilters.join(",");
		 }
		 _browser.browse();
         return true;
      }
		 
	  public function load():void
	  {
		  if (!_loader)
		  {
			  // FileLoaderAndUploader has injected this
			  _loader = getBeadByType(ByteArrayFileLoader) as FileLoader;
			  if (!_loader)
			  {
				   _loader = new ByteArrayFileLoader();
				   addBead(_loader);
			  }
		  }
		  _loader.addEventListener(Event.COMPLETE, loaderCompleteHandler);
		  _loader.load();
	  }
	
	  public function cancel():void
	   {
		   _uploader.cancel();
	   }

	  public function loaderCompleteHandler(event:Event):void
	  {
		  dispatchEvent(new Event(Event.COMPLETE));
	  }
	  
	  public function get data():ByteArray
	  {
        return blob as ByteArray; // need to create a model that actually returns a ByteArray
	  }

	  public function upload(request:URLRequest, uploadDataFieldName:String = "Filedata", testUpload:Boolean = false):void
	  {
		  _uploader.referenceRequest = request;
		  _uploader.uploadDataFieldName = uploadDataFieldName;
		  _uploader.upload(request.url);
	  }

	// not implemented
	  public function download(request:URLRequest, defaultFileName:String = null):void {}
	 
	  
	  private function modelChangedHandler(event:Event):void
	  {
		  dispatchEvent(new Event(Event.SELECT));
	  }
	  
	  /**
	   *  @royaleignorecoercion HTMLAnchorElement
	   */
	  public function save(data:*, defaultFileName:String = null):void
      {
		COMPILE::JS
		{
		  var a:HTMLAnchorElement = document.createElement("a") as HTMLAnchorElement;
		  a.href = URL.createObjectURL(new Blob([data]));
		  if (defaultFileName == null)
		  {
		  		  a.setAttribute("download", "download.pdf");
		  		  a.text = "download.pdf";
		  }
		  else
          {
		  		  a.setAttribute("download", defaultFileName);
		  		  a.text = defaultFileName;
          }
          document.body.appendChild(a);
 		  a.click();
  		  document.body.removeChild(a);
		}
      }

      

   }

            

}
