Changeset 28097


Ignore:
Timestamp:
04/06/14 15:51:22 (6 years ago)
Author:
flop25
Message:

every steps move to lang file
script debugged/enhanced

Location:
extensions/TakeATour
Files:
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • extensions/TakeATour/js/custom-bootstrap-tour-standalone.js

    r27993 r28097  
    819819          _this._debug("Show the orphan step " + (_this._current + 1) + ". Orphans option is true."); 
    820820        } 
     821        if (step.title  === "" & step.content  === "") { 
     822            if (skipToPrevious) { 
     823              _this._showPrevStep(); 
     824            } else { 
     825              _this._showNextStep(); 
     826            } 
     827            return; 
     828        } 
    821829        if (step.backdrop) { 
    822830          _this._showBackdrop(!_this._isOrphan(step) ? step.element : void 0); 
     
    975983        $.extend(options, step.options); 
    976984      } 
    977       if (step.reflex) { 
     985      if (step.reflex & !isOrphan) { 
    978986        $element.css("cursor", "pointer").on("click.tour-" + this._options.name, (function(_this) { 
    979987          return function() { 
  • extensions/TakeATour/js/custom-bootstrap-tour-standalone.min.js

    r27898 r28097  
    1 /* =========================================================== 
    2 # bootstrap-tour - v0.9.0 
    3 # http://bootstraptour.com 
    4 # ============================================================== 
    5 # Copyright 2012-2013 Ulrich Sossou 
    6 # 
    7 # Licensed under the Apache License, Version 2.0 (the "License"); 
    8 # you may not use this file except in compliance with the License. 
    9 # You may obtain a copy of the License at 
    10 # 
    11 #     http://www.apache.org/licenses/LICENSE-2.0 
    12 # 
    13 # Unless required by applicable law or agreed to in writing, software 
    14 # distributed under the License is distributed on an "AS IS" BASIS, 
    15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    16 # See the License for the specific language governing permissions and 
    17 # limitations under the License. 
    18 */ 
    19 /* ======================================================================== 
    20  * Bootstrap: tooltip.js v3.1.0 
    21  * http://getbootstrap.com/javascript/#tooltip 
    22  * Inspired by the original jQuery.tipsy by Jason Frame 
    23  * ======================================================================== 
    24  * Copyright 2011-2014 Twitter, Inc. 
    25  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 
    26  * ======================================================================== */ 
    27  
    28  
    29 +function ($) { 
    30   'use strict'; 
    31  
    32   // TOOLTIP PUBLIC CLASS DEFINITION 
    33   // =============================== 
    34  
    35   var Tooltip = function (element, options) { 
    36     this.type       = 
    37     this.options    = 
    38     this.enabled    = 
    39     this.timeout    = 
    40     this.hoverState = 
    41     this.$element   = null 
    42  
    43     this.init('tooltip', element, options) 
    44   } 
    45  
    46   Tooltip.DEFAULTS = { 
    47     animation: true, 
    48     placement: 'top', 
    49     selector: false, 
    50     template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', 
    51     trigger: 'hover focus', 
    52     title: '', 
    53     delay: 0, 
    54     html: false, 
    55     container: false 
    56   } 
    57  
    58   Tooltip.prototype.init = function (type, element, options) { 
    59     this.enabled  = true 
    60     this.type     = type 
    61     this.$element = $(element) 
    62     this.options  = this.getOptions(options) 
    63  
    64     var triggers = this.options.trigger.split(' ') 
    65  
    66     for (var i = triggers.length; i--;) { 
    67       var trigger = triggers[i] 
    68  
    69       if (trigger == 'click') { 
    70         this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) 
    71       } else if (trigger != 'manual') { 
    72         var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin' 
    73         var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' 
    74  
    75         this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) 
    76         this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) 
    77       } 
    78     } 
    79  
    80     this.options.selector ? 
    81       (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : 
    82       this.fixTitle() 
    83   } 
    84  
    85   Tooltip.prototype.getDefaults = function () { 
    86     return Tooltip.DEFAULTS 
    87   } 
    88  
    89   Tooltip.prototype.getOptions = function (options) { 
    90     options = $.extend({}, this.getDefaults(), this.$element.data(), options) 
    91  
    92     if (options.delay && typeof options.delay == 'number') { 
    93       options.delay = { 
    94         show: options.delay, 
    95         hide: options.delay 
    96       } 
    97     } 
    98  
    99     return options 
    100   } 
    101  
    102   Tooltip.prototype.getDelegateOptions = function () { 
    103     var options  = {} 
    104     var defaults = this.getDefaults() 
    105  
    106     this._options && $.each(this._options, function (key, value) { 
    107       if (defaults[key] != value) options[key] = value 
    108     }) 
    109  
    110     return options 
    111   } 
    112  
    113   Tooltip.prototype.enter = function (obj) { 
    114     var self = obj instanceof this.constructor ? 
    115       obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) 
    116  
    117     clearTimeout(self.timeout) 
    118  
    119     self.hoverState = 'in' 
    120  
    121     if (!self.options.delay || !self.options.delay.show) return self.show() 
    122  
    123     self.timeout = setTimeout(function () { 
    124       if (self.hoverState == 'in') self.show() 
    125     }, self.options.delay.show) 
    126   } 
    127  
    128   Tooltip.prototype.leave = function (obj) { 
    129     var self = obj instanceof this.constructor ? 
    130       obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) 
    131  
    132     clearTimeout(self.timeout) 
    133  
    134     self.hoverState = 'out' 
    135  
    136     if (!self.options.delay || !self.options.delay.hide) return self.hide() 
    137  
    138     self.timeout = setTimeout(function () { 
    139       if (self.hoverState == 'out') self.hide() 
    140     }, self.options.delay.hide) 
    141   } 
    142  
    143   Tooltip.prototype.show = function () { 
    144     var e = $.Event('show.bs.' + this.type) 
    145  
    146     if (this.hasContent() && this.enabled) { 
    147       this.$element.trigger(e) 
    148  
    149       if (e.isDefaultPrevented()) return 
    150       var that = this; 
    151  
    152       var $tip = this.tip() 
    153  
    154       this.setContent() 
    155  
    156       if (this.options.animation) $tip.addClass('fade') 
    157  
    158       var placement = typeof this.options.placement == 'function' ? 
    159         this.options.placement.call(this, $tip[0], this.$element[0]) : 
    160         this.options.placement 
    161  
    162       var autoToken = /\s?auto?\s?/i 
    163       var autoPlace = autoToken.test(placement) 
    164       if (autoPlace) placement = placement.replace(autoToken, '') || 'top' 
    165  
    166       $tip 
    167         .detach() 
    168         .css({ top: 0, left: 0, display: 'block' }) 
    169         .addClass(placement) 
    170  
    171       this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) 
    172  
    173       var pos          = this.getPosition() 
    174       var actualWidth  = $tip[0].offsetWidth 
    175       var actualHeight = $tip[0].offsetHeight 
    176  
    177       if (autoPlace) { 
    178         var $parent = this.$element.parent() 
    179  
    180         var orgPlacement = placement 
    181         var docScroll    = document.documentElement.scrollTop || document.body.scrollTop 
    182         var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth() 
    183         var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight() 
    184         var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left 
    185  
    186         placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    : 
    187                     placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' : 
    188                     placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   : 
    189                     placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  : 
    190                     placement 
    191  
    192         $tip 
    193           .removeClass(orgPlacement) 
    194           .addClass(placement) 
    195       } 
    196  
    197       var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) 
    198  
    199       this.applyPlacement(calculatedOffset, placement) 
    200       this.hoverState = null 
    201  
    202       var complete = function() { 
    203         that.$element.trigger('shown.bs.' + that.type) 
    204       } 
    205  
    206       $.support.transition && this.$tip.hasClass('fade') ? 
    207         $tip 
    208           .one($.support.transition.end, complete) 
    209           .emulateTransitionEnd(150) : 
    210         complete() 
    211     } 
    212   } 
    213  
    214   Tooltip.prototype.applyPlacement = function (offset, placement) { 
    215     var replace 
    216     var $tip   = this.tip() 
    217     var width  = $tip[0].offsetWidth 
    218     var height = $tip[0].offsetHeight 
    219  
    220     // manually read margins because getBoundingClientRect includes difference 
    221     var marginTop = parseInt($tip.css('margin-top'), 10) 
    222     var marginLeft = parseInt($tip.css('margin-left'), 10) 
    223  
    224     // we must check for NaN for ie 8/9 
    225     if (isNaN(marginTop))  marginTop  = 0 
    226     if (isNaN(marginLeft)) marginLeft = 0 
    227  
    228     offset.top  = offset.top  + marginTop 
    229     offset.left = offset.left + marginLeft 
    230  
    231     // $.fn.offset doesn't round pixel values 
    232     // so we use setOffset directly with our own function B-0 
    233     $.offset.setOffset($tip[0], $.extend({ 
    234       using: function (props) { 
    235         $tip.css({ 
    236           top: Math.round(props.top), 
    237           left: Math.round(props.left) 
    238         }) 
    239       } 
    240     }, offset), 0) 
    241  
    242     $tip.addClass('in') 
    243  
    244     // check to see if placing tip in new offset caused the tip to resize itself 
    245     var actualWidth  = $tip[0].offsetWidth 
    246     var actualHeight = $tip[0].offsetHeight 
    247  
    248     if (placement == 'top' && actualHeight != height) { 
    249       replace = true 
    250       offset.top = offset.top + height - actualHeight 
    251     } 
    252  
    253     if (/bottom|top/.test(placement)) { 
    254       var delta = 0 
    255  
    256       if (offset.left < 0) { 
    257         delta       = offset.left * -2 
    258         offset.left = 0 
    259  
    260         $tip.offset(offset) 
    261  
    262         actualWidth  = $tip[0].offsetWidth 
    263         actualHeight = $tip[0].offsetHeight 
    264       } 
    265  
    266       this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') 
    267     } else { 
    268       this.replaceArrow(actualHeight - height, actualHeight, 'top') 
    269     } 
    270  
    271     if (replace) $tip.offset(offset) 
    272   } 
    273  
    274   Tooltip.prototype.replaceArrow = function (delta, dimension, position) { 
    275     this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') 
    276   } 
    277  
    278   Tooltip.prototype.setContent = function () { 
    279     var $tip  = this.tip() 
    280     var title = this.getTitle() 
    281  
    282     $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) 
    283     $tip.removeClass('fade in top bottom left right') 
    284   } 
    285  
    286   Tooltip.prototype.hide = function () { 
    287     var that = this 
    288     var $tip = this.tip() 
    289     var e    = $.Event('hide.bs.' + this.type) 
    290  
    291     function complete() { 
    292       if (that.hoverState != 'in') $tip.detach() 
    293       that.$element.trigger('hidden.bs.' + that.type) 
    294     } 
    295  
    296     this.$element.trigger(e) 
    297  
    298     if (e.isDefaultPrevented()) return 
    299  
    300     $tip.removeClass('in') 
    301  
    302     $.support.transition && this.$tip.hasClass('fade') ? 
    303       $tip 
    304         .one($.support.transition.end, complete) 
    305         .emulateTransitionEnd(150) : 
    306       complete() 
    307  
    308     this.hoverState = null 
    309  
    310     return this 
    311   } 
    312  
    313   Tooltip.prototype.fixTitle = function () { 
    314     var $e = this.$element 
    315     if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { 
    316       $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') 
    317     } 
    318   } 
    319  
    320   Tooltip.prototype.hasContent = function () { 
    321     return this.getTitle() 
    322   } 
    323  
    324   Tooltip.prototype.getPosition = function () { 
    325     var el = this.$element[0] 
    326     return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { 
    327       width: el.offsetWidth, 
    328       height: el.offsetHeight 
    329     }, this.$element.offset()) 
    330   } 
    331  
    332   Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { 
    333     return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } : 
    334            placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } : 
    335            placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : 
    336         /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   } 
    337   } 
    338  
    339   Tooltip.prototype.getTitle = function () { 
    340     var title 
    341     var $e = this.$element 
    342     var o  = this.options 
    343  
    344     title = $e.attr('data-original-title') 
    345       || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title) 
    346  
    347     return title 
    348   } 
    349  
    350   Tooltip.prototype.tip = function () { 
    351     return this.$tip = this.$tip || $(this.options.template) 
    352   } 
    353  
    354   Tooltip.prototype.arrow = function () { 
    355     return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow') 
    356   } 
    357  
    358   Tooltip.prototype.validate = function () { 
    359     if (!this.$element[0].parentNode) { 
    360       this.hide() 
    361       this.$element = null 
    362       this.options  = null 
    363     } 
    364   } 
    365  
    366   Tooltip.prototype.enable = function () { 
    367     this.enabled = true 
    368   } 
    369  
    370   Tooltip.prototype.disable = function () { 
    371     this.enabled = false 
    372   } 
    373  
    374   Tooltip.prototype.toggleEnabled = function () { 
    375     this.enabled = !this.enabled 
    376   } 
    377  
    378   Tooltip.prototype.toggle = function (e) { 
    379     var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this 
    380     self.tip().hasClass('in') ? self.leave(self) : self.enter(self) 
    381   } 
    382  
    383   Tooltip.prototype.destroy = function () { 
    384     clearTimeout(this.timeout) 
    385     this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) 
    386   } 
    387  
    388  
    389   // TOOLTIP PLUGIN DEFINITION 
    390   // ========================= 
    391  
    392   var old = $.fn.tooltip 
    393  
    394   $.fn.tooltip = function (option) { 
    395     return this.each(function () { 
    396       var $this   = $(this) 
    397       var data    = $this.data('bs.tooltip') 
    398       var options = typeof option == 'object' && option 
    399  
    400       if (!data && option == 'destroy') return 
    401       if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) 
    402       if (typeof option == 'string') data[option]() 
    403     }) 
    404   } 
    405  
    406   $.fn.tooltip.Constructor = Tooltip 
    407  
    408  
    409   // TOOLTIP NO CONFLICT 
    410   // =================== 
    411  
    412   $.fn.tooltip.noConflict = function () { 
    413     $.fn.tooltip = old 
    414     return this 
    415   } 
    416  
    417 }(jQuery); 
    418  
    419 /* ======================================================================== 
    420  * Bootstrap: popover.js v3.1.0 
    421  * http://getbootstrap.com/javascript/#popovers 
    422  * ======================================================================== 
    423  * Copyright 2011-2014 Twitter, Inc. 
    424  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 
    425  * ======================================================================== */ 
    426  
    427  
    428 +function ($) { 
    429   'use strict'; 
    430  
    431   // POPOVER PUBLIC CLASS DEFINITION 
    432   // =============================== 
    433  
    434   var Popover = function (element, options) { 
    435     this.init('popover', element, options) 
    436   } 
    437  
    438   if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') 
    439  
    440   Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { 
    441     placement: 'right', 
    442     trigger: 'click', 
    443     content: '', 
    444     template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' 
    445   }) 
    446  
    447  
    448   // NOTE: POPOVER EXTENDS tooltip.js 
    449   // ================================ 
    450  
    451   Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) 
    452  
    453   Popover.prototype.constructor = Popover 
    454  
    455   Popover.prototype.getDefaults = function () { 
    456     return Popover.DEFAULTS 
    457   } 
    458  
    459   Popover.prototype.setContent = function () { 
    460     var $tip    = this.tip() 
    461     var title   = this.getTitle() 
    462     var content = this.getContent() 
    463  
    464     $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) 
    465     $tip.find('.popover-content')[ // we use append for html objects to maintain js events 
    466       this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' 
    467     ](content) 
    468  
    469     $tip.removeClass('fade top bottom left right in') 
    470  
    471     // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do 
    472     // this manually by checking the contents. 
    473     if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() 
    474   } 
    475  
    476   Popover.prototype.hasContent = function () { 
    477     return this.getTitle() || this.getContent() 
    478   } 
    479  
    480   Popover.prototype.getContent = function () { 
    481     var $e = this.$element 
    482     var o  = this.options 
    483  
    484     return $e.attr('data-content') 
    485       || (typeof o.content == 'function' ? 
    486             o.content.call($e[0]) : 
    487             o.content) 
    488   } 
    489  
    490   Popover.prototype.arrow = function () { 
    491     return this.$arrow = this.$arrow || this.tip().find('.arrow') 
    492   } 
    493  
    494   Popover.prototype.tip = function () { 
    495     if (!this.$tip) this.$tip = $(this.options.template) 
    496     return this.$tip 
    497   } 
    498  
    499  
    500   // POPOVER PLUGIN DEFINITION 
    501   // ========================= 
    502  
    503   var old = $.fn.popover 
    504  
    505   $.fn.popover = function (option) { 
    506     return this.each(function () { 
    507       var $this   = $(this) 
    508       var data    = $this.data('bs.popover') 
    509       var options = typeof option == 'object' && option 
    510  
    511       if (!data && option == 'destroy') return 
    512       if (!data) $this.data('bs.popover', (data = new Popover(this, options))) 
    513       if (typeof option == 'string') data[option]() 
    514     }) 
    515   } 
    516  
    517   $.fn.popover.Constructor = Popover 
    518  
    519  
    520   // POPOVER NO CONFLICT 
    521   // =================== 
    522  
    523   $.fn.popover.noConflict = function () { 
    524     $.fn.popover = old 
    525     return this 
    526   } 
    527  
    528 }(jQuery); 
    529  
    530 (function($, window) { 
    531   var Tour, document; 
    532   document = window.document; 
    533   Tour = (function() { 
    534     function Tour(options) { 
    535       this._options = $.extend({ 
    536         name: "tour", 
    537         steps: [], 
    538         container: "body", 
    539         keyboard: true, 
    540         storage: window.localStorage, 
    541         debug: false, 
    542         backdrop: false, 
    543         redirect: true, 
    544         orphan: false, 
    545         duration: false, 
    546         basePath: "", 
    547         template: "<div class='popover'>          <div class='arrow'></div>          <h3 class='popover-title'></h3>          <div class='popover-content'></div>          <div class='popover-navigation'>            <div class='btn-group'>              <button class='btn btn-sm btn-default' data-role='prev'>&laquo; Prev</button>              <button class='btn btn-sm btn-default' data-role='next'>Next &raquo;</button>              <button class='btn btn-sm btn-default' data-role='pause-resume' data-pause-text='Pause' data-resume-text='Resume'>Pause</button>            </div>            <button class='btn btn-sm btn-default' data-role='end'>End tour</button>          </div>        </div>", 
    548         afterSetState: function(key, value) {}, 
    549         afterGetState: function(key, value) {}, 
    550         afterRemoveState: function(key) {}, 
    551         onStart: function(tour) {}, 
    552         onEnd: function(tour) {}, 
    553         onShow: function(tour) {}, 
    554         onShown: function(tour) {}, 
    555         onHide: function(tour) {}, 
    556         onHidden: function(tour) {}, 
    557         onNext: function(tour) {}, 
    558         onPrev: function(tour) {}, 
    559         onPause: function(tour, duration) {}, 
    560         onResume: function(tour, duration) {} 
    561       }, options); 
    562       this._force = false; 
    563       this._inited = false; 
    564       this.backdrop = { 
    565         overlay: null, 
    566         $element: null, 
    567         $background: null, 
    568         backgroundShown: false, 
    569         overlayElementShown: false 
    570       }; 
    571       this; 
    572     } 
    573  
    574     Tour.prototype.addSteps = function(steps) { 
    575       var step, _i, _len; 
    576       for (_i = 0, _len = steps.length; _i < _len; _i++) { 
    577         step = steps[_i]; 
    578         this.addStep(step); 
    579       } 
    580       return this; 
    581     }; 
    582  
    583     Tour.prototype.addStep = function(step) { 
    584       this._options.steps.push(step); 
    585       return this; 
    586     }; 
    587  
    588     Tour.prototype.getStep = function(i) { 
    589       if (this._options.steps[i] != null) { 
    590         return $.extend({ 
    591           id: "step-" + i, 
    592           path: "", 
    593           placement: "right", 
    594           title: "", 
    595           content: "<p></p>", 
    596           next: i === this._options.steps.length - 1 ? -1 : i + 1, 
    597           prev: i - 1, 
    598           animation: true, 
    599           container: this._options.container, 
    600           backdrop: this._options.backdrop, 
    601           redirect: this._options.redirect, 
    602           orphan: this._options.orphan, 
    603           duration: this._options.duration, 
    604           template: this._options.template, 
    605           onShow: this._options.onShow, 
    606           onShown: this._options.onShown, 
    607           onHide: this._options.onHide, 
    608           onHidden: this._options.onHidden, 
    609           onNext: this._options.onNext, 
    610           onPrev: this._options.onPrev, 
    611           onPause: this._options.onPause, 
    612           onResume: this._options.onResume 
    613         }, this._options.steps[i]); 
    614       } 
    615     }; 
    616  
    617     Tour.prototype.init = function(force) { 
    618       var _this = this; 
    619       this._force = force; 
    620       if (this.ended()) { 
    621         this._debug("Tour ended, init prevented."); 
    622         return this; 
    623       } 
    624       this.setCurrentStep(); 
    625       this._initMouseNavigation(); 
    626       this._initKeyboardNavigation(); 
    627       this._onResize(function() { 
    628         return _this.showStep(_this._current); 
    629       }); 
    630       if (this._current !== null) { 
    631         this.showStep(this._current); 
    632       } 
    633       this._inited = true; 
    634       return this; 
    635     }; 
    636  
    637     Tour.prototype.start = function(force) { 
    638       var promise; 
    639       if (force == null) { 
    640         force = false; 
    641       } 
    642       if (!this._inited) { 
    643         this.init(force); 
    644       } 
    645       if (this._current === null) { 
    646         promise = this._makePromise(this._options.onStart != null ? this._options.onStart(this) : void 0); 
    647         this._callOnPromiseDone(promise, this.showStep, 0); 
    648       } 
    649       return this; 
    650     }; 
    651  
    652     Tour.prototype.next = function() { 
    653       var promise; 
    654       promise = this.hideStep(this._current); 
    655       return this._callOnPromiseDone(promise, this._showNextStep); 
    656     }; 
    657  
    658     Tour.prototype.prev = function() { 
    659       var promise; 
    660       promise = this.hideStep(this._current); 
    661       return this._callOnPromiseDone(promise, this._showPrevStep); 
    662     }; 
    663  
    664     Tour.prototype.goTo = function(i) { 
    665       var promise; 
    666       promise = this.hideStep(this._current); 
    667       return this._callOnPromiseDone(promise, this.showStep, i); 
    668     }; 
    669  
    670     Tour.prototype.end = function() { 
    671       var endHelper, promise, 
    672         _this = this; 
    673       endHelper = function(e) { 
    674         $(document).off("click.tour-" + _this._options.name); 
    675         $(document).off("keyup.tour-" + _this._options.name); 
    676         $(window).off("resize.tour-" + _this._options.name); 
    677         _this._setState("end", "yes"); 
    678         _this._inited = false; 
    679         _this._force = false; 
    680         _this._clearTimer(); 
    681         if (_this._options.onEnd != null) { 
    682           return _this._options.onEnd(_this); 
    683         } 
    684       }; 
    685       promise = this.hideStep(this._current); 
    686       return this._callOnPromiseDone(promise, endHelper); 
    687     }; 
    688  
    689     Tour.prototype.ended = function() { 
    690       return !this._force && !!this._getState("end"); 
    691     }; 
    692  
    693     Tour.prototype.restart = function() { 
    694       this._removeState("current_step"); 
    695       this._removeState("end"); 
    696       this.setCurrentStep(0); 
    697       return this.start(); 
    698     }; 
    699  
    700     Tour.prototype.pause = function() { 
    701       var step; 
    702       step = this.getStep(this._current); 
    703       if (!(step && step.duration)) { 
    704         return this; 
    705       } 
    706       this._paused = true; 
    707       this._duration -= new Date().getTime() - this._start; 
    708       window.clearTimeout(this._timer); 
    709       this._debug("Paused/Stopped step " + (this._current + 1) + " timer (" + this._duration + " remaining)."); 
    710       if (step.onPause != null) { 
    711         return step.onPause(this, this._duration); 
    712       } 
    713     }; 
    714  
    715     Tour.prototype.resume = function() { 
    716       var step, 
    717         _this = this; 
    718       step = this.getStep(this._current); 
    719       if (!(step && step.duration)) { 
    720         return this; 
    721       } 
    722       this._paused = false; 
    723       this._start = new Date().getTime(); 
    724       this._duration = this._duration || step.duration; 
    725       this._timer = window.setTimeout(function() { 
    726         if (_this._isLast()) { 
    727           return _this.next(); 
    728         } else { 
    729           return _this.end(); 
    730         } 
    731       }, this._duration); 
    732       this._debug("Started step " + (this._current + 1) + " timer with duration " + this._duration); 
    733       if ((step.onResume != null) && this._duration !== step.duration) { 
    734         return step.onResume(this, this._duration); 
    735       } 
    736     }; 
    737  
    738     Tour.prototype.hideStep = function(i) { 
    739       var hideStepHelper, promise, step, 
    740         _this = this; 
    741       step = this.getStep(i); 
    742       if (!step) { 
    743         return; 
    744       } 
    745       this._clearTimer(); 
    746       promise = this._makePromise(step.onHide != null ? step.onHide(this, i) : void 0); 
    747       hideStepHelper = function(e) { 
    748         var $element; 
    749         $element = $(step.element); 
    750         if (!($element.data("bs.popover") || $element.data("popover"))) { 
    751           $element = $("body"); 
    752         } 
    753         $element.popover("destroy"); 
    754         if (step.reflex) { 
    755           $element.css("cursor", "").off("click.tour-" + _this._options.name); 
    756         } 
    757         if (step.backdrop) { 
    758           _this._hideBackdrop(); 
    759         } 
    760         if (step.onHidden != null) { 
    761           return step.onHidden(_this); 
    762         } 
    763       }; 
    764       this._callOnPromiseDone(promise, hideStepHelper); 
    765       return promise; 
    766     }; 
    767  
    768     Tour.prototype.showStep = function(i) { 
    769       var promise, showStepHelper, skipToPrevious, step, 
    770         _this = this; 
    771       if (this.ended()) { 
    772         this._debug("Tour ended, showStep prevented."); 
    773         return this; 
    774       } 
    775       step = this.getStep(i); 
    776       if (!step) { 
    777         return; 
    778       } 
    779       skipToPrevious = i < this._current; 
    780       promise = this._makePromise(step.onShow != null ? step.onShow(this, i) : void 0); 
    781       showStepHelper = function(e) { 
    782         var current_path, path; 
    783         _this.setCurrentStep(i); 
    784         path = (function() { 
    785           switch (toString.call(step.path)) { 
    786             case "[object Function]": 
    787               return step.path(); 
    788             case "[object String]": 
    789               return this._options.basePath + step.path; 
    790             default: 
    791               return step.path; 
    792           } 
    793         }).call(_this); 
    794         current_path = [document.location.pathname, document.location.hash].join("?"); 
    795         window.console.log(current_path); 
    796         console.log(current_path); 
    797         console.log("FUCK"); 
    798         if (_this._isRedirect(path, current_path)) { 
    799           //_this._redirect(step, path); 
    800           console.log(current_path); 
    801           console.log(path); 
    802           return; 
    803         } 
    804         if (_this._isOrphan(step)) { 
    805           if (!step.orphan) { 
    806             _this._debug("Skip the orphan step " + (_this._current + 1) + ". Orphan option is false and the element doesn't exist or is hidden."); 
    807             if (skipToPrevious) { 
    808               _this._showPrevStep(); 
    809             } else { 
    810               _this._showNextStep(); 
    811             } 
    812             return; 
    813           } 
    814           _this._debug("Show the orphan step " + (_this._current + 1) + ". Orphans option is true."); 
    815         } 
    816         if (step.backdrop) { 
    817           _this._showBackdrop(!_this._isOrphan(step) ? step.element : void 0); 
    818         } 
    819         _this._scrollIntoView(step.element, function() { 
    820           if ((step.element != null) && step.backdrop) { 
    821             _this._showOverlayElement(step.element); 
    822           } 
    823           _this._showPopover(step, i); 
    824           if (step.onShown != null) { 
    825             step.onShown(_this); 
    826           } 
    827           return _this._debug("Step " + (_this._current + 1) + " of " + _this._options.steps.length); 
    828         }); 
    829         if (step.duration) { 
    830           return _this.resume(); 
    831         } 
    832       }; 
    833       this._callOnPromiseDone(promise, showStepHelper); 
    834       return promise; 
    835     }; 
    836  
    837     Tour.prototype.getCurrentStep = function() { 
    838       return this._current; 
    839     }; 
    840  
    841     Tour.prototype.setCurrentStep = function(value) { 
    842       if (value != null) { 
    843         this._current = value; 
    844         this._setState("current_step", value); 
    845       } else { 
    846         this._current = this._getState("current_step"); 
    847         this._current = this._current === null ? null : parseInt(this._current, 10); 
    848       } 
    849       return this; 
    850     }; 
    851  
    852     Tour.prototype._setState = function(key, value) { 
    853       var e, keyName; 
    854       if (this._options.storage) { 
    855         keyName = "" + this._options.name + "_" + key; 
    856         try { 
    857           this._options.storage.setItem(keyName, value); 
    858         } catch (_error) { 
    859           e = _error; 
    860           if (e.code === DOMException.QUOTA_EXCEEDED_ERR) { 
    861             this.debug("LocalStorage quota exceeded. State storage failed."); 
    862           } 
    863         } 
    864         return this._options.afterSetState(keyName, value); 
    865       } else { 
    866         if (this._state == null) { 
    867           this._state = {}; 
    868         } 
    869         return this._state[key] = value; 
    870       } 
    871     }; 
    872  
    873     Tour.prototype._removeState = function(key) { 
    874       var keyName; 
    875       if (this._options.storage) { 
    876         keyName = "" + this._options.name + "_" + key; 
    877         this._options.storage.removeItem(keyName); 
    878         return this._options.afterRemoveState(keyName); 
    879       } else { 
    880         if (this._state != null) { 
    881           return delete this._state[key]; 
    882         } 
    883       } 
    884     }; 
    885  
    886     Tour.prototype._getState = function(key) { 
    887       var keyName, value; 
    888       if (this._options.storage) { 
    889         keyName = "" + this._options.name + "_" + key; 
    890         value = this._options.storage.getItem(keyName); 
    891       } else { 
    892         if (this._state != null) { 
    893           value = this._state[key]; 
    894         } 
    895       } 
    896       if (value === void 0 || value === "null") { 
    897         value = null; 
    898       } 
    899       this._options.afterGetState(key, value); 
    900       return value; 
    901     }; 
    902  
    903     Tour.prototype._showNextStep = function() { 
    904       var promise, showNextStepHelper, step, 
    905         _this = this; 
    906       step = this.getStep(this._current); 
    907       showNextStepHelper = function(e) { 
    908         return _this.showStep(step.next); 
    909       }; 
    910       promise = this._makePromise(step.onNext != null ? step.onNext(this) : void 0); 
    911       return this._callOnPromiseDone(promise, showNextStepHelper); 
    912     }; 
    913  
    914     Tour.prototype._showPrevStep = function() { 
    915       var promise, showPrevStepHelper, step, 
    916         _this = this; 
    917       step = this.getStep(this._current); 
    918       showPrevStepHelper = function(e) { 
    919         return _this.showStep(step.prev); 
    920       }; 
    921       promise = this._makePromise(step.onPrev != null ? step.onPrev(this) : void 0); 
    922       return this._callOnPromiseDone(promise, showPrevStepHelper); 
    923     }; 
    924  
    925     Tour.prototype._debug = function(text) { 
    926       if (this._options.debug) { 
    927         return window.console.log("Bootstrap Tour '" + this._options.name + "' | " + text); 
    928       } 
    929     }; 
    930  
    931     Tour.prototype._isRedirect = function(path, currentPath) { 
    932       console.log(path.replace(/\?.*$/, "").replace(/\/?$/, "")); 
    933       console.log(currentPath.replace(/\/?$/, "")); 
    934       return (path != null) && path !== "" && ((toString.call(path) === "[object RegExp]" && !path.test(currentPath)) || (toString.call(path) === "[object String]" && path.replace(/\?.*$/, "").replace(/\/?$/, "") !== currentPath.replace(/\/?$/, ""))); 
    935     }; 
    936  
    937     Tour.prototype._redirect = function(step, path) { 
    938       if ($.isFunction(step.redirect)) { 
    939         return step.redirect.call(this, path); 
    940       } else if (step.redirect === true) { 
    941         this._debug("Redirect to " + path); 
    942         return document.location.href = path; 
    943       } 
    944     }; 
    945  
    946     Tour.prototype._isOrphan = function(step) { 
    947       return (step.element == null) || !$(step.element).length || $(step.element).is(":hidden") && ($(step.element)[0].namespaceURI !== "http://www.w3.org/2000/svg"); 
    948     }; 
    949  
    950     Tour.prototype._isLast = function() { 
    951       return this._current < this._options.steps.length - 1; 
    952     }; 
    953  
    954     Tour.prototype._showPopover = function(step, i) { 
    955       var $element, $navigation, $template, $tip, isOrphan, options, 
    956         _this = this; 
    957       options = $.extend({}, this._options); 
    958       $template = $.isFunction(step.template) ? $(step.template(i, step)) : $(step.template); 
    959       $navigation = $template.find(".popover-navigation"); 
    960       isOrphan = this._isOrphan(step); 
    961       if (isOrphan) { 
    962         step.element = "body"; 
    963         step.placement = "top"; 
    964         $template = $template.addClass("orphan"); 
    965       } 
    966       $element = $(step.element); 
    967       $template.addClass("tour-" + this._options.name + " tour-" + this._options.name + "-" + i); 
    968       if (step.options) { 
    969         $.extend(options, step.options); 
    970       } 
    971       if (step.reflex) { 
    972         $element.css("cursor", "pointer").on("click.tour-" + this._options.name, function() { 
    973           if (_this._isLast()) { 
    974             return _this.next(); 
    975           } else { 
    976             return _this.end(); 
    977           } 
    978         }); 
    979       } 
    980       if (step.prev < 0) { 
    981         $navigation.find("[data-role='prev']").addClass("disabled"); 
    982       } 
    983       if (step.next < 0) { 
    984         $navigation.find("[data-role='next']").addClass("disabled"); 
    985       } 
    986       if (!step.duration) { 
    987         $navigation.find("[data-role='pause-resume']").remove(); 
    988       } 
    989       step.template = $template.clone().wrap("<div>").parent().html(); 
    990       $element.popover({ 
    991         placement: step.placement, 
    992         trigger: "manual", 
    993         title: step.title, 
    994         content: step.content, 
    995         html: true, 
    996         animation: step.animation, 
    997         container: step.container, 
    998         template: step.template, 
    999         selector: step.element 
    1000       }).popover("show"); 
    1001       $tip = $element.data("bs.popover") ? $element.data("bs.popover").tip() : $element.data("popover").tip(); 
    1002       $tip.attr("id", step.id); 
    1003       this._reposition($tip, step); 
    1004       if (isOrphan) { 
    1005         return this._center($tip); 
    1006       } 
    1007     }; 
    1008  
    1009     Tour.prototype._reposition = function($tip, step) { 
    1010       var offsetBottom, offsetHeight, offsetRight, offsetWidth, originalLeft, originalTop, tipOffset; 
    1011       offsetWidth = $tip[0].offsetWidth; 
    1012       offsetHeight = $tip[0].offsetHeight; 
    1013       tipOffset = $tip.offset(); 
    1014       originalLeft = tipOffset.left; 
    1015       originalTop = tipOffset.top; 
    1016       offsetBottom = $(document).outerHeight() - tipOffset.top - $tip.outerHeight(); 
    1017       if (offsetBottom < 0) { 
    1018         tipOffset.top = tipOffset.top + offsetBottom; 
    1019       } 
    1020       offsetRight = $("html").outerWidth() - tipOffset.left - $tip.outerWidth(); 
    1021       if (offsetRight < 0) { 
    1022         tipOffset.left = tipOffset.left + offsetRight; 
    1023       } 
    1024       if (tipOffset.top < 0) { 
    1025         tipOffset.top = 0; 
    1026       } 
    1027       if (tipOffset.left < 0) { 
    1028         tipOffset.left = 0; 
    1029       } 
    1030       $tip.offset(tipOffset); 
    1031       if (step.placement === "bottom" || step.placement === "top") { 
    1032         if (originalLeft !== tipOffset.left) { 
    1033           return this._replaceArrow($tip, (tipOffset.left - originalLeft) * 2, offsetWidth, "left"); 
    1034         } 
    1035       } else { 
    1036         if (originalTop !== tipOffset.top) { 
    1037           return this._replaceArrow($tip, (tipOffset.top - originalTop) * 2, offsetHeight, "top"); 
    1038         } 
    1039       } 
    1040     }; 
    1041  
    1042     Tour.prototype._center = function($tip) { 
    1043       return $tip.css("top", $(window).outerHeight() / 2 - $tip.outerHeight() / 2); 
    1044     }; 
    1045  
    1046     Tour.prototype._replaceArrow = function($tip, delta, dimension, position) { 
    1047       return $tip.find(".arrow").css(position, delta ? 50 * (1 - delta / dimension) + "%" : ""); 
    1048     }; 
    1049  
    1050     Tour.prototype._scrollIntoView = function(element, callback) { 
    1051       var $element, $window, counter, offsetTop, scrollTop, windowHeight, 
    1052         _this = this; 
    1053       $element = $(element); 
    1054       if (!$element.length) { 
    1055         return callback(); 
    1056       } 
    1057       $window = $(window); 
    1058       offsetTop = $element.offset().top; 
    1059       windowHeight = $window.height(); 
    1060       scrollTop = Math.max(0, offsetTop - (windowHeight / 2)); 
    1061       this._debug("Scroll into view. ScrollTop: " + scrollTop + ". Element offset: " + offsetTop + ". Window height: " + windowHeight + "."); 
    1062       counter = 0; 
    1063       return $("body,html").stop(true, true).animate({ 
    1064         scrollTop: Math.ceil(scrollTop) 
    1065       }, function() { 
    1066         if (++counter === 2) { 
    1067           callback(); 
    1068           return _this._debug("Scroll into view. Animation end element offset: " + ($element.offset().top) + ". Window height: " + ($window.height()) + "."); 
    1069         } 
    1070       }); 
    1071     }; 
    1072  
    1073     Tour.prototype._onResize = function(callback, timeout) { 
    1074       return $(window).on("resize.tour-" + this._options.name, function() { 
    1075         clearTimeout(timeout); 
    1076         return timeout = setTimeout(callback, 100); 
    1077       }); 
    1078     }; 
    1079  
    1080     Tour.prototype._initMouseNavigation = function() { 
    1081       var _this = this; 
    1082       _this = this; 
    1083       return $(document).off("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='prev']:not(.disabled)").off("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='next']:not(.disabled)").off("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='end']").off("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='pause-resume']").on("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='next']:not(.disabled)", function(e) { 
    1084         e.preventDefault(); 
    1085         return _this.next(); 
    1086       }).on("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='prev']:not(.disabled)", function(e) { 
    1087         e.preventDefault(); 
    1088         return _this.prev(); 
    1089       }).on("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='end']", function(e) { 
    1090         e.preventDefault(); 
    1091         return _this.end(); 
    1092       }).on("click.tour-" + this._options.name, ".popover.tour-" + this._options.name + " *[data-role='pause-resume']", function(e) { 
    1093         var $this; 
    1094         e.preventDefault(); 
    1095         $this = $(this); 
    1096         $this.text(_this._paused ? $this.data("pause-text") : $this.data("resume-text")); 
    1097         if (_this._paused) { 
    1098           return _this.resume(); 
    1099         } else { 
    1100           return _this.pause(); 
    1101         } 
    1102       }); 
    1103     }; 
    1104  
    1105     Tour.prototype._initKeyboardNavigation = function() { 
    1106       var _this = this; 
    1107       if (!this._options.keyboard) { 
    1108         return; 
    1109       } 
    1110       return $(document).on("keyup.tour-" + this._options.name, function(e) { 
    1111         if (!e.which) { 
    1112           return; 
    1113         } 
    1114         switch (e.which) { 
    1115           case 39: 
    1116             e.preventDefault(); 
    1117             if (_this._isLast()) { 
    1118               return _this.next(); 
    1119             } else { 
    1120               return _this.end(); 
    1121             } 
    1122             break; 
    1123           case 37: 
    1124             e.preventDefault(); 
    1125             if (_this._current > 0) { 
    1126               return _this.prev(); 
    1127             } 
    1128             break; 
    1129           case 27: 
    1130             e.preventDefault(); 
    1131             return _this.end(); 
    1132         } 
    1133       }); 
    1134     }; 
    1135  
    1136     Tour.prototype._makePromise = function(result) { 
    1137       if (result && $.isFunction(result.then)) { 
    1138         return result; 
    1139       } else { 
    1140         return null; 
    1141       } 
    1142     }; 
    1143  
    1144     Tour.prototype._callOnPromiseDone = function(promise, cb, arg) { 
    1145       var _this = this; 
    1146       if (promise) { 
    1147         return promise.then(function(e) { 
    1148           return cb.call(_this, arg); 
    1149         }); 
    1150       } else { 
    1151         return cb.call(this, arg); 
    1152       } 
    1153     }; 
    1154  
    1155     Tour.prototype._showBackdrop = function(element) { 
    1156       if (this.backdrop.backgroundShown) { 
    1157         return; 
    1158       } 
    1159       this.backdrop = $("<div/>", { 
    1160         "class": "tour-backdrop" 
    1161       }); 
    1162       this.backdrop.backgroundShown = true; 
    1163       return $("body").append(this.backdrop); 
    1164     }; 
    1165  
    1166     Tour.prototype._hideBackdrop = function() { 
    1167       this._hideOverlayElement(); 
    1168       return this._hideBackground(); 
    1169     }; 
    1170  
    1171     Tour.prototype._hideBackground = function() { 
    1172       this.backdrop.remove(); 
    1173       this.backdrop.overlay = null; 
    1174       return this.backdrop.backgroundShown = false; 
    1175     }; 
    1176  
    1177     Tour.prototype._showOverlayElement = function(element) { 
    1178       var $background, $element, offset; 
    1179       $element = $(element); 
    1180       if (!$element || $element.length === 0 || this.backdrop.overlayElementShown) { 
    1181         return; 
    1182       } 
    1183       this.backdrop.overlayElementShown = true; 
    1184       $background = $("<div/>"); 
    1185       offset = $element.offset(); 
    1186       offset.top = offset.top; 
    1187       offset.left = offset.left; 
    1188       $background.width($element.innerWidth()).height($element.innerHeight()).addClass("tour-step-background").offset(offset); 
    1189       $element.addClass("tour-step-backdrop"); 
    1190       $("body").append($background); 
    1191       this.backdrop.$element = $element; 
    1192       return this.backdrop.$background = $background; 
    1193     }; 
    1194  
    1195     Tour.prototype._hideOverlayElement = function() { 
    1196       if (!this.backdrop.overlayElementShown) { 
    1197         return; 
    1198       } 
    1199       this.backdrop.$element.removeClass("tour-step-backdrop"); 
    1200       this.backdrop.$background.remove(); 
    1201       this.backdrop.$element = null; 
    1202       this.backdrop.$background = null; 
    1203       return this.backdrop.overlayElementShown = false; 
    1204     }; 
    1205  
    1206     Tour.prototype._clearTimer = function() { 
    1207       window.clearTimeout(this._timer); 
    1208       this._timer = null; 
    1209       return this._duration = null; 
    1210     }; 
    1211  
    1212     return Tour; 
    1213  
    1214   })(); 
    1215   return window.Tour = Tour; 
    1216 })(jQuery, window); 
  • extensions/TakeATour/language/en_UK/description.txt

    r27998 r28097  
    1 Visit your Piwigo to learn how to use it. This plugin has multiple thematic tours for beginners and advanced users. 
     1Visit your Piwigo to discover its features. This plugin has multiple thematic tours for beginners and advanced users. 
  • extensions/TakeATour/language/en_UK/plugin.lang.php

    r27994 r28097  
    11<?php 
    2 $lang['First Contact'] = 'Premier contact'; 
    3 $lang['Launch the Tour'] = 'Commencez la visite'; 
    4 $lang[''] = ''; 
    5 $lang['Welcome in your Piwigo gallery'] = 'Bienvenue dans votre galerie Piwigo'; 
    6 $lang['Step_1 Let\'s start by adding pictures'] = 'Bonjour, à travers ce guide, vous allez comprendre comment utiliser votre galerie et avoir un aperçu des fonctionnalités offertes'; 
    7 $lang[''] = ''; 
     2$lang['First Contact'] = 'First Contact'; 
     3$lang['Start the Tour'] = 'Start the Tour'; 
     4 
     5$lang['first_contact_descrp'] = 'Recommended for beginners, this tour introduce you Piwigo, its basic features. It will start by adding pictures, then manage them. The tour continues with album management and permissions, and ends on the customization using the configuration, the themes and the plugins.'; 
     6$lang['first_contact_title1'] = 'Welcome in your Piwigo gallery'; 
     7$lang['first_contact_stp1'] = 'Hello! I will be your guide to discover Piwigo. Please follow my instructions, and click Next (or use the arrows of your keyboard) to navigate. If you go in an other page of the administration, you will be redirected to the current page of the Tour.<br>Let\'s start by adding pictures!'; 
     8$lang['first_contact_title2'] = ''; 
     9$lang['first_contact_stp2'] = 'The link is here. Click Next to continue'; 
     10$lang['first_contact_title3'] = 'Add Photo Page'; 
     11$lang['first_contact_stp3'] = 'First tab to add photos from your browser, other tabs to add from a software, mobile or FTP'; 
     12$lang['first_contact_title4'] = 'Lets add photo!'; 
     13$lang['first_contact_stp4'] = 'First choose an album; create one if there is no album yet.'; 
     14$lang['first_contact_title5'] = ''; 
     15$lang['first_contact_stp5'] = 'Then click the button to select photos to send from your computer'; 
     16$lang['first_contact_stp5'] = ''; 
     17$lang['first_contact_title6'] = ''; 
     18$lang['first_contact_stp6'] = 'You see that photos are being listed. Add at least 2 pictures and when you\'re ready click the button Start Upload'; 
     19$lang['first_contact_title7'] = ''; 
     20$lang['first_contact_stp7'] = 'Here a summary of your uploaded pictures. See that Piwigo has generated itself the thumbnails. You can know add more photos with the link at the bottom, edit the properties of a picture by cliking on it, or click to manage all the uploaded pictures in the Batch Manager...'; 
     21$lang['first_contact_title8'] = ''; 
     22$lang['first_contact_stp8'] = 'Let\'s edit them! Click on the link. If you don\'t see it click Prev to add at least 2 photos.'; 
     23$lang['first_contact_title9'] = 'The Batch Manager'; 
     24$lang['first_contact_stp9'] = 'You are know in the Batch Manager, where you can batch edit multiple pictures. Here the Caddy is set as a filter because we comes from the upload result page.'; 
     25$lang['first_contact_title10'] = ''; 
     26$lang['first_contact_stp10'] = 'Here is the link to directly access to your caddy: that/s a tool for administrators to easily add pictures to a set in order to edit them in the Batch Manager. You can add photos to the caddy from the public picture page when logged as an admin, or using the action \"Add to caddy\" on the Batch Manager'; 
     27$lang['first_contact_title11'] = 'How to edit a photos'; 
     28$lang['first_contact_stp11'] = 'So you can select from here one or more photos'; 
     29$lang['first_contact_title12'] = ''; 
     30$lang['first_contact_stp12'] = 'then edit them using and action. But for instance, you can\'t -for now- batch edit descriptions since they are mostly unique'; 
     31$lang['first_contact_title13'] = ''; 
     32$lang['first_contact_stp13'] = 'You can edit descriptions and more from the batch manager in unit mode. But for now, let\'s stay in the global mode'; 
     33$lang['first_contact_title14'] = ''; 
     34$lang['first_contact_stp14'] = 'We will see now the edition page of one picture. That page is reachable from here but also from the public picture page when logged as an administrator. Click on Edit or go next'; 
     35$lang['first_contact_title15'] = 'The edition page of a picture'; 
     36$lang['first_contact_stp15'] = 'On that page you can edit all the properties of a photo, for instance...'; 
     37$lang['first_contact_title16'] = ''; 
     38$lang['first_contact_stp16'] = 'here to add or remove the photo from albums. The link is virtual, no photos will be physcally moved ever.'; 
     39$lang['first_contact_title17'] = ''; 
     40$lang['first_contact_stp17'] = 'and here to set the photo as a picture representative of an album. So you can set as a representative of a public album, a photo in a private album, which is ideal to set custom thumbnails for albums but the user won\'t see those pictures inside those albums. Like setting a portrait of someone as representative, for an album which contains photos of nature; it would be weird to see that photo of the man/woman among trees or animals.'; 
     41$lang['first_contact_title18'] = 'Manage albums'; 
     42$lang['first_contact_stp18'] = 'That previous example was just a small overview of tricks and how powerfull Piwigo is. So I\'ve told about private albums, but how can we manage albums? Click On album->Manage or hit Next'; 
     43$lang['first_contact_title19'] = 'Manage Albums'; 
     44$lang['first_contact_stp19'] = 'Here are listed all the \'top\' albums, the ones at the root of your gallery. If you see an album with a dashed backgroung, it\'s an real physical album from a FTP synchro, which can\'t be moved or deleted from here. The others albums are called virtual albums.'; 
     45$lang['first_contact_title20'] = 'Manage Albums'; 
     46$lang['first_contact_stp20'] = 'When your mouse is hover a album, links and information appear. When you drag and drop an album -a rounded block-, you will change its position and then you can save or cancel your manual order.'; 
     47$lang['first_contact_title21'] = 'Other Tabs'; 
     48$lang['first_contact_stp21'] = 'The next tab is a page where you can move any virtual album.<br>The permalink tab is to set a particular url for an album, for tecnhical reasons like to set a specific template or for just sending cool customized links.<br>But let\'s edit an album: click on Edit of a album'; 
     49$lang['first_contact_title22'] = 'Album Edition Page'; 
     50$lang['first_contact_stp22'] = 'Like for a picture, here you can edit the properties of an album'; 
     51$lang['first_contact_title23'] = ''; 
     52$lang['first_contact_stp23'] = 'Locking a album means only administrators will be able to see that album: it\'s usually used when an admin is managing the properties of an album or don\'t want to publish the album immediatly'; 
     53$lang['first_contact_title24'] = ''; 
     54$lang['first_contact_stp24'] = 'Certainly, one of the most important page is the permission page of a private album. Click on the permission tab or click next'; 
     55$lang['first_contact_title25'] = 'Album Permission'; 
     56$lang['first_contact_stp25'] = 'As you can read in the Help of your Piwigo -link at the top right-, album permissions are set by groups and users. You can directly set private/public multiple albums using the Administration » Albums » Properties page.'; 
     57$lang['first_contact_title26'] = ''; 
     58$lang['first_contact_stp26'] = 'Here you can set the current album as private, then grant access to users and groups. By default, permissions are not recursive for sub albums, but upper-albums will be granted with the same permission in order to let the granted users browse to the album.'; 
     59$lang['first_contact_title27'] = ''; 
     60$lang['first_contact_stp27'] = 'Important fact: the webmasters and administrators are not omniscient when browsing the public part, but they can access to every album and photos on the admin part.'; 
     61$lang['first_contact_title28'] = 'Configuration'; 
     62$lang['first_contact_stp28'] = 'Now we will look at the options available to set Piwigo working your way. Click on Configuration->Options or just hit Next.'; 
     63$lang['first_contact_title29'] = 'Configuration->Options->General'; 
     64$lang['first_contact_stp29'] = 'Here, on that first page, you will set the essential and basic configuration of your gallery.'; 
     65$lang['first_contact_title30'] = ''; 
     66$lang['first_contact_stp30'] = 'Let\'s start by changing the tittle'; 
     67$lang['first_contact_title31'] = ''; 
     68$lang['first_contact_stp31'] = 'Then the banner, which will be displayed on top of every pages. As you can see, HTML tags are allowed here. You can also use the %gallery_title% tag to display the tittle you just typed above.'; 
     69$lang['first_contact_title32'] = ''; 
     70$lang['first_contact_stp32'] = 'Now save you changes'; 
     71$lang['first_contact_title33'] = 'Guest settings'; 
     72$lang['first_contact_stp33'] = 'Just a final word about the options, the \'Guest settings\' page is to set the preferences of unregistered visitors. Each time Piwigo refers to \'guest\' that means unregistered visitors.<br>Let\'s continue about Configuration: click on Configuration->Themes or just hit Next.'; 
     73$lang['first_contact_title34'] = 'Themes'; 
     74$lang['first_contact_stp34'] = 'Themes are one of the three way to customize your Piwigo, with Plugins and Templates. Themes installed are listed here.<br>More than one theme can be enabled: users can change their theme by choosing one among the one enabled here, if the option \'Allow user customization\' is checked on the Option page.'; 
     75$lang['first_contact_title35'] = 'Themes'; 
     76$lang['first_contact_stp35'] = 'Themes can also be set as Default, which means that\'s the theme for unregistred visitors (guests, you remember?) and any new registred user will be have this theme. But for any previously registred users, the theme won\'t change until you do it from the User Management page or you disable their theme: be carefull, you might disturb your users by changing their whole display.'; 
     77$lang['first_contact_title36'] = 'Themes'; 
     78$lang['first_contact_stp36'] = 'Themes have a system of dependency: that\'s why some theme can\'t be deleted (a parent theme can\'t be deleted if a child theme is enabled) or others can\'t be enabled (a child theme need its parent theme). For instance, when you put you\'re mouse over a Delete link, if the theme can\'t be deleted, a information bubble will explain you why.'; 
     79$lang['first_contact_title37'] = 'Themes'; 
     80$lang['first_contact_stp37'] = 'To install new themes, you can directly download them from the tab \'Add a theme\'. Only the themes marked as compatible with your version of Piwigo are showed.<br>Let\'s discover the plugins now! Click on Plugin->Manage'; 
     81$lang['first_contact_title38'] = 'Plugins'; 
     82$lang['first_contact_stp38'] = 'Plugins are very easy ways to customize your Piwigo. They can do almost anything you can imagine from small text addition to complete features, like the Community plugin which allows non admistrators users to upload without entering to the administration part.'; 
     83$lang['first_contact_title39'] = 'Plugins'; 
     84$lang['first_contact_stp39'] = 'On that first page, are listed the installed plugins. At the top, are listed the plugins activated, which are currently running. At the bottom, the plugins which are installed in the /plugins folder, but disabled. Deleting a plugin means that any trace of the plugin will be removed (files, options etc). For most of the plugins, disabling will keep the data registered by the plugins.'; 
     85$lang['first_contact_title40'] = ''; 
     86$lang['first_contact_stp40'] = 'Here it\'s me! Don\'t disable me now, but you can see you can Disable or Restore an activated plugin.'; 
     87$lang['first_contact_title41'] = ''; 
     88$lang['first_contact_stp41'] = 'You can see on the last tab all the plugins available for your version of Piwigo. Hundred of plugins are there!'; 
     89$lang['first_contact_title42'] = 'Languages'; 
     90$lang['first_contact_stp42'] = 'Piwigo is multilingual. By default, the language displayed by Piwigo change according to the language of the browser of the visitor. If the language of the visitor is not availble, the language set by default is used.'; 
     91$lang['first_contact_title43'] = 'It\'s been a great time'; 
     92$lang['first_contact_stp43'] = 'This tour was quite long, but we only have seen a small part of how powerfull Piwigo is. Everything has a end, this overview is finished.<br>You can discover much deeper the features of Piwigo by taking an other tour or reading our documentation, on the piwigo.org website.'; 
    893$lang[''] = ''; 
    994$lang[''] = ''; 
  • extensions/TakeATour/language/fr_FR/plugin.lang.php

    r27898 r28097  
    11<?php 
    22$lang['First Contact'] = 'Premier contact'; 
    3 $lang['Launch the Tour'] = 'Commencez la visite'; 
     3$lang['Start the Tour'] = 'Commencez la visite'; 
    44$lang[''] = ''; 
    55$lang['Welcome in your Piwigo gallery'] = 'Bienvenue dans votre galerie Piwigo'; 
  • extensions/TakeATour/main.inc.php

    r28060 r28097  
    2626} 
    2727 
    28 if ( pwg_get_session_var('tour_to_launch') and defined('IN_ADMIN') and IN_ADMIN  ) 
     28if (pwg_get_session_var('tour_to_launch') and defined('IN_ADMIN') and IN_ADMIN and isset($_GET['page']) and $_GET['page']=="plugin-TakeATour" ) 
     29{  
     30  pwg_unset_session_var('tour_to_launch'); 
     31} 
     32elseif ( pwg_get_session_var('tour_to_launch') and defined('IN_ADMIN') and IN_ADMIN) 
    2933{ 
    3034  global $conf; 
     
    3539  } 
    3640} 
     41 
    3742function TAT_add_js_css() 
    3843{ 
  • extensions/TakeATour/tours/first_contact/tour.tpl

    r28059 r28097  
    11{footer_script require='jquery.bootstrap-tour'}{literal} 
    2 // Instance the tour 
     2 
    33var tour = new Tour({ 
    44  name: "first_contact", 
     
    77}); 
    88{/literal}{if $TAT_restart}tour.restart();{/if}{literal} 
    9 // Add your steps. Not too many, you don't really want to get your users sleepy 
     9 
    1010tour.addSteps([ 
    1111  { 
    1212    path: "{/literal}{$TAT_path}{literal}admin.php", 
    13     title: "{/literal}{'Welcome in your Piwigo gallery'|@translate}{literal}", 
    14     content: "{/literal}{'Hello! I will be your guide to discover Piwigo. Please follow my instructions, and click Next (or use the arrows of your keyboard) to navigate. If you go in an other page of the administration, you will be redirected to the current page of the Tour.<br>Let\'s start by adding pictures!'|@translate}{literal}" 
     13    title: "{/literal}{'first_contact_title1'|@translate}{literal}", 
     14    content: "{/literal}{'first_contact_stp1'|@translate}{literal}" 
    1515  }, 
    1616  { 
     
    1919    element: ".icon-plus-circled", 
    2020    reflex:true, 
    21     content: "{/literal}{'The link is here. Click Next to continue'|@translate}{literal}", 
     21    title: "{/literal}{'first_contact_title2'|@translate}{literal}", 
     22    content: "{/literal}{'first_contact_stp2'|@translate}{literal}", 
    2223  }, 
    2324  { 
     
    2526    placement: "bottom", 
    2627    element: ".selected_tab", 
    27     title: "{/literal}{'Add Photo Page'|@translate}{literal}", 
    28     content: "{/literal}{'First tab to add photos from your browser, other tabs to add from a software, mobile or FTP'|@translate}{literal}", 
     28    title: "{/literal}{'first_contact_title3'|@translate}{literal}", 
     29    content: "{/literal}{'first_contact_stp3'|@translate}{literal}", 
    2930  }, 
    3031  { 
     
    3233    placement: "left", 
    3334    element: "#albumSelection", 
    34     title: "{/literal}{'Lets add photo!'|@translate}{literal}", 
    35     content: "{/literal}{'First choose an album; create one if there is no album yet.'|@translate}{literal}" 
     35    title: "{/literal}{'first_contact_title4'|@translate}{literal}", 
     36    content: "{/literal}{'first_contact_stp4'|@translate}{literal}" 
    3637  }, 
    3738  {//5 
     
    3940    placement: "top", 
    4041    element: "#uploadify", 
    41     content: "{/literal}{'Then click the button to select photos to send from your computer'|@translate}{literal}" 
     42    title: "{/literal}{'first_contact_title5'|@translate}{literal}", 
     43    content: "{/literal}{'first_contact_stp5'|@translate}{literal}" 
    4244  }, 
    4345  { 
    4446    path: /admin\.php\?page=photos_add/, 
    45     redirect:function (tour) {tour.goTo(4);}, 
     47    redirect:function (tour) {window.location = "admin.php?page=photos_add";}, 
    4648    placement: "left", 
    4749    element: "#fileQueue", 
    48     title: "{/literal}{''|@translate}{literal}", 
    49     content: "{/literal}{'You see that photos are being listed. Add at least 2 pictures and when you\'re ready click the button Start Upload'|@translate}{literal}" 
     50    title: "{/literal}{'first_contact_title6'|@translate}{literal}", 
     51    content: "{/literal}{'first_contact_stp6'|@translate}{literal}" 
    5052  }, 
    5153  { 
    5254    path: /admin\.php\?page=photos_add/, 
    53     redirect:function (tour) {tour.goTo(4);}, 
     55    redirect:function (tour) {window.location = "admin.php?page=photos_add";}, 
    5456    placement: "top", 
    5557    element: "#photosAddContent legend", 
    56     content: "{/literal}{'Here a summary of your uploaded pictures. See that Piwigo has generated itself the thumbnails. You can know add more photos with the link at the bottom, edit the properties of a picture by cliking on it, or click to manage all the uploaded pictures in the Batch Manager...'|@translate}{literal}", 
    57     onPrev:function (tour) {tour.goTo(4);} 
     58    title: "{/literal}{'first_contact_title7'|@translate}{literal}", 
     59    content: "{/literal}{'first_contact_stp7'|@translate}{literal}", 
     60    prev:4 
    5861  }, 
    5962  { 
    6063    path: /admin\.php\?page=photos_add/, 
    61     redirect:function (tour) {tour.goTo(4);}, 
     64    redirect:function (tour) {window.location = "admin.php?page=photos_add";}, 
    6265    placement: "bottom", 
    6366    element: "#batchLink", 
    6467    reflex:true, 
    65     content: "{/literal}{'Let\'s edit them! Click on the link. If you don\'t see it click Prev to add at least 2 photos.'|@translate}{literal}", 
    66     onPrev:function (tour) {tour.goTo(4);} 
     68    title: "{/literal}{'first_contact_title8'|@translate}{literal}", 
     69    content: "{/literal}{'first_contact_stp8'|@translate}{literal}", 
     70    prev:4 
    6771  }, 
    6872  { 
     
    7175    placement: "top", 
    7276    element: "", 
    73     title: "{/literal}{'The Batch Manager'|@translate}{literal}", 
    74     content: "{/literal}{'You are know in the Batch Manager, where you can batch edit multiple pictures. Here the Caddy is set as a filter because we comes from the upload result page.'|@translate}{literal}" 
     77    title: "{/literal}{'first_contact_title9'|@translate}{literal}", 
     78    content: "{/literal}{'first_contact_stp9'|@translate}{literal}" 
    7579  }, 
    7680  {//10 
     
    7983    placement: "right", 
    8084    element: ".icon-flag", 
    81     content: "{/literal}{'Here is the link to directly access to your caddy: that/s a tool for administrators to easily add pictures to a set in order to edit them in the Batch Manager. You can add photos to the caddy from the public picture page when logged as an admin, or using the action \"Add to caddy\" on the Batch Manager'|@translate}{literal}" 
     85    title: "{/literal}{'first_contact_title10'|@translate}{literal}", 
     86    content: "{/literal}{'first_contact_stp10'|@translate}{literal}" 
    8287  }, 
    8388  { 
     
    8691    placement: "left", 
    8792    element: "#checkActions", 
    88     title: "{/literal}{'How to edit a photos'|@translate}{literal}", 
    89     content: "{/literal}{'So you can select from here one or more photos'|@translate}{literal}" 
     93    title: "{/literal}{'first_contact_title11'|@translate}{literal}", 
     94    content: "{/literal}{'first_contact_stp11'|@translate}{literal}" 
    9095  }, 
    9196  { 
     
    9499    placement: "top", 
    95100    element: "#action", 
    96     content: "{/literal}{'then edit them using and action. But for instance, you can\'t -for now- batch edit descriptions since they are mostly unique'|@translate}{literal}" 
     101    title: "{/literal}{'first_contact_title12'|@translate}{literal}", 
     102    content: "{/literal}{'first_contact_stp12'|@translate}{literal}" 
    97103  }, 
    98104  { 
     
    101107    placement: "bottom", 
    102108    element: "#tabsheet .normal_tab", 
    103     content: "{/literal}{'You can edit descriptions and more from the batch manager in unit mode. But for now, let\'s stay in the global mode'|@translate}{literal}" 
     109    title: "{/literal}{'first_contact_title13'|@translate}{literal}", 
     110    content: "{/literal}{'first_contact_stp13'|@translate}{literal}" 
    104111  }, 
    105112  { 
     
    109116    element: "#TAT_FC_14", 
    110117    reflex:true, 
    111     content: "{/literal}{'We will see now the edition page of one picture. That page is reachable from here but also from the public picture page when logged as an administrator. Click on Edit or go next'|@translate}{literal}", 
     118    title: "{/literal}{'first_contact_title14'|@translate}{literal}", 
     119    content: "{/literal}{'first_contact_stp14'|@translate}{literal}", 
    112120    onNext:function (tour) {window.location = "admin.php?page=photo-{/literal}{$TAT_image_id}{literal}";} 
    113121  }, 
     
    117125    placement: "bottom", 
    118126    element: ".selected_tab", 
    119     title: "{/literal}{'The edition page of a picture'|@translate}{literal}", 
    120     content: "{/literal}{'On that page you can edit all the properties of a photo, for instance...'|@translate}{literal}" 
     127    title: "{/literal}{'first_contact_title15'|@translate}{literal}", 
     128    content: "{/literal}{'first_contact_stp15'|@translate}{literal}" 
    121129  }, 
    122130  { 
     
    125133    placement: "top", 
    126134    element: "#TAT_FC_16", 
    127     content: "{/literal}{'here to add or remove the photo from albums. The link is virtual, no photos will be physcally moved ever.'|@translate}{literal}" 
     135    title: "{/literal}{'first_contact_title16'|@translate}{literal}", 
     136    content: "{/literal}{'first_contact_stp16'|@translate}{literal}" 
    128137  }, 
    129138  { 
     
    132141    placement: "top", 
    133142    element: "#TAT_FC_17", 
    134     content: "{/literal}{'and here to set the photo as a picture representative of an album. So you can set as a representative of a public album, a photo in a private album, which is ideal to set custom thumbnails for albums but the user won\'t see those pictures inside those albums. Like setting a portrait of someone as representative, for an album which contains photos of nature; it would be weird to see that photo of the man/woman among trees or animals.'|@translate}{literal}" 
     143    title: "{/literal}{'first_contact_title17'|@translate}{literal}", 
     144    content: "{/literal}{'first_contact_stp17'|@translate}{literal}" 
    135145  }, 
    136146  { 
     
    138148    redirect:function (tour) {window.location = "admin.php?page=photo-{/literal}{$TAT_image_id}{literal}";}, 
    139149    placement: "top", 
    140     title: "{/literal}{'Manage albums'|@translate}{literal}", 
    141     content: "{/literal}{'That previous example was just a small overview of tricks and how powerfull Piwigo is. So I\'ve told about private albums, but how can we manage albums? Click On album->Manage or hit Next'|@translate}{literal}" 
     150    title: "{/literal}{'first_contact_title18'|@translate}{literal}", 
     151    content: "{/literal}{'first_contact_stp18'|@translate}{literal}" 
    142152  }, 
    143153  { 
     
    145155    placement: "left", 
    146156    element: "#content", 
    147     title: "{/literal}{'Manage Albums'|@translate}{literal}", 
    148     content: "{/literal}{'Here are listed all the \'top\' albums, the ones at the root of your gallery. If you see an album with a dashed backgroung, it\'s an real physical album from a FTP synchro, which can\'t be moved or deleted from here. The others albums are called virtual albums.'|@translate}{literal}", 
     157    title: "{/literal}{'first_contact_title19'|@translate}{literal}", 
     158    content: "{/literal}{'first_contact_stp19'|@translate}{literal}", 
    149159    onPrev: function (tour) {window.location = "admin.php?page=photo-{/literal}{$TAT_image_id}{literal}";}, 
    150160 
     
    154164    placement: "top", 
    155165    element: "#categoryOrdering", 
    156     title: "{/literal}{'Manage Albums'|@translate}{literal}", 
    157     content: "{/literal}{'When your mouse is hover a album, links and information appear. When you drag and drop an album -a rounded block-, you will change its position and then you can save or cancel your manual order.'|@translate}{literal}" 
     166    title: "{/literal}{'first_contact_title20'|@translate}{literal}", 
     167    content: "{/literal}{'first_contact_stp20'|@translate}{literal}" 
    158168  }, 
    159169  { 
     
    161171    placement: "left", 
    162172    element: "#tabsheet:first-child", 
    163     title: "{/literal}{'Other Tabs'|@translate}{literal}", 
    164     content: "{/literal}{'The next tab is a page where you can move any virtual album.<br>The permalink tab is to set a particular url for an album, for tecnhical reasons like to set a specific template or for just sending cool customized links.<br>But let\'s edit an album: click on Edit of a album'|@translate}{literal}" 
     173    title: "{/literal}{'first_contact_title21'|@translate}{literal}", 
     174    content: "{/literal}{'first_contact_stp21'|@translate}{literal}" 
    165175  }, 
    166176  { 
     
    169179    placement: "top", 
    170180    element: ".selected_tab", 
    171     title: "{/literal}{'Album Edition Page'|@translate}{literal}", 
    172     content: "{/literal}{'Like for a picture, here you can edit the properties of an album'|@translate}{literal}" 
     181    title: "{/literal}{'first_contact_title22'|@translate}{literal}", 
     182    content: "{/literal}{'first_contact_stp22'|@translate}{literal}" 
    173183  }, 
    174184  { 
     
    177187    placement: "top", 
    178188    element: "#TAT_FC_23", 
    179     content: "{/literal}{'Locking a album means only administrators will be able to see that album: it\'s usually used when an admin is managing the properties of an album or don\'t want to publish the album immediatly'|@translate}{literal}" 
     189    title: "{/literal}{'first_contact_title23'|@translate}{literal}", 
     190    content: "{/literal}{'first_contact_stp23'|@translate}{literal}" 
    180191  }, 
    181192  { 
     
    184195    placement: "bottom", 
    185196    element: ".tabsheet", 
    186     content: "{/literal}{'Certainly, one of the most important page in the permission page of an album. Click on the permission tab or click next'|@translate}{literal}" 
     197    title: "{/literal}{'first_contact_title24'|@translate}{literal}", 
     198    content: "{/literal}{'first_contact_stp24'|@translate}{literal}" 
    187199  }, 
    188200  {//25 
     
    191203    placement: "left", 
    192204    element: "#content", 
    193     title: "{/literal}{'Album Permission'|@translate}{literal}", 
    194     content: "{/literal}{'As you can read in the Help of your Piwigo -link at the top right-, album permissions are set by groups and users. You can directly set private/public multiple albums using the Administration » Albums » Properties page.'|@translate}{literal}" 
     205    title: "{/literal}{'first_contact_title25'|@translate}{literal}", 
     206    content: "{/literal}{'first_contact_stp25'|@translate}{literal}" 
    195207  }, 
    196208  { 
     
    199211    placement: "top", 
    200212    element: "#selectStatus", 
    201     content: "{/literal}{'Here you can set the current album as private, then grant access to users and groups. By default, permissions are not recursive for sub albums, but upper-albums will be granted with the same permission in order to let the granted users browse to the album.'|@translate}{literal}" 
     213    title: "{/literal}{'first_contact_title26'|@translate}{literal}", 
     214    content: "{/literal}{'first_contact_stp26'|@translate}{literal}" 
    202215  }, 
    203216  { 
     
    206219    placement: "top", 
    207220    element: "#selectStatus", 
    208     content: "{/literal}{'Important fact: the webmasters and administrators are not omniscient when browsing the public part, but they can access to every album and photos on the admin part.'|@translate}{literal}" 
     221    title: "{/literal}{'first_contact_title27'|@translate}{literal}", 
     222    content: "{/literal}{'first_contact_stp27'|@translate}{literal}" 
    209223  }, 
    210224  { 
     
    212226    redirect:function (tour) {window.location = "admin.php?page=album-{/literal}{$TAT_cat_id}{literal}-permissions";}, 
    213227    placement: "top", 
    214     title: "{/literal}{'Configuration'|@translate}{literal}", 
    215     content: "{/literal}{'Now we will look at the options available to set Piwigo working your way. Click on Configuration->Options or just hit Next.'|@translate}{literal}" 
    216   }, 
    217   { 
    218     path: "{/literal}{$TAT_path}{literal}admin.php?page=configuration", 
    219     placement: "top", 
    220     element: "", 
    221     title: "{/literal}{'Configuration->Options->General'|@translate}{literal}", 
    222     content: "{/literal}{'Here, on that first page, you will set the essential and basic configuration of your gallery.'|@translate}{literal}" 
     228    title: "{/literal}{'first_contact_title28'|@translate}{literal}", 
     229    content: "{/literal}{'first_contact_stp28'|@translate}{literal}" 
     230  }, 
     231  { 
     232    path: "{/literal}{$TAT_path}{literal}admin.php?page=configuration", 
     233    placement: "top", 
     234    element: "", 
     235    title: "{/literal}{'first_contact_title29'|@translate}{literal}", 
     236    content: "{/literal}{'first_contact_stp29'|@translate}{literal}" 
    223237  }, 
    224238  {//30 
     
    226240    placement: "right", 
    227241    element: "#gallery_title", 
    228     content: "{/literal}{'Let\'s start by changing the tittle'|@translate}{literal}" 
     242    title: "{/literal}{'first_contact_title30'|@translate}{literal}", 
     243    content: "{/literal}{'first_contact_stp30'|@translate}{literal}" 
    229244  }, 
    230245  { 
     
    232247    placement: "right", 
    233248    element: "#page_banner", 
    234     content: "{/literal}{'Then the banner, which will be displayed on top of every pages. As you can see, HTML tags are allowed here. You can also use the %gallery_title% tag to display the tittle you just typed above.'|@translate}{literal}" 
     249    title: "{/literal}{'first_contact_title31'|@translate}{literal}", 
     250    content: "{/literal}{'first_contact_stp31'|@translate}{literal}" 
    235251  }, 
    236252  { 
     
    239255    placement: "top", 
    240256    element: ".formButtons input", 
    241     content: "{/literal}{'Now save you changes'|@translate}{literal}" 
    242   }, 
    243   { 
    244     path: "{/literal}{$TAT_path}{literal}admin.php?page=configuration", 
    245     placement: "top", 
    246     title: "{/literal}{'Guest settings'|@translate}{literal}", 
    247     content: "{/literal}{'Just a final word about the options, the \'Guest settings\' page is to set the preferences of unregistered visitors. Each time Piwigo refers to \'guest\' that means unregistered visitors.<br>Let\'s continue about Configuration: click on Configuration->Themes or just hit Next.'|@translate}{literal}", 
    248     onPrev:function (tour) {tour.goTo(30);} 
     257    title: "{/literal}{'first_contact_title32'|@translate}{literal}", 
     258    content: "{/literal}{'first_contact_stp32'|@translate}{literal}" 
     259  }, 
     260  { 
     261    path: "{/literal}{$TAT_path}{literal}admin.php?page=configuration", 
     262    placement: "top", 
     263    title: "{/literal}{'first_contact_stp33'|@translate}{literal}", 
     264    content: "{/literal}{'first_contact_stp33'|@translate}{literal}", 
     265    prev:30 
    249266  }, 
    250267  { 
     
    252269    placement: "top", 
    253270    element: "", 
    254     title: "{/literal}{'Themes'|@translate}{literal}", 
    255     content: "{/literal}{'Themes are one of the three way to customize your Piwigo, with Plugins and Templates. Themes installed are listed here.<br>More than one theme can be enabled: users can change their theme by choosing one among the one enabled here, if the option \'Allow user customization\' is checked on the Option page.'|@translate}{literal}" 
     271    title: "{/literal}{'first_contact_title34'|@translate}{literal}", 
     272    content: "{/literal}{'first_contact_stp34'|@translate}{literal}" 
    256273  }, 
    257274  {//35 
     
    259276    placement: "top", 
    260277    element: "#TAT_FC_35", 
    261     title: "{/literal}{'Themes'|@translate}{literal}", 
    262     content: "{/literal}{'Themes can also be set as Default, which means that\'s the theme for unregistred visitors (guests, you remember?) and any new registred user will be have this theme. But for any previously registred users, the theme won\'t change until you do it from the User Management page or you disable their theme: be carefull, you might disturb your users by changing their whole display.'|@translate}{literal}" 
     278    title: "{/literal}{'first_contact_title35'|@translate}{literal}", 
     279    content: "{/literal}{'first_contact_stp35'|@translate}{literal}" 
    263280  }, 
    264281  { 
     
    266283    placement: "top", 
    267284    element: "", 
    268     title: "{/literal}{'Themes'|@translate}{literal}", 
    269     content: "{/literal}{'Themes have a system of dependency: that\'s why some theme can\'t be deleted (a parent theme can\'t be deleted if a child theme is enabled) or others can\'t be enabled (a child theme need its parent theme). For instance, when you put you\'re mouse over a Delete link, if the theme can\'t be deleted, a information bubble will explain you why.'|@translate}{literal}" 
     285    title: "{/literal}{'first_contact_title36'|@translate}{literal}", 
     286    content: "{/literal}{'first_contact_stp36'|@translate}{literal}" 
    270287  }, 
    271288  { 
     
    273290    placement: "right", 
    274291    element: ".tabsheet", 
    275     title: "{/literal}{'Themes'|@translate}{literal}", 
    276     content: "{/literal}{'To install new themes, you can directly download them from the tab \'Add a theme\'. Only the themes marked as compatible with your version of Piwigo are showed.<br>Let\'s discover the plugins now! Click on Plugin->Manage'|@translate}{literal}" 
     292    title: "{/literal}{'first_contact_title37'|@translate}{literal}", 
     293    content: "{/literal}{'first_contact_stp37'|@translate}{literal}" 
    277294  }, 
    278295  { 
     
    280297    placement: "left", 
    281298    element: "", 
    282     title: "{/literal}{'Plugins'|@translate}{literal}", 
    283     content: "{/literal}{'Plugins are very easy ways to customize your Piwigo. They can do almost anything you can imagine from small text addition to complete features, like the Community plugin which allows non admistrators users to upload without entering to the administration part.'|@translate}{literal}" 
     299    title: "{/literal}{'first_contact_title38'|@translate}{literal}", 
     300    content: "{/literal}{'first_contact_stp38'|@translate}{literal}" 
    284301  }, 
    285302  { 
     
    287304    placement: "left", 
    288305    element: "#content", 
    289     title: "{/literal}{'Plugins'|@translate}{literal}", 
    290     content: "{/literal}{'On that first page, are listed the installed plugins. At the top, are listed the plugins activated, which are currently running. At the bottom, the plugins which are installed in the /plugins folder, but disabled. Deleting a plugin means that any trace of the plugin will be removed (files, options etc). For most of the plugins, disabling will keep the data registered by the plugins.'|@translate}{literal}" 
    291   }, 
    292   { 
     306    title: "{/literal}{'first_contact_title39'|@translate}{literal}", 
     307    content: "{/literal}{'first_contact_stp39'|@translate}{literal}" 
     308  }, 
     309  {//40 
    293310    path: "{/literal}{$TAT_path}{literal}admin.php?page=plugins", 
    294311    placement: "bottom", 
    295312    element: "#TakeATour", 
    296     content: "{/literal}{'Here it\'s me! Don\'t disable me now, but you can see you can Disable or Restore an activated plugin.'|@translate}{literal}" 
     313    title: "{/literal}{'first_contact_title40'|@translate}{literal}", 
     314    content: "{/literal}{'first_contact_stp40'|@translate}{literal}" 
    297315  }, 
    298316  { 
     
    300318    placement: "right", 
    301319    element: ".tabsheet", 
    302     content: "{/literal}{'You can see on the last tab all the plugins available for your version of Piwigo. Hundred of plugins are there!'|@translate}{literal}" 
     320    title: "{/literal}{'first_contact_title41'|@translate}{literal}", 
     321    content: "{/literal}{'first_contact_stp41'|@translate}{literal}" 
    303322  }, 
    304323  { 
    305324    path: "{/literal}{$TAT_path}{literal}admin.php?page=languages", 
    306     title: "{/literal}{'Languages'|@translate}{literal}", 
    307     content: "{/literal}{'Piwigo is multilingual. By default, the language displayed by Piwigo change according to the language of the browser of the visitor. If the language of the visitor is not availble, the language set by default is used.'|@translate}{literal}" 
     325    title: "{/literal}{'first_contact_title42'|@translate}{literal}", 
     326    content: "{/literal}{'first_contact_stp42'|@translate}{literal}" 
    308327  }, 
    309328  { 
     
    311330    placement: "top", 
    312331    element: "", 
    313     title: "{/literal}{'It\'s been a great time'|@translate}{literal}", 
    314     content: "{/literal}{'This tour was quite long, but we only have seen a small part of how powerfull Piwigo is. Everything has a end, this overview is finished.<br>You can discover much deeper the features of Piwigo by taking an other tour or reading our documentation, on the piwigo.org website'|@translate}{literal}" 
     332    title: "{/literal}{'first_contact_title43'|@translate}{literal}", 
     333    content: "{/literal}{'first_contact_stp43'|@translate}{literal}" 
    315334  } 
    316335]); 
  • extensions/TakeATour/tpl/admin.tpl

    r28061 r28097  
    66  <fieldset> 
    77    <legend>{'First Contact'|@translate}</legend> 
    8     <div class="TAT_description">{'Recommended for beginners, this tour introduce you Piwigo, its basic features. It will start by adding pictures, then manage them. The tour continues with album management and permissions, and ends on the customization using the configuration, the themes and the plugins.'|@translate}</div> 
     8    <div class="TAT_description">{'first_contact_descrp'|@translate}</div> 
    99    <form action="{$F_ACTION}" method="post"> 
    1010      <input type="hidden" name="submited_tour" value="first_contact"> 
    11       <input type="submit" name="button2" id="button2" value="{'Launch the Tour'|@translate}"> 
     11      <input type="submit" name="button2" id="button2" value="{'Start the Tour'|@translate}"> 
    1212    </form> 
    1313  </fieldset> 
Note: See TracChangeset for help on using the changeset viewer.