jquery.jqtransform.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /*
  2. *
  3. * jqTransform
  4. * by mathieu vilaplana mvilaplana@dfc-e.com
  5. * Designer ghyslain armand garmand@dfc-e.com
  6. *
  7. *
  8. * Version 1.0 25.09.08
  9. * Version 1.1 06.08.09
  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 !!
  15. *
  16. ******************************************** */
  17. (function($){
  18. var defaultOptions = {preloadImg:true};
  19. var jqTransformImgPreloaded = false;
  20. var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
  21. //guillemets to remove for ie
  22. strImgUrl = strImgUrl.replace(/^url\((.*)\)/,'$1').replace(/^\"(.*)\"$/,'$1');
  23. var imgHover = new Image();
  24. imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-hover.$1');
  25. var imgFocus = new Image();
  26. imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/,'-focus.$1');
  27. };
  28. /***************************
  29. Labels
  30. ***************************/
  31. var jqTransformGetLabel = function(objfield){
  32. var selfForm = $(objfield.get(0).form);
  33. var oLabel = objfield.next();
  34. if(!oLabel.is('label')) {
  35. oLabel = objfield.prev();
  36. if(oLabel.is('label')){
  37. var inputname = objfield.attr('id');
  38. if(inputname){
  39. oLabel = selfForm.find('label[for="'+inputname+'"]');
  40. }
  41. }
  42. }
  43. if(oLabel.is('label')){return oLabel.css('cursor','pointer');}
  44. return false;
  45. };
  46. /* Hide all open selects */
  47. var jqTransformHideSelect = function(oTarget){
  48. var ulVisible = $('.jqTransformSelectWrapper ul:visible');
  49. ulVisible.each(function(){
  50. var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
  51. //do not hide if click on the label object associated to the select
  52. if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();}
  53. });
  54. };
  55. /* Check for an external click */
  56. var jqTransformCheckExternalClick = function(event) {
  57. if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); }
  58. };
  59. /* Apply document listener */
  60. var jqTransformAddDocumentListener = function (){
  61. $(document).mousedown(jqTransformCheckExternalClick);
  62. };
  63. /* Add a new handler for the reset action */
  64. var jqTransformReset = function(f){
  65. var sel;
  66. $('.jqTransformSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; $('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});
  67. $('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
  68. $('input:checkbox, input:radio', f).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jqTransformChecked');}});
  69. };
  70. /***************************
  71. Buttons
  72. ***************************/
  73. $.fn.jqTransInputButton = function(){
  74. return this.each(function(){
  75. var newBtn = $('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +' jqTransformButton"><span><span>'+ $(this).attr('value') +'</span></span>')
  76. .hover(function(){newBtn.addClass('jqTransformButton_hover');},function(){newBtn.removeClass('jqTransformButton_hover')})
  77. .mousedown(function(){newBtn.addClass('jqTransformButton_click')})
  78. .mouseup(function(){newBtn.removeClass('jqTransformButton_click')})
  79. ;
  80. $(this).replaceWith(newBtn);
  81. });
  82. };
  83. /***************************
  84. Text Fields
  85. ***************************/
  86. $.fn.jqTransInputText = function(){
  87. return this.each(function(){
  88. var $input = $(this);
  89. if($input.hasClass('jqtranformdone') || !$input.is('input')) {return;}
  90. $input.addClass('jqtranformdone');
  91. var oLabel = jqTransformGetLabel($(this));
  92. oLabel && oLabel.bind('click',function(){$input.focus();});
  93. var inputSize=$input.width();
  94. if($input.attr('size')){
  95. inputSize = $input.attr('size')*10;
  96. $input.css('width',inputSize);
  97. }
  98. $input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
  99. var $wrapper = $input.parent().parent().parent();
  100. $wrapper.css("width", inputSize+10);
  101. $input
  102. .focus(function(){$wrapper.addClass("jqTransformInputWrapper_focus");})
  103. .blur(function(){$wrapper.removeClass("jqTransformInputWrapper_focus");})
  104. .hover(function(){$wrapper.addClass("jqTransformInputWrapper_hover");},function(){$wrapper.removeClass("jqTransformInputWrapper_hover");})
  105. ;
  106. /* If this is safari we need to add an extra class */
  107. $.browser.safari && $wrapper.addClass('jqTransformSafari');
  108. $.browser.safari && $input.css('width',$wrapper.width()+16);
  109. this.wrapper = $wrapper;
  110. });
  111. };
  112. /***************************
  113. Check Boxes
  114. ***************************/
  115. $.fn.jqTransCheckBox = function(){
  116. return this.each(function(){
  117. if($(this).hasClass('jqTransformHidden')) {return;}
  118. var $input = $(this);
  119. var inputSelf = this;
  120. //set the click on the label
  121. var oLabel=jqTransformGetLabel($input);
  122. oLabel && oLabel.click(function(){aLink.trigger('click');});
  123. var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
  124. //wrap and add the link
  125. $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
  126. //on change, change the class of the link
  127. $input.change(function(){
  128. this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
  129. return true;
  130. });
  131. // Click Handler, trigger the click and change event on the input
  132. aLink.click(function(){
  133. //do nothing if the original input is disabled
  134. if($input.attr('disabled')){return false;}
  135. //trigger the envents on the input object
  136. $input.trigger('click').trigger("change");
  137. return false;
  138. });
  139. // set the default state
  140. this.checked && aLink.addClass('jqTransformChecked');
  141. });
  142. };
  143. /***************************
  144. Radio Buttons
  145. ***************************/
  146. $.fn.jqTransRadio = function(){
  147. return this.each(function(){
  148. if($(this).hasClass('jqTransformHidden')) {return;}
  149. var $input = $(this);
  150. var inputSelf = this;
  151. oLabel = jqTransformGetLabel($input);
  152. oLabel && oLabel.click(function(){aLink.trigger('click');});
  153. var aLink = $('<a href="#" class="jqTransformRadio" rel="'+ this.name +'"></a>');
  154. $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);
  155. $input.change(function(){
  156. inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
  157. return true;
  158. });
  159. // Click Handler
  160. aLink.click(function(){
  161. if($input.attr('disabled')){return false;}
  162. $input.trigger('click').trigger('change');
  163. // uncheck all others of same name input radio elements
  164. $('input[name="'+$input.attr('name')+'"]',inputSelf.form).not($input).each(function(){
  165. $(this).attr('type')=='radio' && $(this).trigger('change');
  166. });
  167. return false;
  168. });
  169. // set the default state
  170. inputSelf.checked && aLink.addClass('jqTransformChecked');
  171. });
  172. };
  173. /***************************
  174. TextArea
  175. ***************************/
  176. $.fn.jqTransTextarea = function(){
  177. return this.each(function(){
  178. var textarea = $(this);
  179. if(textarea.hasClass('jqtransformdone')) {return;}
  180. textarea.addClass('jqtransformdone');
  181. oLabel = jqTransformGetLabel(textarea);
  182. oLabel && oLabel.click(function(){textarea.focus();});
  183. var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
  184. strTable +='<tr><td id="jqTransformTextarea-tl"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>';
  185. strTable +='<tr><td id="jqTransformTextarea-ml">&nbsp;</td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr">&nbsp;</td></tr>';
  186. strTable +='<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></td></tr>';
  187. strTable +='</table>';
  188. var oTable = $(strTable)
  189. .insertAfter(textarea)
  190. .hover(function(){
  191. !oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
  192. },function(){
  193. oTable.removeClass('jqTransformTextarea-hover');
  194. })
  195. ;
  196. textarea
  197. .focus(function(){oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');})
  198. .blur(function(){oTable.removeClass('jqTransformTextarea-focus');})
  199. .appendTo($('#jqTransformTextarea-mm div',oTable))
  200. ;
  201. this.oTable = oTable;
  202. if($.browser.safari){
  203. $('#jqTransformTextarea-mm',oTable)
  204. .addClass('jqTransformSafariTextarea')
  205. .find('div')
  206. .css('height',textarea.height())
  207. .css('width',textarea.width())
  208. ;
  209. }
  210. });
  211. };
  212. /***************************
  213. Select
  214. ***************************/
  215. $.fn.jqTransSelect = function(){
  216. return this.each(function(index){
  217. var $select = $(this);
  218. if($select.hasClass('jqTransformHidden')) {return;}
  219. if($select.attr('multiple')) {return;}
  220. var oLabel = jqTransformGetLabel($select);
  221. /* First thing we do is Wrap it */
  222. var $wrapper = $select
  223. .addClass('jqTransformHidden')
  224. .wrap('<div class="jqTransformSelectWrapper"></div>')
  225. .parent()
  226. .css({zIndex: 10-index})
  227. ;
  228. /* Now add the html for the select */
  229. $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
  230. var $ul = $('ul', $wrapper).css('width',$select.width()).hide();
  231. /* Now we add the options */
  232. $('option', this).each(function(i){
  233. var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
  234. $ul.append(oLi);
  235. });
  236. /* Add click handler to the a */
  237. $ul.find('a').click(function(){
  238. $('a.selected', $wrapper).removeClass('selected');
  239. $(this).addClass('selected');
  240. /* Fire the onchange event */
  241. if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) { $select[0].selectedIndex = $(this).attr('index'); $select[0].onchange(); }
  242. $select[0].selectedIndex = $(this).attr('index');
  243. $('span:eq(0)', $wrapper).html($(this).html());
  244. $ul.hide();
  245. return false;
  246. });
  247. /* Set the default */
  248. $('a:eq('+ this.selectedIndex +')', $ul).click();
  249. $('span:first', $wrapper).click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
  250. oLabel && oLabel.click(function(){$("a.jqTransformSelectOpen",$wrapper).trigger('click');});
  251. this.oLabel = oLabel;
  252. /* Apply the click handler to the Open */
  253. var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
  254. .click(function(){
  255. //Check if box is already open to still allow toggle, but close all other selects
  256. if( $ul.css('display') == 'none' ) {jqTransformHideSelect();}
  257. if($select.attr('disabled')){return false;}
  258. $ul.slideToggle('fast', function(){
  259. var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
  260. $ul.animate({scrollTop: offSet});
  261. });
  262. return false;
  263. })
  264. ;
  265. // Set the new width
  266. var iSelectWidth = $select.outerWidth();
  267. var oSpan = $('span:first',$wrapper);
  268. var newWidth = (iSelectWidth > oSpan.innerWidth())?iSelectWidth+oLinkOpen.outerWidth():$wrapper.width();
  269. $wrapper.css('width',newWidth);
  270. $ul.css('width',newWidth-2);
  271. oSpan.css({width:iSelectWidth});
  272. // Calculate the height if necessary, less elements that the default height
  273. //show the ul to calculate the block, if ul is not displayed li height value is 0
  274. $ul.css({display:'block',visibility:'hidden'});
  275. var iSelectHeight = ($('li',$ul).length)*($('li:first',$ul).height());//+1 else bug ff
  276. (iSelectHeight < $ul.height()) && $ul.css({height:iSelectHeight,'overflow':'hidden'});//hidden else bug with ff
  277. $ul.css({display:'none',visibility:'visible'});
  278. });
  279. };
  280. $.fn.jqTransform = function(options){
  281. var opt = $.extend({},defaultOptions,options);
  282. /* each form */
  283. return this.each(function(){
  284. var selfForm = $(this);
  285. if(selfForm.hasClass('jqtransformdone')) {return;}
  286. selfForm.addClass('jqtransformdone');
  287. $('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();
  288. $('input:text, input:password', this).jqTransInputText();
  289. $('input:checkbox', this).jqTransCheckBox();
  290. $('input:radio', this).jqTransRadio();
  291. $('textarea', this).jqTransTextarea();
  292. if( $('select', this).jqTransSelect().length > 0 ){jqTransformAddDocumentListener();}
  293. selfForm.bind('reset',function(){var action = function(){jqTransformReset(this);}; window.setTimeout(action, 10);});
  294. }); /* End Form each */
  295. };/* End the Plugin */
  296. })(jQuery);