<?xml version="1.0"?>

<!-- ***** BEGIN LICENSE BLOCK *****
   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
   -
   - The contents of this file are subject to the Mozilla Public License Version
   - 1.1 (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.mozilla.org/MPL/
   -
   - Software distributed under the License is distributed on an "AS IS" basis,
   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
   - for the specific language governing rights and limitations under the
   - License.
   -
   - The Original Code is BlueGriffon.
   -
   - The Initial Developer of the Original Code is
   - Disruptive Innovations SARL.
   - Portions created by the Initial Developer are Copyright (C) 2008
   - the Initial Developer. All Rights Reserved.
   -
   - Contributor(s):
   -   Daniel Glazman (daniel.glazman@disruptive-innovations.com), Original Author
   -
   - Alternatively, the contents of this file may be used under the terms of
   - either the GNU General Public License Version 2 or later (the "GPL"), or
   - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
   - in which case the provisions of the GPL or the LGPL are applicable instead
   - of those above. If you wish to allow use of your version of this file only
   - under the terms of either the GPL or the LGPL, and not to allow others to
   - use your version of this file under the terms of the MPL, indicate your
   - decision by deleting the provisions above and replace them with the notice
   - and other provisions required by the LGPL or the GPL. If you do not delete
   - the provisions above, a recipient may use your version of this file under
   - the terms of any one of the MPL, the GPL or the LGPL.
   -
   - ***** END LICENSE BLOCK ***** -->

<!DOCTYPE bindings [
  <!ENTITY % filepickerbuttonDTD SYSTEM "chrome://bluegriffon/locale/filepickerbutton.dtd" >
  %filepickerbuttonDTD;
]>


<bindings id="filepickerbuttonBindings"
          xmlns="http://www.mozilla.org/xbl"
          xmlns:html="http://www.w3.org/1999/xhtml"
          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          xmlns:xbl="http://www.mozilla.org/xbl">

  <binding id="filepickerbutton">

    <resources>
      <stylesheet src="chrome://bluegriffon/content/bindings/filepickerbutton.css"/>
    </resources>

    <content>
      <xul:toolbarbutton xbl:inherits="disabled,tooltiptext=title"
                         imagetheming="never"
                         anonid="button" />
      <children/>
    </content>

    <implementation>
      <property name="mButton"
                readonly="true"
                onget="return document.getAnonymousElementByAttribute(this, 'anonid', 'button')" />

      <property name="value"
                onget="return this.getAttribute('value');"
                onset="this.setAttribute('value', val);"/>

      <property name="disabled">
        <getter>
        <![CDATA[
          return this.mButton.getAttribute('disabled');
        ]]>
        </getter>
        <setter>
        <![CDATA[
          if (val) {
            this.mButton.setAttribute('disabled', val);
            this.setAttribute('disabled', val);
          }
          else {
            this.mButton.removeAttribute('disabled');
            this.removeAttribute('disabled');
          } 
        ]]>
        </setter>
      </property>

      <field name="fp">null</field>
      <field name="nsIFP">Components.interfaces.nsIFilePicker</field>

      <constructor>
        <![CDATA[
          Components.utils.import("resource://gre/modules/Services.jsm");
          Components.utils.import("resource://gre/modules/editorHelper.jsm");
          Components.utils.import("resource://gre/modules/filePicker.jsm");

          var w = EditorUtils.getCurrentEditorWindow();
          if (w &&
              "EBookManager" in w &&
              w.EBookManager.isUrlSpecInBook(EditorUtils.getDocumentUrl())) {
            try {
              this.fp = new diFilePicker();
              this.fp.init(window, this.getAttribute("title"),
                           parseInt(this.getAttribute("mode")));

              var w = EditorUtils.getCurrentEditorWindow();
              var epubElt = w.document.querySelector("epub2,epub3,epub31");
              var ebook = epubElt.getUserData("ebook");
              this.fp.displayDirectory = ebook.opfFile.parent.clone();

              var filters = this.getAttribute("filters");
              if (filters) {
                var filtersArray = filters.split(",");
                for (var i = 0; i < filtersArray.length; i++) {
                  var f = filtersArray[i];
                  switch (f) {
                    case "filterAll":     this.fp.appendFilters(this.nsIFP.filterAll); break;
                    case "filterHTML":    this.fp.appendFilters(this.nsIFP.filterHTML); break;
                    case "filterText":    this.fp.appendFilters(this.nsIFP.filterText); break;
                    case "filterImages":  this.fp.appendFilters(this.nsIFP.filterImages); break;
                    case "filterAudio":   this.fp.appendFilters(this.nsIFP.filterAudio); break;
                    case "filterVideo":   this.fp.appendFilters(this.nsIFP.filterVideo); break;
                    default:              this.fp.appendFilter(f, f);
                  }
                }
              }
            }
            catch(e) {}

            return;
          }

          try {
            this.fp = Components.classes["@mozilla.org/filepicker;1"].
                        createInstance(this.nsIFP);
            this.fp.init(window, this.getAttribute("title"),
                         parseInt(this.getAttribute("mode")));
            var filters = this.getAttribute("filters");
            if (filters) {
              var filtersArray = filters.split(",");
              for (var i = 0; i < filtersArray.length; i++) {
                var f = filtersArray[i];
                switch (f) {
                  case "filterAll":     this.fp.appendFilters(this.nsIFP.filterAll); break;
                  case "filterHTML":    this.fp.appendFilters(this.nsIFP.filterHTML); break;
                  case "filterText":    this.fp.appendFilters(this.nsIFP.filterText); break;
                  case "filterImages":  this.fp.appendFilters(this.nsIFP.filterImages); break;
                  case "filterAudio":   this.fp.appendFilters(this.nsIFP.filterAudio); break;
                  case "filterVideo":   this.fp.appendFilters(this.nsIFP.filterVideo); break;
                  default:              this.fp.appendFilter(f, f);
                }
              }
            }
          }
          catch(e) {}
        ]]>
      </constructor>

      <method name="appendFilters">
        <parameter name="aFilter"/>
        <body>
        <![CDATA[
          try {
            this.fp.appendFilters(aFilter);
          }
          catch(e) {}
        ]]>
        </body>
      </method>

      <method name="appendFilter">
        <parameter name="aTitle"/>
        <parameter name="aFilter"/>
        <body>
        <![CDATA[
          try {
            this.fp.appendFilter(aTitle, aFilter);
          }
          catch(e) {}
        ]]>
        </body>
      </method>

     </implementation>

    <handlers>
      <handler event="command" phase="capturing">
        <![CDATA[
          try {
            if (this.fp.show() == this.nsIFP.returnOK &&
                this.fp.fileURL.spec && this.fp.fileURL.spec.length > 0)
            {
              var spec = this.fp.fileURL.spec;
              if (this.hasAttribute("processor"))
                spec = eval(this.getAttribute("processor") + "(spec)");
              this.setAttribute("value", spec);
              if (this.hasAttribute("control"))
              {
                var c = document.getElementById(this.getAttribute("control"));
                c.inputField.value = spec;
              }
            }
          }
          catch(e) {}
        ]]>
      </handler>
    </handlers>

  </binding>

</bindings>
