/*
 * UPDATED: 25.09.08
 *
 * jqTransform
 * by mathieu vilaplana mvilaplana@dfc-e.com
 * Designer ghyslain armand garmand@dfc-e.com
 *
 *
 * Version 1.0
 *
 ******************************************** */
 
(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','default');}
    return false;
  };
  
  /* Hide all open selects */
  var jqTransformHideSelect = function(oTarget){
    var ulVisible = $('.jqTransformSelectWrapper ul:visible');
    ulVisible.each(function(){
      var $select = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
      ulVisible.prev().find("span").removeClass("spFocus");
      //do not hide if clicke on the label object associated to the select
      if( !(oTarget && $select.oLabel && $select.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();}
    });
  };
  /* 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);
  };  
      
  /* Add a new handler for the reset action */
  var jqTransformReset = function(f){
    var sel;
    $('.jqTransformSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; $('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});
    $('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
    $('input:checkbox, input:radio', f).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jqTransformChecked');}});
  };

  /***************************
    Buttons
   ***************************/
  $.fn.jqTransInputButton = function(){
    return this.each(function(){
      $(this).replaceWith('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +' jqTransformButton"><span><span>'+ $(this).attr('value') +'</span></span>');
    });
  };
  
  /***************************
    Text Fields 
   ***************************/
  $.fn.jqTransInputText = function(){
    return this.each(function(){
      var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */
      var $input = $(this);
  
      if($input.hasClass('jqtranformdone') || !$input.is('input')) {return;}
      $input.addClass('jqtranformdone');
  
      var oLabel = jqTransformGetLabel($(this));
      oLabel && oLabel.bind('click',function(){$input.focus();});
  
      var inputSize=$input.width();
      if($input.attr('size')){
        inputSize = $input.attr('size')*10;
        $input.css('width',inputSize);
      }
      
      $input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
      var $wrapper = $input.parent().parent().parent();
      $wrapper.css("width", inputSize+10);
      $input
        .focus(function(){$wrapper.addClass("jqTransformInputWrapper_focus");})
        .blur(function(){$wrapper.removeClass("jqTransformInputWrapper_focus");})
        .hover(function(){$wrapper.addClass("jqTransformInputWrapper_hover");},function(){$wrapper.removeClass("jqTransformInputWrapper_hover");})
      ;
  
      /* If this is safari we need to add an extra class */
      safari && $wrapper.addClass('jqTransformSafari');
      safari && $input.css('width',$wrapper.width()+16);
      this.wrapper = $wrapper;
      
    });
  };
  
  /***************************
    Check Boxes 
   ***************************/  
  $.fn.jqTransCheckBox = function(){
    return this.each(function(){
      var $input = $(this);
      var inputSelf = this;
      
      if($input.hasClass('jqTransformHidden')) {return;}
  
      var oLabel=jqTransformGetLabel($input);
      $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>');
      var $wrapper = $input.parent();
      var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
      $wrapper.prepend(aLink);
      // Click Handler
      aLink.click(function(e){
          //alert(inputSelf.checked)
          var $a = $(this);
          if (inputSelf.checked===true){
            inputSelf.checked = false;
            $a.removeClass('jqTransformChecked');
            $(".searchFilterSrd .topCont .lbCheck").css({"color":"#555555"});
            
          }
          else {
            inputSelf.checked = true;
            $a.addClass('jqTransformChecked');
            
            var $clicked=$(e.target); // get the element clicked
            if(!$clicked.is(".searchFilterSrd .topCont .jqTransformCheckbox")) {
              $(".searchFilterSrd .topCont .jqTransformCheckbox").removeClass('jqTransformChecked');
              $(".searchFilterSrd .topCont .lbCheck").css({"color":"#555555"});
              $(".searchFilterSrd .topCont :checkbox").attr("checked",false);
            } if($clicked.is(".searchFilterSrd .topCont .jqTransformCheckbox")) {
              $(".searchFilterSrd .botCont .jqTransformCheckbox").removeClass('jqTransformChecked');
              $(".searchFilterSrd .topCont .lbCheck").css({"color":"#004276"});
              $(".searchFilterSrd .botCont :checkbox").each(function(i){$(this).attr("checked",false)});
            }
          }
          
          inputSelf.onchange && inputSelf.onchange();
          return false;
      });
      //oLabel && oLabel.click(function(){aLink.trigger('click');});
      
      oLabel && oLabel.click(function(e){
          //alert(inputSelf.checked)
          var $a = $(this).prev().find(".jqTransformCheckbox");
          if (inputSelf.checked===true){
            inputSelf.checked = false;
            $a.removeClass('jqTransformChecked');
            $(".searchFilterSrd .topCont .lbCheck").css({"color":"#555555"});
          }
          else {
            inputSelf.checked = true;
            $a.addClass('jqTransformChecked');
            
            var $clicked=$(e.target); // get the element clicked
            if(!$clicked.is(".searchFilterSrd .topCont .lbCheck")) {
              $(".searchFilterSrd .topCont .jqTransformCheckbox").removeClass('jqTransformChecked');
              $(".searchFilterSrd .topCont .lbCheck").css({"color":"#555555"});
              $(".searchFilterSrd .topCont :checkbox").attr("checked",false);
            } if($clicked.is(".searchFilterSrd .topCont .lbCheck")) {
              $(".searchFilterSrd .botCont .jqTransformCheckbox").removeClass('jqTransformChecked');
              $(".searchFilterSrd .topCont .lbCheck").css({"color":"#004276"});
              $(".searchFilterSrd .botCont :checkbox").each(function(i){$(this).attr("checked",false)});
            }
          }
          
          inputSelf.onchange && inputSelf.onchange();
          return false;          
      });
      
      // set the default state
      this.checked && aLink.addClass('jqTransformChecked');    
    });
  };
  /***************************
    Radio Buttons 
   ***************************/  
  $.fn.jqTransRadio = function(){
    return this.each(function(){
      var $input = $(this);
      var inputSelf = this;
        
      if($input.hasClass('jqTransformHidden')) {return;}
  
      oLabel = jqTransformGetLabel($input);
      $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>');
      var $wrapper = $input.parent();
      var aLink = $('<a href="#" class="jqTransformRadio" rel="'+ this.name +'"></a>');
      $wrapper.prepend(aLink);
      // Click Handler
      aLink
        .each(function(){
          this.radioElem = inputSelf;
          $(this).click(function(){
            var $a = $(this).addClass('jqTransformChecked');
            inputSelf.checked = true;

            // uncheck all others of same name
            $('a.jqTransformRadio[rel="'+ $a.attr('rel') +'"]',inputSelf.form).not($a).each(function(){
              $(this).removeClass('jqTransformChecked');
              this.radioElem.checked = false;
            });
            
            inputSelf.onchange && inputSelf.onchange();
            return false;          
          });
        });
      oLabel && oLabel.click(function(){aLink.trigger('click');});
      // set the default state
      inputSelf.checked && aLink.addClass('jqTransformChecked');
    });
  };
  
  /***************************
    TextArea 
   ***************************/  
  $.fn.jqTransTextarea = function(){
    return this.each(function(){
      var textarea = $(this);
  
      if(textarea.hasClass('jqtransformdone')) {return;}
      textarea.addClass('jqtransformdone');
  
      oLabel = jqTransformGetLabel(textarea);
      oLabel && oLabel.click(function(){textarea.focus();});
      
      var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
      strTable +='<tr><td id="jqTransformTextarea-tl">&nbsp;</td><td id="jqTransformTextarea-tm">&nbsp;</td><td id="jqTransformTextarea-tr">&nbsp;</td></tr>';
      strTable +='<tr><td id="jqTransformTextarea-ml">&nbsp;</td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr">&nbsp;</td></tr>';  
      strTable +='<tr><td id="jqTransformTextarea-bl">&nbsp;</td><td id="jqTransformTextarea-bm">&nbsp;</td><td id="jqTransformTextarea-br">&nbsp;</td></tr>';
      strTable +='</table>';          
      var oTable = $(strTable)
          .insertAfter(textarea)
          .hover(function(){
            !oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
          },function(){
            oTable.removeClass('jqTransformTextarea-hover');          
          })
        ;
        
      textarea
        .focus(function(){oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');})
        .blur(function(){oTable.removeClass('jqTransformTextarea-focus');})
        .appendTo($('#jqTransformTextarea-mm div',oTable))
      ;
      this.oTable = oTable;
      if($.browser.safari){
        $('#jqTransformTextarea-mm',oTable)
          .addClass('jqTransformSafariTextarea')
          .find('div')
            .css('height',textarea.height())
            .css('width',textarea.width())
        ;
      }
    });
  };
  
  /***************************
    Select 
   ***************************/  
  $.fn.jqTransSelect = function(){
    return this.each(function(index){
      var $select = $(this);
      if($select.hasClass('jqTransformHidden')) {return;}
  
      var oLabel  =  jqTransformGetLabel($select);
      /* First thing we do is Wrap it */
      $select
        .addClass('jqTransformHidden')
        .wrap('<div class="jqTransformSelectWrapper"></div>')
      ;
      var $wrapper = $select.parent().css({zIndex: 10-index});
      
      /* Now add the html for the select */
      $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
      //var $ul = $('ul', $wrapper).css('width',$select.width());
      var $ul = $('ul', $wrapper);
      /* Now we add the options */
      $('option', this).each(function(i){
        var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
        $ul.append(oLi);
      });
      /* Hide the ul and add click handler to the a */
      $ul.hide().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();
          $ul.prev().find("span").removeClass("spFocus");
          return false;
      });
      /* Set the default */
      $('a:eq('+ this.selectedIndex +')', $ul).click();
      $('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click').trigger('focus');});
      oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click').trigger('focus');});
      //$('a.jqTransformSelectOpen').focus(function(){$(this).prev().toggleClass("spFocus")});
      //$('a.jqTransformSelectOpen').blur(function(){$(this).prev().toggleClass("spFocus")});
      
      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();} 
          $ul.slideToggle('fast', function(){          
            var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
            $ul.animate({scrollTop: offSet});
            
            if( $ul.css('display')=='none' ) {
            $ul.prev().find("span").removeClass("spFocus");
            } else {$ul.prev().find("span").addClass("spFocus");}
          
          });
          return false;
        })
      ;
      //set the new width
      //var iSelectWidth = $select.width();
      //var oSpan = $('span:first',$wrapper);
      //var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width();
      //$wrapper.css('width',newWidth);
      //$ul.css('width',newWidth);
      //oSpan.css('width',iSelectWidth);
      
    });
  };
  $.fn.jqTransform = function(options){
    var self = this;
    var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */
    var opt = $.extend({},defaultOptions,options);
    
    /* each form */
     return this.each(function(){
      var selfForm = $(this);
      if(selfForm.hasClass('jqtransformdone')) {return;}
      selfForm.addClass('jqtransformdone');
      
      $('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();      
      $('input:text, input:password', this).jqTransInputText();      
      $('input:checkbox', this).jqTransCheckBox();
      $('input:radio', this).jqTransRadio();
      $('textarea', this).jqTransTextarea();
      
      if( $('select', this).jqTransSelect().length > 0 ){jqTransformAddDocumentListener();}
      selfForm.bind('reset',function(){var action = function(){jqTransformReset(this);}; window.setTimeout(action, 10);});
      
      //preloading
      if(opt.preloadImg && !jqTransformImgPreloaded){
        jqTransformImgPreloaded = true;
        var oInputText = $('input:text:first', selfForm);
        if(oInputText.length > 0){
          //pour ie on eleve les ""
          var strWrapperImgUrl = oInputText.get(0).wrapper.css('background-image');
          jqTransformPreloadHoverFocusImg(strWrapperImgUrl);          
          var strInnerImgUrl = $('div.jqTransformInputInner',$(oInputText.get(0).wrapper)).css('background-image');
          jqTransformPreloadHoverFocusImg(strInnerImgUrl);
        }
        
        var oTextarea = $('textarea',selfForm);
        if(oTextarea.length > 0){
          var oTable = oTextarea.get(0).oTable;
          $('td',oTable).each(function(){
            var strImgBack = $(this).css('background-image');
            jqTransformPreloadHoverFocusImg(strImgBack);
          });
        }
      }
      
      
    }); /* End Form each */
        
  };/* End the Plugin */

})(jQuery);
           