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

Last change on this file since 16012 was 16012, checked in by grum, 12 years ago

feature:2634- compatibility with Piwigo 2.4
+add some objects on js framework

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