source: extensions/GrumPluginClasses/js/ui.inputText.js @ 8961

Last change on this file since 8961 was 8961, checked in by grum, 13 years ago

release 3.4.0
fix bug:1984, bug:2109
js file are minified, remove packed files

  • Property svn:executable set to *
File size: 28.2 KB
Line 
1/**
2 * -----------------------------------------------------------------------------
3 * file: ui.inputText.js
4 * file version: 1.1.0
5 * date: 2011-01-09
6 *
7 * A jQuery plugin provided by the piwigo's plugin "GrumPluginClasses"
8 *
9 * -----------------------------------------------------------------------------
10 * Author     : Grum
11 *   email    : grum@piwigo.com
12 *   website  : http://photos.grum.fr
13 *   PWG user : http://forum.phpwebgallery.net/profile.php?id=3706
14 *
15 *   << May the Little SpaceFrog be with you ! >>
16 * -----------------------------------------------------------------------------
17 *
18 *
19 *
20 *
21 * :: HISTORY ::
22 *
23 * | release | date       |
24 * | 1.0.0   | 2010/11/04 | * first release
25 * |         |            |
26 * | 1.1.0   | 2011/01/09 | * if div content is not empty and text value not
27 * |         |            |   defined, use of div content to define text value
28 * |         |            |
29 * |         |            | * add multilanguage managment
30 * |         |            |
31 * |         |            |
32 * |         |            |
33 *
34 */
35
36
37
38(
39  function($)
40  {
41    /*
42     * plugin 'public' functions
43     */
44    var publicMethods =
45    {
46      init : function (opt)
47        {
48          return this.each(function()
49            {
50              // default values for the plugin
51              var $this=$(this),
52                  data = $this.data('options'),
53                  objects = $this.data('objects'),
54                  properties = $this.data('properties'),
55                  options =
56                    {
57                      languages:[],
58                      currentLanguage:'',
59                      languagesValues:{},
60                      languageSelector:'',
61                      multilines:false,
62                      disabled:false,
63                      textAlign:'left',
64                      displayChar:0,
65                      maxChar:0,
66                      numRows:1,
67                      regExp:'',
68                      value:'',
69                      change:null
70                    };
71
72              // if options given, merge it
73              // if(opt) $.extend(options, opt); ==> options are set by setters
74              if(options.value=='' && $.trim($this.html())!='') options.value=$.trim($this.html());
75
76              $this.data('options', options);
77
78              if(!properties)
79              {
80                $this.data('properties',
81                  {
82                    initialized:false,
83                    re:/.*/,
84                    value:0,
85                    isValid:true,
86                    languagesValues:{}
87                  }
88                );
89                properties=$this.data('properties');
90              }
91
92              if(!objects)
93              {
94                objects =
95                  {
96                    container:$('<div/>',
97                        {
98                          'class':'ui-inputText',
99                          css:{
100                            width:'100%'
101                          }
102                        }
103                    ).bind('click.inputText',
104                        function ()
105                        {
106                          objects.input.focus();
107                        }
108                      ),
109                    input:null
110                  };
111
112                $this
113                  .html('')
114                  .append(objects.container);
115
116                $this.data('objects', objects);
117              }
118
119              privateMethods.setOptions($this, opt);
120            }
121          );
122        }, // init
123      destroy : function ()
124        {
125          return this.each(
126            function()
127            {
128              // default values for the plugin
129              var $this=$(this),
130                  objects = $this.data('objects');
131              objects.input.unbind().remove();
132              objects.container.unbind().remove();
133              $this
134                .unbind('.inputText')
135                .css(
136                  {
137                    width:'',
138                    height:''
139                  }
140                );
141            }
142          );
143        }, // destroy
144
145      options: function (value)
146        {
147          return(
148            this.each(
149              function()
150              {
151                privateMethods.setOptions($(this), value);
152              }
153            )
154          );
155        }, // options
156
157      disabled: function (value)
158        {
159          if(value!=null)
160          {
161            return(
162              this.each(
163                function()
164                {
165                  privateMethods.setDisabled($(this), value);
166                }
167              )
168            );
169          }
170          else
171          {
172            var options = this.data('options');
173
174            if(options)
175            {
176              return(options.disabled);
177            }
178            else
179            {
180              return('');
181            }
182          }
183        }, // disabled
184
185      textAlign: function (value)
186        {
187          if(value!=null)
188          {
189            return(
190              this.each(
191                function()
192                {
193                  privateMethods.setTextAlign($(this), value);
194                }
195              )
196            );
197          }
198          else
199          {
200            var options = this.data('options');
201
202            if(options)
203            {
204              return(options.textAlign);
205            }
206            else
207            {
208              return('');
209            }
210          }
211        }, // textAlign
212
213      displayChar: function (value)
214        {
215          if(value!=null)
216          {
217            return(
218              this.each(
219                function()
220                {
221                  privateMethods.setDisplayChar($(this), value);
222                }
223              )
224            );
225          }
226          else
227          {
228            var options = this.data('options');
229
230            if(options)
231            {
232              return(options.displayChar);
233            }
234            else
235            {
236              return('');
237            }
238          }
239        }, // displayChar
240
241      maxChar: function (value)
242        {
243          if(value!=null)
244          {
245            return(
246              this.each(
247                function()
248                {
249                  privateMethods.setMaxChar($(this), value);
250                }
251              )
252            );
253          }
254          else
255          {
256            var options = this.data('options');
257
258            if(options)
259            {
260              return(options.maxChar);
261            }
262            else
263            {
264              return('');
265            }
266          }
267        }, // maxChar
268
269      numRows: function (value)
270        {
271          if(value!=null)
272          {
273            return(
274              this.each(
275                function()
276                {
277                  privateMethods.setNumRows($(this), value);
278                }
279              )
280            );
281          }
282          else
283          {
284            var options = this.data('options');
285
286            if(options)
287            {
288              return(options.numRows);
289            }
290            else
291            {
292              return('');
293            }
294          }
295        }, // numRows
296
297      regExp: function (value)
298        {
299          if(value!=null)
300          {
301            return(
302              this.each(
303                function()
304                {
305                  privateMethods.setRegExp($(this), value);
306                }
307              )
308            );
309          }
310          else
311          {
312            var options = this.data('options');
313
314            if(options)
315            {
316              return(options.regExp);
317            }
318            else
319            {
320              return('');
321            }
322          }
323        }, // regExp
324
325      multilines: function ()
326        {
327          // return the selected tags
328          var properties=this.data('properties');
329          return(properties.multilines);
330        }, // multilines
331
332      languages: function (value)
333        {
334          if(value!=null)
335          {
336            // set the known languages
337            return(
338              this.each(
339                function()
340                {
341                  privateMethods.setLanguages($(this), value);
342                }
343              )
344            );
345          }
346          else
347          {
348            // return the known languages
349            var options = this.data('options');
350            return(options.languages);
351          }
352        },
353
354      currentLanguage: function (value)
355        {
356          if(value!=null)
357          {
358            // set the current language
359            return(
360              this.each(
361                function()
362                {
363                  privateMethods.setCurrentLanguage($(this), value);
364                }
365              )
366            );
367          }
368          else
369          {
370            // return the current language
371            var options = this.data('options');
372            return(options.currentLanguage);
373          }
374        },
375
376      languageSelector: function (value)
377        {
378          if(value!=null)
379          {
380            // set the language selector id (inputList object)
381            return(
382              this.each(
383                function()
384                {
385                  privateMethods.setLanguageSelector($(this), value);
386                }
387              )
388            );
389          }
390          else
391          {
392            // return the language selector id
393            var options = this.data('options');
394            return(options.languageSelector);
395          }
396        }, //languageSelector
397
398      languagesValues: function (value)
399        {
400          if(value!=null)
401          {
402            // set the languages values
403            return(
404              this.each(
405                function()
406                {
407                  privateMethods.setLanguagesValues($(this), value);
408                }
409              )
410            );
411          }
412          else
413          {
414            // return the languages values
415            var properties=this.data('properties');
416            return(properties.languagesValues);
417          }
418        },
419
420      value: function (value, language)
421        {
422          if(value!=null)
423          {
424            var options=this.data('options');
425
426            // set selected value
427            return(
428              this.each(
429                function()
430                {
431                  if(language!=null)
432                  {
433                    privateMethods.setLanguageValue($(this), language, value, options.currentLanguage==language);
434                  }
435                  else
436                  {
437                    privateMethods.setValue($(this), value, true);
438                  }
439                }
440              )
441            );
442          }
443          else
444          {
445            // return the selected tags
446            var properties=this.data('properties');
447            return(properties.value);
448          }
449        }, // value
450
451      isValid: function (value)
452        {
453          if(value!=null)
454          {
455            // set selected value
456            return(
457              this.each(
458                function()
459                {
460                  privateMethods.setIsValid($(this), value);
461                }
462              )
463            );
464          }
465          else
466          {
467            // return the selected tags
468            var properties=this.data('properties');
469            return(properties.isValid);
470          }
471        }, // isValid
472
473      change: function (value)
474        {
475          if(value!=null && $.isFunction(value))
476          {
477            // set selected value
478            return(
479              this.each(
480                function()
481                {
482                  privateMethods.setEventChange($(this), value);
483                }
484              )
485            );
486          }
487          else
488          {
489            // return the selected value
490            var options=this.data('options');
491
492            if(options)
493            {
494              return(options.change);
495            }
496            else
497            {
498              return(null);
499            }
500          }
501        }, // change
502
503      doTranslation: function ()
504        {
505          // set selected value
506          return(
507            this.each(
508              function()
509              {
510                privateMethods.doTranslation($(this));
511              }
512            )
513          );
514        } // doTranslation
515
516    }; // methods
517
518
519    /*
520     * plugin 'private' methods
521     */
522    var privateMethods =
523    {
524      /**
525       * return true is given value is a valid numeric value, according to the
526       * rules defined by the object
527       * @param Object object
528       * @param value
529       * @return Bool
530       */
531      isValid : function (object, value)
532        {
533          var properties=object.data('properties');
534
535          return(properties.re.exec(value))
536        },
537
538      setOptions : function (object, value)
539        {
540          var properties=object.data('properties'),
541              options=object.data('options');
542
543          if(!$.isPlainObject(value)) return(false);
544
545          properties.initialized=false;
546
547          privateMethods.setMultilines(object, (value.multilines!=null)?value.multilines:options.multilines);
548          privateMethods.setDisplayChar(object, (value.displayChar!=null)?value.displayChar:options.displayChar);
549          privateMethods.setMaxChar(object, (value.maxChar!=null)?value.maxChar:options.maxChar);
550          privateMethods.setNumRows(object, (value.numRows!=null)?value.numRows:options.numRows);
551          privateMethods.setRegExp(object, (value.regExp!=null)?value.regExp:options.regExp);
552
553          privateMethods.setLanguages(object, (value.languages!=null)?value.languages:options.languages);
554          privateMethods.setLanguagesValues(object, (value.languagesValues!=null)?value.languagesValues:options.languagesValues);
555          privateMethods.setCurrentLanguage(object, (value.currentLanguage!=null)?value.currentLanguage:options.currentLanguage);
556          privateMethods.setLanguageSelector(object, (value.languageSelector!=null)?value.languageSelector:options.languageSelector);
557
558          if((properties.languagesValues[options.currentLanguage]!=null &&
559              properties.languagesValues[options.currentLanguage]!='' ||
560              properties.languagesValues[options.currentLanguage]==null) &&
561             (value.value!=null && value.value!='' || options.value!='')
562            ) privateMethods.setValue(object, (value.value!=null)?value.value:options.value, true);
563
564          privateMethods.setTextAlign(object, (value.textAlign!=null)?value.textAlign:options.textAlign);
565
566          privateMethods.setEventChange(object, (value.change!=null)?value.change:options.change);
567
568          properties.initialized=true;
569        },
570
571      /**
572       * define the regular expression used to check validity of a numeric value
573       * @param Object object
574       */
575      setRegExp : function (object, value)
576        {
577          var properties=object.data('properties'),
578              flagRE=/^\/(.*)\/(.*)$/,
579              flags=flagRE.exec(value);
580
581          if(flags==null)
582          {
583            flags=['.*', ''];
584          }
585
586          delete properties.re;
587          properties.re = new RegExp(flags[1],flags[2]);
588        },
589
590      setIsValid : function (object, value)
591        {
592          var objects=object.data('objects'),
593              properties=object.data('properties');
594
595          if(properties.isValid!=value && properties.initialized)
596          {
597            properties.isValid=value;
598            if(properties.isValid)
599            {
600              objects.container.removeClass('ui-error');
601              objects.input.removeClass('ui-error');
602            }
603            else
604            {
605              objects.container.addClass('ui-error');
606              objects.input.addClass('ui-error');
607            }
608          }
609          return(properties.isValid);
610        },
611
612      setDisplayChar : function (object, value)
613        {
614          var options=object.data('options'),
615              objects=object.data('objects');
616              properties=object.data('properties');
617
618          if((!properties.initialized || options.displayChar!=value) && value>=0)
619          {
620            options.displayChar=value;
621            if(options.displayChar>0)
622            {
623              if(options.multilines)
624              {
625                objects.input.attr('cols', options.displayChar);
626              }
627              else
628              {
629                objects.input.attr('size', options.displayChar);
630              }
631            }
632            else
633            {
634              if(options.multilines)
635              {
636                objects.input.removeAttr('size');
637              }
638              else
639              {
640                objects.input.removeAttr('cols');
641              }
642            }
643          }
644          if(object.width()>0)
645          {
646            objects.input.css(
647              {
648                'width': object.width()+'px',
649                'max-width': object.width()+'px'
650              }
651            );
652          }
653          return(options.displayChar);
654        },
655
656      setMaxChar : function (object, value)
657        {
658          var options=object.data('options'),
659              objects=object.data('objects'),
660              properties=object.data('properties');
661
662          if((!properties.initialized || options.maxChar!=value) && value>=0)
663          {
664            options.maxChar=value;
665            if(!options.multilines)
666            {
667              if(options.maxChar>0)
668              {
669                objects.input.attr('maxlength', options.maxChar);
670              }
671              else
672              {
673                objects.input.removeAttr('maxlength');
674              }
675            }
676          }
677          return(options.maxChar);
678        },
679
680      setNumRows : function (object, value)
681        {
682          var options=object.data('options'),
683              objects=object.data('objects'),
684              properties=object.data('properties');
685
686          if((!properties.initialized || options.numRows!=value) && value>0)
687          {
688            options.numRows=value;
689            if(options.multilines)
690            {
691              objects.input.attr('rows', options.numRows);
692            }
693          }
694          return(options.numRows);
695        },
696
697      setDisabled : function (object, value)
698        {
699          var options=object.data('options'),
700              objects=object.data('objects'),
701              properties=object.data('properties');
702
703          if((!properties.initialized || options.disabled!=value) && (value==true || value==false))
704          {
705            options.disabled=value;
706            objects.input.attr('disabled', options.disabled);
707          }
708          return(options.disabled);
709        },
710
711      setTextAlign : function (object, value)
712        {
713          var options=object.data('options'),
714              objects=object.data('objects'),
715              properties=object.data('properties');
716
717          if((!properties.initialized || options.textAlign!=value) && (value=='left' || value=='right'))
718          {
719            options.textAlign=value;
720            objects.input.css('text-align', options.textAlign);
721          }
722          return(options.textAlign);
723        },
724
725
726      setMultilines : function (object, value)
727        {
728          var options=object.data('options'),
729              objects=object.data('objects'),
730              properties=object.data('properties');
731
732          if((!properties.initialized || options.multilines!=value) && (value==true || value==false))
733          {
734            options.multilines=value;
735
736            if(options.multilines)
737            {
738              objects.input=$('<textarea/>');
739            }
740            else
741            {
742              objects.input=$('<input>',
743                      {
744                        type:"text",
745                        value:''
746                      }
747                    );
748            }
749
750            objects.container.append(
751                objects.input.bind('keyup.inputText',
752                                      function (event)
753                                      {
754                                        return(privateMethods.keyUp(object, event));
755                                      }
756                                    )
757                                  .bind('change.inputText',
758                                      function (event)
759                                      {
760                                        return(privateMethods.change(object, event));
761                                      }
762                                    )
763                                  .bind('keydown.inputText',
764                                      function (event)
765                                      {
766                                        return(privateMethods.keyDown(object, event));
767                                      }
768                                    )
769            );
770
771          }
772          return(options.textAlign);
773        }, //setMultilines
774
775      setLanguages : function (object, value)
776        {
777          var properties=object.data('properties'),
778              options=object.data('options');
779
780          options.languages=value;
781          options.languagesValues={};
782
783          if(options.languages.length>0)
784          {
785            if($.inArray(options.currentLanguage, options.languages)<0 ||
786               options.currentLanguage=='') options.currentLanguage=options.languages[0];
787
788            for(var i=0;i<options.languages.length;i++)
789            {
790              properties.languagesValues[options.languages[i]]='';
791            }
792          }
793          else
794          {
795            options.currentLanguage='';
796          }
797
798          return(options.languages);
799        }, //setLanguages
800
801      setLanguagesValues : function (object, value)
802        {
803          var options=object.data('options'),
804              properties=object.data('properties');
805
806          for(var langValue in value)
807          {
808            if(properties.languagesValues[langValue]!=null)
809                privateMethods.setLanguageValue(object, langValue, value[langValue], langValue==options.currentLanguage);
810          }
811
812          return(properties.languagesValues);
813        }, //setLanguagesValues
814
815      setLanguageValue : function (object, language, value, updateInput)
816        {
817          var options=object.data('options'),
818              properties=object.data('properties');
819
820          if(properties.languagesValues[language]!=null)
821          {
822            properties.languagesValues[language]=value;
823
824            if(updateInput) privateMethods.setValue(object, properties.languagesValues[options.currentLanguage], true);
825          }
826
827          return(options.languagesValues);
828        }, //setLanguageValue
829
830      setCurrentLanguage : function (object, value)
831        {
832          var options=object.data('options'),
833              properties=object.data('properties');
834
835          if((!properties.initialized || options.currentLanguage!=value) && $.inArray(value, options.languages)>=0)
836          {
837            options.currentLanguage=value;
838
839            privateMethods.setValue(object, properties.languagesValues[options.currentLanguage], true);
840          }
841
842          return(options.currentLanguage);
843        }, //setCurrentLanguage
844
845      setLanguageSelector : function (object, value)
846        {
847          var options=object.data('options'),
848              properties=object.data('properties');
849
850          if((!properties.initialized || options.languageSelector!=value) && value!='' && $('#'+value).length>0)
851          {
852            if(options.languageSelector!='') $('#'+options.languageSelector).unbind('inputListChange');
853            options.languageSelector=value;
854
855            if(options.languageSelector!='')
856              $('#'+options.languageSelector).bind('inputListChange',
857                function (event, lang)
858                {
859                  privateMethods.setCurrentLanguage(object, lang);
860                }
861              );
862          }
863
864          return(options.currentLanguage);
865        }, //setCurrentLanguage
866
867      setValue : function (object, value, apply)
868        {
869          var options=object.data('options'),
870              properties=object.data('properties'),
871              objects=object.data('objects');
872
873          if(properties.initialized && properties.value==value)
874          {
875            return(properties.value);
876          }
877
878          privateMethods.setIsValid(object, true);
879
880          properties.value=value;
881
882          if(apply)
883          {
884            objects.input.val(properties.value);
885          }
886
887          if(options.currentLanguage!='') privateMethods.setLanguageValue(object, options.currentLanguage, value, false);
888
889          if(options.change) object.trigger('inputTextChange', properties.value);
890
891          return(properties.value);
892        }, //setValue
893
894      setEventChange : function (object, value)
895        {
896          var options=object.data('options');
897
898          options.change=value;
899          object.unbind('inputTextChange');
900          if(value) object.bind('inputTextChange', options.change);
901          return(options.change);
902        },
903
904      keyUp : function (object, event)
905        {
906          var objects=object.data('objects');
907
908          if(event.keyCode==9 || //DOM_VK_TAB
909             event.keyCode==12 || //DOM_VK_CLEAR
910             event.keyCode==16 || //DOM_VK_SHIFT
911             event.keyCode==17 || //DOM_VK_CONTROL
912             event.keyCode==18 || //DOM_VK_ALT
913             event.keyCode==33 || //DOM_VK_PAGE_UP
914             event.keyCode==34 || //DOM_VK_PAGE_DOWN
915             event.keyCode==35 || //DOM_VK_END
916             event.keyCode==36 || //DOM_VK_HOME
917             event.keyCode==37 || //DOM_VK_LEFT
918             event.keyCode==38 || //DOM_VK_UP
919             event.keyCode==39 || //DOM_VK_RIGHT
920             event.keyCode==40 || //DOM_VK_DOWN
921             event.keyCode==45 || //DOM_VK_INSERT
922             event.keyCode==93  //DOM_VK_CONTEXT_MENU
923            ) return(false);
924
925          return(privateMethods.setValue(object, objects.input.val(), false));
926        },
927
928      change : function (object, event)
929        {
930          var objects=object.data('objects');
931
932          return(privateMethods.setValue(object, objects.input.val(), false))
933        },
934
935      keyDown : function (object, event)
936        {
937          var objects=object.data('objects'),
938              options=object.data('options');
939
940          if(options.maxChar>0 &&
941             objects.input.val().length>=options.maxChar &&
942             !(event.keyCode==8 || //DOM_VK_BACK_SPACE
943               event.keyCode==9 || //DOM_VK_TAB
944               event.keyCode==12 || //DOM_VK_CLEAR
945               event.keyCode==16 || //DOM_VK_SHIFT
946               event.keyCode==17 || //DOM_VK_CONTROL
947               event.keyCode==18 || //DOM_VK_ALT
948               event.keyCode==33 || //DOM_VK_PAGE_UP
949               event.keyCode==34 || //DOM_VK_PAGE_DOWN
950               event.keyCode==35 || //DOM_VK_END
951               event.keyCode==36 || //DOM_VK_HOME
952               event.keyCode==37 || //DOM_VK_LEFT
953               event.keyCode==38 || //DOM_VK_UP
954               event.keyCode==39 || //DOM_VK_RIGHT
955               event.keyCode==40 || //DOM_VK_DOWN
956               event.keyCode==45 || //DOM_VK_INSERT
957               event.keyCode==46 || //DOM_VK_DELETE
958               event.keyCode==93 || //DOM_VK_CONTEXT_MENU
959               objects.input.get(0).selectionStart!=objects.input.get(0).selectionEnd
960              )
961          ) return(false);
962        },
963
964        /**
965         * do translation through a google translate API call (need the GPC google_translate.js file is loaded)
966         *
967         * @param String input : id of input field ; if empty, translate all localized fields
968         */
969      doTranslation : function(object)
970        {
971          var objects=object.data('objects'),
972              properties=object.data('properties'),
973              options=object.data('options');
974
975          if(googleTranslate!=null)
976          {
977            googleTranslate(properties.value, '', options.currentLanguage.substr(0,2),
978              function (result)
979              {
980                privateMethods.setValue(object, result, true);
981              }
982            );
983          }
984        }
985
986    };
987
988
989    $.fn.inputText = function(method)
990    {
991      if(publicMethods[method])
992      {
993        return publicMethods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
994      }
995      else if(typeof method === 'object' || ! method)
996      {
997        return publicMethods.init.apply(this, arguments);
998      }
999      else
1000      {
1001        $.error( 'Method ' +  method + ' does not exist on jQuery.inputText' );
1002      }
1003    } // $.fn.inputText
1004
1005  }
1006)(jQuery);
1007
1008
Note: See TracBrowser for help on using the repository browser.