content: /**
   * Copyright 2014 55 Minutes (http://www.55minutes.com)
   *
   * Licensed 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 fiftyfive.wicket.js.datetime;
  
  import fiftyfive.wicket.js.DomReadyTemplate;
  import org.apache.wicket.request.cycle.RequestCycle;
  import org.apache.wicket.request.resource.PackageResourceReference;
  import org.apache.wicket.request.resource.ResourceReference;
  import org.apache.wicket.util.lang.Args;
  
  /**
   * A simple jQuery UI-based replacement for Wicket’s YUI-based {@code DatePicker}.
   * This implementation has the following behavior:
   * <ul>
   * <li>The
   *     <a href="http://www.famfamfam.com/lab/icons/silk/">famfamfam Silk</a>
   *     calendar icon is used as a button to show and hide the date picker.</li>
   * <li>Clicks inside the text field (i.e. giving it focus) also cause the date
   *     picker to appear automatically.</li>
   * <li>The month and year can be selected from drop-down menus.</li>
   * </ul>
   * <p>
   * Here’s how you might use it in practice:
   * <pre class="example">
   * add(DateTextField.forDatePattern("date", "MM/dd/yyyy")
   *     .setRequired(true)
   *     .add(new JQueryDatePicker())
   * );</pre>
   * <p>
   * In keeping with the fiftyfive-wicket-js design philosophy, this Java class
   * is extremely lightweight, allowing programmatic access only to change the
   * button image that is used by the picker. This should suffice for most
   * simple date picker use cases. If you want a different set of
   * date picker behavior, write a subclass and provide your own accompaning
   * JavaScript file to peform the desired initialization.
   * 
   * 
   * @since 2.0
   */
  public class JQueryDatePicker extends DomReadyTemplate
  {
      private static ResourceReference DEFAULT_IMAGE =
          new PackageResourceReference(JQueryDatePicker.class, "calendar.png");
      
      /**
       * Sets the date picker button image that will be used by default for
       * all date pickers. This static method is convenient because most
       * applications will use the same icon throughout the entire application.
       * To change the image on an individual picker, call
       * {@link #setButtonImage setButtonImage()}.
       */
      public static void setDefaultButtonImage(ResourceReference defaultImage)
      {
          Args.notNull(defaultImage, "defaultImage");
          DEFAULT_IMAGE = defaultImage;
      }
      
      private ResourceReference buttonImage;
      
      /**
       * Sets the button image (a calendar icon, for example) that will be
       * displayed and used to show and hide the date picker when clicked.
       * By default this is the
       * <a href="http://www.famfamfam.com/lab/icons/silk/">famfamfam Silk</a>
       * famfamfam Silk calendar icon, or whatever was provided to
       * {@link #setDefaultButtonImage setDefaultButtonImage()}.
       * 
       * @return {@code this} to allow chaining
       */
      public JQueryDatePicker setButtonImage(ResourceReference buttonImage)
      {
          Args.notNull(buttonImage, "buttonImage");
          this.buttonImage = buttonImage;
          return this;
      }
      
      public ResourceReference getButtonImage()
      {
          return this.buttonImage != null ? this.buttonImage : DEFAULT_IMAGE;
      }
      
      /**
       * Returns the URL for the button image, for use inside the JavaScript
       * template as <code>${behavior.buttonImageUrl}</code>.
       */
      public CharSequence getButtonImageUrl()
      {
          return RequestCycle.get().urlFor(getButtonImage(), null);
      }
  }
  