/*
 *
 * jqTransform
 * by mathieu vilaplana mvilaplana@dfc-e.com
 * Designer ghyslain armand garmand@dfc-e.com
 *
 *
 * Version 1.0 25.09.08
 * Version 1.1 06.08.09
 * Add event click on Checkbox and Radio
 * Auto calculate the size of a select element
 * Can now, disabled the elements
 * Correct bug in ff if click on select (overflow=hidden)
 * No need any more preloading !!
 * 
 ******************************************** */
 
(function($){
  var defaultOptions = {preloadImg:true};
  var jqTransformImgPreloaded = false;

  var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
    //guillemets to remove for ie
    strImgUrl = strImgUrl.replace(/^url\((.*)\)/,'$1').replace(/^\"(.*)\"$/,'$1');
    var imgHover = new Image();
    imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-hover.$1');
    var imgFocus = new Image();
    imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-focus.$1');        
  };

  
  /***************************
    Labels
  ***************************/
  var jqTransformGetLabel = function(objfield){
    var selfForm = $(objfield.get(0).form);
    var oLabel = objfield.next();
    if(!oLabel.is('label')) {
      oLabel = objfield.prev();
      if(oLabel.is('label')){
        var inputname = objfield.attr('id');
        if(inputname){
          oLabel = selfForm.find('label[for="'+inputname+'"]');
        } 
      }
    }
    if(oLabel.is('label')){return oLabel.css('cursor','pointer');}
    return false;
  };
  
  /* Hide all open selects */
  var jqTransformHideSelect = function(oTarget){
    var ulVisible = $('.jqTransformSelectWrapper ul:visible');
    ulVisible.each(function(){
      var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
      //do not hide if click on the label object associated to the select
      if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){
        $(this).hide();
        // Media Contour: Add a class to give open styles
        $('.jqTransformSelectWrapper').toggleClass('isOpen');
      }
    });
  };
  /* Check for an external click */
  var jqTransformCheckExternalClick = function(event) {
    if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); }
  };

  /* Apply document listener */
  var jqTransformAddDocumentListener = function (){
    $(document).mousedown(jqTransformCheckExternalClick);
  };  
      
  /***************************
    Select 
   ***************************/  
  $.fn.jqTransSelect = function(){
    return this.each(function(index){
      var $select = $(this);

      if($select.hasClass('jqTransformHidden')) {return;}
      if($select.attr('multiple')) {return;}

      var oLabel  =  jqTransformGetLabel($select);
      /* First thing we do is Wrap it */
      var $wrapper = $select
        .addClass('jqTransformHidden')
        .wrap('<div class="jqTransformSelectWrapper"></div>')
        .parent()
        .css({zIndex: 10-index})
      ;
      
      /* Now add the html for the select */
      $wrapper.prepend('<div class="clear"><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
      var $ul = $('ul', $wrapper).hide();
      /* Now we add the options */
      $('option', this).each(function(i){
        var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
        $ul.append(oLi);
      });
      
      /* Add click handler to the a */
      $ul.find('a').click(function(){
          $('a.selected', $wrapper).removeClass('selected');
          $(this).addClass('selected');  
          /* Fire the onchange event */
          if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) { $select[0].selectedIndex = $(this).attr('index'); $select[0].onchange(); }
          $select[0].selectedIndex = $(this).attr('index');
          $('span:eq(0)', $wrapper).html($(this).html());
          $ul.hide();
          // Media Contour: Add a class to give open styles
          $('.jqTransformSelectWrapper').removeClass('isOpen');
          return false;
      });
      /* Set the default */
      $('a:eq('+ this.selectedIndex +')', $ul).click();
      $('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
      oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
      this.oLabel = oLabel;
      
      /* Apply the click handler to the Open */
      var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
        .click(function(){
          //Check if box is already open to still allow toggle, but close all other selects
          if( $ul.css('display') == 'none' ) {jqTransformHideSelect();} 
          if($select.attr('disabled')){return false;}

          $ul.slideToggle('fast', function(){          
            var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
            $ul.animate({scrollTop: offSet});
            // Media Contour: Add a class to give open styles
            $('.jqTransformSelectWrapper').toggleClass('isOpen');
          });
          return false;
        })
      ;
    });
  };
  $.fn.jqTransform = function(options){
    var opt = $.extend({},defaultOptions,options);
    
    /* each form */
     return this.each(function(){
      var selfForm = $(this);
      if(selfForm.hasClass('jqtransformdone')) {return;}
      selfForm.addClass('jqtransformdone');
      
      if( $('select', this).jqTransSelect().length > 0 ){jqTransformAddDocumentListener();}
      selfForm.bind('reset',function(){var action = function(){jqTransformReset(this);}; window.setTimeout(action, 10);});
      
    }); /* End Form each */
        
  };/* End the Plugin */

})(jQuery);
           
