4 * by mathieu vilaplana mvilaplana@dfc-e.com
5 * Designer ghyslain armand garmand@dfc-e.com
10 * Add event click on Checkbox and Radio
11 * Auto calculate the size of a select element
12 * Can now, disabled the elements
13 * Correct bug in ff if click on select (overflow=hidden)
14 * No need any more preloading !!
16 ******************************************** */
19 var defaultOptions = {preloadImg:true};
20 var jqTransformImgPreloaded = false;
22 var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
23 //guillemets to remove for ie
24 strImgUrl = strImgUrl.replace(/^url\((.*)\)/,'$1').replace(/^\"(.*)\"$/,'$1');
25 var imgHover = new Image();
26 imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-hover.$1');
27 var imgFocus = new Image();
28 imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-focus.$1');
32 /***************************
34 ***************************/
35 var jqTransformGetLabel = function(objfield){
36 var selfForm = $(objfield.get(0).form);
37 var oLabel = objfield.next();
38 if(!oLabel.is('label')) {
39 oLabel = objfield.prev();
40 if(oLabel.is('label')){
41 var inputname = objfield.attr('id');
43 oLabel = selfForm.find('label[for="'+inputname+'"]');
47 if(oLabel.is('label')){return oLabel.css('cursor','pointer');}
51 /* Hide all open selects */
52 var jqTransformHideSelect = function(oTarget){
53 var ulVisible = $('.jqTransformSelectWrapper ul:visible');
54 ulVisible.each(function(){
55 var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
56 //do not hide if click on the label object associated to the select
57 if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();}
60 /* Check for an external click */
61 var jqTransformCheckExternalClick = function(event) {
62 if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); }
65 /* Apply document listener */
66 var jqTransformAddDocumentListener = function (){
67 $(document).mousedown(jqTransformCheckExternalClick);
70 /* Add a new handler for the reset action */
71 var jqTransformReset = function(f){
73 $('.jqTransformSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; $('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});
74 $('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
75 $('input:checkbox, input:radio', f).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jqTransformChecked');}});
78 /***************************
80 ***************************/
81 $.fn.jqTransInputButton = function(){
82 return this.each(function(){
83 var newBtn = $('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +' jqTransformButton"><span><span>'+ $(this).attr('value') +'</span></span>')
84 .hover(function(){newBtn.addClass('jqTransformButton_hover');},function(){newBtn.removeClass('jqTransformButton_hover')})
85 .mousedown(function(){newBtn.addClass('jqTransformButton_click')})
86 .mouseup(function(){newBtn.removeClass('jqTransformButton_click')})
88 $(this).replaceWith(newBtn);
92 /***************************
94 ***************************/
95 $.fn.jqTransInputText = function(){
96 return this.each(function(){
99 if($input.hasClass('jqtranformdone') || !$input.is('input')) {return;}
100 $input.addClass('jqtranformdone');
102 var oLabel = jqTransformGetLabel($(this));
103 oLabel && oLabel.bind('click',function(){$input.focus();});
105 var inputSize=$input.width();
106 if($input.attr('size')){
107 inputSize = $input.attr('size')*10;
108 $input.css('width',inputSize);
111 $input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
112 var $wrapper = $input.parent().parent().parent();
113 $wrapper.css("width", inputSize+10);
115 .focus(function(){$wrapper.addClass("jqTransformInputWrapper_focus");})
116 .blur(function(){$wrapper.removeClass("jqTransformInputWrapper_focus");})
117 .hover(function(){$wrapper.addClass("jqTransformInputWrapper_hover");},function(){$wrapper.removeClass("jqTransformInputWrapper_hover");})
120 /* If this is safari we need to add an extra class */
121 $.browser.safari && $wrapper.addClass('jqTransformSafari');
122 $.browser.safari && $input.css('width',$wrapper.width()+16);
123 this.wrapper = $wrapper;
128 /***************************
130 ***************************/
131 $.fn.jqTransCheckBox = function(){
132 return this.each(function(){
133 if($(this).hasClass('jqTransformHidden')) {return;}
135 var $input = $(this);
136 var inputSelf = this;
138 //set the click on the label
139 var oLabel=jqTransformGetLabel($input);
140 oLabel && oLabel.click(function(){aLink.trigger('click');});
142 var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
143 //wrap and add the link
144 $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
145 //on change, change the class of the link
146 $input.change(function(){
147 this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
150 // Click Handler, trigger the click and change event on the input
151 aLink.click(function(){
152 //do nothing if the original input is disabled
153 if($input.attr('disabled')){return false;}
154 //trigger the envents on the input object
155 $input.trigger('click').trigger("change");
159 // set the default state
160 this.checked && aLink.addClass('jqTransformChecked');
163 /***************************
165 ***************************/
166 $.fn.jqTransRadio = function(){
167 return this.each(function(){
168 if($(this).hasClass('jqTransformHidden')) {return;}
170 var $input = $(this);
171 var inputSelf = this;
173 oLabel = jqTransformGetLabel($input);
174 oLabel && oLabel.click(function(){aLink.trigger('click');});
176 var aLink = $('<a href="#" class="jqTransformRadio" rel="'+ this.name +'"></a>');
177 $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);
179 $input.change(function(){
180 inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
184 aLink.click(function(){
185 if($input.attr('disabled')){return false;}
186 $input.trigger('click').trigger('change');
188 // uncheck all others of same name input radio elements
189 $('input[name="'+$input.attr('name')+'"]',inputSelf.form).not($input).each(function(){
190 $(this).attr('type')=='radio' && $(this).trigger('change');
195 // set the default state
196 inputSelf.checked && aLink.addClass('jqTransformChecked');
200 /***************************
202 ***************************/
203 $.fn.jqTransTextarea = function(){
204 return this.each(function(){
205 var textarea = $(this);
207 if(textarea.hasClass('jqtransformdone')) {return;}
208 textarea.addClass('jqtransformdone');
210 oLabel = jqTransformGetLabel(textarea);
211 oLabel && oLabel.click(function(){textarea.focus();});
213 var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
214 strTable +='<tr><td id="jqTransformTextarea-tl"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>';
215 strTable +='<tr><td id="jqTransformTextarea-ml"> </td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr"> </td></tr>';
216 strTable +='<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></td></tr>';
217 strTable +='</table>';
218 var oTable = $(strTable)
219 .insertAfter(textarea)
221 !oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
223 oTable.removeClass('jqTransformTextarea-hover');
228 .focus(function(){oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');})
229 .blur(function(){oTable.removeClass('jqTransformTextarea-focus');})
230 .appendTo($('#jqTransformTextarea-mm div',oTable))
232 this.oTable = oTable;
233 if($.browser.safari){
234 $('#jqTransformTextarea-mm',oTable)
235 .addClass('jqTransformSafariTextarea')
237 .css('height',textarea.height())
238 .css('width',textarea.width())
244 /***************************
246 ***************************/
247 $.fn.jqTransSelect = function(){
248 return this.each(function(index){
249 var $select = $(this);
251 if($select.hasClass('jqTransformHidden')) {return;}
252 if($select.attr('multiple')) {return;}
254 var oLabel = jqTransformGetLabel($select);
255 /* First thing we do is Wrap it */
256 var $wrapper = $select
257 .addClass('jqTransformHidden')
258 .wrap('<div class="jqTransformSelectWrapper"></div>')
260 .css({zIndex: 1000-index})
263 /* Now add the html for the select */
264 $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
265 var $ul = $('ul', $wrapper).css('width',$select.width()).hide();
266 /* Now we add the options */
267 $('option', this).each(function(i){
268 var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
272 /* Add click handler to the a */
273 $ul.find('a').click(function(){
274 $('a.selected', $wrapper).removeClass('selected');
275 $(this).addClass('selected');
276 /* Fire the onchange event */
277 if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) { $select[0].selectedIndex = $(this).attr('index'); $select[0].onchange(); }
278 $select[0].selectedIndex = $(this).attr('index');
279 $('span:eq(0)', $wrapper).html($(this).html());
283 /* Set the default */
284 $('a:eq('+ this.selectedIndex +')', $ul).click();
285 $('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
286 oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
287 this.oLabel = oLabel;
289 /* Apply the click handler to the Open */
290 var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
292 //Check if box is already open to still allow toggle, but close all other selects
293 if( $ul.css('display') == 'none' ) {jqTransformHideSelect();}
294 if($select.attr('disabled')){return false;}
296 $ul.slideToggle('fast', function(){
297 var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
298 $ul.animate({scrollTop: offSet});
305 var iSelectWidth = $select.outerWidth();
306 var oSpan = $('span:first',$wrapper);
307 var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width();
308 $wrapper.css('width',newWidth);
309 $ul.css('width',newWidth-2);
310 oSpan.css({width:iSelectWidth});
312 // Calculate the height if necessary, less elements that the default height
313 //show the ul to calculate the block, if ul is not displayed li height value is 0
314 $ul.css({display:'block',visibility:'hidden'});
315 var iSelectHeight = ($('li',$ul).length)*($('li:first',$ul).height());//+1 else bug ff
316 (iSelectHeight < $ul.height()) && $ul.css({height:iSelectHeight,'overflow':'hidden'});//hidden else bug with ff
317 $ul.css({display:'none',visibility:'visible'});
321 $.fn.jqTransform = function(options){
322 var opt = $.extend({},defaultOptions,options);
325 return this.each(function(){
326 var selfForm = $(this);
327 if(selfForm.hasClass('jqtransformdone')) {return;}
328 selfForm.addClass('jqtransformdone');
330 //$('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();
331 //$('input:text, input:password', this).jqTransInputText();
332 //$('input:checkbox', this).jqTransCheckBox();
333 //$('input:radio', this).jqTransRadio();
334 //$('textarea', this).jqTransTextarea();
336 if( $('select', this).jqTransSelect().length > 0 ){jqTransformAddDocumentListener();}
337 selfForm.bind('reset',function(){var action = function(){jqTransformReset(this);}; window.setTimeout(action, 10);});
339 //preloading dont needed anymore since normal, focus and hover image are the same one
340 /*if(opt.preloadImg && !jqTransformImgPreloaded){
341 jqTransformImgPreloaded = true;
342 var oInputText = $('input:text:first', selfForm);
343 if(oInputText.length > 0){
344 //pour ie on eleve les ""
345 var strWrapperImgUrl = oInputText.get(0).wrapper.css('background-image');
346 jqTransformPreloadHoverFocusImg(strWrapperImgUrl);
347 var strInnerImgUrl = $('div.jqTransformInputInner',$(oInputText.get(0).wrapper)).css('background-image');
348 jqTransformPreloadHoverFocusImg(strInnerImgUrl);
351 var oTextarea = $('textarea',selfForm);
352 if(oTextarea.length > 0){
353 var oTable = oTextarea.get(0).oTable;
354 $('td',oTable).each(function(){
355 var strImgBack = $(this).css('background-image');
356 jqTransformPreloadHoverFocusImg(strImgBack);
362 }); /* End Form each */
364 };/* End the Plugin */