Gallery Bank: WordPress Photo Gallery Plugin - Version 4.0.5

Version Description

  • FIX: Global Options Bugs
  • FIX: Wizard Bugs
  • FIX: Layout Bugs
  • TWEAK: Unwanted Asterisks removed from Add Gallery Layout
Download this release

Release Info

Developer contact-banker
Plugin Icon 128x128 Gallery Bank: WordPress Photo Gallery Plugin
Version 4.0.5
Comparing to
See all releases

Code changes from version 4.0.4 to 4.0.5

assets/admin/layout/css/layout.css CHANGED
@@ -174,7 +174,7 @@
174
  .page-sidebar-tech-banker .page-sidebar-menu-tech-banker li > a > .badge
175
  {
176
  float: right;
177
- margin-top: 1px;
178
  margin-right: 0px;
179
  }
180
  .page-sidebar-tech-banker .page-sidebar-menu-tech-banker li > a > .badge
@@ -183,7 +183,8 @@
183
  margin-right: 0px;
184
  color: #fff;
185
  background-color: #ed6b75;
186
- padding : 2px 5px;
 
187
  }
188
  .page-sidebar-tech-banker .page-sidebar-menu-tech-banker .sub-menu
189
  {
174
  .page-sidebar-tech-banker .page-sidebar-menu-tech-banker li > a > .badge
175
  {
176
  float: right;
177
+ margin-top: 0px;
178
  margin-right: 0px;
179
  }
180
  .page-sidebar-tech-banker .page-sidebar-menu-tech-banker li > a > .badge
183
  margin-right: 0px;
184
  color: #fff;
185
  background-color: #ed6b75;
186
+ padding : 0px 4px;
187
+ font-size: 11px;
188
  }
189
  .page-sidebar-tech-banker .page-sidebar-menu-tech-banker .sub-menu
190
  {
assets/global/plugins/modal/js/bootstrap-modal.js CHANGED
@@ -1,328 +1,341 @@
1
  +function ($) {
2
- 'use strict';
3
-
4
- // MODAL CLASS DEFINITION
5
- // ======================
6
-
7
- var Modal = function (element, options) {
8
- this.options = options
9
- this.$body = $(document.body)
10
- this.$element = $(element)
11
- this.$dialog = this.$element.find('.modal-dialog')
12
- this.$backdrop = null
13
- this.isShown = null
14
- this.originalBodyPad = null
15
- this.scrollbarWidth = 0
16
- this.ignoreBackdropClick = false
17
-
18
- if (this.options.remote) {
19
- this.$element
20
- .find('.modal-content')
21
- .load(this.options.remote, $.proxy(function () {
22
- this.$element.trigger('loaded.bs.modal')
23
- }, this))
24
- }
25
- }
26
 
27
- Modal.VERSION = '3.3.6'
28
 
29
- Modal.TRANSITION_DURATION = 300
30
- Modal.BACKDROP_TRANSITION_DURATION = 150
31
 
32
- Modal.DEFAULTS = {
33
- backdrop: true,
34
- keyboard: true,
35
- show: true
36
- }
37
 
38
- Modal.prototype.toggle = function (_relatedTarget) {
39
- return this.isShown ? this.hide() : this.show(_relatedTarget)
40
- }
41
 
42
- Modal.prototype.show = function (_relatedTarget) {
43
- var that = this
44
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
45
 
46
- this.$element.trigger(e)
47
 
48
- if (this.isShown || e.isDefaultPrevented()) return
 
49
 
50
- this.isShown = true
51
 
52
- this.checkScrollbar()
53
- this.setScrollbar()
54
- this.$body.addClass('modal-open')
55
 
56
- this.escape()
57
- this.resize()
58
 
59
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
60
 
61
- this.$dialog.on('mousedown.dismiss.bs.modal', function () {
62
- that.$element.one('mouseup.dismiss.bs.modal', function (e) {
63
- if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
 
 
64
  })
65
- })
66
 
67
- this.backdrop(function () {
68
- var transition = $.support.transition && that.$element.hasClass('fade')
69
 
70
- if (!that.$element.parent().length) {
71
- that.$element.appendTo(that.$body) // don't move modals dom position
72
- }
73
 
74
- that.$element
75
- .show()
76
- .scrollTop(0)
77
 
78
- that.adjustDialog()
79
 
80
- if (transition) {
81
- that.$element[0].offsetWidth // force reflow
82
- }
83
 
84
- that.$element.addClass('in')
85
 
86
- that.enforceFocus()
87
 
88
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
89
 
90
- transition ?
91
- that.$dialog // wait for modal to slide in
92
- .one('bsTransitionEnd', function () {
93
- that.$element.trigger('focus').trigger(e)
94
- })
95
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
96
- that.$element.trigger('focus').trigger(e)
97
- })
98
- }
99
 
100
- Modal.prototype.hide = function (e) {
101
- if (e) e.preventDefault()
 
102
 
103
- e = $.Event('hide.bs.modal')
104
 
105
- this.$element.trigger(e)
106
 
107
- if (!this.isShown || e.isDefaultPrevented()) return
 
108
 
109
- this.isShown = false
110
 
111
- this.escape()
112
- this.resize()
113
 
114
- $(document).off('focusin.bs.modal')
115
 
116
- this.$element
117
- .removeClass('in')
118
- .off('click.dismiss.bs.modal')
119
- .off('mouseup.dismiss.bs.modal')
120
 
121
- this.$dialog.off('mousedown.dismiss.bs.modal')
122
 
123
- $.support.transition && this.$element.hasClass('fade') ?
124
- this.$element
125
- .one('bsTransitionEnd', $.proxy(this.hideModal, this))
126
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
127
- this.hideModal()
128
- }
129
-
130
- Modal.prototype.enforceFocus = function () {
131
- $(document)
132
- .off('focusin.bs.modal') // guard against infinite focus loop
133
- .on('focusin.bs.modal', $.proxy(function (e) {
134
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
135
- this.$element.trigger('focus')
136
- }
137
- }, this))
138
- }
139
-
140
- Modal.prototype.escape = function () {
141
- if (this.isShown && this.options.keyboard) {
142
- this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
143
- e.which == 27 && this.hide()
144
- }, this))
145
- } else if (!this.isShown) {
146
- this.$element.off('keydown.dismiss.bs.modal')
147
- }
148
- }
149
-
150
- Modal.prototype.resize = function () {
151
- if (this.isShown) {
152
- $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
153
- } else {
154
- $(window).off('resize.bs.modal')
155
- }
156
- }
157
-
158
- Modal.prototype.hideModal = function () {
159
- var that = this
160
- this.$element.hide()
161
- this.backdrop(function () {
162
- that.$body.removeClass('modal-open')
163
- that.resetAdjustments()
164
- that.resetScrollbar()
165
- that.$element.trigger('hidden.bs.modal')
166
- })
167
- }
168
-
169
- Modal.prototype.removeBackdrop = function () {
170
- this.$backdrop && this.$backdrop.remove()
171
- this.$backdrop = null
172
- }
173
-
174
- Modal.prototype.backdrop = function (callback) {
175
- var that = this
176
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
177
-
178
- if (this.isShown && this.options.backdrop) {
179
- var doAnimate = $.support.transition && animate
180
-
181
- this.$backdrop = $(document.createElement('div'))
182
- .addClass('modal-backdrop ' + animate)
183
- .appendTo(this.$body)
184
-
185
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
186
- if (this.ignoreBackdropClick) {
187
- this.ignoreBackdropClick = false
188
- return
189
- }
190
- if (e.target !== e.currentTarget) return
191
- this.options.backdrop == 'static'
192
- ? this.$element[0].focus()
193
- : this.hide()
194
- }, this))
195
-
196
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
197
-
198
- this.$backdrop.addClass('in')
199
-
200
- if (!callback) return
201
-
202
- doAnimate ?
203
- this.$backdrop
204
- .one('bsTransitionEnd', callback)
205
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
206
- callback()
207
-
208
- } else if (!this.isShown && this.$backdrop) {
209
- this.$backdrop.removeClass('in')
210
-
211
- var callbackRemove = function () {
212
- that.removeBackdrop()
213
- callback && callback()
214
- }
215
  $.support.transition && this.$element.hasClass('fade') ?
216
- this.$backdrop
217
- .one('bsTransitionEnd', callbackRemove)
218
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
219
- callbackRemove()
220
-
221
- } else if (callback) {
222
- callback()
223
- }
224
- }
225
-
226
- // these following methods are used to handle overflowing modals
227
-
228
- Modal.prototype.handleUpdate = function () {
229
- this.adjustDialog()
230
- }
231
-
232
- Modal.prototype.adjustDialog = function () {
233
- var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
234
-
235
- this.$element.css({
236
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
237
- paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
238
- })
239
- }
240
-
241
- Modal.prototype.resetAdjustments = function () {
242
- this.$element.css({
243
- paddingLeft: '',
244
- paddingRight: ''
245
- })
246
- }
247
-
248
- Modal.prototype.checkScrollbar = function () {
249
- var fullWindowWidth = window.innerWidth
250
- if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
251
- var documentElementRect = document.documentElement.getBoundingClientRect()
252
- fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
253
- }
254
- this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
255
- this.scrollbarWidth = this.measureScrollbar()
256
- }
257
-
258
- Modal.prototype.setScrollbar = function () {
259
- var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
260
- this.originalBodyPad = document.body.style.paddingRight || ''
261
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
262
- }
263
-
264
- Modal.prototype.resetScrollbar = function () {
265
- this.$body.css('padding-right', this.originalBodyPad)
266
- }
267
-
268
- Modal.prototype.measureScrollbar = function () { // thx walsh
269
- var scrollDiv = document.createElement('div')
270
- scrollDiv.className = 'modal-scrollbar-measure'
271
- this.$body.append(scrollDiv)
272
- var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
273
- this.$body[0].removeChild(scrollDiv)
274
- return scrollbarWidth
275
- }
276
-
277
-
278
- // MODAL PLUGIN DEFINITION
279
- // =======================
280
-
281
- function Plugin(option, _relatedTarget) {
282
- return this.each(function () {
283
- var $this = $(this)
284
- var data = $this.data('bs.modal')
285
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
286
-
287
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
288
- if (typeof option == 'string') data[option](_relatedTarget)
289
- else if (options.show) data.show(_relatedTarget)
290
- })
291
- }
292
-
293
- var old = $.fn.modal
294
-
295
- $.fn.modal = Plugin
296
- $.fn.modal.Constructor = Modal
297
-
298
-
299
- // MODAL NO CONFLICT
300
- // =================
301
-
302
- $.fn.modal.noConflict = function () {
303
- $.fn.modal = old
304
- return this
305
- }
306
-
307
-
308
- // MODAL DATA-API
309
- // ==============
310
-
311
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
312
- var $this = $(this)
313
- var href = $this.attr('href')
314
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
315
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
316
-
317
- if ($this.is('a')) e.preventDefault()
318
-
319
- $target.one('show.bs.modal', function (showEvent) {
320
- if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
321
- $target.one('hidden.bs.modal', function () {
322
- $this.is(':visible') && $this.trigger('focus')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  })
324
- })
325
- Plugin.call($target, option, this)
326
- })
327
 
328
  }(jQuery);
1
  +function ($) {
2
+ 'use strict';
3
+
4
+ // MODAL CLASS DEFINITION
5
+ // ======================
6
+
7
+ var Modal = function (element, options) {
8
+ this.options = options
9
+ this.$body = $(document.body)
10
+ this.$element = $(element)
11
+ this.$dialog = this.$element.find('.modal-dialog')
12
+ this.$backdrop = null
13
+ this.isShown = null
14
+ this.originalBodyPad = null
15
+ this.scrollbarWidth = 0
16
+ this.ignoreBackdropClick = false
17
+
18
+ if (this.options.remote) {
19
+ this.$element
20
+ .find('.modal-content')
21
+ .load(this.options.remote, $.proxy(function () {
22
+ this.$element.trigger('loaded.bs.modal')
23
+ }, this))
24
+ }
25
+ }
26
 
27
+ Modal.VERSION = '3.3.6'
28
 
29
+ Modal.TRANSITION_DURATION = 300
30
+ Modal.BACKDROP_TRANSITION_DURATION = 150
31
 
32
+ Modal.DEFAULTS = {
33
+ backdrop: true,
34
+ keyboard: true,
35
+ show: true
36
+ }
37
 
38
+ Modal.prototype.toggle = function (_relatedTarget) {
39
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
40
+ }
41
 
42
+ Modal.prototype.show = function (_relatedTarget) {
43
+ var that = this
44
+ var e = $.Event('show.bs.modal', {relatedTarget: _relatedTarget})
45
 
46
+ this.$element.trigger(e)
47
 
48
+ if (this.isShown || e.isDefaultPrevented())
49
+ return
50
 
51
+ this.isShown = true
52
 
53
+ this.checkScrollbar()
54
+ this.setScrollbar()
55
+ this.$body.addClass('modal-open')
56
 
57
+ this.escape()
58
+ this.resize()
59
 
60
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
61
 
62
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
63
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
64
+ if ($(e.target).is(that.$element))
65
+ that.ignoreBackdropClick = true
66
+ })
67
  })
 
68
 
69
+ this.backdrop(function () {
70
+ var transition = $.support.transition && that.$element.hasClass('fade')
71
 
72
+ if (!that.$element.parent().length) {
73
+ that.$element.appendTo(that.$body) // don't move modals dom position
74
+ }
75
 
76
+ that.$element
77
+ .show()
78
+ .scrollTop(0)
79
 
80
+ that.adjustDialog()
81
 
82
+ if (transition) {
83
+ that.$element[0].offsetWidth // force reflow
84
+ }
85
 
86
+ that.$element.addClass('in')
87
 
88
+ that.enforceFocus()
89
 
90
+ var e = $.Event('shown.bs.modal', {relatedTarget: _relatedTarget})
91
 
92
+ transition ?
93
+ that.$dialog // wait for modal to slide in
94
+ .one('bsTransitionEnd', function () {
95
+ that.$element.trigger('focus').trigger(e)
96
+ })
97
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
98
+ that.$element.trigger('focus').trigger(e)
99
+ })
100
+ }
101
 
102
+ Modal.prototype.hide = function (e) {
103
+ if (e)
104
+ e.preventDefault()
105
 
106
+ e = $.Event('hide.bs.modal')
107
 
108
+ this.$element.trigger(e)
109
 
110
+ if (!this.isShown || e.isDefaultPrevented())
111
+ return
112
 
113
+ this.isShown = false
114
 
115
+ this.escape()
116
+ this.resize()
117
 
118
+ $(document).off('focusin.bs.modal')
119
 
120
+ this.$element
121
+ .removeClass('in')
122
+ .off('click.dismiss.bs.modal')
123
+ .off('mouseup.dismiss.bs.modal')
124
 
125
+ this.$dialog.off('mousedown.dismiss.bs.modal')
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  $.support.transition && this.$element.hasClass('fade') ?
128
+ this.$element
129
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
130
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
131
+ this.hideModal()
132
+ }
133
+
134
+ Modal.prototype.enforceFocus = function () {
135
+ $(document)
136
+ .off('focusin.bs.modal') // guard against infinite focus loop
137
+ .on('focusin.bs.modal', $.proxy(function (e) {
138
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
139
+ this.$element.trigger('focus')
140
+ }
141
+ }, this))
142
+ }
143
+
144
+ Modal.prototype.escape = function () {
145
+ if (this.isShown && this.options.keyboard) {
146
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
147
+ e.which == 27 && this.hide()
148
+ }, this))
149
+ } else if (!this.isShown) {
150
+ this.$element.off('keydown.dismiss.bs.modal')
151
+ }
152
+ }
153
+
154
+ Modal.prototype.resize = function () {
155
+ if (this.isShown) {
156
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
157
+ } else {
158
+ $(window).off('resize.bs.modal')
159
+ }
160
+ }
161
+
162
+ Modal.prototype.hideModal = function () {
163
+ var that = this
164
+ this.$element.hide()
165
+ this.backdrop(function () {
166
+ that.$body.removeClass('modal-open')
167
+ that.resetAdjustments()
168
+ that.resetScrollbar()
169
+ that.$element.trigger('hidden.bs.modal')
170
+ })
171
+ }
172
+
173
+ Modal.prototype.removeBackdrop = function () {
174
+ this.$backdrop && this.$backdrop.remove()
175
+ this.$backdrop = null
176
+ }
177
+
178
+ Modal.prototype.backdrop = function (callback) {
179
+ var that = this
180
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
181
+
182
+ if (this.isShown && this.options.backdrop) {
183
+ var doAnimate = $.support.transition && animate
184
+
185
+ this.$backdrop = $(document.createElement('div'))
186
+ .addClass('modal-backdrop ' + animate)
187
+ .appendTo(this.$body)
188
+
189
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
190
+ if (this.ignoreBackdropClick) {
191
+ this.ignoreBackdropClick = false
192
+ return
193
+ }
194
+ if (e.target !== e.currentTarget)
195
+ return
196
+ this.options.backdrop == 'static'
197
+ ? this.$element[0].focus()
198
+ : this.hide()
199
+ }, this))
200
+
201
+ if (doAnimate)
202
+ this.$backdrop[0].offsetWidth // force reflow
203
+
204
+ this.$backdrop.addClass('in')
205
+
206
+ if (!callback)
207
+ return
208
+
209
+ doAnimate ?
210
+ this.$backdrop
211
+ .one('bsTransitionEnd', callback)
212
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
213
+ callback()
214
+
215
+ } else if (!this.isShown && this.$backdrop) {
216
+ this.$backdrop.removeClass('in')
217
+
218
+ var callbackRemove = function () {
219
+ that.removeBackdrop()
220
+ callback && callback()
221
+ }
222
+ $.support.transition && this.$element.hasClass('fade') ?
223
+ this.$backdrop
224
+ .one('bsTransitionEnd', callbackRemove)
225
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
226
+ callbackRemove()
227
+
228
+ } else if (callback) {
229
+ callback()
230
+ }
231
+ }
232
+
233
+ // these following methods are used to handle overflowing modals
234
+
235
+ Modal.prototype.handleUpdate = function () {
236
+ this.adjustDialog()
237
+ }
238
+
239
+ Modal.prototype.adjustDialog = function () {
240
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
241
+
242
+ this.$element.css({
243
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
244
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
245
+ })
246
+ }
247
+
248
+ Modal.prototype.resetAdjustments = function () {
249
+ this.$element.css({
250
+ paddingLeft: '',
251
+ paddingRight: ''
252
+ })
253
+ }
254
+
255
+ Modal.prototype.checkScrollbar = function () {
256
+ var fullWindowWidth = window.innerWidth
257
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
258
+ var documentElementRect = document.documentElement.getBoundingClientRect()
259
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
260
+ }
261
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
262
+ this.scrollbarWidth = this.measureScrollbar()
263
+ }
264
+
265
+ Modal.prototype.setScrollbar = function () {
266
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
267
+ this.originalBodyPad = document.body.style.paddingRight || ''
268
+ if (this.bodyIsOverflowing)
269
+ this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
270
+ }
271
+
272
+ Modal.prototype.resetScrollbar = function () {
273
+ this.$body.css('padding-right', this.originalBodyPad)
274
+ }
275
+
276
+ Modal.prototype.measureScrollbar = function () { // thx walsh
277
+ var scrollDiv = document.createElement('div')
278
+ scrollDiv.className = 'modal-scrollbar-measure'
279
+ this.$body.append(scrollDiv)
280
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
281
+ this.$body[0].removeChild(scrollDiv)
282
+ return scrollbarWidth
283
+ }
284
+
285
+
286
+ // MODAL PLUGIN DEFINITION
287
+ // =======================
288
+
289
+ function Plugin(option, _relatedTarget) {
290
+ return this.each(function () {
291
+ var $this = $(this)
292
+ var data = $this.data('bs.modal')
293
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
294
+
295
+ if (!data)
296
+ $this.data('bs.modal', (data = new Modal(this, options)))
297
+ if (typeof option == 'string')
298
+ data[option](_relatedTarget)
299
+ else if (options.show)
300
+ data.show(_relatedTarget)
301
+ })
302
+ }
303
+
304
+ var old = $.fn.modal
305
+
306
+ $.fn.modal = Plugin
307
+ $.fn.modal.Constructor = Modal
308
+
309
+
310
+ // MODAL NO CONFLICT
311
+ // =================
312
+
313
+ $.fn.modal.noConflict = function () {
314
+ $.fn.modal = old
315
+ return this
316
+ }
317
+
318
+
319
+ // MODAL DATA-API
320
+ // ==============
321
+
322
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
323
+ var $this = $(this)
324
+ var href = $this.attr('href')
325
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
326
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({remote: !/#/.test(href) && href}, $target.data(), $this.data())
327
+
328
+ if ($this.is('a'))
329
+ e.preventDefault()
330
+
331
+ $target.one('show.bs.modal', function (showEvent) {
332
+ if (showEvent.isDefaultPrevented())
333
+ return // only register focus restorer if modal will actually get shown
334
+ $target.one('hidden.bs.modal', function () {
335
+ $this.is(':visible') && $this.trigger('focus')
336
+ })
337
  })
338
+ Plugin.call($target, option, this)
339
+ })
 
340
 
341
  }(jQuery);
assets/global/plugins/pluploader/css/jquery.ui.plupload.css CHANGED
@@ -3,25 +3,25 @@
3
  ------------------------------------------------------------------- */
4
 
5
  .plupload_wrapper * {
6
- box-sizing: content-box;
7
  }
8
 
9
  .plupload_button {
10
- cursor: pointer;
11
- outline: none;
12
  }
13
 
14
  .plupload_wrapper {
15
- font: normal 11px Verdana,sans-serif;
16
- width: 100%;
17
- min-width: 520px;
18
- line-height: 12px;
19
  }
20
 
21
  .plupload_container {
22
- _height: 300px;
23
- min-height: 300px;
24
- position: relative;
25
  }
26
 
27
  .plupload_filelist_footer {border-width: 1px 0 0 0}
@@ -31,266 +31,266 @@
31
  .plupload_delete .ui-icon,
32
  .plupload_done .ui-icon,
33
  .plupload_failed .ui-icon {
34
- cursor:pointer;
35
  }
36
 
37
  .plupload_header_content {
38
- height: 56px;
39
- padding: 0 160px 0 60px;
40
- position: relative;
41
  }
42
 
43
  .plupload_logo {
44
- width: 40px;
45
- height: 40px;
46
- background: url('../img/plupload.png') no-repeat 0 0;
47
- position: absolute;
48
- top: 8px;
49
- left: 8px;
50
  }
51
 
52
  .plupload_header_content_bw .plupload_logo {
53
- background-position: -40px 0;
54
  }
55
 
56
  .plupload_header_title {
57
- font: normal 18px sans-serif;
58
- line-height: 19px;
59
- padding: 6px 0 3px;
60
  }
61
 
62
  .plupload_header_text {
63
- font: normal 12px sans-serif;
64
  }
65
 
66
  .plupload_view_switch {
67
- position: absolute;
68
- right: 16px;
69
- bottom: 8px;
70
- margin: 0;
71
- display: none;
72
  }
73
 
74
  .plupload_view_switch .ui-button {
75
- margin-right: -0.31em;
76
  }
77
 
78
  .plupload_content {
79
- position: absolute;
80
- top: 86px;
81
- bottom: 44px;
82
- left: 0;
83
- right: 0;
84
- overflow-y: auto;
85
- width: 100%;
86
  }
87
 
88
  .plupload_filelist {
89
- border-collapse: collapse;
90
- border-left: none;
91
- border-right: none;
92
- margin: 0;
93
- padding: 0;
94
- width: 100%;
95
- -moz-user-select: none;
96
- -webkit-user-select: none;
97
- user-select: none;
98
  }
99
 
100
  .plupload_filelist_content {
101
- padding: 0;
102
- margin: 0;
103
  }
104
 
105
  .plupload_cell {padding: 8px 6px;}
106
 
107
  .plupload_file {
108
- list-style: none;
109
- display: block;
110
- position: relative;
111
- overflow: hidden;
112
- line-height: 12px;
113
  }
114
 
115
  .plupload_file_thumb {
116
- position: relative;
117
- background-image: none;
118
- background-color: #eee;
119
  }
120
 
121
  .plupload_thumb_loading {
122
- background: #eee url(../img/loading.gif) center no-repeat;
123
  }
124
 
125
  .plupload_thumb_loading .plupload_file_dummy,
126
  .plupload_thumb_embedded .plupload_file_dummy {
127
- display: none;
128
  }
129
 
130
  .plupload_file_name {
131
- overflow: hidden;
132
- text-overflow: ellipsis;
133
- white-space: nowrap;
134
  }
135
 
136
  .plupload_filelist_header {
137
- border-top: none;
138
  }
139
 
140
  .plupload_filelist_footer {
141
- position: absolute;
142
- bottom: 0;
143
- left: 0;
144
- right: 0;
145
  }
146
 
147
  .plupload_buttons {
148
- position: relative;
149
  }
150
 
151
  /* list view */
152
  .plupload_view_list .plupload_file {
153
- border-left: none;
154
- border-right: none;
155
- border-top: none;
156
- height: 29px;
157
- width: 100% !important;
158
- /* fix IE6 vertical white-space bug */
159
- _float: left;
160
- _clear: left;
161
  }
162
 
163
  .plupload_view_list div.plupload_file_size,
164
  .plupload_view_list div.plupload_file_status,
165
  .plupload_view_list div.plupload_file_action {
166
- padding: 8px 6px;
167
- position: absolute;
168
- top: 0;
169
- right: 0;
170
  }
171
 
172
  .plupload_view_list div.plupload_file_name {
173
- margin-right: 156px;
174
- padding: 8px 6px;
175
- _width: 75%;
176
  }
177
 
178
  .plupload_view_list div.plupload_file_size {
179
- right: 28px;
180
  }
181
 
182
  .plupload_view_list div.plupload_file_status {
183
- right: 82px;
184
  }
185
 
186
  .plupload_view_list .plupload_file_rename {
187
- margin-left: -2px;
188
  }
189
 
190
  .plupload_view_list .plupload_file_size,
191
  .plupload_view_list .plupload_file_status,
192
  .plupload_filelist_footer .plupload_file_size,
193
  .plupload_filelist_footer .plupload_file_status {
194
- text-align: right;
195
- width: 52px;
196
  }
197
 
198
  .plupload_view_list .plupload_file_thumb {
199
- position: absolute;
200
- top: -999px;
201
  }
202
 
203
  .plupload_view_list .plupload_file_progress {
204
- display: none;
205
  }
206
 
207
 
208
  /* thumbs view */
209
  .plupload_view_thumbs .plupload_content {
210
- top: 57px;
211
  }
212
 
213
  .plupload_view_thumbs .plupload_filelist_header {
214
- display: none;
215
  }
216
 
217
  .plupload_view_thumbs .plupload_file {
218
- padding: 6px;
219
- margin: 10px;
220
- border: 1px solid #fff;
221
- float: left;
222
  }
223
 
224
  .plupload_view_thumbs .plupload_file_thumb,
225
  .plupload_view_thumbs .plupload_file_dummy {
226
- text-align: center;
227
- overflow: hidden;
228
  }
229
 
230
  .plupload_view_thumbs .plupload_file_dummy {
231
- font-size: 21px;
232
- font-weight: bold;
233
- text-transform: lowercase;
234
- overflow: hidden;
235
- border: none;
236
- position: absolute;
237
- top: 0;
238
- left: 0;
239
- width: 100%;
240
- height: 100%;
241
  }
242
 
243
  .plupload_view_thumbs div.plupload_file_action {
244
- position: absolute;
245
- top: 0;
246
- right: 0;
247
  }
248
 
249
  .plupload_view_thumbs div.plupload_file_name {
250
- padding: 0;
251
- font-weight: bold;
252
  }
253
 
254
  .plupload_view_thumbs .plupload_file_rename {
255
- padding: 1px 0;
256
- width: 100% !important;
257
  }
258
 
259
  .plupload_view_thumbs div.plupload_file_size {
260
- font-size: 0.8em;
261
- font-weight: normal;
262
  }
263
 
264
  .plupload_view_thumbs div.plupload_file_status {
265
- position: relative;
266
- height: 3px;
267
- overflow: hidden;
268
- text-indent: -999px;
269
- margin-bottom: 3px;
270
  }
271
 
272
  .plupload_view_thumbs div.plupload_file_progress {
273
- border: none;
274
- height: 100%;
275
  }
276
 
277
  .plupload .ui-sortable-helper,
278
  .plupload .ui-sortable .plupload_file {
279
- cursor:move;
280
  }
281
 
282
  .plupload_file_action {width: 16px;}
283
  .plupload_file_name {
284
- overflow: hidden;
285
- padding-left: 10px;
286
  }
287
 
288
  .plupload_file_rename {
289
- border: none;
290
- font: normal 11px Verdana, sans-serif;
291
- padding: 1px 2px;
292
- line-height: 11px;
293
- height: 11px;
294
  }
295
 
296
  .plupload_progress {width: 60px;}
@@ -303,9 +303,9 @@
303
  .plupload_left {float: left;}
304
  .plupload_clear,.plupload_clearer {clear: both;}
305
  .plupload_clearer, .plupload_progress_bar {
306
- display: block;
307
- font-size: 0;
308
- line-height: 0;
309
  }
310
  .plupload_clearer {height: 0;}
311
 
@@ -313,63 +313,63 @@
313
  .plupload_hidden {display: none !important;}
314
 
315
  .plupload_droptext {
316
- position: absolute;
317
- top: 0;
318
- left: 0;
319
- right: 0;
320
- bottom: 0;
321
- background: transparent;
322
- text-align: center;
323
- vertical-align: middle;
324
- border: 0;
325
- line-height: 160px;
326
- display: none;
327
  }
328
 
329
  .plupload_dropbox .plupload_droptext {
330
- display: block;
331
  }
332
 
333
  .plupload_buttons, .plupload_upload_status {float: left}
334
 
335
  .plupload_message {
336
- position: absolute;
337
- top: -1px;
338
- left: -1px;
339
- height: 100%;
340
- width: 100%;
341
  }
342
 
343
  .plupload_message p {
344
- padding:0.7em;
345
- margin:0;
346
  }
347
 
348
  .plupload_message strong {
349
- font-weight: bold;
350
  }
351
 
352
  .plupload_message i {
353
- font-style: italic;
354
  }
355
 
356
  .plupload_message p span.ui-icon {
357
- float: left;
358
- margin-right: 0.3em;
359
  }
360
 
361
  .plupload_header_content .ui-state-error,
362
  .plupload_header_content .ui-state-highlight {
363
- border:none;
364
  }
365
 
366
  .plupload_message_close {
367
- position:absolute;
368
- top:5px;
369
- right:5px;
370
- cursor:pointer;
371
  }
372
 
373
  .plupload .ui-sortable-placeholder {
374
- height:35px;
375
  }
3
  ------------------------------------------------------------------- */
4
 
5
  .plupload_wrapper * {
6
+ box-sizing: content-box;
7
  }
8
 
9
  .plupload_button {
10
+ cursor: pointer;
11
+ outline: none;
12
  }
13
 
14
  .plupload_wrapper {
15
+ font: normal 11px Verdana,sans-serif;
16
+ width: 100%;
17
+ min-width: 520px;
18
+ line-height: 12px;
19
  }
20
 
21
  .plupload_container {
22
+ _height: 300px;
23
+ min-height: 300px;
24
+ position: relative;
25
  }
26
 
27
  .plupload_filelist_footer {border-width: 1px 0 0 0}
31
  .plupload_delete .ui-icon,
32
  .plupload_done .ui-icon,
33
  .plupload_failed .ui-icon {
34
+ cursor:pointer;
35
  }
36
 
37
  .plupload_header_content {
38
+ height: 56px;
39
+ padding: 0 160px 0 60px;
40
+ position: relative;
41
  }
42
 
43
  .plupload_logo {
44
+ width: 40px;
45
+ height: 40px;
46
+ background: url('../img/plupload.png') no-repeat 0 0;
47
+ position: absolute;
48
+ top: 8px;
49
+ left: 8px;
50
  }
51
 
52
  .plupload_header_content_bw .plupload_logo {
53
+ background-position: -40px 0;
54
  }
55
 
56
  .plupload_header_title {
57
+ font: normal 18px sans-serif;
58
+ line-height: 19px;
59
+ padding: 6px 0 3px;
60
  }
61
 
62
  .plupload_header_text {
63
+ font: normal 12px sans-serif;
64
  }
65
 
66
  .plupload_view_switch {
67
+ position: absolute;
68
+ right: 16px;
69
+ bottom: 8px;
70
+ margin: 0;
71
+ display: none;
72
  }
73
 
74
  .plupload_view_switch .ui-button {
75
+ margin-right: -0.31em;
76
  }
77
 
78
  .plupload_content {
79
+ position: absolute;
80
+ top: 86px;
81
+ bottom: 44px;
82
+ left: 0;
83
+ right: 0;
84
+ overflow-y: auto;
85
+ width: 100%;
86
  }
87
 
88
  .plupload_filelist {
89
+ border-collapse: collapse;
90
+ border-left: none;
91
+ border-right: none;
92
+ margin: 0;
93
+ padding: 0;
94
+ width: 100%;
95
+ -moz-user-select: none;
96
+ -webkit-user-select: none;
97
+ user-select: none;
98
  }
99
 
100
  .plupload_filelist_content {
101
+ padding: 0;
102
+ margin: 0;
103
  }
104
 
105
  .plupload_cell {padding: 8px 6px;}
106
 
107
  .plupload_file {
108
+ list-style: none;
109
+ display: block;
110
+ position: relative;
111
+ overflow: hidden;
112
+ line-height: 12px;
113
  }
114
 
115
  .plupload_file_thumb {
116
+ position: relative;
117
+ background-image: none;
118
+ background-color: #eee;
119
  }
120
 
121
  .plupload_thumb_loading {
122
+ background: #eee url(../img/loading.gif) center no-repeat;
123
  }
124
 
125
  .plupload_thumb_loading .plupload_file_dummy,
126
  .plupload_thumb_embedded .plupload_file_dummy {
127
+ display: none;
128
  }
129
 
130
  .plupload_file_name {
131
+ overflow: hidden;
132
+ text-overflow: ellipsis;
133
+ white-space: nowrap;
134
  }
135
 
136
  .plupload_filelist_header {
137
+ border-top: none;
138
  }
139
 
140
  .plupload_filelist_footer {
141
+ position: absolute;
142
+ bottom: 0;
143
+ left: 0;
144
+ right: 0;
145
  }
146
 
147
  .plupload_buttons {
148
+ position: relative;
149
  }
150
 
151
  /* list view */
152
  .plupload_view_list .plupload_file {
153
+ border-left: none;
154
+ border-right: none;
155
+ border-top: none;
156
+ height: 29px;
157
+ width: 100% !important;
158
+ /* fix IE6 vertical white-space bug */
159
+ _float: left;
160
+ _clear: left;
161
  }
162
 
163
  .plupload_view_list div.plupload_file_size,
164
  .plupload_view_list div.plupload_file_status,
165
  .plupload_view_list div.plupload_file_action {
166
+ padding: 8px 6px;
167
+ position: absolute;
168
+ top: 0;
169
+ right: 0;
170
  }
171
 
172
  .plupload_view_list div.plupload_file_name {
173
+ margin-right: 156px;
174
+ padding: 8px 6px;
175
+ _width: 75%;
176
  }
177
 
178
  .plupload_view_list div.plupload_file_size {
179
+ right: 28px;
180
  }
181
 
182
  .plupload_view_list div.plupload_file_status {
183
+ right: 82px;
184
  }
185
 
186
  .plupload_view_list .plupload_file_rename {
187
+ margin-left: -2px;
188
  }
189
 
190
  .plupload_view_list .plupload_file_size,
191
  .plupload_view_list .plupload_file_status,
192
  .plupload_filelist_footer .plupload_file_size,
193
  .plupload_filelist_footer .plupload_file_status {
194
+ text-align: right;
195
+ width: 52px;
196
  }
197
 
198
  .plupload_view_list .plupload_file_thumb {
199
+ position: absolute;
200
+ top: -999px;
201
  }
202
 
203
  .plupload_view_list .plupload_file_progress {
204
+ display: none;
205
  }
206
 
207
 
208
  /* thumbs view */
209
  .plupload_view_thumbs .plupload_content {
210
+ top: 57px;
211
  }
212
 
213
  .plupload_view_thumbs .plupload_filelist_header {
214
+ display: none;
215
  }
216
 
217
  .plupload_view_thumbs .plupload_file {
218
+ padding: 6px;
219
+ margin: 10px;
220
+ border: 1px solid #fff;
221
+ float: left;
222
  }
223
 
224
  .plupload_view_thumbs .plupload_file_thumb,
225
  .plupload_view_thumbs .plupload_file_dummy {
226
+ text-align: center;
227
+ overflow: hidden;
228
  }
229
 
230
  .plupload_view_thumbs .plupload_file_dummy {
231
+ font-size: 21px;
232
+ font-weight: bold;
233
+ text-transform: lowercase;
234
+ overflow: hidden;
235
+ border: none;
236
+ position: absolute;
237
+ top: 0;
238
+ left: 0;
239
+ width: 100%;
240
+ height: 100%;
241
  }
242
 
243
  .plupload_view_thumbs div.plupload_file_action {
244
+ position: absolute;
245
+ top: 0;
246
+ right: 0;
247
  }
248
 
249
  .plupload_view_thumbs div.plupload_file_name {
250
+ padding: 0;
251
+ font-weight: bold;
252
  }
253
 
254
  .plupload_view_thumbs .plupload_file_rename {
255
+ padding: 1px 0;
256
+ width: 100% !important;
257
  }
258
 
259
  .plupload_view_thumbs div.plupload_file_size {
260
+ font-size: 0.8em;
261
+ font-weight: normal;
262
  }
263
 
264
  .plupload_view_thumbs div.plupload_file_status {
265
+ position: relative;
266
+ height: 3px;
267
+ overflow: hidden;
268
+ text-indent: -999px;
269
+ margin-bottom: 3px;
270
  }
271
 
272
  .plupload_view_thumbs div.plupload_file_progress {
273
+ border: none;
274
+ height: 100%;
275
  }
276
 
277
  .plupload .ui-sortable-helper,
278
  .plupload .ui-sortable .plupload_file {
279
+ cursor:move;
280
  }
281
 
282
  .plupload_file_action {width: 16px;}
283
  .plupload_file_name {
284
+ overflow: hidden;
285
+ padding-left: 10px;
286
  }
287
 
288
  .plupload_file_rename {
289
+ border: none;
290
+ font: normal 11px Verdana, sans-serif;
291
+ padding: 1px 2px;
292
+ line-height: 11px;
293
+ height: 11px;
294
  }
295
 
296
  .plupload_progress {width: 60px;}
303
  .plupload_left {float: left;}
304
  .plupload_clear,.plupload_clearer {clear: both;}
305
  .plupload_clearer, .plupload_progress_bar {
306
+ display: block;
307
+ font-size: 0;
308
+ line-height: 0;
309
  }
310
  .plupload_clearer {height: 0;}
311
 
313
  .plupload_hidden {display: none !important;}
314
 
315
  .plupload_droptext {
316
+ position: absolute;
317
+ top: 0;
318
+ left: 0;
319
+ right: 0;
320
+ bottom: 0;
321
+ background: transparent;
322
+ text-align: center;
323
+ vertical-align: middle;
324
+ border: 0;
325
+ line-height: 160px;
326
+ display: none;
327
  }
328
 
329
  .plupload_dropbox .plupload_droptext {
330
+ display: block;
331
  }
332
 
333
  .plupload_buttons, .plupload_upload_status {float: left}
334
 
335
  .plupload_message {
336
+ position: absolute;
337
+ top: -1px;
338
+ left: -1px;
339
+ height: 100%;
340
+ width: 100%;
341
  }
342
 
343
  .plupload_message p {
344
+ padding:0.7em;
345
+ margin:0;
346
  }
347
 
348
  .plupload_message strong {
349
+ font-weight: bold;
350
  }
351
 
352
  .plupload_message i {
353
+ font-style: italic;
354
  }
355
 
356
  .plupload_message p span.ui-icon {
357
+ float: left;
358
+ margin-right: 0.3em;
359
  }
360
 
361
  .plupload_header_content .ui-state-error,
362
  .plupload_header_content .ui-state-highlight {
363
+ border:none;
364
  }
365
 
366
  .plupload_message_close {
367
+ position:absolute;
368
+ top:5px;
369
+ right:5px;
370
+ cursor:pointer;
371
  }
372
 
373
  .plupload .ui-sortable-placeholder {
374
+ height:35px;
375
  }
assets/global/plugins/pluploader/js/jquery.ui.plupload.js CHANGED
@@ -17,1339 +17,1310 @@
17
  * jquery.ui.sortable.js
18
  */
19
 
20
- /* global jQuery:true */
21
 
22
  /**
23
- jQuery UI based implementation of the Plupload API - multi-runtime file uploading API.
24
-
25
- To use the widget you must include _jQuery_ and _jQuery UI_ bundle (including `ui.core`, `ui.widget`, `ui.button`,
26
- `ui.progressbar` and `ui.sortable`).
27
-
28
- In general the widget is designed the way that you do not usually need to do anything to it after you instantiate it.
29
- But! You still can intervenue, to some extent, in case you need to. Although, due to the fact that widget is based on
30
- _jQuery UI_ widget factory, there are some specifics. See examples below for more details.
31
-
32
- @example
33
- <!-- Instantiating: -->
34
- <div id="uploader">
35
- <p>Your browser doesn't have Flash, Silverlight or HTML5 support.</p>
36
- </div>
37
-
38
- <script>
39
- $('#uploader').plupload({
40
- url : '../upload.php',
41
- filters : [
42
- {title : "Image files", extensions : "jpg,gif,png"}
43
- ],
44
- rename: true,
45
- sortable: true,
46
- flash_swf_url : '../../js/Moxie.swf',
47
- silverlight_xap_url : '../../js/Moxie.xap',
48
- });
49
- </script>
50
-
51
- @example
52
- // Invoking methods:
53
- $('#uploader').plupload(options);
54
-
55
- // Display welcome message in the notification area
56
- $('#uploader').plupload('notify', 'info', "This might be obvious, but you need to click 'Add Files' to add some files.");
57
-
58
- @example
59
- // Subscribing to the events...
60
- // ... on initialization:
61
- $('#uploader').plupload({
62
- ...
63
- viewchanged: function(event, args) {
64
- // stuff ...
65
- }
66
- });
67
- // ... or after initialization
68
- $('#uploader').on("viewchanged", function(event, args) {
69
- // stuff ...
70
- });
71
-
72
- @class UI.Plupload
73
- @constructor
74
- @param {Object} settings For detailed information about each option check documentation.
75
- @param {String} settings.url URL of the server-side upload handler.
76
- @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
77
- @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
78
- @param {Object} [settings.filters={}] Set of file type filters.
79
- @param {Array} [settings.filters.mime_types=[]] List of file types to accept, each one defined by title and list of extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
80
- @param {String|Number} [settings.filters.max_file_size=0] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
81
- @param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
82
- @param {Number} [settings.filters.max_file_count=0] Limit the number of files that can reside in the queue at the same time (default is 0 - no limit).
83
- @param {String} [settings.flash_swf_url] URL of the Flash swf.
84
- @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
85
- @param {Number|String} [settings.max_file_size] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
86
- @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
87
- @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
88
- @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
89
- @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
90
- @param {Boolean} [settings.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
91
- @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
92
- @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
93
- @param {Number} [settings.resize.width] If image is bigger, it will be resized.
94
- @param {Number} [settings.resize.height] If image is bigger, it will be resized.
95
- @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
96
- @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
97
- @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
98
- @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
99
- @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
100
-
101
- @param {Boolean} [settings.autostart=false] Whether to auto start uploading right after file selection.
102
- @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
103
- @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
104
- @param {Boolean} [settings.sortable=false] Enable ability to sort files in the queue, changing their uploading priority.
105
- @param {Object} [settings.buttons] Control the visibility of functional buttons.
106
- @param {Boolean} [settings.buttons.browse=true] Display browse button.
107
- @param {Boolean} [settings.buttons.start=true] Display start button.
108
- @param {Boolean} [settings.buttons.stop=true] Display stop button.
109
- @param {Object} [settings.views] Control various views of the file queue.
110
- @param {Boolean} [settings.views.list=true] Enable list view.
111
- @param {Boolean} [settings.views.thumbs=false] Enable thumbs view.
112
- @param {String} [settings.views.default='list'] Default view.
113
- @param {Boolean} [settings.views.remember=true] Whether to remember the current view (requires jQuery Cookie plugin).
114
- @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
115
- */
116
- ;(function(window, document, plupload, o, $) {
117
-
118
- /**
119
- Dispatched when the widget is initialized and ready.
120
-
121
- @event ready
122
- @param {plupload.Uploader} uploader Uploader instance sending the event.
123
- */
124
-
125
- /**
126
- Dispatched when file dialog is closed.
127
-
128
- @event selected
129
- @param {plupload.Uploader} uploader Uploader instance sending the event.
130
- @param {Array} files Array of selected files represented by plupload.File objects
131
- */
132
-
133
- /**
134
- Dispatched when file dialog is closed.
135
-
136
- @event removed
137
- @param {plupload.Uploader} uploader Uploader instance sending the event.
138
- @param {Array} files Array of removed files represented by plupload.File objects
139
- */
140
-
141
- /**
142
- Dispatched when upload is started.
143
-
144
- @event started
145
- @param {plupload.Uploader} uploader Uploader instance sending the event.
146
- */
147
-
148
- /**
149
- Dispatched when upload is stopped.
150
-
151
- @event stopped
152
- @param {plupload.Uploader} uploader Uploader instance sending the event.
153
- */
154
-
155
- /**
156
- Dispatched during the upload process.
157
-
158
- @event progress
159
- @param {plupload.Uploader} uploader Uploader instance sending the event.
160
- @param {plupload.File} file File that is being uploaded (includes loaded and percent properties among others).
161
- @param {Number} size Total file size in bytes.
162
- @param {Number} loaded Number of bytes uploaded of the files total size.
163
- @param {Number} percent Number of percentage uploaded of the file.
164
- */
165
-
166
- /**
167
- Dispatched when file is uploaded.
168
-
169
- @event uploaded
170
- @param {plupload.Uploader} uploader Uploader instance sending the event.
171
- @param {plupload.File} file File that was uploaded.
172
- @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
173
- */
174
-
175
- /**
176
- Dispatched when upload of the whole queue is complete.
177
-
178
- @event complete
179
- @param {plupload.Uploader} uploader Uploader instance sending the event.
180
- @param {Array} files Array of uploaded files represented by plupload.File objects
181
- */
182
-
183
- /**
184
- Dispatched when the view is changed, e.g. from `list` to `thumbs` or vice versa.
185
-
186
- @event viewchanged
187
- @param {plupload.Uploader} uploader Uploader instance sending the event.
188
- @param {String} type Current view type.
189
- */
190
-
191
- /**
192
- Dispatched when error of some kind is detected.
193
-
194
- @event error
195
- @param {plupload.Uploader} uploader Uploader instance sending the event.
196
- @param {String} error Error message.
197
- @param {plupload.File} file File that was uploaded.
198
- @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
199
- */
200
-
201
- var uploaders = {};
202
-
203
- function _(str) {
204
- return plupload.translate(str) || str;
205
- }
206
-
207
- function renderUI(obj) {
208
- obj.id = obj.attr('id');
209
-
210
- obj.html(
211
- '<div class="plupload_wrapper">' +
212
- '<div class="ui-widget-content plupload_container">' +
213
- '<div class="ui-state-default ui-widget-header plupload_header">' +
214
- '<div class="plupload_header_content">' +
215
- '<div class="plupload_logo"> </div>' +
216
- '<div class="plupload_header_title">' + _("Select files") + '</div>' +
217
- '<div class="plupload_header_text">' + _("Add files to the upload queue and click the start button.") + '</div>' +
218
- '<div class="plupload_view_switch">' +
219
- '<input type="radio" id="'+obj.id+'_view_list" name="view_mode_'+obj.id+'" checked="checked" /><label class="plupload_button" for="'+obj.id+'_view_list" data-view="list">' + _('List') + '</label>' +
220
- '<input type="radio" id="'+obj.id+'_view_thumbs" name="view_mode_'+obj.id+'" /><label class="plupload_button" for="'+obj.id+'_view_thumbs" data-view="thumbs">' + _('Thumbnails') + '</label>' +
221
- '</div>' +
222
- '</div>' +
223
- '</div>' +
224
-
225
- '<table class="plupload_filelist plupload_filelist_header ui-widget-header">' +
226
- '<tr>' +
227
- '<td class="plupload_cell plupload_file_name">' + _('Filename') + '</td>' +
228
- '<td class="plupload_cell plupload_file_status">' + _('Status') + '</td>' +
229
- '<td class="plupload_cell plupload_file_size">' + _('Size') + '</td>' +
230
- '<td class="plupload_cell plupload_file_action">&nbsp;</td>' +
231
- '</tr>' +
232
- '</table>' +
233
-
234
- '<div class="plupload_content">' +
235
- '<div class="plupload_droptext">' + _("Drag files here.") + '</div>' +
236
- '<ul class="plupload_filelist_content"> </ul>' +
237
- '<div class="plupload_clearer">&nbsp;</div>' +
238
- '</div>' +
239
-
240
- '<table class="plupload_filelist plupload_filelist_footer ui-widget-header">' +
241
- '<tr>' +
242
- '<td class="plupload_cell plupload_file_name">' +
243
- '<div class="plupload_buttons"><!-- Visible -->' +
244
- '<a class="plupload_button plupload_add">' + _("Add Files") + '</a>&nbsp;' +
245
- '<a class="plupload_button plupload_start">' + _("Start Upload") + '</a>&nbsp;' +
246
- '<a class="plupload_button plupload_stop plupload_hidden">'+_("Stop Upload") + '</a>&nbsp;' +
247
- '</div>' +
248
-
249
- '<div class="plupload_started plupload_hidden"><!-- Hidden -->' +
250
- '<div class="plupload_progress plupload_right">' +
251
- '<div class="plupload_progress_container"></div>' +
252
- '</div>' +
253
-
254
- '<div class="plupload_cell plupload_upload_status"></div>' +
255
-
256
- '<div class="plupload_clearer">&nbsp;</div>' +
257
- '</div>' +
258
- '</td>' +
259
- '<td class="plupload_file_status"><span class="plupload_total_status">0%</span></td>' +
260
- '<td class="plupload_file_size"><span class="plupload_total_file_size">0 kb</span></td>' +
261
- '<td class="plupload_file_action"></td>' +
262
- '</tr>' +
263
- '</table>' +
264
-
265
- '</div>' +
266
- '<input class="plupload_count" value="0" type="hidden">' +
267
- '</div>'
268
- );
269
- }
270
-
271
-
272
- $.widget("ui.plupload", {
273
-
274
- widgetEventPrefix: '',
275
-
276
- contents_bak: '',
277
-
278
- options: {
279
- browse_button_hover: 'ui-state-hover',
280
- browse_button_active: 'ui-state-active',
281
-
282
- filters: {},
283
-
284
- // widget specific
285
- buttons: {
286
- browse: true,
287
- start: true,
288
- stop: true
289
- },
290
-
291
- views: {
292
- list: true,
293
- thumbs: false,
294
- active: 'list',
295
- remember: true // requires: https://github.com/carhartl/jquery-cookie, otherwise disabled even if set to true
296
- },
297
-
298
- thumb_width: 100,
299
- thumb_height: 60,
300
-
301
- multiple_queues: true, // re-use widget by default
302
- dragdrop : true,
303
- autostart: false,
304
- sortable: false,
305
- rename: false
306
- },
307
-
308
- FILE_COUNT_ERROR: -9001,
309
-
310
- _create: function() {
311
- var id = this.element.attr('id');
312
- if (!id) {
313
- id = plupload.guid();
314
- this.element.attr('id', id);
315
- }
316
- this.id = id;
317
-
318
- // backup the elements initial state
319
- this.contents_bak = this.element.html();
320
- renderUI(this.element);
321
-
322
- // container, just in case
323
- this.container = $('.plupload_container', this.element).attr('id', id + '_container');
324
-
325
- this.content = $('.plupload_content', this.element);
326
-
327
- if ($.fn.resizable) {
328
- this.container.resizable({
329
- handles: 's',
330
- minHeight: 300
331
- });
332
- }
333
-
334
- // list of files, may become sortable
335
- this.filelist = $('.plupload_filelist_content', this.container)
336
- .attr({
337
- id: id + '_filelist',
338
- unselectable: 'on'
339
- });
340
-
341
-
342
- // buttons
343
- this.browse_button = $('.plupload_add', this.container).attr('id', id + '_browse');
344
- this.start_button = $('.plupload_start', this.container).attr('id', id + '_start');
345
- this.stop_button = $('.plupload_stop', this.container).attr('id', id + '_stop');
346
- this.thumbs_switcher = $('#' + id + '_view_thumbs');
347
- this.list_switcher = $('#' + id + '_view_list');
348
-
349
- if ($.ui.button) {
350
- this.browse_button.button({
351
- icons: { primary: 'ui-icon-circle-plus' },
352
- disabled: true
353
- });
354
-
355
- this.start_button.button({
356
- icons: { primary: 'ui-icon-circle-arrow-e' },
357
- disabled: true
358
- });
359
-
360
- this.stop_button.button({
361
- icons: { primary: 'ui-icon-circle-close' }
362
- });
363
-
364
- this.list_switcher.button({
365
- text: false,
366
- icons: { secondary: "ui-icon-grip-dotted-horizontal" }
367
- });
368
-
369
- this.thumbs_switcher.button({
370
- text: false,
371
- icons: { secondary: "ui-icon-image" }
372
- });
373
- }
374
-
375
- // progressbar
376
- this.progressbar = $('.plupload_progress_container', this.container);
377
-
378
- if ($.ui.progressbar) {
379
- this.progressbar.progressbar();
380
- }
381
-
382
- // counter
383
- this.counter = $('.plupload_count', this.element)
384
- .attr({
385
- id: id + '_count',
386
- name: id + '_count'
387
- });
388
-
389
- // initialize uploader instance
390
- this._initUploader();
391
- },
392
-
393
- _initUploader: function() {
394
- var self = this
395
- , id = this.id
396
- , uploader
397
- , options = {
398
- container: id + '_buttons',
399
- browse_button: id + '_browse'
400
- }
401
- ;
402
-
403
- $('.plupload_buttons', this.element).attr('id', id + '_buttons');
404
-
405
- if (self.options.dragdrop) {
406
- this.filelist.parent().attr('id', this.id + '_dropbox');
407
- options.drop_element = this.id + '_dropbox';
408
- }
409
-
410
- this.filelist.on('click', function(e) {
411
- var me = $(e.target), fileContainer;
412
- if (me.hasClass('plupload_action_icon')) {
413
- fileContainer = me.closest('.plupload_file');
414
- if (fileContainer.hasClass('plupload_delete')) {
415
- self.removeFile(fileContainer.attr('id'));
416
- e.preventDefault();
417
- }
418
- }
419
- });
420
-
421
- uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options));
422
-
423
- // retrieve full normalized set of options
424
- this.options = uploader.getOption();
425
-
426
- if (self.options.views.thumbs) {
427
- uploader.settings.required_features.display_media = true;
428
- }
429
-
430
- // for backward compatibility
431
- if (self.options.max_file_count) {
432
- plupload.extend(uploader.getOption('filters'), {
433
- max_file_count: self.options.max_file_count
434
- });
435
- }
436
-
437
- plupload.addFileFilter('max_file_count', function(maxCount, file, cb) {
438
- if (maxCount <= this.files.length - (this.total.uploaded + this.total.failed)) {
439
- self.browse_button.button('disable');
440
- this.disableBrowse();
441
-
442
- this.trigger('Error', {
443
- code : self.FILE_COUNT_ERROR,
444
- message : _("File count error."),
445
- file : file
446
- });
447
- cb(false);
448
- } else {
449
- cb(true);
450
- }
451
- });
452
-
453
-
454
- uploader.bind('Error', function(up, err) {
455
- var message, details = "";
456
-
457
- message = '<strong>' + err.message + '</strong>';
458
-
459
- switch (err.code) {
460
- case plupload.FILE_EXTENSION_ERROR:
461
- details = plupload.sprintf(_("File: %s"), err.file.name);
462
- break;
463
-
464
- case plupload.FILE_SIZE_ERROR:
465
- details = plupload.sprintf(_("File: %s, size: %d, max file size: %d"), err.file.name, plupload.formatSize(err.file.size), plupload.formatSize(plupload.parseSize(up.getOption('filters').max_file_size)));
466
- break;
467
-
468
- case plupload.FILE_DUPLICATE_ERROR:
469
- details = plupload.sprintf(_("%s already present in the queue."), err.file.name);
470
- break;
471
-
472
- case self.FILE_COUNT_ERROR:
473
- details = plupload.sprintf(_("Upload element accepts only %d file(s) at a time. Extra files were stripped."), up.getOption('filters').max_file_count || 0);
474
- break;
475
-
476
- case plupload.IMAGE_FORMAT_ERROR :
477
- details = _("Image format either wrong or not supported.");
478
- break;
479
-
480
- case plupload.IMAGE_MEMORY_ERROR :
481
- details = _("Runtime ran out of available memory.");
482
- break;
483
-
484
- /* // This needs a review
485
- case plupload.IMAGE_DIMENSIONS_ERROR :
486
- details = plupload.sprintf(_('Resoultion out of boundaries! <b>%s</b> runtime supports images only up to %wx%hpx.'), up.runtime, up.features.maxWidth, up.features.maxHeight);
487
- break; */
488
-
489
- case plupload.HTTP_ERROR:
490
- details = _("Upload URL might be wrong or doesn't exist.");
491
- break;
492
- }
493
-
494
- message += " <br /><i>" + details + "</i>";
495
-
496
- self._trigger('error', null, { up: up, error: err } );
497
-
498
- // do not show UI if no runtime can be initialized
499
- if (err.code === plupload.INIT_ERROR) {
500
- setTimeout(function() {
501
- self.destroy();
502
- }, 1);
503
- } else {
504
- self.notify('error', message);
505
- }
506
- });
507
-
508
-
509
- uploader.bind('PostInit', function(up) {
510
- // all buttons are optional, so they can be disabled and hidden
511
- if (!self.options.buttons.browse) {
512
- self.browse_button.button('disable').hide();
513
- up.disableBrowse(true);
514
- } else {
515
- self.browse_button.button('enable');
516
- }
517
-
518
- if (!self.options.buttons.start) {
519
- self.start_button.button('disable').hide();
520
- }
521
-
522
- if (!self.options.buttons.stop) {
523
- self.stop_button.button('disable').hide();
524
- }
525
-
526
- if (!self.options.unique_names && self.options.rename) {
527
- self._enableRenaming();
528
- }
529
-
530
- if (self.options.dragdrop && up.features.dragdrop) {
531
- self.filelist.parent().addClass('plupload_dropbox');
532
- }
533
-
534
- self._enableViewSwitcher();
535
-
536
- self.start_button.click(function(e) {
537
- if (!$(this).button('option', 'disabled')) {
538
- self.start();
539
- }
540
- e.preventDefault();
541
- });
542
-
543
- self.stop_button.click(function(e) {
544
- self.stop();
545
- e.preventDefault();
546
- });
547
-
548
- self._trigger('ready', null, { up: up });
549
- });
550
-
551
- // uploader internal events must run first
552
- uploader.init();
553
-
554
- uploader.bind('FileFiltered', function(up, file) {
555
- self._addFiles(file);
556
- });
557
-
558
- uploader.bind('FilesAdded', function(up, files) {
559
- self._trigger('selected', null, { up: up, files: files } );
560
-
561
- // re-enable sortable
562
- if (self.options.sortable && $.ui.sortable) {
563
- self._enableSortingList();
564
- }
565
-
566
- self._trigger('updatelist', null, { filelist: self.filelist });
567
-
568
- if (self.options.autostart) {
569
- // set a little delay to make sure that QueueChanged triggered by the core has time to complete
570
- setTimeout(function() {
571
- self.start();
572
- }, 10);
573
- }
574
- });
575
-
576
- uploader.bind('FilesRemoved', function(up, files) {
577
- // destroy sortable if enabled
578
- if ($.ui.sortable && self.options.sortable) {
579
- $('tbody', self.filelist).sortable('destroy');
580
- }
581
-
582
- $.each(files, function(i, file) {
583
- $('#' + file.id).toggle("highlight", function() {
584
- $(this).remove();
585
- });
586
- });
587
-
588
- if (up.files.length) {
589
- // re-initialize sortable
590
- if (self.options.sortable && $.ui.sortable) {
591
- self._enableSortingList();
592
- }
593
- }
594
-
595
- self._trigger('updatelist', null, { filelist: self.filelist });
596
- self._trigger('removed', null, { up: up, files: files } );
597
- });
598
-
599
- uploader.bind('QueueChanged', function() {
600
- self._handleState();
601
- });
602
-
603
- uploader.bind('StateChanged', function(up) {
604
- self._handleState();
605
- if (plupload.STARTED === up.state) {
606
- self._trigger('started', null, { up: this.uploader });
607
- } else if (plupload.STOPPED === up.state) {
608
- self._trigger('stopped', null, { up: this.uploader });
609
- }
610
- });
611
-
612
- uploader.bind('UploadFile', function(up, file) {
613
- self._handleFileStatus(file);
614
- });
615
-
616
- uploader.bind('FileUploaded', function(up, file, result) {
617
- self._handleFileStatus(file);
618
- self._trigger('uploaded', null, { up: up, file: file, result: result } );
619
- });
620
-
621
- uploader.bind('UploadProgress', function(up, file) {
622
- self._handleFileStatus(file);
623
- self._updateTotalProgress();
624
- self._trigger('progress', null, { up: up, file: file } );
625
- });
626
-
627
- uploader.bind('UploadComplete', function(up, files) {
628
- self._addFormFields();
629
- self._trigger('complete', null, { up: up, files: files } );
630
- });
631
- },
632
-
633
-
634
- _setOption: function(key, value) {
635
- var self = this;
636
-
637
- if (key == 'buttons' && typeof(value) == 'object') {
638
- value = $.extend(self.options.buttons, value);
639
-
640
- if (!value.browse) {
641
- self.browse_button.button('disable').hide();
642
- self.uploader.disableBrowse(true);
643
- } else {
644
- self.browse_button.button('enable').show();
645
- self.uploader.disableBrowse(false);
646
- }
647
-
648
- if (!value.start) {
649
- self.start_button.button('disable').hide();
650
- } else {
651
- self.start_button.button('enable').show();
652
- }
653
-
654
- if (!value.stop) {
655
- self.stop_button.button('disable').hide();
656
- } else {
657
- self.start_button.button('enable').show();
658
- }
659
- }
660
-
661
- self.uploader.setOption(key, value);
662
- },
663
-
664
-
665
- /**
666
- Start upload. Triggers `start` event.
667
-
668
- @method start
669
- */
670
- start: function() {
671
- this.uploader.start();
672
- },
673
-
674
-
675
- /**
676
- Stop upload. Triggers `stop` event.
677
-
678
- @method stop
679
- */
680
- stop: function() {
681
- this.uploader.stop();
682
- },
683
-
684
-
685
- /**
686
- Enable browse button.
687
-
688
- @method enable
689
- */
690
- enable: function() {
691
- this.browse_button.button('enable');
692
- this.uploader.disableBrowse(false);
693
- },
694
-
695
-
696
- /**
697
- Disable browse button.
698
-
699
- @method disable
700
- */
701
- disable: function() {
702
- this.browse_button.button('disable');
703
- this.uploader.disableBrowse(true);
704
- },
705
-
706
-
707
- /**
708
- Retrieve file by its unique id.
709
-
710
- @method getFile
711
- @param {String} id Unique id of the file
712
- @return {plupload.File}
713
- */
714
- getFile: function(id) {
715
- var file;
716
-
717
- if (typeof id === 'number') {
718
- file = this.uploader.files[id];
719
- } else {
720
- file = this.uploader.getFile(id);
721
- }
722
- return file;
723
- },
724
-
725
- /**
726
- Return array of files currently in the queue.
727
-
728
- @method getFiles
729
- @return {Array} Array of files in the queue represented by plupload.File objects
730
- */
731
- getFiles: function() {
732
- return this.uploader.files;
733
- },
734
-
735
-
736
- /**
737
- Remove the file from the queue.
738
-
739
- @method removeFile
740
- @param {plupload.File|String} file File to remove, might be specified directly or by its unique id
741
- */
742
- removeFile: function(file) {
743
- if (plupload.typeOf(file) === 'string') {
744
- file = this.getFile(file);
745
- }
746
- this.uploader.removeFile(file);
747
- },
748
-
749
-
750
- /**
751
- Clear the file queue.
752
-
753
- @method clearQueue
754
- */
755
- clearQueue: function() {
756
- this.uploader.splice();
757
- },
758
-
759
-
760
- /**
761
- Retrieve internal plupload.Uploader object (usually not required).
762
-
763
- @method getUploader
764
- @return {plupload.Uploader}
765
- */
766
- getUploader: function() {
767
- return this.uploader;
768
- },
769
-
770
-
771
- /**
772
- Trigger refresh procedure, specifically browse_button re-measure and re-position operations.
773
- Might get handy, when UI Widget is placed within the popup, that is constantly hidden and shown
774
- again - without calling this method after each show operation, dialog trigger might get displaced
775
- and disfunctional.
776
-
777
- @method refresh
778
- */
779
- refresh: function() {
780
- this.uploader.refresh();
781
- },
782
-
783
-
784
- /**
785
- Display a message in notification area.
786
-
787
- @method notify
788
- @param {Enum} type Type of the message, either `error` or `info`
789
- @param {String} message The text message to display.
790
- */
791
- notify: function(type, message) {
792
- var popup = $(
793
- '<div class="plupload_message">' +
794
- '<span class="plupload_message_close ui-icon ui-icon-circle-close" title="'+_('Close')+'"></span>' +
795
- '<p><span class="ui-icon"></span>' + message + '</p>' +
796
- '</div>'
797
- );
798
-
799
- popup
800
- .addClass('ui-state-' + (type === 'error' ? 'error' : 'highlight'))
801
- .find('p .ui-icon')
802
- .addClass('ui-icon-' + (type === 'error' ? 'alert' : 'info'))
803
- .end()
804
- .find('.plupload_message_close')
805
- .click(function() {
806
- popup.remove();
807
- })
808
- .end();
809
-
810
- $('.plupload_header', this.container).append(popup);
811
- },
812
-
813
-
814
- /**
815
- Destroy the widget, the uploader, free associated resources and bring back original html.
816
-
817
- @method destroy
818
- */
819
- destroy: function() {
820
- // destroy uploader instance
821
- this.uploader.destroy();
822
-
823
- // unbind all button events
824
- $('.plupload_button', this.element).unbind();
825
-
826
- // destroy buttons
827
- if ($.ui.button) {
828
- $('.plupload_add, .plupload_start, .plupload_stop', this.container)
829
- .button('destroy');
830
- }
831
-
832
- // destroy progressbar
833
- if ($.ui.progressbar) {
834
- this.progressbar.progressbar('destroy');
835
- }
836
-
837
- // destroy sortable behavior
838
- if ($.ui.sortable && this.options.sortable) {
839
- $('tbody', this.filelist).sortable('destroy');
840
- }
841
-
842
- // restore the elements initial state
843
- this.element
844
- .empty()
845
- .html(this.contents_bak);
846
- this.contents_bak = '';
847
-
848
- $.Widget.prototype.destroy.apply(this);
849
- },
850
-
851
-
852
- _handleState: function() {
853
- var up = this.uploader
854
- , filesPending = up.files.length - (up.total.uploaded + up.total.failed)
855
- , maxCount = up.getOption('filters').max_file_count || 0
856
- ;
857
-
858
- if (plupload.STARTED === up.state) {
859
- $([])
860
- .add(this.stop_button)
861
- .add('.plupload_started')
862
- .removeClass('plupload_hidden');
863
-
864
- this.start_button.button('disable');
865
-
866
- if (!this.options.multiple_queues) {
867
- this.browse_button.button('disable');
868
- up.disableBrowse();
869
- }
870
-
871
- $('.plupload_upload_status', this.element).html(plupload.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
872
- $('.plupload_header_content', this.element).addClass('plupload_header_content_bw');
873
- }
874
- else if (plupload.STOPPED === up.state) {
875
- $([])
876
- .add(this.stop_button)
877
- .add('.plupload_started')
878
- .addClass('plupload_hidden');
879
-
880
- if (filesPending) {
881
- this.start_button.button('enable');
882
- } else {
883
- this.start_button.button('disable');
884
- }
885
-
886
- if (this.options.multiple_queues) {
887
- $('.plupload_header_content', this.element).removeClass('plupload_header_content_bw');
888
- }
889
-
890
- // if max_file_count defined, only that many files can be queued at once
891
- if (this.options.multiple_queues && maxCount && maxCount > filesPending) {
892
- this.browse_button.button('enable');
893
- up.disableBrowse(false);
894
- }
895
-
896
- this._updateTotalProgress();
897
- }
898
-
899
- if (up.total.queued === 0) {
900
- $('.ui-button-text', this.browse_button).html(_('Add Files'));
901
- } else {
902
- $('.ui-button-text', this.browse_button).html(plupload.sprintf(_('%d files queued'), up.total.queued));
903
- }
904
-
905
- up.refresh();
906
- },
907
-
908
-
909
- _handleFileStatus: function(file) {
910
- var $file = $('#' + file.id), actionClass, iconClass;
911
-
912
- // since this method might be called asynchronously, file row might not yet be rendered
913
- if (!$file.length) {
914
- return;
915
- }
916
-
917
- switch (file.status) {
918
- case plupload.DONE:
919
- actionClass = 'plupload_done';
920
- iconClass = 'plupload_action_icon ui-icon ui-icon-circle-check';
921
- break;
922
-
923
- case plupload.FAILED:
924
- actionClass = 'ui-state-error plupload_failed';
925
- iconClass = 'plupload_action_icon ui-icon ui-icon-alert';
926
- break;
927
-
928
- case plupload.QUEUED:
929
- actionClass = 'plupload_delete';
930
- iconClass = 'plupload_action_icon ui-icon ui-icon-circle-minus';
931
- break;
932
-
933
- case plupload.UPLOADING:
934
- actionClass = 'ui-state-highlight plupload_uploading';
935
- iconClass = 'plupload_action_icon ui-icon ui-icon-circle-arrow-w';
936
-
937
- // scroll uploading file into the view if its bottom boundary is out of it
938
- var scroller = $('.plupload_scroll', this.container)
939
- , scrollTop = scroller.scrollTop()
940
- , scrollerHeight = scroller.height()
941
- , rowOffset = $file.position().top + $file.height()
942
- ;
943
-
944
- if (scrollerHeight < rowOffset) {
945
- scroller.scrollTop(scrollTop + rowOffset - scrollerHeight);
946
- }
947
-
948
- // Set file specific progress
949
- $file
950
- .find('.plupload_file_percent')
951
- .html(file.percent + '%')
952
- .end()
953
- .find('.plupload_file_progress')
954
- .css('width', file.percent + '%')
955
- .end()
956
- .find('.plupload_file_size')
957
- .html(plupload.formatSize(file.size));
958
- break;
959
- }
960
- actionClass += ' ui-state-default plupload_file';
961
-
962
- $file
963
- .attr('class', actionClass)
964
- .find('.plupload_action_icon')
965
- .attr('class', iconClass);
966
- },
967
-
968
-
969
- _updateTotalProgress: function() {
970
- var up = this.uploader;
971
-
972
- // Scroll to end of file list
973
- this.filelist[0].scrollTop = this.filelist[0].scrollHeight;
974
-
975
- this.progressbar.progressbar('value', up.total.percent);
976
-
977
- this.element
978
- .find('.plupload_total_status')
979
- .html(up.total.percent + '%')
980
- .end()
981
- .find('.plupload_total_file_size')
982
- .html(plupload.formatSize(up.total.size))
983
- .end()
984
- .find('.plupload_upload_status')
985
- .html(plupload.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
986
- },
987
-
988
-
989
- _displayThumbs: function() {
990
- var self = this
991
- , tw, th // thumb width/height
992
- , cols
993
- , num = 0 // number of simultaneously visible thumbs
994
- , thumbs = [] // array of thumbs to preload at any given moment
995
- , loading = false
996
- ;
997
-
998
- if (!this.options.views.thumbs) {
999
- return;
1000
- }
1001
-
1002
-
1003
- function onLast(el, eventName, cb) {
1004
- var timer;
1005
-
1006
- el.on(eventName, function() {
1007
- clearTimeout(timer);
1008
- timer = setTimeout(function() {
1009
- clearTimeout(timer);
1010
- cb();
1011
- }, 300);
1012
- });
1013
- }
1014
-
1015
-
1016
- // calculate number of simultaneously visible thumbs
1017
- function measure() {
1018
- if (!tw || !th) {
1019
- var wrapper = $('.plupload_file:eq(0)', self.filelist);
1020
- tw = wrapper.outerWidth(true);
1021
- th = wrapper.outerHeight(true);
1022
- }
1023
-
1024
- var aw = self.content.width(), ah = self.content.height();
1025
- cols = Math.floor(aw / tw);
1026
- num = cols * (Math.ceil(ah / th) + 1);
1027
- }
1028
-
1029
-
1030
- function pickThumbsToLoad() {
1031
- // calculate index of virst visible thumb
1032
- var startIdx = Math.floor(self.content.scrollTop() / th) * cols;
1033
- // get potentially visible thumbs that are not yet visible
1034
- thumbs = $('.plupload_file .plupload_file_thumb', self.filelist)
1035
- .slice(startIdx, startIdx + num)
1036
- .filter('.plupload_thumb_toload')
1037
- .get();
1038
- }
1039
-
1040
-
1041
- function init() {
1042
- function mpl() { // measure, pick, load
1043
- if (self.view_mode !== 'thumbs') {
1044
- return;
1045
- }
1046
- measure();
1047
- pickThumbsToLoad();
1048
- lazyLoad();
1049
- }
1050
-
1051
- if ($.fn.resizable) {
1052
- onLast(self.container, 'resize', mpl);
1053
- }
1054
-
1055
- onLast(self.window, 'resize', mpl);
1056
- onLast(self.content, 'scroll', mpl);
1057
-
1058
- self.element.on('viewchanged selected', mpl);
1059
-
1060
- mpl();
1061
- }
1062
-
1063
-
1064
- function preloadThumb(file, cb) {
1065
- var img = new o.image.Image();
1066
- var resolveUrl = o.core.utils.Url.resolveUrl;
1067
-
1068
- img.onload = function() {
1069
- var thumb = $('#' + file.id + ' .plupload_file_thumb', self.filelist);
1070
- this.embed(thumb[0], {
1071
- width: self.options.thumb_width,
1072
- height: self.options.thumb_height,
1073
- crop: true,
1074
- fit: true,
1075
- preserveHeaders: false,
1076
- swf_url: resolveUrl(self.options.flash_swf_url),
1077
- xap_url: resolveUrl(self.options.silverlight_xap_url)
1078
- });
1079
- };
1080
-
1081
- img.bind("embedded error", function(e) {
1082
- $('#' + file.id, self.filelist)
1083
- .find('.plupload_file_thumb')
1084
- .removeClass('plupload_thumb_loading')
1085
- .addClass('plupload_thumb_' + e.type)
1086
- ;
1087
- this.destroy();
1088
- setTimeout(cb, 1); // detach, otherwise ui might hang (in SilverLight for example)
1089
- });
1090
-
1091
- $('#' + file.id, self.filelist)
1092
- .find('.plupload_file_thumb')
1093
- .removeClass('plupload_thumb_toload')
1094
- .addClass('plupload_thumb_loading')
1095
- ;
1096
- img.load(file.getSource());
1097
- }
1098
-
1099
-
1100
- function lazyLoad() {
1101
- if (self.view_mode !== 'thumbs' || loading) {
1102
- return;
1103
- }
1104
-
1105
- pickThumbsToLoad();
1106
- if (!thumbs.length) {
1107
- return;
1108
- }
1109
-
1110
- loading = true;
1111
-
1112
- preloadThumb(self.getFile($(thumbs.shift()).closest('.plupload_file').attr('id')), function() {
1113
- loading = false;
1114
- lazyLoad();
1115
- });
1116
- }
1117
-
1118
- // this has to run only once to measure structures and bind listeners
1119
- this.element.on('selected', function onselected() {
1120
- self.element.off('selected', onselected);
1121
- init();
1122
- });
1123
- },
1124
-
1125
-
1126
- _addFiles: function(files) {
1127
- var self = this, file_html, html = '';
1128
-
1129
- file_html = '<li class="plupload_file ui-state-default plupload_delete" id="{id}" style="width:{thumb_width}px;">' +
1130
- '<div class="plupload_file_thumb plupload_thumb_toload" style="width: {thumb_width}px; height: {thumb_height}px;">' +
1131
- '<div class="plupload_file_dummy ui-widget-content" style="line-height: {thumb_height}px;"><span class="ui-state-disabled">{ext} </span></div>' +
1132
- '</div>' +
1133
- '<div class="plupload_file_status">' +
1134
- '<div class="plupload_file_progress ui-widget-header" style="width: 0%"> </div>' +
1135
- '<span class="plupload_file_percent">{percent} </span>' +
1136
- '</div>' +
1137
- '<div class="plupload_file_name" title="{name}">' +
1138
- '<span class="plupload_file_name_wrapper">{name} </span>' +
1139
- '</div>' +
1140
- '<div class="plupload_file_action">' +
1141
- '<div class="plupload_action_icon ui-icon ui-icon-circle-minus"> </div>' +
1142
- '</div>' +
1143
- '<div class="plupload_file_size">{size} </div>' +
1144
- '<div class="plupload_file_fields"> </div>' +
1145
- '</li>';
1146
-
1147
- if (plupload.typeOf(files) !== 'array') {
1148
- files = [files];
1149
- }
1150
-
1151
- $.each(files, function(i, file) {
1152
- var ext = o.core.utils.Mime.getFileExtension(file.name) || 'none';
1153
-
1154
- html += file_html.replace(/\{(\w+)\}/g, function($0, $1) {
1155
- switch ($1) {
1156
- case 'thumb_width':
1157
- case 'thumb_height':
1158
- return self.options[$1];
1159
-
1160
- case 'size':
1161
- return plupload.formatSize(file.size);
1162
-
1163
- case 'ext':
1164
- return ext;
1165
-
1166
- default:
1167
- return file[$1] || '';
1168
- }
1169
- });
1170
- });
1171
-
1172
- self.filelist.append(html);
1173
- },
1174
-
1175
-
1176
- _addFormFields: function() {
1177
- var self = this;
1178
-
1179
- // re-add from fresh
1180
- $('.plupload_file_fields', this.filelist).html('');
1181
-
1182
- plupload.each(this.uploader.files, function(file, count) {
1183
- var fields = ''
1184
- , id = self.id + '_' + count
1185
- ;
1186
-
1187
- if (file.target_name) {
1188
- fields += '<input type="hidden" name="' + id + '_tmpname" value="'+plupload.xmlEncode(file.target_name)+'" />';
1189
- }
1190
- fields += '<input type="hidden" name="' + id + '_name" value="'+plupload.xmlEncode(file.name)+'" />';
1191
- fields += '<input type="hidden" name="' + id + '_status" value="' + (file.status === plupload.DONE ? 'done' : 'failed') + '" />';
1192
-
1193
- $('#' + file.id).find('.plupload_file_fields').html(fields);
1194
- });
1195
-
1196
- this.counter.val(this.uploader.files.length);
1197
- },
1198
-
1199
-
1200
- _viewChanged: function(view) {
1201
- // update or write a new cookie
1202
- if (this.options.views.remember && $.cookie) {
1203
- $.cookie('plupload_ui_view', view, { expires: 7, path: '/' });
1204
- }
1205
-
1206
- // ugly fix for IE6 - make content area stretchable
1207
- if (plupload.ua.browser === 'IE' && plupload.ua.version < 7) {
1208
- this.content.attr('style', 'height:expression(document.getElementById("' + this.id + '_container' + '").clientHeight - ' + (view === 'list' ? 132 : 102) + ')');
1209
- }
1210
-
1211
- this.container.removeClass('plupload_view_list plupload_view_thumbs').addClass('plupload_view_' + view);
1212
- this.view_mode = view;
1213
- this._trigger('viewchanged', null, { view: view });
1214
- },
1215
-
1216
-
1217
- _enableViewSwitcher: function() {
1218
- var self = this
1219
- , view
1220
- , switcher = $('.plupload_view_switch', this.container)
1221
- , buttons
1222
- , button
1223
- ;
1224
-
1225
- plupload.each(['list', 'thumbs'], function(view) {
1226
- if (!self.options.views[view]) {
1227
- switcher.find('[for="' + self.id + '_view_' + view + '"], #'+ self.id +'_view_' + view).remove();
1228
- }
1229
- });
1230
-
1231
- // check if any visible left
1232
- buttons = switcher.find('.plupload_button');
1233
-
1234
- if (buttons.length === 1) {
1235
- switcher.hide();
1236
- view = buttons.eq(0).data('view');
1237
- this._viewChanged(view);
1238
- } else if ($.ui.button && buttons.length > 1) {
1239
- if (this.options.views.remember && $.cookie) {
1240
- view = $.cookie('plupload_ui_view');
1241
- }
1242
-
1243
- // if wierd case, bail out to default
1244
- if (!~plupload.inArray(view, ['list', 'thumbs'])) {
1245
- view = this.options.views.active;
1246
- }
1247
-
1248
- switcher
1249
- .show()
1250
- .buttonset()
1251
- .find('.ui-button')
1252
- .click(function(e) {
1253
- view = $(this).data('view');
1254
- self._viewChanged(view);
1255
- e.preventDefault(); // avoid auto scrolling to widget in IE and FF (see #850)
1256
- });
1257
-
1258
- // if view not active - happens when switcher wasn't clicked manually
1259
- button = switcher.find('[for="' + self.id + '_view_'+view+'"]');
1260
- if (button.length) {
1261
- button.trigger('click');
1262
- }
1263
- } else {
1264
- switcher.show();
1265
- this._viewChanged(this.options.views.active);
1266
- }
1267
-
1268
- // initialize thumb viewer if requested
1269
- if (this.options.views.thumbs) {
1270
- this._displayThumbs();
1271
- }
1272
- },
1273
-
1274
-
1275
- _enableRenaming: function() {
1276
- var self = this;
1277
-
1278
- this.filelist.dblclick(function(e) {
1279
- var nameInput, fileContainer, file, parts, name, ext = "";
1280
- var nameSpan = $(e.target);
1281
-
1282
- if (!nameSpan.hasClass('plupload_file_name_wrapper')) {
1283
- return;
1284
- }
1285
-
1286
- fileContainer = nameSpan.closest('.plupload_file');
1287
- if (!fileContainer.hasClass('plupload_delete')) {
1288
- return;
1289
- }
1290
-
1291
- // Get file name and split out name and extension
1292
- file = self.uploader.getFile(fileContainer[0].id);
1293
- name = file.name;
1294
- parts = /^(.+)(\.[^.]+)$/.exec(name);
1295
- if (parts) {
1296
- name = parts[1];
1297
- ext = parts[2];
1298
- }
1299
-
1300
- // Display input element
1301
- nameInput = $('<input class="plupload_file_rename" type="text" />').width(nameSpan.width()).insertAfter(nameSpan.hide());
1302
- nameInput.val(name).blur(function() {
1303
- nameSpan.show().parent().scrollLeft(0).end().next().remove();
1304
- }).keydown(function(e) {
1305
- var nameInput = $(this);
1306
-
1307
- if ($.inArray(e.keyCode, [13, 27]) !== -1) {
1308
- e.preventDefault();
1309
-
1310
- // Rename file and glue extension back on
1311
- if (e.keyCode === 13) {
1312
- file.name = nameInput.val() + ext;
1313
- nameSpan.html(file.name);
1314
- }
1315
- nameInput.blur();
1316
- }
1317
- })[0].focus();
1318
- });
1319
- },
1320
-
1321
-
1322
- _enableSortingList: function() {
1323
- var self = this;
1324
-
1325
- if ($('.plupload_file', this.filelist).length < 2) {
1326
- return;
1327
- }
1328
-
1329
- // destroy sortable if enabled
1330
- $('tbody', this.filelist).sortable('destroy');
1331
-
1332
- // enable
1333
- this.filelist.sortable({
1334
- items: '.plupload_delete',
1335
-
1336
- cancel: 'object, .plupload_clearer',
1337
-
1338
- stop: function() {
1339
- var files = [];
1340
-
1341
- $.each($(this).sortable('toArray'), function(i, id) {
1342
- files[files.length] = self.uploader.getFile(id);
1343
- });
1344
-
1345
- files.unshift(files.length);
1346
- files.unshift(0);
1347
-
1348
- // re-populate files array
1349
- Array.prototype.splice.apply(self.uploader.files, files);
1350
- }
1351
- });
1352
- }
1353
- });
1354
-
1355
- } (window, document, plupload, moxie, jQuery));
17
  * jquery.ui.sortable.js
18
  */
19
 
20
+ /* global jQuery:true */
21
 
22
  /**
23
+ jQuery UI based implementation of the Plupload API - multi-runtime file uploading API.
24
+
25
+ To use the widget you must include _jQuery_ and _jQuery UI_ bundle (including `ui.core`, `ui.widget`, `ui.button`,
26
+ `ui.progressbar` and `ui.sortable`).
27
+
28
+ In general the widget is designed the way that you do not usually need to do anything to it after you instantiate it.
29
+ But! You still can intervenue, to some extent, in case you need to. Although, due to the fact that widget is based on
30
+ _jQuery UI_ widget factory, there are some specifics. See examples below for more details.
31
+
32
+ @example
33
+ <!-- Instantiating: -->
34
+ <div id="uploader">
35
+ <p>Your browser doesn't have Flash, Silverlight or HTML5 support.</p>
36
+ </div>
37
+
38
+ <script>
39
+ $('#uploader').plupload({
40
+ url : '../upload.php',
41
+ filters : [
42
+ {title : "Image files", extensions : "jpg,gif,png"}
43
+ ],
44
+ rename: true,
45
+ sortable: true,
46
+ flash_swf_url : '../../js/Moxie.swf',
47
+ silverlight_xap_url : '../../js/Moxie.xap',
48
+ });
49
+ </script>
50
+
51
+ @example
52
+ // Invoking methods:
53
+ $('#uploader').plupload(options);
54
+
55
+ // Display welcome message in the notification area
56
+ $('#uploader').plupload('notify', 'info', "This might be obvious, but you need to click 'Add Files' to add some files.");
57
+
58
+ @example
59
+ // Subscribing to the events...
60
+ // ... on initialization:
61
+ $('#uploader').plupload({
62
+ ...
63
+ viewchanged: function(event, args) {
64
+ // stuff ...
65
+ }
66
+ });
67
+ // ... or after initialization
68
+ $('#uploader').on("viewchanged", function(event, args) {
69
+ // stuff ...
70
+ });
71
+
72
+ @class UI.Plupload
73
+ @constructor
74
+ @param {Object} settings For detailed information about each option check documentation.
75
+ @param {String} settings.url URL of the server-side upload handler.
76
+ @param {Number|String} [settings.chunk_size=0] Chunk size in bytes to slice the file into. Shorcuts with b, kb, mb, gb, tb suffixes also supported. `e.g. 204800 or "204800b" or "200kb"`. By default - disabled.
77
+ @param {String} [settings.file_data_name="file"] Name for the file field in Multipart formated message.
78
+ @param {Object} [settings.filters={}] Set of file type filters.
79
+ @param {Array} [settings.filters.mime_types=[]] List of file types to accept, each one defined by title and list of extensions. `e.g. {title : "Image files", extensions : "jpg,jpeg,gif,png"}`. Dispatches `plupload.FILE_EXTENSION_ERROR`
80
+ @param {String|Number} [settings.filters.max_file_size=0] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
81
+ @param {Boolean} [settings.filters.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
82
+ @param {Number} [settings.filters.max_file_count=0] Limit the number of files that can reside in the queue at the same time (default is 0 - no limit).
83
+ @param {String} [settings.flash_swf_url] URL of the Flash swf.
84
+ @param {Object} [settings.headers] Custom headers to send with the upload. Hash of name/value pairs.
85
+ @param {Number|String} [settings.max_file_size] Maximum file size that the user can pick, in bytes. Optionally supports b, kb, mb, gb, tb suffixes. `e.g. "10mb" or "1gb"`. By default - not set. Dispatches `plupload.FILE_SIZE_ERROR`.
86
+ @param {Number} [settings.max_retries=0] How many times to retry the chunk or file, before triggering Error event.
87
+ @param {Boolean} [settings.multipart=true] Whether to send file and additional parameters as Multipart formated message.
88
+ @param {Object} [settings.multipart_params] Hash of key/value pairs to send with every file upload.
89
+ @param {Boolean} [settings.multi_selection=true] Enable ability to select multiple files at once in file dialog.
90
+ @param {Boolean} [settings.prevent_duplicates=false] Do not let duplicates into the queue. Dispatches `plupload.FILE_DUPLICATE_ERROR`.
91
+ @param {String|Object} [settings.required_features] Either comma-separated list or hash of required features that chosen runtime should absolutely possess.
92
+ @param {Object} [settings.resize] Enable resizng of images on client-side. Applies to `image/jpeg` and `image/png` only. `e.g. {width : 200, height : 200, quality : 90, crop: true}`
93
+ @param {Number} [settings.resize.width] If image is bigger, it will be resized.
94
+ @param {Number} [settings.resize.height] If image is bigger, it will be resized.
95
+ @param {Number} [settings.resize.quality=90] Compression quality for jpegs (1-100).
96
+ @param {Boolean} [settings.resize.crop=false] Whether to crop images to exact dimensions. By default they will be resized proportionally.
97
+ @param {String} [settings.runtimes="html5,flash,silverlight,html4"] Comma separated list of runtimes, that Plupload will try in turn, moving to the next if previous fails.
98
+ @param {String} [settings.silverlight_xap_url] URL of the Silverlight xap.
99
+ @param {Boolean} [settings.unique_names=false] If true will generate unique filenames for uploaded files.
100
+
101
+ @param {Boolean} [settings.autostart=false] Whether to auto start uploading right after file selection.
102
+ @param {Boolean} [settings.dragdrop=true] Enable ability to add file to the queue by drag'n'dropping them from the desktop.
103
+ @param {Boolean} [settings.rename=false] Enable ability to rename files in the queue.
104
+ @param {Boolean} [settings.sortable=false] Enable ability to sort files in the queue, changing their uploading priority.
105
+ @param {Object} [settings.buttons] Control the visibility of functional buttons.
106
+ @param {Boolean} [settings.buttons.browse=true] Display browse button.
107
+ @param {Boolean} [settings.buttons.start=true] Display start button.
108
+ @param {Boolean} [settings.buttons.stop=true] Display stop button.
109
+ @param {Object} [settings.views] Control various views of the file queue.
110
+ @param {Boolean} [settings.views.list=true] Enable list view.
111
+ @param {Boolean} [settings.views.thumbs=false] Enable thumbs view.
112
+ @param {String} [settings.views.default='list'] Default view.
113
+ @param {Boolean} [settings.views.remember=true] Whether to remember the current view (requires jQuery Cookie plugin).
114
+ @param {Boolean} [settings.multiple_queues=true] Re-activate the widget after each upload procedure.
115
+ */
116
+ ;
117
+ (function (window, document, plupload, o, $) {
118
+
119
+ /**
120
+ Dispatched when the widget is initialized and ready.
121
+
122
+ @event ready
123
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
124
+ */
125
+
126
+ /**
127
+ Dispatched when file dialog is closed.
128
+
129
+ @event selected
130
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
131
+ @param {Array} files Array of selected files represented by plupload.File objects
132
+ */
133
+
134
+ /**
135
+ Dispatched when file dialog is closed.
136
+
137
+ @event removed
138
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
139
+ @param {Array} files Array of removed files represented by plupload.File objects
140
+ */
141
+
142
+ /**
143
+ Dispatched when upload is started.
144
+
145
+ @event started
146
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
147
+ */
148
+
149
+ /**
150
+ Dispatched when upload is stopped.
151
+
152
+ @event stopped
153
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
154
+ */
155
+
156
+ /**
157
+ Dispatched during the upload process.
158
+
159
+ @event progress
160
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
161
+ @param {plupload.File} file File that is being uploaded (includes loaded and percent properties among others).
162
+ @param {Number} size Total file size in bytes.
163
+ @param {Number} loaded Number of bytes uploaded of the files total size.
164
+ @param {Number} percent Number of percentage uploaded of the file.
165
+ */
166
+
167
+ /**
168
+ Dispatched when file is uploaded.
169
+
170
+ @event uploaded
171
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
172
+ @param {plupload.File} file File that was uploaded.
173
+ @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
174
+ */
175
+
176
+ /**
177
+ Dispatched when upload of the whole queue is complete.
178
+
179
+ @event complete
180
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
181
+ @param {Array} files Array of uploaded files represented by plupload.File objects
182
+ */
183
+
184
+ /**
185
+ Dispatched when the view is changed, e.g. from `list` to `thumbs` or vice versa.
186
+
187
+ @event viewchanged
188
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
189
+ @param {String} type Current view type.
190
+ */
191
+
192
+ /**
193
+ Dispatched when error of some kind is detected.
194
+
195
+ @event error
196
+ @param {plupload.Uploader} uploader Uploader instance sending the event.
197
+ @param {String} error Error message.
198
+ @param {plupload.File} file File that was uploaded.
199
+ @param {Enum} status Status constant matching the plupload states QUEUED, UPLOADING, FAILED, DONE.
200
+ */
201
+
202
+ var uploaders = {};
203
+
204
+ function _(str) {
205
+ return plupload.translate(str) || str;
206
+ }
207
+
208
+ function renderUI(obj) {
209
+ obj.id = obj.attr('id');
210
+
211
+ obj.html(
212
+ '<div class="plupload_wrapper">' +
213
+ '<div class="ui-widget-content plupload_container">' +
214
+ '<div class="ui-state-default ui-widget-header plupload_header">' +
215
+ '<div class="plupload_header_content">' +
216
+ '<div class="plupload_logo"> </div>' +
217
+ '<div class="plupload_header_title">' + _("Select files") + '</div>' +
218
+ '<div class="plupload_header_text">' + _("Add files to the upload queue and click the start button.") + '</div>' +
219
+ '<div class="plupload_view_switch">' +
220
+ '<input type="radio" id="' + obj.id + '_view_list" name="view_mode_' + obj.id + '" checked="checked" /><label class="plupload_button" for="' + obj.id + '_view_list" data-view="list">' + _('List') + '</label>' +
221
+ '<input type="radio" id="' + obj.id + '_view_thumbs" name="view_mode_' + obj.id + '" /><label class="plupload_button" for="' + obj.id + '_view_thumbs" data-view="thumbs">' + _('Thumbnails') + '</label>' +
222
+ '</div>' +
223
+ '</div>' +
224
+ '</div>' +
225
+ '<table class="plupload_filelist plupload_filelist_header ui-widget-header">' +
226
+ '<tr>' +
227
+ '<td class="plupload_cell plupload_file_name">' + _('Filename') + '</td>' +
228
+ '<td class="plupload_cell plupload_file_status">' + _('Status') + '</td>' +
229
+ '<td class="plupload_cell plupload_file_size">' + _('Size') + '</td>' +
230
+ '<td class="plupload_cell plupload_file_action">&nbsp;</td>' +
231
+ '</tr>' +
232
+ '</table>' +
233
+ '<div class="plupload_content">' +
234
+ '<div class="plupload_droptext">' + _("Drag files here.") + '</div>' +
235
+ '<ul class="plupload_filelist_content"> </ul>' +
236
+ '<div class="plupload_clearer">&nbsp;</div>' +
237
+ '</div>' +
238
+ '<table class="plupload_filelist plupload_filelist_footer ui-widget-header">' +
239
+ '<tr>' +
240
+ '<td class="plupload_cell plupload_file_name">' +
241
+ '<div class="plupload_buttons"><!-- Visible -->' +
242
+ '<a class="plupload_button plupload_add">' + _("Add Files") + '</a>&nbsp;' +
243
+ '<a class="plupload_button plupload_start">' + _("Start Upload") + '</a>&nbsp;' +
244
+ '<a class="plupload_button plupload_stop plupload_hidden">' + _("Stop Upload") + '</a>&nbsp;' +
245
+ '</div>' +
246
+ '<div class="plupload_started plupload_hidden"><!-- Hidden -->' +
247
+ '<div class="plupload_progress plupload_right">' +
248
+ '<div class="plupload_progress_container"></div>' +
249
+ '</div>' +
250
+ '<div class="plupload_cell plupload_upload_status"></div>' +
251
+ '<div class="plupload_clearer">&nbsp;</div>' +
252
+ '</div>' +
253
+ '</td>' +
254
+ '<td class="plupload_file_status"><span class="plupload_total_status">0%</span></td>' +
255
+ '<td class="plupload_file_size"><span class="plupload_total_file_size">0 kb</span></td>' +
256
+ '<td class="plupload_file_action"></td>' +
257
+ '</tr>' +
258
+ '</table>' +
259
+ '</div>' +
260
+ '<input class="plupload_count" value="0" type="hidden">' +
261
+ '</div>'
262
+ );
263
+ }
264
+
265
+
266
+ $.widget("ui.plupload", {
267
+
268
+ widgetEventPrefix: '',
269
+
270
+ contents_bak: '',
271
+
272
+ options: {
273
+ browse_button_hover: 'ui-state-hover',
274
+ browse_button_active: 'ui-state-active',
275
+
276
+ filters: {},
277
+
278
+ // widget specific
279
+ buttons: {
280
+ browse: true,
281
+ start: true,
282
+ stop: true
283
+ },
284
+
285
+ views: {
286
+ list: true,
287
+ thumbs: false,
288
+ active: 'list',
289
+ remember: true // requires: https://github.com/carhartl/jquery-cookie, otherwise disabled even if set to true
290
+ },
291
+
292
+ thumb_width: 100,
293
+ thumb_height: 60,
294
+
295
+ multiple_queues: true, // re-use widget by default
296
+ dragdrop: true,
297
+ autostart: false,
298
+ sortable: false,
299
+ rename: false
300
+ },
301
+
302
+ FILE_COUNT_ERROR: -9001,
303
+
304
+ _create: function () {
305
+ var id = this.element.attr('id');
306
+ if (!id) {
307
+ id = plupload.guid();
308
+ this.element.attr('id', id);
309
+ }
310
+ this.id = id;
311
+
312
+ // backup the elements initial state
313
+ this.contents_bak = this.element.html();
314
+ renderUI(this.element);
315
+
316
+ // container, just in case
317
+ this.container = $('.plupload_container', this.element).attr('id', id + '_container');
318
+
319
+ this.content = $('.plupload_content', this.element);
320
+
321
+ if ($.fn.resizable) {
322
+ this.container.resizable({
323
+ handles: 's',
324
+ minHeight: 300
325
+ });
326
+ }
327
+
328
+ // list of files, may become sortable
329
+ this.filelist = $('.plupload_filelist_content', this.container)
330
+ .attr({
331
+ id: id + '_filelist',
332
+ unselectable: 'on'
333
+ });
334
+
335
+
336
+ // buttons
337
+ this.browse_button = $('.plupload_add', this.container).attr('id', id + '_browse');
338
+ this.start_button = $('.plupload_start', this.container).attr('id', id + '_start');
339
+ this.stop_button = $('.plupload_stop', this.container).attr('id', id + '_stop');
340
+ this.thumbs_switcher = $('#' + id + '_view_thumbs');
341
+ this.list_switcher = $('#' + id + '_view_list');
342
+
343
+ if ($.ui.button) {
344
+ this.browse_button.button({
345
+ icons: {primary: 'ui-icon-circle-plus'},
346
+ disabled: true
347
+ });
348
+
349
+ this.start_button.button({
350
+ icons: {primary: 'ui-icon-circle-arrow-e'},
351
+ disabled: true
352
+ });
353
+
354
+ this.stop_button.button({
355
+ icons: {primary: 'ui-icon-circle-close'}
356
+ });
357
+
358
+ this.list_switcher.button({
359
+ text: false,
360
+ icons: {secondary: "ui-icon-grip-dotted-horizontal"}
361
+ });
362
+
363
+ this.thumbs_switcher.button({
364
+ text: false,
365
+ icons: {secondary: "ui-icon-image"}
366
+ });
367
+ }
368
+
369
+ // progressbar
370
+ this.progressbar = $('.plupload_progress_container', this.container);
371
+
372
+ if ($.ui.progressbar) {
373
+ this.progressbar.progressbar();
374
+ }
375
+
376
+ // counter
377
+ this.counter = $('.plupload_count', this.element)
378
+ .attr({
379
+ id: id + '_count',
380
+ name: id + '_count'
381
+ });
382
+
383
+ // initialize uploader instance
384
+ this._initUploader();
385
+ },
386
+
387
+ _initUploader: function () {
388
+ var self = this
389
+ , id = this.id
390
+ , uploader
391
+ , options = {
392
+ container: id + '_buttons',
393
+ browse_button: id + '_browse'
394
+ }
395
+ ;
396
+
397
+ $('.plupload_buttons', this.element).attr('id', id + '_buttons');
398
+
399
+ if (self.options.dragdrop) {
400
+ this.filelist.parent().attr('id', this.id + '_dropbox');
401
+ options.drop_element = this.id + '_dropbox';
402
+ }
403
+
404
+ this.filelist.on('click', function (e) {
405
+ var me = $(e.target), fileContainer;
406
+ if (me.hasClass('plupload_action_icon')) {
407
+ fileContainer = me.closest('.plupload_file');
408
+ if (fileContainer.hasClass('plupload_delete')) {
409
+ self.removeFile(fileContainer.attr('id'));
410
+ e.preventDefault();
411
+ }
412
+ }
413
+ });
414
+
415
+ uploader = this.uploader = uploaders[id] = new plupload.Uploader($.extend(this.options, options));
416
+
417
+ // retrieve full normalized set of options
418
+ this.options = uploader.getOption();
419
+
420
+ if (self.options.views.thumbs) {
421
+ uploader.settings.required_features.display_media = true;
422
+ }
423
+
424
+ // for backward compatibility
425
+ if (self.options.max_file_count) {
426
+ plupload.extend(uploader.getOption('filters'), {
427
+ max_file_count: self.options.max_file_count
428
+ });
429
+ }
430
+
431
+ plupload.addFileFilter('max_file_count', function (maxCount, file, cb) {
432
+ if (maxCount <= this.files.length - (this.total.uploaded + this.total.failed)) {
433
+ self.browse_button.button('disable');
434
+ this.disableBrowse();
435
+
436
+ this.trigger('Error', {
437
+ code: self.FILE_COUNT_ERROR,
438
+ message: _("File count error."),
439
+ file: file
440
+ });
441
+ cb(false);
442
+ } else {
443
+ cb(true);
444
+ }
445
+ });
446
+
447
+
448
+ uploader.bind('Error', function (up, err) {
449
+ var message, details = "";
450
+
451
+ message = '<strong>' + err.message + '</strong>';
452
+
453
+ switch (err.code) {
454
+ case plupload.FILE_EXTENSION_ERROR:
455
+ details = plupload.sprintf(_("File: %s"), err.file.name);
456
+ break;
457
+
458
+ case plupload.FILE_SIZE_ERROR:
459
+ details = plupload.sprintf(_("File: %s, size: %d, max file size: %d"), err.file.name, plupload.formatSize(err.file.size), plupload.formatSize(plupload.parseSize(up.getOption('filters').max_file_size)));
460
+ break;
461
+
462
+ case plupload.FILE_DUPLICATE_ERROR:
463
+ details = plupload.sprintf(_("%s already present in the queue."), err.file.name);
464
+ break;
465
+
466
+ case self.FILE_COUNT_ERROR:
467
+ details = plupload.sprintf(_("Upload element accepts only %d file(s) at a time. Extra files were stripped."), up.getOption('filters').max_file_count || 0);
468
+ break;
469
+
470
+ case plupload.IMAGE_FORMAT_ERROR :
471
+ details = _("Image format either wrong or not supported.");
472
+ break;
473
+
474
+ case plupload.IMAGE_MEMORY_ERROR :
475
+ details = _("Runtime ran out of available memory.");
476
+ break;
477
+
478
+ /* // This needs a review
479
+ case plupload.IMAGE_DIMENSIONS_ERROR :
480
+ details = plupload.sprintf(_('Resoultion out of boundaries! <b>%s</b> runtime supports images only up to %wx%hpx.'), up.runtime, up.features.maxWidth, up.features.maxHeight);
481
+ break; */
482
+
483
+ case plupload.HTTP_ERROR:
484
+ details = _("Upload URL might be wrong or doesn't exist.");
485
+ break;
486
+ }
487
+
488
+ message += " <br /><i>" + details + "</i>";
489
+
490
+ self._trigger('error', null, {up: up, error: err});
491
+
492
+ // do not show UI if no runtime can be initialized
493
+ if (err.code === plupload.INIT_ERROR) {
494
+ setTimeout(function () {
495
+ self.destroy();
496
+ }, 1);
497
+ } else {
498
+ self.notify('error', message);
499
+ }
500
+ });
501
+
502
+
503
+ uploader.bind('PostInit', function (up) {
504
+ // all buttons are optional, so they can be disabled and hidden
505
+ if (!self.options.buttons.browse) {
506
+ self.browse_button.button('disable').hide();
507
+ up.disableBrowse(true);
508
+ } else {
509
+ self.browse_button.button('enable');
510
+ }
511
+
512
+ if (!self.options.buttons.start) {
513
+ self.start_button.button('disable').hide();
514
+ }
515
+
516
+ if (!self.options.buttons.stop) {
517
+ self.stop_button.button('disable').hide();
518
+ }
519
+
520
+ if (!self.options.unique_names && self.options.rename) {
521
+ self._enableRenaming();
522
+ }
523
+
524
+ if (self.options.dragdrop && up.features.dragdrop) {
525
+ self.filelist.parent().addClass('plupload_dropbox');
526
+ }
527
+
528
+ self._enableViewSwitcher();
529
+
530
+ self.start_button.click(function (e) {
531
+ if (!$(this).button('option', 'disabled')) {
532
+ self.start();
533
+ }
534
+ e.preventDefault();
535
+ });
536
+
537
+ self.stop_button.click(function (e) {
538
+ self.stop();
539
+ e.preventDefault();
540
+ });
541
+
542
+ self._trigger('ready', null, {up: up});
543
+ });
544
+
545
+ // uploader internal events must run first
546
+ uploader.init();
547
+
548
+ uploader.bind('FileFiltered', function (up, file) {
549
+ self._addFiles(file);
550
+ });
551
+
552
+ uploader.bind('FilesAdded', function (up, files) {
553
+ self._trigger('selected', null, {up: up, files: files});
554
+
555
+ // re-enable sortable
556
+ if (self.options.sortable && $.ui.sortable) {
557
+ self._enableSortingList();
558
+ }
559
+
560
+ self._trigger('updatelist', null, {filelist: self.filelist});
561
+
562
+ if (self.options.autostart) {
563
+ // set a little delay to make sure that QueueChanged triggered by the core has time to complete
564
+ setTimeout(function () {
565
+ self.start();
566
+ }, 10);
567
+ }
568
+ });
569
+
570
+ uploader.bind('FilesRemoved', function (up, files) {
571
+ // destroy sortable if enabled
572
+ if ($.ui.sortable && self.options.sortable) {
573
+ $('tbody', self.filelist).sortable('destroy');
574
+ }
575
+
576
+ $.each(files, function (i, file) {
577
+ $('#' + file.id).toggle("highlight", function () {
578
+ $(this).remove();
579
+ });
580
+ });
581
+
582
+ if (up.files.length) {
583
+ // re-initialize sortable
584
+ if (self.options.sortable && $.ui.sortable) {
585
+ self._enableSortingList();
586
+ }
587
+ }
588
+
589
+ self._trigger('updatelist', null, {filelist: self.filelist});
590
+ self._trigger('removed', null, {up: up, files: files});
591
+ });
592
+
593
+ uploader.bind('QueueChanged', function () {
594
+ self._handleState();
595
+ });
596
+
597
+ uploader.bind('StateChanged', function (up) {
598
+ self._handleState();
599
+ if (plupload.STARTED === up.state) {
600
+ self._trigger('started', null, {up: this.uploader});
601
+ } else if (plupload.STOPPED === up.state) {
602
+ self._trigger('stopped', null, {up: this.uploader});
603
+ }
604
+ });
605
+
606
+ uploader.bind('UploadFile', function (up, file) {
607
+ self._handleFileStatus(file);
608
+ });
609
+
610
+ uploader.bind('FileUploaded', function (up, file, result) {
611
+ self._handleFileStatus(file);
612
+ self._trigger('uploaded', null, {up: up, file: file, result: result});
613
+ });
614
+
615
+ uploader.bind('UploadProgress', function (up, file) {
616
+ self._handleFileStatus(file);
617
+ self._updateTotalProgress();
618
+ self._trigger('progress', null, {up: up, file: file});
619
+ });
620
+
621
+ uploader.bind('UploadComplete', function (up, files) {
622
+ self._addFormFields();
623
+ self._trigger('complete', null, {up: up, files: files});
624
+ });
625
+ },
626
+
627
+ _setOption: function (key, value) {
628
+ var self = this;
629
+
630
+ if (key == 'buttons' && typeof (value) == 'object') {
631
+ value = $.extend(self.options.buttons, value);
632
+
633
+ if (!value.browse) {
634
+ self.browse_button.button('disable').hide();
635
+ self.uploader.disableBrowse(true);
636
+ } else {
637
+ self.browse_button.button('enable').show();
638
+ self.uploader.disableBrowse(false);
639
+ }
640
+
641
+ if (!value.start) {
642
+ self.start_button.button('disable').hide();
643
+ } else {
644
+ self.start_button.button('enable').show();
645
+ }
646
+
647
+ if (!value.stop) {
648
+ self.stop_button.button('disable').hide();
649
+ } else {
650
+ self.start_button.button('enable').show();
651
+ }
652
+ }
653
+
654
+ self.uploader.setOption(key, value);
655
+ },
656
+
657
+ /**
658
+ Start upload. Triggers `start` event.
659
+
660
+ @method start
661
+ */
662
+ start: function () {
663
+ this.uploader.start();
664
+ },
665
+
666
+ /**
667
+ Stop upload. Triggers `stop` event.
668
+
669
+ @method stop
670
+ */
671
+ stop: function () {
672
+ this.uploader.stop();
673
+ },
674
+
675
+ /**
676
+ Enable browse button.
677
+
678
+ @method enable
679
+ */
680
+ enable: function () {
681
+ this.browse_button.button('enable');
682
+ this.uploader.disableBrowse(false);
683
+ },
684
+
685
+ /**
686
+ Disable browse button.
687
+
688
+ @method disable
689
+ */
690
+ disable: function () {
691
+ this.browse_button.button('disable');
692
+ this.uploader.disableBrowse(true);
693
+ },
694
+
695
+ /**
696
+ Retrieve file by its unique id.
697
+
698
+ @method getFile
699
+ @param {String} id Unique id of the file
700
+ @return {plupload.File}
701
+ */
702
+ getFile: function (id) {
703
+ var file;
704
+
705
+ if (typeof id === 'number') {
706
+ file = this.uploader.files[id];
707
+ } else {
708
+ file = this.uploader.getFile(id);
709
+ }
710
+ return file;
711
+ },
712
+
713
+ /**
714
+ Return array of files currently in the queue.
715
+
716
+ @method getFiles
717
+ @return {Array} Array of files in the queue represented by plupload.File objects
718
+ */
719
+ getFiles: function () {
720
+ return this.uploader.files;
721
+ },
722
+
723
+ /**
724
+ Remove the file from the queue.
725
+
726
+ @method removeFile
727
+ @param {plupload.File|String} file File to remove, might be specified directly or by its unique id
728
+ */
729
+ removeFile: function (file) {
730
+ if (plupload.typeOf(file) === 'string') {
731
+ file = this.getFile(file);
732
+ }
733
+ this.uploader.removeFile(file);
734
+ },
735
+
736
+ /**
737
+ Clear the file queue.
738
+
739
+ @method clearQueue
740
+ */
741
+ clearQueue: function () {
742
+ this.uploader.splice();
743
+ },
744
+
745
+ /**
746
+ Retrieve internal plupload.Uploader object (usually not required).
747
+
748
+ @method getUploader
749
+ @return {plupload.Uploader}
750
+ */
751
+ getUploader: function () {
752
+ return this.uploader;
753
+ },
754
+
755
+ /**
756
+ Trigger refresh procedure, specifically browse_button re-measure and re-position operations.
757
+ Might get handy, when UI Widget is placed within the popup, that is constantly hidden and shown
758
+ again - without calling this method after each show operation, dialog trigger might get displaced
759
+ and disfunctional.
760
+
761
+ @method refresh
762
+ */
763
+ refresh: function () {
764
+ this.uploader.refresh();
765
+ },
766
+
767
+ /**
768
+ Display a message in notification area.
769
+
770
+ @method notify
771
+ @param {Enum} type Type of the message, either `error` or `info`
772
+ @param {String} message The text message to display.
773
+ */
774
+ notify: function (type, message) {
775
+ var popup = $(
776
+ '<div class="plupload_message">' +
777
+ '<span class="plupload_message_close ui-icon ui-icon-circle-close" title="' + _('Close') + '"></span>' +
778
+ '<p><span class="ui-icon"></span>' + message + '</p>' +
779
+ '</div>'
780
+ );
781
+
782
+ popup
783
+ .addClass('ui-state-' + (type === 'error' ? 'error' : 'highlight'))
784
+ .find('p .ui-icon')
785
+ .addClass('ui-icon-' + (type === 'error' ? 'alert' : 'info'))
786
+ .end()
787
+ .find('.plupload_message_close')
788
+ .click(function () {
789
+ popup.remove();
790
+ })
791
+ .end();
792
+
793
+ $('.plupload_header', this.container).append(popup);
794
+ },
795
+
796
+ /**
797
+ Destroy the widget, the uploader, free associated resources and bring back original html.
798
+
799
+ @method destroy
800
+ */
801
+ destroy: function () {
802
+ // destroy uploader instance
803
+ this.uploader.destroy();
804
+
805
+ // unbind all button events
806
+ $('.plupload_button', this.element).unbind();
807
+
808
+ // destroy buttons
809
+ if ($.ui.button) {
810
+ $('.plupload_add, .plupload_start, .plupload_stop', this.container)
811
+ .button('destroy');
812
+ }
813
+
814
+ // destroy progressbar
815
+ if ($.ui.progressbar) {
816
+ this.progressbar.progressbar('destroy');
817
+ }
818
+
819
+ // destroy sortable behavior
820
+ if ($.ui.sortable && this.options.sortable) {
821
+ $('tbody', this.filelist).sortable('destroy');
822
+ }
823
+
824
+ // restore the elements initial state
825
+ this.element
826
+ .empty()
827
+ .html(this.contents_bak);
828
+ this.contents_bak = '';
829
+
830
+ $.Widget.prototype.destroy.apply(this);
831
+ },
832
+
833
+ _handleState: function () {
834
+ var up = this.uploader
835
+ , filesPending = up.files.length - (up.total.uploaded + up.total.failed)
836
+ , maxCount = up.getOption('filters').max_file_count || 0
837
+ ;
838
+
839
+ if (plupload.STARTED === up.state) {
840
+ $([])
841
+ .add(this.stop_button)
842
+ .add('.plupload_started')
843
+ .removeClass('plupload_hidden');
844
+
845
+ this.start_button.button('disable');
846
+
847
+ if (!this.options.multiple_queues) {
848
+ this.browse_button.button('disable');
849
+ up.disableBrowse();
850
+ }
851
+
852
+ $('.plupload_upload_status', this.element).html(plupload.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
853
+ $('.plupload_header_content', this.element).addClass('plupload_header_content_bw');
854
+ } else if (plupload.STOPPED === up.state) {
855
+ $([])
856
+ .add(this.stop_button)
857
+ .add('.plupload_started')
858
+ .addClass('plupload_hidden');
859
+
860
+ if (filesPending) {
861
+ this.start_button.button('enable');
862
+ } else {
863
+ this.start_button.button('disable');
864
+ }
865
+
866
+ if (this.options.multiple_queues) {
867
+ $('.plupload_header_content', this.element).removeClass('plupload_header_content_bw');
868
+ }
869
+
870
+ // if max_file_count defined, only that many files can be queued at once
871
+ if (this.options.multiple_queues && maxCount && maxCount > filesPending) {
872
+ this.browse_button.button('enable');
873
+ up.disableBrowse(false);
874
+ }
875
+
876
+ this._updateTotalProgress();
877
+ }
878
+
879
+ if (up.total.queued === 0) {
880
+ $('.ui-button-text', this.browse_button).html(_('Add Files'));
881
+ } else {
882
+ $('.ui-button-text', this.browse_button).html(plupload.sprintf(_('%d files queued'), up.total.queued));
883
+ }
884
+
885
+ up.refresh();
886
+ },
887
+
888
+ _handleFileStatus: function (file) {
889
+ var $file = $('#' + file.id), actionClass, iconClass;
890
+
891
+ // since this method might be called asynchronously, file row might not yet be rendered
892
+ if (!$file.length) {
893
+ return;
894
+ }
895
+
896
+ switch (file.status) {
897
+ case plupload.DONE:
898
+ actionClass = 'plupload_done';
899
+ iconClass = 'plupload_action_icon ui-icon ui-icon-circle-check';
900
+ break;
901
+
902
+ case plupload.FAILED:
903
+ actionClass = 'ui-state-error plupload_failed';
904
+ iconClass = 'plupload_action_icon ui-icon ui-icon-alert';
905
+ break;
906
+
907
+ case plupload.QUEUED:
908
+ actionClass = 'plupload_delete';
909
+ iconClass = 'plupload_action_icon ui-icon ui-icon-circle-minus';
910
+ break;
911
+
912
+ case plupload.UPLOADING:
913
+ actionClass = 'ui-state-highlight plupload_uploading';
914
+ iconClass = 'plupload_action_icon ui-icon ui-icon-circle-arrow-w';
915
+
916
+ // scroll uploading file into the view if its bottom boundary is out of it
917
+ var scroller = $('.plupload_scroll', this.container)
918
+ , scrollTop = scroller.scrollTop()
919
+ , scrollerHeight = scroller.height()
920
+ , rowOffset = $file.position().top + $file.height()
921
+ ;
922
+
923
+ if (scrollerHeight < rowOffset) {
924
+ scroller.scrollTop(scrollTop + rowOffset - scrollerHeight);
925
+ }
926
+
927
+ // Set file specific progress
928
+ $file
929
+ .find('.plupload_file_percent')
930
+ .html(file.percent + '%')
931
+ .end()
932
+ .find('.plupload_file_progress')
933
+ .css('width', file.percent + '%')
934
+ .end()
935
+ .find('.plupload_file_size')
936
+ .html(plupload.formatSize(file.size));
937
+ break;
938
+ }
939
+ actionClass += ' ui-state-default plupload_file';
940
+
941
+ $file
942
+ .attr('class', actionClass)
943
+ .find('.plupload_action_icon')
944
+ .attr('class', iconClass);
945
+ },
946
+
947
+ _updateTotalProgress: function () {
948
+ var up = this.uploader;
949
+
950
+ // Scroll to end of file list
951
+ this.filelist[0].scrollTop = this.filelist[0].scrollHeight;
952
+
953
+ this.progressbar.progressbar('value', up.total.percent);
954
+
955
+ this.element
956
+ .find('.plupload_total_status')
957
+ .html(up.total.percent + '%')
958
+ .end()
959
+ .find('.plupload_total_file_size')
960
+ .html(plupload.formatSize(up.total.size))
961
+ .end()
962
+ .find('.plupload_upload_status')
963
+ .html(plupload.sprintf(_('Uploaded %d/%d files'), up.total.uploaded, up.files.length));
964
+ },
965
+
966
+ _displayThumbs: function () {
967
+ var self = this
968
+ , tw, th // thumb width/height
969
+ , cols
970
+ , num = 0 // number of simultaneously visible thumbs
971
+ , thumbs = [] // array of thumbs to preload at any given moment
972
+ , loading = false
973
+ ;
974
+
975
+ if (!this.options.views.thumbs) {
976
+ return;
977
+ }
978
+
979
+
980
+ function onLast(el, eventName, cb) {
981
+ var timer;
982
+
983
+ el.on(eventName, function () {
984
+ clearTimeout(timer);
985
+ timer = setTimeout(function () {
986
+ clearTimeout(timer);
987
+ cb();
988
+ }, 300);
989
+ });
990
+ }
991
+
992
+
993
+ // calculate number of simultaneously visible thumbs
994
+ function measure() {
995
+ if (!tw || !th) {
996
+ var wrapper = $('.plupload_file:eq(0)', self.filelist);
997
+ tw = wrapper.outerWidth(true);
998
+ th = wrapper.outerHeight(true);
999
+ }
1000
+
1001
+ var aw = self.content.width(), ah = self.content.height();
1002
+ cols = Math.floor(aw / tw);
1003
+ num = cols * (Math.ceil(ah / th) + 1);
1004
+ }
1005
+
1006
+
1007
+ function pickThumbsToLoad() {
1008
+ // calculate index of virst visible thumb
1009
+ var startIdx = Math.floor(self.content.scrollTop() / th) * cols;
1010
+ // get potentially visible thumbs that are not yet visible
1011
+ thumbs = $('.plupload_file .plupload_file_thumb', self.filelist)
1012
+ .slice(startIdx, startIdx + num)
1013
+ .filter('.plupload_thumb_toload')
1014
+ .get();
1015
+ }
1016
+
1017
+
1018
+ function init() {
1019
+ function mpl() { // measure, pick, load
1020
+ if (self.view_mode !== 'thumbs') {
1021
+ return;
1022
+ }
1023
+ measure();
1024
+ pickThumbsToLoad();
1025
+ lazyLoad();
1026
+ }
1027
+
1028
+ if ($.fn.resizable) {
1029
+ onLast(self.container, 'resize', mpl);
1030
+ }
1031
+
1032
+ onLast(self.window, 'resize', mpl);
1033
+ onLast(self.content, 'scroll', mpl);
1034
+
1035
+ self.element.on('viewchanged selected', mpl);
1036
+
1037
+ mpl();
1038
+ }
1039
+
1040
+
1041
+ function preloadThumb(file, cb) {
1042
+ var img = new o.image.Image();
1043
+ var resolveUrl = o.core.utils.Url.resolveUrl;
1044
+
1045
+ img.onload = function () {
1046
+ var thumb = $('#' + file.id + ' .plupload_file_thumb', self.filelist);
1047
+ this.embed(thumb[0], {
1048
+ width: self.options.thumb_width,
1049
+ height: self.options.thumb_height,
1050
+ crop: true,
1051
+ fit: true,
1052
+ preserveHeaders: false,
1053
+ swf_url: resolveUrl(self.options.flash_swf_url),
1054
+ xap_url: resolveUrl(self.options.silverlight_xap_url)
1055
+ });
1056
+ };
1057
+
1058
+ img.bind("embedded error", function (e) {
1059
+ $('#' + file.id, self.filelist)
1060
+ .find('.plupload_file_thumb')
1061
+ .removeClass('plupload_thumb_loading')
1062
+ .addClass('plupload_thumb_' + e.type)
1063
+ ;
1064
+ this.destroy();
1065
+ setTimeout(cb, 1); // detach, otherwise ui might hang (in SilverLight for example)
1066
+ });
1067
+
1068
+ $('#' + file.id, self.filelist)
1069
+ .find('.plupload_file_thumb')
1070
+ .removeClass('plupload_thumb_toload')
1071
+ .addClass('plupload_thumb_loading')
1072
+ ;
1073
+ img.load(file.getSource());
1074
+ }
1075
+
1076
+
1077
+ function lazyLoad() {
1078
+ if (self.view_mode !== 'thumbs' || loading) {
1079
+ return;
1080
+ }
1081
+
1082
+ pickThumbsToLoad();
1083
+ if (!thumbs.length) {
1084
+ return;
1085
+ }
1086
+
1087
+ loading = true;
1088
+
1089
+ preloadThumb(self.getFile($(thumbs.shift()).closest('.plupload_file').attr('id')), function () {
1090
+ loading = false;
1091
+ lazyLoad();
1092
+ });
1093
+ }
1094
+
1095
+ // this has to run only once to measure structures and bind listeners
1096
+ this.element.on('selected', function onselected() {
1097
+ self.element.off('selected', onselected);
1098
+ init();
1099
+ });
1100
+ },
1101
+
1102
+ _addFiles: function (files) {
1103
+ var self = this, file_html, html = '';
1104
+
1105
+ file_html = '<li class="plupload_file ui-state-default plupload_delete" id="{id}" style="width:{thumb_width}px;">' +
1106
+ '<div class="plupload_file_thumb plupload_thumb_toload" style="width: {thumb_width}px; height: {thumb_height}px;">' +
1107
+ '<div class="plupload_file_dummy ui-widget-content" style="line-height: {thumb_height}px;"><span class="ui-state-disabled">{ext} </span></div>' +
1108
+ '</div>' +
1109
+ '<div class="plupload_file_status">' +
1110
+ '<div class="plupload_file_progress ui-widget-header" style="width: 0%"> </div>' +
1111
+ '<span class="plupload_file_percent">{percent} </span>' +
1112
+ '</div>' +
1113
+ '<div class="plupload_file_name" title="{name}">' +
1114
+ '<span class="plupload_file_name_wrapper">{name} </span>' +
1115
+ '</div>' +
1116
+ '<div class="plupload_file_action">' +
1117
+ '<div class="plupload_action_icon ui-icon ui-icon-circle-minus"> </div>' +
1118
+ '</div>' +
1119
+ '<div class="plupload_file_size">{size} </div>' +
1120
+ '<div class="plupload_file_fields"> </div>' +
1121
+ '</li>';
1122
+
1123
+ if (plupload.typeOf(files) !== 'array') {
1124
+ files = [files];
1125
+ }
1126
+
1127
+ $.each(files, function (i, file) {
1128
+ var ext = o.core.utils.Mime.getFileExtension(file.name) || 'none';
1129
+
1130
+ html += file_html.replace(/\{(\w+)\}/g, function ($0, $1) {
1131
+ switch ($1) {
1132
+ case 'thumb_width':
1133
+ case 'thumb_height':
1134
+ return self.options[$1];
1135
+
1136
+ case 'size':
1137
+ return plupload.formatSize(file.size);
1138
+
1139
+ case 'ext':
1140
+ return ext;
1141
+
1142
+ default:
1143
+ return file[$1] || '';
1144
+ }
1145
+ });
1146
+ });
1147
+
1148
+ self.filelist.append(html);
1149
+ },
1150
+
1151
+ _addFormFields: function () {
1152
+ var self = this;
1153
+
1154
+ // re-add from fresh
1155
+ $('.plupload_file_fields', this.filelist).html('');
1156
+
1157
+ plupload.each(this.uploader.files, function (file, count) {
1158
+ var fields = ''
1159
+ , id = self.id + '_' + count
1160
+ ;
1161
+
1162
+ if (file.target_name) {
1163
+ fields += '<input type="hidden" name="' + id + '_tmpname" value="' + plupload.xmlEncode(file.target_name) + '" />';
1164
+ }
1165
+ fields += '<input type="hidden" name="' + id + '_name" value="' + plupload.xmlEncode(file.name) + '" />';
1166
+ fields += '<input type="hidden" name="' + id + '_status" value="' + (file.status === plupload.DONE ? 'done' : 'failed') + '" />';
1167
+
1168
+ $('#' + file.id).find('.plupload_file_fields').html(fields);
1169
+ });
1170
+
1171
+ this.counter.val(this.uploader.files.length);
1172
+ },
1173
+
1174
+ _viewChanged: function (view) {
1175
+ // update or write a new cookie
1176
+ if (this.options.views.remember && $.cookie) {
1177
+ $.cookie('plupload_ui_view', view, {expires: 7, path: '/'});
1178
+ }
1179
+
1180
+ // ugly fix for IE6 - make content area stretchable
1181
+ if (plupload.ua.browser === 'IE' && plupload.ua.version < 7) {
1182
+ this.content.attr('style', 'height:expression(document.getElementById("' + this.id + '_container' + '").clientHeight - ' + (view === 'list' ? 132 : 102) + ')');
1183
+ }
1184
+
1185
+ this.container.removeClass('plupload_view_list plupload_view_thumbs').addClass('plupload_view_' + view);
1186
+ this.view_mode = view;
1187
+ this._trigger('viewchanged', null, {view: view});
1188
+ },
1189
+
1190
+ _enableViewSwitcher: function () {
1191
+ var self = this
1192
+ , view
1193
+ , switcher = $('.plupload_view_switch', this.container)
1194
+ , buttons
1195
+ , button
1196
+ ;
1197
+
1198
+ plupload.each(['list', 'thumbs'], function (view) {
1199
+ if (!self.options.views[view]) {
1200
+ switcher.find('[for="' + self.id + '_view_' + view + '"], #' + self.id + '_view_' + view).remove();
1201
+ }
1202
+ });
1203
+
1204
+ // check if any visible left
1205
+ buttons = switcher.find('.plupload_button');
1206
+
1207
+ if (buttons.length === 1) {
1208
+ switcher.hide();
1209
+ view = buttons.eq(0).data('view');
1210
+ this._viewChanged(view);
1211
+ } else if ($.ui.button && buttons.length > 1) {
1212
+ if (this.options.views.remember && $.cookie) {
1213
+ view = $.cookie('plupload_ui_view');
1214
+ }
1215
+
1216
+ // if wierd case, bail out to default
1217
+ if (!~plupload.inArray(view, ['list', 'thumbs'])) {
1218
+ view = this.options.views.active;
1219
+ }
1220
+
1221
+ switcher
1222
+ .show()
1223
+ .buttonset()
1224
+ .find('.ui-button')
1225
+ .click(function (e) {
1226
+ view = $(this).data('view');
1227
+ self._viewChanged(view);
1228
+ e.preventDefault(); // avoid auto scrolling to widget in IE and FF (see #850)
1229
+ });
1230
+
1231
+ // if view not active - happens when switcher wasn't clicked manually
1232
+ button = switcher.find('[for="' + self.id + '_view_' + view + '"]');
1233
+ if (button.length) {
1234
+ button.trigger('click');
1235
+ }
1236
+ } else {
1237
+ switcher.show();
1238
+ this._viewChanged(this.options.views.active);
1239
+ }
1240
+
1241
+ // initialize thumb viewer if requested
1242
+ if (this.options.views.thumbs) {
1243
+ this._displayThumbs();
1244
+ }
1245
+ },
1246
+
1247
+ _enableRenaming: function () {
1248
+ var self = this;
1249
+
1250
+ this.filelist.dblclick(function (e) {
1251
+ var nameInput, fileContainer, file, parts, name, ext = "";
1252
+ var nameSpan = $(e.target);
1253
+
1254
+ if (!nameSpan.hasClass('plupload_file_name_wrapper')) {
1255
+ return;
1256
+ }
1257
+
1258
+ fileContainer = nameSpan.closest('.plupload_file');
1259
+ if (!fileContainer.hasClass('plupload_delete')) {
1260
+ return;
1261
+ }
1262
+
1263
+ // Get file name and split out name and extension
1264
+ file = self.uploader.getFile(fileContainer[0].id);
1265
+ name = file.name;
1266
+ parts = /^(.+)(\.[^.]+)$/.exec(name);
1267
+ if (parts) {
1268
+ name = parts[1];
1269
+ ext = parts[2];
1270
+ }
1271
+
1272
+ // Display input element
1273
+ nameInput = $('<input class="plupload_file_rename" type="text" />').width(nameSpan.width()).insertAfter(nameSpan.hide());
1274
+ nameInput.val(name).blur(function () {
1275
+ nameSpan.show().parent().scrollLeft(0).end().next().remove();
1276
+ }).keydown(function (e) {
1277
+ var nameInput = $(this);
1278
+
1279
+ if ($.inArray(e.keyCode, [13, 27]) !== -1) {
1280
+ e.preventDefault();
1281
+
1282
+ // Rename file and glue extension back on
1283
+ if (e.keyCode === 13) {
1284
+ file.name = nameInput.val() + ext;
1285
+ nameSpan.html(file.name);
1286
+ }
1287
+ nameInput.blur();
1288
+ }
1289
+ })[0].focus();
1290
+ });
1291
+ },
1292
+
1293
+ _enableSortingList: function () {
1294
+ var self = this;
1295
+
1296
+ if ($('.plupload_file', this.filelist).length < 2) {
1297
+ return;
1298
+ }
1299
+
1300
+ // destroy sortable if enabled
1301
+ $('tbody', this.filelist).sortable('destroy');
1302
+
1303
+ // enable
1304
+ this.filelist.sortable({
1305
+ items: '.plupload_delete',
1306
+
1307
+ cancel: 'object, .plupload_clearer',
1308
+
1309
+ stop: function () {
1310
+ var files = [];
1311
+
1312
+ $.each($(this).sortable('toArray'), function (i, id) {
1313
+ files[files.length] = self.uploader.getFile(id);
1314
+ });
1315
+
1316
+ files.unshift(files.length);
1317
+ files.unshift(0);
1318
+
1319
+ // re-populate files array
1320
+ Array.prototype.splice.apply(self.uploader.files, files);
1321
+ }
1322
+ });
1323
+ }
1324
+ });
1325
+
1326
+ }(window, document, plupload, moxie, jQuery));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/global/plugins/pluploader/js/plupload.full.min.js CHANGED
@@ -10,20 +10,20 @@
10
  *
11
  * Date: 2017-02-02
12
  */
13
- !function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.moxie};"function"==typeof define&&define.amd?define("moxie",[],i):"object"==typeof module&&module.exports?module.exports=i():e.moxie=i()}(this||window,function(){!function(e,t){"use strict";function i(e,t){for(var i,n=[],r=0;r<e.length;++r){if(i=s[e[r]]||o(e[r]),!i)throw"module definition dependecy not found: "+e[r];n.push(i)}t.apply(null,n)}function n(e,n,r){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(n===t)throw"invalid module definition, dependencies must be specified";if(r===t)throw"invalid module definition, definition function must be specified";i(n,function(){s[e]=r.apply(null,arguments)})}function r(e){return!!s[e]}function o(t){for(var i=e,n=t.split(/[.\/]/),r=0;r<n.length;++r){if(!i[n[r]])return;i=i[n[r]]}return i}function a(i){for(var n=0;n<i.length;n++){for(var r=e,o=i[n],a=o.split(/[.\/]/),u=0;u<a.length-1;++u)r[a[u]]===t&&(r[a[u]]={}),r=r[a[u]];r[a[a.length-1]]=s[o]}}var s={};n("moxie/core/utils/Basic",[],function(){function e(e){var t;return e===t?"undefined":null===e?"null":e.nodeType?"node":{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}function t(){return a(!1,!1,arguments)}function i(){return a(!0,!1,arguments)}function n(){return a(!1,!0,arguments)}function r(){return a(!0,!0,arguments)}function o(i){switch(e(i)){case"array":return Array.prototype.slice.call(i);case"object":return t({},i)}return i}function a(t,i,n){var r,s=n[0];return u(n,function(n,c){c>0&&u(n,function(n,u){var c=-1!==m(e(n),["array","object"]);return n===r||t&&s[u]===r?!0:(c&&i&&(n=o(n)),e(s[u])===e(n)&&c?a(t,i,[s[u],n]):s[u]=n,void 0)})}),s}function s(e,t){function i(){this.constructor=e}for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.__parent__=t.prototype,e}function u(e,t){var i,n,r,o;if(e){try{i=e.length}catch(a){i=o}if(i===o||"number"!=typeof i){for(n in e)if(e.hasOwnProperty(n)&&t(e[n],n)===!1)return}else for(r=0;i>r;r++)if(t(e[r],r)===!1)return}}function c(t){var i;if(!t||"object"!==e(t))return!0;for(i in t)return!1;return!0}function l(t,i){function n(r){"function"===e(t[r])&&t[r](function(e){++r<o&&!e?n(r):i(e)})}var r=0,o=t.length;"function"!==e(i)&&(i=function(){}),t&&t.length||i(),n(r)}function d(e,t){var i=0,n=e.length,r=new Array(n);u(e,function(e,o){e(function(e){if(e)return t(e);var a=[].slice.call(arguments);a.shift(),r[o]=a,i++,i===n&&(r.unshift(null),t.apply(this,r))})})}function m(e,t){if(t){if(Array.prototype.indexOf)return Array.prototype.indexOf.call(t,e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function h(t,i){var n=[];"array"!==e(t)&&(t=[t]),"array"!==e(i)&&(i=[i]);for(var r in t)-1===m(t[r],i)&&n.push(t[r]);return n.length?n:!1}function f(e,t){var i=[];return u(e,function(e){-1!==m(e,t)&&i.push(e)}),i.length?i:null}function p(e){var t,i=[];for(t=0;t<e.length;t++)i[t]=e[t];return i}function g(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,""):e}function x(e){if("string"!=typeof e)return e;var t,i={t:1099511627776,g:1073741824,m:1048576,k:1024};return e=/^([0-9\.]+)([tmgk]?)$/.exec(e.toLowerCase().replace(/[^0-9\.tmkg]/g,"")),t=e[2],e=+e[1],i.hasOwnProperty(t)&&(e*=i[t]),Math.floor(e)}function v(t){var i=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=i.shift();return"undefined"!==e(t)?t:""})}function w(e,t){var i=this;setTimeout(function(){e.call(i)},t||1)}var y=function(){var e=0;return function(t){var i,n=(new Date).getTime().toString(32);for(i=0;5>i;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}();return{guid:y,typeOf:e,extend:t,extendIf:i,extendImmutable:n,extendImmutableIf:r,inherit:s,each:u,isEmptyObj:c,inSeries:l,inParallel:d,inArray:m,arrayDiff:h,arrayIntersect:f,toArray:p,trim:g,sprintf:v,parseSizeStr:x,delay:w}}),n("moxie/core/utils/Encode",[],function(){var e=function(e){return unescape(encodeURIComponent(e))},t=function(e){return decodeURIComponent(escape(e))},i=function(e,i){if("function"==typeof window.atob)return i?t(window.atob(e)):window.atob(e);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!e)return e;e+="";do a=d.indexOf(e.charAt(m++)),s=d.indexOf(e.charAt(m++)),u=d.indexOf(e.charAt(m++)),c=d.indexOf(e.charAt(m++)),l=a<<18|s<<12|u<<6|c,n=255&l>>16,r=255&l>>8,o=255&l,p[h++]=64==u?String.fromCharCode(n):64==c?String.fromCharCode(n,r):String.fromCharCode(n,r,o);while(m<e.length);return f=p.join(""),i?t(f):f},n=function(t,i){if(i&&(t=e(t)),"function"==typeof window.btoa)return window.btoa(t);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!t)return t;do n=t.charCodeAt(m++),r=t.charCodeAt(m++),o=t.charCodeAt(m++),l=n<<16|r<<8|o,a=63&l>>18,s=63&l>>12,u=63&l>>6,c=63&l,p[h++]=d.charAt(a)+d.charAt(s)+d.charAt(u)+d.charAt(c);while(m<t.length);f=p.join("");var g=t.length%3;return(g?f.slice(0,g-3):f)+"===".slice(g||3)};return{utf8_encode:e,utf8_decode:t,atob:i,btoa:n}}),n("moxie/core/utils/Env",["moxie/core/utils/Basic"],function(e){function t(e,t,i){var n=0,r=0,o=0,a={dev:-6,alpha:-5,a:-5,beta:-4,b:-4,RC:-3,rc:-3,"#":-2,p:1,pl:1},s=function(e){return e=(""+e).replace(/[_\-+]/g,"."),e=e.replace(/([^.\d]+)/g,".$1.").replace(/\.{2,}/g,"."),e.length?e.split("."):[-8]},u=function(e){return e?isNaN(e)?a[e]||-7:parseInt(e,10):0};for(e=s(e),t=s(t),r=Math.max(e.length,t.length),n=0;r>n;n++)if(e[n]!=t[n]){if(e[n]=u(e[n]),t[n]=u(t[n]),e[n]<t[n]){o=-1;break}if(e[n]>t[n]){o=1;break}}if(!i)return o;switch(i){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var i=function(e){var t="",i="?",n="function",r="undefined",o="object",a="name",s="version",u={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},c={rgx:function(){for(var t,i,a,s,u,c,l,d=0,m=arguments;d<m.length;d+=2){var h=m[d],f=m[d+1];if(typeof t===r){t={};for(s in f)u=f[s],typeof u===o?t[u[0]]=e:t[u]=e}for(i=a=0;i<h.length;i++)if(c=h[i].exec(this.getUA())){for(s=0;s<f.length;s++)l=c[++a],u=f[s],typeof u===o&&u.length>0?2==u.length?t[u[0]]=typeof u[1]==n?u[1].call(this,l):u[1]:3==u.length?t[u[0]]=typeof u[1]!==n||u[1].exec&&u[1].test?l?l.replace(u[1],u[2]):e:l?u[1].call(this,l,u[2]):e:4==u.length&&(t[u[0]]=l?u[3].call(this,l.replace(u[1],u[2])):e):t[u]=l?l:e;break}if(c)break}return t},str:function(t,n){for(var r in n)if(typeof n[r]===o&&n[r].length>0){for(var a=0;a<n[r].length;a++)if(u.has(n[r][a],t))return r===i?e:r}else if(u.has(n[r],t))return r===i?e:r;return t}},l={browser:{oldsafari:{major:{1:["/8","/1","/3"],2:"/4","?":"/"},version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2000:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",RT:"ARM"}}}},d={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[a,s],[/\s(opr)\/([\w\.]+)/i],[[a,"Opera"],s],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i],[a,s],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[a,"IE"],s],[/(edge)\/((\d+)?[\w\.]+)/i],[a,s],[/(yabrowser)\/([\w\.]+)/i],[[a,"Yandex"],s],[/(comodo_dragon)\/([\w\.]+)/i],[[a,/_/g," "],s],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i],[a,s],[/(dolfin)\/([\w\.]+)/i],[[a,"Dolphin"],s],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[a,"Chrome"],s],[/XiaoMi\/MiuiBrowser\/([\w\.]+)/i],[s,[a,"MIUI Browser"]],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i],[s,[a,"Android Browser"]],[/FBAV\/([\w\.]+);/i],[s,[a,"Facebook"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[s,[a,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[s,a],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[a,[s,c.str,l.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[a,s],[/(navigator|netscape)\/([\w\.-]+)/i],[[a,"Netscape"],s],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[a,s]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[s,[a,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[a,s],[/rv\:([\w\.]+).*(gecko)/i],[s,a]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[a,s],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[a,[s,c.str,l.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[a,"Windows"],[s,c.str,l.os.windows.version]],[/\((bb)(10);/i],[[a,"BlackBerry"],s],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[a,s],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[a,"Symbian"],s],[/\((series40);/i],[a],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[a,"Firefox OS"],s],[/(nintendo|playstation)\s([wids3portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[a,s],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[a,"Chromium OS"],s],[/(sunos)\s?([\w\.]+\d)*/i],[[a,"Solaris"],s],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[a,s],[/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i],[[a,"iOS"],[s,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[a,"Mac OS"],[s,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(haiku)\s(\w+)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[a,s]]},m=function(e){var i=e||(window&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:t);this.getBrowser=function(){return c.rgx.apply(this,d.browser)},this.getEngine=function(){return c.rgx.apply(this,d.engine)},this.getOS=function(){return c.rgx.apply(this,d.os)},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS()}},this.getUA=function(){return i},this.setUA=function(e){return i=e,this},this.setUA(i)};return m}(),n=function(){var t={define_property:function(){return!1}(),create_canvas:function(){var e=document.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))}(),return_response_type:function(t){try{if(-1!==e.inArray(t,["","text","document"]))return!0;if(window.XMLHttpRequest){var i=new XMLHttpRequest;if(i.open("get","/"),"responseType"in i)return i.responseType=t,i.responseType!==t?!1:!0}}catch(n){}return!1},use_data_uri:function(){var e=new Image;return e.onload=function(){t.use_data_uri=1===e.width&&1===e.height},setTimeout(function(){e.src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="},1),!1}(),use_data_uri_over32kb:function(){return t.use_data_uri&&("IE"!==o.browser||o.version>=9)},use_data_uri_of:function(e){return t.use_data_uri&&33e3>e||t.use_data_uri_over32kb()},use_fileinput:function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return!1;var e=document.createElement("input");return e.setAttribute("type","file"),!e.disabled}};return function(i){var n=[].slice.call(arguments);return n.shift(),"function"===e.typeOf(t[i])?t[i].apply(this,n):!!t[i]}}(),r=(new i).getResult(),o={can:n,uaParser:i,browser:r.browser.name,version:r.browser.version,os:r.os.name,osVersion:r.os.version,verComp:t,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return o.OS=o.os,o}),n("moxie/core/Exceptions",["moxie/core/utils/Basic"],function(e){function t(e,t){var i;for(i in e)if(e[i]===t)return i;return null}return{RuntimeError:function(){function i(e,i){this.code=e,this.name=t(n,e),this.message=this.name+(i||": RuntimeError "+this.code)}var n={NOT_INIT_ERR:1,EXCEPTION_ERR:3,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(i,n),i.prototype=Error.prototype,i}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": ImageError "+this.code}var n={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2,INVALID_META_ERR:3};return e.extend(i,n),i.prototype=Error.prototype,i}(),FileException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": FileException "+this.code}var n={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(i,n),i.prototype=Error.prototype,i}(),DOMException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": DOMException "+this.code}var n={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(i,n),i.prototype=Error.prototype,i}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),n("moxie/core/utils/Dom",["moxie/core/utils/Env"],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},i=function(e,t){if(!e.className)return!1;var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return i.test(e.className)},n=function(e,t){i(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(i,function(e,t,i){return" "===t&&" "===i?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,i){function n(e){var t,i,n=0,r=0;return e&&(i=e.getBoundingClientRect(),t="CSS1Compat"===c.compatMode?c.documentElement:c.body,n=i.left+t.scrollLeft,r=i.top+t.scrollTop),{x:n,y:r}}var r,o,a,s=0,u=0,c=document;if(t=t,i=i||c.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!c.documentMode||c.documentMode<8))return o=n(t),a=n(i),{x:o.x-a.x,y:o.y-a.y};for(r=t;r&&r!=i&&r.nodeType;)s+=r.offsetLeft||0,u+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!=i&&r.nodeType;)s-=r.scrollLeft||0,u-=r.scrollTop||0,r=r.parentNode;return{x:s,y:u}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:i,addClass:n,removeClass:r,getStyle:o,getPos:a,getSize:s}}),n("moxie/core/EventTarget",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic"],function(e,t,i){function n(){this.uid=i.guid()}var r={};return i.extend(n.prototype,{init:function(){this.uid||(this.uid=i.guid("uid_"))},addEventListener:function(e,t,n,o){var a,s=this;return this.hasOwnProperty("uid")||(this.uid=i.guid("uid_")),e=i.trim(e),/\s/.test(e)?(i.each(e.split(/\s+/),function(e){s.addEventListener(e,t,n,o)}),void 0):(e=e.toLowerCase(),n=parseInt(n,10)||0,a=r[this.uid]&&r[this.uid][e]||[],a.push({fn:t,priority:n,scope:o||this}),r[this.uid]||(r[this.uid]={}),r[this.uid][e]=a,void 0)},hasEventListener:function(e){var t;return e?(e=e.toLowerCase(),t=r[this.uid]&&r[this.uid][e]):t=r[this.uid],t?t:!1},removeEventListener:function(e,t){var n,o,a=this;if(e=e.toLowerCase(),/\s/.test(e))return i.each(e.split(/\s+/),function(e){a.removeEventListener(e,t)}),void 0;if(n=r[this.uid]&&r[this.uid][e]){if(t){for(o=n.length-1;o>=0;o--)if(n[o].fn===t){n.splice(o,1);break}}else n=[];n.length||(delete r[this.uid][e],i.isEmptyObj(r[this.uid])&&delete r[this.uid])}},removeAllEventListeners:function(){r[this.uid]&&delete r[this.uid]},dispatchEvent:function(e){var n,o,a,s,u,c={},l=!0;if("string"!==i.typeOf(e)){if(s=e,"string"!==i.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR);e=s.type,s.total!==u&&s.loaded!==u&&(c.total=s.total,c.loaded=s.loaded),c.async=s.async||!1}if(-1!==e.indexOf("::")?function(t){n=t[0],e=t[1]}(e.split("::")):n=this.uid,e=e.toLowerCase(),o=r[n]&&r[n][e]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),c.type=e,a.unshift(c);var d=[];i.each(o,function(e){a[0].target=e.scope,c.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&i.inSeries(d,function(e){l=!e})}return l},bindOnce:function(e,t,i,n){var r=this;r.bind.call(this,e,function o(){return r.unbind(e,o),t.apply(this,arguments)},i,n)},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},handleEventProps:function(e){var t=this;this.bind(e.join(" "),function(e){var t="on"+e.type.toLowerCase();"function"===i.typeOf(this[t])&&this[t].apply(this,arguments)}),i.each(e,function(e){e="on"+e.toLowerCase(e),"undefined"===i.typeOf(t[e])&&(t[e]=null)})}}),n.instance=new n,n}),n("moxie/runtime/Runtime",["moxie/core/utils/Env","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/EventTarget"],function(e,t,i,n){function r(e,n,o,s,u){var c,l=this,d=t.guid(n+"_"),m=u||"browser";e=e||{},a[d]=this,o=t.extend({access_binary:!1,access_image_binary:!1,display_media:!1,do_cors:!1,drag_and_drop:!1,filter_by_extension:!0,resize_image:!1,report_upload_progress:!1,return_response_headers:!1,return_response_type:!1,return_status_code:!0,send_custom_headers:!1,select_file:!1,select_folder:!1,select_multiple:!0,send_binary_string:!1,send_browser_cookies:!0,send_multipart:!0,slice_blob:!1,stream_upload:!1,summon_file_dialog:!1,upload_filesize:!0,use_http_method:!0},o),e.preferred_caps&&(m=r.getMode(s,e.preferred_caps,m)),c=function(){var e={};return{exec:function(t,i,n,r){return c[i]&&(e[t]||(e[t]={context:this,instance:new c[i]}),e[t].instance[n])?e[t].instance[n].apply(this,r):void 0},removeInstance:function(t){delete e[t]},removeAllInstances:function(){var i=this;t.each(e,function(e,n){"function"===t.typeOf(e.instance.destroy)&&e.instance.destroy.call(e.context),i.removeInstance(n)})}}}(),t.extend(this,{initialized:!1,uid:d,type:n,mode:r.getMode(s,e.required_caps,m),shimid:d+"_container",clients:0,options:e,can:function(e,i){var n=arguments[2]||o;if("string"===t.typeOf(e)&&"undefined"===t.typeOf(i)&&(e=r.parseCaps(e)),"object"===t.typeOf(e)){for(var a in e)if(!this.can(a,e[a],n))return!1;return!0}return"function"===t.typeOf(n[e])?n[e].call(this,i):i===n[e]},getShimContainer:function(){var e,n=i.get(this.shimid);return n||(e=i.get(this.options.container)||document.body,n=document.createElement("div"),n.id=this.shimid,n.className="moxie-shim moxie-shim-"+this.type,t.extend(n.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),e.appendChild(n),e=null),n},getShim:function(){return c},shimExec:function(e,t){var i=[].slice.call(arguments,2);return l.getShim().exec.call(this,this.uid,e,t,i)},exec:function(e,t){var i=[].slice.call(arguments,2);return l[e]&&l[e][t]?l[e][t].apply(this,i):l.shimExec.apply(this,arguments)},destroy:function(){if(l){var e=i.get(this.shimid);e&&e.parentNode.removeChild(e),c&&c.removeAllInstances(),this.unbindAll(),delete a[this.uid],this.uid=null,d=l=c=e=null}}}),this.mode&&e.required_caps&&!this.can(e.required_caps)&&(this.mode=!1)}var o={},a={};return r.order="html5,flash,silverlight,html4",r.getRuntime=function(e){return a[e]?a[e]:!1},r.addConstructor=function(e,t){t.prototype=n.instance,o[e]=t},r.getConstructor=function(e){return o[e]||null},r.getInfo=function(e){var t=r.getRuntime(e);return t?{uid:t.uid,type:t.type,mode:t.mode,can:function(){return t.can.apply(t,arguments)}}:null},r.parseCaps=function(e){var i={};return"string"!==t.typeOf(e)?e||{}:(t.each(e.split(","),function(e){i[e]=!0}),i)},r.can=function(e,t){var i,n,o=r.getConstructor(e);return o?(i=new o({required_caps:t}),n=i.mode,i.destroy(),!!n):!1},r.thatCan=function(e,t){var i=(t||r.order).split(/\s*,\s*/);for(var n in i)if(r.can(i[n],e))return i[n];return null},r.getMode=function(e,i,n){var r=null;if("undefined"===t.typeOf(n)&&(n="browser"),i&&!t.isEmptyObj(e)){if(t.each(i,function(i,n){if(e.hasOwnProperty(n)){var o=e[n](i);if("string"==typeof o&&(o=[o]),r){if(!(r=t.arrayIntersect(r,o)))return r=!1}else r=o}}),r)return-1!==t.inArray(n,r)?n:r[0];if(r===!1)return!1}return n},r.capTrue=function(){return!0},r.capFalse=function(){return!1},r.capTest=function(e){return function(){return!!e}},r}),n("moxie/runtime/RuntimeClient",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/Runtime"],function(e,t,i,n){return function(){var e;i.extend(this,{connectRuntime:function(r){function o(i){var a,u;return i.length?(a=i.shift().toLowerCase(),(u=n.getConstructor(a))?(e=new u(r),e.bind("Init",function(){e.initialized=!0,setTimeout(function(){e.clients++,s.ruid=e.uid,s.trigger("RuntimeInit",e)},1)}),e.bind("Error",function(){e.destroy(),o(i)}),e.bind("Exception",function(e,i){var n=i.name+"(#"+i.code+")"+(i.message?", from: "+i.message:"");s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.EXCEPTION_ERR,n))}),e.mode?(e.init(),void 0):(e.trigger("Error"),void 0)):(o(i),void 0)):(s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)),e=null,void 0)}var a,s=this;if("string"===i.typeOf(r)?a=r:"string"===i.typeOf(r.ruid)&&(a=r.ruid),a){if(e=n.getRuntime(a))return s.ruid=a,e.clients++,e;throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order||n.order).split(/\s*,\s*/))},disconnectRuntime:function(){e&&--e.clients<=0&&e.destroy(),e=null},getRuntime:function(){return e&&e.uid?e:e=null},exec:function(){return e?e.exec.apply(this,arguments):null},can:function(t){return e?e.can(t):!1}})}}),n("moxie/file/Blob",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient"],function(e,t,i){function n(o,a){function s(t,i,o){var a,s=r[this.uid];return"string"===e.typeOf(s)&&s.length?(a=new n(null,{type:o,size:i-t}),a.detach(s.substr(t,a.size)),a):null}i.call(this),o&&this.connectRuntime(o),a?"string"===e.typeOf(a)&&(a={data:a}):a={},e.extend(this,{uid:a.uid||e.guid("uid_"),ruid:o,size:a.size||0,type:a.type||"",slice:function(e,t,i){return this.isDetached()?s.apply(this,arguments):this.getRuntime().exec.call(this,"Blob","slice",this.getSource(),e,t,i)},getSource:function(){return r[this.uid]?r[this.uid]:null},detach:function(e){if(this.ruid&&(this.getRuntime().exec.call(this,"Blob","destroy"),this.disconnectRuntime(),this.ruid=null),e=e||"","data:"==e.substr(0,5)){var i=e.indexOf(";base64,");this.type=e.substring(5,i),e=t.atob(e.substring(i+8))}this.size=e.length,r[this.uid]=e},isDetached:function(){return!this.ruid&&"string"===e.typeOf(r[this.uid])},destroy:function(){this.detach(),delete r[this.uid]}}),a.data?this.detach(a.data):r[this.uid]=a}var r={};return n}),n("moxie/core/I18n",["moxie/core/utils/Basic"],function(e){var t={};return{addI18n:function(i){return e.extend(t,i)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var i=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=i.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),n("moxie/core/utils/Mime",["moxie/core/utils/Basic","moxie/core/I18n"],function(e,t){var i="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",n={mimes:{},extensions:{},addMimeType:function(e){var t,i,n,r=e.split(/,/);for(t=0;t<r.length;t+=2){for(n=r[t+1].split(/ /),i=0;i<n.length;i++)this.mimes[n[i]]=r[t];this.extensions[r[t]]=n}},extList2mimes:function(t,i){var n,r,o,a,s=this,u=[];for(r=0;r<t.length;r++)for(n=t[r].extensions.toLowerCase().split(/\s*,\s*/),o=0;o<n.length;o++){if("*"===n[o])return[];if(a=s.mimes[n[o]],i&&/^\w+$/.test(n[o]))u.push("."+n[o]);else if(a&&-1===e.inArray(a,u))u.push(a);else if(!a)return[]}return u},mimes2exts:function(t){var i=this,n=[];return e.each(t,function(t){if(t=t.toLowerCase(),"*"===t)return n=[],!1;var r=t.match(/^(\w+)\/(\*|\w+)$/);r&&("*"===r[2]?e.each(i.extensions,function(e,t){new RegExp("^"+r[1]+"/").test(t)&&[].push.apply(n,i.extensions[t])}):i.extensions[t]&&[].push.apply(n,i.extensions[t]))}),n},mimes2extList:function(i){var n=[],r=[];return"string"===e.typeOf(i)&&(i=e.trim(i).split(/\s*,\s*/)),r=this.mimes2exts(i),n.push({title:t.translate("Files"),extensions:r.length?r.join(","):"*"}),n.mimes=i,n},getFileExtension:function(e){var t=e&&e.match(/\.([^.]+)$/);return t?t[1].toLowerCase():""},getFileMime:function(e){return this.mimes[this.getFileExtension(e)]||""}};return n.addMimeType(i),n}),n("moxie/file/FileInput",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Mime","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/I18n","moxie/runtime/Runtime","moxie/runtime/RuntimeClient"],function(e,t,i,n,r,o,a,s,u){function c(t){var o,c,d;if(-1!==e.inArray(e.typeOf(t),["string","node"])&&(t={browse_button:t}),c=n.get(t.browse_button),!c)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR);d={accept:[{title:a.translate("All Files"),extensions:"*"}],multiple:!1,required_caps:!1,container:c.parentNode||document.body},t=e.extend({},d,t),"string"==typeof t.required_caps&&(t.required_caps=s.parseCaps(t.required_caps)),"string"==typeof t.accept&&(t.accept=i.mimes2extList(t.accept)),o=n.get(t.container),o||(o=document.body),"static"===n.getStyle(o,"position")&&(o.style.position="relative"),o=c=null,u.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,shimid:null,files:null,init:function(){var i=this;i.bind("RuntimeInit",function(r,o){i.ruid=o.uid,i.shimid=o.shimid,i.bind("Ready",function(){i.trigger("Refresh")},999),i.bind("Refresh",function(){var i,r,a,s,u;a=n.get(t.browse_button),s=n.get(o.shimid),a&&(i=n.getPos(a,n.get(t.container)),r=n.getSize(a),u=parseInt(n.getStyle(a,"z-index"),10)||0,s&&e.extend(s.style,{top:i.y+"px",left:i.x+"px",width:r.w+"px",height:r.h+"px",zIndex:u+1})),s=a=null}),o.exec.call(i,"FileInput","init",t)}),i.connectRuntime(e.extend({},t,{required_caps:{select_file:!0}}))},getOption:function(e){return t[e]},setOption:function(e,n){if(t.hasOwnProperty(e)){var o=t[e];switch(e){case"accept":"string"==typeof n&&(n=i.mimes2extList(n));break;case"container":case"required_caps":throw new r.FileException(r.FileException.NO_MODIFICATION_ALLOWED_ERR)}t[e]=n,this.exec("FileInput","setOption",e,n),this.trigger("OptionChanged",e,n,o)}},disable:function(t){var i=this.getRuntime();i&&this.exec("FileInput","disable","undefined"===e.typeOf(t)?!0:t)},refresh:function(){this.trigger("Refresh")},destroy:function(){var t=this.getRuntime();t&&(t.exec.call(this,"FileInput","destroy"),this.disconnectRuntime()),"array"===e.typeOf(this.files)&&e.each(this.files,function(e){e.destroy()}),this.files=null,this.unbindAll()}}),this.handleEventProps(l)}var l=["ready","change","cancel","mouseenter","mouseleave","mousedown","mouseup"];return c.prototype=o.instance,c}),n("moxie/file/File",["moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/file/Blob"],function(e,t,i){function n(n,r){r||(r={}),i.apply(this,arguments),this.type||(this.type=t.getFileMime(r.name));var o;if(r.name)o=r.name.replace(/\\/g,"/"),o=o.substr(o.lastIndexOf("/")+1);else if(this.type){var a=this.type.split("/")[0];o=e.guid((""!==a?a:"file")+"_"),t.extensions[this.type]&&(o+="."+t.extensions[this.type][0])}e.extend(this,{name:o||e.guid("file_"),relativePath:"",lastModifiedDate:r.lastModifiedDate||(new Date).toLocaleString()})}return n.prototype=i.prototype,n}),n("moxie/file/FileDrop",["moxie/core/I18n","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/core/utils/Env","moxie/file/File","moxie/runtime/RuntimeClient","moxie/core/EventTarget","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u){function c(i){var r,o=this;"string"==typeof i&&(i={drop_zone:i}),r={accept:[{title:e.translate("All Files"),extensions:"*"}],required_caps:{drag_and_drop:!0}},i="object"==typeof i?n.extend({},r,i):r,i.container=t.get(i.drop_zone)||document.body,"static"===t.getStyle(i.container,"position")&&(i.container.style.position="relative"),"string"==typeof i.accept&&(i.accept=u.mimes2extList(i.accept)),a.call(o),n.extend(o,{uid:n.guid("uid_"),ruid:null,files:null,init:function(){o.bind("RuntimeInit",function(e,t){o.ruid=t.uid,t.exec.call(o,"FileDrop","init",i),o.dispatchEvent("ready")}),o.connectRuntime(i)},destroy:function(){var e=this.getRuntime();e&&(e.exec.call(this,"FileDrop","destroy"),this.disconnectRuntime()),this.files=null,this.unbindAll()}}),this.handleEventProps(l)}var l=["ready","dragenter","dragleave","drop","error"];return c.prototype=s.instance,c}),n("moxie/file/FileReader",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/Exceptions","moxie/core/EventTarget","moxie/file/Blob","moxie/runtime/RuntimeClient"],function(e,t,i,n,r,o){function a(){function n(e,n){if(this.trigger("loadstart"),this.readyState===a.LOADING)return this.trigger("error",new i.DOMException(i.DOMException.INVALID_STATE_ERR)),this.trigger("loadend"),void 0;
14
- if(!(n instanceof r))return this.trigger("error",new i.DOMException(i.DOMException.NOT_FOUND_ERR)),this.trigger("loadend"),void 0;if(this.result=null,this.readyState=a.LOADING,n.isDetached()){var o=n.getSource();switch(e){case"readAsText":case"readAsBinaryString":this.result=o;break;case"readAsDataURL":this.result="data:"+n.type+";base64,"+t.btoa(o)}this.readyState=a.DONE,this.trigger("load"),this.trigger("loadend")}else this.connectRuntime(n.ruid),this.exec("FileReader","read",e,n)}o.call(this),e.extend(this,{uid:e.guid("uid_"),readyState:a.EMPTY,result:null,error:null,readAsBinaryString:function(e){n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){n.call(this,"readAsDataURL",e)},readAsText:function(e){n.call(this,"readAsText",e)},abort:function(){this.result=null,-1===e.inArray(this.readyState,[a.EMPTY,a.DONE])&&(this.readyState===a.LOADING&&(this.readyState=a.DONE),this.exec("FileReader","abort"),this.trigger("abort"),this.trigger("loadend"))},destroy:function(){this.abort(),this.exec("FileReader","destroy"),this.disconnectRuntime(),this.unbindAll()}}),this.handleEventProps(s),this.bind("Error",function(e,t){this.readyState=a.DONE,this.error=t},999),this.bind("Load",function(){this.readyState=a.DONE},999)}var s=["loadstart","progress","load","abort","error","loadend"];return a.EMPTY=0,a.LOADING=1,a.DONE=2,a.prototype=n.instance,a}),n("moxie/core/utils/Url",["moxie/core/utils/Basic"],function(e){var t=function(i,n){var r,o=["source","scheme","authority","userInfo","user","pass","host","port","relative","path","directory","file","query","fragment"],a=o.length,s={http:80,https:443},u={},c=/^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?(\[[\da-fA-F:]+\]|[^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,l=c.exec(i||""),d=/^\/\/\w/.test(i);switch(e.typeOf(n)){case"undefined":n=t(document.location.href,!1);break;case"string":n=t(n,!1)}for(;a--;)l[a]&&(u[o[a]]=l[a]);if(r=!d&&!u.scheme,(d||r)&&(u.scheme=n.scheme),r){u.host=n.host,u.port=n.port;var m="";/^[^\/]/.test(u.path)&&(m=n.path,m=/\/[^\/]*\.[^\/]*$/.test(m)?m.replace(/\/[^\/]+$/,"/"):m.replace(/\/?$/,"/")),u.path=m+(u.path||"")}return u.port||(u.port=s[u.scheme]||80),u.port=parseInt(u.port,10),u.path||(u.path="/"),delete u.source,u},i=function(e){var i={http:80,https:443},n="object"==typeof e?e:t(e);return n.scheme+"://"+n.host+(n.port!==i[n.scheme]?":"+n.port:"")+n.path+(n.query?n.query:"")},n=function(e){function i(e){return[e.scheme,e.host,e.port].join("/")}return"string"==typeof e&&(e=t(e)),i(t())===i(e)};return{parseUrl:t,resolveUrl:i,hasSameOrigin:n}}),n("moxie/runtime/RuntimeTarget",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i){function n(){this.uid=e.guid("uid_"),t.call(this),this.destroy=function(){this.disconnectRuntime(),this.unbindAll()}}return n.prototype=i.instance,n}),n("moxie/file/FileReaderSync",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/utils/Encode"],function(e,t,i){return function(){function n(e,t){if(!t.isDetached()){var n=this.connectRuntime(t.ruid).exec.call(this,"FileReaderSync","read",e,t);return this.disconnectRuntime(),n}var r=t.getSource();switch(e){case"readAsBinaryString":return r;case"readAsDataURL":return"data:"+t.type+";base64,"+i.btoa(r);case"readAsText":for(var o="",a=0,s=r.length;s>a;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return n.call(this,"readAsDataURL",e)},readAsText:function(e){return n.call(this,"readAsText",e)}})}}),n("moxie/xhr/FormData",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/file/Blob"],function(e,t,i){function n(){var e,n=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof i?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):n.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(i){t.each(n,function(e){i(e.value,e.name)}),e&&i(e.value,e.name)},destroy:function(){e=null,n=[]}})}return n}),n("moxie/xhr/XMLHttpRequest",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/core/utils/Url","moxie/runtime/Runtime","moxie/runtime/RuntimeTarget","moxie/file/Blob","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/core/utils/Env","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u,c,l,d){function m(){this.uid=e.guid("uid_")}function h(){function i(e,t){return I.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?I[e]:A[e]:(l.can("define_property")?I[e]=t:A[e]=t,void 0):void 0}function u(t){function n(){R&&(R.destroy(),R=null),s.dispatchEvent("loadend"),s=null}function r(r){R.bind("LoadStart",function(e){i("readyState",h.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),L&&s.upload.dispatchEvent(e)}),R.bind("Progress",function(e){i("readyState")!==h.LOADING&&(i("readyState",h.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),R.bind("UploadProgress",function(e){L&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),R.bind("Load",function(t){i("readyState",h.DONE),i("status",Number(r.exec.call(R,"XMLHttpRequest","getStatus")||0)),i("statusText",f[i("status")]||""),i("response",r.exec.call(R,"XMLHttpRequest","getResponse",i("responseType"))),~e.inArray(i("responseType"),["text",""])?i("responseText",i("response")):"document"===i("responseType")&&i("responseXML",i("response")),U=r.exec.call(R,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),i("status")>0?(L&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(F=!0,s.dispatchEvent("error")),n()}),R.bind("Abort",function(e){s.dispatchEvent(e),n()}),R.bind("Error",function(e){F=!0,i("readyState",h.DONE),s.dispatchEvent("readystatechange"),M=!0,s.dispatchEvent(e),n()}),r.exec.call(R,"XMLHttpRequest","send",{url:x,method:v,async:T,user:w,password:y,headers:S,mimeType:D,encoding:O,responseType:s.responseType,withCredentials:s.withCredentials,options:k},t)}var s=this;E=(new Date).getTime(),R=new a,"string"==typeof k.required_caps&&(k.required_caps=o.parseCaps(k.required_caps)),k.required_caps=e.extend({},k.required_caps,{return_response_type:s.responseType}),t instanceof c&&(k.required_caps.send_multipart=!0),e.isEmptyObj(S)||(k.required_caps.send_custom_headers=!0),B||(k.required_caps.do_cors=!0),k.ruid?r(R.connectRuntime(k)):(R.bind("RuntimeInit",function(e,t){r(t)}),R.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),R.connectRuntime(k))}function g(){i("responseText",""),i("responseXML",null),i("response",null),i("status",0),i("statusText",""),E=b=null}var x,v,w,y,E,b,R,_,A=this,I={timeout:0,readyState:h.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},T=!0,S={},O=null,D=null,N=!1,C=!1,L=!1,M=!1,F=!1,B=!1,P=null,H=null,k={},U="";e.extend(this,I,{uid:e.guid("uid_"),upload:new m,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||n.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(v=o.toUpperCase()),~e.inArray(v,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=n.utf8_encode(a),l=r.parseUrl(a),B=r.hasSameOrigin(l),x=r.resolveUrl(a),(u||c)&&!B)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(w=u||l.user,y=c||l.pass,T=s||!0,T===!1&&(i("timeout")||i("withCredentials")||""!==i("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);N=!T,C=!1,S={},g.call(this),i("readyState",h.OPENED),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(i("readyState")!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||n.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(S[r]?S[r]+=", "+o:S[r]=o,!0)},hasRequestHeader:function(e){return e&&S[e.toLowerCase()]||!1},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),F||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(_||(_={},e.each(U.split(/\r\n/),function(t){var i=t.split(/:\s+/);2===i.length&&(i[0]=e.trim(i[0]),_[i[0].toLowerCase()]={header:i[0],value:e.trim(i[1])})})),_.hasOwnProperty(t))?_[t].header+": "+_[t].value:null},overrideMimeType:function(n){var r,o;if(~e.inArray(i("readyState"),[h.LOADING,h.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n=e.trim(n.toLowerCase()),/;/.test(n)&&(r=n.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(n=r[1],r[2]&&(o=r[2])),!d.mimes[n])throw new t.DOMException(t.DOMException.SYNTAX_ERR);P=n,H=o},send:function(i,r){if(k="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.readyState!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i instanceof s)k.ruid=i.ruid,D=i.type||"application/octet-stream";else if(i instanceof c){if(i.hasBlob()){var o=i.getBlob();k.ruid=o.ruid,D=o.type||"application/octet-stream"}}else"string"==typeof i&&(O="UTF-8",D="text/plain;charset=UTF-8",i=n.utf8_encode(i));this.withCredentials||(this.withCredentials=k.required_caps&&k.required_caps.send_browser_cookies&&!B),L=!N&&this.upload.hasEventListener(),F=!1,M=!i,N||(C=!0),u.call(this,i)},abort:function(){if(F=!0,N=!1,~e.inArray(i("readyState"),[h.UNSENT,h.OPENED,h.DONE]))i("readyState",h.UNSENT);else{if(i("readyState",h.DONE),C=!1,!R)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);R.getRuntime().exec.call(R,"XMLHttpRequest","abort",M),M=!0}},destroy:function(){R&&("function"===e.typeOf(R.destroy)&&R.destroy(),R=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}}),this.handleEventProps(p.concat(["readystatechange"])),this.upload.handleEventProps(p)}var f={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};m.prototype=i.instance;var p=["loadstart","progress","abort","error","load","timeout","loadend"];return h.UNSENT=0,h.OPENED=1,h.HEADERS_RECEIVED=2,h.LOADING=3,h.DONE=4,h.prototype=i.instance,h}),n("moxie/runtime/Transporter",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i,n){function r(){function n(){l=d=0,c=this.result=null}function o(t,i){var n=this;u=i,n.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(n.state,[r.IDLE,r.DONE])&&a.call(n)},999),n.bind("TransportingComplete",function(){d=l,n.state=r.DONE,c=null,n.result=u.exec.call(n,"Transporter","getAsBlob",t||"")},999),n.state=r.BUSY,n.trigger("TransportingStarted"),a.call(n)}function a(){var e,i=this,n=l-d;m>n&&(m=n),e=t.btoa(c.substr(d,m)),u.exec.call(i,"Transporter","receive",e,l)}var s,u,c,l,d,m;i.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,i,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),m=r.chunk_size,n.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,i,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,i,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),n.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),n.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=n.instance,r}),n("moxie/image/Image",["moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/file/FileReaderSync","moxie/xhr/XMLHttpRequest","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/runtime/Transporter","moxie/core/utils/Env","moxie/core/EventTarget","moxie/file/Blob","moxie/file/File","moxie/core/utils/Encode"],function(e,t,i,n,r,o,a,s,u,c,l,d,m){function h(){function n(e){try{return e||(e=this.exec("Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name),!0}catch(t){return this.trigger("error",t.code),!1}}function c(t){var n=e.typeOf(t);try{if(t instanceof h){if(!t.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);p.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new i.ImageError(i.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(n,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===n)"data:"===t.substr(0,5)?c.call(this,new l(null,{data:t}),arguments[1]):x.apply(this,arguments);else{if("node"!==n||"img"!==t.nodeName.toLowerCase())throw new i.DOMException(i.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r.code)}}function p(t,i){var n=this.connectRuntime(t.ruid);this.ruid=n.uid,n.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(i)?!0:i)}function g(t,i){function n(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){n(t)}),i&&"string"==typeof i.required_caps&&(i.required_caps=o.parseCaps(i.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},i))):n(this.connectRuntime(t.ruid))}function x(e,t){var i,n=this;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){c.apply(this,arguments)},resize:function(t){var n,r,o=this,a={x:0,y:0,width:o.width,height:o.height},s=e.extendIf({width:o.width,height:o.height,type:o.type||"image/jpeg",quality:90,crop:!1,fit:!0,preserveHeaders:!0,resample:"default",multipass:!0},t);try{if(!o.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);if(o.width>h.MAX_RESIZE_WIDTH||o.height>h.MAX_RESIZE_HEIGHT)throw new i.ImageError(i.ImageError.MAX_RESOLUTION_ERR);if(n=o.meta&&o.meta.tiff&&o.meta.tiff.Orientation||1,-1!==e.inArray(n,[5,6,7,8])){var u=s.width;s.width=s.height,s.height=u}if(s.crop){switch(r=Math.max(s.width/o.width,s.height/o.height),t.fit?(a.width=Math.min(Math.ceil(s.width/r),o.width),a.height=Math.min(Math.ceil(s.height/r),o.height),r=s.width/a.width):(a.width=Math.min(s.width,o.width),a.height=Math.min(s.height,o.height),r=1),"boolean"==typeof s.crop&&(s.crop="cc"),s.crop.toLowerCase().replace(/_/,"-")){case"rb":case"right-bottom":a.x=o.width-a.width,a.y=o.height-a.height;break;case"cb":case"center-bottom":a.x=Math.floor((o.width-a.width)/2),a.y=o.height-a.height;break;case"lb":case"left-bottom":a.x=0,a.y=o.height-a.height;break;case"lt":case"left-top":a.x=0,a.y=0;break;case"ct":case"center-top":a.x=Math.floor((o.width-a.width)/2),a.y=0;break;case"rt":case"right-top":a.x=o.width-a.width,a.y=0;break;case"rc":case"right-center":case"right-middle":a.x=o.width-a.width,a.y=Math.floor((o.height-a.height)/2);break;case"lc":case"left-center":case"left-middle":a.x=0,a.y=Math.floor((o.height-a.height)/2);break;case"cc":case"center-center":case"center-middle":default:a.x=Math.floor((o.width-a.width)/2),a.y=Math.floor((o.height-a.height)/2)}a.x=Math.max(a.x,0),a.y=Math.max(a.y,0)}else r=Math.min(s.width/o.width,s.height/o.height);this.exec("Image","resize",a,r,s)}catch(c){o.trigger("error",c.code)}},downsize:function(t){var i,n={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:!1,preserveHeaders:!0,resample:"default"};i="object"==typeof t?e.extend(n,t):e.extend(n,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]}),this.resize(i)},crop:function(e,t,i){this.downsize(e,t,!0,i)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return this.exec("Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var i=this.getAsDataURL(e,t);return m.atob(i.substring(i.indexOf("base64,")+7))},embed:function(n,r){function o(t,r){var o=this;if(u.can("create_canvas")){var l=o.getAsCanvas();if(l)return n.appendChild(l),l=null,o.destroy(),c.trigger("embedded"),void 0}var d=o.getAsDataURL(t,r);if(!d)throw new i.ImageError(i.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",d.length))n.innerHTML='<img src="'+d+'" width="'+o.width+'" height="'+o.height+'" />',o.destroy(),c.trigger("embedded");else{var h=new s;h.bind("TransportingComplete",function(){a=c.connectRuntime(this.result.ruid),c.bind("Embedded",function(){e.extend(a.getShimContainer().style,{top:"0px",left:"0px",width:o.width+"px",height:o.height+"px"}),a=null},999),a.exec.call(c,"ImageView","display",this.result.uid,width,height),o.destroy()}),h.transport(m.atob(d.substring(d.indexOf("base64,")+7)),t,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:n})}}var a,c=this,l=e.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90},r);try{if(!(n=t.get(n)))throw new i.DOMException(i.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);this.width>h.MAX_RESIZE_WIDTH||this.height>h.MAX_RESIZE_HEIGHT;var d=new h;return d.bind("Resize",function(){o.call(this,l.type,l.quality)}),d.bind("Load",function(){this.downsize(l)}),this.meta.thumb&&this.meta.thumb.width>=l.width&&this.meta.thumb.height>=l.height?d.load(this.meta.thumb.data):d.clone(this,!1),d}catch(f){this.trigger("error",f.code)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.meta&&this.meta.thumb&&this.meta.thumb.data.destroy(),this.unbindAll()}}),this.handleEventProps(f),this.bind("Load Resize",function(){return n.call(this)},999)}var f=["progress","load","error","resize","embedded"];return h.MAX_RESIZE_WIDTH=8192,h.MAX_RESIZE_HEIGHT=8192,h.prototype=c.instance,h}),n("moxie/runtime/html5/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue,l=e.extend({access_binary:u(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return o.can("access_binary")&&!!s.Image},display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:u(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:u(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==n.browser||n.verComp(n.version,9,">"))}()),filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),return_response_headers:c,return_response_type:function(e){return"json"===e&&window.JSON?!0:n.can("return_response_type",e)},return_status_code:c,report_upload_progress:u(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return o.can("access_binary")&&n.can("create_canvas")},select_file:function(){return n.can("use_fileinput")&&window.File},select_folder:function(){return o.can("select_file")&&("Chrome"===n.browser&&n.verComp(n.version,21,">=")||"Firefox"===n.browser&&n.verComp(n.version,42,">="))},select_multiple:function(){return!(!o.can("select_file")||"Safari"===n.browser&&"Windows"===n.os||"iOS"===n.os&&n.verComp(n.osVersion,"7.0.0",">")&&n.verComp(n.osVersion,"8.0.0","<"))},send_binary_string:u(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:u(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||o.can("send_binary_string")},slice_blob:u(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return o.can("slice_blob")&&o.can("send_multipart")},summon_file_dialog:function(){return o.can("select_file")&&("Firefox"===n.browser&&n.verComp(n.version,4,">=")||"Opera"===n.browser&&n.verComp(n.version,12,">=")||"IE"===n.browser&&n.verComp(n.version,10,">=")||!!~e.inArray(n.browser,["Chrome","Safari","Edge"]))},upload_filesize:c,use_http_method:c},arguments[2]);i.call(this,t,arguments[1]||a,l),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html5",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html5/file/Blob",["moxie/runtime/html5/Runtime","moxie/file/Blob"],function(e,t){function i(){function e(e,t,i){var n;if(!window.File.prototype.slice)return(n=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?n.call(e,t,i):null;try{return e.slice(),e.slice(t,i)}catch(r){return e.slice(t,i-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))}}return e.Blob=i}),n("moxie/core/utils/Events",["moxie/core/utils/Basic"],function(e){function t(){this.returnValue=!1}function i(){this.cancelBubble=!0}var n={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=i,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),n.hasOwnProperty(o[r])||(n[o[r]]={}),l=n[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,i,o){var a,s;if(i=i.toLowerCase(),t[r]&&n[t[r]]&&n[t[r]][i]){a=n[t[r]][i];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(i,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+i,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete n[t[r]][i],e.isEmptyObj(n[t[r]])){delete n[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,i){t&&t[r]&&e.each(n[t[r]],function(e,n){a(t,n,i)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),n("moxie/runtime/html5/file/FileInput",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){var e,s;i.extend(this,{init:function(u){var c,l,d,m,h,f,p=this,g=p.getRuntime();e=u,d=e.accept.mimes||o.extList2mimes(e.accept,g.can("filter_by_extension")),l=g.getShimContainer(),l.innerHTML='<input id="'+g.uid+'" type="file" style="font-size:999px;opacity:0;"'+(e.multiple&&g.can("select_multiple")?"multiple":"")+(e.directory&&g.can("select_folder")?"webkitdirectory directory":"")+(d?' accept="'+d.join(",")+'"':"")+" />",c=n.get(g.uid),i.extend(c.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=n.get(e.browse_button),s=n.getStyle(m,"z-index")||"auto",g.can("summon_file_dialog")&&("static"===n.getStyle(m,"position")&&(m.style.position="relative"),r.addEvent(m,"click",function(e){var t=n.get(g.uid);t&&!t.disabled&&t.click(),e.preventDefault()},p.uid),p.bind("Refresh",function(){h=parseInt(s,10)||1,n.get(e.browse_button).style.zIndex=h,this.getRuntime().getShimContainer().style.zIndex=h-1})),f=g.can("summon_file_dialog")?m:l,r.addEvent(f,"mouseover",function(){p.trigger("mouseenter")},p.uid),r.addEvent(f,"mouseout",function(){p.trigger("mouseleave")},p.uid),r.addEvent(f,"mousedown",function(){p.trigger("mousedown")},p.uid),r.addEvent(n.get(e.container),"mouseup",function(){p.trigger("mouseup")},p.uid),c.onchange=function x(){if(p.files=[],i.each(this.files,function(i){var n="";return e.directory&&"."==i.name?!0:(i.webkitRelativePath&&(n="/"+i.webkitRelativePath.replace(/^\//,"")),i=new t(g.uid,i),i.relativePath=n,p.files.push(i),void 0)}),"IE"!==a.browser&&"IEMobile"!==a.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=x}p.files.length&&p.trigger("change")},p.trigger({type:"ready",async:!0}),l=null},setOption:function(e,t){var i=this.getRuntime(),r=n.get(i.uid);switch(e){case"accept":if(t){var a=t.mimes||o.extList2mimes(t,i.can("filter_by_extension"));r.setAttribute("accept",a.join(","))}else r.removeAttribute("accept");break;case"directory":t&&i.can("select_folder")?(r.setAttribute("directory",""),r.setAttribute("webkitdirectory","")):(r.removeAttribute("directory"),r.removeAttribute("webkitdirectory"));break;case"multiple":t&&i.can("select_multiple")?r.setAttribute("multiple",""):r.removeAttribute("multiple")}},disable:function(e){var t,i=this.getRuntime();(t=n.get(i.uid))&&(t.disabled=!!e)},destroy:function(){var t=this.getRuntime(),i=t.getShim(),o=t.getShimContainer(),a=e&&n.get(e.container),u=e&&n.get(e.browse_button);a&&r.removeAllEvents(a,this.uid),u&&(r.removeAllEvents(u,this.uid),u.style.zIndex=s),o&&(r.removeAllEvents(o,this.uid),o.innerHTML=""),i.removeInstance(this.uid),e=o=a=u=i=null}})}return e.FileInput=s}),n("moxie/runtime/html5/file/FileDrop",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime"],function(e,t,i,n,r,o){function a(){function e(e){if(!e.dataTransfer||!e.dataTransfer.types)return!1;var t=i.toArray(e.dataTransfer.types||[]);return-1!==i.inArray("Files",t)||-1!==i.inArray("public.file-url",t)||-1!==i.inArray("application/x-moz-file",t)}function a(e,i){if(u(e)){var n=new t(f,e);n.relativePath=i||"",p.push(n)}}function s(e){for(var t=[],n=0;n<e.length;n++)[].push.apply(t,e[n].extensions.split(/\s*,\s*/));return-1===i.inArray("*",t)?t:[]}function u(e){if(!g.length)return!0;var t=o.getFileExtension(e.name);return!t||-1!==i.inArray(t,g)}function c(e,t){var n=[];i.each(e,function(e){var t=e.webkitGetAsEntry();t&&(t.isFile?a(e.getAsFile(),t.fullPath):n.push(t))}),n.length?l(n,t):t()}function l(e,t){var n=[];i.each(e,function(e){n.push(function(t){d(e,t)})}),i.inSeries(n,function(){t()})}function d(e,t){e.isFile?e.file(function(i){a(i,e.fullPath),t()},function(){t()}):e.isDirectory?m(e,t):t()}function m(e,t){function i(e){r.readEntries(function(t){t.length?([].push.apply(n,t),i(e)):e()},e)}var n=[],r=e.createReader();i(function(){l(n,t)})}var h,f,p=[],g=[];i.extend(this,{init:function(t){var n,o=this;h=t,f=o.ruid,g=s(h.accept),n=h.container,r.addEvent(n,"dragover",function(t){e(t)&&(t.preventDefault(),t.dataTransfer.dropEffect="copy")},o.uid),r.addEvent(n,"drop",function(t){e(t)&&(t.preventDefault(),p=[],t.dataTransfer.items&&t.dataTransfer.items[0].webkitGetAsEntry?c(t.dataTransfer.items,function(){o.files=p,o.trigger("drop")}):(i.each(t.dataTransfer.files,function(e){a(e)}),o.files=p,o.trigger("drop")))},o.uid),r.addEvent(n,"dragenter",function(){o.trigger("dragenter")},o.uid),r.addEvent(n,"dragleave",function(){o.trigger("dragleave")},o.uid)},destroy:function(){r.removeAllEvents(h&&n.get(h.container),this.uid),f=p=g=h=null}})}return e.FileDrop=a}),n("moxie/runtime/html5/file/FileReader",["moxie/runtime/html5/Runtime","moxie/core/utils/Encode","moxie/core/utils/Basic"],function(e,t,i){function n(){function e(e){return t.atob(e.substring(e.indexOf("base64,")+7))}var n,r=!1;i.extend(this,{read:function(t,o){var a=this;a.result="",n=new window.FileReader,n.addEventListener("progress",function(e){a.trigger(e)}),n.addEventListener("load",function(t){a.result=r?e(n.result):n.result,a.trigger(t)}),n.addEventListener("error",function(e){a.trigger(e,n.error)}),n.addEventListener("loadend",function(e){n=null,a.trigger(e)}),"function"===i.typeOf(n[t])?(r=!1,n[t](o.getSource())):"readAsBinaryString"===t&&(r=!0,n.readAsDataURL(o.getSource()))},abort:function(){n&&n.abort()},destroy:function(){n=null}})}return e.FileReader=n}),n("moxie/runtime/html5/xhr/XMLHttpRequest",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/core/utils/Url","moxie/file/File","moxie/file/Blob","moxie/xhr/FormData","moxie/core/Exceptions","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u){function c(){function e(e,t){var i,n,r=this;i=t.getBlob().getSource(),n=new window.FileReader,n.onload=function(){t.append(t.getBlobName(),new o(null,{type:i.type,data:n.result})),f.send.call(r,e,t)},n.readAsBinaryString(i)}function c(){return!window.XMLHttpRequest||"IE"===u.browser&&u.verComp(u.version,8,"<")?function(){for(var e=["Msxml2.XMLHTTP.6.0","Microsoft.XMLHTTP"],t=0;t<e.length;t++)try{return new ActiveXObject(e[t])}catch(i){}}():new window.XMLHttpRequest}function l(e){var t=e.responseXML,i=e.responseText;return"IE"===u.browser&&i&&t&&!t.documentElement&&/[^\/]+\/[^\+]+\+xml/.test(e.getResponseHeader("Content-Type"))&&(t=new window.ActiveXObject("Microsoft.XMLDOM"),t.async=!1,t.validateOnParse=!1,t.loadXML(i)),t&&("IE"===u.browser&&0!==t.parseError||!t.documentElement||"parsererror"===t.documentElement.tagName)?null:t}function d(e){var t="----moxieboundary"+(new Date).getTime(),i="--",n="\r\n",r="",a=this.getRuntime();if(!a.can("send_binary_string"))throw new s.RuntimeError(s.RuntimeError.NOT_SUPPORTED_ERR);return m.setRequestHeader("Content-Type","multipart/form-data; boundary="+t),e.each(function(e,a){r+=e instanceof o?i+t+n+'Content-Disposition: form-data; name="'+a+'"; filename="'+unescape(encodeURIComponent(e.name||"blob"))+'"'+n+"Content-Type: "+(e.type||"application/octet-stream")+n+n+e.getSource()+n:i+t+n+'Content-Disposition: form-data; name="'+a+'"'+n+n+unescape(encodeURIComponent(e))+n}),r+=i+t+i+n}var m,h,f=this;t.extend(this,{send:function(i,r){var s=this,l="Mozilla"===u.browser&&u.verComp(u.version,4,">=")&&u.verComp(u.version,7,"<"),f="Android Browser"===u.browser,p=!1;
15
- if(h=i.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),m=c(),m.open(i.method,i.url,i.async,i.user,i.password),r instanceof o)r.isDetached()&&(p=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),p=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,i,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}m.upload?(i.withCredentials&&(m.withCredentials=!0),m.addEventListener("load",function(e){s.trigger(e)}),m.addEventListener("error",function(e){s.trigger(e)}),m.addEventListener("progress",function(e){s.trigger(e)}),m.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):m.onreadystatechange=function(){switch(m.readyState){case 1:break;case 2:break;case 3:var e,t;try{n.hasSameOrigin(i.url)&&(e=m.getResponseHeader("Content-Length")||0),m.responseText&&(t=m.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:m.onreadystatechange=function(){},0===m.status?s.trigger("error"):s.trigger("load")}},t.isEmptyObj(i.headers)||t.each(i.headers,function(e,t){m.setRequestHeader(t,e)}),""!==i.responseType&&"responseType"in m&&(m.responseType="json"!==i.responseType||u.can("return_response_type","json")?i.responseType:"text"),p?m.sendAsBinary?m.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;t<r.length;t++)e[t]=255&r.charCodeAt(t);m.send(e.buffer)}():m.send(r),s.trigger("loadstart")},getStatus:function(){try{if(m)return m.status}catch(e){}return 0},getResponse:function(e){var t=this.getRuntime();try{switch(e){case"blob":var n=new r(t.uid,m.response),o=m.getResponseHeader("Content-Disposition");if(o){var a=o.match(/filename=([\'\"'])([^\1]+)\1/);a&&(h=a[2])}return n.name=h,n.type||(n.type=i.getFileMime(h)),n;case"json":return u.can("return_response_type","json")?m.response:200===m.status&&window.JSON?JSON.parse(m.responseText):null;case"document":return l(m);default:return""!==m.responseText?m.responseText:null}}catch(s){return null}},getAllResponseHeaders:function(){try{return m.getAllResponseHeaders()}catch(e){}return""},abort:function(){m&&m.abort()},destroy:function(){f=h=null}})}return e.XMLHttpRequest=c}),n("moxie/runtime/html5/utils/BinaryReader",["moxie/core/utils/Basic"],function(e){function t(e){e instanceof ArrayBuffer?i.apply(this,arguments):n.apply(this,arguments)}function i(t){var i=new DataView(t);e.extend(this,{readByteAt:function(e){return i.getUint8(e)},writeByteAt:function(e,t){i.setUint8(e,t)},SEGMENT:function(e,n,r){switch(arguments.length){case 2:return t.slice(e,e+n);case 1:return t.slice(e);case 3:if(null===r&&(r=new ArrayBuffer),r instanceof ArrayBuffer){var o=new Uint8Array(this.length()-n+r.byteLength);e>0&&o.set(new Uint8Array(t.slice(0,e)),0),o.set(new Uint8Array(r),e),o.set(new Uint8Array(t.slice(e+n)),e+r.byteLength),this.clear(),t=o.buffer,i=new DataView(t);break}default:return t}},length:function(){return t?t.byteLength:0},clear:function(){i=t=null}})}function n(t){function i(e,i,n){n=3===arguments.length?n:t.length-i-1,t=t.substr(0,i)+e+t.substr(n+i)}e.extend(this,{readByteAt:function(e){return t.charCodeAt(e)},writeByteAt:function(e,t){i(String.fromCharCode(t),e,1)},SEGMENT:function(e,n,r){switch(arguments.length){case 1:return t.substr(e);case 2:return t.substr(e,n);case 3:i(null!==r?r:"",e,n);break;default:return t}},length:function(){return t?t.length:0},clear:function(){t=null}})}return e.extend(t.prototype,{littleEndian:!1,read:function(e,t){var i,n,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");for(n=this.littleEndian?0:-8*(t-1),r=0,i=0;t>r;r++)i|=this.readByteAt(e+r)<<Math.abs(n+8*r);return i},write:function(e,t,i){var n,r;if(e>this.length())throw new Error("You are trying to write outside the source boundaries.");for(n=this.littleEndian?0:-8*(i-1),r=0;i>r;r++)this.writeByteAt(e+r,255&t>>Math.abs(n+8*r))},BYTE:function(e){return this.read(e,1)},SHORT:function(e){return this.read(e,2)},LONG:function(e){return this.read(e,4)},SLONG:function(e){var t=this.read(e,4);return t>2147483647?t-4294967296:t},CHAR:function(e){return String.fromCharCode(this.read(e,1))},STRING:function(e,t){return this.asArray("CHAR",e,t).join("")},asArray:function(e,t,i){for(var n=[],r=0;i>r;r++)n[r]=this[e](t+r);return n}}),t}),n("moxie/runtime/html5/image/JPEGHeaders",["moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,t){return function i(n){var r,o,a,s=[],u=0;if(r=new e(n),65496!==r.SHORT(0))throw r.clear(),new t.ImageError(t.ImageError.WRONG_FORMAT);for(o=2;o<=r.length();)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;u=r.SHORT(o+2)+2,a>=65505&&65519>=a&&s.push({hex:a,name:"APP"+(15&a),start:o,length:u,segment:r.SEGMENT(o,u)}),o+=u}return r.clear(),{headers:s,restore:function(t){var i,n,r;for(r=new e(t),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,i=s.length;i>n;n++)r.SEGMENT(o,0,s[n].segment),o+=s[n].length;return t=r.SEGMENT(),r.clear(),t},strip:function(t){var n,r,o,a;for(o=new i(t),r=o.headers,o.purge(),n=new e(t),a=r.length;a--;)n.SEGMENT(r[a].start,r[a].length,"");return t=n.SEGMENT(),n.clear(),t},get:function(e){for(var t=[],i=0,n=s.length;n>i;i++)s[i].name===e.toUpperCase()&&t.push(s[i].segment);return t},set:function(e,t){var i,n,r,o=[];for("string"==typeof t?o.push(t):o=t,i=n=0,r=s.length;r>i&&(s[i].name===e.toUpperCase()&&(s[i].segment=o[n],s[i].length=o[n].length,n++),!(n>=o.length));i++);},purge:function(){this.headers=s=[]}}}}),n("moxie/runtime/html5/image/ExifParser",["moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,i,n){function r(o){function a(i,r){var o,a,s,u,c,m,h,f,p=this,g=[],x={},v={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"},w={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};for(o=p.SHORT(i),a=0;o>a;a++)if(g=[],h=i+2+12*a,s=r[p.SHORT(h)],s!==t){if(u=v[p.SHORT(h+=2)],c=p.LONG(h+=2),m=w[u],!m)throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(h+=4,m*c>4&&(h=p.LONG(h)+d.tiffHeader),h+m*c>=this.length())throw new n.ImageError(n.ImageError.INVALID_META_ERR);"ASCII"!==u?(g=p.asArray(u,h,c),f=1==c?g[0]:g,x[s]=l.hasOwnProperty(s)&&"object"!=typeof f?l[s][f]:f):x[s]=e.trim(p.STRING(h,c).replace(/\0$/,""))}return x}function s(e,t,i){var n,r,o,a=0;if("string"==typeof t){var s=c[e.toLowerCase()];for(var u in s)if(s[u]===t){t=u;break}}n=d[e.toLowerCase()+"IFD"],r=this.SHORT(n);for(var l=0;r>l;l++)if(o=n+12*l+2,this.SHORT(o)==t){a=o+8;break}if(!a)return!1;try{this.write(a,i,4)}catch(m){return!1}return!0}var u,c,l,d,m,h;if(i.call(this,o),c={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"},thumb:{513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},d={tiffHeader:10},m=d.tiffHeader,u={clear:this.clear},e.extend(this,{read:function(){try{return r.prototype.read.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},write:function(){try{return r.prototype.write.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},UNDEFINED:function(){return this.BYTE.apply(this,arguments)},RATIONAL:function(e){return this.LONG(e)/this.LONG(e+4)},SRATIONAL:function(e){return this.SLONG(e)/this.SLONG(e+4)},ASCII:function(e){return this.CHAR(e)},TIFF:function(){return h||null},EXIF:function(){var t=null;if(d.exifIFD){try{t=a.call(this,d.exifIFD,c.exif)}catch(i){return null}if(t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n<t.ExifVersion.length;n++)r+=String.fromCharCode(t.ExifVersion[n]);t.ExifVersion=r}}return t},GPS:function(){var t=null;if(d.gpsIFD){try{t=a.call(this,d.gpsIFD,c.gps)}catch(i){return null}t.GPSVersionID&&"array"===e.typeOf(t.GPSVersionID)&&(t.GPSVersionID=t.GPSVersionID.join("."))}return t},thumb:function(){if(d.IFD1)try{var e=a.call(this,d.IFD1,c.thumb);if("JPEGInterchangeFormat"in e)return this.SEGMENT(d.tiffHeader+e.JPEGInterchangeFormat,e.JPEGInterchangeFormatLength)}catch(t){}return null},setExif:function(e,t){return"PixelXDimension"!==e&&"PixelYDimension"!==e?!1:s.call(this,"exif",e,t)},clear:function(){u.clear(),o=c=l=h=d=u=null}}),65505!==this.SHORT(0)||"EXIF\0"!==this.STRING(4,5).toUpperCase())throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(this.littleEndian=18761==this.SHORT(m),42!==this.SHORT(m+=2))throw new n.ImageError(n.ImageError.INVALID_META_ERR);d.IFD0=d.tiffHeader+this.LONG(m+=2),h=a.call(this,d.IFD0,c.tiff),"ExifIFDPointer"in h&&(d.exifIFD=d.tiffHeader+h.ExifIFDPointer,delete h.ExifIFDPointer),"GPSInfoIFDPointer"in h&&(d.gpsIFD=d.tiffHeader+h.GPSInfoIFDPointer,delete h.GPSInfoIFDPointer),e.isEmptyObj(h)&&(h=null);var f=this.LONG(d.IFD0+12*this.SHORT(d.IFD0)+2);f&&(d.IFD1=d.tiffHeader+f)}return r.prototype=i.prototype,r}),n("moxie/runtime/html5/image/JPEG",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEGHeaders","moxie/runtime/html5/utils/BinaryReader","moxie/runtime/html5/image/ExifParser"],function(e,t,i,n,r){function o(o){function a(e){var t,i,n=0;for(e||(e=c);n<=e.length();){if(t=e.SHORT(n+=2),t>=65472&&65475>=t)return n+=5,{height:e.SHORT(n),width:e.SHORT(n+=2)};i=e.SHORT(n+=2),n+=i-2}return null}function s(){var e,t,i=d.thumb();return i&&(e=new n(i),t=a(e),e.clear(),t)?(t.data=i,t):null}function u(){d&&l&&c&&(d.clear(),l.purge(),c.clear(),m=l=d=c=null)}var c,l,d,m;if(c=new n(o),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new i(o);try{d=new r(l.get("app1")[0])}catch(h){}m=a.call(this),e.extend(this,{type:"image/jpeg",size:c.length(),width:m&&m.width||0,height:m&&m.height||0,setExif:function(t,i){return d?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,i),l.set("app1",d.SEGMENT()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):l.restore(o)},stripHeaders:function(e){return l.strip(e)},purge:function(){u.call(this)}}),d&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS(),thumb:s()})}return o}),n("moxie/runtime/html5/image/PNG",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader"],function(e,t,i){function n(n){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:s.LONG(t),height:s.LONG(t+=4)}):null}function o(){s&&(s.clear(),n=l=u=c=s=null)}function a(e){var t,i,n,r;return t=s.LONG(e),i=s.STRING(e+=4,4),n=e+=4,r=s.LONG(e+t),{length:t,type:i,start:n,CRC:r}}var s,u,c,l;s=new i(n),function(){var t=0,i=0,n=[35152,20039,3338,6666];for(i=0;i<n.length;i++,t+=2)if(n[i]!=s.SHORT(t))throw new e.ImageError(e.ImageError.WRONG_FORMAT)}(),l=r.call(this),t.extend(this,{type:"image/png",size:s.length(),width:l.width,height:l.height,purge:function(){o.call(this)}}),o.call(this)}return n}),n("moxie/runtime/html5/image/ImageInfo",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEG","moxie/runtime/html5/image/PNG"],function(e,t,i,n){return function(r){var o,a=[i,n];o=function(){for(var e=0;e<a.length;e++)try{return new a[e](r)}catch(i){}throw new t.ImageError(t.ImageError.WRONG_FORMAT)}(),e.extend(this,{type:"",size:0,width:0,height:0,setExif:function(){},writeHeaders:function(e){return e},stripHeaders:function(e){return e},purge:function(){r=null}}),e.extend(this,o),this.purge=function(){o.purge(),o=null}}}),n("moxie/runtime/html5/image/ResizerCanvas",[],function(){function e(i,n){var r=i.width,o=Math.floor(r*n),a=!1;(.5>n||n>2)&&(n=.5>n?.5:2,a=!0);var s=t(i,n);return a?e(s,o/s.width):s}function t(e,t){var i=e.width,n=e.height,r=Math.floor(i*t),o=Math.floor(n*t),a=document.createElement("canvas");return a.width=r,a.height=o,a.getContext("2d").drawImage(e,0,0,i,n,0,0,r,o),e=null,a}return{scale:e}}),n("moxie/runtime/html5/image/Image",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/runtime/html5/image/ImageInfo","moxie/runtime/html5/image/ResizerCanvas","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u){function c(){function e(){if(!v&&!g)throw new i.ImageError(i.DOMException.INVALID_STATE_ERR);return v||g}function c(){var t=e();return"canvas"==t.nodeName.toLowerCase()?t:(v=document.createElement("canvas"),v.width=t.width,v.height=t.height,v.getContext("2d").drawImage(t,0,0),v)}function l(e){return n.atob(e.substring(e.indexOf("base64,")+7))}function d(e,t){return"data:"+(t||"")+";base64,"+n.btoa(e)}function m(e){var t=this;g=new Image,g.onerror=function(){p.call(this),t.trigger("error",i.ImageError.WRONG_FORMAT)},g.onload=function(){t.trigger("load")},g.src="data:"==e.substr(0,5)?e:d(e,y.type)}function h(e,t){var n,r=this;return window.FileReader?(n=new FileReader,n.onload=function(){t.call(r,this.result)},n.onerror=function(){r.trigger("error",i.ImageError.WRONG_FORMAT)},n.readAsDataURL(e),void 0):t.call(this,e.getAsDataURL())}function f(e,i){var n=Math.PI/180,r=document.createElement("canvas"),o=r.getContext("2d"),a=e.width,s=e.height;switch(t.inArray(i,[5,6,7,8])>-1?(r.width=s,r.height=a):(r.width=a,r.height=s),i){case 2:o.translate(a,0),o.scale(-1,1);break;case 3:o.translate(a,s),o.rotate(180*n);break;case 4:o.translate(0,s),o.scale(1,-1);break;case 5:o.rotate(90*n),o.scale(1,-1);break;case 6:o.rotate(90*n),o.translate(0,-s);break;case 7:o.rotate(90*n),o.translate(a,-s),o.scale(-1,1);break;case 8:o.rotate(-90*n),o.translate(-a,0)}return o.drawImage(e,0,0,a,s),r}function p(){x&&(x.purge(),x=null),w=g=v=y=null,b=!1}var g,x,v,w,y,E=this,b=!1,R=!0;t.extend(this,{loadFromBlob:function(e){var t=this.getRuntime(),n=arguments.length>1?arguments[1]:!0;if(!t.can("access_binary"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return y=e,e.isDetached()?(w=e.getSource(),m.call(this,w),void 0):(h.call(this,e.getSource(),function(e){n&&(w=l(e)),m.call(this,e)}),void 0)},loadFromImage:function(e,t){this.meta=e.meta,y=new o(null,{name:e.name,size:e.size,type:e.type}),m.call(this,t?w=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t,i=this.getRuntime();return!x&&w&&i.can("access_image_binary")&&(x=new a(w)),t={width:e().width||0,height:e().height||0,type:y.type||u.getFileMime(y.name),size:w&&w.length||y.size||0,name:y.name||"",meta:null},R&&(t.meta=x&&x.meta||this.meta||{},!t.meta||!t.meta.thumb||t.meta.thumb.data instanceof r||(t.meta.thumb.data=new r(null,{type:"image/jpeg",data:t.meta.thumb.data}))),t},resize:function(t,i,n){var r=document.createElement("canvas");if(r.width=t.width,r.height=t.height,r.getContext("2d").drawImage(e(),t.x,t.y,t.width,t.height,0,0,r.width,r.height),v=s.scale(r,i),R=n.preserveHeaders,!R){var o=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1;v=f(v,o)}this.width=v.width,this.height=v.height,b=!0,this.trigger("Resize")},getAsCanvas:function(){return v||(v=c()),v.id=this.uid+"_canvas",v},getAsBlob:function(e,t){return e!==this.type?(b=!0,new o(null,{name:y.name||"",type:e,data:E.getAsDataURL(e,t)})):new o(null,{name:y.name||"",type:e,data:E.getAsBinaryString(e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!b)return g.src;if(c(),"image/jpeg"!==e)return v.toDataURL("image/png");try{return v.toDataURL("image/jpeg",t/100)}catch(i){return v.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!b)return w||(w=l(E.getAsDataURL(e,t))),w;if("image/jpeg"!==e)w=l(E.getAsDataURL(e,t));else{var i;t||(t=90),c();try{i=v.toDataURL("image/jpeg",t/100)}catch(n){i=v.toDataURL("image/jpeg")}w=l(i),x&&(w=x.stripHeaders(w),R&&(x.meta&&x.meta.exif&&x.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),w=x.writeHeaders(w)),x.purge(),x=null)}return b=!1,w},destroy:function(){E=null,p.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=c}),n("moxie/runtime/flash/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(i){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function s(e){var n=i.get(e);n&&"OBJECT"==n.nodeName&&("IE"===t.browser?(n.style.display="none",function r(){4==n.readyState?u(e):setTimeout(r,10)}()):n.parentNode.removeChild(n))}function u(e){var t=i.get(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function c(u){var c,m=this;u=e.extend({swf_url:t.swf_url},u),o.call(this,u,l,{access_binary:function(e){return e&&"browser"===m.mode},access_image_binary:function(e){return e&&"browser"===m.mode},display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===m.mode},resize_image:o.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===m.mode},return_status_code:function(t){return"browser"===m.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:function(e){return e&&"browser"===m.mode},send_browser_cookies:function(e){return e&&"browser"===m.mode},send_custom_headers:function(e){return e&&"browser"===m.mode},send_multipart:o.capTrue,slice_blob:function(e){return e&&"browser"===m.mode},stream_upload:function(e){return e&&"browser"===m.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===m.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},slice_blob:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),a()<11.3&&(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid)},shimExec:function(e,t){var i=[].slice.call(arguments,2);return m.getShim().exec(this.uid,e,t,i)},init:function(){var i,r,o;o=this.getShimContainer(),e.extend(o.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),i='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+u.swf_url+'" ',"IE"===t.browser&&(i+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),i+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+u.swf_url+'" />'+'<param name="flashvars" value="uid='+escape(this.uid)+"&target="+t.global_event_dispatcher+'" />'+'<param name="wmode" value="transparent" />'+'<param name="allowscriptaccess" value="always" />'+"</object>","IE"===t.browser?(r=document.createElement("div"),o.appendChild(r),r.outerHTML=i,r=o=null):o.innerHTML=i,c=setTimeout(function(){m&&!m.initialized&&m.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){s(m.uid),e.call(m),clearTimeout(c),u=c=e=m=null}}(this.destroy)},d)}var l="flash",d={};return o.addConstructor(l,c),d}),n("moxie/runtime/flash/file/Blob",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={slice:function(e,i,n,r){var o=this.getRuntime();return 0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),e=o.shimExec.call(this,"Blob","slice",i,n,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=i}),n("moxie/runtime/flash/file/FileInput",["moxie/runtime/flash/Runtime","moxie/file/File","moxie/core/utils/Basic"],function(e,t,i){var n={init:function(e){var n=this,r=this.getRuntime();this.bind("Change",function(){var e=r.shimExec.call(n,"FileInput","getFiles");n.files=[],i.each(e,function(e){n.files.push(new t(r.uid,e))})},999),this.getRuntime().shimExec.call(this,"FileInput","init",{accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=n}),n("moxie/runtime/flash/file/FileReader",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n=this;return n.result="","readAsDataURL"===e&&(n.result="data:"+(t.type||"")+";base64,"),n.bind("Progress",function(t,r){r&&(n.result+=i(r,e))},999),n.getRuntime().shimExec.call(this,"FileReader","readAsBase64",t.uid)}};return e.FileReader=n}),n("moxie/runtime/flash/file/FileReaderSync",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n,r=this.getRuntime();return(n=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(n="data:"+(t.type||"")+";base64,"+n),i(n,e,t.type)):null}};return e.FileReaderSync=n}),n("moxie/runtime/flash/runtime/Transporter",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={getAsBlob:function(e){var i=this.getRuntime(),n=i.shimExec.call(this,"Transporter","getAsBlob",e);return n?new t(i.uid,n):null}};return e.Transporter=i}),n("moxie/runtime/flash/xhr/XMLHttpRequest",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/file/File","moxie/file/FileReaderSync","moxie/runtime/flash/file/FileReaderSync","moxie/xhr/FormData","moxie/runtime/Transporter","moxie/runtime/flash/runtime/Transporter"],function(e,t,i,n,r,o,a,s){var u={send:function(e,n){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,n)}function o(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),n=null,r()}function u(e,t){var i=new s;i.bind("TransportingComplete",function(){t(this.result)}),i.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),n instanceof a){var d;if(n.each(function(e,t){e instanceof i?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),n.hasBlob()){var m=n.getBlob();m.isDetached()?u(m,function(e){m.destroy(),o(d,e)}):o(d,m)}else n=null,r()}else n instanceof i?n.isDetached()?u(n,function(e){n.destroy(),n=e.uid,r()}):(n=n.uid,r()):r()},getResponse:function(e){var i,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new n(a.uid,o),"blob"===e)return o;try{if(i=new r,~t.inArray(e,["","text"]))return i.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(i.readAsText(o))}finally{o.destroy()}}return null},abort:function(){var e=this.getRuntime();e.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=u}),n("moxie/runtime/flash/image/Image",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/runtime/Transporter","moxie/file/Blob","moxie/file/FileReaderSync"],function(e,t,i,n,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(n,"Image","loadFromBlob",e.uid),n=r=null}var n=this,r=n.getRuntime();if(e.isDetached()){var o=new i;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getInfo:function(){var e=this.getRuntime(),t=e.shimExec.call(this,"Image","getInfo");return t.meta&&t.meta.thumb&&t.meta.thumb.data&&!(e.meta.thumb.data instanceof n)&&(t.meta.thumb.data=new n(e.uid,t.meta.thumb.data)),t},getAsBlob:function(e,t){var i=this.getRuntime(),r=i.shimExec.call(this,"Image","getAsBlob",e,t);return r?new n(i.uid,r):null},getAsDataURL:function(){var e,t=this.getRuntime(),i=t.Image.getAsBlob.apply(this,arguments);return i?(e=new r,e.readAsDataURL(i)):null}};return e.Image=o}),n("moxie/runtime/silverlight/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(e){var t,i,n,r,o,a=!1,s=null,u=0;try{try{s=new ActiveXObject("AgControl.AgControl"),s.IsVersionSupported(e)&&(a=!0),s=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(t=l.description,"1.0.30226.2"===t&&(t="2.0.30226.2"),i=t.split(".");i.length>3;)i.pop();for(;i.length<4;)i.push(0);for(n=e.split(".");n.length>4;)n.pop();do r=parseInt(n[u],10),o=parseInt(i[u],10),u++;while(u<n.length&&r===o);o>=r&&!isNaN(r)&&(a=!0)}}}catch(d){a=!1}return a}function s(s){var l,d=this;s=e.extend({xap_url:t.xap_url},s),o.call(this,s,u,{access_binary:o.capTrue,access_image_binary:o.capTrue,display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:o.capTrue,resize_image:o.capTrue,return_response_headers:function(e){return e&&"client"===d.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===d.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:o.capTrue,send_browser_cookies:function(e){return e&&"browser"===d.mode},send_custom_headers:function(e){return e&&"client"===d.mode},send_multipart:o.capTrue,slice_blob:o.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:o.capTrue,use_http_method:function(t){return"client"===d.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),a("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid).content.Moxie},shimExec:function(e,t){var i=[].slice.call(arguments,2);return d.getShim().exec(this.uid,e,t,i)},init:function(){var e;e=this.getShimContainer(),e.innerHTML='<object id="'+this.uid+'" data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%" style="outline:none;">'+'<param name="source" value="'+s.xap_url+'"/>'+'<param name="background" value="Transparent"/>'+'<param name="windowless" value="true"/>'+'<param name="enablehtmlaccess" value="true"/>'+'<param name="initParams" value="uid='+this.uid+",target="+t.global_event_dispatcher+'"/>'+"</object>",l=setTimeout(function(){d&&!d.initialized&&d.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(d),clearTimeout(l),s=l=e=d=null}}(this.destroy)},c)}var u="silverlight",c={};return o.addConstructor(u,s),c}),n("moxie/runtime/silverlight/file/Blob",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/Blob"],function(e,t,i){return e.Blob=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileInput",["moxie/runtime/silverlight/Runtime","moxie/file/File","moxie/core/utils/Basic"],function(e,t,i){function n(e){for(var t="",i=0;i<e.length;i++)t+=(""!==t?"|":"")+e[i].title+" | *."+e[i].extensions.replace(/,/g,";*.");return t}var r={init:function(e){var r=this,o=this.getRuntime();this.bind("Change",function(){var e=o.shimExec.call(r,"FileInput","getFiles");r.files=[],i.each(e,function(e){r.files.push(new t(o.uid,e))})},999),o.shimExec.call(this,"FileInput","init",n(e.accept),e.multiple),this.trigger("ready")},setOption:function(e,t){"accept"==e&&(t=n(t)),this.getRuntime().shimExec.call(this,"FileInput","setOption",e,t)}};return e.FileInput=r}),n("moxie/runtime/silverlight/file/FileDrop",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Dom","moxie/core/utils/Events"],function(e,t,i){var n={init:function(){var e,n=this,r=n.getRuntime();return e=r.getShimContainer(),i.addEvent(e,"dragover",function(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect="copy"},n.uid),i.addEvent(e,"dragenter",function(e){e.preventDefault();var i=t.get(r.uid).dragEnter(e);i&&e.stopPropagation()},n.uid),i.addEvent(e,"drop",function(e){e.preventDefault();var i=t.get(r.uid).dragDrop(e);i&&e.stopPropagation()},n.uid),r.shimExec.call(this,"FileDrop","init")}};return e.FileDrop=n}),n("moxie/runtime/silverlight/file/FileReader",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReader"],function(e,t,i){return e.FileReader=t.extend({},i)
16
- }),n("moxie/runtime/silverlight/file/FileReaderSync",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReaderSync"],function(e,t,i){return e.FileReaderSync=t.extend({},i)}),n("moxie/runtime/silverlight/runtime/Transporter",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/runtime/Transporter"],function(e,t,i){return e.Transporter=t.extend({},i)}),n("moxie/runtime/silverlight/xhr/XMLHttpRequest",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/xhr/XMLHttpRequest","moxie/runtime/silverlight/file/FileReaderSync","moxie/runtime/silverlight/runtime/Transporter"],function(e,t,i){return e.XMLHttpRequest=t.extend({},i)}),n("moxie/runtime/silverlight/image/Image",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/runtime/flash/image/Image"],function(e,t,i,n){return e.Image=t.extend({},n,{getInfo:function(){var e=this.getRuntime(),n=["tiff","exif","gps","thumb"],r={meta:{}},o=e.shimExec.call(this,"Image","getInfo");return o.meta&&(t.each(n,function(e){var t,i,n,a,s=o.meta[e];if(s&&s.keys)for(r.meta[e]={},i=0,n=s.keys.length;n>i;i++)t=s.keys[i],a=s[t],a&&(/^(\d|[1-9]\d+)$/.test(a)?a=parseInt(a,10):/^\d*\.\d+$/.test(a)&&(a=parseFloat(a)),r.meta[e][t]=a)}),r.meta&&r.meta.thumb&&r.meta.thumb.data&&!(e.meta.thumb.data instanceof i)&&(r.meta.thumb.data=new i(e.uid,r.meta.thumb.data))),r.width=parseInt(o.width,10),r.height=parseInt(o.height,10),r.size=parseInt(o.size,10),r.type=o.type,r.name=o.name,r},resize:function(e,t,i){this.getRuntime().shimExec.call(this,"Image","resize",e.x,e.y,e.width,e.height,t,i.preserveHeaders,i.resample)}})}),n("moxie/runtime/html4/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue;i.call(this,t,a,{access_binary:u(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:!1,drag_and_drop:!1,filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),resize_image:function(){return s.Image&&o.can("access_binary")&&n.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return n.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return o.can("select_file")},summon_file_dialog:function(){return o.can("select_file")&&("Firefox"===n.browser&&n.verComp(n.version,4,">=")||"Opera"===n.browser&&n.verComp(n.version,12,">=")||"IE"===n.browser&&n.verComp(n.version,10,">=")||!!~e.inArray(n.browser,["Chrome","Safari"]))},upload_filesize:c,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html4",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html4/file/FileInput",["moxie/runtime/html4/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){function e(){var o,c,d,m,h,f,p=this,g=p.getRuntime();f=i.guid("uid_"),o=g.getShimContainer(),s&&(d=n.get(s+"_form"),d&&i.extend(d.style,{top:"100%"})),m=document.createElement("form"),m.setAttribute("id",f+"_form"),m.setAttribute("method","post"),m.setAttribute("enctype","multipart/form-data"),m.setAttribute("encoding","multipart/form-data"),i.extend(m.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),h=document.createElement("input"),h.setAttribute("id",f),h.setAttribute("type","file"),h.setAttribute("accept",l.join(",")),i.extend(h.style,{fontSize:"999px",opacity:0}),m.appendChild(h),o.appendChild(m),i.extend(h.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===a.browser&&a.verComp(a.version,10,"<")&&i.extend(h.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),h.onchange=function(){var i;if(this.value){if(this.files){if(i=this.files[0],0===i.size)return m.parentNode.removeChild(m),void 0}else i={name:this.value};i=new t(g.uid,i),this.onchange=function(){},e.call(p),p.files=[i],h.setAttribute("id",i.uid),m.setAttribute("id",i.uid+"_form"),p.trigger("change"),h=m=null}},g.can("summon_file_dialog")&&(c=n.get(u.browse_button),r.removeEvent(c,"click",p.uid),r.addEvent(c,"click",function(e){h&&!h.disabled&&h.click(),e.preventDefault()},p.uid)),s=f,o=d=c=null}var s,u,c,l=[];i.extend(this,{init:function(t){var i,a=this,s=a.getRuntime();u=t,l=t.accept.mimes||o.extList2mimes(t.accept,s.can("filter_by_extension")),i=s.getShimContainer(),function(){var e,o,l;e=n.get(t.browse_button),c=n.getStyle(e,"z-index")||"auto",s.can("summon_file_dialog")&&("static"===n.getStyle(e,"position")&&(e.style.position="relative"),a.bind("Refresh",function(){o=parseInt(c,10)||1,n.get(u.browse_button).style.zIndex=o,this.getRuntime().getShimContainer().style.zIndex=o-1})),l=s.can("summon_file_dialog")?e:i,r.addEvent(l,"mouseover",function(){a.trigger("mouseenter")},a.uid),r.addEvent(l,"mouseout",function(){a.trigger("mouseleave")},a.uid),r.addEvent(l,"mousedown",function(){a.trigger("mousedown")},a.uid),r.addEvent(n.get(t.container),"mouseup",function(){a.trigger("mouseup")},a.uid),e=null}(),e.call(this),i=null,a.trigger({type:"ready",async:!0})},setOption:function(e,t){var i,r=this.getRuntime();"accept"==e&&(l=t.mimes||o.extList2mimes(t,r.can("filter_by_extension"))),i=n.get(s),i&&i.setAttribute("accept",l.join(","))},disable:function(e){var t;(t=n.get(s))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),o=u&&n.get(u.container),a=u&&n.get(u.browse_button);o&&r.removeAllEvents(o,this.uid),a&&(r.removeAllEvents(a,this.uid),a.style.zIndex=c),i&&(r.removeAllEvents(i,this.uid),i.innerHTML=""),t.removeInstance(this.uid),s=l=u=i=o=a=t=null}})}return e.FileInput=s}),n("moxie/runtime/html4/file/FileReader",["moxie/runtime/html4/Runtime","moxie/runtime/html5/file/FileReader"],function(e,t){return e.FileReader=t}),n("moxie/runtime/html4/xhr/XMLHttpRequest",["moxie/runtime/html4/Runtime","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Url","moxie/core/Exceptions","moxie/core/utils/Events","moxie/file/Blob","moxie/xhr/FormData"],function(e,t,i,n,r,o,a,s){function u(){function e(e){var t,n,r,a,s=this,u=!1;if(l){if(t=l.id.replace(/_iframe$/,""),n=i.get(t+"_form")){for(r=n.getElementsByTagName("input"),a=r.length;a--;)switch(r[a].getAttribute("type")){case"hidden":r[a].parentNode.removeChild(r[a]);break;case"file":u=!0}r=[],u||n.parentNode.removeChild(n),n=null}setTimeout(function(){o.removeEvent(l,"load",s.uid),l.parentNode&&l.parentNode.removeChild(l);var t=s.getRuntime().getShimContainer();t.children.length||t.parentNode.removeChild(t),t=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,m){function h(){var i=w.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='<iframe id="'+f+'_iframe" name="'+f+'_iframe" src="javascript:&quot;&quot;" style="display:none"></iframe>',l=r.firstChild,i.appendChild(l),o.addEvent(l,"load",function(){var i;try{i=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(i.title)?u=i.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(i.body.innerHTML),v.trigger({type:"progress",loaded:c.length,total:c.length}),x&&v.trigger({type:"uploadprogress",loaded:x.size||1025,total:x.size||1025}))}catch(r){if(!n.hasSameOrigin(d.url))return e.call(v,function(){v.trigger("error")}),void 0;u=404}e.call(v,function(){v.trigger("load")})},v.uid)}var f,p,g,x,v=this,w=v.getRuntime();if(u=c=null,m instanceof s&&m.hasBlob()){if(x=m.getBlob(),f=x.uid,g=i.get(f),p=i.get(f+"_form"),!p)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else f=t.guid("uid_"),p=document.createElement("form"),p.setAttribute("id",f+"_form"),p.setAttribute("method",d.method),p.setAttribute("enctype","multipart/form-data"),p.setAttribute("encoding","multipart/form-data"),w.getShimContainer().appendChild(p);p.setAttribute("target",f+"_iframe"),m instanceof s&&m.each(function(e,i){if(e instanceof a)g&&g.setAttribute("name",i);else{var n=document.createElement("input");t.extend(n,{type:"hidden",name:i,value:e}),g?p.insertBefore(n,g):p.appendChild(n)}}),p.setAttribute("action",d.url),h(),p.submit(),v.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*<pre[^>]*>/,"").replace(/<\/pre>\s*$/,""))}catch(i){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})}})}return e.XMLHttpRequest=u}),n("moxie/runtime/html4/image/Image",["moxie/runtime/html4/Runtime","moxie/runtime/html5/image/Image"],function(e,t){return e.Image=t}),a(["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Dom","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/core/I18n","moxie/core/utils/Mime","moxie/file/FileInput","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/runtime/Transporter","moxie/image/Image","moxie/core/utils/Events","moxie/runtime/html5/image/ResizerCanvas"])}(this)});
17
- /**
18
- * Plupload - multi-runtime File Uploader
19
- * v2.3.1
20
- *
21
- * Copyright 2013, Moxiecode Systems AB
22
- * Released under GPL License.
23
- *
24
- * License: http://www.plupload.com/license
25
- * Contributing: http://www.plupload.com/contributing
26
- *
27
- * Date: 2017-02-06
28
- */
29
- !function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.plupload};"function"==typeof define&&define.amd?define("plupload",["./moxie"],i):"object"==typeof module&&module.exports?module.exports=i(require("./moxie")):e.plupload=i(e.moxie)}(this||window,function(e){!function(e,t,i){function n(e){function t(e,t,i){var r={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",urlstream_upload:"send_binary_string",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};r[e]?n[r[e]]=t:i||(n[e]=t)}var i=e.required_features,n={};return"string"==typeof i?l.each(i.split(/\s*,\s*/),function(e){t(e,!0)}):"object"==typeof i?l.each(i,function(e,i){t(i,e)}):i===!0&&(e.chunk_size&&e.chunk_size>0&&(n.slice_blob=!0),l.isEmptyObj(e.resize)&&e.multipart!==!1||(n.send_binary_string=!0),e.http_method&&(n.use_http_method=e.http_method),l.each(e,function(e,i){t(i,!!e,!0)})),n}var r=window.setTimeout,s={},a=t.core.utils,o=t.runtime.Runtime,l={VERSION:"2.3.1",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,mimeTypes:a.Mime.mimes,ua:a.Env,typeOf:a.Basic.typeOf,extend:a.Basic.extend,guid:a.Basic.guid,getAll:function(e){var t,i=[];"array"!==l.typeOf(e)&&(e=[e]);for(var n=e.length;n--;)t=l.get(e[n]),t&&i.push(t);return i.length?i:null},get:a.Dom.get,each:a.Basic.each,getPos:a.Dom.getPos,getSize:a.Dom.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g;return e?(""+e).replace(i,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:a.Basic.toArray,inArray:a.Basic.inArray,inSeries:a.Basic.inSeries,addI18n:t.core.I18n.addI18n,translate:t.core.I18n.translate,sprintf:a.Basic.sprintf,isEmptyObj:a.Basic.isEmptyObj,hasClass:a.Dom.hasClass,addClass:a.Dom.addClass,removeClass:a.Dom.removeClass,getStyle:a.Dom.getStyle,addEvent:a.Events.addEvent,removeEvent:a.Events.removeEvent,removeAllEvents:a.Events.removeAllEvents,cleanName:function(e){var t,i;for(i=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"],t=0;t<i.length;t+=2)e=e.replace(i[t],i[t+1]);return e=e.replace(/\s+/g,"_"),e=e.replace(/[^a-z0-9_\-\.]+/gi,"")},buildUrl:function(e,t){var i="";return l.each(t,function(e,t){i+=(i?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(e)}),i&&(e+=(e.indexOf("?")>0?"&":"?")+i),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===i||/\D/.test(e))return l.translate("N/A");var n=Math.pow(1024,4);return e>n?t(e/n,1)+" "+l.translate("tb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("gb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("mb"):e>1024?Math.round(e/1024)+" "+l.translate("kb"):e+" "+l.translate("b")},parseSize:a.Basic.parseSizeStr,predictRuntime:function(e,t){var i,n;return i=new l.Uploader(e),n=o.thatCan(i.getOption().required_features,t||e.runtimes),i.destroy(),n},addFileFilter:function(e,t){s[e]=t}};l.addFileFilter("mime_types",function(e,t,i){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:l.FILE_EXTENSION_ERROR,message:l.translate("File extension error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("max_file_size",function(e,t,i){var n;e=l.parseSize(e),t.size!==n&&e&&t.size>e?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("prevent_duplicates",function(e,t,i){if(e)for(var n=this.files.length;n--;)if(t.name===this.files[n].name&&t.size===this.files[n].size)return this.trigger("Error",{code:l.FILE_DUPLICATE_ERROR,message:l.translate("Duplicate file error."),file:t}),i(!1),void 0;i(!0)}),l.Uploader=function(e){function a(){var e,t,i=0;if(this.state==l.STARTED){for(t=0;t<x.length;t++)e||x[t].status!=l.QUEUED?i++:(e=x[t],this.trigger("BeforeUpload",e)&&(e.status=l.UPLOADING,this.trigger("UploadFile",e)));i==x.length&&(this.state!==l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged")),this.trigger("UploadComplete",x))}}function u(e){e.percent=e.size>0?Math.ceil(100*(e.loaded/e.size)):100,d()}function d(){var e,t,n,r=0;for(w.reset(),e=0;e<x.length;e++)t=x[e],t.size!==i?(w.size+=t.origSize,n=t.loaded*t.origSize/t.size,(!t.completeTimestamp||t.completeTimestamp>I)&&(r+=n),w.loaded+=n):w.size=i,t.status==l.DONE?w.uploaded++:t.status==l.FAILED?w.failed++:w.queued++;w.size===i?w.percent=x.length>0?Math.ceil(100*(w.uploaded/x.length)):0:(w.bytesPerSec=Math.ceil(r/((+new Date-I||1)/1e3)),w.percent=w.size>0?Math.ceil(100*(w.loaded/w.size)):0)}function c(){var e=U[0]||F[0];return e?e.getRuntime().uid:!1}function f(e,t){if(e.ruid){var i=o.getInfo(e.ruid);if(i)return i.can(t)}return!1}function p(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged"),e.refresh()}),this.bind("CancelUpload",y),this.bind("BeforeUpload",_),this.bind("UploadFile",E),this.bind("UploadProgress",v),this.bind("StateChanged",b),this.bind("QueueChanged",d),this.bind("Error",z),this.bind("FileUploaded",R),this.bind("Destroy",O)}function g(e,i){var n=this,r=0,s=[],a={runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:P,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};l.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(a[t]=e[t])}),e.browse_button&&l.each(e.browse_button,function(i){s.push(function(s){var u=new t.file.FileInput(l.extend({},a,{accept:e.filters.mime_types,name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:i}));u.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),r++,U.push(this),s()},u.onchange=function(){n.addFile(this.files)},u.bind("mouseenter mouseleave mousedown mouseup",function(t){A||(e.browse_button_hover&&("mouseenter"===t.type?l.addClass(i,e.browse_button_hover):"mouseleave"===t.type&&l.removeClass(i,e.browse_button_hover)),e.browse_button_active&&("mousedown"===t.type?l.addClass(i,e.browse_button_active):"mouseup"===t.type&&l.removeClass(i,e.browse_button_active)))}),u.bind("mousedown",function(){n.trigger("Browse")}),u.bind("error runtimeerror",function(){u=null,s()}),u.init()})}),e.drop_element&&l.each(e.drop_element,function(e){s.push(function(i){var s=new t.file.FileDrop(l.extend({},a,{drop_zone:e}));s.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),dragdrop:e.can("drag_and_drop")}),r++,F.push(this),i()},s.ondrop=function(){n.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,i()}),s.init()})}),l.inSeries(s,function(){"function"==typeof i&&i(r)})}function h(e,n,r){var s=new t.image.Image;try{s.onload=function(){return n.width>this.width&&n.height>this.height&&n.quality===i&&n.preserve_headers&&!n.crop?(this.destroy(),r(e)):(s.downsize(n.width,n.height,n.crop,n.preserve_headers),void 0)},s.onresize=function(){r(this.getAsBlob(e.type,n.quality)),this.destroy()},s.onerror=function(){r(e)},s.load(e)}catch(a){r(e)}}function m(e,i,r){function s(e,i,n){var r=S[e];switch(e){case"max_file_size":"max_file_size"===e&&(S.max_file_size=S.filters.max_file_size=i);break;case"chunk_size":(i=l.parseSize(i))&&(S[e]=i,S.send_file_name=!0);break;case"multipart":S[e]=i,i||(S.send_file_name=!0);break;case"http_method":S[e]="PUT"===i.toUpperCase()?"PUT":"POST";break;case"unique_names":S[e]=i,i&&(S.send_file_name=!0);break;case"filters":"array"===l.typeOf(i)&&(i={mime_types:i}),n?l.extend(S.filters,i):S.filters=i,i.mime_types&&("string"===l.typeOf(i.mime_types)&&(i.mime_types=t.core.utils.Mime.mimes2extList(i.mime_types)),i.mime_types.regexp=function(e){var t=[];return l.each(e,function(e){l.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(i.mime_types),S.filters.mime_types=i.mime_types);break;case"resize":S.resize=i?l.extend({preserve_headers:!0,crop:!1},i):!1;break;case"prevent_duplicates":S.prevent_duplicates=S.filters.prevent_duplicates=!!i;break;case"container":case"browse_button":case"drop_element":i="container"===e?l.get(i):l.getAll(i);case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":S[e]=i,n||(u=!0);break;default:S[e]=i}n||a.trigger("OptionChanged",e,i,r)}var a=this,u=!1;"object"==typeof e?l.each(e,function(e,t){s(t,e,r)}):s(e,i,r),r?(S.required_features=n(l.extend({},S)),P=n(l.extend({},S,{required_features:!0}))):u&&(a.trigger("Destroy"),g.call(a,S,function(e){e?(a.runtime=o.getInfo(c()).type,a.trigger("Init",{runtime:a.runtime}),a.trigger("PostInit")):a.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}))}function _(e,t){if(e.settings.unique_names){var i=t.name.match(/\.([^.]+)$/),n="part";i&&(n=i[1]),t.target_name=t.id+"."+n}}function E(e,i){function n(){c-->0?r(s,1e3):(i.loaded=g,e.trigger("Error",{code:l.HTTP_ERROR,message:l.translate("HTTP Error."),file:i,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}))}function s(){var t,n,r={};i.status===l.UPLOADING&&e.state!==l.STOPPED&&(e.settings.send_file_name&&(r.name=i.target_name||i.name),d&&p.chunks&&o.size>d?(n=Math.min(d,o.size-g),t=o.slice(g,g+n)):(n=o.size,t=o),d&&p.chunks&&(e.settings.send_chunk_number?(r.chunk=Math.ceil(g/d),r.chunks=Math.ceil(o.size/d)):(r.offset=g,r.total=o.size)),e.trigger("BeforeChunkUpload",i,r,t,g)&&a(r,t,n))}function a(a,d,f){var h;T=new t.xhr.XMLHttpRequest,T.upload&&(T.upload.onprogress=function(t){i.loaded=Math.min(i.size,g+t.loaded),e.trigger("UploadProgress",i)}),T.onload=function(){return T.status>=400?(n(),void 0):(c=e.settings.max_retries,f<o.size?(d.destroy(),g+=f,i.loaded=Math.min(g,o.size),e.trigger("ChunkUploaded",i,{offset:i.loaded,total:o.size,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}),"Android Browser"===l.ua.browser&&e.trigger("UploadProgress",i)):i.loaded=i.size,d=h=null,!g||g>=o.size?(i.size!=i.origSize&&(o.destroy(),o=null),e.trigger("UploadProgress",i),i.status=l.DONE,i.completeTimestamp=+new Date,e.trigger("FileUploaded",i,{response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()})):r(s,1),void 0)},T.onerror=function(){n()},T.onloadend=function(){this.destroy(),T=null},e.settings.multipart&&p.multipart?(T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),h=new t.xhr.FormData,l.each(l.extend(a,e.settings.multipart_params),function(e,t){h.append(t,e)}),h.append(e.settings.file_data_name,d),T.send(h,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:P,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url})):(u=l.buildUrl(e.settings.url,l.extend(a,e.settings.multipart_params)),T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),T.hasRequestHeader("Content-Type")||T.setRequestHeader("Content-Type","application/octet-stream"),T.send(d,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:P,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url}))}var o,u=e.settings.url,d=e.settings.chunk_size,c=e.settings.max_retries,p=e.features,g=0;i.loaded&&(g=i.loaded=d?d*Math.floor(i.loaded/d):0),o=i.getSource(),!l.isEmptyObj(e.settings.resize)&&f(o,"send_binary_string")&&-1!==l.inArray(o.type,["image/jpeg","image/png"])?h.call(this,o,e.settings.resize,function(e){o=e,i.size=e.size,s()}):s()}function v(e,t){u(t)}function b(e){if(e.state==l.STARTED)I=+new Date;else if(e.state==l.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==l.UPLOADING&&(e.files[t].status=l.QUEUED,d())}function y(){T&&T.abort()}function R(e){d(),r(function(){a.call(e)},1)}function z(e,t){t.code===l.INIT_ERROR?e.destroy():t.code===l.HTTP_ERROR&&(t.file.status=l.FAILED,t.file.completeTimestamp=+new Date,u(t.file),e.state==l.STARTED&&(e.trigger("CancelUpload"),r(function(){a.call(e)},1)))}function O(e){e.stop(),l.each(x,function(e){e.destroy()}),x=[],U.length&&(l.each(U,function(e){e.destroy()}),U=[]),F.length&&(l.each(F,function(e){e.destroy()}),F=[]),P={},A=!1,I=T=null,w.reset()}var S,I,w,T,D=l.guid(),x=[],P={},U=[],F=[],A=!1;S={chunk_size:0,file_data_name:"file",filters:{mime_types:[],prevent_duplicates:!1,max_file_size:0},flash_swf_url:"js/Moxie.swf",http_method:"POST",max_retries:0,multipart:!0,multi_selection:!0,resize:!1,runtimes:o.order,send_file_name:!0,send_chunk_number:!0,silverlight_xap_url:"js/Moxie.xap"},m.call(this,e,null,!0),w=new l.QueueProgress,l.extend(this,{id:D,uid:D,state:l.STOPPED,features:{},runtime:null,files:x,settings:S,total:w,init:function(){var e,t,i=this;return e=i.getOption("preinit"),"function"==typeof e?e(i):l.each(e,function(e,t){i.bind(t,e)}),p.call(i),l.each(["container","browse_button","drop_element"],function(e){return null===i.getOption(e)?(t={code:l.INIT_ERROR,message:l.sprintf(l.translate("%s specified, but cannot be found."),e)},!1):void 0}),t?i.trigger("Error",t):S.browse_button||S.drop_element?(g.call(i,S,function(e){var t=i.getOption("init");"function"==typeof t?t(i):l.each(t,function(e,t){i.bind(t,e)}),e?(i.runtime=o.getInfo(c()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}),void 0):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("You must specify either browse_button or drop_element.")})},setOption:function(e,t){m.call(this,e,t,!this.runtime)},getOption:function(e){return e?S[e]:S},refresh:function(){U.length&&l.each(U,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=l.STARTED&&(this.state=l.STARTED,this.trigger("StateChanged"),a.call(this))},stop:function(){this.state!=l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){A=arguments[0]!==i?arguments[0]:!0,U.length&&l.each(U,function(e){e.disable(A)}),this.trigger("DisableBrowse",A)},getFile:function(e){var t;for(t=x.length-1;t>=0;t--)if(x[t].id===e)return x[t]},addFile:function(e,i){function n(e,t){var i=[];l.each(u.settings.filters,function(t,n){s[n]&&i.push(function(i){s[n].call(u,t,e,function(e){i(!e)})})}),l.inSeries(i,t)}function a(e){var s=l.typeOf(e);if(e instanceof t.file.File){if(!e.ruid&&!e.isDetached()){if(!o)return!1;e.ruid=o,e.connectRuntime(o)}a(new l.File(e))}else e instanceof t.file.Blob?(a(e.getSource()),e.destroy()):e instanceof l.File?(i&&(e.name=i),d.push(function(t){n(e,function(i){i||(x.push(e),f.push(e),u.trigger("FileFiltered",e)),r(t,1)})})):-1!==l.inArray(s,["file","blob"])?a(new t.file.File(null,e)):"node"===s&&"filelist"===l.typeOf(e.files)?l.each(e.files,a):"array"===s&&(i=null,l.each(e,a))}var o,u=this,d=[],f=[];o=c(),a(e),d.length&&l.inSeries(d,function(){f.length&&u.trigger("FilesAdded",f)})},removeFile:function(e){for(var t="string"==typeof e?e:e.id,i=x.length-1;i>=0;i--)if(x[i].id===t)return this.splice(i,1)[0]},splice:function(e,t){var n=x.splice(e===i?0:e,t===i?x.length:t),r=!1;return this.state==l.STARTED&&(l.each(n,function(e){return e.status===l.UPLOADING?(r=!0,!1):void 0}),r&&this.stop()),this.trigger("FilesRemoved",n),l.each(n,function(e){e.destroy()}),r&&this.start(),n},dispatchEvent:function(e){var t,i;if(e=e.toLowerCase(),t=this.hasEventListener(e)){t.sort(function(e,t){return t.priority-e.priority}),i=[].slice.call(arguments),i.shift(),i.unshift(this);for(var n=0;n<t.length;n++)if(t[n].fn.apply(t[n].scope,i)===!1)return!1}return!0},bind:function(e,t,i,n){l.Uploader.prototype.bind.call(this,e,t,n,i)},destroy:function(){this.trigger("Destroy"),S=w=null,this.unbindAll()}})},l.Uploader.prototype=t.core.EventTarget.instance,l.File=function(){function e(e){l.extend(this,{id:l.guid(),name:e.name||e.fileName,type:e.type||"",size:e.size||e.fileSize,origSize:e.size||e.fileSize,loaded:0,percent:0,status:l.QUEUED,lastModifiedDate:e.lastModifiedDate||(new Date).toLocaleString(),completeTimestamp:0,getNative:function(){var e=this.getSource().getSource();return-1!==l.inArray(l.typeOf(e),["blob","file"])?e:null},getSource:function(){return t[this.id]?t[this.id]:null},destroy:function(){var e=this.getSource();e&&(e.destroy(),delete t[this.id])}}),t[this.id]=e}var t={};return e}(),l.QueueProgress=function(){var e=this;e.size=0,e.loaded=0,e.uploaded=0,e.failed=0,e.queued=0,e.percent=0,e.bytesPerSec=0,e.reset=function(){e.size=e.loaded=e.uploaded=e.failed=e.queued=e.percent=e.bytesPerSec=0}},e.plupload=l}(this,e)});
10
  *
11
  * Date: 2017-02-02
12
  */
13
+ !function(e, t){var i = function(){var e = {}; return t.apply(e, arguments), e.moxie}; "function" == typeof define && define.amd?define("moxie", [], i):"object" == typeof module && module.exports?module.exports = i():e.moxie = i()}(this || window, function(){!function(e, t){"use strict"; function i(e, t){for (var i, n = [], r = 0; r < e.length; ++r){if (i = s[e[r]] || o(e[r]), !i)throw"module definition dependecy not found: " + e[r]; n.push(i)}t.apply(null, n)}function n(e, n, r){if ("string" != typeof e)throw"invalid module definition, module id must be defined and be a string"; if (n === t)throw"invalid module definition, dependencies must be specified"; if (r === t)throw"invalid module definition, definition function must be specified"; i(n, function(){s[e] = r.apply(null, arguments)})}function r(e){return!!s[e]}function o(t){for (var i = e, n = t.split(/[.\/]/), r = 0; r < n.length; ++r){if (!i[n[r]])return; i = i[n[r]]}return i}function a(i){for (var n = 0; n < i.length; n++){for (var r = e, o = i[n], a = o.split(/[.\/]/), u = 0; u < a.length - 1; ++u)r[a[u]] === t && (r[a[u]] = {}), r = r[a[u]]; r[a[a.length - 1]] = s[o]}}var s = {}; n("moxie/core/utils/Basic", [], function(){function e(e){var t; return e === t?"undefined":null === e?"null":e.nodeType?"node":{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}function t(){return a(!1, !1, arguments)}function i(){return a(!0, !1, arguments)}function n(){return a(!1, !0, arguments)}function r(){return a(!0, !0, arguments)}function o(i){switch (e(i)){case"array":return Array.prototype.slice.call(i); case"object":return t({}, i)}return i}function a(t, i, n){var r, s = n[0]; return u(n, function(n, c){c > 0 && u(n, function(n, u){var c = - 1 !== m(e(n), ["array", "object"]); return n === r || t && s[u] === r?!0:(c && i && (n = o(n)), e(s[u]) === e(n) && c?a(t, i, [s[u], n]):s[u] = n, void 0)})}), s}function s(e, t){function i(){this.constructor = e}for (var n in t)({}).hasOwnProperty.call(t, n) && (e[n] = t[n]); return i.prototype = t.prototype, e.prototype = new i, e.__parent__ = t.prototype, e}function u(e, t){var i, n, r, o; if (e){try{i = e.length} catch (a){i = o}if (i === o || "number" != typeof i){for (n in e)if (e.hasOwnProperty(n) && t(e[n], n) === !1)return} else for (r = 0; i > r; r++)if (t(e[r], r) === !1)return}}function c(t){var i; if (!t || "object" !== e(t))return!0; for (i in t)return!1; return!0}function l(t, i){function n(r){"function" === e(t[r]) && t[r](function(e){++r < o && !e?n(r):i(e)})}var r = 0, o = t.length; "function" !== e(i) && (i = function(){}), t && t.length || i(), n(r)}function d(e, t){var i = 0, n = e.length, r = new Array(n); u(e, function(e, o){e(function(e){if (e)return t(e); var a = [].slice.call(arguments); a.shift(), r[o] = a, i++, i === n && (r.unshift(null), t.apply(this, r))})})}function m(e, t){if (t){if (Array.prototype.indexOf)return Array.prototype.indexOf.call(t, e); for (var i = 0, n = t.length; n > i; i++)if (t[i] === e)return i}return - 1}function h(t, i){var n = []; "array" !== e(t) && (t = [t]), "array" !== e(i) && (i = [i]); for (var r in t) - 1 === m(t[r], i) && n.push(t[r]); return n.length?n:!1}function f(e, t){var i = []; return u(e, function(e){ - 1 !== m(e, t) && i.push(e)}), i.length?i:null}function p(e){var t, i = []; for (t = 0; t < e.length; t++)i[t] = e[t]; return i}function g(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/, "").replace(/\s*$/, ""):e}function x(e){if ("string" != typeof e)return e; var t, i = {t:1099511627776, g:1073741824, m:1048576, k:1024}; return e = /^([0-9\.]+)([tmgk]?)$/.exec(e.toLowerCase().replace(/[^0-9\.tmkg]/g, "")), t = e[2], e = + e[1], i.hasOwnProperty(t) && (e *= i[t]), Math.floor(e)}function v(t){var i = [].slice.call(arguments, 1); return t.replace(/%[a-z]/g, function(){var t = i.shift(); return"undefined" !== e(t)?t:""})}function w(e, t){var i = this; setTimeout(function(){e.call(i)}, t || 1)}var y = function(){var e = 0; return function(t){var i, n = (new Date).getTime().toString(32); for (i = 0; 5 > i; i++)n += Math.floor(65535 * Math.random()).toString(32); return(t || "o_") + n + (e++).toString(32)}}(); return{guid:y, typeOf:e, extend:t, extendIf:i, extendImmutable:n, extendImmutableIf:r, inherit:s, each:u, isEmptyObj:c, inSeries:l, inParallel:d, inArray:m, arrayDiff:h, arrayIntersect:f, toArray:p, trim:g, sprintf:v, parseSizeStr:x, delay:w}}), n("moxie/core/utils/Encode", [], function(){var e = function(e){return unescape(encodeURIComponent(e))}, t = function(e){return decodeURIComponent(escape(e))}, i = function(e, i){if ("function" == typeof window.atob)return i?t(window.atob(e)):window.atob(e); var n, r, o, a, s, u, c, l, d = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", m = 0, h = 0, f = "", p = []; if (!e)return e; e += ""; do a = d.indexOf(e.charAt(m++)), s = d.indexOf(e.charAt(m++)), u = d.indexOf(e.charAt(m++)), c = d.indexOf(e.charAt(m++)), l = a << 18 | s << 12 | u << 6 | c, n = 255 & l >> 16, r = 255 & l >> 8, o = 255 & l, p[h++] = 64 == u?String.fromCharCode(n):64 == c?String.fromCharCode(n, r):String.fromCharCode(n, r, o); while (m < e.length); return f = p.join(""), i?t(f):f}, n = function(t, i){if (i && (t = e(t)), "function" == typeof window.btoa)return window.btoa(t); var n, r, o, a, s, u, c, l, d = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", m = 0, h = 0, f = "", p = []; if (!t)return t; do n = t.charCodeAt(m++), r = t.charCodeAt(m++), o = t.charCodeAt(m++), l = n << 16 | r << 8 | o, a = 63 & l >> 18, s = 63 & l >> 12, u = 63 & l >> 6, c = 63 & l, p[h++] = d.charAt(a) + d.charAt(s) + d.charAt(u) + d.charAt(c); while (m < t.length); f = p.join(""); var g = t.length % 3; return(g?f.slice(0, g - 3):f) + "===".slice(g || 3)}; return{utf8_encode:e, utf8_decode:t, atob:i, btoa:n}}), n("moxie/core/utils/Env", ["moxie/core/utils/Basic"], function(e){function t(e, t, i){var n = 0, r = 0, o = 0, a = {dev: - 6, alpha: - 5, a: - 5, beta: - 4, b: - 4, RC: - 3, rc: - 3, "#": - 2, p:1, pl:1}, s = function(e){return e = ("" + e).replace(/[_\-+]/g, "."), e = e.replace(/([^.\d]+)/g, ".$1.").replace(/\.{2,}/g, "."), e.length?e.split("."):[ - 8]}, u = function(e){return e?isNaN(e)?a[e] || - 7:parseInt(e, 10):0}; for (e = s(e), t = s(t), r = Math.max(e.length, t.length), n = 0; r > n; n++)if (e[n] != t[n]){if (e[n] = u(e[n]), t[n] = u(t[n]), e[n] < t[n]){o = - 1; break}if (e[n] > t[n]){o = 1; break}}if (!i)return o; switch (i){case">":case"gt":return o > 0; case">=":case"ge":return o >= 0; case"<=":case"le":return 0 >= o; case"==":case"=":case"eq":return 0 === o; case"<>":case"!=":case"ne":return 0 !== o; case"":case"<":case"lt":return 0 > o; default:return null}}var i = function(e){var t = "", i = "?", n = "function", r = "undefined", o = "object", a = "name", s = "version", u = {has:function(e, t){return - 1 !== t.toLowerCase().indexOf(e.toLowerCase())}, lowerize:function(e){return e.toLowerCase()}}, c = {rgx:function(){for (var t, i, a, s, u, c, l, d = 0, m = arguments; d < m.length; d += 2){var h = m[d], f = m[d + 1]; if (typeof t === r){t = {}; for (s in f)u = f[s], typeof u === o?t[u[0]] = e:t[u] = e}for (i = a = 0; i < h.length; i++)if (c = h[i].exec(this.getUA())){for (s = 0; s < f.length; s++)l = c[++a], u = f[s], typeof u === o && u.length > 0?2 == u.length?t[u[0]] = typeof u[1] == n?u[1].call(this, l):u[1]:3 == u.length?t[u[0]] = typeof u[1] !== n || u[1].exec && u[1].test?l?l.replace(u[1], u[2]):e:l?u[1].call(this, l, u[2]):e:4 == u.length && (t[u[0]] = l?u[3].call(this, l.replace(u[1], u[2])):e):t[u] = l?l:e; break}if (c)break}return t}, str:function(t, n){for (var r in n)if (typeof n[r] === o && n[r].length > 0){for (var a = 0; a < n[r].length; a++)if (u.has(n[r][a], t))return r === i?e:r} else if (u.has(n[r], t))return r === i?e:r; return t}}, l = {browser:{oldsafari:{major:{1:["/8", "/1", "/3"], 2:"/4", "?":"/"}, version:{"1.0":"/8", 1.2:"/1", 1.3:"/3", "2.0":"/412", "2.0.2":"/416", "2.0.3":"/417", "2.0.4":"/419", "?":"/"}}}, device:{sprint:{model:{"Evo Shift 4G":"7373KT"}, vendor:{HTC:"APA", Sprint:"Sprint"}}}, os:{windows:{version:{ME:"4.90", "NT 3.11":"NT3.51", "NT 4.0":"NT4.0", 2000:"NT 5.0", XP:["NT 5.1", "NT 5.2"], Vista:"NT 6.0", 7:"NT 6.1", 8:"NT 6.2", 8.1:"NT 6.3", RT:"ARM"}}}}, d = {browser:[[/(opera\smini)\/([\w\.-]+)/i, /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, /(opera).+version\/([\w\.]+)/i, /(opera)[\/\s]+([\w\.]+)/i], [a, s], [/\s(opr)\/([\w\.]+)/i], [[a, "Opera"], s], [/(kindle)\/([\w\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i, /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i, /(?:ms|\()(ie)\s([\w\.]+)/i, /(rekonq)\/([\w\.]+)*/i, /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i], [a, s], [/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i], [[a, "IE"], s], [/(edge)\/((\d+)?[\w\.]+)/i], [a, s], [/(yabrowser)\/([\w\.]+)/i], [[a, "Yandex"], s], [/(comodo_dragon)\/([\w\.]+)/i], [[a, /_/g, " "], s], [/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i, /(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i], [a, s], [/(dolfin)\/([\w\.]+)/i], [[a, "Dolphin"], s], [/((?:android.+)crmo|crios)\/([\w\.]+)/i], [[a, "Chrome"], s], [/XiaoMi\/MiuiBrowser\/([\w\.]+)/i], [s, [a, "MIUI Browser"]], [/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i], [s, [a, "Android Browser"]], [/FBAV\/([\w\.]+);/i], [s, [a, "Facebook"]], [/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i], [s, [a, "Mobile Safari"]], [/version\/([\w\.]+).+?(mobile\s?safari|safari)/i], [s, a], [/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i], [a, [s, c.str, l.browser.oldsafari.version]], [/(konqueror)\/([\w\.]+)/i, /(webkit|khtml)\/([\w\.]+)/i], [a, s], [/(navigator|netscape)\/([\w\.-]+)/i], [[a, "Netscape"], s], [/(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i, /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i, /(links)\s\(([\w\.]+)/i, /(gobrowser)\/?([\w\.]+)*/i, /(ice\s?browser)\/v?([\w\._]+)/i, /(mosaic)[\/\s]([\w\.]+)/i], [a, s]], engine:[[/windows.+\sedge\/([\w\.]+)/i], [s, [a, "EdgeHTML"]], [/(presto)\/([\w\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, /(icab)[\/\s]([23]\.[\d\.]+)/i], [a, s], [/rv\:([\w\.]+).*(gecko)/i], [s, a]], os:[[/microsoft\s(windows)\s(vista|xp)/i], [a, s], [/(windows)\snt\s6\.2;\s(arm)/i, /(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i], [a, [s, c.str, l.os.windows.version]], [/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i], [[a, "Windows"], [s, c.str, l.os.windows.version]], [/\((bb)(10);/i], [[a, "BlackBerry"], s], [/(blackberry)\w*\/?([\w\.]+)*/i, /(tizen)[\/\s]([\w\.]+)/i, /(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i, /linux;.+(sailfish);/i], [a, s], [/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i], [[a, "Symbian"], s], [/\((series40);/i], [a], [/mozilla.+\(mobile;.+gecko.+firefox/i], [[a, "Firefox OS"], s], [/(nintendo|playstation)\s([wids3portablevu]+)/i, /(mint)[\/\s\(]?(\w+)*/i, /(mageia|vectorlinux)[;\s]/i, /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i, /(hurd|linux)\s?([\w\.]+)*/i, /(gnu)\s?([\w\.]+)*/i], [a, s], [/(cros)\s[\w]+\s([\w\.]+\w)/i], [[a, "Chromium OS"], s], [/(sunos)\s?([\w\.]+\d)*/i], [[a, "Solaris"], s], [/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i], [a, s], [/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i], [[a, "iOS"], [s, /_/g, "."]], [/(mac\sos\sx)\s?([\w\s\.]+\w)*/i, /(macintosh|mac(?=_powerpc)\s)/i], [[a, "Mac OS"], [s, /_/g, "."]], [/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, /(haiku)\s(\w+)/i, /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i, /(unix)\s?([\w\.]+)*/i], [a, s]]}, m = function(e){var i = e || (window && window.navigator && window.navigator.userAgent?window.navigator.userAgent:t); this.getBrowser = function(){return c.rgx.apply(this, d.browser)}, this.getEngine = function(){return c.rgx.apply(this, d.engine)}, this.getOS = function(){return c.rgx.apply(this, d.os)}, this.getResult = function(){return{ua:this.getUA(), browser:this.getBrowser(), engine:this.getEngine(), os:this.getOS()}}, this.getUA = function(){return i}, this.setUA = function(e){return i = e, this}, this.setUA(i)}; return m}(), n = function(){var t = {define_property:function(){return!1}(), create_canvas:function(){var e = document.createElement("canvas"); return!(!e.getContext || !e.getContext("2d"))}(), return_response_type:function(t){try{if ( - 1 !== e.inArray(t, ["", "text", "document"]))return!0; if (window.XMLHttpRequest){var i = new XMLHttpRequest; if (i.open("get", "/"), "responseType"in i)return i.responseType = t, i.responseType !== t?!1:!0}} catch (n){}return!1}, use_data_uri:function(){var e = new Image; return e.onload = function(){t.use_data_uri = 1 === e.width && 1 === e.height}, setTimeout(function(){e.src = "data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="}, 1), !1}(), use_data_uri_over32kb:function(){return t.use_data_uri && ("IE" !== o.browser || o.version >= 9)}, use_data_uri_of:function(e){return t.use_data_uri && 33e3 > e || t.use_data_uri_over32kb()}, use_fileinput:function(){if (navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return!1; var e = document.createElement("input"); return e.setAttribute("type", "file"), !e.disabled}}; return function(i){var n = [].slice.call(arguments); return n.shift(), "function" === e.typeOf(t[i])?t[i].apply(this, n):!!t[i]}}(), r = (new i).getResult(), o = {can:n, uaParser:i, browser:r.browser.name, version:r.browser.version, os:r.os.name, osVersion:r.os.version, verComp:t, swf_url:"../flash/Moxie.swf", xap_url:"../silverlight/Moxie.xap", global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"}; return o.OS = o.os, o}), n("moxie/core/Exceptions", ["moxie/core/utils/Basic"], function(e){function t(e, t){var i; for (i in e)if (e[i] === t)return i; return null}return{RuntimeError:function(){function i(e, i){this.code = e, this.name = t(n, e), this.message = this.name + (i || ": RuntimeError " + this.code)}var n = {NOT_INIT_ERR:1, EXCEPTION_ERR:3, NOT_SUPPORTED_ERR:9, JS_ERR:4}; return e.extend(i, n), i.prototype = Error.prototype, i}(), OperationNotAllowedException:function(){function t(e){this.code = e, this.name = "OperationNotAllowedException"}return e.extend(t, {NOT_ALLOWED_ERR:1}), t.prototype = Error.prototype, t}(), ImageError:function(){function i(e){this.code = e, this.name = t(n, e), this.message = this.name + ": ImageError " + this.code}var n = {WRONG_FORMAT:1, MAX_RESOLUTION_ERR:2, INVALID_META_ERR:3}; return e.extend(i, n), i.prototype = Error.prototype, i}(), FileException:function(){function i(e){this.code = e, this.name = t(n, e), this.message = this.name + ": FileException " + this.code}var n = {NOT_FOUND_ERR:1, SECURITY_ERR:2, ABORT_ERR:3, NOT_READABLE_ERR:4, ENCODING_ERR:5, NO_MODIFICATION_ALLOWED_ERR:6, INVALID_STATE_ERR:7, SYNTAX_ERR:8}; return e.extend(i, n), i.prototype = Error.prototype, i}(), DOMException:function(){function i(e){this.code = e, this.name = t(n, e), this.message = this.name + ": DOMException " + this.code}var n = {INDEX_SIZE_ERR:1, DOMSTRING_SIZE_ERR:2, HIERARCHY_REQUEST_ERR:3, WRONG_DOCUMENT_ERR:4, INVALID_CHARACTER_ERR:5, NO_DATA_ALLOWED_ERR:6, NO_MODIFICATION_ALLOWED_ERR:7, NOT_FOUND_ERR:8, NOT_SUPPORTED_ERR:9, INUSE_ATTRIBUTE_ERR:10, INVALID_STATE_ERR:11, SYNTAX_ERR:12, INVALID_MODIFICATION_ERR:13, NAMESPACE_ERR:14, INVALID_ACCESS_ERR:15, VALIDATION_ERR:16, TYPE_MISMATCH_ERR:17, SECURITY_ERR:18, NETWORK_ERR:19, ABORT_ERR:20, URL_MISMATCH_ERR:21, QUOTA_EXCEEDED_ERR:22, TIMEOUT_ERR:23, INVALID_NODE_TYPE_ERR:24, DATA_CLONE_ERR:25}; return e.extend(i, n), i.prototype = Error.prototype, i}(), EventException:function(){function t(e){this.code = e, this.name = "EventException"}return e.extend(t, {UNSPECIFIED_EVENT_TYPE_ERR:0}), t.prototype = Error.prototype, t}()}}), n("moxie/core/utils/Dom", ["moxie/core/utils/Env"], function(e){var t = function(e){return"string" != typeof e?e:document.getElementById(e)}, i = function(e, t){if (!e.className)return!1; var i = new RegExp("(^|\\s+)" + t + "(\\s+|$)"); return i.test(e.className)}, n = function(e, t){i(e, t) || (e.className = e.className?e.className.replace(/\s+$/, "") + " " + t:t)}, r = function(e, t){if (e.className){var i = new RegExp("(^|\\s+)" + t + "(\\s+|$)"); e.className = e.className.replace(i, function(e, t, i){return" " === t && " " === i?" ":""})}}, o = function(e, t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e, null)[t]:void 0}, a = function(t, i){function n(e){var t, i, n = 0, r = 0; return e && (i = e.getBoundingClientRect(), t = "CSS1Compat" === c.compatMode?c.documentElement:c.body, n = i.left + t.scrollLeft, r = i.top + t.scrollTop), {x:n, y:r}}var r, o, a, s = 0, u = 0, c = document; if (t = t, i = i || c.body, t && t.getBoundingClientRect && "IE" === e.browser && (!c.documentMode || c.documentMode < 8))return o = n(t), a = n(i), {x:o.x - a.x, y:o.y - a.y}; for (r = t; r && r != i && r.nodeType; )s += r.offsetLeft || 0, u += r.offsetTop || 0, r = r.offsetParent; for (r = t.parentNode; r && r != i && r.nodeType; )s -= r.scrollLeft || 0, u -= r.scrollTop || 0, r = r.parentNode; return{x:s, y:u}}, s = function(e){return{w:e.offsetWidth || e.clientWidth, h:e.offsetHeight || e.clientHeight}}; return{get:t, hasClass:i, addClass:n, removeClass:r, getStyle:o, getPos:a, getSize:s}}), n("moxie/core/EventTarget", ["moxie/core/utils/Env", "moxie/core/Exceptions", "moxie/core/utils/Basic"], function(e, t, i){function n(){this.uid = i.guid()}var r = {}; return i.extend(n.prototype, {init:function(){this.uid || (this.uid = i.guid("uid_"))}, addEventListener:function(e, t, n, o){var a, s = this; return this.hasOwnProperty("uid") || (this.uid = i.guid("uid_")), e = i.trim(e), /\s/.test(e)?(i.each(e.split(/\s+/), function(e){s.addEventListener(e, t, n, o)}), void 0):(e = e.toLowerCase(), n = parseInt(n, 10) || 0, a = r[this.uid] && r[this.uid][e] || [], a.push({fn:t, priority:n, scope:o || this}), r[this.uid] || (r[this.uid] = {}), r[this.uid][e] = a, void 0)}, hasEventListener:function(e){var t; return e?(e = e.toLowerCase(), t = r[this.uid] && r[this.uid][e]):t = r[this.uid], t?t:!1}, removeEventListener:function(e, t){var n, o, a = this; if (e = e.toLowerCase(), /\s/.test(e))return i.each(e.split(/\s+/), function(e){a.removeEventListener(e, t)}), void 0; if (n = r[this.uid] && r[this.uid][e]){if (t){for (o = n.length - 1; o >= 0; o--)if (n[o].fn === t){n.splice(o, 1); break}} else n = []; n.length || (delete r[this.uid][e], i.isEmptyObj(r[this.uid]) && delete r[this.uid])}}, removeAllEventListeners:function(){r[this.uid] && delete r[this.uid]}, dispatchEvent:function(e){var n, o, a, s, u, c = {}, l = !0; if ("string" !== i.typeOf(e)){if (s = e, "string" !== i.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR); e = s.type, s.total !== u && s.loaded !== u && (c.total = s.total, c.loaded = s.loaded), c.async = s.async || !1}if ( - 1 !== e.indexOf("::")?function(t){n = t[0], e = t[1]}(e.split("::")):n = this.uid, e = e.toLowerCase(), o = r[n] && r[n][e]){o.sort(function(e, t){return t.priority - e.priority}), a = [].slice.call(arguments), a.shift(), c.type = e, a.unshift(c); var d = []; i.each(o, function(e){a[0].target = e.scope, c.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope, a) === !1)}, 1)}):d.push(function(t){t(e.fn.apply(e.scope, a) === !1)})}), d.length && i.inSeries(d, function(e){l = !e})}return l}, bindOnce:function(e, t, i, n){var r = this; r.bind.call(this, e, function o(){return r.unbind(e, o), t.apply(this, arguments)}, i, n)}, bind:function(){this.addEventListener.apply(this, arguments)}, unbind:function(){this.removeEventListener.apply(this, arguments)}, unbindAll:function(){this.removeAllEventListeners.apply(this, arguments)}, trigger:function(){return this.dispatchEvent.apply(this, arguments)}, handleEventProps:function(e){var t = this; this.bind(e.join(" "), function(e){var t = "on" + e.type.toLowerCase(); "function" === i.typeOf(this[t]) && this[t].apply(this, arguments)}), i.each(e, function(e){e = "on" + e.toLowerCase(e), "undefined" === i.typeOf(t[e]) && (t[e] = null)})}}), n.instance = new n, n}), n("moxie/runtime/Runtime", ["moxie/core/utils/Env", "moxie/core/utils/Basic", "moxie/core/utils/Dom", "moxie/core/EventTarget"], function(e, t, i, n){function r(e, n, o, s, u){var c, l = this, d = t.guid(n + "_"), m = u || "browser"; e = e || {}, a[d] = this, o = t.extend({access_binary:!1, access_image_binary:!1, display_media:!1, do_cors:!1, drag_and_drop:!1, filter_by_extension:!0, resize_image:!1, report_upload_progress:!1, return_response_headers:!1, return_response_type:!1, return_status_code:!0, send_custom_headers:!1, select_file:!1, select_folder:!1, select_multiple:!0, send_binary_string:!1, send_browser_cookies:!0, send_multipart:!0, slice_blob:!1, stream_upload:!1, summon_file_dialog:!1, upload_filesize:!0, use_http_method:!0}, o), e.preferred_caps && (m = r.getMode(s, e.preferred_caps, m)), c = function(){var e = {}; return{exec:function(t, i, n, r){return c[i] && (e[t] || (e[t] = {context:this, instance:new c[i]}), e[t].instance[n])?e[t].instance[n].apply(this, r):void 0}, removeInstance:function(t){delete e[t]}, removeAllInstances:function(){var i = this; t.each(e, function(e, n){"function" === t.typeOf(e.instance.destroy) && e.instance.destroy.call(e.context), i.removeInstance(n)})}}}(), t.extend(this, {initialized:!1, uid:d, type:n, mode:r.getMode(s, e.required_caps, m), shimid:d + "_container", clients:0, options:e, can:function(e, i){var n = arguments[2] || o; if ("string" === t.typeOf(e) && "undefined" === t.typeOf(i) && (e = r.parseCaps(e)), "object" === t.typeOf(e)){for (var a in e)if (!this.can(a, e[a], n))return!1; return!0}return"function" === t.typeOf(n[e])?n[e].call(this, i):i === n[e]}, getShimContainer:function(){var e, n = i.get(this.shimid); return n || (e = i.get(this.options.container) || document.body, n = document.createElement("div"), n.id = this.shimid, n.className = "moxie-shim moxie-shim-" + this.type, t.extend(n.style, {position:"absolute", top:"0px", left:"0px", width:"1px", height:"1px", overflow:"hidden"}), e.appendChild(n), e = null), n}, getShim:function(){return c}, shimExec:function(e, t){var i = [].slice.call(arguments, 2); return l.getShim().exec.call(this, this.uid, e, t, i)}, exec:function(e, t){var i = [].slice.call(arguments, 2); return l[e] && l[e][t]?l[e][t].apply(this, i):l.shimExec.apply(this, arguments)}, destroy:function(){if (l){var e = i.get(this.shimid); e && e.parentNode.removeChild(e), c && c.removeAllInstances(), this.unbindAll(), delete a[this.uid], this.uid = null, d = l = c = e = null}}}), this.mode && e.required_caps && !this.can(e.required_caps) && (this.mode = !1)}var o = {}, a = {}; return r.order = "html5,flash,silverlight,html4", r.getRuntime = function(e){return a[e]?a[e]:!1}, r.addConstructor = function(e, t){t.prototype = n.instance, o[e] = t}, r.getConstructor = function(e){return o[e] || null}, r.getInfo = function(e){var t = r.getRuntime(e); return t?{uid:t.uid, type:t.type, mode:t.mode, can:function(){return t.can.apply(t, arguments)}}:null}, r.parseCaps = function(e){var i = {}; return"string" !== t.typeOf(e)?e || {}:(t.each(e.split(","), function(e){i[e] = !0}), i)}, r.can = function(e, t){var i, n, o = r.getConstructor(e); return o?(i = new o({required_caps:t}), n = i.mode, i.destroy(), !!n):!1}, r.thatCan = function(e, t){var i = (t || r.order).split(/\s*,\s*/); for (var n in i)if (r.can(i[n], e))return i[n]; return null}, r.getMode = function(e, i, n){var r = null; if ("undefined" === t.typeOf(n) && (n = "browser"), i && !t.isEmptyObj(e)){if (t.each(i, function(i, n){if (e.hasOwnProperty(n)){var o = e[n](i); if ("string" == typeof o && (o = [o]), r){if (!(r = t.arrayIntersect(r, o)))return r = !1} else r = o}}), r)return - 1 !== t.inArray(n, r)?n:r[0]; if (r === !1)return!1}return n}, r.capTrue = function(){return!0}, r.capFalse = function(){return!1}, r.capTest = function(e){return function(){return!!e}}, r}), n("moxie/runtime/RuntimeClient", ["moxie/core/utils/Env", "moxie/core/Exceptions", "moxie/core/utils/Basic", "moxie/runtime/Runtime"], function(e, t, i, n){return function(){var e; i.extend(this, {connectRuntime:function(r){function o(i){var a, u; return i.length?(a = i.shift().toLowerCase(), (u = n.getConstructor(a))?(e = new u(r), e.bind("Init", function(){e.initialized = !0, setTimeout(function(){e.clients++, s.ruid = e.uid, s.trigger("RuntimeInit", e)}, 1)}), e.bind("Error", function(){e.destroy(), o(i)}), e.bind("Exception", function(e, i){var n = i.name + "(#" + i.code + ")" + (i.message?", from: " + i.message:""); s.trigger("RuntimeError", new t.RuntimeError(t.RuntimeError.EXCEPTION_ERR, n))}), e.mode?(e.init(), void 0):(e.trigger("Error"), void 0)):(o(i), void 0)):(s.trigger("RuntimeError", new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)), e = null, void 0)}var a, s = this; if ("string" === i.typeOf(r)?a = r:"string" === i.typeOf(r.ruid) && (a = r.ruid), a){if (e = n.getRuntime(a))return s.ruid = a, e.clients++, e; throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order || n.order).split(/\s*,\s*/))}, disconnectRuntime:function(){e && --e.clients <= 0 && e.destroy(), e = null}, getRuntime:function(){return e && e.uid?e:e = null}, exec:function(){return e?e.exec.apply(this, arguments):null}, can:function(t){return e?e.can(t):!1}})}}), n("moxie/file/Blob", ["moxie/core/utils/Basic", "moxie/core/utils/Encode", "moxie/runtime/RuntimeClient"], function(e, t, i){function n(o, a){function s(t, i, o){var a, s = r[this.uid]; return"string" === e.typeOf(s) && s.length?(a = new n(null, {type:o, size:i - t}), a.detach(s.substr(t, a.size)), a):null}i.call(this), o && this.connectRuntime(o), a?"string" === e.typeOf(a) && (a = {data:a}):a = {}, e.extend(this, {uid:a.uid || e.guid("uid_"), ruid:o, size:a.size || 0, type:a.type || "", slice:function(e, t, i){return this.isDetached()?s.apply(this, arguments):this.getRuntime().exec.call(this, "Blob", "slice", this.getSource(), e, t, i)}, getSource:function(){return r[this.uid]?r[this.uid]:null}, detach:function(e){if (this.ruid && (this.getRuntime().exec.call(this, "Blob", "destroy"), this.disconnectRuntime(), this.ruid = null), e = e || "", "data:" == e.substr(0, 5)){var i = e.indexOf(";base64,"); this.type = e.substring(5, i), e = t.atob(e.substring(i + 8))}this.size = e.length, r[this.uid] = e}, isDetached:function(){return!this.ruid && "string" === e.typeOf(r[this.uid])}, destroy:function(){this.detach(), delete r[this.uid]}}), a.data?this.detach(a.data):r[this.uid] = a}var r = {}; return n}), n("moxie/core/I18n", ["moxie/core/utils/Basic"], function(e){var t = {}; return{addI18n:function(i){return e.extend(t, i)}, translate:function(e){return t[e] || e}, _:function(e){return this.translate(e)}, sprintf:function(t){var i = [].slice.call(arguments, 1); return t.replace(/%[a-z]/g, function(){var t = i.shift(); return"undefined" !== e.typeOf(t)?t:""})}}}), n("moxie/core/utils/Mime", ["moxie/core/utils/Basic", "moxie/core/I18n"], function(e, t){var i = "application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb,application/vnd.ms-powerpoint,ppt pps pot,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe", n = {mimes:{}, extensions:{}, addMimeType:function(e){var t, i, n, r = e.split(/,/); for (t = 0; t < r.length; t += 2){for (n = r[t + 1].split(/ /), i = 0; i < n.length; i++)this.mimes[n[i]] = r[t]; this.extensions[r[t]] = n}}, extList2mimes:function(t, i){var n, r, o, a, s = this, u = []; for (r = 0; r < t.length; r++)for (n = t[r].extensions.toLowerCase().split(/\s*,\s*/), o = 0; o < n.length; o++){if ("*" === n[o])return[]; if (a = s.mimes[n[o]], i && /^\w+$/.test(n[o]))u.push("." + n[o]); else if (a && - 1 === e.inArray(a, u))u.push(a); else if (!a)return[]}return u}, mimes2exts:function(t){var i = this, n = []; return e.each(t, function(t){if (t = t.toLowerCase(), "*" === t)return n = [], !1; var r = t.match(/^(\w+)\/(\*|\w+)$/); r && ("*" === r[2]?e.each(i.extensions, function(e, t){new RegExp("^" + r[1] + "/").test(t) && [].push.apply(n, i.extensions[t])}):i.extensions[t] && [].push.apply(n, i.extensions[t]))}), n}, mimes2extList:function(i){var n = [], r = []; return"string" === e.typeOf(i) && (i = e.trim(i).split(/\s*,\s*/)), r = this.mimes2exts(i), n.push({title:t.translate("Files"), extensions:r.length?r.join(","):"*"}), n.mimes = i, n}, getFileExtension:function(e){var t = e && e.match(/\.([^.]+)$/); return t?t[1].toLowerCase():""}, getFileMime:function(e){return this.mimes[this.getFileExtension(e)] || ""}}; return n.addMimeType(i), n}), n("moxie/file/FileInput", ["moxie/core/utils/Basic", "moxie/core/utils/Env", "moxie/core/utils/Mime", "moxie/core/utils/Dom", "moxie/core/Exceptions", "moxie/core/EventTarget", "moxie/core/I18n", "moxie/runtime/Runtime", "moxie/runtime/RuntimeClient"], function(e, t, i, n, r, o, a, s, u){function c(t){var o, c, d; if ( - 1 !== e.inArray(e.typeOf(t), ["string", "node"]) && (t = {browse_button:t}), c = n.get(t.browse_button), !c)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR); d = {accept:[{title:a.translate("All Files"), extensions:"*"}], multiple:!1, required_caps:!1, container:c.parentNode || document.body}, t = e.extend({}, d, t), "string" == typeof t.required_caps && (t.required_caps = s.parseCaps(t.required_caps)), "string" == typeof t.accept && (t.accept = i.mimes2extList(t.accept)), o = n.get(t.container), o || (o = document.body), "static" === n.getStyle(o, "position") && (o.style.position = "relative"), o = c = null, u.call(this), e.extend(this, {uid:e.guid("uid_"), ruid:null, shimid:null, files:null, init:function(){var i = this; i.bind("RuntimeInit", function(r, o){i.ruid = o.uid, i.shimid = o.shimid, i.bind("Ready", function(){i.trigger("Refresh")}, 999), i.bind("Refresh", function(){var i, r, a, s, u; a = n.get(t.browse_button), s = n.get(o.shimid), a && (i = n.getPos(a, n.get(t.container)), r = n.getSize(a), u = parseInt(n.getStyle(a, "z-index"), 10) || 0, s && e.extend(s.style, {top:i.y + "px", left:i.x + "px", width:r.w + "px", height:r.h + "px", zIndex:u + 1})), s = a = null}), o.exec.call(i, "FileInput", "init", t)}), i.connectRuntime(e.extend({}, t, {required_caps:{select_file:!0}}))}, getOption:function(e){return t[e]}, setOption:function(e, n){if (t.hasOwnProperty(e)){var o = t[e]; switch (e){case"accept":"string" == typeof n && (n = i.mimes2extList(n)); break; case"container":case"required_caps":throw new r.FileException(r.FileException.NO_MODIFICATION_ALLOWED_ERR)}t[e] = n, this.exec("FileInput", "setOption", e, n), this.trigger("OptionChanged", e, n, o)}}, disable:function(t){var i = this.getRuntime(); i && this.exec("FileInput", "disable", "undefined" === e.typeOf(t)?!0:t)}, refresh:function(){this.trigger("Refresh")}, destroy:function(){var t = this.getRuntime(); t && (t.exec.call(this, "FileInput", "destroy"), this.disconnectRuntime()), "array" === e.typeOf(this.files) && e.each(this.files, function(e){e.destroy()}), this.files = null, this.unbindAll()}}), this.handleEventProps(l)}var l = ["ready", "change", "cancel", "mouseenter", "mouseleave", "mousedown", "mouseup"]; return c.prototype = o.instance, c}), n("moxie/file/File", ["moxie/core/utils/Basic", "moxie/core/utils/Mime", "moxie/file/Blob"], function(e, t, i){function n(n, r){r || (r = {}), i.apply(this, arguments), this.type || (this.type = t.getFileMime(r.name)); var o; if (r.name)o = r.name.replace(/\\/g, "/"), o = o.substr(o.lastIndexOf("/") + 1); else if (this.type){var a = this.type.split("/")[0]; o = e.guid(("" !== a?a:"file") + "_"), t.extensions[this.type] && (o += "." + t.extensions[this.type][0])}e.extend(this, {name:o || e.guid("file_"), relativePath:"", lastModifiedDate:r.lastModifiedDate || (new Date).toLocaleString()})}return n.prototype = i.prototype, n}), n("moxie/file/FileDrop", ["moxie/core/I18n", "moxie/core/utils/Dom", "moxie/core/Exceptions", "moxie/core/utils/Basic", "moxie/core/utils/Env", "moxie/file/File", "moxie/runtime/RuntimeClient", "moxie/core/EventTarget", "moxie/core/utils/Mime"], function(e, t, i, n, r, o, a, s, u){function c(i){var r, o = this; "string" == typeof i && (i = {drop_zone:i}), r = {accept:[{title:e.translate("All Files"), extensions:"*"}], required_caps:{drag_and_drop:!0}}, i = "object" == typeof i?n.extend({}, r, i):r, i.container = t.get(i.drop_zone) || document.body, "static" === t.getStyle(i.container, "position") && (i.container.style.position = "relative"), "string" == typeof i.accept && (i.accept = u.mimes2extList(i.accept)), a.call(o), n.extend(o, {uid:n.guid("uid_"), ruid:null, files:null, init:function(){o.bind("RuntimeInit", function(e, t){o.ruid = t.uid, t.exec.call(o, "FileDrop", "init", i), o.dispatchEvent("ready")}), o.connectRuntime(i)}, destroy:function(){var e = this.getRuntime(); e && (e.exec.call(this, "FileDrop", "destroy"), this.disconnectRuntime()), this.files = null, this.unbindAll()}}), this.handleEventProps(l)}var l = ["ready", "dragenter", "dragleave", "drop", "error"]; return c.prototype = s.instance, c}), n("moxie/file/FileReader", ["moxie/core/utils/Basic", "moxie/core/utils/Encode", "moxie/core/Exceptions", "moxie/core/EventTarget", "moxie/file/Blob", "moxie/runtime/RuntimeClient"], function(e, t, i, n, r, o){function a(){function n(e, n){if (this.trigger("loadstart"), this.readyState === a.LOADING)return this.trigger("error", new i.DOMException(i.DOMException.INVALID_STATE_ERR)), this.trigger("loadend"), void 0;
14
+ if (!(n instanceof r))return this.trigger("error", new i.DOMException(i.DOMException.NOT_FOUND_ERR)), this.trigger("loadend"), void 0; if (this.result = null, this.readyState = a.LOADING, n.isDetached()){var o = n.getSource(); switch (e){case"readAsText":case"readAsBinaryString":this.result = o; break; case"readAsDataURL":this.result = "data:" + n.type + ";base64," + t.btoa(o)}this.readyState = a.DONE, this.trigger("load"), this.trigger("loadend")} else this.connectRuntime(n.ruid), this.exec("FileReader", "read", e, n)}o.call(this), e.extend(this, {uid:e.guid("uid_"), readyState:a.EMPTY, result:null, error:null, readAsBinaryString:function(e){n.call(this, "readAsBinaryString", e)}, readAsDataURL:function(e){n.call(this, "readAsDataURL", e)}, readAsText:function(e){n.call(this, "readAsText", e)}, abort:function(){this.result = null, - 1 === e.inArray(this.readyState, [a.EMPTY, a.DONE]) && (this.readyState === a.LOADING && (this.readyState = a.DONE), this.exec("FileReader", "abort"), this.trigger("abort"), this.trigger("loadend"))}, destroy:function(){this.abort(), this.exec("FileReader", "destroy"), this.disconnectRuntime(), this.unbindAll()}}), this.handleEventProps(s), this.bind("Error", function(e, t){this.readyState = a.DONE, this.error = t}, 999), this.bind("Load", function(){this.readyState = a.DONE}, 999)}var s = ["loadstart", "progress", "load", "abort", "error", "loadend"]; return a.EMPTY = 0, a.LOADING = 1, a.DONE = 2, a.prototype = n.instance, a}), n("moxie/core/utils/Url", ["moxie/core/utils/Basic"], function(e){var t = function(i, n){var r, o = ["source", "scheme", "authority", "userInfo", "user", "pass", "host", "port", "relative", "path", "directory", "file", "query", "fragment"], a = o.length, s = {http:80, https:443}, u = {}, c = /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?(\[[\da-fA-F:]+\]|[^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/, l = c.exec(i || ""), d = /^\/\/\w/.test(i); switch (e.typeOf(n)){case"undefined":n = t(document.location.href, !1); break; case"string":n = t(n, !1)}for (; a--; )l[a] && (u[o[a]] = l[a]); if (r = !d && !u.scheme, (d || r) && (u.scheme = n.scheme), r){u.host = n.host, u.port = n.port; var m = ""; /^[^\/]/.test(u.path) && (m = n.path, m = /\/[^\/]*\.[^\/]*$/.test(m)?m.replace(/\/[^\/]+$/, "/"):m.replace(/\/?$/, "/")), u.path = m + (u.path || "")}return u.port || (u.port = s[u.scheme] || 80), u.port = parseInt(u.port, 10), u.path || (u.path = "/"), delete u.source, u}, i = function(e){var i = {http:80, https:443}, n = "object" == typeof e?e:t(e); return n.scheme + "://" + n.host + (n.port !== i[n.scheme]?":" + n.port:"") + n.path + (n.query?n.query:"")}, n = function(e){function i(e){return[e.scheme, e.host, e.port].join("/")}return"string" == typeof e && (e = t(e)), i(t()) === i(e)}; return{parseUrl:t, resolveUrl:i, hasSameOrigin:n}}), n("moxie/runtime/RuntimeTarget", ["moxie/core/utils/Basic", "moxie/runtime/RuntimeClient", "moxie/core/EventTarget"], function(e, t, i){function n(){this.uid = e.guid("uid_"), t.call(this), this.destroy = function(){this.disconnectRuntime(), this.unbindAll()}}return n.prototype = i.instance, n}), n("moxie/file/FileReaderSync", ["moxie/core/utils/Basic", "moxie/runtime/RuntimeClient", "moxie/core/utils/Encode"], function(e, t, i){return function(){function n(e, t){if (!t.isDetached()){var n = this.connectRuntime(t.ruid).exec.call(this, "FileReaderSync", "read", e, t); return this.disconnectRuntime(), n}var r = t.getSource(); switch (e){case"readAsBinaryString":return r; case"readAsDataURL":return"data:" + t.type + ";base64," + i.btoa(r); case"readAsText":for (var o = "", a = 0, s = r.length; s > a; a++)o += String.fromCharCode(r[a]); return o}}t.call(this), e.extend(this, {uid:e.guid("uid_"), readAsBinaryString:function(e){return n.call(this, "readAsBinaryString", e)}, readAsDataURL:function(e){return n.call(this, "readAsDataURL", e)}, readAsText:function(e){return n.call(this, "readAsText", e)}})}}), n("moxie/xhr/FormData", ["moxie/core/Exceptions", "moxie/core/utils/Basic", "moxie/file/Blob"], function(e, t, i){function n(){var e, n = []; t.extend(this, {append:function(r, o){var a = this, s = t.typeOf(o); o instanceof i?e = {name:r, value:o}:"array" === s?(r += "[]", t.each(o, function(e){a.append(r, e)})):"object" === s?t.each(o, function(e, t){a.append(r + "[" + t + "]", e)}):"null" === s || "undefined" === s || "number" === s && isNaN(o)?a.append(r, "false"):n.push({name:r, value:o.toString()})}, hasBlob:function(){return!!this.getBlob()}, getBlob:function(){return e && e.value || null}, getBlobName:function(){return e && e.name || null}, each:function(i){t.each(n, function(e){i(e.value, e.name)}), e && i(e.value, e.name)}, destroy:function(){e = null, n = []}})}return n}), n("moxie/xhr/XMLHttpRequest", ["moxie/core/utils/Basic", "moxie/core/Exceptions", "moxie/core/EventTarget", "moxie/core/utils/Encode", "moxie/core/utils/Url", "moxie/runtime/Runtime", "moxie/runtime/RuntimeTarget", "moxie/file/Blob", "moxie/file/FileReaderSync", "moxie/xhr/FormData", "moxie/core/utils/Env", "moxie/core/utils/Mime"], function(e, t, i, n, r, o, a, s, u, c, l, d){function m(){this.uid = e.guid("uid_")}function h(){function i(e, t){return I.hasOwnProperty(e)?1 === arguments.length?l.can("define_property")?I[e]:A[e]:(l.can("define_property")?I[e] = t:A[e] = t, void 0):void 0}function u(t){function n(){R && (R.destroy(), R = null), s.dispatchEvent("loadend"), s = null}function r(r){R.bind("LoadStart", function(e){i("readyState", h.LOADING), s.dispatchEvent("readystatechange"), s.dispatchEvent(e), L && s.upload.dispatchEvent(e)}), R.bind("Progress", function(e){i("readyState") !== h.LOADING && (i("readyState", h.LOADING), s.dispatchEvent("readystatechange")), s.dispatchEvent(e)}), R.bind("UploadProgress", function(e){L && s.upload.dispatchEvent({type:"progress", lengthComputable:!1, total:e.total, loaded:e.loaded})}), R.bind("Load", function(t){i("readyState", h.DONE), i("status", Number(r.exec.call(R, "XMLHttpRequest", "getStatus") || 0)), i("statusText", f[i("status")] || ""), i("response", r.exec.call(R, "XMLHttpRequest", "getResponse", i("responseType"))), ~e.inArray(i("responseType"), ["text", ""])?i("responseText", i("response")):"document" === i("responseType") && i("responseXML", i("response")), U = r.exec.call(R, "XMLHttpRequest", "getAllResponseHeaders"), s.dispatchEvent("readystatechange"), i("status") > 0?(L && s.upload.dispatchEvent(t), s.dispatchEvent(t)):(F = !0, s.dispatchEvent("error")), n()}), R.bind("Abort", function(e){s.dispatchEvent(e), n()}), R.bind("Error", function(e){F = !0, i("readyState", h.DONE), s.dispatchEvent("readystatechange"), M = !0, s.dispatchEvent(e), n()}), r.exec.call(R, "XMLHttpRequest", "send", {url:x, method:v, async:T, user:w, password:y, headers:S, mimeType:D, encoding:O, responseType:s.responseType, withCredentials:s.withCredentials, options:k}, t)}var s = this; E = (new Date).getTime(), R = new a, "string" == typeof k.required_caps && (k.required_caps = o.parseCaps(k.required_caps)), k.required_caps = e.extend({}, k.required_caps, {return_response_type:s.responseType}), t instanceof c && (k.required_caps.send_multipart = !0), e.isEmptyObj(S) || (k.required_caps.send_custom_headers = !0), B || (k.required_caps.do_cors = !0), k.ruid?r(R.connectRuntime(k)):(R.bind("RuntimeInit", function(e, t){r(t)}), R.bind("RuntimeError", function(e, t){s.dispatchEvent("RuntimeError", t)}), R.connectRuntime(k))}function g(){i("responseText", ""), i("responseXML", null), i("response", null), i("status", 0), i("statusText", ""), E = b = null}var x, v, w, y, E, b, R, _, A = this, I = {timeout:0, readyState:h.UNSENT, withCredentials:!1, status:0, statusText:"", responseType:"", responseXML:null, responseText:null, response:null}, T = !0, S = {}, O = null, D = null, N = !1, C = !1, L = !1, M = !1, F = !1, B = !1, P = null, H = null, k = {}, U = ""; e.extend(this, I, {uid:e.guid("uid_"), upload:new m, open:function(o, a, s, u, c){var l; if (!o || !a)throw new t.DOMException(t.DOMException.SYNTAX_ERR); if (/[\u0100-\uffff]/.test(o) || n.utf8_encode(o) !== o)throw new t.DOMException(t.DOMException.SYNTAX_ERR); if (~e.inArray(o.toUpperCase(), ["CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT", "TRACE", "TRACK"]) && (v = o.toUpperCase()), ~e.inArray(v, ["CONNECT", "TRACE", "TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR); if (a = n.utf8_encode(a), l = r.parseUrl(a), B = r.hasSameOrigin(l), x = r.resolveUrl(a), (u || c) && !B)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR); if (w = u || l.user, y = c || l.pass, T = s || !0, T === !1 && (i("timeout") || i("withCredentials") || "" !== i("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR); N = !T, C = !1, S = {}, g.call(this), i("readyState", h.OPENED), this.dispatchEvent("readystatechange")}, setRequestHeader:function(r, o){var a = ["accept-charset", "accept-encoding", "access-control-request-headers", "access-control-request-method", "connection", "content-length", "cookie", "cookie2", "content-transfer-encoding", "date", "expect", "host", "keep-alive", "origin", "referer", "te", "trailer", "transfer-encoding", "upgrade", "user-agent", "via"]; if (i("readyState") !== h.OPENED || C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR); if (/[\u0100-\uffff]/.test(r) || n.utf8_encode(r) !== r)throw new t.DOMException(t.DOMException.SYNTAX_ERR); return r = e.trim(r).toLowerCase(), ~e.inArray(r, a) || /^(proxy\-|sec\-)/.test(r)?!1:(S[r]?S[r] += ", " + o:S[r] = o, !0)}, hasRequestHeader:function(e){return e && S[e.toLowerCase()] || !1}, getAllResponseHeaders:function(){return U || ""}, getResponseHeader:function(t){return t = t.toLowerCase(), F || ~e.inArray(t, ["set-cookie", "set-cookie2"])?null:U && "" !== U && (_ || (_ = {}, e.each(U.split(/\r\n/), function(t){var i = t.split(/:\s+/); 2 === i.length && (i[0] = e.trim(i[0]), _[i[0].toLowerCase()] = {header:i[0], value:e.trim(i[1])})})), _.hasOwnProperty(t))?_[t].header + ": " + _[t].value:null}, overrideMimeType:function(n){var r, o; if (~e.inArray(i("readyState"), [h.LOADING, h.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR); if (n = e.trim(n.toLowerCase()), /;/.test(n) && (r = n.match(/^([^;]+)(?:;\scharset\=)?(.*)$/)) && (n = r[1], r[2] && (o = r[2])), !d.mimes[n])throw new t.DOMException(t.DOMException.SYNTAX_ERR); P = n, H = o}, send:function(i, r){if (k = "string" === e.typeOf(r)?{ruid:r}:r?r:{}, this.readyState !== h.OPENED || C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR); if (i instanceof s)k.ruid = i.ruid, D = i.type || "application/octet-stream"; else if (i instanceof c){if (i.hasBlob()){var o = i.getBlob(); k.ruid = o.ruid, D = o.type || "application/octet-stream"}} else"string" == typeof i && (O = "UTF-8", D = "text/plain;charset=UTF-8", i = n.utf8_encode(i)); this.withCredentials || (this.withCredentials = k.required_caps && k.required_caps.send_browser_cookies && !B), L = !N && this.upload.hasEventListener(), F = !1, M = !i, N || (C = !0), u.call(this, i)}, abort:function(){if (F = !0, N = !1, ~e.inArray(i("readyState"), [h.UNSENT, h.OPENED, h.DONE]))i("readyState", h.UNSENT); else{if (i("readyState", h.DONE), C = !1, !R)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR); R.getRuntime().exec.call(R, "XMLHttpRequest", "abort", M), M = !0}}, destroy:function(){R && ("function" === e.typeOf(R.destroy) && R.destroy(), R = null), this.unbindAll(), this.upload && (this.upload.unbindAll(), this.upload = null)}}), this.handleEventProps(p.concat(["readystatechange"])), this.upload.handleEventProps(p)}var f = {100:"Continue", 101:"Switching Protocols", 102:"Processing", 200:"OK", 201:"Created", 202:"Accepted", 203:"Non-Authoritative Information", 204:"No Content", 205:"Reset Content", 206:"Partial Content", 207:"Multi-Status", 226:"IM Used", 300:"Multiple Choices", 301:"Moved Permanently", 302:"Found", 303:"See Other", 304:"Not Modified", 305:"Use Proxy", 306:"Reserved", 307:"Temporary Redirect", 400:"Bad Request", 401:"Unauthorized", 402:"Payment Required", 403:"Forbidden", 404:"Not Found", 405:"Method Not Allowed", 406:"Not Acceptable", 407:"Proxy Authentication Required", 408:"Request Timeout", 409:"Conflict", 410:"Gone", 411:"Length Required", 412:"Precondition Failed", 413:"Request Entity Too Large", 414:"Request-URI Too Long", 415:"Unsupported Media Type", 416:"Requested Range Not Satisfiable", 417:"Expectation Failed", 422:"Unprocessable Entity", 423:"Locked", 424:"Failed Dependency", 426:"Upgrade Required", 500:"Internal Server Error", 501:"Not Implemented", 502:"Bad Gateway", 503:"Service Unavailable", 504:"Gateway Timeout", 505:"HTTP Version Not Supported", 506:"Variant Also Negotiates", 507:"Insufficient Storage", 510:"Not Extended"}; m.prototype = i.instance; var p = ["loadstart", "progress", "abort", "error", "load", "timeout", "loadend"]; return h.UNSENT = 0, h.OPENED = 1, h.HEADERS_RECEIVED = 2, h.LOADING = 3, h.DONE = 4, h.prototype = i.instance, h}), n("moxie/runtime/Transporter", ["moxie/core/utils/Basic", "moxie/core/utils/Encode", "moxie/runtime/RuntimeClient", "moxie/core/EventTarget"], function(e, t, i, n){function r(){function n(){l = d = 0, c = this.result = null}function o(t, i){var n = this; u = i, n.bind("TransportingProgress", function(t){d = t.loaded, l > d && - 1 === e.inArray(n.state, [r.IDLE, r.DONE]) && a.call(n)}, 999), n.bind("TransportingComplete", function(){d = l, n.state = r.DONE, c = null, n.result = u.exec.call(n, "Transporter", "getAsBlob", t || "")}, 999), n.state = r.BUSY, n.trigger("TransportingStarted"), a.call(n)}function a(){var e, i = this, n = l - d; m > n && (m = n), e = t.btoa(c.substr(d, m)), u.exec.call(i, "Transporter", "receive", e, l)}var s, u, c, l, d, m; i.call(this), e.extend(this, {uid:e.guid("uid_"), state:r.IDLE, result:null, transport:function(t, i, r){var a = this; if (r = e.extend({chunk_size:204798}, r), (s = r.chunk_size % 3) && (r.chunk_size += 3 - s), m = r.chunk_size, n.call(this), c = t, l = t.length, "string" === e.typeOf(r) || r.ruid)o.call(a, i, this.connectRuntime(r)); else{var u = function(e, t){a.unbind("RuntimeInit", u), o.call(a, i, t)}; this.bind("RuntimeInit", u), this.connectRuntime(r)}}, abort:function(){var e = this; e.state = r.IDLE, u && (u.exec.call(e, "Transporter", "clear"), e.trigger("TransportingAborted")), n.call(e)}, destroy:function(){this.unbindAll(), u = null, this.disconnectRuntime(), n.call(this)}})}return r.IDLE = 0, r.BUSY = 1, r.DONE = 2, r.prototype = n.instance, r}), n("moxie/image/Image", ["moxie/core/utils/Basic", "moxie/core/utils/Dom", "moxie/core/Exceptions", "moxie/file/FileReaderSync", "moxie/xhr/XMLHttpRequest", "moxie/runtime/Runtime", "moxie/runtime/RuntimeClient", "moxie/runtime/Transporter", "moxie/core/utils/Env", "moxie/core/EventTarget", "moxie/file/Blob", "moxie/file/File", "moxie/core/utils/Encode"], function(e, t, i, n, r, o, a, s, u, c, l, d, m){function h(){function n(e){try{return e || (e = this.exec("Image", "getInfo")), this.size = e.size, this.width = e.width, this.height = e.height, this.type = e.type, this.meta = e.meta, "" === this.name && (this.name = e.name), !0} catch (t){return this.trigger("error", t.code), !1}}function c(t){var n = e.typeOf(t); try{if (t instanceof h){if (!t.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR); p.apply(this, arguments)} else if (t instanceof l){if (!~e.inArray(t.type, ["image/jpeg", "image/png"]))throw new i.ImageError(i.ImageError.WRONG_FORMAT); g.apply(this, arguments)} else if ( - 1 !== e.inArray(n, ["blob", "file"]))c.call(this, new d(null, t), arguments[1]); else if ("string" === n)"data:" === t.substr(0, 5)?c.call(this, new l(null, {data:t}), arguments[1]):x.apply(this, arguments); else{if ("node" !== n || "img" !== t.nodeName.toLowerCase())throw new i.DOMException(i.DOMException.TYPE_MISMATCH_ERR); c.call(this, t.src, arguments[1])}} catch (r){this.trigger("error", r.code)}}function p(t, i){var n = this.connectRuntime(t.ruid); this.ruid = n.uid, n.exec.call(this, "Image", "loadFromImage", t, "undefined" === e.typeOf(i)?!0:i)}function g(t, i){function n(e){r.ruid = e.uid, e.exec.call(r, "Image", "loadFromBlob", t)}var r = this; r.name = t.name || "", t.isDetached()?(this.bind("RuntimeInit", function(e, t){n(t)}), i && "string" == typeof i.required_caps && (i.required_caps = o.parseCaps(i.required_caps)), this.connectRuntime(e.extend({required_caps:{access_image_binary:!0, resize_image:!0}}, i))):n(this.connectRuntime(t.ruid))}function x(e, t){var i, n = this; i = new r, i.open("get", e), i.responseType = "blob", i.onprogress = function(e){n.trigger(e)}, i.onload = function(){g.call(n, i.response, !0)}, i.onerror = function(e){n.trigger(e)}, i.onloadend = function(){i.destroy()}, i.bind("RuntimeError", function(e, t){n.trigger("RuntimeError", t)}), i.send(null, t)}a.call(this), e.extend(this, {uid:e.guid("uid_"), ruid:null, name:"", size:0, width:0, height:0, type:"", meta:{}, clone:function(){this.load.apply(this, arguments)}, load:function(){c.apply(this, arguments)}, resize:function(t){var n, r, o = this, a = {x:0, y:0, width:o.width, height:o.height}, s = e.extendIf({width:o.width, height:o.height, type:o.type || "image/jpeg", quality:90, crop:!1, fit:!0, preserveHeaders:!0, resample:"default", multipass:!0}, t); try{if (!o.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR); if (o.width > h.MAX_RESIZE_WIDTH || o.height > h.MAX_RESIZE_HEIGHT)throw new i.ImageError(i.ImageError.MAX_RESOLUTION_ERR); if (n = o.meta && o.meta.tiff && o.meta.tiff.Orientation || 1, - 1 !== e.inArray(n, [5, 6, 7, 8])){var u = s.width; s.width = s.height, s.height = u}if (s.crop){switch (r = Math.max(s.width / o.width, s.height / o.height), t.fit?(a.width = Math.min(Math.ceil(s.width / r), o.width), a.height = Math.min(Math.ceil(s.height / r), o.height), r = s.width / a.width):(a.width = Math.min(s.width, o.width), a.height = Math.min(s.height, o.height), r = 1), "boolean" == typeof s.crop && (s.crop = "cc"), s.crop.toLowerCase().replace(/_/, "-")){case"rb":case"right-bottom":a.x = o.width - a.width, a.y = o.height - a.height; break; case"cb":case"center-bottom":a.x = Math.floor((o.width - a.width) / 2), a.y = o.height - a.height; break; case"lb":case"left-bottom":a.x = 0, a.y = o.height - a.height; break; case"lt":case"left-top":a.x = 0, a.y = 0; break; case"ct":case"center-top":a.x = Math.floor((o.width - a.width) / 2), a.y = 0; break; case"rt":case"right-top":a.x = o.width - a.width, a.y = 0; break; case"rc":case"right-center":case"right-middle":a.x = o.width - a.width, a.y = Math.floor((o.height - a.height) / 2); break; case"lc":case"left-center":case"left-middle":a.x = 0, a.y = Math.floor((o.height - a.height) / 2); break; case"cc":case"center-center":case"center-middle":default:a.x = Math.floor((o.width - a.width) / 2), a.y = Math.floor((o.height - a.height) / 2)}a.x = Math.max(a.x, 0), a.y = Math.max(a.y, 0)} else r = Math.min(s.width / o.width, s.height / o.height); this.exec("Image", "resize", a, r, s)} catch (c){o.trigger("error", c.code)}}, downsize:function(t){var i, n = {width:this.width, height:this.height, type:this.type || "image/jpeg", quality:90, crop:!1, preserveHeaders:!0, resample:"default"}; i = "object" == typeof t?e.extend(n, t):e.extend(n, {width:arguments[0], height:arguments[1], crop:arguments[2], preserveHeaders:arguments[3]}), this.resize(i)}, crop:function(e, t, i){this.downsize(e, t, !0, i)}, getAsCanvas:function(){if (!u.can("create_canvas"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR); return this.exec("Image", "getAsCanvas")}, getAsBlob:function(e, t){if (!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR); return this.exec("Image", "getAsBlob", e || "image/jpeg", t || 90)}, getAsDataURL:function(e, t){if (!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR); return this.exec("Image", "getAsDataURL", e || "image/jpeg", t || 90)}, getAsBinaryString:function(e, t){var i = this.getAsDataURL(e, t); return m.atob(i.substring(i.indexOf("base64,") + 7))}, embed:function(n, r){function o(t, r){var o = this; if (u.can("create_canvas")){var l = o.getAsCanvas(); if (l)return n.appendChild(l), l = null, o.destroy(), c.trigger("embedded"), void 0}var d = o.getAsDataURL(t, r); if (!d)throw new i.ImageError(i.ImageError.WRONG_FORMAT); if (u.can("use_data_uri_of", d.length))n.innerHTML = '<img src="' + d + '" width="' + o.width + '" height="' + o.height + '" />', o.destroy(), c.trigger("embedded"); else{var h = new s; h.bind("TransportingComplete", function(){a = c.connectRuntime(this.result.ruid), c.bind("Embedded", function(){e.extend(a.getShimContainer().style, {top:"0px", left:"0px", width:o.width + "px", height:o.height + "px"}), a = null}, 999), a.exec.call(c, "ImageView", "display", this.result.uid, width, height), o.destroy()}), h.transport(m.atob(d.substring(d.indexOf("base64,") + 7)), t, {required_caps:{display_media:!0}, runtime_order:"flash,silverlight", container:n})}}var a, c = this, l = e.extend({width:this.width, height:this.height, type:this.type || "image/jpeg", quality:90}, r); try{if (!(n = t.get(n)))throw new i.DOMException(i.DOMException.INVALID_NODE_TYPE_ERR); if (!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR); this.width > h.MAX_RESIZE_WIDTH || this.height > h.MAX_RESIZE_HEIGHT; var d = new h; return d.bind("Resize", function(){o.call(this, l.type, l.quality)}), d.bind("Load", function(){this.downsize(l)}), this.meta.thumb && this.meta.thumb.width >= l.width && this.meta.thumb.height >= l.height?d.load(this.meta.thumb.data):d.clone(this, !1), d} catch (f){this.trigger("error", f.code)}}, destroy:function(){this.ruid && (this.getRuntime().exec.call(this, "Image", "destroy"), this.disconnectRuntime()), this.meta && this.meta.thumb && this.meta.thumb.data.destroy(), this.unbindAll()}}), this.handleEventProps(f), this.bind("Load Resize", function(){return n.call(this)}, 999)}var f = ["progress", "load", "error", "resize", "embedded"]; return h.MAX_RESIZE_WIDTH = 8192, h.MAX_RESIZE_HEIGHT = 8192, h.prototype = c.instance, h}), n("moxie/runtime/html5/Runtime", ["moxie/core/utils/Basic", "moxie/core/Exceptions", "moxie/runtime/Runtime", "moxie/core/utils/Env"], function(e, t, i, n){function o(t){var o = this, u = i.capTest, c = i.capTrue, l = e.extend({access_binary:u(window.FileReader || window.File && window.File.getAsDataURL), access_image_binary:function(){return o.can("access_binary") && !!s.Image}, display_media:u((n.can("create_canvas") || n.can("use_data_uri_over32kb")) && r("moxie/image/Image")), do_cors:u(window.XMLHttpRequest && "withCredentials"in new XMLHttpRequest), drag_and_drop:u(function(){var e = document.createElement("div"); return("draggable"in e || "ondragstart"in e && "ondrop"in e) && ("IE" !== n.browser || n.verComp(n.version, 9, ">"))}()), filter_by_extension:u(function(){return!("Chrome" === n.browser && n.verComp(n.version, 28, "<") || "IE" === n.browser && n.verComp(n.version, 10, "<") || "Safari" === n.browser && n.verComp(n.version, 7, "<") || "Firefox" === n.browser && n.verComp(n.version, 37, "<"))}()), return_response_headers:c, return_response_type:function(e){return"json" === e && window.JSON?!0:n.can("return_response_type", e)}, return_status_code:c, report_upload_progress:u(window.XMLHttpRequest && (new XMLHttpRequest).upload), resize_image:function(){return o.can("access_binary") && n.can("create_canvas")}, select_file:function(){return n.can("use_fileinput") && window.File}, select_folder:function(){return o.can("select_file") && ("Chrome" === n.browser && n.verComp(n.version, 21, ">=") || "Firefox" === n.browser && n.verComp(n.version, 42, ">="))}, select_multiple:function(){return!(!o.can("select_file") || "Safari" === n.browser && "Windows" === n.os || "iOS" === n.os && n.verComp(n.osVersion, "7.0.0", ">") && n.verComp(n.osVersion, "8.0.0", "<"))}, send_binary_string:u(window.XMLHttpRequest && ((new XMLHttpRequest).sendAsBinary || window.Uint8Array && window.ArrayBuffer)), send_custom_headers:u(window.XMLHttpRequest), send_multipart:function(){return!!(window.XMLHttpRequest && (new XMLHttpRequest).upload && window.FormData) || o.can("send_binary_string")}, slice_blob:u(window.File && (File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice)), stream_upload:function(){return o.can("slice_blob") && o.can("send_multipart")}, summon_file_dialog:function(){return o.can("select_file") && ("Firefox" === n.browser && n.verComp(n.version, 4, ">=") || "Opera" === n.browser && n.verComp(n.version, 12, ">=") || "IE" === n.browser && n.verComp(n.version, 10, ">=") || !!~e.inArray(n.browser, ["Chrome", "Safari", "Edge"]))}, upload_filesize:c, use_http_method:c}, arguments[2]); i.call(this, t, arguments[1] || a, l), e.extend(this, {init:function(){this.trigger("Init")}, destroy:function(e){return function(){e.call(o), e = o = null}}(this.destroy)}), e.extend(this.getShim(), s)}var a = "html5", s = {}; return i.addConstructor(a, o), s}), n("moxie/runtime/html5/file/Blob", ["moxie/runtime/html5/Runtime", "moxie/file/Blob"], function(e, t){function i(){function e(e, t, i){var n; if (!window.File.prototype.slice)return(n = window.File.prototype.webkitSlice || window.File.prototype.mozSlice)?n.call(e, t, i):null; try{return e.slice(), e.slice(t, i)} catch (r){return e.slice(t, i - t)}}this.slice = function(){return new t(this.getRuntime().uid, e.apply(this, arguments))}}return e.Blob = i}), n("moxie/core/utils/Events", ["moxie/core/utils/Basic"], function(e){function t(){this.returnValue = !1}function i(){this.cancelBubble = !0}var n = {}, r = "moxie_" + e.guid(), o = function(o, a, s, u){var c, l; a = a.toLowerCase(), o.addEventListener?(c = s, o.addEventListener(a, c, !1)):o.attachEvent && (c = function(){var e = window.event; e.target || (e.target = e.srcElement), e.preventDefault = t, e.stopPropagation = i, s(e)}, o.attachEvent("on" + a, c)), o[r] || (o[r] = e.guid()), n.hasOwnProperty(o[r]) || (n[o[r]] = {}), l = n[o[r]], l.hasOwnProperty(a) || (l[a] = []), l[a].push({func:c, orig:s, key:u})}, a = function(t, i, o){var a, s; if (i = i.toLowerCase(), t[r] && n[t[r]] && n[t[r]][i]){a = n[t[r]][i]; for (var u = a.length - 1; u >= 0 && (a[u].orig !== o && a[u].key !== o || (t.removeEventListener?t.removeEventListener(i, a[u].func, !1):t.detachEvent && t.detachEvent("on" + i, a[u].func), a[u].orig = null, a[u].func = null, a.splice(u, 1), o === s)); u--); if (a.length || delete n[t[r]][i], e.isEmptyObj(n[t[r]])){delete n[t[r]]; try{delete t[r]} catch (c){t[r] = s}}}}, s = function(t, i){t && t[r] && e.each(n[t[r]], function(e, n){a(t, n, i)})}; return{addEvent:o, removeEvent:a, removeAllEvents:s}}), n("moxie/runtime/html5/file/FileInput", ["moxie/runtime/html5/Runtime", "moxie/file/File", "moxie/core/utils/Basic", "moxie/core/utils/Dom", "moxie/core/utils/Events", "moxie/core/utils/Mime", "moxie/core/utils/Env"], function(e, t, i, n, r, o, a){function s(){var e, s; i.extend(this, {init:function(u){var c, l, d, m, h, f, p = this, g = p.getRuntime(); e = u, d = e.accept.mimes || o.extList2mimes(e.accept, g.can("filter_by_extension")), l = g.getShimContainer(), l.innerHTML = '<input id="' + g.uid + '" type="file" style="font-size:999px;opacity:0;"' + (e.multiple && g.can("select_multiple")?"multiple":"") + (e.directory && g.can("select_folder")?"webkitdirectory directory":"") + (d?' accept="' + d.join(",") + '"':"") + " />", c = n.get(g.uid), i.extend(c.style, {position:"absolute", top:0, left:0, width:"100%", height:"100%"}), m = n.get(e.browse_button), s = n.getStyle(m, "z-index") || "auto", g.can("summon_file_dialog") && ("static" === n.getStyle(m, "position") && (m.style.position = "relative"), r.addEvent(m, "click", function(e){var t = n.get(g.uid); t && !t.disabled && t.click(), e.preventDefault()}, p.uid), p.bind("Refresh", function(){h = parseInt(s, 10) || 1, n.get(e.browse_button).style.zIndex = h, this.getRuntime().getShimContainer().style.zIndex = h - 1})), f = g.can("summon_file_dialog")?m:l, r.addEvent(f, "mouseover", function(){p.trigger("mouseenter")}, p.uid), r.addEvent(f, "mouseout", function(){p.trigger("mouseleave")}, p.uid), r.addEvent(f, "mousedown", function(){p.trigger("mousedown")}, p.uid), r.addEvent(n.get(e.container), "mouseup", function(){p.trigger("mouseup")}, p.uid), c.onchange = function x(){if (p.files = [], i.each(this.files, function(i){var n = ""; return e.directory && "." == i.name?!0:(i.webkitRelativePath && (n = "/" + i.webkitRelativePath.replace(/^\//, "")), i = new t(g.uid, i), i.relativePath = n, p.files.push(i), void 0)}), "IE" !== a.browser && "IEMobile" !== a.browser)this.value = ""; else{var n = this.cloneNode(!0); this.parentNode.replaceChild(n, this), n.onchange = x}p.files.length && p.trigger("change")}, p.trigger({type:"ready", async:!0}), l = null}, setOption:function(e, t){var i = this.getRuntime(), r = n.get(i.uid); switch (e){case"accept":if (t){var a = t.mimes || o.extList2mimes(t, i.can("filter_by_extension")); r.setAttribute("accept", a.join(","))} else r.removeAttribute("accept"); break; case"directory":t && i.can("select_folder")?(r.setAttribute("directory", ""), r.setAttribute("webkitdirectory", "")):(r.removeAttribute("directory"), r.removeAttribute("webkitdirectory")); break; case"multiple":t && i.can("select_multiple")?r.setAttribute("multiple", ""):r.removeAttribute("multiple")}}, disable:function(e){var t, i = this.getRuntime(); (t = n.get(i.uid)) && (t.disabled = !!e)}, destroy:function(){var t = this.getRuntime(), i = t.getShim(), o = t.getShimContainer(), a = e && n.get(e.container), u = e && n.get(e.browse_button); a && r.removeAllEvents(a, this.uid), u && (r.removeAllEvents(u, this.uid), u.style.zIndex = s), o && (r.removeAllEvents(o, this.uid), o.innerHTML = ""), i.removeInstance(this.uid), e = o = a = u = i = null}})}return e.FileInput = s}), n("moxie/runtime/html5/file/FileDrop", ["moxie/runtime/html5/Runtime", "moxie/file/File", "moxie/core/utils/Basic", "moxie/core/utils/Dom", "moxie/core/utils/Events", "moxie/core/utils/Mime"], function(e, t, i, n, r, o){function a(){function e(e){if (!e.dataTransfer || !e.dataTransfer.types)return!1; var t = i.toArray(e.dataTransfer.types || []); return - 1 !== i.inArray("Files", t) || - 1 !== i.inArray("public.file-url", t) || - 1 !== i.inArray("application/x-moz-file", t)}function a(e, i){if (u(e)){var n = new t(f, e); n.relativePath = i || "", p.push(n)}}function s(e){for (var t = [], n = 0; n < e.length; n++)[].push.apply(t, e[n].extensions.split(/\s*,\s*/)); return - 1 === i.inArray("*", t)?t:[]}function u(e){if (!g.length)return!0; var t = o.getFileExtension(e.name); return!t || - 1 !== i.inArray(t, g)}function c(e, t){var n = []; i.each(e, function(e){var t = e.webkitGetAsEntry(); t && (t.isFile?a(e.getAsFile(), t.fullPath):n.push(t))}), n.length?l(n, t):t()}function l(e, t){var n = []; i.each(e, function(e){n.push(function(t){d(e, t)})}), i.inSeries(n, function(){t()})}function d(e, t){e.isFile?e.file(function(i){a(i, e.fullPath), t()}, function(){t()}):e.isDirectory?m(e, t):t()}function m(e, t){function i(e){r.readEntries(function(t){t.length?([].push.apply(n, t), i(e)):e()}, e)}var n = [], r = e.createReader(); i(function(){l(n, t)})}var h, f, p = [], g = []; i.extend(this, {init:function(t){var n, o = this; h = t, f = o.ruid, g = s(h.accept), n = h.container, r.addEvent(n, "dragover", function(t){e(t) && (t.preventDefault(), t.dataTransfer.dropEffect = "copy")}, o.uid), r.addEvent(n, "drop", function(t){e(t) && (t.preventDefault(), p = [], t.dataTransfer.items && t.dataTransfer.items[0].webkitGetAsEntry?c(t.dataTransfer.items, function(){o.files = p, o.trigger("drop")}):(i.each(t.dataTransfer.files, function(e){a(e)}), o.files = p, o.trigger("drop")))}, o.uid), r.addEvent(n, "dragenter", function(){o.trigger("dragenter")}, o.uid), r.addEvent(n, "dragleave", function(){o.trigger("dragleave")}, o.uid)}, destroy:function(){r.removeAllEvents(h && n.get(h.container), this.uid), f = p = g = h = null}})}return e.FileDrop = a}), n("moxie/runtime/html5/file/FileReader", ["moxie/runtime/html5/Runtime", "moxie/core/utils/Encode", "moxie/core/utils/Basic"], function(e, t, i){function n(){function e(e){return t.atob(e.substring(e.indexOf("base64,") + 7))}var n, r = !1; i.extend(this, {read:function(t, o){var a = this; a.result = "", n = new window.FileReader, n.addEventListener("progress", function(e){a.trigger(e)}), n.addEventListener("load", function(t){a.result = r?e(n.result):n.result, a.trigger(t)}), n.addEventListener("error", function(e){a.trigger(e, n.error)}), n.addEventListener("loadend", function(e){n = null, a.trigger(e)}), "function" === i.typeOf(n[t])?(r = !1, n[t](o.getSource())):"readAsBinaryString" === t && (r = !0, n.readAsDataURL(o.getSource()))}, abort:function(){n && n.abort()}, destroy:function(){n = null}})}return e.FileReader = n}), n("moxie/runtime/html5/xhr/XMLHttpRequest", ["moxie/runtime/html5/Runtime", "moxie/core/utils/Basic", "moxie/core/utils/Mime", "moxie/core/utils/Url", "moxie/file/File", "moxie/file/Blob", "moxie/xhr/FormData", "moxie/core/Exceptions", "moxie/core/utils/Env"], function(e, t, i, n, r, o, a, s, u){function c(){function e(e, t){var i, n, r = this; i = t.getBlob().getSource(), n = new window.FileReader, n.onload = function(){t.append(t.getBlobName(), new o(null, {type:i.type, data:n.result})), f.send.call(r, e, t)}, n.readAsBinaryString(i)}function c(){return!window.XMLHttpRequest || "IE" === u.browser && u.verComp(u.version, 8, "<")?function(){for (var e = ["Msxml2.XMLHTTP.6.0", "Microsoft.XMLHTTP"], t = 0; t < e.length; t++)try{return new ActiveXObject(e[t])} catch (i){}}():new window.XMLHttpRequest}function l(e){var t = e.responseXML, i = e.responseText; return"IE" === u.browser && i && t && !t.documentElement && /[^\/]+\/[^\+]+\+xml/.test(e.getResponseHeader("Content-Type")) && (t = new window.ActiveXObject("Microsoft.XMLDOM"), t.async = !1, t.validateOnParse = !1, t.loadXML(i)), t && ("IE" === u.browser && 0 !== t.parseError || !t.documentElement || "parsererror" === t.documentElement.tagName)?null:t}function d(e){var t = "----moxieboundary" + (new Date).getTime(), i = "--", n = "\r\n", r = "", a = this.getRuntime(); if (!a.can("send_binary_string"))throw new s.RuntimeError(s.RuntimeError.NOT_SUPPORTED_ERR); return m.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + t), e.each(function(e, a){r += e instanceof o?i + t + n + 'Content-Disposition: form-data; name="' + a + '"; filename="' + unescape(encodeURIComponent(e.name || "blob")) + '"' + n + "Content-Type: " + (e.type || "application/octet-stream") + n + n + e.getSource() + n:i + t + n + 'Content-Disposition: form-data; name="' + a + '"' + n + n + unescape(encodeURIComponent(e)) + n}), r += i + t + i + n}var m, h, f = this; t.extend(this, {send:function(i, r){var s = this, l = "Mozilla" === u.browser && u.verComp(u.version, 4, ">=") && u.verComp(u.version, 7, "<"), f = "Android Browser" === u.browser, p = !1;
15
+ if (h = i.url.replace(/^.+?\/([\w\-\.]+)$/, "$1").toLowerCase(), m = c(), m.open(i.method, i.url, i.async, i.user, i.password), r instanceof o)r.isDetached() && (p = !0), r = r.getSource(); else if (r instanceof a){if (r.hasBlob())if (r.getBlob().isDetached())r = d.call(s, r), p = !0; else if ((l || f) && "blob" === t.typeOf(r.getBlob().getSource()) && window.FileReader)return e.call(s, i, r), void 0; if (r instanceof a){var g = new window.FormData; r.each(function(e, t){e instanceof o?g.append(t, e.getSource()):g.append(t, e)}), r = g}}m.upload?(i.withCredentials && (m.withCredentials = !0), m.addEventListener("load", function(e){s.trigger(e)}), m.addEventListener("error", function(e){s.trigger(e)}), m.addEventListener("progress", function(e){s.trigger(e)}), m.upload.addEventListener("progress", function(e){s.trigger({type:"UploadProgress", loaded:e.loaded, total:e.total})})):m.onreadystatechange = function(){switch (m.readyState){case 1:break; case 2:break; case 3:var e, t; try{n.hasSameOrigin(i.url) && (e = m.getResponseHeader("Content-Length") || 0), m.responseText && (t = m.responseText.length)} catch (r){e = t = 0}s.trigger({type:"progress", lengthComputable:!!e, total:parseInt(e, 10), loaded:t}); break; case 4:m.onreadystatechange = function(){}, 0 === m.status?s.trigger("error"):s.trigger("load")}}, t.isEmptyObj(i.headers) || t.each(i.headers, function(e, t){m.setRequestHeader(t, e)}), "" !== i.responseType && "responseType"in m && (m.responseType = "json" !== i.responseType || u.can("return_response_type", "json")?i.responseType:"text"), p?m.sendAsBinary?m.sendAsBinary(r):function(){for (var e = new Uint8Array(r.length), t = 0; t < r.length; t++)e[t] = 255 & r.charCodeAt(t); m.send(e.buffer)}():m.send(r), s.trigger("loadstart")}, getStatus:function(){try{if (m)return m.status} catch (e){}return 0}, getResponse:function(e){var t = this.getRuntime(); try{switch (e){case"blob":var n = new r(t.uid, m.response), o = m.getResponseHeader("Content-Disposition"); if (o){var a = o.match(/filename=([\'\"'])([^\1]+)\1/); a && (h = a[2])}return n.name = h, n.type || (n.type = i.getFileMime(h)), n; case"json":return u.can("return_response_type", "json")?m.response:200 === m.status && window.JSON?JSON.parse(m.responseText):null; case"document":return l(m); default:return"" !== m.responseText?m.responseText:null}} catch (s){return null}}, getAllResponseHeaders:function(){try{return m.getAllResponseHeaders()} catch (e){}return""}, abort:function(){m && m.abort()}, destroy:function(){f = h = null}})}return e.XMLHttpRequest = c}), n("moxie/runtime/html5/utils/BinaryReader", ["moxie/core/utils/Basic"], function(e){function t(e){e instanceof ArrayBuffer?i.apply(this, arguments):n.apply(this, arguments)}function i(t){var i = new DataView(t); e.extend(this, {readByteAt:function(e){return i.getUint8(e)}, writeByteAt:function(e, t){i.setUint8(e, t)}, SEGMENT:function(e, n, r){switch (arguments.length){case 2:return t.slice(e, e + n); case 1:return t.slice(e); case 3:if (null === r && (r = new ArrayBuffer), r instanceof ArrayBuffer){var o = new Uint8Array(this.length() - n + r.byteLength); e > 0 && o.set(new Uint8Array(t.slice(0, e)), 0), o.set(new Uint8Array(r), e), o.set(new Uint8Array(t.slice(e + n)), e + r.byteLength), this.clear(), t = o.buffer, i = new DataView(t); break}default:return t}}, length:function(){return t?t.byteLength:0}, clear:function(){i = t = null}})}function n(t){function i(e, i, n){n = 3 === arguments.length?n:t.length - i - 1, t = t.substr(0, i) + e + t.substr(n + i)}e.extend(this, {readByteAt:function(e){return t.charCodeAt(e)}, writeByteAt:function(e, t){i(String.fromCharCode(t), e, 1)}, SEGMENT:function(e, n, r){switch (arguments.length){case 1:return t.substr(e); case 2:return t.substr(e, n); case 3:i(null !== r?r:"", e, n); break; default:return t}}, length:function(){return t?t.length:0}, clear:function(){t = null}})}return e.extend(t.prototype, {littleEndian:!1, read:function(e, t){var i, n, r; if (e + t > this.length())throw new Error("You are trying to read outside the source boundaries."); for (n = this.littleEndian?0: - 8 * (t - 1), r = 0, i = 0; t > r; r++)i |= this.readByteAt(e + r) << Math.abs(n + 8 * r); return i}, write:function(e, t, i){var n, r; if (e > this.length())throw new Error("You are trying to write outside the source boundaries."); for (n = this.littleEndian?0: - 8 * (i - 1), r = 0; i > r; r++)this.writeByteAt(e + r, 255 & t >> Math.abs(n + 8 * r))}, BYTE:function(e){return this.read(e, 1)}, SHORT:function(e){return this.read(e, 2)}, LONG:function(e){return this.read(e, 4)}, SLONG:function(e){var t = this.read(e, 4); return t > 2147483647?t - 4294967296:t}, CHAR:function(e){return String.fromCharCode(this.read(e, 1))}, STRING:function(e, t){return this.asArray("CHAR", e, t).join("")}, asArray:function(e, t, i){for (var n = [], r = 0; i > r; r++)n[r] = this[e](t + r); return n}}), t}), n("moxie/runtime/html5/image/JPEGHeaders", ["moxie/runtime/html5/utils/BinaryReader", "moxie/core/Exceptions"], function(e, t){return function i(n){var r, o, a, s = [], u = 0; if (r = new e(n), 65496 !== r.SHORT(0))throw r.clear(), new t.ImageError(t.ImageError.WRONG_FORMAT); for (o = 2; o <= r.length(); )if (a = r.SHORT(o), a >= 65488 && 65495 >= a)o += 2; else{if (65498 === a || 65497 === a)break; u = r.SHORT(o + 2) + 2, a >= 65505 && 65519 >= a && s.push({hex:a, name:"APP" + (15 & a), start:o, length:u, segment:r.SEGMENT(o, u)}), o += u}return r.clear(), {headers:s, restore:function(t){var i, n, r; for (r = new e(t), o = 65504 == r.SHORT(2)?4 + r.SHORT(4):2, n = 0, i = s.length; i > n; n++)r.SEGMENT(o, 0, s[n].segment), o += s[n].length; return t = r.SEGMENT(), r.clear(), t}, strip:function(t){var n, r, o, a; for (o = new i(t), r = o.headers, o.purge(), n = new e(t), a = r.length; a--; )n.SEGMENT(r[a].start, r[a].length, ""); return t = n.SEGMENT(), n.clear(), t}, get:function(e){for (var t = [], i = 0, n = s.length; n > i; i++)s[i].name === e.toUpperCase() && t.push(s[i].segment); return t}, set:function(e, t){var i, n, r, o = []; for ("string" == typeof t?o.push(t):o = t, i = n = 0, r = s.length; r > i && (s[i].name === e.toUpperCase() && (s[i].segment = o[n], s[i].length = o[n].length, n++), !(n >= o.length)); i++); }, purge:function(){this.headers = s = []}}}}), n("moxie/runtime/html5/image/ExifParser", ["moxie/core/utils/Basic", "moxie/runtime/html5/utils/BinaryReader", "moxie/core/Exceptions"], function(e, i, n){function r(o){function a(i, r){var o, a, s, u, c, m, h, f, p = this, g = [], x = {}, v = {1:"BYTE", 7:"UNDEFINED", 2:"ASCII", 3:"SHORT", 4:"LONG", 5:"RATIONAL", 9:"SLONG", 10:"SRATIONAL"}, w = {BYTE:1, UNDEFINED:1, ASCII:1, SHORT:2, LONG:4, RATIONAL:8, SLONG:4, SRATIONAL:8}; for (o = p.SHORT(i), a = 0; o > a; a++)if (g = [], h = i + 2 + 12 * a, s = r[p.SHORT(h)], s !== t){if (u = v[p.SHORT(h += 2)], c = p.LONG(h += 2), m = w[u], !m)throw new n.ImageError(n.ImageError.INVALID_META_ERR); if (h += 4, m * c > 4 && (h = p.LONG(h) + d.tiffHeader), h + m * c >= this.length())throw new n.ImageError(n.ImageError.INVALID_META_ERR); "ASCII" !== u?(g = p.asArray(u, h, c), f = 1 == c?g[0]:g, x[s] = l.hasOwnProperty(s) && "object" != typeof f?l[s][f]:f):x[s] = e.trim(p.STRING(h, c).replace(/\0$/, ""))}return x}function s(e, t, i){var n, r, o, a = 0; if ("string" == typeof t){var s = c[e.toLowerCase()]; for (var u in s)if (s[u] === t){t = u; break}}n = d[e.toLowerCase() + "IFD"], r = this.SHORT(n); for (var l = 0; r > l; l++)if (o = n + 12 * l + 2, this.SHORT(o) == t){a = o + 8; break}if (!a)return!1; try{this.write(a, i, 4)} catch (m){return!1}return!0}var u, c, l, d, m, h; if (i.call(this, o), c = {tiff:{274:"Orientation", 270:"ImageDescription", 271:"Make", 272:"Model", 305:"Software", 34665:"ExifIFDPointer", 34853:"GPSInfoIFDPointer"}, exif:{36864:"ExifVersion", 40961:"ColorSpace", 40962:"PixelXDimension", 40963:"PixelYDimension", 36867:"DateTimeOriginal", 33434:"ExposureTime", 33437:"FNumber", 34855:"ISOSpeedRatings", 37377:"ShutterSpeedValue", 37378:"ApertureValue", 37383:"MeteringMode", 37384:"LightSource", 37385:"Flash", 37386:"FocalLength", 41986:"ExposureMode", 41987:"WhiteBalance", 41990:"SceneCaptureType", 41988:"DigitalZoomRatio", 41992:"Contrast", 41993:"Saturation", 41994:"Sharpness"}, gps:{0:"GPSVersionID", 1:"GPSLatitudeRef", 2:"GPSLatitude", 3:"GPSLongitudeRef", 4:"GPSLongitude"}, thumb:{513:"JPEGInterchangeFormat", 514:"JPEGInterchangeFormatLength"}}, l = {ColorSpace:{1:"sRGB", 0:"Uncalibrated"}, MeteringMode:{0:"Unknown", 1:"Average", 2:"CenterWeightedAverage", 3:"Spot", 4:"MultiSpot", 5:"Pattern", 6:"Partial", 255:"Other"}, LightSource:{1:"Daylight", 2:"Fliorescent", 3:"Tungsten", 4:"Flash", 9:"Fine weather", 10:"Cloudy weather", 11:"Shade", 12:"Daylight fluorescent (D 5700 - 7100K)", 13:"Day white fluorescent (N 4600 -5400K)", 14:"Cool white fluorescent (W 3900 - 4500K)", 15:"White fluorescent (WW 3200 - 3700K)", 17:"Standard light A", 18:"Standard light B", 19:"Standard light C", 20:"D55", 21:"D65", 22:"D75", 23:"D50", 24:"ISO studio tungsten", 255:"Other"}, Flash:{0:"Flash did not fire", 1:"Flash fired", 5:"Strobe return light not detected", 7:"Strobe return light detected", 9:"Flash fired, compulsory flash mode", 13:"Flash fired, compulsory flash mode, return light not detected", 15:"Flash fired, compulsory flash mode, return light detected", 16:"Flash did not fire, compulsory flash mode", 24:"Flash did not fire, auto mode", 25:"Flash fired, auto mode", 29:"Flash fired, auto mode, return light not detected", 31:"Flash fired, auto mode, return light detected", 32:"No flash function", 65:"Flash fired, red-eye reduction mode", 69:"Flash fired, red-eye reduction mode, return light not detected", 71:"Flash fired, red-eye reduction mode, return light detected", 73:"Flash fired, compulsory flash mode, red-eye reduction mode", 77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected", 79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected", 89:"Flash fired, auto mode, red-eye reduction mode", 93:"Flash fired, auto mode, return light not detected, red-eye reduction mode", 95:"Flash fired, auto mode, return light detected, red-eye reduction mode"}, ExposureMode:{0:"Auto exposure", 1:"Manual exposure", 2:"Auto bracket"}, WhiteBalance:{0:"Auto white balance", 1:"Manual white balance"}, SceneCaptureType:{0:"Standard", 1:"Landscape", 2:"Portrait", 3:"Night scene"}, Contrast:{0:"Normal", 1:"Soft", 2:"Hard"}, Saturation:{0:"Normal", 1:"Low saturation", 2:"High saturation"}, Sharpness:{0:"Normal", 1:"Soft", 2:"Hard"}, GPSLatitudeRef:{N:"North latitude", S:"South latitude"}, GPSLongitudeRef:{E:"East longitude", W:"West longitude"}}, d = {tiffHeader:10}, m = d.tiffHeader, u = {clear:this.clear}, e.extend(this, {read:function(){try{return r.prototype.read.apply(this, arguments)} catch (e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}}, write:function(){try{return r.prototype.write.apply(this, arguments)} catch (e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}}, UNDEFINED:function(){return this.BYTE.apply(this, arguments)}, RATIONAL:function(e){return this.LONG(e) / this.LONG(e + 4)}, SRATIONAL:function(e){return this.SLONG(e) / this.SLONG(e + 4)}, ASCII:function(e){return this.CHAR(e)}, TIFF:function(){return h || null}, EXIF:function(){var t = null; if (d.exifIFD){try{t = a.call(this, d.exifIFD, c.exif)} catch (i){return null}if (t.ExifVersion && "array" === e.typeOf(t.ExifVersion)){for (var n = 0, r = ""; n < t.ExifVersion.length; n++)r += String.fromCharCode(t.ExifVersion[n]); t.ExifVersion = r}}return t}, GPS:function(){var t = null; if (d.gpsIFD){try{t = a.call(this, d.gpsIFD, c.gps)} catch (i){return null}t.GPSVersionID && "array" === e.typeOf(t.GPSVersionID) && (t.GPSVersionID = t.GPSVersionID.join("."))}return t}, thumb:function(){if (d.IFD1)try{var e = a.call(this, d.IFD1, c.thumb); if ("JPEGInterchangeFormat"in e)return this.SEGMENT(d.tiffHeader + e.JPEGInterchangeFormat, e.JPEGInterchangeFormatLength)} catch (t){}return null}, setExif:function(e, t){return"PixelXDimension" !== e && "PixelYDimension" !== e?!1:s.call(this, "exif", e, t)}, clear:function(){u.clear(), o = c = l = h = d = u = null}}), 65505 !== this.SHORT(0) || "EXIF\0" !== this.STRING(4, 5).toUpperCase())throw new n.ImageError(n.ImageError.INVALID_META_ERR); if (this.littleEndian = 18761 == this.SHORT(m), 42 !== this.SHORT(m += 2))throw new n.ImageError(n.ImageError.INVALID_META_ERR); d.IFD0 = d.tiffHeader + this.LONG(m += 2), h = a.call(this, d.IFD0, c.tiff), "ExifIFDPointer"in h && (d.exifIFD = d.tiffHeader + h.ExifIFDPointer, delete h.ExifIFDPointer), "GPSInfoIFDPointer"in h && (d.gpsIFD = d.tiffHeader + h.GPSInfoIFDPointer, delete h.GPSInfoIFDPointer), e.isEmptyObj(h) && (h = null); var f = this.LONG(d.IFD0 + 12 * this.SHORT(d.IFD0) + 2); f && (d.IFD1 = d.tiffHeader + f)}return r.prototype = i.prototype, r}), n("moxie/runtime/html5/image/JPEG", ["moxie/core/utils/Basic", "moxie/core/Exceptions", "moxie/runtime/html5/image/JPEGHeaders", "moxie/runtime/html5/utils/BinaryReader", "moxie/runtime/html5/image/ExifParser"], function(e, t, i, n, r){function o(o){function a(e){var t, i, n = 0; for (e || (e = c); n <= e.length(); ){if (t = e.SHORT(n += 2), t >= 65472 && 65475 >= t)return n += 5, {height:e.SHORT(n), width:e.SHORT(n += 2)}; i = e.SHORT(n += 2), n += i - 2}return null}function s(){var e, t, i = d.thumb(); return i && (e = new n(i), t = a(e), e.clear(), t)?(t.data = i, t):null}function u(){d && l && c && (d.clear(), l.purge(), c.clear(), m = l = d = c = null)}var c, l, d, m; if (c = new n(o), 65496 !== c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT); l = new i(o); try{d = new r(l.get("app1")[0])} catch (h){}m = a.call(this), e.extend(this, {type:"image/jpeg", size:c.length(), width:m && m.width || 0, height:m && m.height || 0, setExif:function(t, i){return d?("object" === e.typeOf(t)?e.each(t, function(e, t){d.setExif(t, e)}):d.setExif(t, i), l.set("app1", d.SEGMENT()), void 0):!1}, writeHeaders:function(){return arguments.length?l.restore(arguments[0]):l.restore(o)}, stripHeaders:function(e){return l.strip(e)}, purge:function(){u.call(this)}}), d && (this.meta = {tiff:d.TIFF(), exif:d.EXIF(), gps:d.GPS(), thumb:s()})}return o}), n("moxie/runtime/html5/image/PNG", ["moxie/core/Exceptions", "moxie/core/utils/Basic", "moxie/runtime/html5/utils/BinaryReader"], function(e, t, i){function n(n){function r(){var e, t; return e = a.call(this, 8), "IHDR" == e.type?(t = e.start, {width:s.LONG(t), height:s.LONG(t += 4)}):null}function o(){s && (s.clear(), n = l = u = c = s = null)}function a(e){var t, i, n, r; return t = s.LONG(e), i = s.STRING(e += 4, 4), n = e += 4, r = s.LONG(e + t), {length:t, type:i, start:n, CRC:r}}var s, u, c, l; s = new i(n), function(){var t = 0, i = 0, n = [35152, 20039, 3338, 6666]; for (i = 0; i < n.length; i++, t += 2)if (n[i] != s.SHORT(t))throw new e.ImageError(e.ImageError.WRONG_FORMAT)}(), l = r.call(this), t.extend(this, {type:"image/png", size:s.length(), width:l.width, height:l.height, purge:function(){o.call(this)}}), o.call(this)}return n}), n("moxie/runtime/html5/image/ImageInfo", ["moxie/core/utils/Basic", "moxie/core/Exceptions", "moxie/runtime/html5/image/JPEG", "moxie/runtime/html5/image/PNG"], function(e, t, i, n){return function(r){var o, a = [i, n]; o = function(){for (var e = 0; e < a.length; e++)try{return new a[e](r)} catch (i){}throw new t.ImageError(t.ImageError.WRONG_FORMAT)}(), e.extend(this, {type:"", size:0, width:0, height:0, setExif:function(){}, writeHeaders:function(e){return e}, stripHeaders:function(e){return e}, purge:function(){r = null}}), e.extend(this, o), this.purge = function(){o.purge(), o = null}}}), n("moxie/runtime/html5/image/ResizerCanvas", [], function(){function e(i, n){var r = i.width, o = Math.floor(r * n), a = !1; (.5 > n || n > 2) && (n = .5 > n?.5:2, a = !0); var s = t(i, n); return a?e(s, o / s.width):s}function t(e, t){var i = e.width, n = e.height, r = Math.floor(i * t), o = Math.floor(n * t), a = document.createElement("canvas"); return a.width = r, a.height = o, a.getContext("2d").drawImage(e, 0, 0, i, n, 0, 0, r, o), e = null, a}return{scale:e}}), n("moxie/runtime/html5/image/Image", ["moxie/runtime/html5/Runtime", "moxie/core/utils/Basic", "moxie/core/Exceptions", "moxie/core/utils/Encode", "moxie/file/Blob", "moxie/file/File", "moxie/runtime/html5/image/ImageInfo", "moxie/runtime/html5/image/ResizerCanvas", "moxie/core/utils/Mime", "moxie/core/utils/Env"], function(e, t, i, n, r, o, a, s, u){function c(){function e(){if (!v && !g)throw new i.ImageError(i.DOMException.INVALID_STATE_ERR); return v || g}function c(){var t = e(); return"canvas" == t.nodeName.toLowerCase()?t:(v = document.createElement("canvas"), v.width = t.width, v.height = t.height, v.getContext("2d").drawImage(t, 0, 0), v)}function l(e){return n.atob(e.substring(e.indexOf("base64,") + 7))}function d(e, t){return"data:" + (t || "") + ";base64," + n.btoa(e)}function m(e){var t = this; g = new Image, g.onerror = function(){p.call(this), t.trigger("error", i.ImageError.WRONG_FORMAT)}, g.onload = function(){t.trigger("load")}, g.src = "data:" == e.substr(0, 5)?e:d(e, y.type)}function h(e, t){var n, r = this; return window.FileReader?(n = new FileReader, n.onload = function(){t.call(r, this.result)}, n.onerror = function(){r.trigger("error", i.ImageError.WRONG_FORMAT)}, n.readAsDataURL(e), void 0):t.call(this, e.getAsDataURL())}function f(e, i){var n = Math.PI / 180, r = document.createElement("canvas"), o = r.getContext("2d"), a = e.width, s = e.height; switch (t.inArray(i, [5, 6, 7, 8]) > - 1?(r.width = s, r.height = a):(r.width = a, r.height = s), i){case 2:o.translate(a, 0), o.scale( - 1, 1); break; case 3:o.translate(a, s), o.rotate(180 * n); break; case 4:o.translate(0, s), o.scale(1, - 1); break; case 5:o.rotate(90 * n), o.scale(1, - 1); break; case 6:o.rotate(90 * n), o.translate(0, - s); break; case 7:o.rotate(90 * n), o.translate(a, - s), o.scale( - 1, 1); break; case 8:o.rotate( - 90 * n), o.translate( - a, 0)}return o.drawImage(e, 0, 0, a, s), r}function p(){x && (x.purge(), x = null), w = g = v = y = null, b = !1}var g, x, v, w, y, E = this, b = !1, R = !0; t.extend(this, {loadFromBlob:function(e){var t = this.getRuntime(), n = arguments.length > 1?arguments[1]:!0; if (!t.can("access_binary"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR); return y = e, e.isDetached()?(w = e.getSource(), m.call(this, w), void 0):(h.call(this, e.getSource(), function(e){n && (w = l(e)), m.call(this, e)}), void 0)}, loadFromImage:function(e, t){this.meta = e.meta, y = new o(null, {name:e.name, size:e.size, type:e.type}), m.call(this, t?w = e.getAsBinaryString():e.getAsDataURL())}, getInfo:function(){var t, i = this.getRuntime(); return!x && w && i.can("access_image_binary") && (x = new a(w)), t = {width:e().width || 0, height:e().height || 0, type:y.type || u.getFileMime(y.name), size:w && w.length || y.size || 0, name:y.name || "", meta:null}, R && (t.meta = x && x.meta || this.meta || {}, !t.meta || !t.meta.thumb || t.meta.thumb.data instanceof r || (t.meta.thumb.data = new r(null, {type:"image/jpeg", data:t.meta.thumb.data}))), t}, resize:function(t, i, n){var r = document.createElement("canvas"); if (r.width = t.width, r.height = t.height, r.getContext("2d").drawImage(e(), t.x, t.y, t.width, t.height, 0, 0, r.width, r.height), v = s.scale(r, i), R = n.preserveHeaders, !R){var o = this.meta && this.meta.tiff && this.meta.tiff.Orientation || 1; v = f(v, o)}this.width = v.width, this.height = v.height, b = !0, this.trigger("Resize")}, getAsCanvas:function(){return v || (v = c()), v.id = this.uid + "_canvas", v}, getAsBlob:function(e, t){return e !== this.type?(b = !0, new o(null, {name:y.name || "", type:e, data:E.getAsDataURL(e, t)})):new o(null, {name:y.name || "", type:e, data:E.getAsBinaryString(e, t)})}, getAsDataURL:function(e){var t = arguments[1] || 90; if (!b)return g.src; if (c(), "image/jpeg" !== e)return v.toDataURL("image/png"); try{return v.toDataURL("image/jpeg", t / 100)} catch (i){return v.toDataURL("image/jpeg")}}, getAsBinaryString:function(e, t){if (!b)return w || (w = l(E.getAsDataURL(e, t))), w; if ("image/jpeg" !== e)w = l(E.getAsDataURL(e, t)); else{var i; t || (t = 90), c(); try{i = v.toDataURL("image/jpeg", t / 100)} catch (n){i = v.toDataURL("image/jpeg")}w = l(i), x && (w = x.stripHeaders(w), R && (x.meta && x.meta.exif && x.setExif({PixelXDimension:this.width, PixelYDimension:this.height}), w = x.writeHeaders(w)), x.purge(), x = null)}return b = !1, w}, destroy:function(){E = null, p.call(this), this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image = c}), n("moxie/runtime/flash/Runtime", ["moxie/core/utils/Basic", "moxie/core/utils/Env", "moxie/core/utils/Dom", "moxie/core/Exceptions", "moxie/runtime/Runtime"], function(e, t, i, n, o){function a(){var e; try{e = navigator.plugins["Shockwave Flash"], e = e.description} catch (t){try{e = new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")} catch (i){e = "0.0"}}return e = e.match(/\d+/g), parseFloat(e[0] + "." + e[1])}function s(e){var n = i.get(e); n && "OBJECT" == n.nodeName && ("IE" === t.browser?(n.style.display = "none", function r(){4 == n.readyState?u(e):setTimeout(r, 10)}()):n.parentNode.removeChild(n))}function u(e){var t = i.get(e); if (t){for (var n in t)"function" == typeof t[n] && (t[n] = null); t.parentNode.removeChild(t)}}function c(u){var c, m = this; u = e.extend({swf_url:t.swf_url}, u), o.call(this, u, l, {access_binary:function(e){return e && "browser" === m.mode}, access_image_binary:function(e){return e && "browser" === m.mode}, display_media:o.capTest(r("moxie/image/Image")), do_cors:o.capTrue, drag_and_drop:!1, report_upload_progress:function(){return"client" === m.mode}, resize_image:o.capTrue, return_response_headers:!1, return_response_type:function(t){return"json" === t && window.JSON?!0:!e.arrayDiff(t, ["", "text", "document"]) || "browser" === m.mode}, return_status_code:function(t){return"browser" === m.mode || !e.arrayDiff(t, [200, 404])}, select_file:o.capTrue, select_multiple:o.capTrue, send_binary_string:function(e){return e && "browser" === m.mode}, send_browser_cookies:function(e){return e && "browser" === m.mode}, send_custom_headers:function(e){return e && "browser" === m.mode}, send_multipart:o.capTrue, slice_blob:function(e){return e && "browser" === m.mode}, stream_upload:function(e){return e && "browser" === m.mode}, summon_file_dialog:!1, upload_filesize:function(t){return e.parseSizeStr(t) <= 2097152 || "client" === m.mode}, use_http_method:function(t){return!e.arrayDiff(t, ["GET", "POST"])}}, {access_binary:function(e){return e?"browser":"client"}, access_image_binary:function(e){return e?"browser":"client"}, report_upload_progress:function(e){return e?"browser":"client"}, return_response_type:function(t){return e.arrayDiff(t, ["", "text", "json", "document"])?"browser":["client", "browser"]}, return_status_code:function(t){return e.arrayDiff(t, [200, 404])?"browser":["client", "browser"]}, send_binary_string:function(e){return e?"browser":"client"}, send_browser_cookies:function(e){return e?"browser":"client"}, send_custom_headers:function(e){return e?"browser":"client"}, slice_blob:function(e){return e?"browser":"client"}, stream_upload:function(e){return e?"client":"browser"}, upload_filesize:function(t){return e.parseSizeStr(t) >= 2097152?"client":"browser"}}, "client"), a() < 11.3 && (this.mode = !1), e.extend(this, {getShim:function(){return i.get(this.uid)}, shimExec:function(e, t){var i = [].slice.call(arguments, 2); return m.getShim().exec(this.uid, e, t, i)}, init:function(){var i, r, o; o = this.getShimContainer(), e.extend(o.style, {position:"absolute", top:"-8px", left:"-8px", width:"9px", height:"9px", overflow:"hidden"}), i = '<object id="' + this.uid + '" type="application/x-shockwave-flash" data="' + u.swf_url + '" ', "IE" === t.browser && (i += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '), i += 'width="100%" height="100%" style="outline:0"><param name="movie" value="' + u.swf_url + '" />' + '<param name="flashvars" value="uid=' + escape(this.uid) + "&target=" + t.global_event_dispatcher + '" />' + '<param name="wmode" value="transparent" />' + '<param name="allowscriptaccess" value="always" />' + "</object>", "IE" === t.browser?(r = document.createElement("div"), o.appendChild(r), r.outerHTML = i, r = o = null):o.innerHTML = i, c = setTimeout(function(){m && !m.initialized && m.trigger("Error", new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))}, 5e3)}, destroy:function(e){return function(){s(m.uid), e.call(m), clearTimeout(c), u = c = e = m = null}}(this.destroy)}, d)}var l = "flash", d = {}; return o.addConstructor(l, c), d}), n("moxie/runtime/flash/file/Blob", ["moxie/runtime/flash/Runtime", "moxie/file/Blob"], function(e, t){var i = {slice:function(e, i, n, r){var o = this.getRuntime(); return 0 > i?i = Math.max(e.size + i, 0):i > 0 && (i = Math.min(i, e.size)), 0 > n?n = Math.max(e.size + n, 0):n > 0 && (n = Math.min(n, e.size)), e = o.shimExec.call(this, "Blob", "slice", i, n, r || ""), e && (e = new t(o.uid, e)), e}}; return e.Blob = i}), n("moxie/runtime/flash/file/FileInput", ["moxie/runtime/flash/Runtime", "moxie/file/File", "moxie/core/utils/Basic"], function(e, t, i){var n = {init:function(e){var n = this, r = this.getRuntime(); this.bind("Change", function(){var e = r.shimExec.call(n, "FileInput", "getFiles"); n.files = [], i.each(e, function(e){n.files.push(new t(r.uid, e))})}, 999), this.getRuntime().shimExec.call(this, "FileInput", "init", {accept:e.accept, multiple:e.multiple}), this.trigger("ready")}}; return e.FileInput = n}), n("moxie/runtime/flash/file/FileReader", ["moxie/runtime/flash/Runtime", "moxie/core/utils/Encode"], function(e, t){function i(e, i){switch (i){case"readAsText":return t.atob(e, "utf8"); case"readAsBinaryString":return t.atob(e); case"readAsDataURL":return e}return null}var n = {read:function(e, t){var n = this; return n.result = "", "readAsDataURL" === e && (n.result = "data:" + (t.type || "") + ";base64,"), n.bind("Progress", function(t, r){r && (n.result += i(r, e))}, 999), n.getRuntime().shimExec.call(this, "FileReader", "readAsBase64", t.uid)}}; return e.FileReader = n}), n("moxie/runtime/flash/file/FileReaderSync", ["moxie/runtime/flash/Runtime", "moxie/core/utils/Encode"], function(e, t){function i(e, i){switch (i){case"readAsText":return t.atob(e, "utf8"); case"readAsBinaryString":return t.atob(e); case"readAsDataURL":return e}return null}var n = {read:function(e, t){var n, r = this.getRuntime(); return(n = r.shimExec.call(this, "FileReaderSync", "readAsBase64", t.uid))?("readAsDataURL" === e && (n = "data:" + (t.type || "") + ";base64," + n), i(n, e, t.type)):null}}; return e.FileReaderSync = n}), n("moxie/runtime/flash/runtime/Transporter", ["moxie/runtime/flash/Runtime", "moxie/file/Blob"], function(e, t){var i = {getAsBlob:function(e){var i = this.getRuntime(), n = i.shimExec.call(this, "Transporter", "getAsBlob", e); return n?new t(i.uid, n):null}}; return e.Transporter = i}), n("moxie/runtime/flash/xhr/XMLHttpRequest", ["moxie/runtime/flash/Runtime", "moxie/core/utils/Basic", "moxie/file/Blob", "moxie/file/File", "moxie/file/FileReaderSync", "moxie/runtime/flash/file/FileReaderSync", "moxie/xhr/FormData", "moxie/runtime/Transporter", "moxie/runtime/flash/runtime/Transporter"], function(e, t, i, n, r, o, a, s){var u = {send:function(e, n){function r(){e.transport = l.mode, l.shimExec.call(c, "XMLHttpRequest", "send", e, n)}function o(e, t){l.shimExec.call(c, "XMLHttpRequest", "appendBlob", e, t.uid), n = null, r()}function u(e, t){var i = new s; i.bind("TransportingComplete", function(){t(this.result)}), i.transport(e.getSource(), e.type, {ruid:l.uid})}var c = this, l = c.getRuntime(); if (t.isEmptyObj(e.headers) || t.each(e.headers, function(e, t){l.shimExec.call(c, "XMLHttpRequest", "setRequestHeader", t, e.toString())}), n instanceof a){var d; if (n.each(function(e, t){e instanceof i?d = t:l.shimExec.call(c, "XMLHttpRequest", "append", t, e)}), n.hasBlob()){var m = n.getBlob(); m.isDetached()?u(m, function(e){m.destroy(), o(d, e)}):o(d, m)} else n = null, r()} else n instanceof i?n.isDetached()?u(n, function(e){n.destroy(), n = e.uid, r()}):(n = n.uid, r()):r()}, getResponse:function(e){var i, o, a = this.getRuntime(); if (o = a.shimExec.call(this, "XMLHttpRequest", "getResponseAsBlob")){if (o = new n(a.uid, o), "blob" === e)return o; try{if (i = new r, ~t.inArray(e, ["", "text"]))return i.readAsText(o); if ("json" === e && window.JSON)return JSON.parse(i.readAsText(o))} finally{o.destroy()}}return null}, abort:function(){var e = this.getRuntime(); e.shimExec.call(this, "XMLHttpRequest", "abort"), this.dispatchEvent("readystatechange"), this.dispatchEvent("abort")}}; return e.XMLHttpRequest = u}), n("moxie/runtime/flash/image/Image", ["moxie/runtime/flash/Runtime", "moxie/core/utils/Basic", "moxie/runtime/Transporter", "moxie/file/Blob", "moxie/file/FileReaderSync"], function(e, t, i, n, r){var o = {loadFromBlob:function(e){function t(e){r.shimExec.call(n, "Image", "loadFromBlob", e.uid), n = r = null}var n = this, r = n.getRuntime(); if (e.isDetached()){var o = new i; o.bind("TransportingComplete", function(){t(o.result.getSource())}), o.transport(e.getSource(), e.type, {ruid:r.uid})} else t(e.getSource())}, loadFromImage:function(e){var t = this.getRuntime(); return t.shimExec.call(this, "Image", "loadFromImage", e.uid)}, getInfo:function(){var e = this.getRuntime(), t = e.shimExec.call(this, "Image", "getInfo"); return t.meta && t.meta.thumb && t.meta.thumb.data && !(e.meta.thumb.data instanceof n) && (t.meta.thumb.data = new n(e.uid, t.meta.thumb.data)), t}, getAsBlob:function(e, t){var i = this.getRuntime(), r = i.shimExec.call(this, "Image", "getAsBlob", e, t); return r?new n(i.uid, r):null}, getAsDataURL:function(){var e, t = this.getRuntime(), i = t.Image.getAsBlob.apply(this, arguments); return i?(e = new r, e.readAsDataURL(i)):null}}; return e.Image = o}), n("moxie/runtime/silverlight/Runtime", ["moxie/core/utils/Basic", "moxie/core/utils/Env", "moxie/core/utils/Dom", "moxie/core/Exceptions", "moxie/runtime/Runtime"], function(e, t, i, n, o){function a(e){var t, i, n, r, o, a = !1, s = null, u = 0; try{try{s = new ActiveXObject("AgControl.AgControl"), s.IsVersionSupported(e) && (a = !0), s = null} catch (c){var l = navigator.plugins["Silverlight Plug-In"]; if (l){for (t = l.description, "1.0.30226.2" === t && (t = "2.0.30226.2"), i = t.split("."); i.length > 3; )i.pop(); for (; i.length < 4; )i.push(0); for (n = e.split("."); n.length > 4; )n.pop(); do r = parseInt(n[u], 10), o = parseInt(i[u], 10), u++; while (u < n.length && r === o); o >= r && !isNaN(r) && (a = !0)}}} catch (d){a = !1}return a}function s(s){var l, d = this; s = e.extend({xap_url:t.xap_url}, s), o.call(this, s, u, {access_binary:o.capTrue, access_image_binary:o.capTrue, display_media:o.capTest(r("moxie/image/Image")), do_cors:o.capTrue, drag_and_drop:!1, report_upload_progress:o.capTrue, resize_image:o.capTrue, return_response_headers:function(e){return e && "client" === d.mode}, return_response_type:function(e){return"json" !== e?!0:!!window.JSON}, return_status_code:function(t){return"client" === d.mode || !e.arrayDiff(t, [200, 404])}, select_file:o.capTrue, select_multiple:o.capTrue, send_binary_string:o.capTrue, send_browser_cookies:function(e){return e && "browser" === d.mode}, send_custom_headers:function(e){return e && "client" === d.mode}, send_multipart:o.capTrue, slice_blob:o.capTrue, stream_upload:!0, summon_file_dialog:!1, upload_filesize:o.capTrue, use_http_method:function(t){return"client" === d.mode || !e.arrayDiff(t, ["GET", "POST"])}}, {return_response_headers:function(e){return e?"client":"browser"}, return_status_code:function(t){return e.arrayDiff(t, [200, 404])?"client":["client", "browser"]}, send_browser_cookies:function(e){return e?"browser":"client"}, send_custom_headers:function(e){return e?"client":"browser"}, use_http_method:function(t){return e.arrayDiff(t, ["GET", "POST"])?"client":["client", "browser"]}}), a("2.0.31005.0") && "Opera" !== t.browser || (this.mode = !1), e.extend(this, {getShim:function(){return i.get(this.uid).content.Moxie}, shimExec:function(e, t){var i = [].slice.call(arguments, 2); return d.getShim().exec(this.uid, e, t, i)}, init:function(){var e; e = this.getShimContainer(), e.innerHTML = '<object id="' + this.uid + '" data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%" style="outline:none;">' + '<param name="source" value="' + s.xap_url + '"/>' + '<param name="background" value="Transparent"/>' + '<param name="windowless" value="true"/>' + '<param name="enablehtmlaccess" value="true"/>' + '<param name="initParams" value="uid=' + this.uid + ",target=" + t.global_event_dispatcher + '"/>' + "</object>", l = setTimeout(function(){d && !d.initialized && d.trigger("Error", new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))}, "Windows" !== t.OS?1e4:5e3)}, destroy:function(e){return function(){e.call(d), clearTimeout(l), s = l = e = d = null}}(this.destroy)}, c)}var u = "silverlight", c = {}; return o.addConstructor(u, s), c}), n("moxie/runtime/silverlight/file/Blob", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Basic", "moxie/runtime/flash/file/Blob"], function(e, t, i){return e.Blob = t.extend({}, i)}), n("moxie/runtime/silverlight/file/FileInput", ["moxie/runtime/silverlight/Runtime", "moxie/file/File", "moxie/core/utils/Basic"], function(e, t, i){function n(e){for (var t = "", i = 0; i < e.length; i++)t += ("" !== t?"|":"") + e[i].title + " | *." + e[i].extensions.replace(/,/g, ";*."); return t}var r = {init:function(e){var r = this, o = this.getRuntime(); this.bind("Change", function(){var e = o.shimExec.call(r, "FileInput", "getFiles"); r.files = [], i.each(e, function(e){r.files.push(new t(o.uid, e))})}, 999), o.shimExec.call(this, "FileInput", "init", n(e.accept), e.multiple), this.trigger("ready")}, setOption:function(e, t){"accept" == e && (t = n(t)), this.getRuntime().shimExec.call(this, "FileInput", "setOption", e, t)}}; return e.FileInput = r}), n("moxie/runtime/silverlight/file/FileDrop", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Dom", "moxie/core/utils/Events"], function(e, t, i){var n = {init:function(){var e, n = this, r = n.getRuntime(); return e = r.getShimContainer(), i.addEvent(e, "dragover", function(e){e.preventDefault(), e.stopPropagation(), e.dataTransfer.dropEffect = "copy"}, n.uid), i.addEvent(e, "dragenter", function(e){e.preventDefault(); var i = t.get(r.uid).dragEnter(e); i && e.stopPropagation()}, n.uid), i.addEvent(e, "drop", function(e){e.preventDefault(); var i = t.get(r.uid).dragDrop(e); i && e.stopPropagation()}, n.uid), r.shimExec.call(this, "FileDrop", "init")}}; return e.FileDrop = n}), n("moxie/runtime/silverlight/file/FileReader", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Basic", "moxie/runtime/flash/file/FileReader"], function(e, t, i){return e.FileReader = t.extend({}, i)
16
+ }), n("moxie/runtime/silverlight/file/FileReaderSync", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Basic", "moxie/runtime/flash/file/FileReaderSync"], function(e, t, i){return e.FileReaderSync = t.extend({}, i)}), n("moxie/runtime/silverlight/runtime/Transporter", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Basic", "moxie/runtime/flash/runtime/Transporter"], function(e, t, i){return e.Transporter = t.extend({}, i)}), n("moxie/runtime/silverlight/xhr/XMLHttpRequest", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Basic", "moxie/runtime/flash/xhr/XMLHttpRequest", "moxie/runtime/silverlight/file/FileReaderSync", "moxie/runtime/silverlight/runtime/Transporter"], function(e, t, i){return e.XMLHttpRequest = t.extend({}, i)}), n("moxie/runtime/silverlight/image/Image", ["moxie/runtime/silverlight/Runtime", "moxie/core/utils/Basic", "moxie/file/Blob", "moxie/runtime/flash/image/Image"], function(e, t, i, n){return e.Image = t.extend({}, n, {getInfo:function(){var e = this.getRuntime(), n = ["tiff", "exif", "gps", "thumb"], r = {meta:{}}, o = e.shimExec.call(this, "Image", "getInfo"); return o.meta && (t.each(n, function(e){var t, i, n, a, s = o.meta[e]; if (s && s.keys)for (r.meta[e] = {}, i = 0, n = s.keys.length; n > i; i++)t = s.keys[i], a = s[t], a && (/^(\d|[1-9]\d+)$/.test(a)?a = parseInt(a, 10):/^\d*\.\d+$/.test(a) && (a = parseFloat(a)), r.meta[e][t] = a)}), r.meta && r.meta.thumb && r.meta.thumb.data && !(e.meta.thumb.data instanceof i) && (r.meta.thumb.data = new i(e.uid, r.meta.thumb.data))), r.width = parseInt(o.width, 10), r.height = parseInt(o.height, 10), r.size = parseInt(o.size, 10), r.type = o.type, r.name = o.name, r}, resize:function(e, t, i){this.getRuntime().shimExec.call(this, "Image", "resize", e.x, e.y, e.width, e.height, t, i.preserveHeaders, i.resample)}})}), n("moxie/runtime/html4/Runtime", ["moxie/core/utils/Basic", "moxie/core/Exceptions", "moxie/runtime/Runtime", "moxie/core/utils/Env"], function(e, t, i, n){function o(t){var o = this, u = i.capTest, c = i.capTrue; i.call(this, t, a, {access_binary:u(window.FileReader || window.File && File.getAsDataURL), access_image_binary:!1, display_media:u((n.can("create_canvas") || n.can("use_data_uri_over32kb")) && r("moxie/image/Image")), do_cors:!1, drag_and_drop:!1, filter_by_extension:u(function(){return!("Chrome" === n.browser && n.verComp(n.version, 28, "<") || "IE" === n.browser && n.verComp(n.version, 10, "<") || "Safari" === n.browser && n.verComp(n.version, 7, "<") || "Firefox" === n.browser && n.verComp(n.version, 37, "<"))}()), resize_image:function(){return s.Image && o.can("access_binary") && n.can("create_canvas")}, report_upload_progress:!1, return_response_headers:!1, return_response_type:function(t){return"json" === t && window.JSON?!0:!!~e.inArray(t, ["text", "document", ""])}, return_status_code:function(t){return!e.arrayDiff(t, [200, 404])}, select_file:function(){return n.can("use_fileinput")}, select_multiple:!1, send_binary_string:!1, send_custom_headers:!1, send_multipart:!0, slice_blob:!1, stream_upload:function(){return o.can("select_file")}, summon_file_dialog:function(){return o.can("select_file") && ("Firefox" === n.browser && n.verComp(n.version, 4, ">=") || "Opera" === n.browser && n.verComp(n.version, 12, ">=") || "IE" === n.browser && n.verComp(n.version, 10, ">=") || !!~e.inArray(n.browser, ["Chrome", "Safari"]))}, upload_filesize:c, use_http_method:function(t){return!e.arrayDiff(t, ["GET", "POST"])}}), e.extend(this, {init:function(){this.trigger("Init")}, destroy:function(e){return function(){e.call(o), e = o = null}}(this.destroy)}), e.extend(this.getShim(), s)}var a = "html4", s = {}; return i.addConstructor(a, o), s}), n("moxie/runtime/html4/file/FileInput", ["moxie/runtime/html4/Runtime", "moxie/file/File", "moxie/core/utils/Basic", "moxie/core/utils/Dom", "moxie/core/utils/Events", "moxie/core/utils/Mime", "moxie/core/utils/Env"], function(e, t, i, n, r, o, a){function s(){function e(){var o, c, d, m, h, f, p = this, g = p.getRuntime(); f = i.guid("uid_"), o = g.getShimContainer(), s && (d = n.get(s + "_form"), d && i.extend(d.style, {top:"100%"})), m = document.createElement("form"), m.setAttribute("id", f + "_form"), m.setAttribute("method", "post"), m.setAttribute("enctype", "multipart/form-data"), m.setAttribute("encoding", "multipart/form-data"), i.extend(m.style, {overflow:"hidden", position:"absolute", top:0, left:0, width:"100%", height:"100%"}), h = document.createElement("input"), h.setAttribute("id", f), h.setAttribute("type", "file"), h.setAttribute("accept", l.join(",")), i.extend(h.style, {fontSize:"999px", opacity:0}), m.appendChild(h), o.appendChild(m), i.extend(h.style, {position:"absolute", top:0, left:0, width:"100%", height:"100%"}), "IE" === a.browser && a.verComp(a.version, 10, "<") && i.extend(h.style, {filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}), h.onchange = function(){var i; if (this.value){if (this.files){if (i = this.files[0], 0 === i.size)return m.parentNode.removeChild(m), void 0} else i = {name:this.value}; i = new t(g.uid, i), this.onchange = function(){}, e.call(p), p.files = [i], h.setAttribute("id", i.uid), m.setAttribute("id", i.uid + "_form"), p.trigger("change"), h = m = null}}, g.can("summon_file_dialog") && (c = n.get(u.browse_button), r.removeEvent(c, "click", p.uid), r.addEvent(c, "click", function(e){h && !h.disabled && h.click(), e.preventDefault()}, p.uid)), s = f, o = d = c = null}var s, u, c, l = []; i.extend(this, {init:function(t){var i, a = this, s = a.getRuntime(); u = t, l = t.accept.mimes || o.extList2mimes(t.accept, s.can("filter_by_extension")), i = s.getShimContainer(), function(){var e, o, l; e = n.get(t.browse_button), c = n.getStyle(e, "z-index") || "auto", s.can("summon_file_dialog") && ("static" === n.getStyle(e, "position") && (e.style.position = "relative"), a.bind("Refresh", function(){o = parseInt(c, 10) || 1, n.get(u.browse_button).style.zIndex = o, this.getRuntime().getShimContainer().style.zIndex = o - 1})), l = s.can("summon_file_dialog")?e:i, r.addEvent(l, "mouseover", function(){a.trigger("mouseenter")}, a.uid), r.addEvent(l, "mouseout", function(){a.trigger("mouseleave")}, a.uid), r.addEvent(l, "mousedown", function(){a.trigger("mousedown")}, a.uid), r.addEvent(n.get(t.container), "mouseup", function(){a.trigger("mouseup")}, a.uid), e = null}(), e.call(this), i = null, a.trigger({type:"ready", async:!0})}, setOption:function(e, t){var i, r = this.getRuntime(); "accept" == e && (l = t.mimes || o.extList2mimes(t, r.can("filter_by_extension"))), i = n.get(s), i && i.setAttribute("accept", l.join(","))}, disable:function(e){var t; (t = n.get(s)) && (t.disabled = !!e)}, destroy:function(){var e = this.getRuntime(), t = e.getShim(), i = e.getShimContainer(), o = u && n.get(u.container), a = u && n.get(u.browse_button); o && r.removeAllEvents(o, this.uid), a && (r.removeAllEvents(a, this.uid), a.style.zIndex = c), i && (r.removeAllEvents(i, this.uid), i.innerHTML = ""), t.removeInstance(this.uid), s = l = u = i = o = a = t = null}})}return e.FileInput = s}), n("moxie/runtime/html4/file/FileReader", ["moxie/runtime/html4/Runtime", "moxie/runtime/html5/file/FileReader"], function(e, t){return e.FileReader = t}), n("moxie/runtime/html4/xhr/XMLHttpRequest", ["moxie/runtime/html4/Runtime", "moxie/core/utils/Basic", "moxie/core/utils/Dom", "moxie/core/utils/Url", "moxie/core/Exceptions", "moxie/core/utils/Events", "moxie/file/Blob", "moxie/xhr/FormData"], function(e, t, i, n, r, o, a, s){function u(){function e(e){var t, n, r, a, s = this, u = !1; if (l){if (t = l.id.replace(/_iframe$/, ""), n = i.get(t + "_form")){for (r = n.getElementsByTagName("input"), a = r.length; a--; )switch (r[a].getAttribute("type")){case"hidden":r[a].parentNode.removeChild(r[a]); break; case"file":u = !0}r = [], u || n.parentNode.removeChild(n), n = null}setTimeout(function(){o.removeEvent(l, "load", s.uid), l.parentNode && l.parentNode.removeChild(l); var t = s.getRuntime().getShimContainer(); t.children.length || t.parentNode.removeChild(t), t = l = null, e()}, 1)}}var u, c, l; t.extend(this, {send:function(d, m){function h(){var i = w.getShimContainer() || document.body, r = document.createElement("div"); r.innerHTML = '<iframe id="' + f + '_iframe" name="' + f + '_iframe" src="javascript:&quot;&quot;" style="display:none"></iframe>', l = r.firstChild, i.appendChild(l), o.addEvent(l, "load", function(){var i; try{i = l.contentWindow.document || l.contentDocument || window.frames[l.id].document, /^4(0[0-9]|1[0-7]|2[2346])\s/.test(i.title)?u = i.title.replace(/^(\d+).*$/, "$1"):(u = 200, c = t.trim(i.body.innerHTML), v.trigger({type:"progress", loaded:c.length, total:c.length}), x && v.trigger({type:"uploadprogress", loaded:x.size || 1025, total:x.size || 1025}))} catch (r){if (!n.hasSameOrigin(d.url))return e.call(v, function(){v.trigger("error")}), void 0; u = 404}e.call(v, function(){v.trigger("load")})}, v.uid)}var f, p, g, x, v = this, w = v.getRuntime(); if (u = c = null, m instanceof s && m.hasBlob()){if (x = m.getBlob(), f = x.uid, g = i.get(f), p = i.get(f + "_form"), !p)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)} else f = t.guid("uid_"), p = document.createElement("form"), p.setAttribute("id", f + "_form"), p.setAttribute("method", d.method), p.setAttribute("enctype", "multipart/form-data"), p.setAttribute("encoding", "multipart/form-data"), w.getShimContainer().appendChild(p); p.setAttribute("target", f + "_iframe"), m instanceof s && m.each(function(e, i){if (e instanceof a)g && g.setAttribute("name", i); else{var n = document.createElement("input"); t.extend(n, {type:"hidden", name:i, value:e}), g?p.insertBefore(n, g):p.appendChild(n)}}), p.setAttribute("action", d.url), h(), p.submit(), v.trigger("loadstart")}, getStatus:function(){return u}, getResponse:function(e){if ("json" === e && "string" === t.typeOf(c) && window.JSON)try{return JSON.parse(c.replace(/^\s*<pre[^>]*>/, "").replace(/<\/pre>\s*$/, ""))} catch (i){return null}return c}, abort:function(){var t = this; l && l.contentWindow && (l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src = "about:blank"), e.call(this, function(){t.dispatchEvent("abort")})}})}return e.XMLHttpRequest = u}), n("moxie/runtime/html4/image/Image", ["moxie/runtime/html4/Runtime", "moxie/runtime/html5/image/Image"], function(e, t){return e.Image = t}), a(["moxie/core/utils/Basic", "moxie/core/utils/Encode", "moxie/core/utils/Env", "moxie/core/Exceptions", "moxie/core/utils/Dom", "moxie/core/EventTarget", "moxie/runtime/Runtime", "moxie/runtime/RuntimeClient", "moxie/file/Blob", "moxie/core/I18n", "moxie/core/utils/Mime", "moxie/file/FileInput", "moxie/file/File", "moxie/file/FileDrop", "moxie/file/FileReader", "moxie/core/utils/Url", "moxie/runtime/RuntimeTarget", "moxie/xhr/FormData", "moxie/xhr/XMLHttpRequest", "moxie/runtime/Transporter", "moxie/image/Image", "moxie/core/utils/Events", "moxie/runtime/html5/image/ResizerCanvas"])}(this)});
17
+ /**
18
+ * Plupload - multi-runtime File Uploader
19
+ * v2.3.1
20
+ *
21
+ * Copyright 2013, Moxiecode Systems AB
22
+ * Released under GPL License.
23
+ *
24
+ * License: http://www.plupload.com/license
25
+ * Contributing: http://www.plupload.com/contributing
26
+ *
27
+ * Date: 2017-02-06
28
+ */
29
+ !function(e, t){var i = function(){var e = {}; return t.apply(e, arguments), e.plupload}; "function" == typeof define && define.amd?define("plupload", ["./moxie"], i):"object" == typeof module && module.exports?module.exports = i(require("./moxie")):e.plupload = i(e.moxie)}(this || window, function(e){!function(e, t, i){function n(e){function t(e, t, i){var r = {chunks:"slice_blob", jpgresize:"send_binary_string", pngresize:"send_binary_string", progress:"report_upload_progress", multi_selection:"select_multiple", dragdrop:"drag_and_drop", drop_element:"drag_and_drop", headers:"send_custom_headers", urlstream_upload:"send_binary_string", canSendBinary:"send_binary", triggerDialog:"summon_file_dialog"}; r[e]?n[r[e]] = t:i || (n[e] = t)}var i = e.required_features, n = {}; return"string" == typeof i?l.each(i.split(/\s*,\s*/), function(e){t(e, !0)}):"object" == typeof i?l.each(i, function(e, i){t(i, e)}):i === !0 && (e.chunk_size && e.chunk_size > 0 && (n.slice_blob = !0), l.isEmptyObj(e.resize) && e.multipart !== !1 || (n.send_binary_string = !0), e.http_method && (n.use_http_method = e.http_method), l.each(e, function(e, i){t(i, !!e, !0)})), n}var r = window.setTimeout, s = {}, a = t.core.utils, o = t.runtime.Runtime, l = {VERSION:"2.3.1", STOPPED:1, STARTED:2, QUEUED:1, UPLOADING:2, FAILED:4, DONE:5, GENERIC_ERROR: - 100, HTTP_ERROR: - 200, IO_ERROR: - 300, SECURITY_ERROR: - 400, INIT_ERROR: - 500, FILE_SIZE_ERROR: - 600, FILE_EXTENSION_ERROR: - 601, FILE_DUPLICATE_ERROR: - 602, IMAGE_FORMAT_ERROR: - 700, MEMORY_ERROR: - 701, IMAGE_DIMENSIONS_ERROR: - 702, mimeTypes:a.Mime.mimes, ua:a.Env, typeOf:a.Basic.typeOf, extend:a.Basic.extend, guid:a.Basic.guid, getAll:function(e){var t, i = []; "array" !== l.typeOf(e) && (e = [e]); for (var n = e.length; n--; )t = l.get(e[n]), t && i.push(t); return i.length?i:null}, get:a.Dom.get, each:a.Basic.each, getPos:a.Dom.getPos, getSize:a.Dom.getSize, xmlEncode:function(e){var t = {"<":"lt", ">":"gt", "&":"amp", '"':"quot", "'":"#39"}, i = /[<>&\"\']/g; return e?("" + e).replace(i, function(e){return t[e]?"&" + t[e] + ";":e}):e}, toArray:a.Basic.toArray, inArray:a.Basic.inArray, inSeries:a.Basic.inSeries, addI18n:t.core.I18n.addI18n, translate:t.core.I18n.translate, sprintf:a.Basic.sprintf, isEmptyObj:a.Basic.isEmptyObj, hasClass:a.Dom.hasClass, addClass:a.Dom.addClass, removeClass:a.Dom.removeClass, getStyle:a.Dom.getStyle, addEvent:a.Events.addEvent, removeEvent:a.Events.removeEvent, removeAllEvents:a.Events.removeAllEvents, cleanName:function(e){var t, i; for (i = [/[\300-\306]/g, "A", /[\340-\346]/g, "a", /\307/g, "C", /\347/g, "c", /[\310-\313]/g, "E", /[\350-\353]/g, "e", /[\314-\317]/g, "I", /[\354-\357]/g, "i", /\321/g, "N", /\361/g, "n", /[\322-\330]/g, "O", /[\362-\370]/g, "o", /[\331-\334]/g, "U", /[\371-\374]/g, "u"], t = 0; t < i.length; t += 2)e = e.replace(i[t], i[t + 1]); return e = e.replace(/\s+/g, "_"), e = e.replace(/[^a-z0-9_\-\.]+/gi, "")}, buildUrl:function(e, t){var i = ""; return l.each(t, function(e, t){i += (i?"&":"") + encodeURIComponent(t) + "=" + encodeURIComponent(e)}), i && (e += (e.indexOf("?") > 0?"&":"?") + i), e}, formatSize:function(e){function t(e, t){return Math.round(e * Math.pow(10, t)) / Math.pow(10, t)}if (e === i || /\D/.test(e))return l.translate("N/A"); var n = Math.pow(1024, 4); return e > n?t(e / n, 1) + " " + l.translate("tb"):e > (n /= 1024)?t(e / n, 1) + " " + l.translate("gb"):e > (n /= 1024)?t(e / n, 1) + " " + l.translate("mb"):e > 1024?Math.round(e / 1024) + " " + l.translate("kb"):e + " " + l.translate("b")}, parseSize:a.Basic.parseSizeStr, predictRuntime:function(e, t){var i, n; return i = new l.Uploader(e), n = o.thatCan(i.getOption().required_features, t || e.runtimes), i.destroy(), n}, addFileFilter:function(e, t){s[e] = t}}; l.addFileFilter("mime_types", function(e, t, i){e.length && !e.regexp.test(t.name)?(this.trigger("Error", {code:l.FILE_EXTENSION_ERROR, message:l.translate("File extension error."), file:t}), i(!1)):i(!0)}), l.addFileFilter("max_file_size", function(e, t, i){var n; e = l.parseSize(e), t.size !== n && e && t.size > e?(this.trigger("Error", {code:l.FILE_SIZE_ERROR, message:l.translate("File size error."), file:t}), i(!1)):i(!0)}), l.addFileFilter("prevent_duplicates", function(e, t, i){if (e)for (var n = this.files.length; n--; )if (t.name === this.files[n].name && t.size === this.files[n].size)return this.trigger("Error", {code:l.FILE_DUPLICATE_ERROR, message:l.translate("Duplicate file error."), file:t}), i(!1), void 0; i(!0)}), l.Uploader = function(e){function a(){var e, t, i = 0; if (this.state == l.STARTED){for (t = 0; t < x.length; t++)e || x[t].status != l.QUEUED?i++:(e = x[t], this.trigger("BeforeUpload", e) && (e.status = l.UPLOADING, this.trigger("UploadFile", e))); i == x.length && (this.state !== l.STOPPED && (this.state = l.STOPPED, this.trigger("StateChanged")), this.trigger("UploadComplete", x))}}function u(e){e.percent = e.size > 0?Math.ceil(100 * (e.loaded / e.size)):100, d()}function d(){var e, t, n, r = 0; for (w.reset(), e = 0; e < x.length; e++)t = x[e], t.size !== i?(w.size += t.origSize, n = t.loaded * t.origSize / t.size, (!t.completeTimestamp || t.completeTimestamp > I) && (r += n), w.loaded += n):w.size = i, t.status == l.DONE?w.uploaded++:t.status == l.FAILED?w.failed++:w.queued++; w.size === i?w.percent = x.length > 0?Math.ceil(100 * (w.uploaded / x.length)):0:(w.bytesPerSec = Math.ceil(r / (( + new Date - I || 1) / 1e3)), w.percent = w.size > 0?Math.ceil(100 * (w.loaded / w.size)):0)}function c(){var e = U[0] || F[0]; return e?e.getRuntime().uid:!1}function f(e, t){if (e.ruid){var i = o.getInfo(e.ruid); if (i)return i.can(t)}return!1}function p(){this.bind("FilesAdded FilesRemoved", function(e){e.trigger("QueueChanged"), e.refresh()}), this.bind("CancelUpload", y), this.bind("BeforeUpload", _), this.bind("UploadFile", E), this.bind("UploadProgress", v), this.bind("StateChanged", b), this.bind("QueueChanged", d), this.bind("Error", z), this.bind("FileUploaded", R), this.bind("Destroy", O)}function g(e, i){var n = this, r = 0, s = [], a = {runtime_order:e.runtimes, required_caps:e.required_features, preferred_caps:P, swf_url:e.flash_swf_url, xap_url:e.silverlight_xap_url}; l.each(e.runtimes.split(/\s*,\s*/), function(t){e[t] && (a[t] = e[t])}), e.browse_button && l.each(e.browse_button, function(i){s.push(function(s){var u = new t.file.FileInput(l.extend({}, a, {accept:e.filters.mime_types, name:e.file_data_name, multiple:e.multi_selection, container:e.container, browse_button:i})); u.onready = function(){var e = o.getInfo(this.ruid); l.extend(n.features, {chunks:e.can("slice_blob"), multipart:e.can("send_multipart"), multi_selection:e.can("select_multiple")}), r++, U.push(this), s()}, u.onchange = function(){n.addFile(this.files)}, u.bind("mouseenter mouseleave mousedown mouseup", function(t){A || (e.browse_button_hover && ("mouseenter" === t.type?l.addClass(i, e.browse_button_hover):"mouseleave" === t.type && l.removeClass(i, e.browse_button_hover)), e.browse_button_active && ("mousedown" === t.type?l.addClass(i, e.browse_button_active):"mouseup" === t.type && l.removeClass(i, e.browse_button_active)))}), u.bind("mousedown", function(){n.trigger("Browse")}), u.bind("error runtimeerror", function(){u = null, s()}), u.init()})}), e.drop_element && l.each(e.drop_element, function(e){s.push(function(i){var s = new t.file.FileDrop(l.extend({}, a, {drop_zone:e})); s.onready = function(){var e = o.getInfo(this.ruid); l.extend(n.features, {chunks:e.can("slice_blob"), multipart:e.can("send_multipart"), dragdrop:e.can("drag_and_drop")}), r++, F.push(this), i()}, s.ondrop = function(){n.addFile(this.files)}, s.bind("error runtimeerror", function(){s = null, i()}), s.init()})}), l.inSeries(s, function(){"function" == typeof i && i(r)})}function h(e, n, r){var s = new t.image.Image; try{s.onload = function(){return n.width > this.width && n.height > this.height && n.quality === i && n.preserve_headers && !n.crop?(this.destroy(), r(e)):(s.downsize(n.width, n.height, n.crop, n.preserve_headers), void 0)}, s.onresize = function(){r(this.getAsBlob(e.type, n.quality)), this.destroy()}, s.onerror = function(){r(e)}, s.load(e)} catch (a){r(e)}}function m(e, i, r){function s(e, i, n){var r = S[e]; switch (e){case"max_file_size":"max_file_size" === e && (S.max_file_size = S.filters.max_file_size = i); break; case"chunk_size":(i = l.parseSize(i)) && (S[e] = i, S.send_file_name = !0); break; case"multipart":S[e] = i, i || (S.send_file_name = !0); break; case"http_method":S[e] = "PUT" === i.toUpperCase()?"PUT":"POST"; break; case"unique_names":S[e] = i, i && (S.send_file_name = !0); break; case"filters":"array" === l.typeOf(i) && (i = {mime_types:i}), n?l.extend(S.filters, i):S.filters = i, i.mime_types && ("string" === l.typeOf(i.mime_types) && (i.mime_types = t.core.utils.Mime.mimes2extList(i.mime_types)), i.mime_types.regexp = function(e){var t = []; return l.each(e, function(e){l.each(e.extensions.split(/,/), function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\." + e.replace(new RegExp("[" + "/^$.*+?|()[]{}\\".replace(/./g, "\\$&") + "]", "g"), "\\$&"))})}), new RegExp("(" + t.join("|") + ")$", "i")}(i.mime_types), S.filters.mime_types = i.mime_types); break; case"resize":S.resize = i?l.extend({preserve_headers:!0, crop:!1}, i):!1; break; case"prevent_duplicates":S.prevent_duplicates = S.filters.prevent_duplicates = !!i; break; case"container":case"browse_button":case"drop_element":i = "container" === e?l.get(i):l.getAll(i); case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":S[e] = i, n || (u = !0); break; default:S[e] = i}n || a.trigger("OptionChanged", e, i, r)}var a = this, u = !1; "object" == typeof e?l.each(e, function(e, t){s(t, e, r)}):s(e, i, r), r?(S.required_features = n(l.extend({}, S)), P = n(l.extend({}, S, {required_features:!0}))):u && (a.trigger("Destroy"), g.call(a, S, function(e){e?(a.runtime = o.getInfo(c()).type, a.trigger("Init", {runtime:a.runtime}), a.trigger("PostInit")):a.trigger("Error", {code:l.INIT_ERROR, message:l.translate("Init error.")})}))}function _(e, t){if (e.settings.unique_names){var i = t.name.match(/\.([^.]+)$/), n = "part"; i && (n = i[1]), t.target_name = t.id + "." + n}}function E(e, i){function n(){c-- > 0?r(s, 1e3):(i.loaded = g, e.trigger("Error", {code:l.HTTP_ERROR, message:l.translate("HTTP Error."), file:i, response:T.responseText, status:T.status, responseHeaders:T.getAllResponseHeaders()}))}function s(){var t, n, r = {}; i.status === l.UPLOADING && e.state !== l.STOPPED && (e.settings.send_file_name && (r.name = i.target_name || i.name), d && p.chunks && o.size > d?(n = Math.min(d, o.size - g), t = o.slice(g, g + n)):(n = o.size, t = o), d && p.chunks && (e.settings.send_chunk_number?(r.chunk = Math.ceil(g / d), r.chunks = Math.ceil(o.size / d)):(r.offset = g, r.total = o.size)), e.trigger("BeforeChunkUpload", i, r, t, g) && a(r, t, n))}function a(a, d, f){var h; T = new t.xhr.XMLHttpRequest, T.upload && (T.upload.onprogress = function(t){i.loaded = Math.min(i.size, g + t.loaded), e.trigger("UploadProgress", i)}), T.onload = function(){return T.status >= 400?(n(), void 0):(c = e.settings.max_retries, f < o.size?(d.destroy(), g += f, i.loaded = Math.min(g, o.size), e.trigger("ChunkUploaded", i, {offset:i.loaded, total:o.size, response:T.responseText, status:T.status, responseHeaders:T.getAllResponseHeaders()}), "Android Browser" === l.ua.browser && e.trigger("UploadProgress", i)):i.loaded = i.size, d = h = null, !g || g >= o.size?(i.size != i.origSize && (o.destroy(), o = null), e.trigger("UploadProgress", i), i.status = l.DONE, i.completeTimestamp = + new Date, e.trigger("FileUploaded", i, {response:T.responseText, status:T.status, responseHeaders:T.getAllResponseHeaders()})):r(s, 1), void 0)}, T.onerror = function(){n()}, T.onloadend = function(){this.destroy(), T = null}, e.settings.multipart && p.multipart?(T.open(e.settings.http_method, u, !0), l.each(e.settings.headers, function(e, t){T.setRequestHeader(t, e)}), h = new t.xhr.FormData, l.each(l.extend(a, e.settings.multipart_params), function(e, t){h.append(t, e)}), h.append(e.settings.file_data_name, d), T.send(h, {runtime_order:e.settings.runtimes, required_caps:e.settings.required_features, preferred_caps:P, swf_url:e.settings.flash_swf_url, xap_url:e.settings.silverlight_xap_url})):(u = l.buildUrl(e.settings.url, l.extend(a, e.settings.multipart_params)), T.open(e.settings.http_method, u, !0), l.each(e.settings.headers, function(e, t){T.setRequestHeader(t, e)}), T.hasRequestHeader("Content-Type") || T.setRequestHeader("Content-Type", "application/octet-stream"), T.send(d, {runtime_order:e.settings.runtimes, required_caps:e.settings.required_features, preferred_caps:P, swf_url:e.settings.flash_swf_url, xap_url:e.settings.silverlight_xap_url}))}var o, u = e.settings.url, d = e.settings.chunk_size, c = e.settings.max_retries, p = e.features, g = 0; i.loaded && (g = i.loaded = d?d * Math.floor(i.loaded / d):0), o = i.getSource(), !l.isEmptyObj(e.settings.resize) && f(o, "send_binary_string") && - 1 !== l.inArray(o.type, ["image/jpeg", "image/png"])?h.call(this, o, e.settings.resize, function(e){o = e, i.size = e.size, s()}):s()}function v(e, t){u(t)}function b(e){if (e.state == l.STARTED)I = + new Date; else if (e.state == l.STOPPED)for (var t = e.files.length - 1; t >= 0; t--)e.files[t].status == l.UPLOADING && (e.files[t].status = l.QUEUED, d())}function y(){T && T.abort()}function R(e){d(), r(function(){a.call(e)}, 1)}function z(e, t){t.code === l.INIT_ERROR?e.destroy():t.code === l.HTTP_ERROR && (t.file.status = l.FAILED, t.file.completeTimestamp = + new Date, u(t.file), e.state == l.STARTED && (e.trigger("CancelUpload"), r(function(){a.call(e)}, 1)))}function O(e){e.stop(), l.each(x, function(e){e.destroy()}), x = [], U.length && (l.each(U, function(e){e.destroy()}), U = []), F.length && (l.each(F, function(e){e.destroy()}), F = []), P = {}, A = !1, I = T = null, w.reset()}var S, I, w, T, D = l.guid(), x = [], P = {}, U = [], F = [], A = !1; S = {chunk_size:0, file_data_name:"file", filters:{mime_types:[], prevent_duplicates:!1, max_file_size:0}, flash_swf_url:"js/Moxie.swf", http_method:"POST", max_retries:0, multipart:!0, multi_selection:!0, resize:!1, runtimes:o.order, send_file_name:!0, send_chunk_number:!0, silverlight_xap_url:"js/Moxie.xap"}, m.call(this, e, null, !0), w = new l.QueueProgress, l.extend(this, {id:D, uid:D, state:l.STOPPED, features:{}, runtime:null, files:x, settings:S, total:w, init:function(){var e, t, i = this; return e = i.getOption("preinit"), "function" == typeof e?e(i):l.each(e, function(e, t){i.bind(t, e)}), p.call(i), l.each(["container", "browse_button", "drop_element"], function(e){return null === i.getOption(e)?(t = {code:l.INIT_ERROR, message:l.sprintf(l.translate("%s specified, but cannot be found."), e)}, !1):void 0}), t?i.trigger("Error", t):S.browse_button || S.drop_element?(g.call(i, S, function(e){var t = i.getOption("init"); "function" == typeof t?t(i):l.each(t, function(e, t){i.bind(t, e)}), e?(i.runtime = o.getInfo(c()).type, i.trigger("Init", {runtime:i.runtime}), i.trigger("PostInit")):i.trigger("Error", {code:l.INIT_ERROR, message:l.translate("Init error.")})}), void 0):i.trigger("Error", {code:l.INIT_ERROR, message:l.translate("You must specify either browse_button or drop_element.")})}, setOption:function(e, t){m.call(this, e, t, !this.runtime)}, getOption:function(e){return e?S[e]:S}, refresh:function(){U.length && l.each(U, function(e){e.trigger("Refresh")}), this.trigger("Refresh")}, start:function(){this.state != l.STARTED && (this.state = l.STARTED, this.trigger("StateChanged"), a.call(this))}, stop:function(){this.state != l.STOPPED && (this.state = l.STOPPED, this.trigger("StateChanged"), this.trigger("CancelUpload"))}, disableBrowse:function(){A = arguments[0] !== i?arguments[0]:!0, U.length && l.each(U, function(e){e.disable(A)}), this.trigger("DisableBrowse", A)}, getFile:function(e){var t; for (t = x.length - 1; t >= 0; t--)if (x[t].id === e)return x[t]}, addFile:function(e, i){function n(e, t){var i = []; l.each(u.settings.filters, function(t, n){s[n] && i.push(function(i){s[n].call(u, t, e, function(e){i(!e)})})}), l.inSeries(i, t)}function a(e){var s = l.typeOf(e); if (e instanceof t.file.File){if (!e.ruid && !e.isDetached()){if (!o)return!1; e.ruid = o, e.connectRuntime(o)}a(new l.File(e))} else e instanceof t.file.Blob?(a(e.getSource()), e.destroy()):e instanceof l.File?(i && (e.name = i), d.push(function(t){n(e, function(i){i || (x.push(e), f.push(e), u.trigger("FileFiltered", e)), r(t, 1)})})): - 1 !== l.inArray(s, ["file", "blob"])?a(new t.file.File(null, e)):"node" === s && "filelist" === l.typeOf(e.files)?l.each(e.files, a):"array" === s && (i = null, l.each(e, a))}var o, u = this, d = [], f = []; o = c(), a(e), d.length && l.inSeries(d, function(){f.length && u.trigger("FilesAdded", f)})}, removeFile:function(e){for (var t = "string" == typeof e?e:e.id, i = x.length - 1; i >= 0; i--)if (x[i].id === t)return this.splice(i, 1)[0]}, splice:function(e, t){var n = x.splice(e === i?0:e, t === i?x.length:t), r = !1; return this.state == l.STARTED && (l.each(n, function(e){return e.status === l.UPLOADING?(r = !0, !1):void 0}), r && this.stop()), this.trigger("FilesRemoved", n), l.each(n, function(e){e.destroy()}), r && this.start(), n}, dispatchEvent:function(e){var t, i; if (e = e.toLowerCase(), t = this.hasEventListener(e)){t.sort(function(e, t){return t.priority - e.priority}), i = [].slice.call(arguments), i.shift(), i.unshift(this); for (var n = 0; n < t.length; n++)if (t[n].fn.apply(t[n].scope, i) === !1)return!1}return!0}, bind:function(e, t, i, n){l.Uploader.prototype.bind.call(this, e, t, n, i)}, destroy:function(){this.trigger("Destroy"), S = w = null, this.unbindAll()}})}, l.Uploader.prototype = t.core.EventTarget.instance, l.File = function(){function e(e){l.extend(this, {id:l.guid(), name:e.name || e.fileName, type:e.type || "", size:e.size || e.fileSize, origSize:e.size || e.fileSize, loaded:0, percent:0, status:l.QUEUED, lastModifiedDate:e.lastModifiedDate || (new Date).toLocaleString(), completeTimestamp:0, getNative:function(){var e = this.getSource().getSource(); return - 1 !== l.inArray(l.typeOf(e), ["blob", "file"])?e:null}, getSource:function(){return t[this.id]?t[this.id]:null}, destroy:function(){var e = this.getSource(); e && (e.destroy(), delete t[this.id])}}), t[this.id] = e}var t = {}; return e}(), l.QueueProgress = function(){var e = this; e.size = 0, e.loaded = 0, e.uploaded = 0, e.failed = 0, e.queued = 0, e.percent = 0, e.bytesPerSec = 0, e.reset = function(){e.size = e.loaded = e.uploaded = e.failed = e.queued = e.percent = e.bytesPerSec = 0}}, e.plupload = l}(this, e)});
assets/global/plugins/validation/jquery.validate.js CHANGED
@@ -6,1569 +6,1568 @@
6
  * Copyright (c) 2016 Jörn Zaefferer
7
  * Released under the MIT license
8
  */
9
- (function( factory ) {
10
- if ( typeof define === "function" && define.amd ) {
11
- define( ["jquery"], factory );
12
- } else if (typeof module === "object" && module.exports) {
13
- module.exports = factory( require( "jquery" ) );
14
- } else {
15
- factory( jQuery );
16
- }
17
- }(function( $ ) {
18
-
19
- $.extend( $.fn, {
20
-
21
- // http://jqueryvalidation.org/validate/
22
- validate: function( options ) {
23
-
24
- // If nothing is selected, return nothing; can't chain anyway
25
- if ( !this.length ) {
26
- if ( options && options.debug && window.console ) {
27
- console.warn( "Nothing selected, can't validate, returning nothing." );
28
- }
29
- return;
30
- }
31
-
32
- // Check if a validator for this form was already created
33
- var validator = $.data( this[ 0 ], "validator" );
34
- if ( validator ) {
35
- return validator;
36
- }
37
-
38
- // Add novalidate tag if HTML5.
39
- this.attr( "novalidate", "novalidate" );
40
-
41
- validator = new $.validator( options, this[ 0 ] );
42
- $.data( this[ 0 ], "validator", validator );
43
-
44
- if ( validator.settings.onsubmit ) {
45
-
46
- this.on( "click.validate", ":submit", function( event ) {
47
- if ( validator.settings.submitHandler ) {
48
- validator.submitButton = event.target;
49
- }
50
-
51
- // Allow suppressing validation by adding a cancel class to the submit button
52
- if ( $( this ).hasClass( "cancel" ) ) {
53
- validator.cancelSubmit = true;
54
- }
55
-
56
- // Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
57
- if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
58
- validator.cancelSubmit = true;
59
- }
60
- } );
61
-
62
- // Validate the form on submit
63
- this.on( "submit.validate", function( event ) {
64
- if ( validator.settings.debug ) {
65
-
66
- // Prevent form submit to be able to see console output
67
- event.preventDefault();
68
- }
69
- function handle() {
70
- var hidden, result;
71
- if ( validator.settings.submitHandler ) {
72
- if ( validator.submitButton ) {
73
-
74
- // Insert a hidden input as a replacement for the missing submit button
75
- hidden = $( "<input type='hidden'/>" )
76
- .attr( "name", validator.submitButton.name )
77
- .val( $( validator.submitButton ).val() )
78
- .appendTo( validator.currentForm );
79
- }
80
- result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
81
- if ( validator.submitButton ) {
82
-
83
- // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
84
- hidden.remove();
85
- }
86
- if ( result !== undefined ) {
87
- return result;
88
- }
89
- return false;
90
- }
91
- return true;
92
- }
93
-
94
- // Prevent submit for invalid forms or custom submit handlers
95
- if ( validator.cancelSubmit ) {
96
- validator.cancelSubmit = false;
97
- return handle();
98
- }
99
- if ( validator.form() ) {
100
- if ( validator.pendingRequest ) {
101
- validator.formSubmitted = true;
102
- return false;
103
- }
104
- return handle();
105
- } else {
106
- validator.focusInvalid();
107
- return false;
108
- }
109
- } );
110
- }
111
-
112
- return validator;
113
- },
114
-
115
- // http://jqueryvalidation.org/valid/
116
- valid: function() {
117
- var valid, validator, errorList;
118
-
119
- if ( $( this[ 0 ] ).is( "form" ) ) {
120
- valid = this.validate().form();
121
- } else {
122
- errorList = [];
123
- valid = true;
124
- validator = $( this[ 0 ].form ).validate();
125
- this.each( function() {
126
- valid = validator.element( this ) && valid;
127
- if ( !valid ) {
128
- errorList = errorList.concat( validator.errorList );
129
- }
130
- } );
131
- validator.errorList = errorList;
132
- }
133
- return valid;
134
- },
135
-
136
- // http://jqueryvalidation.org/rules/
137
- rules: function( command, argument ) {
138
- var element = this[ 0 ],
139
- settings, staticRules, existingRules, data, param, filtered;
140
-
141
- // If nothing is selected, return empty object; can't chain anyway
142
- if ( element == null || element.form == null ) {
143
- return;
144
- }
145
-
146
- if ( command ) {
147
- settings = $.data( element.form, "validator" ).settings;
148
- staticRules = settings.rules;
149
- existingRules = $.validator.staticRules( element );
150
- switch ( command ) {
151
- case "add":
152
- $.extend( existingRules, $.validator.normalizeRule( argument ) );
153
-
154
- // Remove messages from rules, but allow them to be set separately
155
- delete existingRules.messages;
156
- staticRules[ element.name ] = existingRules;
157
- if ( argument.messages ) {
158
- settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
159
- }
160
- break;
161
- case "remove":
162
- if ( !argument ) {
163
- delete staticRules[ element.name ];
164
- return existingRules;
165
- }
166
- filtered = {};
167
- $.each( argument.split( /\s/ ), function( index, method ) {
168
- filtered[ method ] = existingRules[ method ];
169
- delete existingRules[ method ];
170
- if ( method === "required" ) {
171
- $( element ).removeAttr( "aria-required" );
172
- }
173
- } );
174
- return filtered;
175
- }
176
- }
177
-
178
- data = $.validator.normalizeRules(
179
- $.extend(
180
- {},
181
- $.validator.classRules( element ),
182
- $.validator.attributeRules( element ),
183
- $.validator.dataRules( element ),
184
- $.validator.staticRules( element )
185
- ), element );
186
-
187
- // Make sure required is at front
188
- if ( data.required ) {
189
- param = data.required;
190
- delete data.required;
191
- data = $.extend( { required: param }, data );
192
- $( element ).attr( "aria-required", "true" );
193
- }
194
-
195
- // Make sure remote is at back
196
- if ( data.remote ) {
197
- param = data.remote;
198
- delete data.remote;
199
- data = $.extend( data, { remote: param } );
200
- }
201
-
202
- return data;
203
- }
204
- } );
205
-
206
- // Custom selectors
207
- $.extend( $.expr.pseudos || $.expr[ ":" ], { // '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
208
-
209
- // http://jqueryvalidation.org/blank-selector/
210
- blank: function( a ) {
211
- return !$.trim( "" + $( a ).val() );
212
- },
213
-
214
- // http://jqueryvalidation.org/filled-selector/
215
- filled: function( a ) {
216
- var val = $( a ).val();
217
- return val !== null && !!$.trim( "" + val );
218
- },
219
-
220
- // http://jqueryvalidation.org/unchecked-selector/
221
- unchecked: function( a ) {
222
- return !$( a ).prop( "checked" );
223
- }
224
- } );
225
-
226
- // Constructor for validator
227
- $.validator = function( options, form ) {
228
- this.settings = $.extend( true, {}, $.validator.defaults, options );
229
- this.currentForm = form;
230
- this.init();
231
- };
232
-
233
- // http://jqueryvalidation.org/jQuery.validator.format/
234
- $.validator.format = function( source, params ) {
235
- if ( arguments.length === 1 ) {
236
- return function() {
237
- var args = $.makeArray( arguments );
238
- args.unshift( source );
239
- return $.validator.format.apply( this, args );
240
- };
241
- }
242
- if ( params === undefined ) {
243
- return source;
244
- }
245
- if ( arguments.length > 2 && params.constructor !== Array ) {
246
- params = $.makeArray( arguments ).slice( 1 );
247
- }
248
- if ( params.constructor !== Array ) {
249
- params = [ params ];
250
- }
251
- $.each( params, function( i, n ) {
252
- source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
253
- return n;
254
- } );
255
- } );
256
- return source;
257
- };
258
-
259
- $.extend( $.validator, {
260
-
261
- defaults: {
262
- messages: {},
263
- groups: {},
264
- rules: {},
265
- errorClass: "error",
266
- pendingClass: "pending",
267
- validClass: "valid",
268
- errorElement: "label",
269
- focusCleanup: false,
270
- focusInvalid: true,
271
- errorContainer: $( [] ),
272
- errorLabelContainer: $( [] ),
273
- onsubmit: true,
274
- ignore: ":hidden",
275
- ignoreTitle: false,
276
- onfocusin: function( element ) {
277
- this.lastActive = element;
278
-
279
- // Hide error label and remove error class on focus if enabled
280
- if ( this.settings.focusCleanup ) {
281
- if ( this.settings.unhighlight ) {
282
- this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
283
- }
284
- this.hideThese( this.errorsFor( element ) );
285
- }
286
- },
287
- onfocusout: function( element ) {
288
- if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
289
- this.element( element );
290
- }
291
- },
292
- onkeyup: function( element, event ) {
293
-
294
- // Avoid revalidate the field when pressing one of the following keys
295
- // Shift => 16
296
- // Ctrl => 17
297
- // Alt => 18
298
- // Caps lock => 20
299
- // End => 35
300
- // Home => 36
301
- // Left arrow => 37
302
- // Up arrow => 38
303
- // Right arrow => 39
304
- // Down arrow => 40
305
- // Insert => 45
306
- // Num lock => 144
307
- // AltGr key => 225
308
- var excludedKeys = [
309
- 16, 17, 18, 20, 35, 36, 37,
310
- 38, 39, 40, 45, 144, 225
311
- ];
312
-
313
- if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
314
- return;
315
- } else if ( element.name in this.submitted || element.name in this.invalid ) {
316
- this.element( element );
317
- }
318
- },
319
- onclick: function( element ) {
320
-
321
- // Click on selects, radiobuttons and checkboxes
322
- if ( element.name in this.submitted ) {
323
- this.element( element );
324
-
325
- // Or option elements, check parent select in that case
326
- } else if ( element.parentNode.name in this.submitted ) {
327
- this.element( element.parentNode );
328
- }
329
- },
330
- highlight: function( element, errorClass, validClass ) {
331
- if ( element.type === "radio" ) {
332
- this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
333
- } else {
334
- $( element ).addClass( errorClass ).removeClass( validClass );
335
- }
336
- },
337
- unhighlight: function( element, errorClass, validClass ) {
338
- if ( element.type === "radio" ) {
339
- this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
340
- } else {
341
- $( element ).removeClass( errorClass ).addClass( validClass );
342
- }
343
- }
344
- },
345
-
346
- // http://jqueryvalidation.org/jQuery.validator.setDefaults/
347
- setDefaults: function( settings ) {
348
- $.extend( $.validator.defaults, settings );
349
- },
350
-
351
- messages: {
352
- required: "This field is required.",
353
- remote: "Please fix this field.",
354
- email: "Please enter a valid email address.",
355
- url: "Please enter a valid URL.",
356
- date: "Please enter a valid date.",
357
- dateISO: "Please enter a valid date (ISO).",
358
- number: "Please enter a valid number.",
359
- digits: "Please enter only digits.",
360
- equalTo: "Please enter the same value again.",
361
- maxlength: $.validator.format( "Please enter no more than {0} characters." ),
362
- minlength: $.validator.format( "Please enter at least {0} characters." ),
363
- rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
364
- range: $.validator.format( "Please enter a value between {0} and {1}." ),
365
- max: $.validator.format( "Please enter a value less than or equal to {0}." ),
366
- min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
367
- step: $.validator.format( "Please enter a multiple of {0}." )
368
- },
369
-
370
- autoCreateRanges: false,
371
-
372
- prototype: {
373
-
374
- init: function() {
375
- this.labelContainer = $( this.settings.errorLabelContainer );
376
- this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
377
- this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
378
- this.submitted = {};
379
- this.valueCache = {};
380
- this.pendingRequest = 0;
381
- this.pending = {};
382
- this.invalid = {};
383
- this.reset();
384
-
385
- var groups = ( this.groups = {} ),
386
- rules;
387
- $.each( this.settings.groups, function( key, value ) {
388
- if ( typeof value === "string" ) {
389
- value = value.split( /\s/ );
390
- }
391
- $.each( value, function( index, name ) {
392
- groups[ name ] = key;
393
- } );
394
- } );
395
- rules = this.settings.rules;
396
- $.each( rules, function( key, value ) {
397
- rules[ key ] = $.validator.normalizeRule( value );
398
- } );
399
-
400
- function delegate( event ) {
401
-
402
- // Set form expando on contenteditable
403
- if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
404
- this.form = $( this ).closest( "form" )[ 0 ];
405
- }
406
-
407
- var validator = $.data( this.form, "validator" ),
408
- eventType = "on" + event.type.replace( /^validate/, "" ),
409
- settings = validator.settings;
410
- if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
411
- settings[ eventType ].call( validator, this, event );
412
- }
413
- }
414
-
415
- $( this.currentForm )
416
- .on( "focusin.validate focusout.validate keyup.validate",
417
- ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
418
- "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
419
- "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
420
- "[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
421
-
422
- // Support: Chrome, oldIE
423
- // "select" is provided as event.target when clicking a option
424
- .on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
425
-
426
- if ( this.settings.invalidHandler ) {
427
- $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
428
- }
429
-
430
- // Add aria-required to any Static/Data/Class required fields before first validation
431
- // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
432
- $( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
433
- },
434
-
435
- // http://jqueryvalidation.org/Validator.form/
436
- form: function() {
437
- this.checkForm();
438
- $.extend( this.submitted, this.errorMap );
439
- this.invalid = $.extend( {}, this.errorMap );
440
- if ( !this.valid() ) {
441
- $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
442
- }
443
- this.showErrors();
444
- return this.valid();
445
- },
446
-
447
- checkForm: function() {
448
- this.prepareForm();
449
- for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
450
- this.check( elements[ i ] );
451
- }
452
- return this.valid();
453
- },
454
-
455
- // http://jqueryvalidation.org/Validator.element/
456
- element: function( element ) {
457
- var cleanElement = this.clean( element ),
458
- checkElement = this.validationTargetFor( cleanElement ),
459
- v = this,
460
- result = true,
461
- rs, group;
462
-
463
- if ( checkElement === undefined ) {
464
- delete this.invalid[ cleanElement.name ];
465
- } else {
466
- this.prepareElement( checkElement );
467
- this.currentElements = $( checkElement );
468
-
469
- // If this element is grouped, then validate all group elements already
470
- // containing a value
471
- group = this.groups[ checkElement.name ];
472
- if ( group ) {
473
- $.each( this.groups, function( name, testgroup ) {
474
- if ( testgroup === group && name !== checkElement.name ) {
475
- cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
476
- if ( cleanElement && cleanElement.name in v.invalid ) {
477
- v.currentElements.push( cleanElement );
478
- result = v.check( cleanElement ) && result;
479
- }
480
- }
481
- } );
482
- }
483
-
484
- rs = this.check( checkElement ) !== false;
485
- result = result && rs;
486
- if ( rs ) {
487
- this.invalid[ checkElement.name ] = false;
488
- } else {
489
- this.invalid[ checkElement.name ] = true;
490
- }
491
-
492
- if ( !this.numberOfInvalids() ) {
493
-
494
- // Hide error containers on last error
495
- this.toHide = this.toHide.add( this.containers );
496
- }
497
- this.showErrors();
498
-
499
- // Add aria-invalid status for screen readers
500
- $( element ).attr( "aria-invalid", !rs );
501
- }
502
-
503
- return result;
504
- },
505
-
506
- // http://jqueryvalidation.org/Validator.showErrors/
507
- showErrors: function( errors ) {
508
- if ( errors ) {
509
- var validator = this;
510
-
511
- // Add items to error list and map
512
- $.extend( this.errorMap, errors );
513
- this.errorList = $.map( this.errorMap, function( message, name ) {
514
- return {
515
- message: message,
516
- element: validator.findByName( name )[ 0 ]
517
- };
518
- } );
519
-
520
- // Remove items from success list
521
- this.successList = $.grep( this.successList, function( element ) {
522
- return !( element.name in errors );
523
- } );
524
- }
525
- if ( this.settings.showErrors ) {
526
- this.settings.showErrors.call( this, this.errorMap, this.errorList );
527
- } else {
528
- this.defaultShowErrors();
529
- }
530
- },
531
-
532
- // http://jqueryvalidation.org/Validator.resetForm/
533
- resetForm: function() {
534
- if ( $.fn.resetForm ) {
535
- $( this.currentForm ).resetForm();
536
- }
537
- this.invalid = {};
538
- this.submitted = {};
539
- this.prepareForm();
540
- this.hideErrors();
541
- var elements = this.elements()
542
- .removeData( "previousValue" )
543
- .removeAttr( "aria-invalid" );
544
-
545
- this.resetElements( elements );
546
- },
547
-
548
- resetElements: function( elements ) {
549
- var i;
550
-
551
- if ( this.settings.unhighlight ) {
552
- for ( i = 0; elements[ i ]; i++ ) {
553
- this.settings.unhighlight.call( this, elements[ i ],
554
- this.settings.errorClass, "" );
555
- this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
556
- }
557
- } else {
558
- elements
559
- .removeClass( this.settings.errorClass )
560
- .removeClass( this.settings.validClass );
561
- }
562
- },
563
-
564
- numberOfInvalids: function() {
565
- return this.objectLength( this.invalid );
566
- },
567
-
568
- objectLength: function( obj ) {
569
- /* jshint unused: false */
570
- var count = 0,
571
- i;
572
- for ( i in obj ) {
573
- if ( obj[ i ] ) {
574
- count++;
575
- }
576
- }
577
- return count;
578
- },
579
-
580
- hideErrors: function() {
581
- this.hideThese( this.toHide );
582
- },
583
-
584
- hideThese: function( errors ) {
585
- errors.not( this.containers ).text( "" );
586
- this.addWrapper( errors ).hide();
587
- },
588
-
589
- valid: function() {
590
- return this.size() === 0;
591
- },
592
-
593
- size: function() {
594
- return this.errorList.length;
595
- },
596
-
597
- focusInvalid: function() {
598
- if ( this.settings.focusInvalid ) {
599
- try {
600
- $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
601
- .filter( ":visible" )
602
- .focus()
603
-
604
- // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
605
- .trigger( "focusin" );
606
- } catch ( e ) {
607
-
608
- // Ignore IE throwing errors when focusing hidden elements
609
- }
610
- }
611
- },
612
-
613
- findLastActive: function() {
614
- var lastActive = this.lastActive;
615
- return lastActive && $.grep( this.errorList, function( n ) {
616
- return n.element.name === lastActive.name;
617
- } ).length === 1 && lastActive;
618
- },
619
-
620
- elements: function() {
621
- var validator = this,
622
- rulesCache = {};
623
-
624
- // Select all valid inputs inside the form (no submit or reset buttons)
625
- return $( this.currentForm )
626
- .find( "input, select, textarea, [contenteditable]" )
627
- .not( ":submit, :reset, :image, :disabled" )
628
- .not( this.settings.ignore )
629
- .filter( function() {
630
- var name = this.name || $( this ).attr( "name" ); // For contenteditable
631
- if ( !name && validator.settings.debug && window.console ) {
632
- console.error( "%o has no name assigned", this );
633
- }
634
-
635
- // Set form expando on contenteditable
636
- if ( this.hasAttribute( "contenteditable" ) ) {
637
- this.form = $( this ).closest( "form" )[ 0 ];
638
- }
639
-
640
- // Select only the first element for each name, and only those with rules specified
641
- if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
642
- return false;
643
- }
644
-
645
- rulesCache[ name ] = true;
646
- return true;
647
- } );
648
- },
649
-
650
- clean: function( selector ) {
651
- return $( selector )[ 0 ];
652
- },
653
-
654
- errors: function() {
655
- var errorClass = this.settings.errorClass.split( " " ).join( "." );
656
- return $( this.settings.errorElement + "." + errorClass, this.errorContext );
657
- },
658
-
659
- resetInternals: function() {
660
- this.successList = [];
661
- this.errorList = [];
662
- this.errorMap = {};
663
- this.toShow = $( [] );
664
- this.toHide = $( [] );
665
- },
666
-
667
- reset: function() {
668
- this.resetInternals();
669
- this.currentElements = $( [] );
670
- },
671
-
672
- prepareForm: function() {
673
- this.reset();
674
- this.toHide = this.errors().add( this.containers );
675
- },
676
-
677
- prepareElement: function( element ) {
678
- this.reset();
679
- this.toHide = this.errorsFor( element );
680
- },
681
-
682
- elementValue: function( element ) {
683
- var $element = $( element ),
684
- type = element.type,
685
- val, idx;
686
-
687
- if ( type === "radio" || type === "checkbox" ) {
688
- return this.findByName( element.name ).filter( ":checked" ).val();
689
- } else if ( type === "number" && typeof element.validity !== "undefined" ) {
690
- return element.validity.badInput ? "NaN" : $element.val();
691
- }
692
-
693
- if ( element.hasAttribute( "contenteditable" ) ) {
694
- val = $element.text();
695
- } else {
696
- val = $element.val();
697
- }
698
-
699
- if ( type === "file" ) {
700
-
701
- // Modern browser (chrome & safari)
702
- if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
703
- return val.substr( 12 );
704
- }
705
-
706
- // Legacy browsers
707
- // Unix-based path
708
- idx = val.lastIndexOf( "/" );
709
- if ( idx >= 0 ) {
710
- return val.substr( idx + 1 );
711
- }
712
-
713
- // Windows-based path
714
- idx = val.lastIndexOf( "\\" );
715
- if ( idx >= 0 ) {
716
- return val.substr( idx + 1 );
717
- }
718
-
719
- // Just the file name
720
- return val;
721
- }
722
-
723
- if ( typeof val === "string" ) {
724
- return val.replace( /\r/g, "" );
725
- }
726
- return val;
727
- },
728
-
729
- check: function( element ) {
730
- element = this.validationTargetFor( this.clean( element ) );
731
-
732
- var rules = $( element ).rules(),
733
- rulesCount = $.map( rules, function( n, i ) {
734
- return i;
735
- } ).length,
736
- dependencyMismatch = false,
737
- val = this.elementValue( element ),
738
- result, method, rule;
739
-
740
- // If a normalizer is defined for this element, then
741
- // call it to retreive the changed value instead
742
- // of using the real one.
743
- // Note that `this` in the normalizer is `element`.
744
- if ( typeof rules.normalizer === "function" ) {
745
- val = rules.normalizer.call( element, val );
746
-
747
- if ( typeof val !== "string" ) {
748
- throw new TypeError( "The normalizer should return a string value." );
749
- }
750
-
751
- // Delete the normalizer from rules to avoid treating
752
- // it as a pre-defined method.
753
- delete rules.normalizer;
754
- }
755
-
756
- for ( method in rules ) {
757
- rule = { method: method, parameters: rules[ method ] };
758
- try {
759
- result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
760
-
761
- // If a method indicates that the field is optional and therefore valid,
762
- // don't mark it as valid when there are no other rules
763
- if ( result === "dependency-mismatch" && rulesCount === 1 ) {
764
- dependencyMismatch = true;
765
- continue;
766
- }
767
- dependencyMismatch = false;
768
-
769
- if ( result === "pending" ) {
770
- this.toHide = this.toHide.not( this.errorsFor( element ) );
771
- return;
772
- }
773
-
774
- if ( !result ) {
775
- this.formatAndAdd( element, rule );
776
- return false;
777
- }
778
- } catch ( e ) {
779
- if ( this.settings.debug && window.console ) {
780
- console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
781
- }
782
- if ( e instanceof TypeError ) {
783
- e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
784
- }
785
-
786
- throw e;
787
- }
788
- }
789
- if ( dependencyMismatch ) {
790
- return;
791
- }
792
- if ( this.objectLength( rules ) ) {
793
- this.successList.push( element );
794
- }
795
- return true;
796
- },
797
-
798
- // Return the custom message for the given element and validation method
799
- // specified in the element's HTML5 data attribute
800
- // return the generic message if present and no method specific message is present
801
- customDataMessage: function( element, method ) {
802
- return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
803
- method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
804
- },
805
-
806
- // Return the custom message for the given element name and validation method
807
- customMessage: function( name, method ) {
808
- var m = this.settings.messages[ name ];
809
- return m && ( m.constructor === String ? m : m[ method ] );
810
- },
811
-
812
- // Return the first defined argument, allowing empty strings
813
- findDefined: function() {
814
- for ( var i = 0; i < arguments.length; i++ ) {
815
- if ( arguments[ i ] !== undefined ) {
816
- return arguments[ i ];
817
- }
818
- }
819
- return undefined;
820
- },
821
-
822
- // The second parameter 'rule' used to be a string, and extended to an object literal
823
- // of the following form:
824
- // rule = {
825
- // method: "method name",
826
- // parameters: "the given method parameters"
827
- // }
828
- //
829
- // The old behavior still supported, kept to maintain backward compatibility with
830
- // old code, and will be removed in the next major release.
831
- defaultMessage: function( element, rule ) {
832
- if ( typeof rule === "string" ) {
833
- rule = { method: rule };
834
- }
835
-
836
- var message = this.findDefined(
837
- this.customMessage( element.name, rule.method ),
838
- this.customDataMessage( element, rule.method ),
839
-
840
- // 'title' is never undefined, so handle empty string as undefined
841
- !this.settings.ignoreTitle && element.title || undefined,
842
- $.validator.messages[ rule.method ],
843
- "<strong>Warning: No message defined for " + element.name + "</strong>"
844
- ),
845
- theregex = /\$?\{(\d+)\}/g;
846
- if ( typeof message === "function" ) {
847
- message = message.call( this, rule.parameters, element );
848
- } else if ( theregex.test( message ) ) {
849
- message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
850
- }
851
-
852
- return message;
853
- },
854
-
855
- formatAndAdd: function( element, rule ) {
856
- var message = this.defaultMessage( element, rule );
857
-
858
- this.errorList.push( {
859
- message: message,
860
- element: element,
861
- method: rule.method
862
- } );
863
-
864
- this.errorMap[ element.name ] = message;
865
- this.submitted[ element.name ] = message;
866
- },
867
-
868
- addWrapper: function( toToggle ) {
869
- if ( this.settings.wrapper ) {
870
- toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
871
- }
872
- return toToggle;
873
- },
874
-
875
- defaultShowErrors: function() {
876
- var i, elements, error;
877
- for ( i = 0; this.errorList[ i ]; i++ ) {
878
- error = this.errorList[ i ];
879
- if ( this.settings.highlight ) {
880
- this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
881
- }
882
- this.showLabel( error.element, error.message );
883
- }
884
- if ( this.errorList.length ) {
885
- this.toShow = this.toShow.add( this.containers );
886
- }
887
- if ( this.settings.success ) {
888
- for ( i = 0; this.successList[ i ]; i++ ) {
889
- this.showLabel( this.successList[ i ] );
890
- }
891
- }
892
- if ( this.settings.unhighlight ) {
893
- for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
894
- this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
895
- }
896
- }
897
- this.toHide = this.toHide.not( this.toShow );
898
- this.hideErrors();
899
- this.addWrapper( this.toShow ).show();
900
- },
901
-
902
- validElements: function() {
903
- return this.currentElements.not( this.invalidElements() );
904
- },
905
-
906
- invalidElements: function() {
907
- return $( this.errorList ).map( function() {
908
- return this.element;
909
- } );
910
- },
911
-
912
- showLabel: function( element, message ) {
913
- var place, group, errorID, v,
914
- error = this.errorsFor( element ),
915
- elementID = this.idOrName( element ),
916
- describedBy = $( element ).attr( "aria-describedby" );
917
-
918
- if ( error.length ) {
919
-
920
- // Refresh error/success class
921
- error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
922
-
923
- // Replace message on existing label
924
- error.html( message );
925
- } else {
926
-
927
- // Create error element
928
- error = $( "<" + this.settings.errorElement + ">" )
929
- .attr( "id", elementID + "-error" )
930
- .addClass( this.settings.errorClass )
931
- .html( message || "" );
932
-
933
- // Maintain reference to the element to be placed into the DOM
934
- place = error;
935
- if ( this.settings.wrapper ) {
936
-
937
- // Make sure the element is visible, even in IE
938
- // actually showing the wrapped element is handled elsewhere
939
- place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
940
- }
941
- if ( this.labelContainer.length ) {
942
- this.labelContainer.append( place );
943
- } else if ( this.settings.errorPlacement ) {
944
- this.settings.errorPlacement.call( this, place, $( element ) );
945
- } else {
946
- place.insertAfter( element );
947
- }
948
-
949
- // Link error back to the element
950
- if ( error.is( "label" ) ) {
951
-
952
- // If the error is a label, then associate using 'for'
953
- error.attr( "for", elementID );
954
-
955
- // If the element is not a child of an associated label, then it's necessary
956
- // to explicitly apply aria-describedby
957
- } else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
958
- errorID = error.attr( "id" );
959
-
960
- // Respect existing non-error aria-describedby
961
- if ( !describedBy ) {
962
- describedBy = errorID;
963
- } else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
964
-
965
- // Add to end of list if not already present
966
- describedBy += " " + errorID;
967
- }
968
- $( element ).attr( "aria-describedby", describedBy );
969
-
970
- // If this element is grouped, then assign to all elements in the same group
971
- group = this.groups[ element.name ];
972
- if ( group ) {
973
- v = this;
974
- $.each( v.groups, function( name, testgroup ) {
975
- if ( testgroup === group ) {
976
- $( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
977
- .attr( "aria-describedby", error.attr( "id" ) );
978
- }
979
- } );
980
- }
981
- }
982
- }
983
- if ( !message && this.settings.success ) {
984
- error.text( "" );
985
- if ( typeof this.settings.success === "string" ) {
986
- error.addClass( this.settings.success );
987
- } else {
988
- this.settings.success( error, element );
989
- }
990
- }
991
- this.toShow = this.toShow.add( error );
992
- },
993
-
994
- errorsFor: function( element ) {
995
- var name = this.escapeCssMeta( this.idOrName( element ) ),
996
- describer = $( element ).attr( "aria-describedby" ),
997
- selector = "label[for='" + name + "'], label[for='" + name + "'] *";
998
-
999
- // 'aria-describedby' should directly reference the error element
1000
- if ( describer ) {
1001
- selector = selector + ", #" + this.escapeCssMeta( describer )
1002
- .replace( /\s+/g, ", #" );
1003
- }
1004
-
1005
- return this
1006
- .errors()
1007
- .filter( selector );
1008
- },
1009
-
1010
- // See https://api.jquery.com/category/selectors/, for CSS
1011
- // meta-characters that should be escaped in order to be used with JQuery
1012
- // as a literal part of a name/id or any selector.
1013
- escapeCssMeta: function( string ) {
1014
- return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
1015
- },
1016
-
1017
- idOrName: function( element ) {
1018
- return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
1019
- },
1020
-
1021
- validationTargetFor: function( element ) {
1022
-
1023
- // If radio/checkbox, validate first element in group instead
1024
- if ( this.checkable( element ) ) {
1025
- element = this.findByName( element.name );
1026
- }
1027
-
1028
- // Always apply ignore filter
1029
- return $( element ).not( this.settings.ignore )[ 0 ];
1030
- },
1031
-
1032
- checkable: function( element ) {
1033
- return ( /radio|checkbox/i ).test( element.type );
1034
- },
1035
-
1036
- findByName: function( name ) {
1037
- return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
1038
- },
1039
-
1040
- getLength: function( value, element ) {
1041
- switch ( element.nodeName.toLowerCase() ) {
1042
- case "select":
1043
- return $( "option:selected", element ).length;
1044
- case "input":
1045
- if ( this.checkable( element ) ) {
1046
- return this.findByName( element.name ).filter( ":checked" ).length;
1047
- }
1048
- }
1049
- return value.length;
1050
- },
1051
-
1052
- depend: function( param, element ) {
1053
- return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
1054
- },
1055
-
1056
- dependTypes: {
1057
- "boolean": function( param ) {
1058
- return param;
1059
- },
1060
- "string": function( param, element ) {
1061
- return !!$( param, element.form ).length;
1062
- },
1063
- "function": function( param, element ) {
1064
- return param( element );
1065
- }
1066
- },
1067
-
1068
- optional: function( element ) {
1069
- var val = this.elementValue( element );
1070
- return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
1071
- },
1072
-
1073
- startRequest: function( element ) {
1074
- if ( !this.pending[ element.name ] ) {
1075
- this.pendingRequest++;
1076
- $( element ).addClass( this.settings.pendingClass );
1077
- this.pending[ element.name ] = true;
1078
- }
1079
- },
1080
-
1081
- stopRequest: function( element, valid ) {
1082
- this.pendingRequest--;
1083
-
1084
- // Sometimes synchronization fails, make sure pendingRequest is never < 0
1085
- if ( this.pendingRequest < 0 ) {
1086
- this.pendingRequest = 0;
1087
- }
1088
- delete this.pending[ element.name ];
1089
- $( element ).removeClass( this.settings.pendingClass );
1090
- if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
1091
- $( this.currentForm ).submit();
1092
- this.formSubmitted = false;
1093
- } else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
1094
- $( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
1095
- this.formSubmitted = false;
1096
- }
1097
- },
1098
-
1099
- previousValue: function( element, method ) {
1100
- method = typeof method === "string" && method || "remote";
1101
-
1102
- return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
1103
- old: null,
1104
- valid: true,
1105
- message: this.defaultMessage( element, { method: method } )
1106
- } );
1107
- },
1108
-
1109
- // Cleans up all forms and elements, removes validator-specific events
1110
- destroy: function() {
1111
- this.resetForm();
1112
-
1113
- $( this.currentForm )
1114
- .off( ".validate" )
1115
- .removeData( "validator" )
1116
- .find( ".validate-equalTo-blur" )
1117
- .off( ".validate-equalTo" )
1118
- .removeClass( "validate-equalTo-blur" );
1119
- }
1120
-
1121
- },
1122
-
1123
- classRuleSettings: {
1124
- required: { required: true },
1125
- email: { email: true },
1126
- url: { url: true },
1127
- date: { date: true },
1128
- dateISO: { dateISO: true },
1129
- number: { number: true },
1130
- digits: { digits: true },
1131
- creditcard: { creditcard: true }
1132
- },
1133
-
1134
- addClassRules: function( className, rules ) {
1135
- if ( className.constructor === String ) {
1136
- this.classRuleSettings[ className ] = rules;
1137
- } else {
1138
- $.extend( this.classRuleSettings, className );
1139
- }
1140
- },
1141
-
1142
- classRules: function( element ) {
1143
- var rules = {},
1144
- classes = $( element ).attr( "class" );
1145
-
1146
- if ( classes ) {
1147
- $.each( classes.split( " " ), function() {
1148
- if ( this in $.validator.classRuleSettings ) {
1149
- $.extend( rules, $.validator.classRuleSettings[ this ] );
1150
- }
1151
- } );
1152
- }
1153
- return rules;
1154
- },
1155
-
1156
- normalizeAttributeRule: function( rules, type, method, value ) {
1157
-
1158
- // Convert the value to a number for number inputs, and for text for backwards compability
1159
- // allows type="date" and others to be compared as strings
1160
- if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
1161
- value = Number( value );
1162
-
1163
- // Support Opera Mini, which returns NaN for undefined minlength
1164
- if ( isNaN( value ) ) {
1165
- value = undefined;
1166
- }
1167
- }
1168
-
1169
- if ( value || value === 0 ) {
1170
- rules[ method ] = value;
1171
- } else if ( type === method && type !== "range" ) {
1172
-
1173
- // Exception: the jquery validate 'range' method
1174
- // does not test for the html5 'range' type
1175
- rules[ method ] = true;
1176
- }
1177
- },
1178
-
1179
- attributeRules: function( element ) {
1180
- var rules = {},
1181
- $element = $( element ),
1182
- type = element.getAttribute( "type" ),
1183
- method, value;
1184
-
1185
- for ( method in $.validator.methods ) {
1186
-
1187
- // Support for <input required> in both html5 and older browsers
1188
- if ( method === "required" ) {
1189
- value = element.getAttribute( method );
1190
-
1191
- // Some browsers return an empty string for the required attribute
1192
- // and non-HTML5 browsers might have required="" markup
1193
- if ( value === "" ) {
1194
- value = true;
1195
- }
1196
-
1197
- // Force non-HTML5 browsers to return bool
1198
- value = !!value;
1199
- } else {
1200
- value = $element.attr( method );
1201
- }
1202
-
1203
- this.normalizeAttributeRule( rules, type, method, value );
1204
- }
1205
-
1206
- // 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
1207
- if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
1208
- delete rules.maxlength;
1209
- }
1210
-
1211
- return rules;
1212
- },
1213
-
1214
- dataRules: function( element ) {
1215
- var rules = {},
1216
- $element = $( element ),
1217
- type = element.getAttribute( "type" ),
1218
- method, value;
1219
-
1220
- for ( method in $.validator.methods ) {
1221
- value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
1222
- this.normalizeAttributeRule( rules, type, method, value );
1223
- }
1224
- return rules;
1225
- },
1226
-
1227
- staticRules: function( element ) {
1228
- var rules = {},
1229
- validator = $.data( element.form, "validator" );
1230
-
1231
- if ( validator.settings.rules ) {
1232
- rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
1233
- }
1234
- return rules;
1235
- },
1236
-
1237
- normalizeRules: function( rules, element ) {
1238
-
1239
- // Handle dependency check
1240
- $.each( rules, function( prop, val ) {
1241
-
1242
- // Ignore rule when param is explicitly false, eg. required:false
1243
- if ( val === false ) {
1244
- delete rules[ prop ];
1245
- return;
1246
- }
1247
- if ( val.param || val.depends ) {
1248
- var keepRule = true;
1249
- switch ( typeof val.depends ) {
1250
- case "string":
1251
- keepRule = !!$( val.depends, element.form ).length;
1252
- break;
1253
- case "function":
1254
- keepRule = val.depends.call( element, element );
1255
- break;
1256
- }
1257
- if ( keepRule ) {
1258
- rules[ prop ] = val.param !== undefined ? val.param : true;
1259
- } else {
1260
- $.data( element.form, "validator" ).resetElements( $( element ) );
1261
- delete rules[ prop ];
1262
- }
1263
- }
1264
- } );
1265
-
1266
- // Evaluate parameters
1267
- $.each( rules, function( rule, parameter ) {
1268
- rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
1269
- } );
1270
-
1271
- // Clean number parameters
1272
- $.each( [ "minlength", "maxlength" ], function() {
1273
- if ( rules[ this ] ) {
1274
- rules[ this ] = Number( rules[ this ] );
1275
- }
1276
- } );
1277
- $.each( [ "rangelength", "range" ], function() {
1278
- var parts;
1279
- if ( rules[ this ] ) {
1280
- if ( $.isArray( rules[ this ] ) ) {
1281
- rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
1282
- } else if ( typeof rules[ this ] === "string" ) {
1283
- parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
1284
- rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
1285
- }
1286
- }
1287
- } );
1288
-
1289
- if ( $.validator.autoCreateRanges ) {
1290
-
1291
- // Auto-create ranges
1292
- if ( rules.min != null && rules.max != null ) {
1293
- rules.range = [ rules.min, rules.max ];
1294
- delete rules.min;
1295
- delete rules.max;
1296
- }
1297
- if ( rules.minlength != null && rules.maxlength != null ) {
1298
- rules.rangelength = [ rules.minlength, rules.maxlength ];
1299
- delete rules.minlength;
1300
- delete rules.maxlength;
1301
- }
1302
- }
1303
-
1304
- return rules;
1305
- },
1306
-
1307
- // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
1308
- normalizeRule: function( data ) {
1309
- if ( typeof data === "string" ) {
1310
- var transformed = {};
1311
- $.each( data.split( /\s/ ), function() {
1312
- transformed[ this ] = true;
1313
- } );
1314
- data = transformed;
1315
- }
1316
- return data;
1317
- },
1318
-
1319
- // http://jqueryvalidation.org/jQuery.validator.addMethod/
1320
- addMethod: function( name, method, message ) {
1321
- $.validator.methods[ name ] = method;
1322
- $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
1323
- if ( method.length < 3 ) {
1324
- $.validator.addClassRules( name, $.validator.normalizeRule( name ) );
1325
- }
1326
- },
1327
-
1328
- // http://jqueryvalidation.org/jQuery.validator.methods/
1329
- methods: {
1330
-
1331
- // http://jqueryvalidation.org/required-method/
1332
- required: function( value, element, param ) {
1333
-
1334
- // Check if dependency is met
1335
- if ( !this.depend( param, element ) ) {
1336
- return "dependency-mismatch";
1337
- }
1338
- if ( element.nodeName.toLowerCase() === "select" ) {
1339
-
1340
- // Could be an array for select-multiple or a string, both are fine this way
1341
- var val = $( element ).val();
1342
- return val && val.length > 0;
1343
- }
1344
- if ( this.checkable( element ) ) {
1345
- return this.getLength( value, element ) > 0;
1346
- }
1347
- return value.length > 0;
1348
- },
1349
-
1350
- // http://jqueryvalidation.org/email-method/
1351
- email: function( value, element ) {
1352
-
1353
- // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
1354
- // Retrieved 2014-01-14
1355
- // If you have a problem with this implementation, report a bug against the above spec
1356
- // Or use custom methods to implement your own email validation
1357
- return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
1358
- },
1359
-
1360
- // http://jqueryvalidation.org/url-method/
1361
- url: function( value, element ) {
1362
-
1363
- // Copyright (c) 2010-2013 Diego Perini, MIT licensed
1364
- // https://gist.github.com/dperini/729294
1365
- // see also https://mathiasbynens.be/demo/url-regex
1366
- // modified to allow protocol-relative URLs
1367
- return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
1368
- },
1369
-
1370
- // http://jqueryvalidation.org/date-method/
1371
- date: function( value, element ) {
1372
- return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
1373
- },
1374
-
1375
- // http://jqueryvalidation.org/dateISO-method/
1376
- dateISO: function( value, element ) {
1377
- return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
1378
- },
1379
-
1380
- // http://jqueryvalidation.org/number-method/
1381
- number: function( value, element ) {
1382
- return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
1383
- },
1384
-
1385
- // http://jqueryvalidation.org/digits-method/
1386
- digits: function( value, element ) {
1387
- return this.optional( element ) || /^\d+$/.test( value );
1388
- },
1389
-
1390
- // http://jqueryvalidation.org/minlength-method/
1391
- minlength: function( value, element, param ) {
1392
- var length = $.isArray( value ) ? value.length : this.getLength( value, element );
1393
- return this.optional( element ) || length >= param;
1394
- },
1395
-
1396
- // http://jqueryvalidation.org/maxlength-method/
1397
- maxlength: function( value, element, param ) {
1398
- var length = $.isArray( value ) ? value.length : this.getLength( value, element );
1399
- return this.optional( element ) || length <= param;
1400
- },
1401
-
1402
- // http://jqueryvalidation.org/rangelength-method/
1403
- rangelength: function( value, element, param ) {
1404
- var length = $.isArray( value ) ? value.length : this.getLength( value, element );
1405
- return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
1406
- },
1407
-
1408
- // http://jqueryvalidation.org/min-method/
1409
- min: function( value, element, param ) {
1410
- return this.optional( element ) || value >= param;
1411
- },
1412
-
1413
- // http://jqueryvalidation.org/max-method/
1414
- max: function( value, element, param ) {
1415
- return this.optional( element ) || value <= param;
1416
- },
1417
-
1418
- // http://jqueryvalidation.org/range-method/
1419
- range: function( value, element, param ) {
1420
- return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
1421
- },
1422
-
1423
- // http://jqueryvalidation.org/step-method/
1424
- step: function( value, element, param ) {
1425
- var type = $( element ).attr( "type" ),
1426
- errorMessage = "Step attribute on input type " + type + " is not supported.",
1427
- supportedTypes = [ "text", "number", "range" ],
1428
- re = new RegExp( "\\b" + type + "\\b" ),
1429
- notSupported = type && !re.test( supportedTypes.join() ),
1430
- decimalPlaces = function( num ) {
1431
- var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
1432
- if ( !match ) {
1433
- return 0;
1434
- }
1435
-
1436
- // Number of digits right of decimal point.
1437
- return match[ 1 ] ? match[ 1 ].length : 0;
1438
- },
1439
- toInt = function( num ) {
1440
- return Math.round( num * Math.pow( 10, decimals ) );
1441
- },
1442
- valid = true,
1443
- decimals;
1444
-
1445
- // Works only for text, number and range input types
1446
- // TODO find a way to support input types date, datetime, datetime-local, month, time and week
1447
- if ( notSupported ) {
1448
- throw new Error( errorMessage );
1449
- }
1450
-
1451
- decimals = decimalPlaces( param );
1452
-
1453
- // Value can't have too many decimals
1454
- if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
1455
- valid = false;
1456
- }
1457
-
1458
- return this.optional( element ) || valid;
1459
- },
1460
-
1461
- // http://jqueryvalidation.org/equalTo-method/
1462
- equalTo: function( value, element, param ) {
1463
-
1464
- // Bind to the blur event of the target in order to revalidate whenever the target field is updated
1465
- var target = $( param );
1466
- if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
1467
- target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
1468
- $( element ).valid();
1469
- } );
1470
- }
1471
- return value === target.val();
1472
- },
1473
-
1474
- // http://jqueryvalidation.org/remote-method/
1475
- remote: function( value, element, param, method ) {
1476
- if ( this.optional( element ) ) {
1477
- return "dependency-mismatch";
1478
- }
1479
-
1480
- method = typeof method === "string" && method || "remote";
1481
-
1482
- var previous = this.previousValue( element, method ),
1483
- validator, data, optionDataString;
1484
-
1485
- if ( !this.settings.messages[ element.name ] ) {
1486
- this.settings.messages[ element.name ] = {};
1487
- }
1488
- previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
1489
- this.settings.messages[ element.name ][ method ] = previous.message;
1490
-
1491
- param = typeof param === "string" && { url: param } || param;
1492
- optionDataString = $.param( $.extend( { data: value }, param.data ) );
1493
- if ( previous.old === optionDataString ) {
1494
- return previous.valid;
1495
- }
1496
-
1497
- previous.old = optionDataString;
1498
- validator = this;
1499
- this.startRequest( element );
1500
- data = {};
1501
- data[ element.name ] = value;
1502
- $.ajax( $.extend( true, {
1503
- mode: "abort",
1504
- port: "validate" + element.name,
1505
- dataType: "json",
1506
- data: data,
1507
- context: validator.currentForm,
1508
- success: function( response ) {
1509
- var valid = response === true || response === "true",
1510
- errors, message, submitted;
1511
-
1512
- validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
1513
- if ( valid ) {
1514
- submitted = validator.formSubmitted;
1515
- validator.resetInternals();
1516
- validator.toHide = validator.errorsFor( element );
1517
- validator.formSubmitted = submitted;
1518
- validator.successList.push( element );
1519
- validator.invalid[ element.name ] = false;
1520
- validator.showErrors();
1521
- } else {
1522
- errors = {};
1523
- message = response || validator.defaultMessage( element, { method: method, parameters: value } );
1524
- errors[ element.name ] = previous.message = message;
1525
- validator.invalid[ element.name ] = true;
1526
- validator.showErrors( errors );
1527
- }
1528
- previous.valid = valid;
1529
- validator.stopRequest( element, valid );
1530
- }
1531
- }, param ) );
1532
- return "pending";
1533
- }
1534
- }
1535
-
1536
- } );
1537
-
1538
- // Ajax mode: abort
1539
- // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
1540
- // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
1541
-
1542
- var pendingRequests = {},
1543
- ajax;
1544
-
1545
- // Use a prefilter if available (1.5+)
1546
- if ( $.ajaxPrefilter ) {
1547
- $.ajaxPrefilter( function( settings, _, xhr ) {
1548
- var port = settings.port;
1549
- if ( settings.mode === "abort" ) {
1550
- if ( pendingRequests[ port ] ) {
1551
- pendingRequests[ port ].abort();
1552
- }
1553
- pendingRequests[ port ] = xhr;
1554
- }
1555
- } );
1556
- } else {
1557
-
1558
- // Proxy ajax
1559
- ajax = $.ajax;
1560
- $.ajax = function( settings ) {
1561
- var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
1562
- port = ( "port" in settings ? settings : $.ajaxSettings ).port;
1563
- if ( mode === "abort" ) {
1564
- if ( pendingRequests[ port ] ) {
1565
- pendingRequests[ port ].abort();
1566
- }
1567
- pendingRequests[ port ] = ajax.apply( this, arguments );
1568
- return pendingRequests[ port ];
1569
- }
1570
- return ajax.apply( this, arguments );
1571
- };
1572
- }
1573
- return $;
1574
  }));
6
  * Copyright (c) 2016 Jörn Zaefferer
7
  * Released under the MIT license
8
  */
9
+ (function (factory) {
10
+ if (typeof define === "function" && define.amd) {
11
+ define(["jquery"], factory);
12
+ } else if (typeof module === "object" && module.exports) {
13
+ module.exports = factory(require("jquery"));
14
+ } else {
15
+ factory(jQuery);
16
+ }
17
+ }(function ($) {
18
+
19
+ $.extend($.fn, {
20
+
21
+ // http://jqueryvalidation.org/validate/
22
+ validate: function (options) {
23
+
24
+ // If nothing is selected, return nothing; can't chain anyway
25
+ if (!this.length) {
26
+ if (options && options.debug && window.console) {
27
+ console.warn("Nothing selected, can't validate, returning nothing.");
28
+ }
29
+ return;
30
+ }
31
+
32
+ // Check if a validator for this form was already created
33
+ var validator = $.data(this[ 0 ], "validator");
34
+ if (validator) {
35
+ return validator;
36
+ }
37
+
38
+ // Add novalidate tag if HTML5.
39
+ this.attr("novalidate", "novalidate");
40
+
41
+ validator = new $.validator(options, this[ 0 ]);
42
+ $.data(this[ 0 ], "validator", validator);
43
+
44
+ if (validator.settings.onsubmit) {
45
+
46
+ this.on("click.validate", ":submit", function (event) {
47
+ if (validator.settings.submitHandler) {
48
+ validator.submitButton = event.target;
49
+ }
50
+
51
+ // Allow suppressing validation by adding a cancel class to the submit button
52
+ if ($(this).hasClass("cancel")) {
53
+ validator.cancelSubmit = true;
54
+ }
55
+
56
+ // Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
57
+ if ($(this).attr("formnovalidate") !== undefined) {
58
+ validator.cancelSubmit = true;
59
+ }
60
+ });
61
+
62
+ // Validate the form on submit
63
+ this.on("submit.validate", function (event) {
64
+ if (validator.settings.debug) {
65
+
66
+ // Prevent form submit to be able to see console output
67
+ event.preventDefault();
68
+ }
69
+ function handle() {
70
+ var hidden, result;
71
+ if (validator.settings.submitHandler) {
72
+ if (validator.submitButton) {
73
+
74
+ // Insert a hidden input as a replacement for the missing submit button
75
+ hidden = $("<input type='hidden'/>")
76
+ .attr("name", validator.submitButton.name)
77
+ .val($(validator.submitButton).val())
78
+ .appendTo(validator.currentForm);
79
+ }
80
+ result = validator.settings.submitHandler.call(validator, validator.currentForm, event);
81
+ if (validator.submitButton) {
82
+
83
+ // And clean up afterwards; thanks to no-block-scope, hidden can be referenced
84
+ hidden.remove();
85
+ }
86
+ if (result !== undefined) {
87
+ return result;
88
+ }
89
+ return false;
90
+ }
91
+ return true;
92
+ }
93
+
94
+ // Prevent submit for invalid forms or custom submit handlers
95
+ if (validator.cancelSubmit) {
96
+ validator.cancelSubmit = false;
97
+ return handle();
98
+ }
99
+ if (validator.form()) {
100
+ if (validator.pendingRequest) {
101
+ validator.formSubmitted = true;
102
+ return false;
103
+ }
104
+ return handle();
105
+ } else {
106
+ validator.focusInvalid();
107
+ return false;
108
+ }
109
+ });
110
+ }
111
+
112
+ return validator;
113
+ },
114
+
115
+ // http://jqueryvalidation.org/valid/
116
+ valid: function () {
117
+ var valid, validator, errorList;
118
+
119
+ if ($(this[ 0 ]).is("form")) {
120
+ valid = this.validate().form();
121
+ } else {
122
+ errorList = [];
123
+ valid = true;
124
+ validator = $(this[ 0 ].form).validate();
125
+ this.each(function () {
126
+ valid = validator.element(this) && valid;
127
+ if (!valid) {
128
+ errorList = errorList.concat(validator.errorList);
129
+ }
130
+ });
131
+ validator.errorList = errorList;
132
+ }
133
+ return valid;
134
+ },
135
+
136
+ // http://jqueryvalidation.org/rules/
137
+ rules: function (command, argument) {
138
+ var element = this[ 0 ],
139
+ settings, staticRules, existingRules, data, param, filtered;
140
+
141
+ // If nothing is selected, return empty object; can't chain anyway
142
+ if (element == null || element.form == null) {
143
+ return;
144
+ }
145
+
146
+ if (command) {
147
+ settings = $.data(element.form, "validator").settings;
148
+ staticRules = settings.rules;
149
+ existingRules = $.validator.staticRules(element);
150
+ switch (command) {
151
+ case "add":
152
+ $.extend(existingRules, $.validator.normalizeRule(argument));
153
+
154
+ // Remove messages from rules, but allow them to be set separately
155
+ delete existingRules.messages;
156
+ staticRules[ element.name ] = existingRules;
157
+ if (argument.messages) {
158
+ settings.messages[ element.name ] = $.extend(settings.messages[ element.name ], argument.messages);
159
+ }
160
+ break;
161
+ case "remove":
162
+ if (!argument) {
163
+ delete staticRules[ element.name ];
164
+ return existingRules;
165
+ }
166
+ filtered = {};
167
+ $.each(argument.split(/\s/), function (index, method) {
168
+ filtered[ method ] = existingRules[ method ];
169
+ delete existingRules[ method ];
170
+ if (method === "required") {
171
+ $(element).removeAttr("aria-required");
172
+ }
173
+ });
174
+ return filtered;
175
+ }
176
+ }
177
+
178
+ data = $.validator.normalizeRules(
179
+ $.extend(
180
+ {},
181
+ $.validator.classRules(element),
182
+ $.validator.attributeRules(element),
183
+ $.validator.dataRules(element),
184
+ $.validator.staticRules(element)
185
+ ), element);
186
+
187
+ // Make sure required is at front
188
+ if (data.required) {
189
+ param = data.required;
190
+ delete data.required;
191
+ data = $.extend({required: param}, data);
192
+ $(element).attr("aria-required", "true");
193
+ }
194
+
195
+ // Make sure remote is at back
196
+ if (data.remote) {
197
+ param = data.remote;
198
+ delete data.remote;
199
+ data = $.extend(data, {remote: param});
200
+ }
201
+
202
+ return data;
203
+ }
204
+ });
205
+
206
+ // Custom selectors
207
+ $.extend($.expr.pseudos || $.expr[ ":" ], {// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
208
+
209
+ // http://jqueryvalidation.org/blank-selector/
210
+ blank: function (a) {
211
+ return !$.trim("" + $(a).val());
212
+ },
213
+
214
+ // http://jqueryvalidation.org/filled-selector/
215
+ filled: function (a) {
216
+ var val = $(a).val();
217
+ return val !== null && !!$.trim("" + val);
218
+ },
219
+
220
+ // http://jqueryvalidation.org/unchecked-selector/
221
+ unchecked: function (a) {
222
+ return !$(a).prop("checked");
223
+ }
224
+ });
225
+
226
+ // Constructor for validator
227
+ $.validator = function (options, form) {
228
+ this.settings = $.extend(true, {}, $.validator.defaults, options);
229
+ this.currentForm = form;
230
+ this.init();
231
+ };
232
+
233
+ // http://jqueryvalidation.org/jQuery.validator.format/
234
+ $.validator.format = function (source, params) {
235
+ if (arguments.length === 1) {
236
+ return function () {
237
+ var args = $.makeArray(arguments);
238
+ args.unshift(source);
239
+ return $.validator.format.apply(this, args);
240
+ };
241
+ }
242
+ if (params === undefined) {
243
+ return source;
244
+ }
245
+ if (arguments.length > 2 && params.constructor !== Array) {
246
+ params = $.makeArray(arguments).slice(1);
247
+ }
248
+ if (params.constructor !== Array) {
249
+ params = [params];
250
+ }
251
+ $.each(params, function (i, n) {
252
+ source = source.replace(new RegExp("\\{" + i + "\\}", "g"), function () {
253
+ return n;
254
+ });
255
+ });
256
+ return source;
257
+ };
258
+
259
+ $.extend($.validator, {
260
+
261
+ defaults: {
262
+ messages: {},
263
+ groups: {},
264
+ rules: {},
265
+ errorClass: "error",
266
+ pendingClass: "pending",
267
+ validClass: "valid",
268
+ errorElement: "label",
269
+ focusCleanup: false,
270
+ focusInvalid: true,
271
+ errorContainer: $([]),
272
+ errorLabelContainer: $([]),
273
+ onsubmit: true,
274
+ ignore: ":hidden",
275
+ ignoreTitle: false,
276
+ onfocusin: function (element) {
277
+ this.lastActive = element;
278
+
279
+ // Hide error label and remove error class on focus if enabled
280
+ if (this.settings.focusCleanup) {
281
+ if (this.settings.unhighlight) {
282
+ this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);
283
+ }
284
+ this.hideThese(this.errorsFor(element));
285
+ }
286
+ },
287
+ onfocusout: function (element) {
288
+ if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {
289
+ this.element(element);
290
+ }
291
+ },
292
+ onkeyup: function (element, event) {
293
+
294
+ // Avoid revalidate the field when pressing one of the following keys
295
+ // Shift => 16
296
+ // Ctrl => 17
297
+ // Alt => 18
298
+ // Caps lock => 20
299
+ // End => 35
300
+ // Home => 36
301
+ // Left arrow => 37
302
+ // Up arrow => 38
303
+ // Right arrow => 39
304
+ // Down arrow => 40
305
+ // Insert => 45
306
+ // Num lock => 144
307
+ // AltGr key => 225
308
+ var excludedKeys = [
309
+ 16, 17, 18, 20, 35, 36, 37,
310
+ 38, 39, 40, 45, 144, 225
311
+ ];
312
+
313
+ if (event.which === 9 && this.elementValue(element) === "" || $.inArray(event.keyCode, excludedKeys) !== -1) {
314
+ return;
315
+ } else if (element.name in this.submitted || element.name in this.invalid) {
316
+ this.element(element);
317
+ }
318
+ },
319
+ onclick: function (element) {
320
+
321
+ // Click on selects, radiobuttons and checkboxes
322
+ if (element.name in this.submitted) {
323
+ this.element(element);
324
+
325
+ // Or option elements, check parent select in that case
326
+ } else if (element.parentNode.name in this.submitted) {
327
+ this.element(element.parentNode);
328
+ }
329
+ },
330
+ highlight: function (element, errorClass, validClass) {
331
+ if (element.type === "radio") {
332
+ this.findByName(element.name).addClass(errorClass).removeClass(validClass);
333
+ } else {
334
+ $(element).addClass(errorClass).removeClass(validClass);
335
+ }
336
+ },
337
+ unhighlight: function (element, errorClass, validClass) {
338
+ if (element.type === "radio") {
339
+ this.findByName(element.name).removeClass(errorClass).addClass(validClass);
340
+ } else {
341
+ $(element).removeClass(errorClass).addClass(validClass);
342
+ }
343
+ }
344
+ },
345
+
346
+ // http://jqueryvalidation.org/jQuery.validator.setDefaults/
347
+ setDefaults: function (settings) {
348
+ $.extend($.validator.defaults, settings);
349
+ },
350
+
351
+ messages: {
352
+ required: "This field is required.",
353
+ remote: "Please fix this field.",
354
+ email: "Please enter a valid email address.",
355
+ url: "Please enter a valid URL.",
356
+ date: "Please enter a valid date.",
357
+ dateISO: "Please enter a valid date (ISO).",
358
+ number: "Please enter a valid number.",
359
+ digits: "Please enter only digits.",
360
+ equalTo: "Please enter the same value again.",
361
+ maxlength: $.validator.format("Please enter no more than {0} characters."),
362
+ minlength: $.validator.format("Please enter at least {0} characters."),
363
+ rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
364
+ range: $.validator.format("Please enter a value between {0} and {1}."),
365
+ max: $.validator.format("Please enter a value less than or equal to {0}."),
366
+ min: $.validator.format("Please enter a value greater than or equal to {0}."),
367
+ step: $.validator.format("Please enter a multiple of {0}.")
368
+ },
369
+
370
+ autoCreateRanges: false,
371
+
372
+ prototype: {
373
+
374
+ init: function () {
375
+ this.labelContainer = $(this.settings.errorLabelContainer);
376
+ this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
377
+ this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer);
378
+ this.submitted = {};
379
+ this.valueCache = {};
380
+ this.pendingRequest = 0;
381
+ this.pending = {};
382
+ this.invalid = {};
383
+ this.reset();
384
+
385
+ var groups = (this.groups = {}),
386
+ rules;
387
+ $.each(this.settings.groups, function (key, value) {
388
+ if (typeof value === "string") {
389
+ value = value.split(/\s/);
390
+ }
391
+ $.each(value, function (index, name) {
392
+ groups[ name ] = key;
393
+ });
394
+ });
395
+ rules = this.settings.rules;
396
+ $.each(rules, function (key, value) {
397
+ rules[ key ] = $.validator.normalizeRule(value);
398
+ });
399
+
400
+ function delegate(event) {
401
+
402
+ // Set form expando on contenteditable
403
+ if (!this.form && this.hasAttribute("contenteditable")) {
404
+ this.form = $(this).closest("form")[ 0 ];
405
+ }
406
+
407
+ var validator = $.data(this.form, "validator"),
408
+ eventType = "on" + event.type.replace(/^validate/, ""),
409
+ settings = validator.settings;
410
+ if (settings[ eventType ] && !$(this).is(settings.ignore)) {
411
+ settings[ eventType ].call(validator, this, event);
412
+ }
413
+ }
414
+
415
+ $(this.currentForm)
416
+ .on("focusin.validate focusout.validate keyup.validate",
417
+ ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
418
+ "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
419
+ "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
420
+ "[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate)
421
+
422
+ // Support: Chrome, oldIE
423
+ // "select" is provided as event.target when clicking a option
424
+ .on("click.validate", "select, option, [type='radio'], [type='checkbox']", delegate);
425
+
426
+ if (this.settings.invalidHandler) {
427
+ $(this.currentForm).on("invalid-form.validate", this.settings.invalidHandler);
428
+ }
429
+
430
+ // Add aria-required to any Static/Data/Class required fields before first validation
431
+ // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
432
+ $(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required", "true");
433
+ },
434
+
435
+ // http://jqueryvalidation.org/Validator.form/
436
+ form: function () {
437
+ this.checkForm();
438
+ $.extend(this.submitted, this.errorMap);
439
+ this.invalid = $.extend({}, this.errorMap);
440
+ if (!this.valid()) {
441
+ $(this.currentForm).triggerHandler("invalid-form", [this]);
442
+ }
443
+ this.showErrors();
444
+ return this.valid();
445
+ },
446
+
447
+ checkForm: function () {
448
+ this.prepareForm();
449
+ for (var i = 0, elements = (this.currentElements = this.elements()); elements[ i ]; i++) {
450
+ this.check(elements[ i ]);
451
+ }
452
+ return this.valid();
453
+ },
454
+
455
+ // http://jqueryvalidation.org/Validator.element/
456
+ element: function (element) {
457
+ var cleanElement = this.clean(element),
458
+ checkElement = this.validationTargetFor(cleanElement),
459
+ v = this,
460
+ result = true,
461
+ rs, group;
462
+
463
+ if (checkElement === undefined) {
464
+ delete this.invalid[ cleanElement.name ];
465
+ } else {
466
+ this.prepareElement(checkElement);
467
+ this.currentElements = $(checkElement);
468
+
469
+ // If this element is grouped, then validate all group elements already
470
+ // containing a value
471
+ group = this.groups[ checkElement.name ];
472
+ if (group) {
473
+ $.each(this.groups, function (name, testgroup) {
474
+ if (testgroup === group && name !== checkElement.name) {
475
+ cleanElement = v.validationTargetFor(v.clean(v.findByName(name)));
476
+ if (cleanElement && cleanElement.name in v.invalid) {
477
+ v.currentElements.push(cleanElement);
478
+ result = v.check(cleanElement) && result;
479
+ }
480
+ }
481
+ });
482
+ }
483
+
484
+ rs = this.check(checkElement) !== false;
485
+ result = result && rs;
486
+ if (rs) {
487
+ this.invalid[ checkElement.name ] = false;
488
+ } else {
489
+ this.invalid[ checkElement.name ] = true;
490
+ }
491
+
492
+ if (!this.numberOfInvalids()) {
493
+
494
+ // Hide error containers on last error
495
+ this.toHide = this.toHide.add(this.containers);
496
+ }
497
+ this.showErrors();
498
+
499
+ // Add aria-invalid status for screen readers
500
+ $(element).attr("aria-invalid", !rs);
501
+ }
502
+
503
+ return result;
504
+ },
505
+
506
+ // http://jqueryvalidation.org/Validator.showErrors/
507
+ showErrors: function (errors) {
508
+ if (errors) {
509
+ var validator = this;
510
+
511
+ // Add items to error list and map
512
+ $.extend(this.errorMap, errors);
513
+ this.errorList = $.map(this.errorMap, function (message, name) {
514
+ return {
515
+ message: message,
516
+ element: validator.findByName(name)[ 0 ]
517
+ };
518
+ });
519
+
520
+ // Remove items from success list
521
+ this.successList = $.grep(this.successList, function (element) {
522
+ return !(element.name in errors);
523
+ });
524
+ }
525
+ if (this.settings.showErrors) {
526
+ this.settings.showErrors.call(this, this.errorMap, this.errorList);
527
+ } else {
528
+ this.defaultShowErrors();
529
+ }
530
+ },
531
+
532
+ // http://jqueryvalidation.org/Validator.resetForm/
533
+ resetForm: function () {
534
+ if ($.fn.resetForm) {
535
+ $(this.currentForm).resetForm();
536
+ }
537
+ this.invalid = {};
538
+ this.submitted = {};
539
+ this.prepareForm();
540
+ this.hideErrors();
541
+ var elements = this.elements()
542
+ .removeData("previousValue")
543
+ .removeAttr("aria-invalid");
544
+
545
+ this.resetElements(elements);
546
+ },
547
+
548
+ resetElements: function (elements) {
549
+ var i;
550
+
551
+ if (this.settings.unhighlight) {
552
+ for (i = 0; elements[ i ]; i++) {
553
+ this.settings.unhighlight.call(this, elements[ i ],
554
+ this.settings.errorClass, "");
555
+ this.findByName(elements[ i ].name).removeClass(this.settings.validClass);
556
+ }
557
+ } else {
558
+ elements
559
+ .removeClass(this.settings.errorClass)
560
+ .removeClass(this.settings.validClass);
561
+ }
562
+ },
563
+
564
+ numberOfInvalids: function () {
565
+ return this.objectLength(this.invalid);
566
+ },
567
+
568
+ objectLength: function (obj) {
569
+ /* jshint unused: false */
570
+ var count = 0,
571
+ i;
572
+ for (i in obj) {
573
+ if (obj[ i ]) {
574
+ count++;
575
+ }
576
+ }
577
+ return count;
578
+ },
579
+
580
+ hideErrors: function () {
581
+ this.hideThese(this.toHide);
582
+ },
583
+
584
+ hideThese: function (errors) {
585
+ errors.not(this.containers).text("");
586
+ this.addWrapper(errors).hide();
587
+ },
588
+
589
+ valid: function () {
590
+ return this.size() === 0;
591
+ },
592
+
593
+ size: function () {
594
+ return this.errorList.length;
595
+ },
596
+
597
+ focusInvalid: function () {
598
+ if (this.settings.focusInvalid) {
599
+ try {
600
+ $(this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
601
+ .filter(":visible")
602
+ .focus()
603
+
604
+ // Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
605
+ .trigger("focusin");
606
+ } catch (e) {
607
+
608
+ // Ignore IE throwing errors when focusing hidden elements
609
+ }
610
+ }
611
+ },
612
+
613
+ findLastActive: function () {
614
+ var lastActive = this.lastActive;
615
+ return lastActive && $.grep(this.errorList, function (n) {
616
+ return n.element.name === lastActive.name;
617
+ }).length === 1 && lastActive;
618
+ },
619
+
620
+ elements: function () {
621
+ var validator = this,
622
+ rulesCache = {};
623
+
624
+ // Select all valid inputs inside the form (no submit or reset buttons)
625
+ return $(this.currentForm)
626
+ .find("input, select, textarea, [contenteditable]")
627
+ .not(":submit, :reset, :image, :disabled")
628
+ .not(this.settings.ignore)
629
+ .filter(function () {
630
+ var name = this.name || $(this).attr("name"); // For contenteditable
631
+ if (!name && validator.settings.debug && window.console) {
632
+ console.error("%o has no name assigned", this);
633
+ }
634
+
635
+ // Set form expando on contenteditable
636
+ if (this.hasAttribute("contenteditable")) {
637
+ this.form = $(this).closest("form")[ 0 ];
638
+ }
639
+
640
+ // Select only the first element for each name, and only those with rules specified
641
+ if (name in rulesCache || !validator.objectLength($(this).rules())) {
642
+ return false;
643
+ }
644
+
645
+ rulesCache[ name ] = true;
646
+ return true;
647
+ });
648
+ },
649
+
650
+ clean: function (selector) {
651
+ return $(selector)[ 0 ];
652
+ },
653
+
654
+ errors: function () {
655
+ var errorClass = this.settings.errorClass.split(" ").join(".");
656
+ return $(this.settings.errorElement + "." + errorClass, this.errorContext);
657
+ },
658
+
659
+ resetInternals: function () {
660
+ this.successList = [];
661
+ this.errorList = [];
662
+ this.errorMap = {};
663
+ this.toShow = $([]);
664
+ this.toHide = $([]);
665
+ },
666
+
667
+ reset: function () {
668
+ this.resetInternals();
669
+ this.currentElements = $([]);
670
+ },
671
+
672
+ prepareForm: function () {
673
+ this.reset();
674
+ this.toHide = this.errors().add(this.containers);
675
+ },
676
+
677
+ prepareElement: function (element) {
678
+ this.reset();
679
+ this.toHide = this.errorsFor(element);
680
+ },
681
+
682
+ elementValue: function (element) {
683
+ var $element = $(element),
684
+ type = element.type,
685
+ val, idx;
686
+
687
+ if (type === "radio" || type === "checkbox") {
688
+ return this.findByName(element.name).filter(":checked").val();
689
+ } else if (type === "number" && typeof element.validity !== "undefined") {
690
+ return element.validity.badInput ? "NaN" : $element.val();
691
+ }
692
+
693
+ if (element.hasAttribute("contenteditable")) {
694
+ val = $element.text();
695
+ } else {
696
+ val = $element.val();
697
+ }
698
+
699
+ if (type === "file") {
700
+
701
+ // Modern browser (chrome & safari)
702
+ if (val.substr(0, 12) === "C:\\fakepath\\") {
703
+ return val.substr(12);
704
+ }
705
+
706
+ // Legacy browsers
707
+ // Unix-based path
708
+ idx = val.lastIndexOf("/");
709
+ if (idx >= 0) {
710
+ return val.substr(idx + 1);
711
+ }
712
+
713
+ // Windows-based path
714
+ idx = val.lastIndexOf("\\");
715
+ if (idx >= 0) {
716
+ return val.substr(idx + 1);
717
+ }
718
+
719
+ // Just the file name
720
+ return val;
721
+ }
722
+
723
+ if (typeof val === "string") {
724
+ return val.replace(/\r/g, "");
725
+ }
726
+ return val;
727
+ },
728
+
729
+ check: function (element) {
730
+ element = this.validationTargetFor(this.clean(element));
731
+
732
+ var rules = $(element).rules(),
733
+ rulesCount = $.map(rules, function (n, i) {
734
+ return i;
735
+ }).length,
736
+ dependencyMismatch = false,
737
+ val = this.elementValue(element),
738
+ result, method, rule;
739
+
740
+ // If a normalizer is defined for this element, then
741
+ // call it to retreive the changed value instead
742
+ // of using the real one.
743
+ // Note that `this` in the normalizer is `element`.
744
+ if (typeof rules.normalizer === "function") {
745
+ val = rules.normalizer.call(element, val);
746
+
747
+ if (typeof val !== "string") {
748
+ throw new TypeError("The normalizer should return a string value.");
749
+ }
750
+
751
+ // Delete the normalizer from rules to avoid treating
752
+ // it as a pre-defined method.
753
+ delete rules.normalizer;
754
+ }
755
+
756
+ for (method in rules) {
757
+ rule = {method: method, parameters: rules[ method ]};
758
+ try {
759
+ result = $.validator.methods[ method ].call(this, val, element, rule.parameters);
760
+
761
+ // If a method indicates that the field is optional and therefore valid,
762
+ // don't mark it as valid when there are no other rules
763
+ if (result === "dependency-mismatch" && rulesCount === 1) {
764
+ dependencyMismatch = true;
765
+ continue;
766
+ }
767
+ dependencyMismatch = false;
768
+
769
+ if (result === "pending") {
770
+ this.toHide = this.toHide.not(this.errorsFor(element));
771
+ return;
772
+ }
773
+
774
+ if (!result) {
775
+ this.formatAndAdd(element, rule);
776
+ return false;
777
+ }
778
+ } catch (e) {
779
+ if (this.settings.debug && window.console) {
780
+ console.log("Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e);
781
+ }
782
+ if (e instanceof TypeError) {
783
+ e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
784
+ }
785
+
786
+ throw e;
787
+ }
788
+ }
789
+ if (dependencyMismatch) {
790
+ return;
791
+ }
792
+ if (this.objectLength(rules)) {
793
+ this.successList.push(element);
794
+ }
795
+ return true;
796
+ },
797
+
798
+ // Return the custom message for the given element and validation method
799
+ // specified in the element's HTML5 data attribute
800
+ // return the generic message if present and no method specific message is present
801
+ customDataMessage: function (element, method) {
802
+ return $(element).data("msg" + method.charAt(0).toUpperCase() +
803
+ method.substring(1).toLowerCase()) || $(element).data("msg");
804
+ },
805
+
806
+ // Return the custom message for the given element name and validation method
807
+ customMessage: function (name, method) {
808
+ var m = this.settings.messages[ name ];
809
+ return m && (m.constructor === String ? m : m[ method ]);
810
+ },
811
+
812
+ // Return the first defined argument, allowing empty strings
813
+ findDefined: function () {
814
+ for (var i = 0; i < arguments.length; i++) {
815
+ if (arguments[ i ] !== undefined) {
816
+ return arguments[ i ];
817
+ }
818
+ }
819
+ return undefined;
820
+ },
821
+
822
+ // The second parameter 'rule' used to be a string, and extended to an object literal
823
+ // of the following form:
824
+ // rule = {
825
+ // method: "method name",
826
+ // parameters: "the given method parameters"
827
+ // }
828
+ //
829
+ // The old behavior still supported, kept to maintain backward compatibility with
830
+ // old code, and will be removed in the next major release.
831
+ defaultMessage: function (element, rule) {
832
+ if (typeof rule === "string") {
833
+ rule = {method: rule};
834
+ }
835
+
836
+ var message = this.findDefined(
837
+ this.customMessage(element.name, rule.method),
838
+ this.customDataMessage(element, rule.method),
839
+ // 'title' is never undefined, so handle empty string as undefined
840
+ !this.settings.ignoreTitle && element.title || undefined,
841
+ $.validator.messages[ rule.method ],
842
+ "<strong>Warning: No message defined for " + element.name + "</strong>"
843
+ ),
844
+ theregex = /\$?\{(\d+)\}/g;
845
+ if (typeof message === "function") {
846
+ message = message.call(this, rule.parameters, element);
847
+ } else if (theregex.test(message)) {
848
+ message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters);
849
+ }
850
+
851
+ return message;
852
+ },
853
+
854
+ formatAndAdd: function (element, rule) {
855
+ var message = this.defaultMessage(element, rule);
856
+
857
+ this.errorList.push({
858
+ message: message,
859
+ element: element,
860
+ method: rule.method
861
+ });
862
+
863
+ this.errorMap[ element.name ] = message;
864
+ this.submitted[ element.name ] = message;
865
+ },
866
+
867
+ addWrapper: function (toToggle) {
868
+ if (this.settings.wrapper) {
869
+ toToggle = toToggle.add(toToggle.parent(this.settings.wrapper));
870
+ }
871
+ return toToggle;
872
+ },
873
+
874
+ defaultShowErrors: function () {
875
+ var i, elements, error;
876
+ for (i = 0; this.errorList[ i ]; i++) {
877
+ error = this.errorList[ i ];
878
+ if (this.settings.highlight) {
879
+ this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass);
880
+ }
881
+ this.showLabel(error.element, error.message);
882
+ }
883
+ if (this.errorList.length) {
884
+ this.toShow = this.toShow.add(this.containers);
885
+ }
886
+ if (this.settings.success) {
887
+ for (i = 0; this.successList[ i ]; i++) {
888
+ this.showLabel(this.successList[ i ]);
889
+ }
890
+ }
891
+ if (this.settings.unhighlight) {
892
+ for (i = 0, elements = this.validElements(); elements[ i ]; i++) {
893
+ this.settings.unhighlight.call(this, elements[ i ], this.settings.errorClass, this.settings.validClass);
894
+ }
895
+ }
896
+ this.toHide = this.toHide.not(this.toShow);
897
+ this.hideErrors();
898
+ this.addWrapper(this.toShow).show();
899
+ },
900
+
901
+ validElements: function () {
902
+ return this.currentElements.not(this.invalidElements());
903
+ },
904
+
905
+ invalidElements: function () {
906
+ return $(this.errorList).map(function () {
907
+ return this.element;
908
+ });
909
+ },
910
+
911
+ showLabel: function (element, message) {
912
+ var place, group, errorID, v,
913
+ error = this.errorsFor(element),
914
+ elementID = this.idOrName(element),
915
+ describedBy = $(element).attr("aria-describedby");
916
+
917
+ if (error.length) {
918
+
919
+ // Refresh error/success class
920
+ error.removeClass(this.settings.validClass).addClass(this.settings.errorClass);
921
+
922
+ // Replace message on existing label
923
+ error.html(message);
924
+ } else {
925
+
926
+ // Create error element
927
+ error = $("<" + this.settings.errorElement + ">")
928
+ .attr("id", elementID + "-error")
929
+ .addClass(this.settings.errorClass)
930
+ .html(message || "");
931
+
932
+ // Maintain reference to the element to be placed into the DOM
933
+ place = error;
934
+ if (this.settings.wrapper) {
935
+
936
+ // Make sure the element is visible, even in IE
937
+ // actually showing the wrapped element is handled elsewhere
938
+ place = error.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
939
+ }
940
+ if (this.labelContainer.length) {
941
+ this.labelContainer.append(place);
942
+ } else if (this.settings.errorPlacement) {
943
+ this.settings.errorPlacement.call(this, place, $(element));
944
+ } else {
945
+ place.insertAfter(element);
946
+ }
947
+
948
+ // Link error back to the element
949
+ if (error.is("label")) {
950
+
951
+ // If the error is a label, then associate using 'for'
952
+ error.attr("for", elementID);
953
+
954
+ // If the element is not a child of an associated label, then it's necessary
955
+ // to explicitly apply aria-describedby
956
+ } else if (error.parents("label[for='" + this.escapeCssMeta(elementID) + "']").length === 0) {
957
+ errorID = error.attr("id");
958
+
959
+ // Respect existing non-error aria-describedby
960
+ if (!describedBy) {
961
+ describedBy = errorID;
962
+ } else if (!describedBy.match(new RegExp("\\b" + this.escapeCssMeta(errorID) + "\\b"))) {
963
+
964
+ // Add to end of list if not already present
965
+ describedBy += " " + errorID;
966
+ }
967
+ $(element).attr("aria-describedby", describedBy);
968
+
969
+ // If this element is grouped, then assign to all elements in the same group
970
+ group = this.groups[ element.name ];
971
+ if (group) {
972
+ v = this;
973
+ $.each(v.groups, function (name, testgroup) {
974
+ if (testgroup === group) {
975
+ $("[name='" + v.escapeCssMeta(name) + "']", v.currentForm)
976
+ .attr("aria-describedby", error.attr("id"));
977
+ }
978
+ });
979
+ }
980
+ }
981
+ }
982
+ if (!message && this.settings.success) {
983
+ error.text("");
984
+ if (typeof this.settings.success === "string") {
985
+ error.addClass(this.settings.success);
986
+ } else {
987
+ this.settings.success(error, element);
988
+ }
989
+ }
990
+ this.toShow = this.toShow.add(error);
991
+ },
992
+
993
+ errorsFor: function (element) {
994
+ var name = this.escapeCssMeta(this.idOrName(element)),
995
+ describer = $(element).attr("aria-describedby"),
996
+ selector = "label[for='" + name + "'], label[for='" + name + "'] *";
997
+
998
+ // 'aria-describedby' should directly reference the error element
999
+ if (describer) {
1000
+ selector = selector + ", #" + this.escapeCssMeta(describer)
1001
+ .replace(/\s+/g, ", #");
1002
+ }
1003
+
1004
+ return this
1005
+ .errors()
1006
+ .filter(selector);
1007
+ },
1008
+
1009
+ // See https://api.jquery.com/category/selectors/, for CSS
1010
+ // meta-characters that should be escaped in order to be used with JQuery
1011
+ // as a literal part of a name/id or any selector.
1012
+ escapeCssMeta: function (string) {
1013
+ return string.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1");
1014
+ },
1015
+
1016
+ idOrName: function (element) {
1017
+ return this.groups[ element.name ] || (this.checkable(element) ? element.name : element.id || element.name);
1018
+ },
1019
+
1020
+ validationTargetFor: function (element) {
1021
+
1022
+ // If radio/checkbox, validate first element in group instead
1023
+ if (this.checkable(element)) {
1024
+ element = this.findByName(element.name);
1025
+ }
1026
+
1027
+ // Always apply ignore filter
1028
+ return $(element).not(this.settings.ignore)[ 0 ];
1029
+ },
1030
+
1031
+ checkable: function (element) {
1032
+ return (/radio|checkbox/i).test(element.type);
1033
+ },
1034
+
1035
+ findByName: function (name) {
1036
+ return $(this.currentForm).find("[name='" + this.escapeCssMeta(name) + "']");
1037
+ },
1038
+
1039
+ getLength: function (value, element) {
1040
+ switch (element.nodeName.toLowerCase()) {
1041
+ case "select":
1042
+ return $("option:selected", element).length;
1043
+ case "input":
1044
+ if (this.checkable(element)) {
1045
+ return this.findByName(element.name).filter(":checked").length;
1046
+ }
1047
+ }
1048
+ return value.length;
1049
+ },
1050
+
1051
+ depend: function (param, element) {
1052
+ return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ](param, element) : true;
1053
+ },
1054
+
1055
+ dependTypes: {
1056
+ "boolean": function (param) {
1057
+ return param;
1058
+ },
1059
+ "string": function (param, element) {
1060
+ return !!$(param, element.form).length;
1061
+ },
1062
+ "function": function (param, element) {
1063
+ return param(element);
1064
+ }
1065
+ },
1066
+
1067
+ optional: function (element) {
1068
+ var val = this.elementValue(element);
1069
+ return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch";
1070
+ },
1071
+
1072
+ startRequest: function (element) {
1073
+ if (!this.pending[ element.name ]) {
1074
+ this.pendingRequest++;
1075
+ $(element).addClass(this.settings.pendingClass);
1076
+ this.pending[ element.name ] = true;
1077
+ }
1078
+ },
1079
+
1080
+ stopRequest: function (element, valid) {
1081
+ this.pendingRequest--;
1082
+
1083
+ // Sometimes synchronization fails, make sure pendingRequest is never < 0
1084
+ if (this.pendingRequest < 0) {
1085
+ this.pendingRequest = 0;
1086
+ }
1087
+ delete this.pending[ element.name ];
1088
+ $(element).removeClass(this.settings.pendingClass);
1089
+ if (valid && this.pendingRequest === 0 && this.formSubmitted && this.form()) {
1090
+ $(this.currentForm).submit();
1091
+ this.formSubmitted = false;
1092
+ } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {
1093
+ $(this.currentForm).triggerHandler("invalid-form", [this]);
1094
+ this.formSubmitted = false;
1095
+ }
1096
+ },
1097
+
1098
+ previousValue: function (element, method) {
1099
+ method = typeof method === "string" && method || "remote";
1100
+
1101
+ return $.data(element, "previousValue") || $.data(element, "previousValue", {
1102
+ old: null,
1103
+ valid: true,
1104
+ message: this.defaultMessage(element, {method: method})
1105
+ });
1106
+ },
1107
+
1108
+ // Cleans up all forms and elements, removes validator-specific events
1109
+ destroy: function () {
1110
+ this.resetForm();
1111
+
1112
+ $(this.currentForm)
1113
+ .off(".validate")
1114
+ .removeData("validator")
1115
+ .find(".validate-equalTo-blur")
1116
+ .off(".validate-equalTo")
1117
+ .removeClass("validate-equalTo-blur");
1118
+ }
1119
+
1120
+ },
1121
+
1122
+ classRuleSettings: {
1123
+ required: {required: true},
1124
+ email: {email: true},
1125
+ url: {url: true},
1126
+ date: {date: true},
1127
+ dateISO: {dateISO: true},
1128
+ number: {number: true},
1129
+ digits: {digits: true},
1130
+ creditcard: {creditcard: true}
1131
+ },
1132
+
1133
+ addClassRules: function (className, rules) {
1134
+ if (className.constructor === String) {
1135
+ this.classRuleSettings[ className ] = rules;
1136
+ } else {
1137
+ $.extend(this.classRuleSettings, className);
1138
+ }
1139
+ },
1140
+
1141
+ classRules: function (element) {
1142
+ var rules = {},
1143
+ classes = $(element).attr("class");
1144
+
1145
+ if (classes) {
1146
+ $.each(classes.split(" "), function () {
1147
+ if (this in $.validator.classRuleSettings) {
1148
+ $.extend(rules, $.validator.classRuleSettings[ this ]);
1149
+ }
1150
+ });
1151
+ }
1152
+ return rules;
1153
+ },
1154
+
1155
+ normalizeAttributeRule: function (rules, type, method, value) {
1156
+
1157
+ // Convert the value to a number for number inputs, and for text for backwards compability
1158
+ // allows type="date" and others to be compared as strings
1159
+ if (/min|max|step/.test(method) && (type === null || /number|range|text/.test(type))) {
1160
+ value = Number(value);
1161
+
1162
+ // Support Opera Mini, which returns NaN for undefined minlength
1163
+ if (isNaN(value)) {
1164
+ value = undefined;
1165
+ }
1166
+ }
1167
+
1168
+ if (value || value === 0) {
1169
+ rules[ method ] = value;
1170
+ } else if (type === method && type !== "range") {
1171
+
1172
+ // Exception: the jquery validate 'range' method
1173
+ // does not test for the html5 'range' type
1174
+ rules[ method ] = true;
1175
+ }
1176
+ },
1177
+
1178
+ attributeRules: function (element) {
1179
+ var rules = {},
1180
+ $element = $(element),
1181
+ type = element.getAttribute("type"),
1182
+ method, value;
1183
+
1184
+ for (method in $.validator.methods) {
1185
+
1186
+ // Support for <input required> in both html5 and older browsers
1187
+ if (method === "required") {
1188
+ value = element.getAttribute(method);
1189
+
1190
+ // Some browsers return an empty string for the required attribute
1191
+ // and non-HTML5 browsers might have required="" markup
1192
+ if (value === "") {
1193
+ value = true;
1194
+ }
1195
+
1196
+ // Force non-HTML5 browsers to return bool
1197
+ value = !!value;
1198
+ } else {
1199
+ value = $element.attr(method);
1200
+ }
1201
+
1202
+ this.normalizeAttributeRule(rules, type, method, value);
1203
+ }
1204
+
1205
+ // 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
1206
+ if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
1207
+ delete rules.maxlength;
1208
+ }
1209
+
1210
+ return rules;
1211
+ },
1212
+
1213
+ dataRules: function (element) {
1214
+ var rules = {},
1215
+ $element = $(element),
1216
+ type = element.getAttribute("type"),
1217
+ method, value;
1218
+
1219
+ for (method in $.validator.methods) {
1220
+ value = $element.data("rule" + method.charAt(0).toUpperCase() + method.substring(1).toLowerCase());
1221
+ this.normalizeAttributeRule(rules, type, method, value);
1222
+ }
1223
+ return rules;
1224
+ },
1225
+
1226
+ staticRules: function (element) {
1227
+ var rules = {},
1228
+ validator = $.data(element.form, "validator");
1229
+
1230
+ if (validator.settings.rules) {
1231
+ rules = $.validator.normalizeRule(validator.settings.rules[ element.name ]) || {};
1232
+ }
1233
+ return rules;
1234
+ },
1235
+
1236
+ normalizeRules: function (rules, element) {
1237
+
1238
+ // Handle dependency check
1239
+ $.each(rules, function (prop, val) {
1240
+
1241
+ // Ignore rule when param is explicitly false, eg. required:false
1242
+ if (val === false) {
1243
+ delete rules[ prop ];
1244
+ return;
1245
+ }
1246
+ if (val.param || val.depends) {
1247
+ var keepRule = true;
1248
+ switch (typeof val.depends) {
1249
+ case "string":
1250
+ keepRule = !!$(val.depends, element.form).length;
1251
+ break;
1252
+ case "function":
1253
+ keepRule = val.depends.call(element, element);
1254
+ break;
1255
+ }
1256
+ if (keepRule) {
1257
+ rules[ prop ] = val.param !== undefined ? val.param : true;
1258
+ } else {
1259
+ $.data(element.form, "validator").resetElements($(element));
1260
+ delete rules[ prop ];
1261
+ }
1262
+ }
1263
+ });
1264
+
1265
+ // Evaluate parameters
1266
+ $.each(rules, function (rule, parameter) {
1267
+ rules[ rule ] = $.isFunction(parameter) && rule !== "normalizer" ? parameter(element) : parameter;
1268
+ });
1269
+
1270
+ // Clean number parameters
1271
+ $.each(["minlength", "maxlength"], function () {
1272
+ if (rules[ this ]) {
1273
+ rules[ this ] = Number(rules[ this ]);
1274
+ }
1275
+ });
1276
+ $.each(["rangelength", "range"], function () {
1277
+ var parts;
1278
+ if (rules[ this ]) {
1279
+ if ($.isArray(rules[ this ])) {
1280
+ rules[ this ] = [Number(rules[ this ][ 0 ]), Number(rules[ this ][ 1 ])];
1281
+ } else if (typeof rules[ this ] === "string") {
1282
+ parts = rules[ this ].replace(/[\[\]]/g, "").split(/[\s,]+/);
1283
+ rules[ this ] = [Number(parts[ 0 ]), Number(parts[ 1 ])];
1284
+ }
1285
+ }
1286
+ });
1287
+
1288
+ if ($.validator.autoCreateRanges) {
1289
+
1290
+ // Auto-create ranges
1291
+ if (rules.min != null && rules.max != null) {
1292
+ rules.range = [rules.min, rules.max];
1293
+ delete rules.min;
1294
+ delete rules.max;
1295
+ }
1296
+ if (rules.minlength != null && rules.maxlength != null) {
1297
+ rules.rangelength = [rules.minlength, rules.maxlength];
1298
+ delete rules.minlength;
1299
+ delete rules.maxlength;
1300
+ }
1301
+ }
1302
+
1303
+ return rules;
1304
+ },
1305
+
1306
+ // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
1307
+ normalizeRule: function (data) {
1308
+ if (typeof data === "string") {
1309
+ var transformed = {};
1310
+ $.each(data.split(/\s/), function () {
1311
+ transformed[ this ] = true;
1312
+ });
1313
+ data = transformed;
1314
+ }
1315
+ return data;
1316
+ },
1317
+
1318
+ // http://jqueryvalidation.org/jQuery.validator.addMethod/
1319
+ addMethod: function (name, method, message) {
1320
+ $.validator.methods[ name ] = method;
1321
+ $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
1322
+ if (method.length < 3) {
1323
+ $.validator.addClassRules(name, $.validator.normalizeRule(name));
1324
+ }
1325
+ },
1326
+
1327
+ // http://jqueryvalidation.org/jQuery.validator.methods/
1328
+ methods: {
1329
+
1330
+ // http://jqueryvalidation.org/required-method/
1331
+ required: function (value, element, param) {
1332
+
1333
+ // Check if dependency is met
1334
+ if (!this.depend(param, element)) {
1335
+ return "dependency-mismatch";
1336
+ }
1337
+ if (element.nodeName.toLowerCase() === "select") {
1338
+
1339
+ // Could be an array for select-multiple or a string, both are fine this way
1340
+ var val = $(element).val();
1341
+ return val && val.length > 0;
1342
+ }
1343
+ if (this.checkable(element)) {
1344
+ return this.getLength(value, element) > 0;
1345
+ }
1346
+ return value.length > 0;
1347
+ },
1348
+
1349
+ // http://jqueryvalidation.org/email-method/
1350
+ email: function (value, element) {
1351
+
1352
+ // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
1353
+ // Retrieved 2014-01-14
1354
+ // If you have a problem with this implementation, report a bug against the above spec
1355
+ // Or use custom methods to implement your own email validation
1356
+ return this.optional(element) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(value);
1357
+ },
1358
+
1359
+ // http://jqueryvalidation.org/url-method/
1360
+ url: function (value, element) {
1361
+
1362
+ // Copyright (c) 2010-2013 Diego Perini, MIT licensed
1363
+ // https://gist.github.com/dperini/729294
1364
+ // see also https://mathiasbynens.be/demo/url-regex
1365
+ // modified to allow protocol-relative URLs
1366
+ return this.optional(element) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value);
1367
+ },
1368
+
1369
+ // http://jqueryvalidation.org/date-method/
1370
+ date: function (value, element) {
1371
+ return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());
1372
+ },
1373
+
1374
+ // http://jqueryvalidation.org/dateISO-method/
1375
+ dateISO: function (value, element) {
1376
+ return this.optional(element) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value);
1377
+ },
1378
+
1379
+ // http://jqueryvalidation.org/number-method/
1380
+ number: function (value, element) {
1381
+ return this.optional(element) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
1382
+ },
1383
+
1384
+ // http://jqueryvalidation.org/digits-method/
1385
+ digits: function (value, element) {
1386
+ return this.optional(element) || /^\d+$/.test(value);
1387
+ },
1388
+
1389
+ // http://jqueryvalidation.org/minlength-method/
1390
+ minlength: function (value, element, param) {
1391
+ var length = $.isArray(value) ? value.length : this.getLength(value, element);
1392
+ return this.optional(element) || length >= param;
1393
+ },
1394
+
1395
+ // http://jqueryvalidation.org/maxlength-method/
1396
+ maxlength: function (value, element, param) {
1397
+ var length = $.isArray(value) ? value.length : this.getLength(value, element);
1398
+ return this.optional(element) || length <= param;
1399
+ },
1400
+
1401
+ // http://jqueryvalidation.org/rangelength-method/
1402
+ rangelength: function (value, element, param) {
1403
+ var length = $.isArray(value) ? value.length : this.getLength(value, element);
1404
+ return this.optional(element) || (length >= param[ 0 ] && length <= param[ 1 ]);
1405
+ },
1406
+
1407
+ // http://jqueryvalidation.org/min-method/
1408
+ min: function (value, element, param) {
1409
+ return this.optional(element) || value >= param;
1410
+ },
1411
+
1412
+ // http://jqueryvalidation.org/max-method/
1413
+ max: function (value, element, param) {
1414
+ return this.optional(element) || value <= param;
1415
+ },
1416
+
1417
+ // http://jqueryvalidation.org/range-method/
1418
+ range: function (value, element, param) {
1419
+ return this.optional(element) || (value >= param[ 0 ] && value <= param[ 1 ]);
1420
+ },
1421
+
1422
+ // http://jqueryvalidation.org/step-method/
1423
+ step: function (value, element, param) {
1424
+ var type = $(element).attr("type"),
1425
+ errorMessage = "Step attribute on input type " + type + " is not supported.",
1426
+ supportedTypes = ["text", "number", "range"],
1427
+ re = new RegExp("\\b" + type + "\\b"),
1428
+ notSupported = type && !re.test(supportedTypes.join()),
1429
+ decimalPlaces = function (num) {
1430
+ var match = ("" + num).match(/(?:\.(\d+))?$/);
1431
+ if (!match) {
1432
+ return 0;
1433
+ }
1434
+
1435
+ // Number of digits right of decimal point.
1436
+ return match[ 1 ] ? match[ 1 ].length : 0;
1437
+ },
1438
+ toInt = function (num) {
1439
+ return Math.round(num * Math.pow(10, decimals));
1440
+ },
1441
+ valid = true,
1442
+ decimals;
1443
+
1444
+ // Works only for text, number and range input types
1445
+ // TODO find a way to support input types date, datetime, datetime-local, month, time and week
1446
+ if (notSupported) {
1447
+ throw new Error(errorMessage);
1448
+ }
1449
+
1450
+ decimals = decimalPlaces(param);
1451
+
1452
+ // Value can't have too many decimals
1453
+ if (decimalPlaces(value) > decimals || toInt(value) % toInt(param) !== 0) {
1454
+ valid = false;
1455
+ }
1456
+
1457
+ return this.optional(element) || valid;
1458
+ },
1459
+
1460
+ // http://jqueryvalidation.org/equalTo-method/
1461
+ equalTo: function (value, element, param) {
1462
+
1463
+ // Bind to the blur event of the target in order to revalidate whenever the target field is updated
1464
+ var target = $(param);
1465
+ if (this.settings.onfocusout && target.not(".validate-equalTo-blur").length) {
1466
+ target.addClass("validate-equalTo-blur").on("blur.validate-equalTo", function () {
1467
+ $(element).valid();
1468
+ });
1469
+ }
1470
+ return value === target.val();
1471
+ },
1472
+
1473
+ // http://jqueryvalidation.org/remote-method/
1474
+ remote: function (value, element, param, method) {
1475
+ if (this.optional(element)) {
1476
+ return "dependency-mismatch";
1477
+ }
1478
+
1479
+ method = typeof method === "string" && method || "remote";
1480
+
1481
+ var previous = this.previousValue(element, method),
1482
+ validator, data, optionDataString;
1483
+
1484
+ if (!this.settings.messages[ element.name ]) {
1485
+ this.settings.messages[ element.name ] = {};
1486
+ }
1487
+ previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
1488
+ this.settings.messages[ element.name ][ method ] = previous.message;
1489
+
1490
+ param = typeof param === "string" && {url: param} || param;
1491
+ optionDataString = $.param($.extend({data: value}, param.data));
1492
+ if (previous.old === optionDataString) {
1493
+ return previous.valid;
1494
+ }
1495
+
1496
+ previous.old = optionDataString;
1497
+ validator = this;
1498
+ this.startRequest(element);
1499
+ data = {};
1500
+ data[ element.name ] = value;
1501
+ $.ajax($.extend(true, {
1502
+ mode: "abort",
1503
+ port: "validate" + element.name,
1504
+ dataType: "json",
1505
+ data: data,
1506
+ context: validator.currentForm,
1507
+ success: function (response) {
1508
+ var valid = response === true || response === "true",
1509
+ errors, message, submitted;
1510
+
1511
+ validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
1512
+ if (valid) {
1513
+ submitted = validator.formSubmitted;
1514
+ validator.resetInternals();
1515
+ validator.toHide = validator.errorsFor(element);
1516
+ validator.formSubmitted = submitted;
1517
+ validator.successList.push(element);
1518
+ validator.invalid[ element.name ] = false;
1519
+ validator.showErrors();
1520
+ } else {
1521
+ errors = {};
1522
+ message = response || validator.defaultMessage(element, {method: method, parameters: value});
1523
+ errors[ element.name ] = previous.message = message;
1524
+ validator.invalid[ element.name ] = true;
1525
+ validator.showErrors(errors);
1526
+ }
1527
+ previous.valid = valid;
1528
+ validator.stopRequest(element, valid);
1529
+ }
1530
+ }, param));
1531
+ return "pending";
1532
+ }
1533
+ }
1534
+
1535
+ });
1536
+
1537
+ // Ajax mode: abort
1538
+ // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
1539
+ // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
1540
+
1541
+ var pendingRequests = {},
1542
+ ajax;
1543
+
1544
+ // Use a prefilter if available (1.5+)
1545
+ if ($.ajaxPrefilter) {
1546
+ $.ajaxPrefilter(function (settings, _, xhr) {
1547
+ var port = settings.port;
1548
+ if (settings.mode === "abort") {
1549
+ if (pendingRequests[ port ]) {
1550
+ pendingRequests[ port ].abort();
1551
+ }
1552
+ pendingRequests[ port ] = xhr;
1553
+ }
1554
+ });
1555
+ } else {
1556
+
1557
+ // Proxy ajax
1558
+ ajax = $.ajax;
1559
+ $.ajax = function (settings) {
1560
+ var mode = ("mode" in settings ? settings : $.ajaxSettings).mode,
1561
+ port = ("port" in settings ? settings : $.ajaxSettings).port;
1562
+ if (mode === "abort") {
1563
+ if (pendingRequests[ port ]) {
1564
+ pendingRequests[ port ].abort();
1565
+ }
1566
+ pendingRequests[ port ] = ajax.apply(this, arguments);
1567
+ return pendingRequests[ port ];
1568
+ }
1569
+ return ajax.apply(this, arguments);
1570
+ };
1571
+ }
1572
+ return $;
 
1573
  }));
gallery-bank.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php
2
  /*
3
- * Plugin Name: Image Gallery by Gallery Bank - Responsive WordPress Photo Gallery Plugin
4
- * Plugin URI: http://gallery-bank.tech-banker.com
5
- * Description: Gallery Bank is an interactive WordPress gallery plugin, best fit for creative and corporate portfolio websites.
6
  * Author: Tech Banker
7
- * Author URI: http://gallery-bank.tech-banker.com
8
- * Version: 4.0.4
9
  * License: GPLv3
10
  * Text Domain: gallery-bank
11
  * Domain Path: /languages
@@ -89,7 +89,7 @@ if (!defined("tech_banker_stats_url")) {
89
  define("tech_banker_stats_url", "http://stats.tech-banker-services.org");
90
  }
91
  if (!defined("gallery_bank_wizard_version_number")) {
92
- define("gallery_bank_wizard_version_number", "4.0.4");
93
  }
94
 
95
  if (!is_dir(GALLERY_BANK_MAIN_DIR)) {
@@ -348,8 +348,8 @@ if (is_admin()) {
348
  }
349
  }
350
  if (strpos($hook, "gb_add_gallery") !== false) {
351
- wp_enqueue_script("plupload.full.min.js", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/js/plupload.full.min.js", array("jquery-ui-draggable", "jquery-ui-sortable", "jquery-ui-dialog", "jquery-ui-widget", "jquery-ui-progressbar"),null,true);
352
- wp_enqueue_script("jquery.ui.plupload.js", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/js/jquery.ui.plupload.js",null,null,true);
353
  wp_enqueue_style("jquery.ui.plupload.css", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/css/jquery.ui.plupload.css");
354
  wp_enqueue_style("jquery-ui.css", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/css/jquery-ui.css");
355
  wp_enqueue_script("bootstrap-hover-dropdown.js", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/custom/js/bootstrap-hover-dropdown.js");
1
  <?php
2
  /*
3
+ * Plugin Name: Photo Gallery - Image Gallery - Photo Album - WordPress Gallery Plugin By Gallery Bank
4
+ * Plugin URI: https://gallery-bank.tech-banker.com/
5
+ * Description: Responsive Gallery Plugin that lets you create beautiful image gallery along with media gallery, portfolio gallery, grid gallery and gallery widgets.
6
  * Author: Tech Banker
7
+ * Author URI: https://gallery-bank.tech-banker.com/
8
+ * Version: 4.0.5
9
  * License: GPLv3
10
  * Text Domain: gallery-bank
11
  * Domain Path: /languages
89
  define("tech_banker_stats_url", "http://stats.tech-banker-services.org");
90
  }
91
  if (!defined("gallery_bank_wizard_version_number")) {
92
+ define("gallery_bank_wizard_version_number", "4.0.5");
93
  }
94
 
95
  if (!is_dir(GALLERY_BANK_MAIN_DIR)) {
348
  }
349
  }
350
  if (strpos($hook, "gb_add_gallery") !== false) {
351
+ wp_enqueue_script("plupload.full.min.js", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/js/plupload.full.min.js", array("jquery-ui-draggable", "jquery-ui-sortable", "jquery-ui-dialog", "jquery-ui-widget", "jquery-ui-progressbar"), null, true);
352
+ wp_enqueue_script("jquery.ui.plupload.js", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/js/jquery.ui.plupload.js", null, null, true);
353
  wp_enqueue_style("jquery.ui.plupload.css", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/css/jquery.ui.plupload.css");
354
  wp_enqueue_style("jquery-ui.css", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/pluploader/css/jquery-ui.css");
355
  wp_enqueue_script("bootstrap-hover-dropdown.js", GALLERY_BANK_PLUGIN_DIR_URL . "assets/global/plugins/custom/js/bootstrap-hover-dropdown.js");
includes/footer.php CHANGED
@@ -821,10 +821,10 @@ if (!is_user_logged_in()) {
821
  ({
822
  runtimes: "html5,html4,flash,silverlight",
823
  url: ajaxurl + "?param=upload_gallery_pics&action=gallery_bank_image_upload&_wp_nonce=<?php echo $upload_local_system_files_nonce; ?>",
824
- max_file_size : "20mb",
825
  chunk_size: "2mb",
826
- filters : [
827
- {title : "Image files", extensions : "jpg,jpeg,gif,png"}
828
  ],
829
  rename: true,
830
  sortable: true,
821
  ({
822
  runtimes: "html5,html4,flash,silverlight",
823
  url: ajaxurl + "?param=upload_gallery_pics&action=gallery_bank_image_upload&_wp_nonce=<?php echo $upload_local_system_files_nonce; ?>",
824
+ max_file_size: "20mb",
825
  chunk_size: "2mb",
826
+ filters: [
827
+ {title: "Image files", extensions: "jpg,jpeg,gif,png"}
828
  ],
829
  rename: true,
830
  sortable: true,
includes/sidebar.php CHANGED
@@ -188,7 +188,6 @@ if (!is_user_logged_in()) {
188
  <li id="ux_li_lightboxes">
189
  <a href="javascript:;">
190
  <i class="icon-custom-frame"></i>
191
- <span class="badge">Pro</span>
192
  <span class="title">
193
  <?php echo $gb_lightboxes; ?>
194
  </span>
@@ -197,30 +196,35 @@ if (!is_user_logged_in()) {
197
  <li id="ux_li_gb_lightcase">
198
  <a href="admin.php?page=gb_lightcase">
199
  <i class="icon-custom-magnet"></i>
 
200
  <?php echo $gb_lightcase; ?>
201
  </a>
202
  </li>
203
  <li id="ux_li_fancy_box">
204
  <a href="admin.php?page=gb_fancy_box">
205
  <i class="icon-custom-social-dropbox"></i>
 
206
  <?php echo $gb_fancy_box; ?>
207
  </a>
208
  </li>
209
  <li id="ux_li_color_box">
210
  <a href="admin.php?page=gb_color_box">
211
  <i class="icon-custom-magic-wand"></i>
 
212
  <?php echo $gb_color_box; ?>
213
  </a>
214
  </li>
215
  <li id="ux_li_foo_box_free_edition">
216
  <a href="admin.php?page=gb_foo_box_free_edition">
217
  <i class="icon-custom-frame"></i>
 
218
  <?php echo class_exists("fooboxV2") ? $gb_foo_box_premium : $gb_foo_box_free_edition; ?>
219
  </a>
220
  </li>
221
  <li id="ux_li_nivo_light_box">
222
  <a href="admin.php?page=gb_nivo_lightbox">
223
  <i class="icon-custom-paper-plane"></i>
 
224
  <?php echo $gb_nivo_lightbox; ?>
225
  </a>
226
  </li>
188
  <li id="ux_li_lightboxes">
189
  <a href="javascript:;">
190
  <i class="icon-custom-frame"></i>
 
191
  <span class="title">
192
  <?php echo $gb_lightboxes; ?>
193
  </span>
196
  <li id="ux_li_gb_lightcase">
197
  <a href="admin.php?page=gb_lightcase">
198
  <i class="icon-custom-magnet"></i>
199
+ <span class="badge">Pro</span>
200
  <?php echo $gb_lightcase; ?>
201
  </a>
202
  </li>
203
  <li id="ux_li_fancy_box">
204
  <a href="admin.php?page=gb_fancy_box">
205
  <i class="icon-custom-social-dropbox"></i>
206
+ <span class="badge">Pro</span>
207
  <?php echo $gb_fancy_box; ?>
208
  </a>
209
  </li>
210
  <li id="ux_li_color_box">
211
  <a href="admin.php?page=gb_color_box">
212
  <i class="icon-custom-magic-wand"></i>
213
+ <span class="badge">Pro</span>
214
  <?php echo $gb_color_box; ?>
215
  </a>
216
  </li>
217
  <li id="ux_li_foo_box_free_edition">
218
  <a href="admin.php?page=gb_foo_box_free_edition">
219
  <i class="icon-custom-frame"></i>
220
+ <span class="badge">Pro</span>
221
  <?php echo class_exists("fooboxV2") ? $gb_foo_box_premium : $gb_foo_box_free_edition; ?>
222
  </a>
223
  </li>
224
  <li id="ux_li_nivo_light_box">
225
  <a href="admin.php?page=gb_nivo_lightbox">
226
  <i class="icon-custom-paper-plane"></i>
227
+ <span class="badge">Pro</span>
228
  <?php echo $gb_nivo_lightbox; ?>
229
  </a>
230
  </li>
includes/web-fonts.php CHANGED
@@ -10,6 +10,7 @@ if (!defined("ABSPATH")) {
10
  exit;
11
  }
12
  ?>
 
13
  <option value="ABeeZee">ABeeZee</option>
14
  <option value="ABeeZee:400italic">ABeeZee italic</option>
15
  <option value="Abel">Abel</option>
10
  exit;
11
  }
12
  ?>
13
+ <option value="inherit">Default</option>
14
  <option value="ABeeZee">ABeeZee</option>
15
  <option value="ABeeZee:400italic">ABeeZee italic</option>
16
  <option value="Abel">Abel</option>
lib/action-library.php CHANGED
@@ -138,7 +138,13 @@ if (!is_user_logged_in()) {
138
  if (wp_verify_nonce((isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : ""), "gallery_upload_images_nonce")) {
139
  $gallery_id = isset($_REQUEST["gallery_id"]) ? intval($_REQUEST["gallery_id"]) : 0;
140
  $image_meta_data = array();
141
-
 
 
 
 
 
 
142
  $image_data = get_thumbnail_dimension_gallery_bank();
143
  $image_name = isset($_REQUEST["image_name"]) ? esc_attr($_REQUEST["image_name"]) : "";
144
  $upload_type = isset($_REQUEST["upload_method"]) ? esc_attr($_REQUEST["upload_method"]) : "";
@@ -217,7 +223,7 @@ if (!is_user_logged_in()) {
217
  }
218
  $image_meta_data_insert = array();
219
  $image_meta_data_insert["meta_id"] = $gallery_id;
220
- $image_meta_data_insert["old_gallery_id"] = $gallery_id;
221
  $image_meta_data_insert["meta_key"] = "image_data";
222
  $image_meta_data_insert["meta_value"] = serialize($image_meta_data);
223
  $image_id = $obj_dbHelper_gallery_bank->insertCommand(gallery_bank_meta(), $image_meta_data_insert);
@@ -397,7 +403,9 @@ if (!is_user_logged_in()) {
397
  );
398
  $get_image_data_unserialize = array();
399
  foreach ($get_image_data as $val) {
400
- $get_image_data_unserialize[] = maybe_unserialize($val->meta_value)["image_name"];
 
 
401
  }
402
 
403
  $generated_image_dimension = explode(",", $global_options["global_options_generated_image_dimensions"]);
138
  if (wp_verify_nonce((isset($_REQUEST["_wp_nonce"]) ? esc_attr($_REQUEST["_wp_nonce"]) : ""), "gallery_upload_images_nonce")) {
139
  $gallery_id = isset($_REQUEST["gallery_id"]) ? intval($_REQUEST["gallery_id"]) : 0;
140
  $image_meta_data = array();
141
+ $get_old_gallery_id = $wpdb->get_var
142
+ (
143
+ $wpdb->prepare
144
+ (
145
+ "SELECT old_gallery_id FROM " . gallery_bank_meta() . " WHERE meta_id = %d and meta_key = %s", $gallery_id, "gallery_data"
146
+ )
147
+ );
148
  $image_data = get_thumbnail_dimension_gallery_bank();
149
  $image_name = isset($_REQUEST["image_name"]) ? esc_attr($_REQUEST["image_name"]) : "";
150
  $upload_type = isset($_REQUEST["upload_method"]) ? esc_attr($_REQUEST["upload_method"]) : "";
223
  }
224
  $image_meta_data_insert = array();
225
  $image_meta_data_insert["meta_id"] = $gallery_id;
226
+ $image_meta_data_insert["old_gallery_id"] = $get_old_gallery_id;
227
  $image_meta_data_insert["meta_key"] = "image_data";
228
  $image_meta_data_insert["meta_value"] = serialize($image_meta_data);
229
  $image_id = $obj_dbHelper_gallery_bank->insertCommand(gallery_bank_meta(), $image_meta_data_insert);
403
  );
404
  $get_image_data_unserialize = array();
405
  foreach ($get_image_data as $val) {
406
+ $unserialize_image_data_value = array();
407
+ $unserialize_image_data_value = maybe_unserialize($val->meta_value);
408
+ $get_image_data_unserialize[] = $unserialize_image_data_value["image_name"];
409
  }
410
 
411
  $generated_image_dimension = explode(",", $global_options["global_options_generated_image_dimensions"]);
license.txt DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- <one line to give the program's name and a brief idea of what it does.>
635
- Copyright (C) <year> <name of author>
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <http://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- <program> Copyright (C) <year> <name of author>
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <http://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <http://www.gnu.org/philosophy/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,24 +1,28 @@
1
- === Responsive Gallery Plugin - Photo Gallery - Image Gallery - Photo Albums ===
2
- Contributors: Gallery-Bank, contact-banker
3
- Tags: gallery, portfolio, album, images, photo gallery, photo album, image gallery, wordpress gallery, wordpress gallery plugin, gallery widget, masonry, responsive gallery, media gallery
4
  Requires at least: 3.4
5
  Tested up to: 4.8
6
  Stable Tag: trunk
7
- License: GPLv3 or later
8
- License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
10
- Photo Gallery Plugin for WordPress can be used to create a gallery widget, image gallery, media gallery album, portfolio gallery and photo album.
11
 
12
  == Description ==
13
 
14
- = Best WordPress Gallery Plugin & WordPress Portfolio Plugin =
15
 
16
- * [Gallery Bank](https://gallery-bank.tech-banker.com/)
17
- * [Detailed Features](http://gallery-bank.tech-banker.com/features/detailed-features/)
18
- * [Front End Demos](https://gallery-bank.tech-banker.com/frontend-demos/)
19
- * [Back End Demos](https://gallery-bank.tech-banker.com/backend-demos/)
20
- * [Documentation](https://gallery-bank.tech-banker.com/documentation/)
21
- * [Upgrade to Premium Editions](https://gallery-bank.tech-banker.com/pricing/)
 
 
 
 
22
 
23
  [**WordPress Photo Gallery Plugin**](https://gallery-bank.tech-banker.com/) is one of the Best WordPress Gallery Plugin designed to create elegant and beautiful **photo gallery** and **photo albums** using **Masonry Gallery Layouts**, **Thumbnail Gallery Layouts**, **Compact Album Layouts** and **Extended Album Layouts** along with Special Effects and Animation Effects.
24
 
@@ -26,82 +30,98 @@ Photo Gallery Plugin for WordPress can be used to create a gallery widget, image
26
 
27
  **WordPress Photo Gallery Plugin** provides a powerful photo gallery engine for uploading and managing photo albums of images, with the ability to batch upload, delete, rearrange and sort images.
28
 
29
- It is the best gallery plugin for wordpress is being regularly updated for new features and its simplicity of usage along with efficient functionality makes it a perfect choice among photographers to have a stunning look for their sites.
30
-
31
- There are also Premium Editions for the gallery plugin for wordpress with much more useful pro features available.
32
-
33
- Gallery Bank uses [FooBox Lightbox](https://wordpress.org/plugins/foobox-image-lightbox/) as its default gallery Lightbox in Lite Edition as it is licensed under GPL V2 or later.
34
-
35
- FooBox was the first lightbox to take responsive layout seriously. Not only does it scale images to look better on phones, but it rearranges it�s button controls to look great in both portrait or landscape orientation.
36
-
37
- > #### **Live Demos - WordPress Photo Gallery Plugin**
38
-
39
- * [Thumbnail Gallery](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-thumbnail-layout/)
40
- * [Thumbnail Gallery with WordPress Gallery Lightbox](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-thumbnail-layout/)
41
- * [Thumbnail Gallery with Pagination](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-thumbnail-layout/)
42
- * [Thumbnail Gallery with Lazy Load](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-thumbnail-layout/)
43
- * [Thumbnail Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-thumbnail-layout/)
44
- * [Thumbnail Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-thumbnail-layout/)
45
- * [Thumbnail Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-thumbnail-layout/)
46
- * [Thumbnail Gallery with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-thumbnail-layout/)
47
- * [Thumbnail Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-thumbnail-layout/)
48
- * [Thumbnail Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-thumbnail-layout/)
49
- * [Masonry Gallery](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-masonry-layout/)
50
- * [Masonry Gallery with WordPress Gallery Lightbox](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-masonry-layout/)
51
- * [Masonry Gallery with Pagination](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-masonry-layout/)
52
- * [Masonry Gallery with Lazy Load](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-masonry-layout/)
53
- * [Masonry Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-masonry-layout/)
54
- * [Masonry Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-masonry-layout/)
55
- * [Masonry Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-masonry-layout/)
56
- * [Masonry Gallery with Watermark](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-masonry-layout/)
57
- * [Masonry Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-masonry-layout/)
58
- * [Masonry Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-masonry-layout/)
59
- * [Slide Show Gallery](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-slideshow-layout/)
60
- * [Slide Show Gallery with Lazy Load](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-slideshow-layout/)
61
- * [Slide Show Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-slideshow-layout/)
62
- * [Slide Show Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-slideshow-layout/)
63
- * [Slide Show Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-slideshow-layout/)
64
- * [Slide Show Gallery with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-slideshow-layout/)
65
- * [Slide Show Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-slideshow-layout/)
66
- * [Slide Show Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-slideshow-layout/)
67
- * [Image Browser Gallery](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-image-browser-layout/)
68
- * [Image Browser Gallery with Lazy Load](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-image-browser-layout/)
69
- * [Image Browser Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-image-browser-layout/)
70
- * [Image Browser Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-image-browser-layout/)
71
- * [Image Browser Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-image-browser-layout/)
72
- * [Image Browser Gallery with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-image-browser-layout/)
73
- * [Image Browser Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-image-browser-layout/)
74
- * [Image Browser Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-image-browser-layout/)
75
- * [Justified Grid Gallery](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-justified-grid-layout/)
76
- * [Justified Grid Gallery with WordPress Gallery Lightbox](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-justified-grid-layout/)
77
- * [Justified Grid Gallery with Pagination](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-justified-grid-layout/)
78
- * [Justified Grid with Lazy Load](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-justified-grid-layout/)
79
- * [Justified Grid with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-justified-grid-layout/)
80
- * [Justified Grid with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-justified-grid-layout/)
81
- * [Justified Grid with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-justified-grid-layout/)
82
- * [Justified Grid Gallery with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-justified-grid-layout/)
83
- * [Justified Grid Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-justified-grid-layout/)
84
- * [Justified Grid Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-justified-grid-layout/)
85
- * [Blog Style Gallery](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-blog-style-layout/)
86
- * [Blog Style Gallery with WordPress Gallery Lightbox](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-blog-style-layout/)
87
- * [Blog Style Gallery with Pagination](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-blog-style-layout/)
88
- * [Blog Style Gallery with Lazy Load](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-blog-style-layout/)
89
- * [Blog Style Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-blog-style-layout/)
90
- * [Blog Style Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-blog-style-layout/)
91
- * [Blog Style Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-blog-style-layout/)
92
- * [Blog Style Gallery with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-blog-style-layout/)
93
- * [Blog Style Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-blog-style-layout/)
94
- * [Blog Style Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-blog-style-layout/)
95
- * [Photo Albums using Compact Album Layout](https://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-title-description-thumbnail-layout/)
96
- * [Photo Albums using Extended Album Layout](https://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-title-description-thumbnail-layout/)
97
-
98
- **[Upgrade to Premium Editions - Wordpress Gallery Plugin](https://gallery-bank.tech-banker.com/)**
99
-
100
- = Key Features in Lite Edition =
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
  * 100% Responsive.
103
  * User Friendly Admin Panel to add Galleries.
104
- * Create & Manage unlimited amount of image galleries on your wordpress site/blog.
105
  * Upload unlimited amount of photos/images in your gallery.
106
  * Images uploaded are stored in a separate directory to avoid mess up with inbuilt wp-uploads folder.
107
  * Photo Metadata is fetched from each image and populates to Title, Description, Alt Text Fields too.
@@ -120,7 +140,7 @@ FooBox was the first lightbox to take responsive layout seriously. Not only does
120
 
121
  Take your media gallery to the next level with [Premium Editions](https://gallery-bank.tech-banker.com/) which gives you 200+ features.
122
 
123
- = Key Features in Premium Editions =
124
 
125
  * All Standard Edition Features as mentioned above.
126
  * Supports Thumbnail, Masonry, Slideshow, Image Browser, Justified Grid, Blog Style, Compact Album, Extended Album.
@@ -155,1330 +175,2241 @@ Take your media gallery to the next level with [Premium Editions](https://galler
155
  * Customize Nivo Lightbox - General Settings, Image Title, Image Description.
156
  * Global Options - Configure Thumbnail Dimensions, Right Click Protection, Language Direction
157
  * Lazy Load Settings - Customize Lazy Load Settings for loading of Images in Galleries and Albums.
158
- * Filter Settings - Customize Filter Settings to create Filterable Gallery for your website/blog.
159
  * Order By Settings - Customize Order By Button.
160
  * Search Box Settings - Customize Search Button to make your galleries also searchable.
161
  * Page Navigation Settings - Customize Page Navigation to make your galleries to divide into pages.
162
  * Watermark Settings - Customize Watermark Settings to make your galleries enabled with watermarking.
163
- * Advertisement Settings - Customize Advertisement Settings to make your wordpress gallery lightbox loaded with advertisement.
164
  * WordPress Gallery Shortcode Wizard for Thumbnail Gallery, Masonry Gallery, Slideshow Gallery, Image Browser Gallery, Justified Grid Gallery Gallery, Blog Style Gallery.
165
- * Roles and Capabilities to let you choose what wordpress roles can edit your galleries.
166
  * Awesome **grid gallery** layouts using compact album.
167
  * Awesome **filterable portfolio** using tags in all layouts.
 
168
  * 24/7 Technical Support
169
 
170
  Visit [here](https://gallery-bank.tech-banker.com/) to upgrade to Premium Editions now.
171
 
172
- = Responsive Gallery =
 
 
173
 
174
  It is being designed keeping in mind the optimal viewing experience across a wide range of devices. At the same time it is coded to work also on old browsers! Whether your visitors are on a Mobile, Laptop or Desktop your Gallery will look great on any device.
175
 
176
- = Unlimited Galleries & Images =
177
 
178
  You can adds unlimited number of images in a single gallery. As you have created a number of image galleries, you can add as many short-codes on your page as you need.
179
 
180
- = Layout Settings =
181
 
182
  Easily Configuration settings for Thumbnails, Album Covers, Different Lightboxes, Slideshow, Pagination etc. for customizing your albums as per your website's look & feel.
183
 
184
- = Easy Setup & Management =
185
 
186
- Create stunning, 100% responsive, SEO-friendly **photo gallery** in minutes. It provides easy-to-manage functionality to rename, upload, copy, add and remove images. Gallery Bank uses also WordPress in-built media uploader as a feature to upload images.
187
 
188
- = Image Gallery =
189
 
190
  It allows you to add multiple images with multiple effects. Image Gallery option allows you to customize the settings for views of images.
191
 
192
- = Masonry Gallery =
193
 
194
- With Gallery Bank, you can implement Masonry Layout. Masonry layouts are a great choice for creating galleries using images with varied dimensions. It works by placing elements in optimal position based on available vertical space.
195
 
196
- = Lightbox displays image =
197
 
198
  Lightbox will appear when you click on the image and it will help you show more detail about your pictures with full description and full size of image.
199
 
 
 
 
 
200
  == Frequently Asked Questions ==
201
 
202
- = How to Add Gallery? =
203
 
204
- * On the Gallery Bank Navigation Panel, select Galleries - Add Gallery.
205
- * Once you reach the page, you would need to click on "Gallery Title & Description" tab at top of the page.
206
- * Gallery Title : In this field, you would need to provide "Gallery Title".
207
- * Gallery Description : In this field, you would need to provide "Gallery Description". It would be displayed when using short-code.
208
- * In order to upload images to the gallery, you would need to click on "Upload Images" tab at top of the page.
209
- * You can upload images from your Local System, WP Media Manager or FTP.
210
- * Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the screen to save the settings.
211
 
212
- = Are there some restrictions for adding images? =
213
 
214
- There is no limit for the amount of images. You can add as many images as you want. Plugin has no limitations on upload of images and galleries.
 
 
 
 
215
 
216
- = When I upgrade to the commercial version, will I lose all the images, galleries and settings that I have made up in the free version of the Gallery? =
217
 
218
- Of course Not. In order to completely remove everything from the database, you have to go Other Settings option in the Gallery Bank menu and choose Delete Tables at Uninstall to **enable**.
219
 
220
- = Do you have any problems with plugin installation or usage? =
221
 
222
- You can use [WordPress Support Forums](https://wordpress.org/support/plugin/gallery-bank/). They will help you to quickly install a gallery plugin. We are always ready to help everyone.
223
 
224
- == Installation ==
 
 
225
 
226
- ### Performing a new installation
227
 
228
- = Minimum requirements. =
229
- * Wordpress 3.1+
230
- * PHP 5.x
231
- * MySQL 5.x
232
 
233
- = Using The WordPress Dashboard =
234
 
235
- 1. Navigate to the 'Add New' in the Plugins Dashboard
236
- 2. Search for 'Gallery Bank'
237
- 3. Click 'Install Now'
238
- 4. Activate the Plugin on the Plugin dashboard
239
 
240
- = Uploading in WordPress Dashboard =
241
 
242
- 1. Navigate to the 'Add New' in the Plugins Dashboard
243
- 2. Navigate to the 'Upload' area
244
- 3. Select `gallery-bank.zip` from your computer
245
- 4. Click 'Install Now'
246
- 5. Activate the Plugin in the Plugin dashboard
247
 
248
- = Using FTP =
249
 
250
- 1. Download `gallery-bank.zip`
251
- 2. Extract the `gallery-bank` directory to your computer
252
- 3. Upload the `gallery-bank` directory to the `/wp-content/plugins/` directory
253
- 4. Activate the Plugin in the Plugin's dashboard
254
 
255
- ** For Mac Users
256
 
257
- 1. Go to your Downloads folder and locate the folder with the Plugin.
258
- 2. Right-click on the folder and select Compress.
259
- 3. Now you have a newly created .zip file which can be installed as described here.
260
 
261
- == Other Notes ==
262
 
263
- = Minimum requirement =
264
- * Wordpress 3.3+
265
- * PHP 5.x
266
- * MySQL 5.x
267
 
268
- If any problem occurs, please contact us at [support@tech-banker.com](mailto:support@tech-banker.com).
269
 
270
- == Screenshots ==
271
 
272
- 1. Manage Galleries
273
- 2. Add Gallery - Gallery Title & Description
274
- 3. Add Gallery - Upload Images
275
- 4. Add Gallery - Upload Images - WP Media Manager
276
- 5. Add Gallery - Upload Images - Upload From FTP
277
- 6. Sort Galleries
278
- 7. Manage Albums
279
- 8. Add Album - Album Title & Description
280
- 9. Add Album - Upload Albums
281
- 10. Sort Albums
282
- 11. Manage Tags
283
- 12. Add Tag
284
- 13. Layout Settings - Thumbnail Gallery - Thumbnails
285
- 14. Layout Settings - Thumbnail Gallery - Gallery Title
286
- 15. Layout Settings - Thumbnail Gallery - Gallery Description
287
- 16. Layout Settings - Thumbnail Gallery - Thumbnail Title
288
- 17. Layout Settings - Thumbnail Gallery - Thumbnail Description
289
- 18. Layout Settings - Masonry Gallery - Thumbnails
290
- 19. Layout Settings - Masonry Gallery - Gallery Title
291
- 20. Layout Settings - Masonry Gallery - Gallery Description
292
- 21. Layout Settings - Masonry Gallery - Thumbnail Title
293
- 22. Layout Settings - Masonry Gallery - Thumbnail Description
294
- 23. Layout Settings - Slideshow Gallery - Thumbnails
295
- 24. Layout Settings - Slideshow Gallery - Gallery Title
296
- 25. Layout Settings - Slideshow Gallery - Gallery Description
297
- 26. Layout Settings - Slideshow Gallery - Thumbnail Title
298
- 27. Layout Settings - Slideshow Gallery - Thumbnail Description
299
- 28. Layout Settings - Image Browser Gallery - Thumbnails
300
- 29. Layout Settings - Image Browser Gallery - Gallery Title
301
- 30. Layout Settings - Image Browser Gallery - Gallery Description
302
- 31. Layout Settings - Image Browser Gallery - Thumbnail Title
303
- 32. Layout Settings - Image Browser Gallery - Thumbnail Description
304
- 33. Layout Settings - Justified Grid Gallery - Thumbnails
305
- 34. Layout Settings - Justified Grid Gallery - Gallery Title
306
- 35. Layout Settings - Justified Grid Gallery - Gallery Description
307
- 36. Layout Settings - Justified Grid Gallery - Thumbnail Title
308
- 37. Layout Settings - Justified Grid Gallery - Thumbnail Description
309
- 38. Layout Settings - Blog Style Gallery - Thumbnails
310
- 39. Layout Settings - Blog Style Gallery - Gallery Title
311
- 40. Layout Settings - Blog Style Gallery - Gallery Description
312
- 41. Layout Settings - Blog Style Gallery - Thumbnail Title
313
- 42. Layout Settings - Blog Style Gallery - Thumbnail Description
314
- 43. Layout Settings - Compact Album Layout - Thumbnails
315
- 44. Layout Settings - Compact Album Layout - Album Title
316
- 45. Layout Settings - Compact Album Layout - Album Description
317
- 46. Layout Settings - Compact Album Layout - Gallery Title
318
- 47. Layout Settings - Compact Album Layout - Gallery Description
319
- 48. Layout Settings - Compact Album Layout - Buttons
320
- 49. Layout Settings - Extended Album Layout - Thumbnails
321
- 50. Layout Settings - Extended Album Layout - Album Title
322
- 51. Layout Settings - Extended Album Layout - Album Description
323
- 52. Layout Settings - Extended Album Layout - Gallery Title
324
- 53. Layout Settings - Extended Album Layout - Gallery Description
325
- 54. Layout Settings - Extended Album Layout - Buttons
326
- 55. Layout Settings - Custom CSS
327
- 56. Lightboxes - Lightcase - Settings
328
- 57. Lightboxes - Lightcase - Image Title
329
- 58. Lightboxes - Lightcase - Image Description
330
- 59. Lightboxes - Fancy Box - Settings
331
- 60. Lightboxes - Fancy Box - Image Title
332
- 61. Lightboxes - Fancy Box - Image Description
333
- 62. Lightboxes - Color Box - Settings
334
- 63. Lightboxes - Color Box - Image Title
335
- 64. Lightboxes - Color Box - Image Description
336
- 65. Lightboxes - Foo Box Free Edition - Settings
337
- 66. Lightboxes - Foo Box Free Edition - Image Title
338
- 67. Lightboxes - Foo Box Free Edition - Image Description
339
- 68. Lightboxes - Nivo Lightbox - Settings
340
- 69. Lightboxes - Nivo Lightbox - Image Title
341
- 70. Lightboxes - Nivo Lightbox - Image Description
342
- 71. General Settings - Global Options
343
- 72. General Settings - Lazy Load Settings
344
- 73. General Settings - Filter Settings
345
- 74. General Settings - Order By Settings
346
- 75. General Settings - Search Box Settings
347
- 76. General Settings - Page Navigation
348
- 77. General Settings - Watermark Settings - Text
349
- 78. General Settings - Watermark Settings - Image
350
- 79. General Settings - Advertisement - Text
351
- 80. General Settings - Advertisement - Image
352
- 81. Shortcodes - Thumbnail Gallery
353
- 82. Shortcodes - Masonry Gallery
354
- 83. Shortcodes - Slideshow Gallery
355
- 84. Shortcodes - Image Browser Gallery
356
- 85. Shortcodes - Justified Grid Gallery
357
- 86. Shortcodes - Blog Style Gallery
358
- 87. Other Settings
359
- 88. Roles & Capabilities
360
- 89. Feature Requests
361
- 90. System Information
362
 
363
- == Changelog ==
364
 
365
- = 4.0.4 =
366
 
367
- * FIX: Lightbox Caption
368
- * TWEAK: PLUploader updated to latest release
369
- * TWEAK: Jquery Validator updated to latest release
370
- * TWEAK: Jquery Modal updated to latest release
371
- * FIX: Major Bugs
372
 
373
- = 4.0.3 =
374
 
375
- * FIX: Lightbox Bugs
376
- * FIX: Code Optimized
377
- * FIX: Obsolete Code Removed
378
- * FIX: Headers Output Bug
379
 
380
- = 4.0.2 =
381
 
382
- * FIX: Lightbox Bug
383
- * TWEAK: New Lightbox Option Added
384
- * FIX: Code Optimized
385
 
386
- = 4.0.1 =
387
 
388
- * FIX: Obsolete Code Removed
389
- * FIX: Major Bugs
390
- * FIX: Install Script Code Optimized
391
- * FIX: Wizard Page Error
392
- * FIX: Code Optimized
393
 
394
- = 4.0.0 =
395
 
396
- * TWEAK: Major Version Release
397
- * TWEAK: Layouts Changed
398
- * TWEAK: Layouts Changed
399
- * TWEAK: Front End Complete Revamped
400
- * TWEAK: Database Optimized
401
- * TWEAK: Security Patch Added
402
- * TWEAK: Modified JS & CSS Functions to only call on own Plugin Page
403
- * TWEAK: Layouts Changed
404
- * TWEAK: Obsolete Code Deleted
405
- * TWEAK: CSS Improved
406
 
 
407
 
408
- = 3.1.40 =
409
 
410
- * FIX: Obsolete Code Removed
411
- * FIX: Proper Sanitization, Escaping, Validation of all Post Calls
412
- * FIX: Obsolete Code Removed
413
- * FIX: Code Optimized
414
 
415
- = 3.1.39 =
416
 
417
- * FIX: Obsolete Code Removed
418
- * FIX: Code Optimized
419
 
420
- = 3.1.37 =
421
 
422
- * FIX: Proper Sanitization, Escaping, Validation of all Post Calls
423
- * FIX: Removal of all function_exists, class_exists, typeof from all the files.
424
- * FIX: Uninstall File moved to root folder and changes done as per wordpress guidelines.
425
- * FIX: Error Reporting in file Removed
426
- * FIX: Auto Updates Removed
427
- * FIX: Curl Calls Removed
428
 
429
- = 3.1.36 =
430
 
431
- * TWEAK: Error Reporting Added
432
- * FIX: Responsive Layouts
433
 
434
- = 3.1.35 =
435
 
436
- * FIX: Major Issue
437
- * TWEAK: Wizard Page Added
438
 
439
- = 3.1.34 =
440
 
441
- * FIX: Major Issue
442
- * FIX: Responsive Layouts
443
 
444
- = 3.1.33 =
445
 
446
- * FIX: Major Issue
447
- * TWEAK: INI Default Values Set
448
- * TWEAK: Compatibility with 4.7.3
449
 
450
- = 3.1.32 =
451
 
452
- * TRANSLATION: Translation Files Updated
453
- * TRANSLATION: Translation Constant Bug
454
 
455
- = 3.1.31 =
456
 
457
- * TWEAK: Obsolete Code removed
458
- * TWEAK: Unused Files removed
459
- * TWEAK: Code Optimized
460
- * TRANSLATION: Translation File Updated
461
 
462
- = 3.1.30 =
463
 
464
- * FIX: Major Issue Related to Re-generate of Thumbnails on Edit Album
465
 
466
- = 3.1.29 =
467
 
468
- * FIX: Major Issue Related to Function Undefined in Header File.
469
 
470
- = 3.1.28 =
471
 
472
- * TWEAK: Improved Functionality
473
 
474
- = 3.1.27 =
475
 
476
- * TWEAK: Security Patch
477
 
478
- = 3.1.26 =
479
 
480
- * TWEAK: Compatibility with 4.6
481
- * TWEAK: Code Optimized
482
 
483
- = 3.1.25 =
484
 
485
- * TWEAK: Code Optimized
486
 
487
- = 3.1.24 =
488
 
489
- * TWEAK: Tooltip Renamed
490
 
491
- = 3.1.23 =
 
 
492
 
493
- * TWEAK: Code Optimized
494
 
495
- = 3.1.22 =
496
 
497
- * FIX: Major Cross Site Scripting Security Issue
498
 
499
- = 3.1.20 =
500
 
501
- * TWEAK: Strings Updated
502
- * TWEAK: Pricing Table Changed
503
- * TWEAK: Code Optimized
504
 
505
- = 3.1.19 =
506
 
507
- * TWEAK: Header Section Updated
508
- * TWEAK: Other Services Content Updated
509
- * TWEAK: Pricing Table Changed
510
 
511
- = 3.1.17 =
512
 
513
- * TWEAK: Other Services Content Updated
514
- * TWEAK: Pricing Table Changed
515
 
516
- = 3.1.16 =
517
 
518
- * FIX: Few CSS Issues
519
- * TWEAK: Pricing Table Changed
520
 
521
- = 3.1.15 =
522
 
523
- * TWEAK: Compatibility with 4.5.3
524
 
525
- = 3.1.14 =
526
 
527
- * FIX: Few CSS Issues.
528
 
529
- = 3.1.13 =
530
 
531
- * TWEAK: Code Optimized
532
 
533
- = 3.1.9 =
534
 
535
- * TWEAK: Compatibility with 4.5.2
536
 
537
- = 3.1.8 =
538
 
539
- * FIX: Few CSS Issues
540
 
541
- = 3.1.7 =
542
 
543
- * TWEAK: Compatibility with 4.5.1
544
- * FIX: Few CSS Issues
545
 
546
- = 3.1.6 =
547
 
548
- * TWEAK: Compatibility with 4.5
549
 
550
- = 3.1.5 =
551
 
552
- * FIX: Few CSS Issues
553
 
554
- = 3.1.1 =
555
 
556
- * FIX: Database Issues
557
- * TWEAK: Code Optimized
558
 
559
- = 3.1.0 =
560
 
561
- * TWEAK: Major Version Release
562
- * TWEAK: Code Optimized
563
- * FIX: Major Bugs
564
- * FIX: Lightbox Issues
565
- * FIX: Masonry Gallery Layout Issues
566
- * TWEAK: Removed Font Icons and Replaced with Compatible Icons
567
- * TRANSLATION: Persian Language Added
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568
 
569
- = 3.0.456 =
570
 
571
- * FIX: Few Urgent Issues.
572
 
573
- = 3.0.455 =
574
 
575
- * FIX: Few Minor Issues.
576
 
577
- = 3.0.454 =
578
 
579
- * TWEAK: Compatibility with 4.4.2
580
 
581
- = 3.0.453 =
582
 
583
- * FIX: Few Urgent Issues.
584
 
585
- = 3.0.452 =
586
 
587
- * FIX: Few CSS Issues.
588
 
589
- = 3.0.451 =
590
 
591
- * TWEAK: Compatibility with 4.4.1
592
 
593
- = 3.0.450 =
594
 
595
- * FIX: Few CSS Issues.
596
 
597
- = 3.0.449 =
598
 
599
- * FIX: Few Urgent Issues.
600
 
601
- = 3.0.448 =
602
 
603
- * FIX: Few Urgent Issues.
604
 
605
- = 3.0.447 =
606
 
607
- * TWEAK: Compatibility with 4.4
608
 
609
- = 3.0.446 =
610
 
611
- * FIX: Few CSS Issues.
612
 
613
- = 3.0.445 =
614
 
615
- * FIX: Few CSS Issues.
616
 
617
- = 3.0.444 =
618
 
619
- * FIX: Few Urgent Issues.
620
 
621
- = 3.0.343 =
622
 
623
- * FIX: Few Minor Issues.
624
 
625
- = 3.0.442 =
626
 
627
- * FIX: Few CSS Issues.
628
 
629
- = 3.0.441 =
630
 
631
- * FIX: Few Urgent Issues.
632
 
633
- = 3.0.340 =
634
 
635
- * FIX: Few Minor Issues.
636
 
637
- = 3.0.339 =
638
 
639
- * FIX: Few Urgent Issues.
640
 
641
- = 3.0.338 =
642
 
643
- * TWEAK: Database Engine updated.
644
 
645
- = 3.0.337 =
646
 
647
- * FIX: Few Urgent Issues.
648
 
649
- = 3.0.336 =
650
 
651
- * FIX: Few Minor Issues.
652
 
653
- = 3.0.335 =
654
 
655
- * FIX: Few Minor Issue.
656
 
657
- = 3.0.334 =
658
 
659
- * TWEAK: Album Description Shown under Album Title
660
 
661
- = 3.0.333 =
662
 
663
- * FIX: Few Urgent Issues.
664
 
665
- = 3.0.332 =
666
 
667
- * FIX: Delete Image Issue.
668
 
669
- = 3.0.331 =
670
 
671
- * FIX: Pretty Photo Title & Description Issue.
672
 
673
- = 3.0.330 =
674
 
675
- * FIX: Few Security Issues.
676
- * TWEAK: 2.2.2 Version used.
677
 
678
- = 3.0.229 =
679
 
680
- * TWEAK: Compatibility with 4.3
681
- * TWEAK: Changed variables to avoid confliction with Next Gen and Contact Bank plugins.
682
- * FIX: Prettyphoto XSS Security Issue.
683
 
684
- = 3.0.228 =
685
 
686
- * FIX: Few Minor Issues
687
 
688
- = 3.0.227 =
689
 
690
- * TWEAK: Compatibility with 4.2.4
691
 
692
- = 3.0.226 =
693
 
694
- * FIX: Few Minor Issues
695
 
696
- = 3.0.225 =
697
 
698
- * TWEAK: Compatibility with 4.2.3
699
 
700
- = 3.0.224 =
701
 
702
- * FIX: Auto Update Issue
703
 
704
- = 3.0.223 =
705
 
706
- * FIX: Few Minor Issues.
707
 
708
- = 3.0.222 =
709
 
710
- * FIX: Few Urgent Issues.
711
 
712
- = 3.0.221 =
713
 
714
- * FIX: Minor Issues.
715
- * TWEAK: Premium Editions Section Updated.
716
 
717
- = 3.0.120 =
718
 
719
- * FIX: Major Issue Regarding Rss Feeds.
720
 
721
- = 3.0.119 =
722
 
723
- * FIX: Few Urgent Issues.
724
 
725
- = 3.0.118 =
726
 
727
- * TRANSLATION: Few Languages Updated.
728
- * FIX: Minor CSS Issues.
729
 
730
- = 3.0.116 =
731
 
732
- * TRANSLATION: Few Languages Updated
733
- * FIX: Minor CSS Issues.
734
 
735
- = 3.0.115 =
736
 
737
- * TWEAK: Added Compatibility with 4.2.2 WordPress.
738
 
739
- = 3.0.114 =
740
 
741
- * TWEAK: Added Compatibility with 4.2.1 WordPress.
742
- * FIX: Few Minor Issues
743
 
744
- = 3.0.113 =
745
 
746
- * TWEAK: Added Compatibility with 4.2 WordPress.
747
- * FIX: Few Minor Issues
748
 
749
- = 3.0.112 =
750
 
751
- * TWEAK: Added Compatibility with 4.1.2 WordPress.
752
 
753
- = 3.0.111 =
754
 
755
- * FIX: Few Issues.
756
- * TRANSLATION: Languages Updated.
757
 
758
- = 3.0.10 =
759
 
760
- * FIX: Issue related to datatables.
761
 
762
- = 3.0.109 =
763
 
764
- * FEATURE: Implemented new feature of calculating images size according server configuration.
765
- * FIX: Minor Issues.
766
 
767
- = 3.0.108 =
768
 
769
- * FIX: Minor Issues.
770
 
771
- = 3.0.107 =
772
 
773
- * FIX: Minor Issues.
774
- * TWEAK: Premium Editions Section Updated.
775
 
776
- = 3.0.106 =
777
 
778
- * FIX: Minor Issues.
779
- * TWEAK: Other Services Section Updated.
780
- * TWEAK: Premium Editions Section Updated.
781
 
782
- = 3.0.105 =
783
 
784
- * TWEAK: Demo Gallery added by default.
785
 
786
- = 3.0.104 =
787
 
788
- * TWEAK: Default Shortcode Layout changed from Masonry to Thumbnails.
789
 
790
- = 3.0.103 =
791
 
792
- * FEATURE: Added new feature of Feature Request.
793
- * TWEAK: Shortcode Editor Redesigned.
794
 
795
- = 3.0.102 =
796
 
797
- * FIX: Minor Vulnerability Issue related to shortcode as pointed by Goblin Research.
798
 
799
- = 3.0.101 =
800
 
801
- * FIX: Major Issue related to uploader.
802
 
803
- = 3.0.100 =
804
 
805
- * TWEAK: Implemented New Feature to display selected Albums.
806
 
807
- = 3.0.99 =
808
 
809
- * TRANSLATION: Korean Language Updated.
810
- * TWEAK: Udpated Po & Mo Files for all Languages.
811
- * TRANSLATION: Added New Languages
812
 
813
- = 3.0.98 =
814
 
815
- * TWEAK: Recommendation section updated.
816
 
817
- = 3.0.97 =
818
 
819
- * FIX: compatibility issue with WP Lightbox 2 Plugin.
820
 
821
- = 3.0.96 =
822
 
823
- * FIX: compatibility issue with woocommerce plugin.
824
- * FIX: Layout issues.
825
- * FIX: White spacing issue.
826
- * TWEAK: Unset plugin update scheduler on plugin uninstall.
827
 
828
- = 3.0.95 =
829
 
830
- * FIX: Major Issue Related to PL Uploader.
831
- * FIX: Code for Plugins using Versions prior to 4.0
832
 
833
- = 3.0.94 =
834
 
835
- * FIX: Few Issues
836
- * FIX: Menus
837
- * FEATURE: Implemented New Feature - Automatic Plugin Update Enable/Disable.
838
 
839
- = 3.0.93 =
840
 
841
- * TWEAK: Removed unwanted code
842
- * FEATURE: New Uploader Introduced.
843
- * FEATURE: New Layout Introduced for uploader.
844
- * TWEAK: Thumbs View in Uploader.
845
- * TWEAK: Add, Edit Gallery Layout changed.
846
- * TWEAK: Updated JS files.
847
- * TRANSLATION: Slovenian Language updated.
848
 
849
- = 3.0.91 =
850
 
851
- * TWEAK: Recommendation section updated.
852
- * TRANSLATION: Japanese Language updated.
853
 
854
- = 3.0.90 =
855
 
856
- * FIX: Major security Issue regarding image uploader.
857
 
858
- = 3.0.89 =
859
 
860
- * TWEAK: Pretty Photo lightbox license updated.
861
 
862
- = 3.0.88 =
863
 
864
- * TWEAK: Pricing Changed
865
 
866
- = 3.0.86 =
867
 
868
- * TWEAK: Added Compatibility with 4.1 WordPress.
869
- * FIX: Issue Related to Galleries Display.
870
 
871
- = 3.0.85 =
872
 
873
- * TWEAK: Changed variables to avoid confliction with other plugins.
874
 
875
- = 3.0.84 =
876
 
877
- * FIX: Minor Issues Related to Galleries Display
878
 
879
- = 3.0.83 =
880
 
881
- * TWEAK: Added Update Message for New Versions.
882
 
883
- = 3.0.82 =
884
 
885
- * TWEAK: Major Issue Related to Multisite Wordpress.
886
 
887
- = 3.0.81 =
888
 
889
- * TWEAK: Multisite Compatibility Added.
890
- * TWEAK: Added Compatibility with 4.0.1 WordPress
891
- * TWEAK: Updated Pricing Table
892
 
893
- = 3.0.80 =
894
 
895
- * FIX: Conflict with JetPack
896
- * TWEAK: Optimized Code
897
 
898
- = 3.0.79 =
899
 
900
- * TWEAK: Udpated Po & Mo Files for all Languages
901
- * TWEAK: Updated Css
902
- * TWEAK: Optimized Code
903
 
904
- = 3.0.78 =
905
 
906
- * TWEAK: Udpated Po & Mo Files
907
- * TWEAK: Updated Css
908
- * TWEAK: Updated Our Services Section
909
- * TWEAK: Optimized Code
910
- * TWEAK: Removed unwanted Files
911
 
912
- = 3.0.76 =
913
 
914
- * FIX: CSS Conflictions Issue after 3.0.75 update
915
- * FIX: Js Conflictions
916
- * TWEAK: Readme.txt Updated
917
 
918
- = 3.0.75 =
919
 
920
- * TWEAK: Demo Links Updated as per New Website
921
- * TWEAK: Readme.txt Changed as per New Website
922
- * TWEAK: Recommended Section Added
923
- * TWEAK: Other Services Section Added
924
- * TWEAK: Pricing Section Updated
925
- * TWEAK: Major Release before 4.0 update
926
 
 
927
 
928
- = 3.0.75 =
929
 
930
- * FIX: Masonry Colum Width Issue
931
- * FIX: Overlapping Masonry Gallery Layout
932
 
933
- = 3.0.74 =
934
 
935
- * TWEAK: Banner Updated
936
 
937
- = 3.0.73 =
938
 
939
- * TWEAK: Banner Updated
940
 
941
- = 3.0.72 =
942
 
943
- * TRANSLATION: Danish Language Updated
944
- * TWEAK: Banner Updated
945
 
946
- = 3.0.71 =
947
 
948
- * TWEAK: Banner Updated
949
 
950
- = 3.0.70 =
951
 
952
- * FIX: Major Security Issue XSS Vulnerability related to Album Sorting
953
 
954
- = 3.0.69 =
955
 
956
- * TRANSLATION: Updated Existing Language - Romanian
957
- * TRANSLATION: Updated Existing Language - Indonesian
958
- * FIX: Roles Issue
959
 
960
- = 3.0.68 =
961
 
962
- * TRANSLATION: Added New Language - Croatian
963
- * TRANSLATION: Added New Language - Norwegian
964
- * TWEAK: Banner Updated
965
 
966
- = 3.0.67 =
967
 
968
- * TRANSLATION: Added New Language - Greek
969
- * TRANSLATION: Updated Existing Language - Indonesian
970
 
971
- = 3.0.66 =
972
 
973
- * TWEAK: Compatibility Test with 4.0
974
- * TWEAK: Banner Updated
975
 
976
- = 3.0.65 =
977
 
978
- * TWEAK: Banner Updated
979
 
980
- = 3.0.64 =
981
 
982
- * TWEAK: Banner Updated
983
 
984
- = 3.0.63 =
985
 
986
- * FIX: Major Security Issue.
987
 
988
- = 3.0.62 =
989
 
990
- * TWEAK: Banner Updated
991
 
992
- = 3.0.61 =
993
 
994
- * FIX: Major Security Issue related to Upload.php file
995
 
996
- = 3.0.59 =
997
 
998
- * TRANSLATION: Chinese Language Updated
999
 
1000
- = 3.0.56 =
1001
 
1002
- * TRANSLATION: Slovak Language Updated
1003
 
1004
- = 3.0.54 =
1005
 
1006
- * TWEAK:Few Possible Security Issues Addressed
1007
 
1008
- = 3.0.53 =
1009
 
1010
- * FIX: Language Issues
1011
 
1012
- = 3.0.52 =
1013
 
1014
- * TRANSLATION: Danish Language Updated
1015
 
1016
- = 3.0.51 =
1017
 
1018
- * TWEAK: Social Icons Added to Lightbox
1019
 
1020
- = 3.0.50 =
1021
 
1022
- * TWEAK:Few Possible Security Issues Addressed
1023
 
1024
- = 3.0.49 =
1025
 
1026
- * TRANSLATION: Polish Language Updated
1027
 
1028
- = 3.0.48 =
1029
 
1030
- * TRANSLATION: Czech Language Updated
1031
 
1032
- = 3.0.47 =
1033
 
1034
- * TWEAK: Advanced Security for Plugin Implemented
1035
 
1036
- = 3.0.46 =
1037
 
1038
- * TRANSLATION: Hungarian Language Updated
1039
 
1040
- = 3.0.45 =
1041
 
1042
- * TWEAK: Banner Updated
1043
 
1044
- = 3.0.44 =
1045
 
1046
- * TRANSLATION: Arabic Language Updated
1047
 
1048
- = 3.0.43 =
1049
 
1050
- * TWEAK: Banner Updated
1051
 
1052
- = 3.0.42 =
1053
 
1054
- * TRANSLATION: Thai Language Updated
1055
 
1056
- = 3.0.41 =
1057
 
1058
- * TWEAK: Banner Updated
1059
 
1060
- = 3.0.40 =
1061
 
1062
- * FIX: Issue with Menu Links shown to Subscriber and other roles.
1063
 
1064
- = 3.0.39 =
1065
 
1066
- * TRANSLATION: Russian Language Updated
1067
 
1068
- = 3.0.38 =
1069
 
1070
- * TWEAK: Banner Updated
1071
 
1072
- = 3.0.37 =
1073
 
1074
- * FIX: Major Issue related to Saving of Images
1075
- * FIX: Major Issue related to Editing of existing Albums
1076
 
1077
- = 3.0.36 =
1078
 
1079
- * FIX: Issue related to Saving of Albums
1080
 
1081
- = 3.0.35 =
1082
 
1083
- * FIX: Major Security Issue related to Upload.php file
1084
 
1085
- = 3.0.34 =
1086
 
1087
- * FIX: Issue Related to Set as Album
1088
 
1089
- = 3.0.33 =
1090
 
1091
- * FIX: Broken Add New Album Link.
1092
 
1093
- = 3.0.32 =
1094
 
1095
- * FIX: Major Issue with saving of Data
1096
 
1097
- = 3.0.31 =
1098
 
1099
- * TWEAK: Unwanted Banners Removed
1100
 
1101
- = 3.0.30 =
1102
 
1103
- * TRANSLATION: Turkish Language Updated
1104
- * FIX: Delete Images Issue
1105
 
1106
- = 3.0.29 =
1107
 
1108
- * TWEAK: Added Functionality to support Bulk Images Upload
1109
 
1110
- = 3.0.28 =
1111
 
1112
- * TWEAK: CK Editor Compatibility Added
1113
 
1114
- = 3.0.27 =
1115
 
1116
- * TWEAK: Unwanted Banners Removed
1117
 
1118
- = 3.0.26 =
1119
 
1120
- * TRANSLATION: New Language - Belarusian
1121
- * TRANSLATION: Language Updated - Russian
1122
 
1123
- = 3.0.25 =
1124
 
1125
- * TRANSLATION: Languages Updated
1126
 
1127
- = 3.0.24 =
1128
 
1129
- * TWEAK: Banner Updated
1130
 
1131
- = 3.0.23 =
1132
 
1133
- * TWEAK: Licenses Updated
1134
 
1135
- = 3.0.22 =
1136
 
1137
- * FIX: Png Image Issue.
1138
- * TRANSLATION: Language Updated - Hebrew
1139
 
1140
- = 3.0.21 =
1141
 
1142
- * TWEAK: New Layout Introduced
1143
- * TWEAK: Help Video Added
1144
- * FIX: Issue with Title & Description
1145
- * TWEAK: Compatibility with 3.9
1146
- * TRANSLATION: Language Updated - Finnish
1147
 
1148
- = 3.0.20 =
1149
 
1150
- * FIX: Issues
1151
- * TWEAK: Compatibility with 3.9
1152
 
1153
- = 3.0.19 =
1154
 
1155
- * TRANSLATION: Language Updated - Finnish
1156
 
1157
- = 3.0.18 =
1158
 
1159
- * FEATURE: New Help Popup Introduced
1160
- * TWEAK: Compatiblity with 3.8.3
1161
 
1162
- = 3.0.17 =
1163
 
1164
- * TRANSLATION: Language Updated - German
1165
 
1166
- = 3.0.16 =
1167
 
1168
- * TRANSLATION: Language Updated - Italian
1169
 
1170
- = 3.0.15 =
1171
 
1172
- * TRANSLATION: New Language Added - Estonian
1173
 
1174
- = 3.0.14 =
1175
 
1176
- * TRANSLATION: Language Updated - Portuguese
1177
 
1178
- = 3.0.13 =
1179
 
1180
- * TRANSLATION: Language Updated - French
1181
 
1182
- = 3.0.12 =
1183
 
1184
- * TRANSLATION: Language Updated - Swedish
1185
 
1186
- = 3.0.11 =
1187
 
1188
- * TWEAK: Removed Unwanted Banners
1189
 
1190
- = 3.0.10 =
1191
 
1192
- * TRANSLATION: New Language Added - Ukrainian
1193
 
1194
- = 3.0.8 =
1195
 
1196
- * TRANSLATION: Dutch Language Updated
1197
- * TWEAK: Uninstall Hook Removed
1198
 
1199
- = 3.0.7 =
1200
 
1201
- * TRANSLATION: Updated Languages
1202
- * FIX: Issue Related to Pl Uploader which stops WP Media
1203
 
1204
- = 3.0.6 =
1205
 
1206
- * TRANSLATION: Updated Languages
1207
- * FIX: Few Issue Related to Lightbox
1208
- * TWEAK: Request for Translation of New Languages
1209
 
1210
- = 3.0.5 =
1211
 
1212
- * TRANSLATION: Updated Languages
1213
- * FIX: Few Issue Related to Lightbox
1214
- * TWEAK: Checked If Permissions are Set to Directory
1215
 
1216
- = 3.0.4 =
1217
 
1218
- * TRANSLATION: Updated Languages
1219
- * FIX: Few Issue Related to Thumbnails generation
1220
- * FIX: Copy Images for existing albums to new folder
1221
- * FIX: Problem of loosing images when upgrading to latest versions.
1222
 
1223
- = 3.0.3 =
1224
 
1225
- * TRANSLATION: Updated Spanish Languages
1226
- * FIX: Few Issue Related to Thumbnails generation
1227
- * TWEAK: Removed unwanted stuff
1228
 
1229
- = 3.0.2 =
1230
 
1231
- * TRANSLATION: Updated all Languages
1232
- * FIX: Few Issue Related to Thumbnails
1233
- * TWEAK: Added Warning Permissions Message for Thumbnails
1234
 
1235
- = 3.0.1 =
1236
 
1237
- * TRANSLATION: Updated all Languages
1238
- * FIX: Few Issues Related to Database Upgrade from Previous versions
1239
- * FEATURE: Add New Page to show how to add Shortcodes.
1240
 
1241
- = 3.0.0 =
1242
 
1243
- * Major Version Release
1244
- * FEATURE: Images are now being saved in itself instead of WP Uploads.
1245
- * FEATURE: Thumbs are now created by the system itself rather than any 3rd Party script like Timbthumb etc.
1246
- * FEATURE: Improved Performance
1247
- * FEATURE: Improved Database to manage
1248
- * FEATURE: Indexing on Tables to grab results quickly
1249
- * FEATURE: Highly Optimized Code
1250
- * FEATURE: Responsive Layout
1251
- * FEATURE: Easily adaptable environment for any device.
1252
- * FEATURE: Bulk Upload of Images
1253
- * FEATURE: New Short-code Wizard
1254
- * FEATURE: Url Redirect to redirect on click of an image.
1255
- * FEATURE: Compact Albums
1256
- * FEATURE: Extended Albums
1257
- * FEATURE: Basic Thumbnail Gallery
1258
- * FEATURE: Masonry Gallery
1259
- * FEATURE: List Album Format
1260
- * FEATURE: Grid Album Format
1261
- * FEATURE: Images in Row for displaying number of images per row
1262
- * FEATURE: Albums in Row for displaying number of albums per row
1263
- * FEATURE: Albums in Row for displaying number of albums per row
1264
- * FEATURE: Filmstrip Gallery Format(Premium Versions)
1265
- * FEATURE: Slideshow Gallery(Premium Versions)
1266
- * FEATURE: Special Effects on Images & Albums(Premium Versions)
1267
- * FEATURE: Animation Effects on Images & Albums(Premium Versions)
1268
- * FEATURE: Bulk Deletion of Images(Premium Versions)
1269
- * FEATURE: Sorting of Images(Premium Versions)
1270
- * FEATURE: Sorting of Albums(Premium Versions)
1271
- * FEATURE: Social Sharing(Premium Versions)
1272
- * FEATURE: Commenting on Images(Premium Versions)
1273
- * FEATURE: Widgets(Premium Versions)
1274
- * FEATURE: Tags for each Image to make Filerable Gallery Album(Premium Versions)
1275
- * FEATURE: Bulk Deletion of Albums(Premium Versions)
1276
- * FEATURE: Purging Albums and Images(Premium Versions)
1277
- * FEATURE: Restore Factory Settings(Premium Versions)
1278
- * FEATURE: Global Settings(Premium Versions)
1279
- * FEATURE: Thumbnail Settings(Premium Versions)
1280
- * FEATURE: Album Settings(Premium Versions)
1281
- * FEATURE: Lightbox Settings(Premium Versions)
1282
- * FEATURE: Different Lightboxes like FooBox,ColorBox,FancyBox2,Lightbox2,Custom GB Lightbox,Pretty Photo(Premium Versions)
1283
- * FEATURE: Pagination(Premium Versions)
1284
- * FEATURE: Filter Settings(Premium Versions)
1285
- * FEATURE: Roles & Capabilities(Premium Versions)
1286
- * FIX: Wrong images displayed when videos added.
1287
 
1288
- = 2.0.26 =
1289
 
1290
- * TWEAK: Minor Database update before Major Version Release
1291
 
1292
- = 2.0.25 =
1293
 
1294
- * FIX: few issues with Wordpress 3.8.1 compatibility
1295
 
1296
- = 2.0.24 =
1297
 
1298
- * FIX: Issue Related to Front View
1299
- * FIX: Issue Related to Front View Albums
1300
- * FIX: Issue Related to Front View Albums with Images
1301
- * FIX: Issue Related to Css Display
1302
- * TWEAK: Lightbox Updated
1303
 
1304
- = 2.0.23 =
1305
 
1306
- * FIX: Few issues with Wordpress 3.8 compatibility
1307
 
1308
- = 2.0.22 =
1309
 
1310
- * TWEAK: Option Added to Gather Data for Testing Purposes for Better Compatibility
1311
 
1312
- = 2.0.20 =
1313
 
1314
- * FIX: Security Issues
1315
- * FIX: Cross Scripting Issues
1316
- * TWEAK: Compatibility with 3.7
1317
 
1318
- = 2.0.19 =
1319
 
1320
- * TWEAK: Introducing Jquery Masonry
1321
- * TWEAK: Removed Timbthumb
1322
 
1323
- = 2.0.16 =
1324
 
1325
- * TRANSLATION: Languages Updated
1326
 
1327
- = 2.0.15 =
1328
 
1329
- * FIX: issue with Saving Albums
1330
 
1331
- = 2.0.14 =
1332
 
1333
- * TWEAK:Introducing Videos
1334
- * FIX: Thumbnails issue
1335
- * FIX: Timbthumb issue
1336
 
1337
- = 2.0.11 =
1338
 
1339
- * FIX: Description of Images in Internet Explorer
1340
 
1341
- = 2.0.9 =
1342
 
1343
- * FIX: Menus visible to Users other than Administrator
1344
 
1345
- = 2.0.8 =
1346
 
1347
- * TRANSLATION: Languages Updated
1348
 
1349
- = 2.0.7 =
1350
 
1351
- * FIX: Plugin Confliction with JetPack.
1352
- * TRANSLATION: Languages Updated
1353
 
1354
- = 2.0.6 =
1355
 
1356
- * TWEAK: Documentation Updated
1357
- * TRANSLATION: Languages Updated
1358
- * FIX: CSS Conflicts.
1359
 
1360
- = 2.0.5 =
1361
 
1362
- * FEATURE: New Functionality Introduced
1363
- * TWEAK: Documentation Added
1364
- * FIX: Js Conflicts
1365
 
1366
- = 2.0.4 =
1367
 
1368
- * FIX: Plugin Update Conflicts.
1369
- * FIX: Browser Conflicts.
1370
- * FIX: Js Conflicts.
1371
 
1372
- = 2.0.3 =
1373
 
1374
- * FIX: Plugin Update Conflicts.
1375
 
1376
- = 2.0.2 =
1377
 
1378
- * FIX: CSS Conflicts.
1379
- * FIX: Layout Break in sites.
1380
- * FIX: Thumbnails Issue.
1381
- * TRANSLATION: Languages updated
1382
 
1383
- = 2.0.1 =
1384
 
1385
- * FIX: CSS Conflicts.
1386
- * Timbthumb 2.8.11 Updated
1387
 
1388
- = 2.0.0 =
1389
 
1390
- * FEATURE: Introduction of New Version 2.0
1391
- * TWEAK: Introduction of Pagination for Images
1392
- * TWEAK: Bulk Delete of Images in Album
1393
- * TWEAK: General Settings for all Albums
1394
- * TWEAK: Individual Settings for Album
1395
- * FEATURE: New Design & Style
1396
 
1397
- = 1.8.7 =
1398
 
1399
- * FIX: Timbthumb Thumbnails Issue.
1400
 
1401
- = 1.8.6 =
1402
 
1403
- * TWEAK: Readme.txt Updated
1404
- * TRANSLATION: Languages Updated
1405
 
1406
- = 1.8.5 =
1407
 
1408
- * FIX: Timbthumb Quality Issues.
1409
- * FIX: Formatting Issue Resolved
1410
 
1411
- = 1.8.4 =
1412
 
1413
- * TWEAK: Introduced Sorting of Images in an Album
1414
- * FIX: Album Formatting conflict.
1415
 
1416
- = 1.8.3 =
1417
 
1418
- * TWEAK:Introduced Timthumb for Images
1419
- * FIX: Title Alignment.
1420
- * FIX: Images were disorted.
1421
 
1422
- = 1.8.2 =
1423
 
1424
- * FIX: Title Name on Front View & Albums were incorrect
1425
- * FIX: Title Alignment.
1426
- * FIX: Images were disorted.
1427
 
1428
- = 1.8.1 =
1429
 
1430
- * TWEAK: Titles were not saved properly
1431
- * FIX: Few issues.
1432
 
1433
- = 1.8.0 =
1434
 
1435
- * TRANSLATION: Added 7 new Languages.
1436
 
1437
- = 1.7.9 =
1438
 
1439
- * FIX: Issue with Saving Logic.
1440
 
1441
- = 1.7.8 =
1442
 
1443
- * FIX: Issue with Album creation.
1444
 
1445
- = 1.7.5 =
1446
 
1447
- * TWEAK: Possible to upload upto 300 images at 1 instance in an album.
1448
- * TRANSLATION: All Languages updated
1449
 
1450
- = 1.7 =
1451
 
1452
- * TWEAK:Introducing Jquery Masonry
1453
- * TWEAK: Uninstall Hook Removed
1454
 
1455
- = 1.6 =
1456
 
1457
- * FIX: Issue of Thumbnail Disorted Images.
1458
- * FIX: Issue of No Album images shown in case of admin not logged in.
1459
- * TWEAK: Uninstall Hook Removed
1460
 
1461
- = 1.5 =
1462
 
1463
- * TWEAK:Album Covers Introduced
1464
- * FIX: Css Conflicts
1465
- * TRANSLATION: All Translations Updated
1466
 
1467
- = 1.4 =
1468
 
1469
- * FIX: Css Conflicts
1470
- * TRANSLATION: Languages Added Russian, Cezch, Hebrew & Serbian
1471
 
1472
- = 1.3 =
1473
 
1474
- * FIX: Css Conflicts
1475
- * TRANSLATION: Languages Updated
1476
 
1477
- = 1.2 =
1478
 
1479
- * TWEAK: Lightbox logic changed
1480
- * FIX: Thumbnails
1481
 
1482
- = 1.0 =
1483
 
1484
- * Initial Version Release
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Gallery - Photo Gallery - Image Gallery - Photo Albums - WordPress Gallery Plugin ===
2
+ Contributors: gallery-bank, contact-banker
3
+ Tags: album, gallery, gallery widget, image gallery, images, masonry gallery, media gallery, photo album, photo gallery, portfolio, responsive gallery, wordpress gallery, wordpress gallery plugin
4
  Requires at least: 3.4
5
  Tested up to: 4.8
6
  Stable Tag: trunk
7
+ License: GPLv2 or later
8
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
10
+ Photo Gallery Plugin for WordPress. Creates elegant responsive gallery widget, image gallery, media gallery, portfolio gallery and albums.
11
 
12
  == Description ==
13
 
14
+ ### Best Gallery WordPress Plugin
15
 
16
+ https://youtu.be/5tOPGePG9Dw
17
+
18
+ * **[Gallery Bank - Responsive Image Gallery Plugin](https://gallery-bank.tech-banker.com/)**
19
+ * **[Detailed Features - Responsive Photo Gallery Plugin](http://gallery-bank.tech-banker.com/features/detailed-features/)**
20
+ * **[Front End Demos - Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/)**
21
+ * **[Back End Demos- Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/backend-demos/)**
22
+ * **[Documentation - Best Photo Gallery WordPress Plugin](https://gallery-bank.tech-banker.com/documentation/)**
23
+ * **[Upgrade to Premium Editions - Photo Gallery Plugin for WordPress](https://gallery-bank.tech-banker.com/pricing/)**
24
+
25
+ ### Best WordPress Portfolio Plugin
26
 
27
  [**WordPress Photo Gallery Plugin**](https://gallery-bank.tech-banker.com/) is one of the Best WordPress Gallery Plugin designed to create elegant and beautiful **photo gallery** and **photo albums** using **Masonry Gallery Layouts**, **Thumbnail Gallery Layouts**, **Compact Album Layouts** and **Extended Album Layouts** along with Special Effects and Animation Effects.
28
 
30
 
31
  **WordPress Photo Gallery Plugin** provides a powerful photo gallery engine for uploading and managing photo albums of images, with the ability to batch upload, delete, rearrange and sort images.
32
 
33
+ It is the best **Gallery Plugin for WordPress** which is being regularly updated for new features and its simplicity of usage along with efficient functionality makes it a perfect choice among photographers to have a stunning look for their sites.
34
+
35
+ There are also Premium Editions for the Gallery Plugin for WordPress with much more useful pro features available.
36
+
37
+ Gallery Bank has been downloaded over 25,00,000 times. Smart photographers, designers, and developers love Gallery Bank, and you will love too!
38
+
39
+ > ### WordPress Image Gallery Plugin - Live Demos
40
+
41
+ * **[Thumbnail Layout - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-thumbnail-layout/)**
42
+ * **[Thumbnail Layout with WordPress Gallery Lightbox - Gallery Wordpress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-thumbnail-layout/)**
43
+ * **[Thumbnail Layout with Pagination - Photo Gallery WordPress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-thumbnail-layout/)**
44
+ * **[Thumbnail Layout with Lazy Load - Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-thumbnail-layout/)**
45
+ * **[Thumbnail Layout with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-thumbnail-layout/)**
46
+ * **[Thumbnail Layout with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-thumbnail-layout/)**
47
+ * **[Thumbnail Layout with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-thumbnail-layout/)**
48
+ * **[Thumbnail Layout with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-thumbnail-layout/)**
49
+ * **[Thumbnail Layout with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-thumbnail-layout/)**
50
+ * **[Thumbnail Layout with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-thumbnail-layout/)**
51
+ * **[Masonry Gallery - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-masonry-layout/)**
52
+ * **[Masonry Gallery with WordPress Gallery Lightbox - Gallery Wordpress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-masonry-layout/)**
53
+ * **[Masonry Gallery with Pagination - Photo Gallery WordPress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-masonry-layout/)**
54
+ * **[Masonry Gallery with Lazy Load - Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-masonry-layout/)**
55
+ * **[Masonry Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-masonry-layout/)**
56
+ * **[Masonry Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-masonry-layout/)**
57
+ * **[Masonry Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-masonry-layout/)**
58
+ * **[Masonry Gallery with Watermark](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-masonry-layout/)**
59
+ * **[Masonry Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-masonry-layout/)**
60
+ * **[Masonry Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-masonry-layout/)**
61
+ * **[Slideshow Gallery - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-slideshow-layout/)**
62
+ * **[Slideshow Gallery with Lazy Load - Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-slideshow-layout/)**
63
+ * **[Slideshow Gallery with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-slideshow-layout/)**
64
+ * **[Slideshow Gallery with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-slideshow-layout/)**
65
+ * **[Slideshow Gallery with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-slideshow-layout/)**
66
+ * **[Slideshow Gallery with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-slideshow-layout/)**
67
+ * **[Slideshow Gallery with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-slideshow-layout/)**
68
+ * **[Slideshow Gallery with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-slideshow-layout/)**
69
+ * **[Image Browser Layout - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-image-browser-layout/)**
70
+ * **[Image Browser Layout with Lazy Load - Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-image-browser-layout/)**
71
+ * **[Image Browser Layout with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-image-browser-layout/)**
72
+ * **[Image Browser Layout with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-image-browser-layout/)**
73
+ * **[Image Browser Layout with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-image-browser-layout/)**
74
+ * **[Image Browser Layout with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-image-browser-layout/)**
75
+ * **[Image Browser Layout with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-image-browser-layout/)**
76
+ * **[Image Browser Layout with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-image-browser-layout/)**
77
+ * **[Justified Grid Layout - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-justified-grid-layout/)**
78
+ * **[Justified Grid Layout with WordPress Gallery Lightbox - Gallery Wordpress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-justified-grid-layout/)**
79
+ * **[Justified Grid Layout with Pagination - Photo Gallery WordPress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-justified-grid-layout/)**
80
+ * **[Justified Grid with Lazy Load - Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-justified-grid-layout/)**
81
+ * **[Justified Grid with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-justified-grid-layout/)**
82
+ * **[Justified Grid with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-justified-grid-layout/)**
83
+ * **[Justified Grid with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-justified-grid-layout/)**
84
+ * **[Justified Grid Layout with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-justified-grid-layout/)**
85
+ * **[Justified Grid Layout with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-justified-grid-layout/)**
86
+ * **[Justified Grid Layout with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-justified-grid-layout/)**
87
+ * **[Blog Style Layout - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-title-description-blog-style-layout/)**
88
+ * **[Blog Style Layout with WordPress Gallery Lightbox - Gallery Wordpress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lightboxes-blog-style-layout/)**
89
+ * **[Blog Style Layout with Pagination - Photo Gallery WordPress Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-pagination-blog-style-layout/)**
90
+ * **[Blog Style Layout with Lazy Load - Best WordPress Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-lazy-load-blog-style-layout/)**
91
+ * **[Blog Style Layout with Filters](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-filters-blog-style-layout/)**
92
+ * **[Blog Style Layout with Order By](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-order-by-blog-style-layout/)**
93
+ * **[Blog Style Layout with Search Box](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-search-box-blog-style-layout/)**
94
+ * **[Blog Style Layout with Watermarking](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-watermark-blog-style-layout/)**
95
+ * **[Blog Style Layout with Animation Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-animation-blog-style-layout/)**
96
+ * **[Blog Style Layout with Special Effects](https://gallery-bank.tech-banker.com/frontend-demos/individual-images-with-special-effects-blog-style-layout/)**
97
+ * **[Photo Albums using Compact Album Layout - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-title-description-thumbnail-layout/)**
98
+ * **[Compact Album Layout with WordPress Gallery Lightbox - Gallery Wordpress Plugin](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-lightboxes-thumbnail-layout/)**
99
+ * **[Compact Album Layout with Pagination - Photo Gallery WordPress Plugin](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-pagination-thumbnail-layout/)**
100
+ * **[Compact Album Layout with Lazy Load - Best WordPress Gallery Plugin](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-lazy-load-thumbnail-layout/)**
101
+ * **[Compact Album Layout with Filters](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-filters-thumbnail-layout/)**
102
+ * **[Compact Album Layout with Order By](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-order-by-thumbnail-layout/)**
103
+ * **[Compact Album Layout with Search Box](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-search-box-thumbnail-layout/)**
104
+ * **[Compact Album Layout with Watermarking](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-watermark-thumbnail-layout/)**
105
+ * **[Compact Album Layout with Animation Effects](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-animation-thumbnail-layout/)**
106
+ * **[Compact Album Layout with Special Effects](http://gallery-bank.tech-banker.com/frontend-demos/compact-album-with-special-effects-thumbnail-layout/)**
107
+ * **[Photo Albums using Extended Album Layout - WordPress Image Gallery Plugin](https://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-title-description-thumbnail-layout/)**
108
+ * **[Extended Album Layout with WordPress Gallery Lightbox - Gallery Wordpress Plugin](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-lightboxes-thumbnail-layout/)**
109
+ * **[Extended Album Layout with Pagination - Photo Gallery WordPress Plugin](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-pagination-thumbnail-layout/)**
110
+ * **[Extended Album Layout with Lazy Load - Best WordPress Gallery Plugin](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-lazy-load-thumbnail-layout/)**
111
+ * **[Extended Album Layout with Filters](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-filters-thumbnail-layout/)**
112
+ * **[Extended Album Layout with Order By](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-order-by-thumbnail-layout/)**
113
+ * **[Extended Album Layout with Search Box](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-search-box-thumbnail-layout/)**
114
+ * **[Extended Album Layout with Watermarking](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-watermark-thumbnail-layout/)**
115
+ * **[Extended Album Layout with Animation Effects](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-animation-thumbnail-layout/)**
116
+ * **[Extended Album Layout Special Effects](http://gallery-bank.tech-banker.com/frontend-demos/extended-album-with-special-effects-thumbnail-layout/)**
117
+
118
+ **[Upgrade to Premium Editions - Best Wordpress Gallery Plugin](https://gallery-bank.tech-banker.com/)**
119
+
120
+ ### Wordpress Photo Gallery Plugin - Key Features in Lite Edition
121
 
122
  * 100% Responsive.
123
  * User Friendly Admin Panel to add Galleries.
124
+ * Create & Manage unlimited amount of image galleries on your WordPress site/blog.
125
  * Upload unlimited amount of photos/images in your gallery.
126
  * Images uploaded are stored in a separate directory to avoid mess up with inbuilt wp-uploads folder.
127
  * Photo Metadata is fetched from each image and populates to Title, Description, Alt Text Fields too.
140
 
141
  Take your media gallery to the next level with [Premium Editions](https://gallery-bank.tech-banker.com/) which gives you 200+ features.
142
 
143
+ ### Wordpress Photo Gallery Plugin - Key Features in Premium Editions
144
 
145
  * All Standard Edition Features as mentioned above.
146
  * Supports Thumbnail, Masonry, Slideshow, Image Browser, Justified Grid, Blog Style, Compact Album, Extended Album.
175
  * Customize Nivo Lightbox - General Settings, Image Title, Image Description.
176
  * Global Options - Configure Thumbnail Dimensions, Right Click Protection, Language Direction
177
  * Lazy Load Settings - Customize Lazy Load Settings for loading of Images in Galleries and Albums.
178
+ * Filter Settings - Customize Filter Settings to create Filterable Photo Gallery for your website/blog.
179
  * Order By Settings - Customize Order By Button.
180
  * Search Box Settings - Customize Search Button to make your galleries also searchable.
181
  * Page Navigation Settings - Customize Page Navigation to make your galleries to divide into pages.
182
  * Watermark Settings - Customize Watermark Settings to make your galleries enabled with watermarking.
183
+ * Advertisement Settings - Customize Advertisement Settings to make your WordPress gallery lightbox loaded with advertisement.
184
  * WordPress Gallery Shortcode Wizard for Thumbnail Gallery, Masonry Gallery, Slideshow Gallery, Image Browser Gallery, Justified Grid Gallery Gallery, Blog Style Gallery.
185
+ * Roles and Capabilities to let you choose what WordPress roles can edit your galleries.
186
  * Awesome **grid gallery** layouts using compact album.
187
  * Awesome **filterable portfolio** using tags in all layouts.
188
+ * Photo Gallery Widget to embed all WordPress gallery shortcodes.
189
  * 24/7 Technical Support
190
 
191
  Visit [here](https://gallery-bank.tech-banker.com/) to upgrade to Premium Editions now.
192
 
193
+ Gallery Bank uses [FooBox](https://WordPress.org/plugins/foobox-image-lightbox/) as its default gallery lightbox which is licensed under GPL V2 or later.
194
+
195
+ ### Responsive Gallery
196
 
197
  It is being designed keeping in mind the optimal viewing experience across a wide range of devices. At the same time it is coded to work also on old browsers! Whether your visitors are on a Mobile, Laptop or Desktop your Gallery will look great on any device.
198
 
199
+ ### Unlimited Image Galleries & Photos
200
 
201
  You can adds unlimited number of images in a single gallery. As you have created a number of image galleries, you can add as many short-codes on your page as you need.
202
 
203
+ ### Layout Settings
204
 
205
  Easily Configuration settings for Thumbnails, Album Covers, Different Lightboxes, Slideshow, Pagination etc. for customizing your albums as per your website's look & feel.
206
 
207
+ ### Easy Setup & Management
208
 
209
+ Create stunning, 100% responsive, SEO-friendly **photo gallery WordPress** in minutes. It provides easy-to-manage functionality to rename, upload, copy, add and remove images. Gallery Bank uses also WordPress in-built media uploader as a feature to upload images.
210
 
211
+ ### Image Gallery
212
 
213
  It allows you to add multiple images with multiple effects. Image Gallery option allows you to customize the settings for views of images.
214
 
215
+ ### Masonry Gallery
216
 
217
+ With Photo Gallery by Gallery Bank, you can implement Masonry Layout. Masonry layouts are a great choice for creating galleries using images with varied dimensions. It works by placing elements in optimal position based on available vertical space.
218
 
219
+ ### Gallery Lightbox
220
 
221
  Lightbox will appear when you click on the image and it will help you show more detail about your pictures with full description and full size of image.
222
 
223
+ ### Gallery Widget
224
+
225
+ Gallery Widget lets you easily embed shortcode from the shortcode wizard and beautify your online gallery website with awesome galleries and albums.
226
+
227
  == Frequently Asked Questions ==
228
 
229
+ = How to Install? =
230
 
231
+ Here are the below mentioned steps for installing Gallery Bank on your WordPress.
 
 
 
 
 
 
232
 
233
+ If you are using the Standard Edition, you can follow the following steps:
234
 
235
+ * Login to the WordPress Administrator Panel.
236
+ * Go to "Plugins > Add New".
237
+ * In the Search box, type "Gallery Bank" and press Enter.
238
+ * In the results grid, you will get a link as "Gallery Bank", click on "Install Now" link for "Gallery Bank".
239
+ * Click "Activate Plugin" link to activate the Plugin.
240
 
241
+ Hopefully, if you have followed the steps properly as mentioned above, you will see the success message.
242
 
243
+ If any problem occurs during installation process, please contact us at [support@tech-banker.com](support@tech-banker.com)
244
 
245
+ = How to customize Galleries? =
246
 
247
+ Galleries section is divided into following three parts:
248
 
249
+ * Manage Galleries
250
+ * Add Gallery
251
+ * Sort Galleries
252
 
253
+ Using Manage Galleries, user can customize and manage the settings of existing galleries.
254
 
255
+ Using Add Gallery, user can add new gallery.
 
 
 
256
 
257
+ Using Sort Galleries, user can sort order of images in a gallery. For this, you just have to drag and drop images to rearrange them in your preferred order.
258
 
259
+ This gives an idea about how to add, manage and sort Galleries in Gallery Bank. You can also add Title, Description, Alt Text and Links to the images in a gallery.
 
 
 
260
 
261
+ = How to manage Galleries created? =
262
 
263
+ On the **Gallery Bank Navigation Panel**, click on **Galleries - Manage Galleries**.
 
 
 
 
264
 
265
+ **Bulk-Action:** If you would like to delete or duplicate multiple galleries together, then you would need to tick the appropriate check boxes and then choose "Delete" or "Duplicate" option from the Bulk-Action drop-down.
266
 
267
+ **Apply Button:** After selecting particular option, click on "Apply" button to perform the selected action on galleries all together.
 
 
 
268
 
269
+ **Add Gallery:** If you would like to add new gallery, then you would need to click on "Add Gallery" button. It will redirect you to Add Gallery page.
270
 
271
+ **Delete All Galleries:** If you would like to delete all galleries, then you would need to click on "Delete All Galleries" button.
 
 
272
 
273
+ **Purge Galleries:** If you would like to remove extra or unused Images from album-thumbs, gallery-uploads, and thumbs folder, then you would need to click on "Purge Galleries".
274
 
275
+ = How to Edit or Delete Gallery? =
 
 
 
276
 
277
+ In order to "Edit Gallery" from the list of Galleries as shown above, you would need to click on "Edit" located at the bottom of Cover Image in Gallery Cover Image column in each row.
278
 
279
+ Once you click on "Edit", you would be redirected to "Edit Gallery" page, where you can edit the gallery.
280
 
281
+ In order to "Delete Gallery" from the list of Galleries as shown above, you would need to click on "Delete" located at the bottom of Cover Image in Gallery Cover Image column in each row.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
283
+ By clicking on this icon, you would see a confirmation message asking to "Confirm" whether you would like to delete the gallery?
284
 
285
+ Once you press the OK button, the gallery would be deleted.
286
 
287
+ = How to Add a new Gallery? =
 
 
 
 
288
 
289
+ On the **Gallery Bank Navigation Panel**, select **Galleries - Add Gallery**.
290
 
291
+ **Gallery Title:** In this field, you would need to provide "Gallery Title".
 
 
 
292
 
293
+ **Gallery Description:** In this field, you would need to provide "Gallery Description". It would be displayed when using shortcode.
294
 
295
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the screen to save the settings.
 
 
296
 
297
+ = How to upload images to a Gallery? =
298
 
299
+ In order to upload images to the gallery, you would need to click on "Upload Images" tab at top of the page.
 
 
 
 
300
 
301
+ You can upload images from your Local System, WP Media Manager or FTP.
302
 
303
+ If you would like to upload images from your own computer, then you would need to click on "Local System" tab.
 
 
 
 
 
 
 
 
 
304
 
305
+ In order to upload files, you would need to click on "Add Files" button or you can drag and drop files from your computer.
306
 
307
+ After selecting files, you would need to click on "Start Upload" button to upload the files into gallery.
308
 
309
+ You would be able to view the size of files on bottom-right corner of Select Files screen.
 
 
 
310
 
311
+ If you would like to upload images from WP Media Manager, then you would need to click on "WP Media Manager" tab.
312
 
313
+ Now you would need to click on "Upload Thumbnails" button to upload images from Media Manager.
 
314
 
315
+ If you would like to upload images from FTP, then you would need to click on "Upload From FTP" tab.
316
 
317
+ You can browse and locate the images from FTP to upload them into your gallery.
 
 
 
 
 
318
 
319
+ After uploading images in gallery, you would be able to see them in a list from where you can customize the settings of every image in gallery.
320
 
321
+ **Bulk-Action:** If you would like to perform an action on multiple images together, then you would need to tick the appropriate check boxes and then choose required option from the Bulk-Action drop-down.
 
322
 
323
+ **Apply Button:** After selecting particular option, click on "Apply" button to perform the selected action on images all together.
324
 
325
+ **Image Title:** In this field, you would need to provide "Image Title" for image.
 
326
 
327
+ **Image Alt Text:** In this field, you would need to provide alternative tags for image to make it visible for search engines and show in case of slower connections.
328
 
329
+ **Image Description:** In this field, you would need to provide "Image Description" for image.
 
330
 
331
+ **Tags:** In this field, you would need to choose "Tags" for particular image.
332
 
333
+ **Enable Url Redirect on click of Image:** If you would like to redirect user to a specific location when clicking on an image, then you would need to select "Enable" checkbox.
 
 
334
 
335
+ **Url Link:** This option becomes visible when "Enable" option is being selected from "Enable Url Redirect on click of Image". Now you would need to provide the URL link of location where you would like to redirect user when clicking on this image.
336
 
337
+ **Thumbnail:** Under this column, you would be able to see thumbnail of image. If you would like to set an image as a "Cover Image", then you would need to check button for "Set As Cover Image".
 
338
 
339
+ If you would not like to display image with other gallery images, then tick "Exclude?" checkbox.
340
 
341
+ If you would like edit image, then you would need to click on "Edit" located at bottom of the Thumbnail Image.
 
 
 
342
 
343
+ Once you click on "Edit", the following popup will appear on your screen.
344
 
345
+ Now you can perform various actions like **Crop**, **Rotate** and **Flip** image according to your choice or you can apply various effects on image using toolbar located at top left corner. You can also adjust **Brightness** and **Contrast** of image.
346
 
347
+ If you would like to scale image to particular dimension, then provide the required dimensions and click "Scale" button located at the right sidebar.
348
 
349
+ If you would like to crop image in a specific "Aspect Ratio", then you would need to provide required ratio.
350
 
351
+ Once everything is setup, you would need to close popup to return to the Add Gallery Page.
352
 
353
+ If you would like to "Delete" image from gallery, then you would need to click on "Delete" located at bottom of the Thumbnail Image.
354
 
355
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
356
 
357
+ = How to sort images in a Gallery? (Premium Edition) =
358
 
359
+ On the **Gallery Bank Navigation Panel**, select **Galleries - Sort Galleries**.
360
 
361
+ **Choose Gallery:** In this field, you would need to choose specific Gallery for sorting.
 
362
 
363
+ You would need to drag and drop images to arrange them in specific order.
364
 
365
+ After arranging them, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
366
 
367
+ = How to customize created Albums? (Premium Edition) =
368
 
369
+ Albums Section is divided into following three parts:
370
 
371
+ * Manage Albums
372
+ * Add Album
373
+ * Sort Albums
374
 
375
+ Using **Manage Albums**, user can customize and manage the settings of existing albums. You can also view the meta information about albums and easily modify and delete the albums if required.
376
 
377
+ Using **Add Album**, user can add new album. You can add galleries to your album by choosing them from the list of available galleries.
378
 
379
+ Using **Sort Albums**, user can sort order of galleries in an album. You can easily sort the ordering of galleries by drag and drop method.
380
 
381
+ **How to manage Albums?**
382
 
383
+ On the **Gallery Bank Navigation Panel**, click on **Albums - Manage Albums**.
 
 
384
 
385
+ **Bulk Action:** If you would like to delete or duplicate multiple albums together, then you would need to tick the appropriate check boxes and then choose "Delete Albums" or "Duplicate Albums" option from the Bulk Action drop-down.
386
 
387
+ **Apply Button:** After selecting particular option, click on "Apply" button to perform the selected action on albums all together.
 
 
388
 
389
+ **Add Album:** If you would like to add new album, then you would need to click on "Add Album" button. It will redirect you to Add Album page.
390
 
391
+ **Delete All Albums:** If you would like to delete all albums, then you would need to click on "Delete All Albums" button.
 
392
 
393
+ **Purge Albums:** If you would like to remove extra or unused images from album-thumbs, gallery-uploads, and thumbs folder, then you would need to click on "Purge Albums".
394
 
395
+ = How to Edit or Delete Album? (Premium Edition) =
 
396
 
397
+ In order to "Edit Album" from the list of Albums as shown above, you would need to click on "Edit" located at the bottom of Cover Image in Album Cover Image column in each row.
398
 
399
+ Once you click on "Edit", you would be redirected to "Update Album" page, where you can edit the album.
400
 
401
+ In order to "Delete Album" from the list of Albums as shown above, you would need to click on "Delete" located at the bottom of Cover Image in Album Cover Image column in each row.
402
 
403
+ By clicking on this icon, you would see a confirmation message asking to "Confirm" whether you would like to delete the album?
404
 
405
+ Once you press the OK button, the album would be deleted.
406
 
407
+ = How to Add a new Album? (Premium Edition) =
408
 
409
+ On the **Gallery Bank Navigation Panel**, select **Albums - Add Album**.
410
 
411
+ **Album Title:** In this field, you would need to provide "Album Title".
412
 
413
+ **Album Description:** In this field, you would need to provide "Album Description".
414
 
415
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the screen to save the settings.
416
 
417
+ = How to upload galleries to album? (Premium Edition) =
418
 
419
+ In order to upload albums, you would need to click on "Upload Albums" tab at top of the page.
 
420
 
421
+ **Album Cover:** In this field, you would need to upload image for Album Cover.
422
 
423
+ From "Galleries Available" select list, you would need to choose the galleries which you would like to add in your album.
424
 
425
+ In order to add multiple galleries together, you would need to hold the "Ctrl" button and choose galleries from select list.
426
 
427
+ On clicking "Add >>" button, selected galleries would be added to your album and will be displayed on "Galleries Included in this Album" list.
428
 
429
+ From "Galleries Included in this Album" select list, you would need to choose the galleries which you would like to remove from your album.
430
 
431
+ In order to remove multiple galleries together, you would need to hold the "Ctrl" button and choose galleries from select list.
 
432
 
433
+ On clicking "<< Remove" button, selected galleries would be added to "Galleries Available" list.
434
 
435
+ Once everything is being setup, you would need to click on the "Save Changes" button located at the bottom of the page to save the settings.
436
+
437
+ = How to sort Albums? (Premium Edition) =
438
+
439
+ On the **Gallery Bank Navigation Panel**, select **Albums - Sort Albums**.
440
+
441
+ **Choose Album:** In this field, you would need to choose a specific Album for sorting.
442
+
443
+ Once you reach the page as seen above, you would need to drag and drop the galleries to arrange them in specific order.
444
+
445
+ After arranging them, you would need to click on "Save Changes" button to save the settings.
446
+
447
+ = How to customize Tags? (Premium Edition) =
448
+
449
+ Tags Page gives an idea about how to add and manage the Gallery Tags.
450
+
451
+ Tags are divided into two sections.
452
+
453
+ * Manage Tags
454
+ * Add Tag
455
+
456
+ Using **Manage Tags**, user can customize and manage the settings for existing tags. This page shows detailed list of tags that are currently present. It will display tag name, tag description, status of tags.
457
+
458
+ Using **Add Tag**, user can add new tags for images. You would need to provide Tag Name and Description to add a new tag.
459
+
460
+ If any problem occurs during any process, please contact us at [support@tech-banker.com](support@tech-banker.com)
461
+
462
+ = How to Manage Tags? (Premium Edition) =
463
+
464
+ On the **Gallery Bank Navigation Panel**, select **Tags - Manage Tags**.
465
+
466
+ The following information would be displayed on this page.
467
+
468
+ **Bulk Action:** If you would like to delete multiple tags simultaneously, then you would need to tick appropriate check boxes and then choose "Delete" option from Bulk Action drop-down.
469
+
470
+ **Apply Button:** After selecting "Delete" option, click on "Apply" button to delete selected tags all together.
471
+
472
+ **Add Tag:** If you would like to add new tag, then you would need to click on "Add Tag" button. It will redirect you to Add Tag page.
473
+
474
+ **Tag Name:** Under this column, you would be able to view "Tag Name".
475
+
476
+ **Tag Description:** Under this column, you would be able to view "Tag Description".
477
+
478
+ **Status:** Under this column, you would be able to see whether the tag is used or unused.
479
+
480
+ = How to Edit or Delete Tags? (Premium Edition) =
481
+
482
+ In order to "Edit Tags", you would need to click on "Edit Icon" located under the Action column in each row.
483
+
484
+ By clicking on this icon, you would be re-directed to the Edit Tag page, where you can modify the tag settings.
485
+
486
+ Once everything is being setup, you would need to click on the "Save Changes" button located at bottom and top of the page to save the changes.
487
+
488
+ In order to "Delete Tags", you would need to click on "Delete Icon" located under the Action column in each row.
489
+
490
+ By clicking on this button, you would see a confirmation message asking to "Confirm" whether you would like to delete the tag?
491
+
492
+ Once you press the OK button, the tag would be deleted.
493
+
494
+ = How to Add Tag? (Premium Edition) =
495
+
496
+ On the **Gallery Bank Navigation Panel**, select **Tags - Add Tag**.
497
+
498
+ Here is the description of each control on page.
499
+
500
+ **Tag Name:** In this field, you would need to provide "Tag Name".
501
+
502
+ **Tag Description:** In this field, you would need to provide a brief "Tag Description".
503
+
504
+ Once everything is being setup, you would need to click on "Save Changes" button located at top and bottom of the page to save the settings.
505
+
506
+ You can use these tags to filter images into different categories and display images of same categories separately.
507
+
508
+ = How to manage Layout Settings? (Premium Edition) =
509
+
510
+ Layout Settings are divided into nine sections.
511
+
512
+ * Thumbnail Layout
513
+ * Masonry Layout
514
+ * Slideshow Layout
515
+ * Image Browser Layout
516
+ * Justified Grid Layout
517
+ * Blog Style Layout
518
+ * Compact Album Layout
519
+ * Extended Album Layout
520
+ * Custom CSS
521
+
522
+ Gallery Bank provides you various options to customize the gallery layouts. You can modify the settings to make your gallery more beautiful and attractive.
523
+
524
+ It allows you to add Custom CSS to override the default css of plugin and fully customize the look of your gallery.
525
+
526
+ = How to manage Thumbnail Layout? (Premium Edition) =
527
+
528
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Thumbnail Layout**.
529
+
530
+ You would be able to manage different Thumbnail Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
531
+
532
+ **How to manage Thumbnails for Thumbnail Layout?**
533
+
534
+ In order to manage thumbnails for Thumbnail Layout, you would need to click on "Thumbnails" tab from top of the page.
535
+
536
+ Here is the description of each control on this page.
537
+
538
+ **Thumbnail Dimensions:** In this field, you would need to provide "Width and Height" for image thumbnails.
539
+
540
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background. Transparency should be from 0 to 100.
541
+
542
+ **Thumbnail Opacity:** In this field, you would need to provide Opacity for Thumbnail in percentage. It should be from 0 to 100.
543
+
544
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Thumbnail.
545
+
546
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Thumbnail.
547
+
548
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Thumbnail.
549
+
550
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" for Thumbnail.
551
+
552
+ **Hover Effect & Value:** In this field, you would need to choose the effect to be applied to Thumbnail when hovered and provide specific value for selected hover effect.
553
+
554
+ **Transition:** In this field, you would need to provide Transition time to complete the effect. It should be from 1 to 9.
555
+
556
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail.
557
+
558
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail.
559
+
560
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
561
+
562
+ **How to customize Gallery Title for Thumbnail Layout?**
563
+
564
+ In order to customize Gallery Title of Thumbnail Layout, you would need to click on "Gallery Title" tab from top of the page.
565
+
566
+ Here is the description of each control on this page.
567
+
568
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
569
+
570
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
571
+
572
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
573
+
574
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
575
+
576
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
577
+
578
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
579
+
580
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
581
+
582
+ **How to customize Gallery Description for Thumbnail Layout?**
583
+
584
+ In order to customize Gallery Description of Thumbnail Layout, you would need to click on "Gallery Description" tab from top of the page.
585
+
586
+ Here is the description of each control on this page.
587
+
588
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
589
+
590
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
591
+
592
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
593
+
594
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
595
+
596
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
597
+
598
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
599
+
600
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
601
+
602
+ **How to customize Thumbnail Title?**
603
+
604
+ In order to customize Thumbnail Title of Thumbnail Layout, you would need to click on "Thumbnail Title" tab from top of the page.
605
+
606
+ Here is the description of each control on this page.
607
+
608
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Title.
609
+
610
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Title.
611
+
612
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Title.
613
+
614
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Title.
615
+
616
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Title.
617
+
618
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Title.
619
+
620
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
621
+
622
+ **How to customize Thumbnail Description?**
623
+
624
+ In order to customize Thumbnail Description of Thumbnail Layout, you would need to click on "Thumbnail Description" tab from top of the page.
625
+
626
+ Here is the description of each control on this page.
627
+
628
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Description.
629
+
630
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Description.
631
+
632
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Description.
633
+
634
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Description.
635
+
636
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Description.
637
+
638
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Description.
639
+
640
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
641
+
642
+ = How to manage Masonry Layout? (Premium Edition) =
643
+
644
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings � Masonry Layout**.
645
+
646
+ You would be able to manage different Masonry Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
647
+
648
+ **How to manage Thumbnails for Masonry Layout?**
649
+
650
+ In order to manage thumbnails for Masonry Layout, you would need to click on "Thumbnails" tab from top of the page.
651
+
652
+ Here is the description of each control on this page.
653
+
654
+ **Thumbnail Width:** In this field, you would need to provide "Width" for image thumbnails in Masonry Layout.
655
+
656
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background. Transparency should be from 0 to 100.
657
+
658
+ **Thumbnail Opacity:** In this field, you would need to provide Opacity for image thumbnails in percentage. It should be from 0 to 100.
659
+
660
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Masonry Layout.
661
+
662
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Masonry Layout.
663
+
664
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Masonry Layout.
665
+
666
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" for Masonry Layout.
667
+
668
+ **Hover Effect & Value:** In this field, you would need to choose the effect to be applied to Masonry Layout when hovered and provide specific value for selected hover effect.
669
+
670
+ **Transition:** In this field, you would need to provide Transition time to complete the effect. It should be from 1 to 9.
671
+
672
+ **Margin:** In this field, you would need to provide �Margin� for Masonry Layout.
673
+
674
+ **Padding:** In this field, you would need to provide "Padding" for Masonry Layout.
675
+
676
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
677
+
678
+ **How to customize Gallery Title for Masonry Layout?**
679
+
680
+ In order to customize Gallery Title of Masonry Layout, you would need to click on "Gallery Title" tab from top of the page.
681
+
682
+ Here is the description of each control on this page.
683
+
684
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
685
+
686
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
687
+
688
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
689
+
690
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
691
+
692
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
693
+
694
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
695
+
696
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
697
+
698
+ **How to customize Gallery Description for Masonry Layout?**
699
+
700
+ In order to customize Gallery Description of Masonry Layout, you would need to click on "Gallery Description" tab from top of the page.
701
+
702
+ Here is the description of each control on this page.
703
+
704
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
705
+
706
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
707
+
708
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
709
+
710
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
711
+
712
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
713
+
714
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
715
+
716
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
717
+
718
+ **How to customize Thumbnail Title for Masonry Layout?**
719
 
720
+ In order to customize Thumbnail Title of Masonry Layout, you would need to click on "Thumbnail Title" tab from top of the page.
721
 
722
+ Here is the description of each control on this page.
723
 
724
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Title.
725
 
726
+ **Text Alignment:** In this field, you would need to choose "Text Alignment� for Thumbnail Title.
727
 
728
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Title.
729
 
730
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Title.
731
 
732
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Title.
733
 
734
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Title.
735
 
736
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
737
 
738
+ **How to customize Thumbnail Description for Masonry Layout?**
739
 
740
+ In order to customize Thumbnail Description of Masonry Layout, you would need to click on "Thumbnail Description" tab from top of the page.
741
 
742
+ Here is the description of each control on this page.
743
 
744
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Description.
745
 
746
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Description.
747
 
748
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Description.
749
 
750
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Description.
751
 
752
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Description.
753
 
754
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Description.
755
 
756
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
757
 
758
+ = How to manage Slideshow Layout? (Premium Edition) =
759
 
760
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Slideshow Layout**.
761
 
762
+ You would be able to manage different Slideshow Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
763
 
764
+ **How to manage Thumbnails for Slideshow Layout?**
765
 
766
+ In order to manage thumbnails for Slideshow Layout, you would need to click on "Thumbnails" tab from top of the page.
767
 
768
+ Here is the description of each control on this page.
769
 
770
+ **Background Color:** In this field, you would need to choose "Background Color" for Slideshow Layout.
771
 
772
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Slideshow Layout.
773
 
774
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Slideshow Layout.
775
 
776
+ **Buttons Color:** In this field, you would need to choose "Buttons Color".
777
 
778
+ **Buttons Hover Color:** In this field, you would need to choose "Buttons Hover Color".
779
 
780
+ **Buttons Border Style:** In this field, you would need to provide Width, Style and Color for Border of Buttons.
781
 
782
+ **Buttons Border Radius:** In this field, you would need to provide "Border Radius" for Buttons.
783
 
784
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Slideshow Layout.
785
 
786
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" for Slideshow Layout.
787
 
788
+ **Buttons Background Transparency:** In this field, you would need to provide the level of transparency you would like to apply to Buttons. It should be from 0 to 100.
789
 
790
+ **Filmstrip Border Style:** In this field, you would need to provide Width, Style and Color for Border of Filmstrip.
791
 
792
+ **Filmstrip Border Radius:** In this field, you would need to provide "Border Radius" for Filmstrip.
793
 
794
+ **Filmstrip Active Border Style:** In this field, you would need to provide Border Width, Style and Color for Filmstrip item, which is currently being displayed.
795
 
796
+ **Filmstrip De-active Transparency:** In this field, you would need to provide Transparency for Deactivated Filmstrip.
797
 
798
+ **Filmstrip Margin:** In this field, you would need to provide "Margin" for Filmstrip.
799
 
800
+ **Filmstrip Padding:** In this field, you would need to provide "Padding" for Filmstrip.
801
 
802
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
803
 
804
+ **How to customize Gallery Title for Slideshow Layout?**
805
 
806
+ In order to customize Gallery Title of Slideshow Layout, you would need to click on "Gallery Title" tab from top of the page.
807
 
808
+ Here is the description of each control on this page.
809
 
810
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
811
 
812
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
813
 
814
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
815
 
816
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
817
 
818
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
819
 
820
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
821
 
822
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
823
 
824
+ **How to customize Gallery Description for Slideshow Layout?**
825
 
826
+ In order to customize Gallery Description of Slideshow Layout, you would need to click on "Gallery Description" tab from top of the page.
 
827
 
828
+ Here is the description of each control on this page.
829
 
830
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
 
 
831
 
832
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
833
 
834
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
835
 
836
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
837
 
838
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
839
 
840
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
841
 
842
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
843
 
844
+ **How to customize Thumbnail Title for Slideshow Layout?**
845
 
846
+ In order to customize Thumbnail Title of Slideshow Layout, you would need to click on "Thumbnail Title" tab from top of the page.
847
 
848
+ Here is the description of each control on this page.
849
 
850
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Title.
851
 
852
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Title.
853
 
854
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Title.
855
 
856
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Title.
857
 
858
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Title.
859
 
860
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Title.
861
 
862
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
 
863
 
864
+ **How to customize Thumbnail Description for Slideshow Layout?**
865
 
866
+ In order to customize Thumbnail Description of Slideshow Layout, you would need to click on "Thumbnail Description" tab from top of the page.
867
 
868
+ Here is the description of each control on this page.
869
 
870
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Description.
871
 
872
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Description.
873
 
874
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Description.
 
875
 
876
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Description.
877
 
878
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Description.
 
879
 
880
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Description.
881
 
882
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
883
 
884
+ = How to manage Image Browser Layout? (Premium Edition) =
885
 
886
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Image Browser Layout**.
 
887
 
888
+ You would be able to manage different Image Browser Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
889
 
890
+ **How to manage Thumbnails for Image Browser Layout?**
 
891
 
892
+ In order to manage thumbnails for Image Browser Layout, you would need to click on "Thumbnails" tab from top of the page.
893
 
894
+ Here is the description of each control on this page.
895
 
896
+ **Image Browser Opacity:** In this field, you would need to provide Opacity for Image Browser Layout in percentage. It should be from 0 to 100.
897
 
898
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Image Browser Layout.
 
899
 
900
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Image Browser Layout.
901
 
902
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Image Browser Layout.
903
 
904
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" for Image Browser Layout.
905
 
906
+ **Buttons Color:** In this field, you would need to choose "Buttons Color".
 
907
 
908
+ **Buttons Hover Color:** In this field, you would need to choose "Buttons Hover Color".
909
 
910
+ **Buttons Border Style:** In this field, you would need to provide Width, Style and Color for Border of Buttons.
911
 
912
+ **Buttons Border Radius:** In this field, you would need to provide "Border Radius" for Buttons.
913
 
914
+ **Buttons Font Style:** In this field, you would need to provide Font Size and Color for Buttons.
 
915
 
916
+ **Buttons Font Family:** In this field, you would need to choose "Font Family" for Buttons.
917
 
918
+ **Margin:** In this field, you would need to provide "Margin" for Image Browser Layout.
 
 
919
 
920
+ **Padding:** In this field, you would need to provide "Padding" for Image Browser Layout.
921
 
922
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
923
 
924
+ **How to customize Gallery Title for Image Browser Layout?**
925
 
926
+ In order to customize Gallery Title of Image Browser Layout, you would need to click on "Gallery Title" tab from top of the page.
927
 
928
+ Here is the description of each control on this page.
929
 
930
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
 
931
 
932
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
933
 
934
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
935
 
936
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
937
 
938
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
939
 
940
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
941
 
942
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
943
 
944
+ **How to customize Gallery Description for Image Browser Layout?**
945
 
946
+ In order to customize Gallery Description of Image Browser Layout, you would need to click on "Gallery Description" tab from top of the page.
 
 
947
 
948
+ Here is the description of each control on this page.
949
 
950
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
951
 
952
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
953
 
954
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
955
 
956
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
957
 
958
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
 
 
 
959
 
960
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
961
 
962
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
 
963
 
964
+ **How to customize Thumbnail Title for Image Browser Layout?**
965
 
966
+ In order to customize Thumbnail Title of Image Browser Layout, you would need to click on "Thumbnail Title" tab from top of the page.
 
 
967
 
968
+ Here is the description of each control on this page.
969
 
970
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Title.
 
 
 
 
 
 
971
 
972
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Title.
973
 
974
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Title.
 
975
 
976
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Title.
977
 
978
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Title.
979
 
980
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Title.
981
 
982
+ Once everything is being setup, you would need to click on "Save Changes' button to save the settings.
983
 
984
+ **How to customize Thumbnail Description for Image Browser Layout?**
985
 
986
+ In order to customize Thumbnail Description of Image Browser Layout, you would need to click on "Thumbnail Description" tab from top of the page.
987
 
988
+ Here is the description of each control on this page.
989
 
990
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Description.
 
991
 
992
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Description.
993
 
994
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Description.
995
 
996
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Description.
997
 
998
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Description.
999
 
1000
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Description.
1001
 
1002
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1003
 
1004
+ = How to manage Justified Grid Layout? (Premium Edition) =
1005
 
1006
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Justified Grid Layout**.
1007
 
1008
+ You would be able to manage different Justified Grid Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1009
 
1010
+ **How to manage Thumbnails for Justified Grid Layout?**
 
 
1011
 
1012
+ In order to manage thumbnails for Justified Grid Layout, you would need to click on "Thumbnails" tab from top of the page.
1013
 
1014
+ Here is the description of each control on this page.
 
1015
 
1016
+ **Justified Grid Opacity:** In this field, you would need to provide Opacity for Justified Grid Layout in percentage. It should be from 0 to 100.
1017
 
1018
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background. Transparency should be from 0 to 100.
 
 
1019
 
1020
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Justified Grid Layout.
1021
 
1022
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Justified Grid Layout.
 
 
 
 
1023
 
1024
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Justified Grid Layout.
1025
 
1026
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" for Justified Grid Layout.
 
 
1027
 
1028
+ **Hover Effect & Value:** In this field, you would need to choose the effect to be applied to Justified Grid Layout when hovered and provide specific value for selected hover effect.
1029
 
1030
+ **Padding:** In this field, you would need to provide "Padding" for Justified Grid Layout.
 
 
 
 
 
1031
 
1032
+ **Transition:** In this field, you would need to provide Transition time to complete the effect. It should be from 1 to 9.
1033
 
1034
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1035
 
1036
+ **How to customize Gallery Title for Justified Grid Layout?**
 
1037
 
1038
+ In order to customize Gallery Title of Justified Grid Layout, you would need to click on "Gallery Title" tab from top of the page.
1039
 
1040
+ Here is the description of each control on this page.
1041
 
1042
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
1043
 
1044
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
1045
 
1046
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
1047
 
1048
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
 
1049
 
1050
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
1051
 
1052
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
1053
 
1054
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1055
 
1056
+ **How to customize Gallery Description for Justified Grid Layout?**
1057
 
1058
+ In order to customize Gallery Description of Justified Grid Layout, you would need to click on "Gallery Description" tab from top of the page.
1059
 
1060
+ Here is the description of each control on this page.
 
 
1061
 
1062
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
1063
 
1064
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
 
 
1065
 
1066
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
1067
 
1068
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
 
1069
 
1070
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
1071
 
1072
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
 
1073
 
1074
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1075
 
1076
+ **How to customize Thumbnail Title for Justified Grid Layout?**
1077
 
1078
+ In order to customize Thumbnail Title of Justified Grid Layout, you would need to click on "Thumbnail Title" tab from top of the page.
1079
 
1080
+ Here is the description of each control on this page.
1081
 
1082
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Title.
1083
 
1084
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Title.
1085
 
1086
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Title.
1087
 
1088
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Title.
1089
 
1090
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Title.
1091
 
1092
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Title.
1093
 
1094
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1095
 
1096
+ **How to customize Thumbnail Description for Justified Grid Layout?**
1097
 
1098
+ In order to customize Thumbnail Description of Justified Grid Layout, you would need to click on "Thumbnail Description" tab from top of the page.
1099
 
1100
+ Here is the description of each control on this page.
1101
 
1102
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Description.
1103
 
1104
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Description.
1105
 
1106
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Description.
1107
 
1108
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Description.
1109
 
1110
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Description.
1111
 
1112
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Description.
1113
 
1114
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1115
 
1116
+ = How to manage Blog Style Layout? (Premium Edition) =
1117
 
1118
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Blog Style Layout**.
1119
 
1120
+ You would be able to manage different Blog Style Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1121
 
1122
+ **How to manage Thumbnails for Blog Style Layout?**
1123
 
1124
+ In order to manage thumbnails for Blog Style Layout, you would need to click on "Thumbnails" tab from top of the page.
1125
 
1126
+ Here is the description of each control on this page.
1127
 
1128
+ **Background Color:** In this field, you would need to choose "Background Color" for Blog Style Layout.
1129
 
1130
+ **Background Transparency:** In this field, you would need to provide the level of transparency you would like to apply to a Blog Style Layout. It should be from 0 to 100.
1131
 
1132
+ **Blog Style Opacity:** In this field, you would need to provide Opacity for Blog Style Layout in percentage. It should be from 0 to 100.
1133
 
1134
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Blog Style Layout.
1135
 
1136
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Blog Style Layout.
1137
 
1138
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Blog Style Layout.
1139
 
1140
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" for Blog Style Layout.
1141
 
1142
+ **Hover Effect & Value:** In this field, you would need to choose the effect to be applied to Blog Style Layout when hovered and provide specific value for selected hover effect.
1143
 
1144
+ **Transition:** In this field, you would need to provide Transition time to complete the effect. It should be from 1 to 9.
1145
 
1146
+ **Margin:** In this field, you would need to provide "Margin" for Blog Style Layout.
1147
 
1148
+ **Padding:** In this field, you would need to provide "Padding" for Blog Style Layout.
1149
 
1150
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1151
 
1152
+ **How to customize Gallery Title for Blog Style Layout?**
1153
 
1154
+ In order to customize Gallery Title of Blog Style Layout, you would need to click on "Gallery Title" tab from top of the page.
1155
 
1156
+ Here is the description of each control on this page.
1157
 
1158
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
1159
 
1160
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
1161
 
1162
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
1163
 
1164
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
1165
 
1166
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
1167
 
1168
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
1169
 
1170
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1171
 
1172
+ **How to customize Gallery Description for Blog Style Layout?**
 
1173
 
1174
+ In order to customize Gallery Description of Blog Style Layout, you would need to click on "Gallery Description" tab from top of the page.
1175
 
1176
+ Here is the description of each control on this page.
1177
 
1178
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
1179
 
1180
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
1181
 
1182
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
1183
 
1184
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
1185
 
1186
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
1187
 
1188
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
1189
 
1190
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1191
 
1192
+ **How to customize Thumbnail Title for Blog Style Layout?**
1193
 
1194
+ In order to customize Thumbnail Title of Blog Style Layout, you would need to click on "Thumbnail Title" tab from top of the page.
1195
 
1196
+ Here is the description of each control on this page.
1197
 
1198
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Title.
1199
 
1200
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Title.
 
1201
 
1202
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Title.
1203
 
1204
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Title.
1205
 
1206
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Title.
1207
 
1208
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Title.
1209
 
1210
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1211
 
1212
+ **How to customize Thumbnail Description for Blog Style Layout?**
1213
 
1214
+ In order to customize Thumbnail Description of Blog Style Layout, you would need to click on "Thumbnail Description" tab from top of the page.
1215
 
1216
+ Here is the description of each control on this page.
 
1217
 
1218
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Thumbnail Description.
1219
 
1220
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Thumbnail Description.
1221
 
1222
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Thumbnail Description.
1223
 
1224
+ **Font Family:** In this field, you would need to choose "Font Family" for Thumbnail Description.
1225
 
1226
+ **Margin:** In this field, you would need to provide "Margin" for Thumbnail Description.
1227
 
1228
+ **Padding:** In this field, you would need to provide "Padding" for Thumbnail Description.
1229
 
1230
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1231
 
1232
+ = How to manage Compact Album Layout? (Premium Edition) =
 
1233
 
1234
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Compact Album Layout**.
1235
 
1236
+ You would be able to manage different Compact Album Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
 
 
 
 
1237
 
1238
+ **How to manage Thumbnails for Compact Album Layout?**
1239
 
1240
+ In order to manage thumbnails for Compact Album Layout, you would need to click on "Thumbnails" tab from top of the page.
 
1241
 
1242
+ Here is the description of each control on this page.
1243
 
1244
+ **Thumbnail Dimensions:** In this field, you would need to provide "Width and Height" for image thumbnails.
1245
 
1246
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background. Transparency should be from 0 to 100.
1247
 
1248
+ **Thumbnail Opacity:** In this field, you would need to provide Opacity for Thumbnail in percentage. It should be from 0 to 100.
 
1249
 
1250
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Album.
1251
 
1252
+ **Border Radius:** In this field, you would need to provide "Border Radius" of Album.
1253
 
1254
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Album.
1255
 
1256
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" of Album.
1257
 
1258
+ **Hover Effect & Value:** In this field, you would need to choose the effect to be applied to Compact Album Layout when hovered and provide specific value for selected hover effect.
1259
 
1260
+ **Transition:** In this field, you would need to provide Transition time to complete the effect. It should be from 1 to 9.
1261
 
1262
+ **Margin:** In this field, you would need to provide "Margin" of Album.
1263
 
1264
+ **Padding:** In this field, you would need to provide "Padding" of Album.
1265
 
1266
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1267
 
1268
+ **How to customize Album Title for Compact Album Layout?**
1269
 
1270
+ In order to customize Album Title of Compact Album Layout, you would need to click on "Album Title" tab from top of the page.
1271
 
1272
+ Here is the description of each control on this page.
1273
 
1274
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Album Title.
1275
 
1276
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Album Title.
1277
 
1278
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Album Title.
1279
 
1280
+ **Line Height:** In this field, you would need to provide "Line Height" for Album Title.
1281
 
1282
+ **Font Family:** In this field, you would need to choose "Font Family" for Album Title.
1283
 
1284
+ **Margin:** In this field, you would need to provide "Margin" for Album Title.
 
1285
 
1286
+ **Padding:** In this field, you would need to provide "Padding" for Album Title.
1287
 
1288
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
 
1289
 
1290
+ **How to customize Album Description for Compact Album Layout?**
1291
 
1292
+ In order to customize Album Description of Compact Album Layout, you would need to click on "Album Description" tab from top of the page.
 
 
1293
 
1294
+ Here is the description of each control on this page.
1295
 
1296
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Album Description.
 
 
1297
 
1298
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Album Description.
1299
 
1300
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Album Description.
 
 
 
1301
 
1302
+ **Line Height:** In this field, you would need to provide "Line Height" for Album Description.
1303
 
1304
+ **Font Family:** In this field, you would need to choose "Font Family" for Album Description.
 
 
1305
 
1306
+ **Margin:** In this field, you would need to provide "Margin" for Album Description.
1307
 
1308
+ **Padding:** In this field, you would need to provide "Padding" for Album Description.
 
 
1309
 
1310
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1311
 
1312
+ **How to customize Gallery Title for Compact Album Layout?**
 
 
1313
 
1314
+ In order to customize Gallery Title of Compact Album Layout, you would need to click on "Gallery Title" tab from top of the page.
1315
 
1316
+ Here is the description of each control on this page.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1317
 
1318
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
1319
 
1320
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
1321
 
1322
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
1323
 
1324
+ **Line Height:** In this field, you would need to provide "Line Height" for Gallery Title.
1325
 
1326
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
1327
 
1328
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
 
 
 
 
1329
 
1330
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
1331
 
1332
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1333
 
1334
+ **How to customize Gallery Description for Compact Album Layout?**
1335
 
1336
+ In order to customize Gallery Description of Compact Album Layout, you would need to click on "Gallery Description" tab from top of the page.
1337
 
1338
+ Here is the description of each control on this page.
1339
 
1340
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
 
 
1341
 
1342
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
1343
 
1344
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
 
1345
 
1346
+ **Line Height:** In this field, you would need to provide "Line Height" for Gallery Description.
1347
 
1348
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
1349
 
1350
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
1351
 
1352
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
1353
 
1354
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1355
 
1356
+ **How to customize Buttons for Compact Album Layout?**
 
 
1357
 
1358
+ In order to customize Buttons of Compact Album Layout, you would need to click on "Buttons" tab from top of the page.
1359
 
1360
+ Here is the description of each control on this page.
1361
 
1362
+ **Button Text:** In this field, you would need to provide text that would be display on the Button.
1363
 
1364
+ **Button Text Alignment:** In this field, you would need to choose "Button Text Alignment" for Button.
1365
 
1366
+ **Button Color:** In this field, you would need to choose "Button Color" for Button.
1367
 
1368
+ **Button Hover Color:** In this field, you would need to choose "Button Hover Color" for Button.
1369
 
1370
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Button.
1371
 
1372
+ **Border Hover Color:** In this field, you would need to choose "Border Hover Color" for Button.
 
1373
 
1374
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Button.
1375
 
1376
+ **Font Family:** In this field, you would need to choose "Font Family" for Button.
 
 
1377
 
1378
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Button.
1379
 
1380
+ **Margin:** In this field, you would need to provide "Margin" for Button.
 
 
1381
 
1382
+ **Padding:** In this field, you would need to provide "Padding" for Button.
1383
 
1384
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
 
 
1385
 
1386
+ = How to manage Extended Album Layout? (Premium Edition) =
1387
 
1388
+ On the **Gallery Bank Navigation Panel**, select **Layout Settings - Extended Album Layout**.
1389
 
1390
+ You would be able to manage different Extended Album Layout settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1391
 
1392
+ **How to manage Thumbnails for Extended Album Layout?**
 
 
 
1393
 
1394
+ In order to manage thumbnails for Extended Album Layout, you would need to click on "Thumbnails" tab from top of the page.
1395
 
1396
+ Here is the description of each control on this page.
 
1397
 
1398
+ **Thumbnail Dimensions:** In this field, you would need to provide "Width and Height" for image thumbnails.
1399
 
1400
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background. Transparency should be from 0 to 100.
 
 
 
 
 
1401
 
1402
+ **Thumbnail Opacity:** In this field, you would need to provide Opacity for Thumbnail in percentage. It should be from 0 to 100.
1403
 
1404
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Album.
1405
 
1406
+ **Border Radius:** In this field, you would need to provide "Border Radius" of Album.
1407
 
1408
+ **Shadow:** In this field, you would need to provide CSS type values for "Shadow" of Album.
 
1409
 
1410
+ **Shadow Color:** In this field, you would need to choose "Shadow Color" of Album.
1411
 
1412
+ **Hover Effect & Value:** In this field, you would need to choose the effect to be applied to Compact Album Layout when hovered and provide specific value for selected hover effect.
 
1413
 
1414
+ **Transition:** In this field, you would need to provide Transition time to complete the effect. It should be from 1 to 9.
1415
 
1416
+ **Margin:** In this field, you would need to provide "Margin" of Album.
 
1417
 
1418
+ **Padding:** In this field, you would need to provide "Padding" of Album.
1419
 
1420
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
 
 
1421
 
1422
+ **How to customize Album Title for Extended Album Layout?**
1423
 
1424
+ In order to customize Album Title of Extended Album Layout, you would need to click on "Album Title" tab from top of the page.
 
 
1425
 
1426
+ Here is the description of each control on this page.
1427
 
1428
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Album Title.
 
1429
 
1430
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Album Title.
1431
 
1432
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Album Title.
1433
 
1434
+ **Line Height:** In this field, you would need to provide "Line Height" for Album Title.
1435
 
1436
+ **Font Family:** In this field, you would need to choose "Font Family" for Album Title.
1437
 
1438
+ **Margin:** In this field, you would need to provide "Margin" for Album Title.
1439
 
1440
+ **Padding:** In this field, you would need to provide "Padding" for Album Title.
1441
 
1442
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1443
 
1444
+ **How to customize Album Description for Extended Album Layout?**
 
1445
 
1446
+ In order to customize Album Description of Extended Album Layout, you would need to click on "Album Description" tab from top of the page.
1447
 
1448
+ Here is the description of each control on this page.
 
1449
 
1450
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Album Description.
1451
 
1452
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Album Description.
 
 
1453
 
1454
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Album Description.
1455
 
1456
+ **Line Height:** In this field, you would need to provide "Line Height" for Album Description.
 
 
1457
 
1458
+ **Font Family:** In this field, you would need to choose "Font Family" for Album Description.
1459
 
1460
+ **Margin:** In this field, you would need to provide "Margin" for Album Description.
 
1461
 
1462
+ **Padding:** In this field, you would need to provide "Padding" for Album Description.
1463
 
1464
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
 
1465
 
1466
+ **How to customize Gallery Title for Extended Album Layout?**
1467
 
1468
+ In order to customize Gallery Title of Extended Album Layout, you would need to click on "Gallery Title" tab from top of the page.
 
1469
 
1470
+ Here is the description of each control on this page.
1471
 
1472
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Title.
1473
+
1474
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Title.
1475
+
1476
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Title.
1477
+
1478
+ **Line Height:** In this field, you would need to provide "Line Height" for Gallery Title.
1479
+
1480
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Title.
1481
+
1482
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Title.
1483
+
1484
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Title.
1485
+
1486
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1487
+
1488
+ **How to customize Gallery Description for Extended Album Layout?**
1489
+
1490
+ In order to customize Gallery Description of Extended Album Layout, you would need to click on "Gallery Description" tab from top of the page.
1491
+
1492
+ Here is the description of each control on this page.
1493
+
1494
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Gallery Description.
1495
+
1496
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Gallery Description.
1497
+
1498
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Gallery Description.
1499
+
1500
+ **Line Height:** In this field, you would need to provide "Line Height" for Gallery Description.
1501
+
1502
+ **Font Family:** In this field, you would need to choose "Font Family" for Gallery Description.
1503
+
1504
+ **Margin:** In this field, you would need to provide "Margin" for Gallery Description.
1505
+
1506
+ **Padding:** In this field, you would need to provide "Padding" for Gallery Description.
1507
+
1508
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1509
+
1510
+ **How to customize Buttons for Extended Album Layout?**
1511
+
1512
+ In order to customize Buttons of Extended Album Layout, you would need to click on "Buttons" tab from top of the page.
1513
+
1514
+ Here is the description of each control on this page.
1515
+
1516
+ **Button Text:** In this field, you would need to provide text that would be display on the Button.
1517
+
1518
+ **Button Text Alignment:** In this field, you would need to choose "Button Text Alignment" for Button.
1519
+
1520
+ **Button Color:** In this field, you would need to choose "Button Color" for Button.
1521
+
1522
+ **Button Hover Color:** In this field, you would need to choose "Button Hover Color" for Button.
1523
+
1524
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Button.
1525
+
1526
+ **Border Hover Color:** In this field, you would need to choose "Border Hover Color" for Button.
1527
+
1528
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Button.
1529
+
1530
+ **Font Family:** In this field, you would need to choose "Font Family" for Button.
1531
+
1532
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Button.
1533
+
1534
+ **Margin:** In this field, you would need to provide "Margin" for Button.
1535
+
1536
+ **Padding:** In this field, you would need to provide "Padding" for Button.
1537
+
1538
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1539
+
1540
+ **How to manage Custom CSS?**
1541
+
1542
+ On the **Gallery Bank Navigation Panel**, click on **Layout Settings - Custom CSS**.
1543
+
1544
+ **Custom CSS:** In this field, you would need to provide CSS code manually to add extra styling to the layout of Gallery Bank. This CSS style will override the plugins css and provide you the ability to customize the settings for various layouts in Gallery Bank.
1545
+
1546
+ Once everything is being setup, you would need to click on "Save Changes" button located at the bottom of the page to save the changes.
1547
+
1548
+ = How to manage Lightboxes? (Premium Edition) =
1549
+
1550
+ Gallery Bank includes the following five lightboxes:
1551
+
1552
+ * Lightcase
1553
+ * Fancy Box
1554
+ * Color Box
1555
+ * Foo Box Free Edition
1556
+ * Nivo Lightbox
1557
+
1558
+ Gallery Bank allows you to display your photos in a lightbox when they're clicked. They seamlessly integrate with our gallery plugin.
1559
+
1560
+ Our lightbox comes with several controls such as arrow navigation, keyboard navigation, mousewheel scroll navigation options. It also provides you the ability to customize various settings such as title, description, fonts, border, autoplay slideshow, background, overlay, opacity and much more.
1561
+
1562
+ = How to customize Lightcase Lightbox? (Premium Edition) =
1563
+
1564
+ On the **Gallery Bank Navigation Panel**, select **Lightboxes - Lightcase**.
1565
+
1566
+ you would be able to manage different Lightcase Lightbox settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1567
+
1568
+ **How to customize Settings for Lightcase?**
1569
+
1570
+ In order to manage settings for Lightcase, you would need to click on "Settings" tab from top of the page.
1571
+
1572
+ Here is the description of each control on this page.
1573
+
1574
+ **Autoplay Slideshow:** In this field, you would need to choose "Enable" to autoplay the slideshow in Lightcase.
1575
+
1576
+ **Transition:** In this field, you would need to choose "Transition Effect" for Lightbox.
1577
+
1578
+ **Starting Transition Speed:** In this field, you would need to provide Starting Transition Speed for Lightbox.
1579
+
1580
+ **Ending Transition Speed:** In this field, you would need to provide Ending Transition Speed for Lightbox.
1581
+
1582
+ **Overlay Color:** In this field, you would need to choose Color for Overlay.
1583
+
1584
+ **Overlay Opacity:** In this field, you would need to provide Opacity for Overlay. It should be from 0 to 100.
1585
+
1586
+ **Button Style:** In this field, you would need to provide Font Size and Color for Buttons in Lightcase Lightbox.
1587
+
1588
+ **Close Button:** In this field, you would need to choose "Show" to display Close Button.
1589
+
1590
+ **Image Counter:** In this field, you would need to choose "Show" to display image counter in Lightbox.
1591
+
1592
+ **Counter Font Style:** In this field, you would need to provide Font Size and Color for image counter.
1593
+
1594
+ **Counter Font Family:** In this field, you would need to choose "Font Family" for image counter.
1595
+
1596
+ **Border Style:** In this field, you would need to provide Width, Style and Color for border of Lightcase Lightbox.
1597
+
1598
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Lightcase Lightbox.
1599
+
1600
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1601
+
1602
+ **How to customize Image Title for Lightcase?**
1603
+
1604
+ In order to manage image title for Lightcase, you would need to click on "Image Title" tab from top of the page.
1605
+
1606
+ Here is the description of each control on this page.
1607
+
1608
+ **Title:** In this field, you would need to choose "Show" to display Title for image in Lightcase.
1609
+
1610
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Title.
1611
+
1612
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Title.
1613
+
1614
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Title.
1615
+
1616
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Title.
1617
+
1618
+ **Margin:** In this field, you would need to provide "Margin" for Image Title.
1619
+
1620
+ **Padding:** In this field, you would need to provide "Padding" for Image Title.
1621
+
1622
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1623
+
1624
+ **How to customize Image Description for Lightcase?**
1625
+
1626
+ In order to manage image description for Lightcase, you would need to click on "Image Description" tab from top of the page.
1627
+
1628
+ Here is the description of each control on this page.
1629
+
1630
+ **Description:** In this field, you would need to choose "Show" to display Description for image in Lightcase.
1631
+
1632
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Description.
1633
+
1634
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Description.
1635
+
1636
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Description.
1637
+
1638
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Description.
1639
+
1640
+ **Margin:** In this field, you would need to provide "Margin" for Image Description.
1641
+
1642
+ **Padding:** In this field, you would need to provide "Padding" for Image Description.
1643
+
1644
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
1645
+
1646
+ = How to customize Fancy Box? (Premium Edition) =
1647
+
1648
+ On the **Gallery Bank Navigation Panel**, select **Lightboxes - Fancy Box**.
1649
+
1650
+ You would be able to manage different Fancy Box settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1651
+
1652
+ **How to customize Settings for Fancy Box?**
1653
+
1654
+ In order to manage settings for Fancy Box, you would need to click on "Settings" tab from top of the page.
1655
+
1656
+ Here is the description of each control on this page.
1657
+
1658
+ **Title Position:** In this field, you would need to choose position for Title from the provided options.
1659
+
1660
+ **Button Position:** In this field, you would need to choose "Button Position" for Fancy Box.
1661
+
1662
+ **Navigation Arrows:** In this field, you would need to choose "Show" to display navigation arrows.
1663
+
1664
+ **Mouse Wheel:** If you would like that Fancy Box will respond to mouse wheel events, then you would need to choose "Enable" from dropdown or vice-versa.
1665
+
1666
+ **Repeat Images:** If you would like to repeat images in lightbox, then you would need to choose "Enable" from dropdown or vice-versa.
1667
+
1668
+ **Speed:** In this field, you would need to provide "Speed" for slideshow in Fancy Box.
1669
+
1670
+ **Open speed:** In this field, you would need to provide speed of opening for Fancy Box.
1671
+
1672
+ **Close speed:** In this field, you would need to provide speed of closing for Fancy Box.
1673
+
1674
+ **Escape Button:** In this field, you would need to choose "Enable" to close image with Esc Button on keyboard.
1675
+
1676
+ **Close Button:** In this field, you would need to choose "Show" to display Close Button.
1677
+
1678
+ **Open Effect:** In this field, you would need to choose an opening effect for Fancy Box.
1679
+
1680
+ **Close Effect:** In this field, you would need to choose a closing effect for Fancy Box.
1681
+
1682
+ **Margin:** In this field, you would need to provide "Margin" for Fancy Box.
1683
+
1684
+ **Padding:** In this field, you would need to "Padding" for Fancy Box.
1685
+
1686
+ **Background Color:** In this field, you would need to choose "Background Color" for Fancy Box.
1687
+
1688
+ **Background Opacity:** In this field, you would need to provide "Background Opacity" for Fancy Box. It should be from 0 to 100.
1689
+
1690
+ **Overlay Color:** In this field, you would need to choose Color for Overlay.
1691
+
1692
+ **Overlay Opacity:** In this field, you would need to provide Opacity for Overlay. It should be from 0 to 100.
1693
+
1694
+ **Border Style:** In this field, you would need to provide Width, Style and Color for border of Fancy Box.
1695
+
1696
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Fancy Box.
1697
+
1698
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1699
+
1700
+ **How to customize Image Title for Fancy Box?**
1701
+
1702
+ In order to manage image title for Fancy Box, you would need to click on "Image Title" tab from top of the page.
1703
+
1704
+ Here is the description of each control on this page.
1705
+
1706
+ **Title:** In this field, you would need to choose "Show" to display Title for image in Fancy Box.
1707
+
1708
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Title.
1709
+
1710
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Title.
1711
+
1712
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Title.
1713
+
1714
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Title.
1715
+
1716
+ **Margin:** In this field, you would need to provide "Margin" for Image Title.
1717
+
1718
+ **Padding:** In this field, you would need to provide "Padding" for Image Title.
1719
+
1720
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1721
+
1722
+ **How to customize Image Description for Fancy Box?**
1723
+
1724
+ In order to manage image description for Fancy Box, you would need to click on "Image Description" tab from top of the page.
1725
+
1726
+ Here is the description of each control on this page.
1727
+
1728
+ **Description:** In this field, you would need to choose "Show" to display Description for image in Fancy Box.
1729
+
1730
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Description.
1731
+
1732
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Description.
1733
+
1734
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Description.
1735
+
1736
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Description.
1737
+
1738
+ **Margin:** In this field, you would need to provide "Margin" for Image Description.
1739
+
1740
+ **Padding:** In this field, you would need to provide "Padding" for Image Description.
1741
+
1742
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1743
+
1744
+ = How to customize Color Box? (Premium Edition) =
1745
+
1746
+ On the **Gallery Bank Navigation Panel**, select **Lightboxes - Color Box**.
1747
+
1748
+ You would be able to manage different Color Box settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1749
+
1750
+ **How to customize Settings for Color Box?**
1751
+
1752
+ In order to manage settings for Color Box, you would need to click on "Settings" tab from top of the page.
1753
+
1754
+ Here is the description of each control on this page.
1755
+
1756
+ **Color Box Type:** In this field, you would need to choose one of designed styles for Color Box.
1757
+
1758
+ **Color Box Transition Effect:** In this field, you would need to choose "Transition Effect" for Color Box.
1759
+
1760
+ **Transition Speed:** In this field, you would need to provide "Transition Speed" for Color Box.
1761
+
1762
+ **Fade Out:** In this field, you would need to provide speed at which the images in Color Box would Fade Out.
1763
+
1764
+ **Positioning:** In this field, you would need to choose Position for Color Box.
1765
+
1766
+ **Fixed Position:** If you would not like to change position of lightbox while scrolling up or down, then you would need to choose "Enable" from dropdown or vice-versa.
1767
+
1768
+ **Open when page load:** In this field, you would need to choose "Enable" to display Color Box at page loading.
1769
+
1770
+ **Show Close Button:** In this field, you would need to choose "Enable" to display Close Button.
1771
+
1772
+ **Slideshow:** If you would like to display slideshow in Color Box, then you would need to choose "Enable" or vice-versa.
1773
+
1774
+ **Slideshow Speed:** This option becomes visible when slideshow option is enabled. In this field, you would need to provide "Speed" for slideshow.
1775
+
1776
+ **Auto Slideshow:** This option becomes visible when slideshow option is enabled. In this field, you would need to choose "Enable" to autoplay the slideshow.
1777
+
1778
+ **Background Color:** In this field, you would need to choose "Background Color".
1779
+
1780
+ **Background Opacity:** In this field, you would need to provide "Background Opacity". It should be from 0 to 100.
1781
+
1782
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1783
+
1784
+ **How to customize Image Title for Color Box?**
1785
+
1786
+ In order to manage image title for Color Box, you would need to click on "Image Title" tab from top of the page.
1787
+
1788
+ Here is the description of each control on this page.
1789
+
1790
+ **Title:** In this field, you would need to choose "Show" to display Title for image in Lightbox.
1791
+
1792
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Title.
1793
+
1794
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Title.
1795
+
1796
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Title.
1797
+
1798
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Title.
1799
+
1800
+ **Margin:** In this field, you would need to provide "Margin" for Image Title.
1801
+
1802
+ **Padding:** In this field, you would need to provide "Padding" for Image Title.
1803
+
1804
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1805
+
1806
+ **How to customize Image Description for Color Box?**
1807
+
1808
+ In order to manage image description for Color Box, you would need to click on "Image Description" tab from top of the page.
1809
+
1810
+ Here is the description of each control on this page.
1811
+
1812
+ **Description:** In this field, you would need to choose "Show" to display Image Description.
1813
+
1814
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Description.
1815
+
1816
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Description.
1817
+
1818
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Description.
1819
+
1820
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Description.
1821
+
1822
+ **Margin:** In this field, you would need to provide "Margin" for Image Description.
1823
+
1824
+ **Padding:** In this field, you would need to provide "Padding" for Image Description.
1825
+
1826
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1827
+
1828
+ = How to customize Foo Box? (Premium Edition) =
1829
+
1830
+ On the **Gallery Bank Navigation Panel**, select **Lightboxes - Foo Box Free Edition**.
1831
+
1832
+ You would be able to manage different Foo Box settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1833
+
1834
+ **How to customize Settings for Foo Box?**
1835
+
1836
+ In order to manage settings for Foo Box, you would need to click on "Settings" tab from top of the page.
1837
+
1838
+ Here is the description of each control on this page.
1839
+
1840
+ **Show Count:** In this field, you would need to choose "Enable" to display count of images in Lightbox.
1841
+
1842
+ **Hide Page Scrollbars:** In this field, you would need to choose "Enable" to hide page scrollbars.
1843
+
1844
+ **Title Show On Hover:** If you would like to display Title on hover of images, then you would need to choose "Enable" from dropdown or vice-versa.
1845
+
1846
+ **Close Overlay Click:** If you would like to close lightbox by clicking on overlay, then you would need to choose "Enable" from dropdown or vice-versa.
1847
+
1848
+ **Overlay Color:** In this field, you would need to choose Color for Overlay.
1849
+
1850
+ **Overlay Opacity:** In this field, you would need to provide Opacity for Overlay. It should be from 0 to 100.
1851
+
1852
+ **Border Style:** In this field, you would need to provide Width, Style and Color for border of Lightbox.
1853
+
1854
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Lightbox.
1855
+
1856
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1857
+
1858
+ **How to customize Image Title for Foo Box?**
1859
+
1860
+ In order to manage image title for Foo Box, you would need to click on "Image Title" tab from top of the page.
1861
+
1862
+ Here is the description of each control on this page.
1863
+
1864
+ **Title:** In this field, you would need to choose "Show" to display Image Title.
1865
+
1866
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Title.
1867
+
1868
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Title.
1869
+
1870
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Title.
1871
+
1872
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Title.
1873
+
1874
+ **Margin:** In this field, you would need to provide "Margin" for Image Title.
1875
+
1876
+ **Padding:** In this field, you would need to provide "Padding" for Image Title.
1877
+
1878
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1879
+
1880
+ How to customize Image Description for Foo Box?
1881
+
1882
+ In order to manage image description for Foo Box, you would need to click on "Image Description" tab from top of the page.
1883
+
1884
+ Here is the description of each control on this page.
1885
+
1886
+ **Description:** In this field, you would need to choose "Show" to display Image Description.
1887
+
1888
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Description.
1889
+
1890
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Description.
1891
+
1892
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Description.
1893
+
1894
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Description.
1895
+
1896
+ **Margin:** In this field, you would need to provide "Margin" for Image Description.
1897
+
1898
+ **Padding:** In this field, you would need to provide "Padding" for Image Description.
1899
+
1900
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1901
+
1902
+ = How to customize Nivo Lightbox? (Premium Edition) =
1903
+
1904
+ On the **Gallery Bank Navigation Panel**, select **Lightboxes - Nivo Lightbox**.
1905
+
1906
+ You would be able to manage different Nivo Lightbox settings. For this, you would need to click on particular tabs which you would like to modify from top of the page.
1907
+
1908
+ **How to customize Settings for Nivo Lightbox?**
1909
+
1910
+ In order to manage settings for Nivo Lightbox, you would need to click on "Settings" tab from top of the page.
1911
+
1912
+ Here is the description of each control on this page.
1913
+
1914
+ **Choose Open Effects:** In this field, you would need to choose Effect which is to be applied on opening of Nivo Lightbox.
1915
+
1916
+ **Keyboard Navigation:** If you would like to navigate images from keyboard arrow keys, then you would need to choose "Enable" from dropdown or vice-versa.
1917
+
1918
+ **Click Image To Close:** If you would like to close lightbox by clicking on image, then you would need to choose "Enable" from dropdown or vice-versa.
1919
+
1920
+ **Click Overlay To Close:** If you would like to close lightbox by clicking on overlay, then you would need to choose "Enable" from dropdown or vice-versa.
1921
+
1922
+ **Overlay Color:** In this field, you would need to choose Color for Overlay.
1923
+
1924
+ **Overlay Opacity:** In this field, you would need to provide Opacity for Overlay. It should be from 0 to 100.
1925
+
1926
+ **Border Style:** In this field, you would need to provide Width, Style and Color for border of Nivo Lightbox.
1927
+
1928
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Nivo Lightbox.
1929
+
1930
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1931
+
1932
+ **How to customize Image Title for Nivo Lightbox?**
1933
+
1934
+ In order to manage image title for Nivo Lightbox, you would need to click on "Image Title" tab from top of the page.
1935
+
1936
+ Here is the description of each control on this page.
1937
+
1938
+ **Title:** In this field, you would need to choose "Show" to display Title for image in Nivo Lightbox.
1939
+
1940
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Title.
1941
+
1942
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Title.
1943
+
1944
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Title.
1945
+
1946
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Title.
1947
+
1948
+ **Margin:** In this field, you would need to provide "Margin" for Image Title.
1949
+
1950
+ **Padding:** In this field, you would need to provide "Padding" for Image Title.
1951
+
1952
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1953
+
1954
+ **How to customize Image Description for Nivo Lightbox?**
1955
+
1956
+ In order to manage image description for Nivo Lightbox, you would need to click on "Image Description" tab from top of the page.
1957
+
1958
+ Here is the description of each control on this page.
1959
+
1960
+ **Description:** In this field, you would need to choose "Show" to display Description for image in Nivo Lightbox.
1961
+
1962
+ **HTML Tag:** In this field, you would need to choose "HTML Tag" for Image Description.
1963
+
1964
+ **Text Alignment:** In this field, you would need to choose "Text Alignment" for Image Description.
1965
+
1966
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Image Description.
1967
+
1968
+ **Font Family:** In this field, you would need to choose "Font Family" for Image Description.
1969
+
1970
+ **Margin:** In this field, you would need to provide "Margin" for Image Description.
1971
+
1972
+ **Padding:** In this field, you would need to provide "Padding" for Image Description.
1973
+
1974
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
1975
+
1976
+ = How to manage General Settings? (Premium Edition) =
1977
+
1978
+ General Settings are divided into eight sections.
1979
+
1980
+ * Global Options : From here, you can change image dimensions, thumbnail dimensions, enable or disable right click protection and set language direction.
1981
+ * Filter Settings : This gives an idea about how to customize filter settings like background, border, fonts, etc.
1982
+ * Lazy Load Settings : This gives an idea about how to customize loader settings for lazy load.
1983
+ * Search Box Settings : Using this, you can customize search box settings such as its placeholder text, background, border, fonts etc.
1984
+ * Order By Settings : From here, you would be able to manage settings to show Order By for galleries or albums.
1985
+ * Page Navigation : This gives an idea about how to customize Page Navigation options.
1986
+ * Watermark Settings : Using this, you can add text or image watermark on images.
1987
+ * Advertisement : Using this, you can add text or image advertisement on images and provide link to redirect user on clicking of image.
1988
+
1989
+ = How to manage Global Options? (Premium Edition) =
1990
+
1991
+ On the **Gallery Bank Navigation Panel**, select **General Settings - Global Options**.
1992
+
1993
+ Here is the description of each control on the page.
1994
+
1995
+ **Image Dimensions:** In this field, you would need to provide Dimensions for Generated Image.
1996
+
1997
+ **Thumbnail Dimensions:** In this field, you would need to provide Dimensions for Generated Thumbnail.
1998
+
1999
+ **Right Click Protection:** In this field, you would need to choose whether to enable right-click protection for images or not.
2000
+
2001
+ **Language Direction:** In this field, you would need to choose Language Direction.
2002
+
2003
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2004
+
2005
+ = How to manage Lazy Load Settings? (Premium Edition) =
2006
+
2007
+ On the **Gallery Bank Navigation Panel**, select **General Settings � Lazy Load Settings**.
2008
+
2009
+ Here is the description of each control on the page.
2010
+
2011
+ **Background Color:** In this field, you would need to choose "Background Color" for Loader.
2012
+
2013
+ **Loader Color:** In this field, you would need to choose "Color" for Loader.
2014
+
2015
+ **Text:** In this field, you would need to choose "Show" to display Loader Text.
2016
+
2017
+ **Title:** In this field, you would need to provide content for "Loader Text".
2018
+
2019
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Loader Text.
2020
+
2021
+ **Font Family:** In this field, you would need to choose "Font Family" for Loader Text.
2022
+
2023
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
2024
+
2025
+ = How to manage Filter Settings? (Premium Edition) =
2026
+
2027
+ On the **Gallery Bank Navigation Panel**, click on **General Settings - Filter Settings**.
2028
+
2029
+ Here is the description of each control on this page.
2030
+
2031
+ **Font Style:** In this field, you would need to provide Font Size and Color for Filters.
2032
+
2033
+ **Font Family:** In this field, you would need to choose "Font Family" for Filters.
2034
+
2035
+ **Active Font Color:** In this field, you would need to choose "Active Font Color" for Filters.
2036
+
2037
+ **Font Hover Color:** In this field, you would need to choose "Font Hover Color" for Filters.
2038
+
2039
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background of Filters. Transparency should be from 0 to 100.
2040
+
2041
+ **Background Hover Color:** In this field, you would need to choose Background Color On Hover.
2042
+
2043
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Filters.
2044
+
2045
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Filters.
2046
+
2047
+ **Border Hover Color:** In this field, you would need to choose Border Color On Hover.
2048
+
2049
+ **Margin:** In this field, you would need to provide "Margin" for Filters.
2050
+
2051
+ **Padding:** In this field, you would need to provide "Padding" for Filters.
2052
+
2053
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2054
+
2055
+ = How to manage Order By Settings? (Premium Edition) =
2056
+
2057
+ On the *Gallery Bank Navigation Panel*, select *General Settings - Order By Settings*.
2058
+
2059
+ Here is the description of each control on the page.
2060
+
2061
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Order By.
2062
+
2063
+ **Font Family:** In this field, you would need to choose "Font Family" for Order By.
2064
+
2065
+ **Active Font Color:** In this field, you would need to choose "Active Font Color" for Order By.
2066
+
2067
+ **Font Hover Color:** In this field, you would need to choose "Font Hover Color" for Order By.
2068
+
2069
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background of Order By. Transparency should be from 0 to 100.
2070
+
2071
+ **Background Hover Color:** In this field, you would need to choose Background Color on Hover.
2072
+
2073
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Order By.
2074
+
2075
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Order By.
2076
+
2077
+ **Border Hover Color:** In this field, you would need to choose Border Color on Hover.
2078
+
2079
+ **Margin:** In this field, you would need to provide "Margin" for Order By.
2080
+
2081
+ **Padding:** In this field, you would need to provide "Padding" for Order By.
2082
+
2083
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
2084
+
2085
+ = How to manage Search Box Settings? (Premium Edition) =
2086
+
2087
+ On the *Gallery Bank Navigation Panel*, select *General Settings - Lazy Load Settings*.
2088
+
2089
+ Here is the description of each control on the page.
2090
+
2091
+ **Placeholder Text:** In this field, you would need to provide "Text" for Search Box Placeholder.
2092
+
2093
+ **Font Style:** In this field, you would need to provide "Font Size and Color" for Search Box.
2094
+
2095
+ **Font Family:** In this field, you would need to choose "Font Family" for Search Box.
2096
+
2097
+ **Background Color & Transparency:** In this field, you would need to choose "Color and Opacity" for background of Search Box. Transparency should be from 0 to 100.
2098
+
2099
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Search Box.
2100
+
2101
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Search Box.
2102
+
2103
+ **Margin:** In this field, you would need to provide "Margin" for Search Box.
2104
+
2105
+ **Padding:** In this field, you would need to provide "Padding" for Search Box.
2106
+
2107
+ Once everything is being setup, you would need to click on "Save Changes" button to save the settings.
2108
+
2109
+ = How to manage Page Navigation? (Premium Edition) =
2110
+
2111
+ On the **Gallery Bank Navigation Panel**, click on **General Settings - Page Navigation**.
2112
+
2113
+ Here is the description of each control on the page.
2114
+
2115
+ **Background Color:** In this field, you would need to choose "Background Color" for Page Navigation.
2116
+
2117
+ **Background Transparency:** In this field, you would need to provide Transparency for Background of Page Navigation. It should be from 0 to 100.
2118
+
2119
+ **Numbering:** If you would like to show numbering on Page Navigation, then you would need to choose "Yes" or vice-versa.
2120
+
2121
+ **Button Text:** In this field, you would need to choose whether to display Text or Arrows on Page Navigation Button.
2122
+
2123
+ **Alignment:** In this field, you would need to choose "Alignment" for Page Navigation.
2124
+
2125
+ **Position:** In this field, you would need to provide "Position" for Page Navigation.
2126
+
2127
+ **Border Style:** In this field, you would need to provide Width, Style and Color for Border of Page Navigation.
2128
+
2129
+ **Border Radius:** In this field, you would need to provide "Border Radius" for Page Navigation.
2130
+
2131
+ **Font Style:** In this field, you would need to provide Font Size and Color for Page Navigation.
2132
+
2133
+ **Font Family:** In this field, you would need to choose "Font Family" for Page Navigation.
2134
+
2135
+ **Margin:** In this field, you would need to provide "Margin" for Page Navigation.
2136
+
2137
+ **Padding:** In this field, you would need to provide "Padding" for Page Navigation.
2138
+
2139
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2140
+
2141
+ = How to manage Watermark Settings? (Premium Edition) =
2142
+
2143
+ On the **Gallery Bank Navigation Panel**, click on **General Settings - Watermark Settings**.
2144
+
2145
+ **Watermark Type:** In this field, you would need to choose what type of watermark would you like to use in your galleries and albums. It could be Text or Image. If you would not like to use watermark then choose "None".
2146
+
2147
+ Here is the description of each control on the page.
2148
+
2149
+ **Watermark Text:** In this field, you would need to provide Watermark Text which will be displayed over the gallery/album images.
2150
+
2151
+ **Font Style:** In this field, you would need to provide Font Size and Color for Watermark Text.
2152
+
2153
+ **Text Angle:** In this field, you would need to provide an Angle at which the Watermark Text is to be rotated.
2154
+
2155
+ **Offset:** In this field, you would need to provide values for Offset X and Y for Watermark.
2156
+
2157
+ **Watermark Opacity:** In this field, you would need to provide Opacity for Watermark. It should be from 0 to 100.
2158
+
2159
+ **Watermark Position:** In this field, you would need to choose Position for Watermark.
2160
+
2161
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2162
+
2163
+ If you would like to use an Image as Watermark, then you would need to choose "Image" from Watermark Type dropdown.
2164
+
2165
+ Here is the description of each control on the page.
2166
+
2167
+ **Watermark URL:** In this field, you would need to provide URL of that particular image. If you would like to add image from Media Library, then you would need to click on "Add Image" button and choose image from Media Library.
2168
+
2169
+ **Watermark Size:** In this field, you would need to provide appropriate Size (in percentage for the responsive look) for Watermark Image.
2170
+
2171
+ **Offset:** In this field, you would need to provide values for Offset X and Y for Watermark.
2172
+
2173
+ **Watermark Opacity:** In this field, you would need to provide Opacity for Watermark. It should be from 0 to 100.
2174
+
2175
+ **Watermark Position:** In this field, you would need to choose Position for Watermark.
2176
+
2177
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2178
+
2179
+ = How to manage Advertisement?(Premium Edition) =
2180
+
2181
+ On the **Gallery Bank Navigation Panel**, click on **General Settings - Advertisement**.
2182
+
2183
+ **Advertisement Type:** In this field, you would need to choose what type of Advertisement would you like to use in your galleries and albums. It could be Text or Image. If you would not like to use Advertisement then choose "None".
2184
+
2185
+ Here is the description of each control on the page.
2186
+
2187
+ **Advertisement Text:** In this field, you would need to provide Advertisement Text which will be displayed over the gallery/album images.
2188
+
2189
+ **Advertisement Link:** In this field, you would need to provide link for advertisement, which will open when the user clicks on Advertisement Text.
2190
+
2191
+ **Advertisement Opacity:** In this field, you would need to provide "Advertisement Opacity" for Advertisement. It should be from 0 to 100.
2192
+
2193
+ **Font Style:** In this field, you would need to provide Font Size and Color for Advertisement Text.
2194
+
2195
+ **Font Family:** In this field, you would need to choose "Font Family" for Advertisement Text from dropdown.
2196
+
2197
+ **Advertisement Position:** In this field, you would need to choose Position for Advertisement.
2198
+
2199
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2200
+
2201
+ If you would like to use an Image as Advertisement, then you would need to choose "Image" from Advertisement Type dropdown.
2202
+
2203
+ Here is the description of each control on the page.
2204
+
2205
+ **Advertisement Link:** In this field, you would need to provide link for advertisement, which will open when the user clicks on Advertisement Image.
2206
+
2207
+ **Advertisement Opacity:** In this field, you would need to provide "Advertisement Opacity" for Advertisement. It should be from 0 to 100.
2208
+
2209
+ **Advertisement URL:** In this field, you would need to provide URL of that particular image. If you would like to add image from Media Library, then you would need to click on "Add Image" button and choose image from Media Library.
2210
+
2211
+ **Advertisement Image Width:** In this field, you would need to provide Width for Advertisement Image.
2212
+
2213
+ **Advertisement Height:** In this field, you would need to provide Height for Advertisement Image.
2214
+
2215
+ **Advertisement Position:** In this field, you would need to choose Position for Advertisement.
2216
+
2217
+ Once everything is being setup, you would need to click on "Save Changes" button located at bottom of the page to save the settings.
2218
+
2219
+ = Are there some restrictions for adding images? =
2220
+
2221
+ There is no limit for the amount of images. You can add as many images as you want. Plugin has no limitations on upload of images and galleries.
2222
+
2223
+ = When I upgrade to the commercial version, will I lose all the images, galleries and settings that I have made up in the free version of the Gallery? =
2224
+
2225
+ Of course Not. In order to completely remove everything from the database, you have to go Other Settings option in the Gallery Bank menu and choose Delete Tables at Uninstall to **enable**.
2226
+
2227
+ = Do you have any problems with plugin installation or usage? =
2228
+
2229
+ You can use [WordPress Support Forums](https://WordPress.org/support/plugin/gallery-bank/). They will help you to quickly install a Gallery Plugin. We are always ready to help everyone.
2230
+
2231
+ For more information, feel free to visit the official website for the [Gallery WordPress Gallery Plugin](https://WordPress.org/support/plugin/gallery-bank/)
2232
+
2233
+ == Installation ==
2234
+
2235
+ ### Gallery Bank - Performing a new installation
2236
+
2237
+ = Minimum Requirements =
2238
+
2239
+ The following set of lists are the minimum requirements for installing Gallery Bank on your machine.
2240
+
2241
+ * WordPress 3.3+
2242
+ * PHP 5.x
2243
+ * MySQL 5.x
2244
+ = Using The WordPress Dashboard =
2245
+
2246
+ 1. Navigate to the 'Add New' in the Plugins Dashboard
2247
+ 2. Search for 'Gallery Bank'
2248
+ 3. Click 'Install Now'
2249
+ 4. Activate the Plugin on the Plugin dashboard
2250
+
2251
+ = Uploading in WordPress Dashboard =
2252
+
2253
+ 1. Navigate to the 'Add New' in the Plugins Dashboard
2254
+ 2. Navigate to the 'Upload' area
2255
+ 3. Select `gallery-bank.zip` from your computer
2256
+ 4. Click 'Install Now'
2257
+ 5. Activate the Plugin in the Plugin dashboard
2258
+
2259
+ = Using FTP =
2260
+
2261
+ 1. Download `gallery-bank.zip`
2262
+ 2. Extract the `gallery-bank` directory to your computer
2263
+ 3. Upload the `gallery-bank` directory to the `/wp-content/plugins/` directory
2264
+ 4. Activate the Plugin in the Plugin's dashboard
2265
+
2266
+ ** For Mac Users
2267
+
2268
+ 1. Go to your Downloads folder and locate the folder with the Plugin.
2269
+ 2. Right-click on the folder and select Compress.
2270
+ 3. Now you have a newly created .zip file which can be installed as described here.
2271
+
2272
+ == Screenshots ==
2273
+
2274
+ 1. Manage Galleries - WordPress Photo Gallery Plugin
2275
+ 2. Add Gallery - Gallery Title & Description - WordPress Photo Gallery Plugin
2276
+ 3. Add Gallery - Upload Images - WordPress Photo Gallery Plugin
2277
+ 4. Add Gallery - Upload Images - WP Media Manager - WordPress Photo Gallery Plugin
2278
+ 5. Add Gallery - Upload Images - Upload From FTP - WordPress Photo Gallery Plugin
2279
+ 6. Sort Galleries - WordPress Photo Gallery Plugin
2280
+ 7. Manage Albums - WordPress Photo Albums Plugin
2281
+ 8. Add Album - Album Title & Description
2282
+ 9. Add Album - Upload Albums
2283
+ 10. Sort Albums
2284
+ 11. Manage Tags
2285
+ 12. Add Tag
2286
+ 13. Layout Settings - Thumbnail Layout - Thumbnails
2287
+ 14. Layout Settings - Thumbnail Layout - Layout Title
2288
+ 15. Layout Settings - Thumbnail Layout - Gallery Description
2289
+ 16. Layout Settings - Thumbnail Layout - Thumbnail Title
2290
+ 17. Layout Settings - Thumbnail Layout - Thumbnail Description
2291
+ 18. Layout Settings - Masonry Layout - Thumbnails
2292
+ 19. Layout Settings - Masonry Layout - Gallery Title
2293
+ 20. Layout Settings - Masonry Layout - Gallery Description
2294
+ 21. Layout Settings - Masonry Layout - Thumbnail Title
2295
+ 22. Layout Settings - Masonry Layout - Thumbnail Description
2296
+ 23. Layout Settings - Slideshow Layout - Thumbnails
2297
+ 24. Layout Settings - Slideshow Layout - Gallery Title
2298
+ 25. Layout Settings - Slideshow Layout - Gallery Description
2299
+ 26. Layout Settings - Slideshow Layout - Thumbnail Title
2300
+ 27. Layout Settings - Slideshow Layout - Thumbnail Description
2301
+ 28. Layout Settings - Image Browser Layout - Thumbnails
2302
+ 29. Layout Settings - Image Browser Layout - Gallery Title
2303
+ 30. Layout Settings - Image Browser Layout - Gallery Description
2304
+ 31. Layout Settings - Image Browser Layout - Thumbnail Title
2305
+ 32. Layout Settings - Image Browser Layout - Thumbnail Description
2306
+ 33. Layout Settings - Justified Grid Layout - Thumbnails
2307
+ 34. Layout Settings - Justified Grid Layout - Gallery Title
2308
+ 35. Layout Settings - Justified Grid Layout - Gallery Description
2309
+ 36. Layout Settings - Justified Grid Layout - Thumbnail Title
2310
+ 37. Layout Settings - Justified Grid Layout - Thumbnail Description
2311
+ 38. Layout Settings - Blog Style Layout - Thumbnails
2312
+ 39. Layout Settings - Blog Style Layout - Gallery Title
2313
+ 40. Layout Settings - Blog Style Layout - Gallery Description
2314
+ 41. Layout Settings - Blog Style Layout - Thumbnail Title
2315
+ 42. Layout Settings - Blog Style Layout - Thumbnail Description
2316
+ 43. Layout Settings - Compact Album Layout - Thumbnails
2317
+ 44. Layout Settings - Compact Album Layout - Album Title
2318
+ 45. Layout Settings - Compact Album Layout - Album Description
2319
+ 46. Layout Settings - Compact Album Layout - Gallery Title
2320
+ 47. Layout Settings - Compact Album Layout - Gallery Description
2321
+ 48. Layout Settings - Compact Album Layout - Buttons
2322
+ 49. Layout Settings - Extended Album Layout - Thumbnails
2323
+ 50. Layout Settings - Extended Album Layout - Album Title
2324
+ 51. Layout Settings - Extended Album Layout - Album Description
2325
+ 52. Layout Settings - Extended Album Layout - Gallery Title
2326
+ 53. Layout Settings - Extended Album Layout - Gallery Description
2327
+ 54. Layout Settings - Extended Album Layout - Buttons
2328
+ 55. Layout Settings - Custom CSS
2329
+ 56. Lightboxes - Lightcase - Settings
2330
+ 57. Lightboxes - Lightcase - Image Title
2331
+ 58. Lightboxes - Lightcase - Image Description
2332
+ 59. Lightboxes - Fancy Box - Settings
2333
+ 60. Lightboxes - Fancy Box - Image Title
2334
+ 61. Lightboxes - Fancy Box - Image Description
2335
+ 62. Lightboxes - Color Box - Settings
2336
+ 63. Lightboxes - Color Box - Image Title
2337
+ 64. Lightboxes - Color Box - Image Description
2338
+ 65. Lightboxes - Foo Box Free Edition - Settings
2339
+ 66. Lightboxes - Foo Box Free Edition - Image Title
2340
+ 67. Lightboxes - Foo Box Free Edition - Image Description
2341
+ 68. Lightboxes - Nivo Lightbox - Settings
2342
+ 69. Lightboxes - Nivo Lightbox - Image Title
2343
+ 70. Lightboxes - Nivo Lightbox - Image Description
2344
+ 71. General Settings - Global Options
2345
+ 72. General Settings - Lazy Load Settings
2346
+ 73. General Settings - Filter Settings
2347
+ 74. General Settings - Order By Settings
2348
+ 75. General Settings - Search Box Settings
2349
+ 76. General Settings - Page Navigation
2350
+ 77. General Settings - Watermark Settings - Text
2351
+ 78. General Settings - Watermark Settings - Image
2352
+ 79. General Settings - Advertisement - Text
2353
+ 80. General Settings - Advertisement - Image
2354
+ 81. Wordpress Gallery Shortcode - Thumbnail Layout
2355
+ 82. Wordpress Gallery Shortcode - Masonry Layout
2356
+ 83. Wordpress Gallery Shortcode - Slideshow Layout
2357
+ 84. Wordpress Gallery Shortcode - Image Browser Layout
2358
+ 85. Wordpress Gallery Shortcode - Justified Grid Layout
2359
+ 86. Wordpress Gallery Shortcode - Blog Style Layout
2360
+ 87. Other Settings
2361
+ 88. Roles & Capabilities
2362
+ 89. Feature Requests
2363
+ 90. System Information
2364
+
2365
+ == Changelog ==
2366
+
2367
+ = 4.0.5 =
2368
+
2369
+ * FIX: Global Options Bugs
2370
+ * FIX: Wizard Bugs
2371
+ * FIX: Layout Bugs
2372
+ * TWEAK: Unwanted Asterisks removed from Add Gallery Layout
2373
+
2374
+ = 4.0.4 =
2375
+
2376
+ * FIX: Lightbox Caption
2377
+ * TWEAK: PLUploader updated to latest release
2378
+ * TWEAK: Jquery Validator updated to latest release
2379
+ * TWEAK: Jquery Modal updated to latest release
2380
+ * FIX: Major Bugs
2381
+
2382
+ = 4.0.3 =
2383
+
2384
+ * FIX: Lightbox Bugs
2385
+ * FIX: Code Optimized
2386
+ * FIX: Obsolete Code Removed
2387
+ * FIX: Headers Output Bug
2388
+
2389
+ = 4.0.2 =
2390
+
2391
+ * FIX: Lightbox Bug
2392
+ * TWEAK: New Lightbox Option Added
2393
+ * FIX: Code Optimized
2394
+
2395
+ = 4.0.1 =
2396
+
2397
+ * FIX: Obsolete Code Removed
2398
+ * FIX: Major Bugs
2399
+ * FIX: Install Script Code Optimized
2400
+ * FIX: Wizard Page Error
2401
+ * FIX: Code Optimized
2402
+
2403
+ = 4.0.0 =
2404
+
2405
+ * TWEAK: Major Version Release
2406
+ * TWEAK: Layouts Changed
2407
+ * TWEAK: Layouts Changed
2408
+ * TWEAK: Front End Complete Revamped
2409
+ * TWEAK: Database Optimized
2410
+ * TWEAK: Security Patch Added
2411
+ * TWEAK: Modified JS & CSS Functions to only call on own Plugin Page
2412
+ * TWEAK: Layouts Changed
2413
+ * TWEAK: Obsolete Code Deleted
2414
+ * TWEAK: CSS Improved
2415
+ * TWEAK: Improved Performance of Photo Gallery Plugin
user-views/includes/albums/style-sheet.php CHANGED
@@ -12,6 +12,8 @@ if (!defined("ABSPATH")) {
12
  if (isset($id)) {
13
  //TODO: Code for General Options
14
  if (isset($album_type)) {
 
 
15
  switch (esc_attr($album_type)) {
16
  case "compact_album" :
17
  //font families extract from database
@@ -88,12 +90,20 @@ if (isset($id)) {
88
  }
89
  ?>
90
  <style type="text/css">
91
- <?php
92
- echo isset($import_font_family_layout) ? $import_font_family_layout : "";
93
- if (isset($album_type)) {
94
- switch ($album_type) {
95
- case "compact_album" :
96
- ?>
 
 
 
 
 
 
 
 
97
  .album_title_container <?php echo $compact_album_layout_title_html_tag; ?>
98
  {
99
  line-height: <?php echo $compact_album_layout_title_line_height; ?> !important;
@@ -174,12 +184,12 @@ if (isset($id)) {
174
  {
175
  cursor: pointer !important;
176
  }
177
- <?php
178
- break;
 
179
  }
180
- }
181
- echo htmlspecialchars_decode($custom_css["custom_css"]);
182
- ?>
183
  </style>
184
  <?php
185
  }
12
  if (isset($id)) {
13
  //TODO: Code for General Options
14
  if (isset($album_type)) {
15
+ $global_options_language_direction = isset($global_options_settings["global_options_language_direction"]) && $global_options_settings["global_options_language_direction"] == "right_to_left" ? "rtl" : "ltr";
16
+ $global_options_alignment = isset($alignment) ? esc_attr($alignment) : "left";
17
  switch (esc_attr($album_type)) {
18
  case "compact_album" :
19
  //font families extract from database
90
  }
91
  ?>
92
  <style type="text/css">
93
+ .gallery_bank_album_main_container
94
+ {
95
+ direction: <?php echo $global_options_language_direction; ?> !important;
96
+ }
97
+ .gb-filter-holder_<?php echo $random; ?>
98
+ {
99
+ text-align: <?php echo $global_options_alignment; ?>;
100
+ }
101
+ <?php
102
+ echo isset($import_font_family_layout) ? $import_font_family_layout : "";
103
+ if (isset($album_type)) {
104
+ switch ($album_type) {
105
+ case "compact_album" :
106
+ ?>
107
  .album_title_container <?php echo $compact_album_layout_title_html_tag; ?>
108
  {
109
  line-height: <?php echo $compact_album_layout_title_line_height; ?> !important;
184
  {
185
  cursor: pointer !important;
186
  }
187
+ <?php
188
+ break;
189
+ }
190
  }
191
+ echo htmlspecialchars_decode($custom_css["custom_css"]);
192
+ ?>
 
193
  </style>
194
  <?php
195
  }
user-views/includes/common-variables.php CHANGED
@@ -25,6 +25,7 @@ $row_height = str_replace('&quot;', '', $row_height);
25
  $source_type = str_replace('&quot;', '', $source_type);
26
  $random = rand(100, 10000);
27
 
 
28
  $custom_css = user_helper_gallery_bank::get_meta_value_gallery_bank("custom_css");
29
  if (isset($animation_effects)) {
30
  wp_enqueue_style("gallery-bank-animation-effects.css", GALLERY_BANK_PLUGIN_DIR_URL . "user-views/assets/css/animation-effects/gb-animation-effects.css");
25
  $source_type = str_replace('&quot;', '', $source_type);
26
  $random = rand(100, 10000);
27
 
28
+ $global_options_settings = user_helper_gallery_bank::get_meta_value_gallery_bank("global_options_settings");
29
  $custom_css = user_helper_gallery_bank::get_meta_value_gallery_bank("custom_css");
30
  if (isset($animation_effects)) {
31
  wp_enqueue_style("gallery-bank-animation-effects.css", GALLERY_BANK_PLUGIN_DIR_URL . "user-views/assets/css/animation-effects/gb-animation-effects.css");
user-views/includes/galleries/scripts-before.php CHANGED
@@ -67,40 +67,39 @@ if (isset($layout_type)) {
67
  switch (lightbox_type)
68
  {
69
  case "foo_box_free_edition":
70
- <?php
71
- if(!class_exists("fooboxV2"))
72
- {
73
- ?>
74
- var showCount_settings = <?php echo isset($foobox_meta_data["foo_box_show_count"]) ? $foobox_meta_data["foo_box_show_count"] : true; ?>;
75
- var closeOnOverlayClick = <?php echo isset($foobox_meta_data["foo_box_close_overlay_click"]) ? $foobox_meta_data["foo_box_close_overlay_click"] : true; ?>;
76
- var hideScrollbars = <?php echo isset($foobox_meta_data["foo_box_hide_page_scrollbar"]) ? $foobox_meta_data["foo_box_hide_page_scrollbar"] : true; ?>;
77
- var onlyShowOnHover = <?php echo isset($foobox_meta_data["foo_box_show_on_hover"]) ? $foobox_meta_data["foo_box_show_on_hover"] : true; ?>;
78
- (function (FOOBOX, $)
79
- {
80
- FOOBOX.init = function () {
81
- FOOBOX.o = {
82
- showCount: showCount_settings,
83
- closeOnOverlayClick: closeOnOverlayClick,
84
- hideScrollbars: hideScrollbars,
85
- captions:
86
- {
87
- onlyShowOnHover: onlyShowOnHover,
88
- overrideTitle:true,
89
- titleSource:'anchor',
90
- overrideDesc:true,
91
- descSource:'anchor'
92
- }
 
93
  };
94
- $(".foobox").foobox(FOOBOX.o);
95
- };
96
- }(window.FOOBOX = window.FOOBOX || {}, jQuery));
97
- jQuery(function ($)
98
- {
99
- FOOBOX.init();
100
- });
101
- <?php
102
- }
103
- ?>
104
  break;
105
  }
106
  }
67
  switch (lightbox_type)
68
  {
69
  case "foo_box_free_edition":
70
+ <?php
71
+ if (!class_exists("fooboxV2")) {
72
+ ?>
73
+ var showCount_settings = <?php echo isset($foobox_meta_data["foo_box_show_count"]) ? $foobox_meta_data["foo_box_show_count"] : true; ?>;
74
+ var closeOnOverlayClick = <?php echo isset($foobox_meta_data["foo_box_close_overlay_click"]) ? $foobox_meta_data["foo_box_close_overlay_click"] : true; ?>;
75
+ var hideScrollbars = <?php echo isset($foobox_meta_data["foo_box_hide_page_scrollbar"]) ? $foobox_meta_data["foo_box_hide_page_scrollbar"] : true; ?>;
76
+ var onlyShowOnHover = <?php echo isset($foobox_meta_data["foo_box_show_on_hover"]) ? $foobox_meta_data["foo_box_show_on_hover"] : true; ?>;
77
+ (function (FOOBOX, $)
78
+ {
79
+ FOOBOX.init = function () {
80
+ FOOBOX.o = {
81
+ showCount: showCount_settings,
82
+ closeOnOverlayClick: closeOnOverlayClick,
83
+ hideScrollbars: hideScrollbars,
84
+ captions:
85
+ {
86
+ onlyShowOnHover: onlyShowOnHover,
87
+ overrideTitle: true,
88
+ titleSource: 'anchor',
89
+ overrideDesc: true,
90
+ descSource: 'anchor'
91
+ }
92
+ };
93
+ $(".foobox").foobox(FOOBOX.o);
94
  };
95
+ }(window.FOOBOX = window.FOOBOX || {}, jQuery));
96
+ jQuery(function ($)
97
+ {
98
+ FOOBOX.init();
99
+ });
100
+ <?php
101
+ }
102
+ ?>
 
 
103
  break;
104
  }
105
  }
user-views/includes/galleries/style-sheet.php CHANGED
@@ -12,6 +12,8 @@ if (!defined("ABSPATH")) {
12
  if (isset($id)) {
13
  //TODO: Code for General Options
14
  if (isset($layout_type)) {
 
 
15
  switch (esc_attr($layout_type)) {
16
  case "thumbnail_layout" :
17
  //font families extract from database
@@ -218,7 +220,7 @@ if (isset($id)) {
218
  }
219
  }
220
  if (isset($album_type) && $album_type == "compact_album") {
221
- $compact_album_button_text_font_family = [$compact_album_layout_settings["compact_album_layout_button_text_font_family"]];
222
  $import_compact_button_text_font_family = user_helper_gallery_bank::unique_font_families_gallery_bank($compact_album_button_text_font_family);
223
  $font_family_compact_button_text = user_helper_gallery_bank::font_families_gallery_bank($compact_album_button_text_font_family);
224
 
@@ -236,19 +238,27 @@ if (isset($id)) {
236
  }
237
  ?>
238
  <style type="text/css">
239
- <?php
240
- echo isset($import_font_family_layout) ? $import_font_family_layout : "";
241
- echo isset($import_font_family_lightbox) ? $import_font_family_lightbox : "";
242
- echo isset($import_compact_button_text_font_family) ? $import_compact_button_text_font_family : "";
243
- if (isset($layout_type)) {
244
- switch ($layout_type) {
245
- case "thumbnail_layout" :
246
- ?>
 
 
 
 
 
 
 
 
247
  #gallery_bank_main_container_<?php echo $random; ?>
248
  {
249
  width: <?php echo $thumbnail_layout_container_width; ?>% !important;
250
  max-width: <?php echo $thumbnail_layout_max_width; ?>px !important;
251
- <?php echo $thumbnail_text_alignment; ?>
252
  }
253
  #gallery_title_container_<?php echo $random; ?> <?php echo $thumbnail_layout_gallery_title_html_tag; ?>
254
  {
@@ -310,13 +320,13 @@ if (isset($id)) {
310
  .grid_content_item
311
  {
312
  width: <?php echo intval($thumbnail_layout_thumbnail_dimensions[0]); ?>px !important;
313
- <?php
314
- if ($thumbnail_layout_background_color_transparency[0] != "") {
315
- ?>
316
  background: rgba(<?php echo intval($thumbnail_layout_background_color[0]); ?>,<?php echo intval($thumbnail_layout_background_color[1]); ?>,<?php echo intval($thumbnail_layout_background_color[2]); ?>,<?php echo floatval($thumbnail_layout_background_transparency); ?>) !important;
317
- <?php
318
- }
319
- ?>
320
  }
321
  .grid_single_text_title <?php echo $thumbnail_layout_thumbnail_title_html_tag; ?>
322
  {
@@ -340,15 +350,15 @@ if (isset($id)) {
340
  padding: <?php echo intval($thumbnail_layout_thumbnail_desc_padding[0]); ?>px <?php echo intval($thumbnail_layout_thumbnail_desc_padding[1]); ?>px <?php echo intval($thumbnail_layout_thumbnail_desc_padding[2]); ?>px <?php echo intval($thumbnail_layout_thumbnail_desc_padding[3]); ?>px !important;
341
  font-family: <?php echo $font_family_name_layout[3]; ?>
342
  }
343
- <?php
344
- break;
345
 
346
- case "masonry_layout" :
347
- ?>
348
  #gallery_bank_main_container_<?php echo $random; ?>
349
  {
350
  max-width: <?php echo $masonry_layout_max_width; ?>px !important;
351
- <?php echo $masonry_text_alignment; ?>
352
  }
353
  #gallery_title_container_<?php echo $random; ?> <?php echo $masonry_layout_gallery_title_html_tag; ?>
354
  {
@@ -376,13 +386,13 @@ if (isset($id)) {
376
  }
377
  .masonry_grid_wrapper_item
378
  {
379
- <?php
380
- if ($masonry_layout_thumbnail_background_color_transparency[0] != "") {
381
- ?>
382
  background: rgba(<?php echo intval($masonry_layout_thumbnail_background_color[0]); ?>,<?php echo intval($masonry_layout_thumbnail_background_color[1]); ?>,<?php echo intval($masonry_layout_thumbnail_background_color[2]); ?>,<?php echo floatval($masonry_layout_thumbnail_background_transparency); ?>) !important;
383
- <?php
384
- }
385
- ?>
386
  margin: <?php echo intval($masonry_layout_thumbnail_margin[0]); ?>px <?php echo intval($masonry_layout_thumbnail_margin[1]); ?>px <?php echo intval($masonry_layout_thumbnail_margin[2]); ?>px <?php echo intval($masonry_layout_thumbnail_margin[3]); ?>px !important;
387
  padding: <?php echo intval($masonry_layout_thumbnail_padding[0]); ?>px <?php echo intval($masonry_layout_thumbnail_padding[1]); ?>px <?php echo intval($masonry_layout_thumbnail_padding[2]); ?>px <?php echo intval($masonry_layout_thumbnail_padding[3]); ?>px !important;
388
  overflow: hidden !important;
@@ -432,14 +442,14 @@ if (isset($id)) {
432
  padding: <?php echo intval($masonry_layout_thumbnail_description_padding[0]); ?>px <?php echo intval($masonry_layout_thumbnail_description_padding[1]); ?>px <?php echo intval($masonry_layout_thumbnail_description_padding[2]); ?>px <?php echo intval($masonry_layout_thumbnail_description_padding[3]); ?>px !important;
433
  font-family: <?php echo $font_family_name_layout[3]; ?>
434
  }
435
- <?php
436
- break;
 
437
  }
438
- }
439
- if (isset($lightbox_type)) {
440
- switch (esc_attr($lightbox_type)) {
441
- case "foo_box_free_edition":
442
- ?>
443
  .fbx-caption
444
  {
445
  text-align: left !important;
@@ -474,13 +484,13 @@ if (isset($id)) {
474
  }
475
  .fbx-modal
476
  {
477
- <?php
478
- if ($foo_box_overlay_color != "") {
479
- ?>
480
  background-color: rgba(<?php echo intval($foo_box_background_overlay_color[0]); ?>,<?php echo intval($foo_box_background_overlay_color[1]); ?>,<?php echo intval($foo_box_background_overlay_color[2]); ?>,<?php echo $foo_box_overlay_opacity; ?>) !important;
481
- <?php
482
- }
483
- ?>
484
  }
485
  .fbx-inner
486
  {
@@ -495,12 +505,12 @@ if (isset($id)) {
495
  -moz-border-radius: <?php echo $foo_box_border_radius; ?>px !important;
496
  border-radius: <?php echo $foo_box_border_radius; ?>px !important;
497
  }
498
- <?php
499
- break;
 
500
  }
501
- }
502
- if (isset($album_type) && $album_type == "compact_album") {
503
- ?>
504
  .album_layout_button:hover, .album_layout_button:focus, .album_layout_button.focus
505
  {
506
  color: <?php echo esc_attr($compact_album_button_font_hover_color); ?> !important;
@@ -536,10 +546,10 @@ if (isset($id)) {
536
  border-radius: <?php echo intval($compact_album_button_border_radius); ?>px !important;
537
  font-family: <?php echo isset($font_family_compact_button_text[0]) ? htmlspecialchars_decode($font_family_compact_button_text[0]) : "Roboto Slab:300"; ?>
538
  }
539
- <?php
540
- }
541
- echo htmlspecialchars_decode($custom_css["custom_css"]);
542
- ?>
543
  </style>
544
  <?php
545
  }
12
  if (isset($id)) {
13
  //TODO: Code for General Options
14
  if (isset($layout_type)) {
15
+ $global_options_language_direction = isset($global_options_settings["global_options_language_direction"]) && $global_options_settings["global_options_language_direction"] == "right_to_left" ? "rtl" : "ltr";
16
+ $global_options_alignment = isset($alignment) ? esc_attr($alignment) : "left";
17
  switch (esc_attr($layout_type)) {
18
  case "thumbnail_layout" :
19
  //font families extract from database
220
  }
221
  }
222
  if (isset($album_type) && $album_type == "compact_album") {
223
+ $compact_album_button_text_font_family[] = $compact_album_layout_settings["compact_album_layout_button_text_font_family"];
224
  $import_compact_button_text_font_family = user_helper_gallery_bank::unique_font_families_gallery_bank($compact_album_button_text_font_family);
225
  $font_family_compact_button_text = user_helper_gallery_bank::font_families_gallery_bank($compact_album_button_text_font_family);
226
 
238
  }
239
  ?>
240
  <style type="text/css">
241
+ #gallery_bank_main_container_<?php echo $random; ?>
242
+ {
243
+ direction: <?php echo $global_options_language_direction; ?> !important;
244
+ }
245
+ .gb-filter-holder_<?php echo $random; ?>
246
+ {
247
+ text-align: <?php echo $global_options_alignment; ?>;
248
+ }
249
+ <?php
250
+ echo isset($import_font_family_layout) ? $import_font_family_layout : "";
251
+ echo isset($import_font_family_lightbox) ? $import_font_family_lightbox : "";
252
+ echo isset($import_compact_button_text_font_family) ? $import_compact_button_text_font_family : "";
253
+ if (isset($layout_type)) {
254
+ switch ($layout_type) {
255
+ case "thumbnail_layout" :
256
+ ?>
257
  #gallery_bank_main_container_<?php echo $random; ?>
258
  {
259
  width: <?php echo $thumbnail_layout_container_width; ?>% !important;
260
  max-width: <?php echo $thumbnail_layout_max_width; ?>px !important;
261
+ <?php echo $thumbnail_text_alignment; ?>
262
  }
263
  #gallery_title_container_<?php echo $random; ?> <?php echo $thumbnail_layout_gallery_title_html_tag; ?>
264
  {
320
  .grid_content_item
321
  {
322
  width: <?php echo intval($thumbnail_layout_thumbnail_dimensions[0]); ?>px !important;
323
+ <?php
324
+ if ($thumbnail_layout_background_color_transparency[0] != "") {
325
+ ?>
326
  background: rgba(<?php echo intval($thumbnail_layout_background_color[0]); ?>,<?php echo intval($thumbnail_layout_background_color[1]); ?>,<?php echo intval($thumbnail_layout_background_color[2]); ?>,<?php echo floatval($thumbnail_layout_background_transparency); ?>) !important;
327
+ <?php
328
+ }
329
+ ?>
330
  }
331
  .grid_single_text_title <?php echo $thumbnail_layout_thumbnail_title_html_tag; ?>
332
  {
350
  padding: <?php echo intval($thumbnail_layout_thumbnail_desc_padding[0]); ?>px <?php echo intval($thumbnail_layout_thumbnail_desc_padding[1]); ?>px <?php echo intval($thumbnail_layout_thumbnail_desc_padding[2]); ?>px <?php echo intval($thumbnail_layout_thumbnail_desc_padding[3]); ?>px !important;
351
  font-family: <?php echo $font_family_name_layout[3]; ?>
352
  }
353
+ <?php
354
+ break;
355
 
356
+ case "masonry_layout" :
357
+ ?>
358
  #gallery_bank_main_container_<?php echo $random; ?>
359
  {
360
  max-width: <?php echo $masonry_layout_max_width; ?>px !important;
361
+ <?php echo $masonry_text_alignment; ?>
362
  }
363
  #gallery_title_container_<?php echo $random; ?> <?php echo $masonry_layout_gallery_title_html_tag; ?>
364
  {
386
  }
387
  .masonry_grid_wrapper_item
388
  {
389
+ <?php
390
+ if ($masonry_layout_thumbnail_background_color_transparency[0] != "") {
391
+ ?>
392
  background: rgba(<?php echo intval($masonry_layout_thumbnail_background_color[0]); ?>,<?php echo intval($masonry_layout_thumbnail_background_color[1]); ?>,<?php echo intval($masonry_layout_thumbnail_background_color[2]); ?>,<?php echo floatval($masonry_layout_thumbnail_background_transparency); ?>) !important;
393
+ <?php
394
+ }
395
+ ?>
396
  margin: <?php echo intval($masonry_layout_thumbnail_margin[0]); ?>px <?php echo intval($masonry_layout_thumbnail_margin[1]); ?>px <?php echo intval($masonry_layout_thumbnail_margin[2]); ?>px <?php echo intval($masonry_layout_thumbnail_margin[3]); ?>px !important;
397
  padding: <?php echo intval($masonry_layout_thumbnail_padding[0]); ?>px <?php echo intval($masonry_layout_thumbnail_padding[1]); ?>px <?php echo intval($masonry_layout_thumbnail_padding[2]); ?>px <?php echo intval($masonry_layout_thumbnail_padding[3]); ?>px !important;
398
  overflow: hidden !important;
442
  padding: <?php echo intval($masonry_layout_thumbnail_description_padding[0]); ?>px <?php echo intval($masonry_layout_thumbnail_description_padding[1]); ?>px <?php echo intval($masonry_layout_thumbnail_description_padding[2]); ?>px <?php echo intval($masonry_layout_thumbnail_description_padding[3]); ?>px !important;
443
  font-family: <?php echo $font_family_name_layout[3]; ?>
444
  }
445
+ <?php
446
+ break;
447
+ }
448
  }
449
+ if (isset($lightbox_type)) {
450
+ switch (esc_attr($lightbox_type)) {
451
+ case "foo_box_free_edition":
452
+ ?>
 
453
  .fbx-caption
454
  {
455
  text-align: left !important;
484
  }
485
  .fbx-modal
486
  {
487
+ <?php
488
+ if ($foo_box_overlay_color != "") {
489
+ ?>
490
  background-color: rgba(<?php echo intval($foo_box_background_overlay_color[0]); ?>,<?php echo intval($foo_box_background_overlay_color[1]); ?>,<?php echo intval($foo_box_background_overlay_color[2]); ?>,<?php echo $foo_box_overlay_opacity; ?>) !important;
491
+ <?php
492
+ }
493
+ ?>
494
  }
495
  .fbx-inner
496
  {
505
  -moz-border-radius: <?php echo $foo_box_border_radius; ?>px !important;
506
  border-radius: <?php echo $foo_box_border_radius; ?>px !important;
507
  }
508
+ <?php
509
+ break;
510
+ }
511
  }
512
+ if (isset($album_type) && $album_type == "compact_album") {
513
+ ?>
 
514
  .album_layout_button:hover, .album_layout_button:focus, .album_layout_button.focus
515
  {
516
  color: <?php echo esc_attr($compact_album_button_font_hover_color); ?> !important;
546
  border-radius: <?php echo intval($compact_album_button_border_radius); ?>px !important;
547
  font-family: <?php echo isset($font_family_compact_button_text[0]) ? htmlspecialchars_decode($font_family_compact_button_text[0]) : "Roboto Slab:300"; ?>
548
  }
549
+ <?php
550
+ }
551
+ echo htmlspecialchars_decode($custom_css["custom_css"]);
552
+ ?>
553
  </style>
554
  <?php
555
  }
user-views/lib/helper.php CHANGED
@@ -92,17 +92,21 @@ if (!class_exists("user_helper_gallery_bank")) {
92
  Created By: Tech Banker Team
93
  */
94
  public static function font_families_gallery_bank($font_families) {
95
- foreach ($font_families as $font_family) {
96
- if (strpos($font_family, ":") != false) {
97
- $position = strpos($font_family, ":");
98
- $font_style = (substr($font_family, $position + 4, 6) == "italic") ? "\r\n\tfont-style: italic !important;" : "";
99
- $font_family_name[] = "'" . substr($font_family, 0, $position) . "'" . " !important;\r\n\tfont-weight: " . substr($font_family, $position + 1, 3) . " !important;" . $font_style;
100
- } else {
101
- $font_family_name[] = (strpos($font_family, "&") != false) ? "'" . strstr($font_family, "&", 1) . "' !important;" : "'" . $font_family . "' !important;";
 
 
 
 
 
102
  }
103
- }
104
- return $font_family_name;
105
- }
106
  /*
107
  Function Name: unique_font_families
108
  Parameters: Yes($unique_font_families,$import_font_family)
@@ -111,16 +115,18 @@ if (!class_exists("user_helper_gallery_bank")) {
111
  Created By: Tech Banker Team
112
  */
113
  public static function unique_font_families_gallery_bank($unique_font_families) {
114
- $import_font_family = "";
115
- foreach ($unique_font_families as $font_family) {
116
- $font_family = urlencode($font_family);
117
- if (is_ssl()) {
118
- $import_font_family .= "@import url('https://fonts.googleapis.com/css?family=" . $font_family . "');\r\n";
119
- } else {
120
- $import_font_family .= "@import url('http://fonts.googleapis.com/css?family=" . $font_family . "');\r\n";
 
 
 
121
  }
122
- }
123
- return $import_font_family;
124
- }
125
  }
126
  }
92
  Created By: Tech Banker Team
93
  */
94
  public static function font_families_gallery_bank($font_families) {
95
+ foreach ($font_families as $font_family) {
96
+ if ($font_family != "inherit") {
97
+ if (strpos($font_family, ":") != false) {
98
+ $position = strpos($font_family, ":");
99
+ $font_style = (substr($font_family, $position + 4, 6) == "italic") ? "\r\n\tfont-style: italic !important;" : "";
100
+ $font_family_name[] = "'" . substr($font_family, 0, $position) . "'" . " !important;\r\n\tfont-weight: " . substr($font_family, $position + 1, 3) . " !important;" . $font_style;
101
+ } else {
102
+ $font_family_name[] = (strpos($font_family, "&") != false) ? "'" . strstr($font_family, "&", 1) . "' !important;" : "'" . $font_family . "' !important;";
103
+ }
104
+ } else {
105
+ $font_family_name[] = "inherit";
106
+ }
107
  }
108
+ return $font_family_name;
109
+ }
 
110
  /*
111
  Function Name: unique_font_families
112
  Parameters: Yes($unique_font_families,$import_font_family)
115
  Created By: Tech Banker Team
116
  */
117
  public static function unique_font_families_gallery_bank($unique_font_families) {
118
+ $import_font_family = "";
119
+ foreach ($unique_font_families as $font_family) {
120
+ if ($font_family != "inherit") {
121
+ $font_family = urlencode($font_family);
122
+ if (is_ssl()) {
123
+ $import_font_family .= "@import url('https://fonts.googleapis.com/css?family=" . $font_family . "');\r\n";
124
+ } else {
125
+ $import_font_family .= "@import url('http://fonts.googleapis.com/css?family=" . $font_family . "');\r\n";
126
+ }
127
+ }
128
  }
129
+ return $import_font_family;
130
+ }
 
131
  }
132
  }
views/albums/add-album.php CHANGED
@@ -112,7 +112,7 @@ if (!is_user_logged_in()) {
112
  <label class="control-label">
113
  <?php echo $gb_album_description; ?> :
114
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_album_description_tooltip; ?>" data-placement="right"></i>
115
- <span class="required" aria-required="true">*<?php echo " (" . $gb_premium_edition . " )"; ?></span>
116
  </label>
117
  <?php
118
  $gb_album_description_data = isset($get_album_data_unserialize["album_description"]) ? htmlspecialchars_decode($get_album_data_unserialize["album_description"]) : "";
112
  <label class="control-label">
113
  <?php echo $gb_album_description; ?> :
114
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_album_description_tooltip; ?>" data-placement="right"></i>
115
+ <span class="required" aria-required="true"><?php echo " (" . $gb_premium_edition . " )"; ?></span>
116
  </label>
117
  <?php
118
  $gb_album_description_data = isset($get_album_data_unserialize["album_description"]) ? htmlspecialchars_decode($get_album_data_unserialize["album_description"]) : "";
views/galleries/add-gallery.php CHANGED
@@ -134,7 +134,6 @@ if (!is_user_logged_in()) {
134
  <label class="control-label">
135
  <?php echo $gb_gallery_description_title; ?> :
136
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_description_tooltip; ?>" data-placement="right"></i>
137
- <span class="required" aria-required="true">*</span>
138
  </label>
139
  <?php
140
  $gallery_description = isset($get_gallery_meta_data_unserialize["gallery_description"]) ? htmlspecialchars_decode($get_gallery_meta_data_unserialize["gallery_description"]) : "";
@@ -277,7 +276,6 @@ if (!is_user_logged_in()) {
277
  <label class="control-label">
278
  <?php echo $gb_add_gallery_image_title; ?> :
279
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_tooltip; ?>" data-placement="right"></i>
280
- <span class="required" aria-required="true">*</span>
281
  </label>
282
  <div class="input-icon right">
283
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_placeholder; ?>" class="form-control" name="ux_txt_img_title_" id="ux_txt_img_title_" value="">
@@ -289,7 +287,6 @@ if (!is_user_logged_in()) {
289
  <label class="control-label">
290
  <?php echo $gb_add_gallery_image_alt_text_title; ?> :
291
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_alt_text_tooltip; ?>" data-placement="right"></i>
292
- <span class="required" aria-required="true">*</span>
293
  </label>
294
  <div class="input-icon right">
295
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_alt_text_placeholder; ?>" class="form-control" name="ux_img_alt_text_" id="ux_img_alt_text_" value="">
@@ -301,7 +298,6 @@ if (!is_user_logged_in()) {
301
  <label class="control-label">
302
  <?php echo $gb_add_gallery_image_description_title; ?> :
303
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_description_tooltip; ?>" data-placement="right"></i>
304
- <span class="required" aria-required="true">*</span>
305
  </label>
306
  <div class="input-icon right">
307
  <textarea placeholder="<?php echo $gb_add_gallery_image_description_placeholder; ?>" class="form-control" name="ux_txt_img_desc_" id="ux_txt_img_desc_"></textarea>
@@ -311,7 +307,6 @@ if (!is_user_logged_in()) {
311
  <label class="control-label">
312
  <?php echo $gb_tags; ?> :
313
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_tag_tooltip; ?>" data-placement="right"></i>
314
- <span class="required" aria-required="true">*</span>
315
  </label>
316
  <div class="input-icon right">
317
  <select id="ux_ddl_tags_" name="ux_ddl_tags_" class="form-control" multiple>
@@ -331,7 +326,6 @@ if (!is_user_logged_in()) {
331
  <label class="control-label">
332
  <?php echo $gb_add_gallery_enable_url_title; ?> :
333
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_enable_url_tooltip; ?>" data-placement="right"></i>
334
- <span class="required" aria-required="true">*</span>
335
  </label>
336
  <div class="input-group">
337
  <label>
@@ -347,7 +341,6 @@ if (!is_user_logged_in()) {
347
  <div class="form-group" id="ux_div_url_redirect_" style="display:none;">
348
  <label class="control-label"><?php echo $gb_add_gallery_url_link_title; ?> :
349
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_url_link_tooltip; ?>" data-placement="right"></i>
350
- <span class="required" aria-required="true">*</span>
351
  </label>
352
  <div class="input-icon right">
353
  <input placeholder="<?php echo $gb_add_gallery_url_link_placeholder; ?>" class="form-control" type="text" name="ux_txt_img_url_" id="ux_txt_img_url_" value="http://">
@@ -416,7 +409,6 @@ if (!is_user_logged_in()) {
416
  <div class="form-group">
417
  <label class="control-label"><?php echo $gb_add_gallery_image_title; ?> :
418
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_tooltip; ?>" data-placement="right"></i>
419
- <span class="required" aria-required="true">*</span>
420
  </label>
421
  <div class="input-icon right">
422
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_placeholder; ?>" class="form-control edit" name="ux_txt_img_title_<?php echo intval($pic["id"]); ?>" id="ux_txt_img_title_<?php echo intval($pic["id"]); ?>" value="<?php echo esc_attr($pic["image_title"]); ?>"/>
@@ -427,7 +419,6 @@ if (!is_user_logged_in()) {
427
  <div class="form-group">
428
  <label class="control-label"><?php echo $gb_add_gallery_image_alt_text_title; ?> :
429
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_alt_text_tooltip; ?>" data-placement="right"></i>
430
- <span class="required" aria-required="true">*</span>
431
  </label>
432
  <div class="input-icon right">
433
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_alt_text_placeholder; ?>" class="form-control edit" name="ux_img_alt_text_<?php echo intval($pic["id"]); ?>" id="ux_img_alt_text_<?php echo intval($pic["id"]); ?>" value="<?php echo esc_attr(stripcslashes(urldecode($pic["alt_text"]))); ?>"/>
@@ -438,7 +429,6 @@ if (!is_user_logged_in()) {
438
  <div class="form-group">
439
  <label class="control-label"><?php echo $gb_add_gallery_image_description_title; ?> :
440
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_description_tooltip; ?>" data-placement="right"></i>
441
- <span class="required" aria-required="true">*</span>
442
  </label>
443
  <div class="input-icon right">
444
  <textarea placeholder="<?php echo $gb_add_gallery_image_description_placeholder; ?>" class="form-control" rows="3" name="ux_txt_img_desc_<?php echo intval($pic["id"]); ?>" id="ux_txt_img_desc_<?php echo intval($pic["id"]); ?>"><?php echo stripcslashes(urldecode($pic["image_description"])); ?></textarea>
@@ -447,7 +437,6 @@ if (!is_user_logged_in()) {
447
  <div class="form-group">
448
  <label class="control-label"><?php echo $gb_tags; ?> :
449
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_tag_tooltip; ?>" data-placement="right"></i>
450
- <span class="required" aria-required="true">*</span>
451
  </label>
452
  <div class="input-icon right">
453
  <select name="ux_ddl_tags_<?php echo intval($pic["id"]); ?>[]" id="ux_ddl_tags_<?php echo intval($pic["id"]); ?>" class="form-control" multiple>
@@ -467,7 +456,6 @@ if (!is_user_logged_in()) {
467
  <div class="form-group">
468
  <label class="control-label"> <?php echo $gb_add_gallery_enable_url_title; ?> :
469
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_enable_url_tooltip; ?>" data-placement="right"></i>
470
- <span class="required" aria-required="true">*</span>
471
  </label>
472
  <div class="input-group">
473
  <label>
@@ -481,7 +469,6 @@ if (!is_user_logged_in()) {
481
  <div class="form-group" id="ux_div_url_redirect_<?php echo intval($pic["id"]); ?>" style="display: none;">
482
  <label class="control-label"><?php echo $gb_add_gallery_url_link_title; ?> :
483
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_url_link_tooltip; ?>" data-placement="right"></i>
484
- <span class="required" aria-required="true">*</span>
485
  </label>
486
  <div class="input-icon right">
487
  <input placeholder="<?php echo $gb_add_gallery_url_link_placeholder; ?>" class="form-control" type="text" name="ux_txt_img_url_<?php echo intval($pic["id"]); ?>" id="ux_txt_img_url_<?php echo intval($pic["id"]); ?>" value="<?php echo esc_attr($pic["redirect_url"]); ?>"/>
134
  <label class="control-label">
135
  <?php echo $gb_gallery_description_title; ?> :
136
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_description_tooltip; ?>" data-placement="right"></i>
 
137
  </label>
138
  <?php
139
  $gallery_description = isset($get_gallery_meta_data_unserialize["gallery_description"]) ? htmlspecialchars_decode($get_gallery_meta_data_unserialize["gallery_description"]) : "";
276
  <label class="control-label">
277
  <?php echo $gb_add_gallery_image_title; ?> :
278
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_tooltip; ?>" data-placement="right"></i>
 
279
  </label>
280
  <div class="input-icon right">
281
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_placeholder; ?>" class="form-control" name="ux_txt_img_title_" id="ux_txt_img_title_" value="">
287
  <label class="control-label">
288
  <?php echo $gb_add_gallery_image_alt_text_title; ?> :
289
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_alt_text_tooltip; ?>" data-placement="right"></i>
 
290
  </label>
291
  <div class="input-icon right">
292
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_alt_text_placeholder; ?>" class="form-control" name="ux_img_alt_text_" id="ux_img_alt_text_" value="">
298
  <label class="control-label">
299
  <?php echo $gb_add_gallery_image_description_title; ?> :
300
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_description_tooltip; ?>" data-placement="right"></i>
 
301
  </label>
302
  <div class="input-icon right">
303
  <textarea placeholder="<?php echo $gb_add_gallery_image_description_placeholder; ?>" class="form-control" name="ux_txt_img_desc_" id="ux_txt_img_desc_"></textarea>
307
  <label class="control-label">
308
  <?php echo $gb_tags; ?> :
309
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_tag_tooltip; ?>" data-placement="right"></i>
 
310
  </label>
311
  <div class="input-icon right">
312
  <select id="ux_ddl_tags_" name="ux_ddl_tags_" class="form-control" multiple>
326
  <label class="control-label">
327
  <?php echo $gb_add_gallery_enable_url_title; ?> :
328
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_enable_url_tooltip; ?>" data-placement="right"></i>
 
329
  </label>
330
  <div class="input-group">
331
  <label>
341
  <div class="form-group" id="ux_div_url_redirect_" style="display:none;">
342
  <label class="control-label"><?php echo $gb_add_gallery_url_link_title; ?> :
343
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_url_link_tooltip; ?>" data-placement="right"></i>
 
344
  </label>
345
  <div class="input-icon right">
346
  <input placeholder="<?php echo $gb_add_gallery_url_link_placeholder; ?>" class="form-control" type="text" name="ux_txt_img_url_" id="ux_txt_img_url_" value="http://">
409
  <div class="form-group">
410
  <label class="control-label"><?php echo $gb_add_gallery_image_title; ?> :
411
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_tooltip; ?>" data-placement="right"></i>
 
412
  </label>
413
  <div class="input-icon right">
414
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_placeholder; ?>" class="form-control edit" name="ux_txt_img_title_<?php echo intval($pic["id"]); ?>" id="ux_txt_img_title_<?php echo intval($pic["id"]); ?>" value="<?php echo esc_attr($pic["image_title"]); ?>"/>
419
  <div class="form-group">
420
  <label class="control-label"><?php echo $gb_add_gallery_image_alt_text_title; ?> :
421
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_alt_text_tooltip; ?>" data-placement="right"></i>
 
422
  </label>
423
  <div class="input-icon right">
424
  <input type="text" placeholder="<?php echo $gb_add_gallery_image_alt_text_placeholder; ?>" class="form-control edit" name="ux_img_alt_text_<?php echo intval($pic["id"]); ?>" id="ux_img_alt_text_<?php echo intval($pic["id"]); ?>" value="<?php echo esc_attr(stripcslashes(urldecode($pic["alt_text"]))); ?>"/>
429
  <div class="form-group">
430
  <label class="control-label"><?php echo $gb_add_gallery_image_description_title; ?> :
431
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_image_description_tooltip; ?>" data-placement="right"></i>
 
432
  </label>
433
  <div class="input-icon right">
434
  <textarea placeholder="<?php echo $gb_add_gallery_image_description_placeholder; ?>" class="form-control" rows="3" name="ux_txt_img_desc_<?php echo intval($pic["id"]); ?>" id="ux_txt_img_desc_<?php echo intval($pic["id"]); ?>"><?php echo stripcslashes(urldecode($pic["image_description"])); ?></textarea>
437
  <div class="form-group">
438
  <label class="control-label"><?php echo $gb_tags; ?> :
439
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_tag_tooltip; ?>" data-placement="right"></i>
 
440
  </label>
441
  <div class="input-icon right">
442
  <select name="ux_ddl_tags_<?php echo intval($pic["id"]); ?>[]" id="ux_ddl_tags_<?php echo intval($pic["id"]); ?>" class="form-control" multiple>
456
  <div class="form-group">
457
  <label class="control-label"> <?php echo $gb_add_gallery_enable_url_title; ?> :
458
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_enable_url_tooltip; ?>" data-placement="right"></i>
 
459
  </label>
460
  <div class="input-group">
461
  <label>
469
  <div class="form-group" id="ux_div_url_redirect_<?php echo intval($pic["id"]); ?>" style="display: none;">
470
  <label class="control-label"><?php echo $gb_add_gallery_url_link_title; ?> :
471
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_gallery_url_link_tooltip; ?>" data-placement="right"></i>
 
472
  </label>
473
  <div class="input-icon right">
474
  <input placeholder="<?php echo $gb_add_gallery_url_link_placeholder; ?>" class="form-control" type="text" name="ux_txt_img_url_<?php echo intval($pic["id"]); ?>" id="ux_txt_img_url_<?php echo intval($pic["id"]); ?>" value="<?php echo esc_attr($pic["redirect_url"]); ?>"/>
views/galleries/manage-galleries.php CHANGED
@@ -128,19 +128,22 @@ if (!is_user_logged_in()) {
128
  <input type="checkbox" name="ux_chk_manage_gallery_<?php echo intval($row["meta_id"]); ?>" id="ux_chk_manage_gallery_<?php echo intval($row["meta_id"]); ?>" value="<?php echo intval($row["meta_id"]); ?>" onclick="check_all_gallery_bank('#ux_chk_all_galleries');">
129
  </td>
130
  <td class="custom-alternative custom-gallery-thumbnail" style="width:20%;">
131
- <?php
132
- if ($get_count_image == 0) {
133
- ?>
134
- <label>
135
- <img id="ux_gb_img" class="tech-banker-cover-image" src="<?php echo GALLERY_BANK_PLUGIN_DIR_URL . "/assets/admin/images/gallery-cover.png"; ?>">
136
- </label>
137
- <?php
138
- } else {
139
- ?>
140
- <img id="ux_gb_img" class="tech-banker-cover-image" src="<?php echo GALLERY_BANK_THUMBS_NON_CROPPED_URL . $row["gallery_cover_image"]; ?>">
141
- <?php
142
- }
143
- ?>
 
 
 
144
  <a href="admin.php?page=gb_add_gallery&gallery_id=<?php echo intval($row["meta_id"]); ?>&mode=edit">
145
  <i class="icon-custom-note tooltips" data-original-title="<?php echo $gb_add_gallery_edit_tooltip; ?>" data-placement="right"></i>
146
  <?php echo $gb_edit_tooltip; ?>
128
  <input type="checkbox" name="ux_chk_manage_gallery_<?php echo intval($row["meta_id"]); ?>" id="ux_chk_manage_gallery_<?php echo intval($row["meta_id"]); ?>" value="<?php echo intval($row["meta_id"]); ?>" onclick="check_all_gallery_bank('#ux_chk_all_galleries');">
129
  </td>
130
  <td class="custom-alternative custom-gallery-thumbnail" style="width:20%;">
131
+ <a href="admin.php?page=gb_add_gallery&gallery_id=<?php echo intval($row["meta_id"]); ?>&mode=edit">
132
+ <?php
133
+ if ($get_count_image == 0) {
134
+ ?>
135
+ <label>
136
+ <img id="ux_gb_img" class="tech-banker-cover-image" src="<?php echo GALLERY_BANK_PLUGIN_DIR_URL . "/assets/admin/images/gallery-cover.png"; ?>">
137
+ </label>
138
+ <?php
139
+ } else {
140
+ ?>
141
+
142
+ <img id="ux_gb_img" class="tech-banker-cover-image" src="<?php echo GALLERY_BANK_THUMBS_NON_CROPPED_URL . $row["gallery_cover_image"]; ?>">
143
+ <?php
144
+ }
145
+ ?>
146
+ </a>
147
  <a href="admin.php?page=gb_add_gallery&gallery_id=<?php echo intval($row["meta_id"]); ?>&mode=edit">
148
  <i class="icon-custom-note tooltips" data-original-title="<?php echo $gb_add_gallery_edit_tooltip; ?>" data-placement="right"></i>
149
  <?php echo $gb_edit_tooltip; ?>
views/tags/add-tag.php CHANGED
@@ -97,7 +97,7 @@ if (!is_user_logged_in()) {
97
  <label class="control-label">
98
  <?php echo $gb_tag_description_title; ?> :
99
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_tag_description_tooltip; ?>" data-placement="right"></i>
100
- <span class="required" aria-required="true">* ( <?php echo $gb_premium_edition; ?> ) </span>
101
  </label>
102
  <textarea class="form-control" name="ux_txtarea_tag_description" id="ux_txtarea_tag_description" rows="5" placeholder="<?php echo $gb_add_tag_description_placeholder; ?>"><?php echo isset($manage_tag_data["tag_description"]) ? esc_html($manage_tag_data["tag_description"]) : ""; ?></textarea>
103
  </div>
97
  <label class="control-label">
98
  <?php echo $gb_tag_description_title; ?> :
99
  <i class="icon-custom-question tooltips" data-original-title="<?php echo $gb_add_tag_description_tooltip; ?>" data-placement="right"></i>
100
+ <span class="required" aria-required="true"> ( <?php echo $gb_premium_edition; ?> ) </span>
101
  </label>
102
  <textarea class="form-control" name="ux_txtarea_tag_description" id="ux_txtarea_tag_description" rows="5" placeholder="<?php echo $gb_add_tag_description_placeholder; ?>"><?php echo isset($manage_tag_data["tag_description"]) ? esc_html($manage_tag_data["tag_description"]) : ""; ?></textarea>
103
  </div>
views/wizard/wizard.php CHANGED
@@ -87,7 +87,8 @@ if (!is_user_logged_in()) {
87
  <div class="row row-custom">
88
  <div class="col-md-12 textalign">
89
  <p>Hi there!</p>
90
- <p>Don't ever miss an important opportunity to opt in for Latest Features &amp; Security Updates as well as non-sensitive diagnostic tracking.</p>
 
91
  <p>If you're not ready to Opt-In, that's ok too!</p>
92
  <p><strong>Gallery Bank will still work fine.</strong></p>
93
  </div>
87
  <div class="row row-custom">
88
  <div class="col-md-12 textalign">
89
  <p>Hi there!</p>
90
+ <p>Don't ever miss an opportunity to opt in for Email Notifications / Announcements about exciting New Features and Update Releases.</p>
91
+ <p>Contribute in helping us making our plugin compatible with most plugins and themes by allowing to share non-sensitive information about your website.</p>
92
  <p>If you're not ready to Opt-In, that's ok too!</p>
93
  <p><strong>Gallery Bank will still work fine.</strong></p>
94
  </div>