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

Last change on this file since 10818 was 9020, checked in by grum, 14 years ago

release 3.4.2

bug:2162

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