/* 
 | 
 * 
 | 
 * 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();} 
 | 
        }); 
 | 
    }; 
 | 
    /* 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(){ 
 | 
            var newBtn = $('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +' jqTransformButton"><span><span>'+ $(this).attr('value') +'</span></span>') 
 | 
                .hover(function(){newBtn.addClass('jqTransformButton_hover');},function(){newBtn.removeClass('jqTransformButton_hover')}) 
 | 
                .mousedown(function(){newBtn.addClass('jqTransformButton_click')}) 
 | 
                .mouseup(function(){newBtn.removeClass('jqTransformButton_click')}) 
 | 
            ; 
 | 
            $(this).replaceWith(newBtn); 
 | 
        }); 
 | 
    }; 
 | 
     
 | 
    /*************************** 
 | 
      Text Fields  
 | 
     ***************************/ 
 | 
    $.fn.jqTransInputText = function(){ 
 | 
        return this.each(function(){ 
 | 
            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 */ 
 | 
            $.browser.safari && $wrapper.addClass('jqTransformSafari'); 
 | 
            $.browser.safari && $input.css('width',$wrapper.width()+16); 
 | 
            this.wrapper = $wrapper; 
 | 
             
 | 
        }); 
 | 
    }; 
 | 
     
 | 
    /*************************** 
 | 
      Check Boxes  
 | 
     ***************************/     
 | 
    $.fn.jqTransCheckBox = function(){ 
 | 
        return this.each(function(){ 
 | 
            if($(this).hasClass('jqTransformHidden')) {return;} 
 | 
  
 | 
            var $input = $(this); 
 | 
            var inputSelf = this; 
 | 
  
 | 
            //set the click on the label 
 | 
            var oLabel=jqTransformGetLabel($input); 
 | 
            oLabel && oLabel.click(function(){aLink.trigger('click');}); 
 | 
             
 | 
            var aLink = $('<a href="#" class="jqTransformCheckbox"></a>'); 
 | 
            //wrap and add the link 
 | 
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink); 
 | 
            //on change, change the class of the link 
 | 
            $input.change(function(){ 
 | 
                this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked'); 
 | 
                return true; 
 | 
            }); 
 | 
            // Click Handler, trigger the click and change event on the input 
 | 
            aLink.click(function(){ 
 | 
                //do nothing if the original input is disabled 
 | 
                if($input.attr('disabled')){return false;} 
 | 
                //trigger the envents on the input object 
 | 
                $input.trigger('click').trigger("change");     
 | 
                return false; 
 | 
            }); 
 | 
  
 | 
            // set the default state 
 | 
            this.checked && aLink.addClass('jqTransformChecked');         
 | 
        }); 
 | 
    }; 
 | 
    /*************************** 
 | 
      Radio Buttons  
 | 
     ***************************/     
 | 
    $.fn.jqTransRadio = function(){ 
 | 
        return this.each(function(){ 
 | 
            if($(this).hasClass('jqTransformHidden')) {return;} 
 | 
  
 | 
            var $input = $(this); 
 | 
            var inputSelf = this; 
 | 
                 
 | 
            oLabel = jqTransformGetLabel($input); 
 | 
            oLabel && oLabel.click(function(){aLink.trigger('click');}); 
 | 
     
 | 
            var aLink = $('<a href="#" class="jqTransformRadio" rel="'+ this.name +'"></a>'); 
 | 
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink); 
 | 
             
 | 
            $input.change(function(){ 
 | 
                inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked'); 
 | 
                return true; 
 | 
            }); 
 | 
            // Click Handler 
 | 
            aLink.click(function(){ 
 | 
                if($input.attr('disabled')){return false;} 
 | 
                $input.trigger('click').trigger('change'); 
 | 
     
 | 
                // uncheck all others of same name input radio elements 
 | 
                $('input[name="'+$input.attr('name')+'"]',inputSelf.form).not($input).each(function(){ 
 | 
                    $(this).attr('type')=='radio' && $(this).trigger('change'); 
 | 
                }); 
 | 
     
 | 
                return false;                     
 | 
            }); 
 | 
            // 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"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>'; 
 | 
            strTable +='<tr><td id="jqTransformTextarea-ml"> </td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr"> </td></tr>';     
 | 
            strTable +='<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></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;} 
 | 
            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><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>'); 
 | 
            var $ul = $('ul', $wrapper).css('width',$select.width()).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(); 
 | 
                    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}); 
 | 
                    }); 
 | 
                    return false; 
 | 
                }) 
 | 
            ; 
 | 
  
 | 
            // Set the new width 
 | 
            var iSelectWidth = $select.outerWidth(); 
 | 
            var oSpan = $('span:first',$wrapper); 
 | 
            var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width(); 
 | 
            $wrapper.css('width',newWidth); 
 | 
            $ul.css('width',newWidth-2); 
 | 
            oSpan.css({width:iSelectWidth}); 
 | 
         
 | 
            // Calculate the height if necessary, less elements that the default height 
 | 
            //show the ul to calculate the block, if ul is not displayed li height value is 0 
 | 
            $ul.css({display:'block',visibility:'hidden'}); 
 | 
            var iSelectHeight = ($('li',$ul).length)*($('li:first',$ul).height());//+1 else bug ff 
 | 
            (iSelectHeight < $ul.height()) && $ul.css({height:iSelectHeight,'overflow':'hidden'});//hidden else bug with ff 
 | 
            $ul.css({display:'none',visibility:'visible'}); 
 | 
             
 | 
        }); 
 | 
    }; 
 | 
    $.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'); 
 | 
             
 | 
            $('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);}); 
 | 
                         
 | 
             
 | 
        }); /* End Form each */ 
 | 
                 
 | 
    };/* End the Plugin */ 
 | 
  
 | 
})(jQuery); 
 | 
                    
 |