/*****************************************************************************
jQuery Placeholder 1.1.1

Copyright (c) 2010 Michael J. Ryan (http://tracker1.info/)

Dual licensed under the MIT and GPL licenses:
  http://www.opensource.org/licenses/mit-license.php
  http://www.gnu.org/licenses/gpl.html

------------------------------------------------------------------------------

Sets up a watermark for inputted fields... this will create a LABEL.watermark 
tag immediately following the input tag, the positioning will be set absolute, 
and it will be positioned to match the input tag.

To activate on all tags with a 'data-watermark' attribute:

  $('input[placeholder],textarea[placeholder]').placeholder();


To style the tags as appropriate (you'll want to make sure the font matches):

  label.placeholder {
    cursor: text;        <--- display a cursor to match the text input

    padding: 4px 4px 4px 4px;   <--- this should match the border+padding 
                      for the input field(s)
    color: #999999;        <--- this will display as faded
  }

You'll also want to have the color set for browsers with native support
  input:placeholder, textarea:placeholder {
    color: #999999;
  }
  input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
    color: #999999;
  }

------------------------------------------------------------------------------

Thanks to...
  http://www.alistapart.com/articles/makingcompactformsmoreaccessible
  http://plugins.jquery.com/project/overlabel

  This works similar to the overlabel, but creates the actual label tag
  based on a data-watermark attribute on the input tag, instead of 
  relying on the markup to provide it.

*****************************************************************************/
(function($){
  
  var ph = "PLACEHOLDER-INPUT";
  var phl = "PLACEHOLDER-LABEL";
  var boundEvents = false;
  var default_options = {
    labelClass: 'placeholder'
  };
  
  //check for native support for placeholder attribute, if so stub methods and return
  var input = document.createElement("input");
  if ('placeholder' in input) {
    $.fn.placeholder = $.fn.unplaceholder = function(){}; //empty function
    delete input; //cleanup IE memory
    return;
  };
  delete input;

  $.fn.placeholder = function(options) {
    bindEvents();

    var opts = $.extend(default_options, options)

    this.each(function(){
      var rnd=Math.random().toString(32).replace(/\./,'')
        ,input=$(this)
        ,label=$('<label style="position:absolute;display:none;top:0;left:0;"></label>');

      if (!input.attr('placeholder') || input.data(ph) === ph) return; //already watermarked

      //make sure the input tag has an ID assigned, if not, assign one.
      if (!input.attr('id')) input.attr('id') = 'input_' + rnd;

      label  .attr('id',input.attr('id') + "_placeholder")
          .data(ph, '#' + input.attr('id'))  //reference to the input tag
          .attr('for',input.attr('id'))
          .addClass(opts.labelClass)
          .addClass(opts.labelClass + '-for-' + this.tagName.toLowerCase()) //ex: watermark-for-textarea
          .addClass(phl)
          .text(input.attr('placeholder'));

      input
        .data(phl, '#' + label.attr('id'))  //set a reference to the label
        .data(ph,ph)    //set that the field is watermarked
        .addClass(ph)    //add the watermark class
        .after(label);    //add the label field to the page

      //setup overlay
      itemIn.call(this);
      itemOut.call(this);
    });
  };

  $.fn.unplaceholder = function(){
    this.each(function(){
      var  input=$(this),
        label=$(input.data(phl));

      if (input.data(ph) !== ph) return;
        
      label.remove();
      input.removeData(ph).removeData(phl).removeClass(ph);
    });
  };


  function bindEvents() {
    if (boundEvents) return;

    //prepare live bindings if not already done.
    $('.' + ph)
      .live('click',itemIn)
      .live('focusin',itemIn)
      .live('focusout',itemOut);
    bound = true;

    boundEvents = true;
  };

  function itemIn() {
    var input = $(this)
      ,label = $(input.data(phl));

    label.css('display', 'none');
  };

  function itemOut() {
    var that = this;

    //use timeout to let other validators/formatters directly bound to blur/focusout work first
    setTimeout(function(){
      var input = $(that);
      $(input.data(phl))
        .css('top', input.position().top + 'px')
        .css('left', input.position().left + 'px')
        .css('display', !!input.val() ? 'none' : 'block');
    }, 200);
  };

}(jQuery));
