Passed
Push — master ( bb25ea...0dcdad )
by Jean-Christophe
02:09
created

JsUtilsActionsTrait::toggleClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 3
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
<?php
2
namespace Ajax\common\traits;
3
4
use Ajax\service\Javascript;
5
6
/**
7
 *
8
 * @author jc
9
 * @property array $jquery_code_for_compile
10
 * @property array $jquery_code_for_compile_at_last
11
 */
12
trait JsUtilsActionsTrait {
13
14
	abstract public function _add_event($element, $js, $event, $preventDefault = false, $stopPropagation = false, $immediatly = true);
15
16
	/**
17
	 * show or hide with effect
18
	 *
19
	 * @param string $action
20
	 * @param string $element
21
	 *        	element
22
	 * @param string $speed
23
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
24
	 * @param string $callback
25
	 *        	Javascript callback function
26
	 * @param boolean $immediatly
27
	 *        	defers the execution if set to false
28
	 * @return string
29
	 */
30
	protected function _showHideWithEffect($action, $element = 'this', $speed = '', $callback = '', $immediatly = false) {
31
		$element = Javascript::prep_element($element);
32
		$speed = $this->_validate_speed($speed);
33
		if ($callback != '') {
34
			$callback = ", function(){\n{$callback}\n}";
35
		}
36
		$str = "$({$element}).{$action}({$speed}{$callback});";
37
		if ($immediatly)
38
			$this->jquery_code_for_compile[] = $str;
39
		return $str;
40
	}
41
42
	/**
43
	 * Ensures the speed parameter is valid for jQuery
44
	 *
45
	 * @param string|int $speed
46
	 * @return string
47
	 */
48
	private function _validate_speed($speed) {
49
		if (in_array($speed, array(
50
			'slow',
51
			'normal',
52
			'fast'
53
		))) {
54
			$speed = '"' . $speed . '"';
55
		} elseif (preg_match("/[^0-9]/", $speed)) {
56
			$speed = '';
57
		}
58
59
		return $speed;
60
	}
61
62
	/**
63
	 * Execute a generic jQuery call with a value.
64
	 *
65
	 * @param string $jQueryCall
66
	 * @param string $element
67
	 * @param string $param
68
	 * @param boolean $immediatly
69
	 *        	delayed if false
70
	 */
71
	public function _genericCallValue($jQueryCall, $element = 'this', $param = "", $immediatly = false) {
72
		$element = Javascript::prep_element($element);
73
		if (isset($param)) {
74
			$param = Javascript::prep_value($param);
75
			$str = "$({$element}).{$jQueryCall}({$param});";
76
		} else
77
			$str = "$({$element}).{$jQueryCall}();";
78
		if ($immediatly)
79
			$this->jquery_code_for_compile[] = $str;
80
		return $str;
81
	}
82
83
	/**
84
	 * Execute a generic jQuery call with 2 elements.
85
	 *
86
	 * @param string $jQueryCall
87
	 * @param string $to
88
	 * @param string $element
89
	 * @param boolean $immediatly
90
	 *        	delayed if false
91
	 * @return string
92
	 */
93
	public function _genericCallElement($jQueryCall, $to = 'this', $element, $immediatly = false) {
94
		$to = Javascript::prep_element($to);
95
		$element = Javascript::prep_element($element);
96
		$str = "$({$to}).{$jQueryCall}({$element});";
97
		if ($immediatly)
98
			$this->jquery_code_for_compile[] = $str;
99
		return $str;
100
	}
101
102
	/**
103
	 * add class to element
104
	 *
105
	 * @param string $element
106
	 * @param string $class
107
	 *        	to add
108
	 * @param boolean $immediatly
109
	 *        	defers the execution if set to false
110
	 * @return string
111
	 */
112
	public function addClass($element = 'this', $class = '', $immediatly = false) {
113
		return $this->_genericCallValue('addClass', $element, $class, $immediatly);
114
	}
115
116
	/**
117
	 * Insert content, specified by the parameter, after each element in the set of matched elements
118
	 *
119
	 * @param string $to
120
	 * @param string $element
121
	 * @param boolean $immediatly
122
	 *        	defers the execution if set to false
123
	 * @return string
124
	 */
125
	public function after($to, $element, $immediatly = false) {
126
		return $this->_genericCallElement('after', $to, $element, $immediatly);
127
	}
128
129
	/**
130
	 * Insert content, specified by the parameter, before each element in the set of matched elements
131
	 *
132
	 * @param string $to
133
	 * @param string $element
134
	 * @param boolean $immediatly
135
	 *        	defers the execution if set to false
136
	 * @return string
137
	 */
138
	public function before($to, $element, $immediatly = false) {
139
		return $this->_genericCallElement('before', $to, $element, $immediatly);
140
	}
141
142
	/**
143
	 * Get or set the value of an attribute for the first element in the set of matched elements or set one or more attributes for every matched element.
144
	 *
145
	 * @param string $element
146
	 * @param string $attributeName
147
	 * @param string $value
148
	 * @param boolean $immediatly
149
	 *        	delayed if false
150
	 */
151
	public function attr($element = 'this', $attributeName, $value = "", $immediatly = false) {
152
		$element = Javascript::prep_element($element);
153
		if (isset($value)) {
154
			$value = Javascript::prep_value($value);
155
			$str = "$({$element}).attr(\"$attributeName\",{$value});";
156
		} else
157
			$str = "$({$element}).attr(\"$attributeName\");";
158
		if ($immediatly)
159
			$this->jquery_code_for_compile[] = $str;
160
		return $str;
161
	}
162
163
	/**
164
	 * Get or set the value of the first element in the set of matched elements or set one or more attributes for every matched element.
165
	 *
166
	 * @param string $element
167
	 * @param string $value
168
	 * @param boolean $immediatly
169
	 *        	defers the execution if set to false
170
	 */
171
	public function val($element = 'this', $value = '', $immediatly = false) {
172
		return $this->_genericCallValue('val', $element, $value, $immediatly);
173
	}
174
175
	/**
176
	 * Get or set the html of an attribute for the first element in the set of matched elements.
177
	 *
178
	 * @param string $element
179
	 * @param string $value
180
	 * @param boolean $immediatly
181
	 *        	defers the execution if set to false
182
	 */
183
	public function html($element = 'this', $value = '', $immediatly = false) {
184
		return $this->_genericCallValue('html', $element, $value, $immediatly);
185
	}
186
187
	/**
188
	 * Outputs a javascript library animate event
189
	 *
190
	 * @param string $element
191
	 *        	element
192
	 * @param array|string $params
193
	 * @param string $speed
194
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
195
	 * @param string $extra
196
	 * @param boolean $immediatly
197
	 *        	defers the execution if set to false
198
	 * @return string
199
	 */
200
	public function animate($element = 'this', $params = array(), $speed = '', $extra = '', $immediatly = false) {
201
		$element = Javascript::prep_element($element);
202
		$speed = $this->_validate_speed($speed);
203
204
		$animations = "\t\t\t";
205
		if (\is_array($params)) {
206
			foreach ($params as $param => $value) {
207
				$animations .= $param . ': \'' . $value . '\', ';
208
			}
209
		}
210
		$animations = substr($animations, 0, - 2); // remove the last ", "
211
212
		if ($speed != '') {
213
			$speed = ', ' . $speed;
214
		}
215
216
		if ($extra != '') {
217
			$extra = ', ' . $extra;
218
		}
219
220
		$str = "$({$element}).animate({\n$animations\n\t\t}" . $speed . $extra . ");";
221
222
		if ($immediatly)
223
			$this->jquery_code_for_compile[] = $str;
224
		return $str;
225
	}
226
227
	/**
228
	 * Insert content, specified by the parameter $element, to the end of each element in the set of matched elements $to.
229
	 *
230
	 * @param string $to
231
	 * @param string $element
232
	 * @param boolean $immediatly
233
	 *        	defers the execution if set to false
234
	 * @return string
235
	 */
236
	public function append($to, $element, $immediatly = false) {
237
		return $this->_genericCallElement('append', $to, $element, $immediatly);
238
	}
239
240
	/**
241
	 * Insert content, specified by the parameter $element, to the beginning of each element in the set of matched elements $to.
242
	 *
243
	 * @param string $to
244
	 * @param string $element
245
	 * @param boolean $immediatly
246
	 *        	defers the execution if set to false
247
	 * @return string
248
	 */
249
	public function prepend($to, $element, $immediatly = false) {
250
		return $this->_genericCallElement('prepend', $to, $element, $immediatly);
251
	}
252
253
	/**
254
	 * Execute a javascript library hide action
255
	 *
256
	 * @param string $element
257
	 *        	element
258
	 * @param string $speed
259
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
260
	 * @param string $callback
261
	 *        	Javascript callback function
262
	 * @param boolean $immediatly
263
	 *        	defers the execution if set to false
264
	 * @return string
265
	 */
266
	public function fadeIn($element = 'this', $speed = '', $callback = '', $immediatly = false) {
267
		return $this->_showHideWithEffect("fadeIn", $element, $speed, $callback, $immediatly);
268
	}
269
270
	/**
271
	 * Execute a javascript library hide action
272
	 *
273
	 * @param string $element
274
	 *        	element
275
	 * @param string $speed
276
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
277
	 * @param string $callback
278
	 *        	Javascript callback function
279
	 * @param boolean $immediatly
280
	 *        	defers the execution if set to false
281
	 * @return string
282
	 */
283
	public function fadeOut($element = 'this', $speed = '', $callback = '', $immediatly = false) {
284
		return $this->_showHideWithEffect("fadeOut", $element, $speed, $callback, $immediatly);
285
	}
286
287
	/**
288
	 * Execute a javascript library slideUp action
289
	 *
290
	 * @param string $element
291
	 *        	element
292
	 * @param string $speed
293
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
294
	 * @param string $callback
295
	 *        	Javascript callback function
296
	 * @param boolean $immediatly
297
	 *        	defers the execution if set to false
298
	 * @return string
299
	 */
300
	public function slideUp($element = 'this', $speed = '', $callback = '', $immediatly = false) {
301
		return $this->_showHideWithEffect("slideUp", $element, $speed, $callback, $immediatly);
302
	}
303
304
	/**
305
	 * Execute a javascript library removeClass action
306
	 *
307
	 * @param string $element
308
	 *        	element
309
	 * @param string $class
310
	 *        	Class to add
311
	 * @param boolean $immediatly
312
	 *        	defers the execution if set to false
313
	 * @return string
314
	 */
315
	public function removeClass($element = 'this', $class = '', $immediatly = false) {
316
		return $this->_genericCallValue('removeClass', $element, $class, $immediatly);
317
	}
318
319
	/**
320
	 * Execute a javascript library slideDown action
321
	 *
322
	 * @param string $element
323
	 *        	element
324
	 * @param string $speed
325
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
326
	 * @param string $callback
327
	 *        	Javascript callback function
328
	 * @param boolean $immediatly
329
	 *        	defers the execution if set to false
330
	 * @return string
331
	 */
332
	public function slideDown($element = 'this', $speed = '', $callback = '', $immediatly = false) {
333
		return $this->_showHideWithEffect("slideDown", $element, $speed, $callback, $immediatly);
334
	}
335
336
	/**
337
	 * Execute a javascript library slideToggle action
338
	 *
339
	 * @param string $element
340
	 *        	element
341
	 * @param string $speed
342
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
343
	 * @param string $callback
344
	 *        	Javascript callback function
345
	 * @param boolean $immediatly
346
	 *        	defers the execution if set to false
347
	 * @return string
348
	 */
349
	public function slideToggle($element = 'this', $speed = '', $callback = '', $immediatly = false) {
350
		return $this->_showHideWithEffect("slideToggle", $element, $speed, $callback, $immediatly);
351
	}
352
353
	/**
354
	 * Execute a javascript library hide action
355
	 *
356
	 * @param string $element
357
	 *        	element
358
	 * @param string $speed
359
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
360
	 * @param string $callback
361
	 *        	Javascript callback function
362
	 * @param boolean $immediatly
363
	 *        	defers the execution if set to false
364
	 * @return string
365
	 */
366
	public function hide($element = 'this', $speed = '', $callback = '', $immediatly = false) {
367
		return $this->_showHideWithEffect("hide", $element, $speed, $callback, $immediatly);
368
	}
369
370
	/**
371
	 * Execute a javascript library toggle action
372
	 *
373
	 * @param string $element
374
	 *        	element
375
	 * @param string $speed
376
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
377
	 * @param string $callback
378
	 *        	Javascript callback function
379
	 * @param boolean $immediatly
380
	 *        	defers the execution if set to false
381
	 * @return string
382
	 */
383
	public function toggle($element = 'this', $speed = '', $callback = '', $immediatly = false) {
384
		return $this->_showHideWithEffect("toggle", $element, $speed, $callback, $immediatly);
385
	}
386
387
	/**
388
	 * Execute a javascript library toggle class action
389
	 *
390
	 * @param string $element
391
	 *        	element
392
	 * @param string $class
393
	 * @param boolean $immediatly
394
	 *        	defers the execution if set to false
395
	 * @return string
396
	 */
397
	public function toggleClass($element = 'this', $class = '', $immediatly = false) {
398
		return $this->_genericCallValue('toggleClass', $element, $class, $immediatly);
399
	}
400
401
	/**
402
	 * Execute all handlers and behaviors attached to the matched elements for the given event.
403
	 *
404
	 * @param string $element
405
	 * @param string $event
406
	 * @param boolean $immediatly
407
	 *        	defers the execution if set to false
408
	 */
409
	public function trigger($element = 'this', $event = 'click', $immediatly = false) {
410
		$element = Javascript::prep_element($element);
411
		$str = "$({$element}).trigger(\"$event\");";
412
413
		if ($immediatly)
414
			$this->jquery_code_for_compile[] = $str;
415
		return $str;
416
	}
417
418
	/**
419
	 * Execute a javascript library show action
420
	 *
421
	 * @param string $element
422
	 *        	element
423
	 * @param string $speed
424
	 *        	One of 'slow', 'normal', 'fast', or time in milliseconds
425
	 * @param string $callback
426
	 *        	Javascript callback function
427
	 * @param boolean $immediatly
428
	 *        	defers the execution if set to false
429
	 * @return string
430
	 */
431
	public function show($element = 'this', $speed = '', $callback = '', $immediatly = false) {
432
		return $this->_showHideWithEffect("show", $element, $speed, $callback, $immediatly);
433
	}
434
435
	/**
436
	 * Creates a jQuery sortable
437
	 *
438
	 * @param string $element
439
	 * @param array $options
440
	 * @return string
441
	 */
442
	public function sortable($element, $options = array()) {
443
		if (count($options) > 0) {
444
			$sort_options = array();
445
			foreach ($options as $k => $v) {
446
				$sort_options[] = "\n\t\t" . $k . ': ' . $v . "";
447
			}
448
			$sort_options = implode(",", $sort_options);
449
		} else {
450
			$sort_options = '';
451
		}
452
453
		return "$(" . Javascript::prep_element($element) . ").sortable({" . $sort_options . "\n\t});";
454
	}
455
456
	/**
457
	 * Table Sorter Plugin
458
	 *
459
	 * @param string $table
460
	 *        	table name
461
	 * @param string $options
462
	 *        	plugin location
463
	 * @return string
464
	 */
465
	public function tablesorter($table = '', $options = '') {
466
		$this->jquery_code_for_compile[] = "\t$(" . Javascript::prep_element($table) . ").tablesorter($options);\n";
467
	}
468
469
	/**
470
	 * Allows to attach a condition
471
	 *
472
	 * @param string $condition
473
	 * @param string $jsCodeIfTrue
474
	 * @param string $jsCodeIfFalse
475
	 * @param boolean $immediatly
476
	 *        	defers the execution if set to false
477
	 */
478
	public function condition($condition, $jsCodeIfTrue, $jsCodeIfFalse = null, $immediatly = false) {
479
		$str = "if(" . $condition . "){" . $jsCodeIfTrue . "}";
480
		if (isset($jsCodeIfFalse)) {
481
			$str .= "else{" . $jsCodeIfFalse . "}";
482
		}
483
484
		if ($immediatly)
485
			$this->jquery_code_for_compile[] = $str;
486
		return $str;
487
	}
488
489
	/**
490
	 * Call the JQuery method $jqueryCall on $element with parameters $param
491
	 *
492
	 * @param string $element
493
	 * @param string $jqueryCall
494
	 * @param mixed $param
495
	 * @param string $jsCallback
496
	 *        	javascript code to execute after the jquery call
497
	 * @param boolean $immediatly
498
	 * @return string
499
	 */
500
	private function _doJQuery($element, $jqueryCall, $param = "", $jsCallback = "", $immediatly = false) {
501
		$param = Javascript::prep_value($param);
502
		$callback = "";
503
		if ($jsCallback != "")
504
			$callback = ", function(event){\n{$jsCallback}\n}";
505
		$script = "$(" . Javascript::prep_element($element) . ")." . $jqueryCall . "(" . $param . $callback . ");\n";
506
		if ($immediatly)
507
			$this->jquery_code_for_compile[] = $script;
508
		return $script;
509
	}
510
511
	/**
512
	 * Calls the JQuery callback $someThing on $element with facultative parameter $param
513
	 *
514
	 * @param string $element
515
	 *        	the element
516
	 * @param string $jqueryCall
517
	 *        	the JQuery callback
518
	 * @param mixed $param
519
	 *        	array or string parameters
520
	 * @param string $jsCallback
521
	 *        	javascript code to execute after the jquery call
522
	 * @return mixed
523
	 */
524
	public function doJQuery($element, $jqueryCall, $param = "", $jsCallback = "") {
525
		return $this->_doJQuery($element, $jqueryCall, $param, $jsCallback, true);
526
	}
527
528
	/**
529
	 * Calls the JQuery callback $someThing on $element with facultative parameter $param
530
	 *
531
	 * @param string $element
532
	 *        	the element
533
	 * @param string $jqueryCall
534
	 *        	the JQuery callback
535
	 * @param mixed $param
536
	 *        	array or string parameters
537
	 * @param string $jsCallback
538
	 *        	javascript code to execute after the jquery call
539
	 * @return mixed
540
	 */
541
	public function doJQueryDeferred($element, $jqueryCall, $param = "", $jsCallback = "") {
542
		return $this->_doJQuery($element, $jqueryCall, $param, $jsCallback, false);
543
	}
544
545
	/**
546
	 *
547
	 * @param string $event
548
	 * @param string $element
549
	 * @param string $elementToModify
550
	 * @param string $jqueryCall
551
	 * @param string|array $param
552
	 * @param boolean $preventDefault
553
	 * @param boolean $stopPropagation
554
	 * @param string $jsCallback
555
	 *        	javascript code to execute after the jquery call
556
	 * @param boolean $immediatly
557
	 * @return string
558
	 */
559
	private function _doJQueryOn($event, $element, $elementToModify, $jqueryCall, $param = "", $preventDefault = false, $stopPropagation = false, $jsCallback = "", $immediatly = true) {
560
		return $this->_add_event($element, $this->_doJQuery($elementToModify, $jqueryCall, $param, $jsCallback), $event, $preventDefault, $stopPropagation, $immediatly);
561
	}
562
563
	/**
564
	 * Calls the JQuery callback $jqueryCall on $element with facultative parameter $param in response to an event $event
565
	 *
566
	 * @param string $event
567
	 * @param string $element
568
	 * @param string $elementToModify
569
	 * @param string $jqueryCall
570
	 * @param string $param
571
	 * @param array $parameters
572
	 *        	default : array("preventDefault"=>false,"stopPropagation"=>false,"jsCallback"=>'',"immediatly"=>true)
573
	 */
574
	public function doJQueryOn($event, $element, $elementToModify, $jqueryCall, $param = "", $parameters = array()) {
575
		$jsCallback = "";
576
		$stopPropagation = false;
577
		$preventDefault = false;
578
		$immediatly = true;
579
		extract($parameters);
580
		return $this->_doJQueryOn($event, $element, $elementToModify, $jqueryCall, $param, $preventDefault, $stopPropagation, $jsCallback, $immediatly);
581
	}
582
583
	/**
584
	 * Executes the code $js
585
	 *
586
	 * @param string $js
587
	 *        	Code to execute
588
	 * @param boolean $immediatly
589
	 *        	delayed if false
590
	 * @return String
591
	 */
592
	public function exec($js, $immediatly = false) {
593
		$script = $js . "\n";
594
		if ($immediatly)
595
			$this->jquery_code_for_compile[] = $script;
596
		return $script;
597
	}
598
599
	/**
600
	 * Executes the code $js
601
	 *
602
	 * @param string $js
603
	 *        	Code to execute
604
	 * @param boolean $immediatly
605
	 *        	delayed if false
606
	 * @return String
607
	 */
608
	public function execAtLast($js) {
609
		$script = $js . "\n";
610
		$this->jquery_code_for_compile_at_last[] = $script;
611
		return $script;
612
	}
613
614
	/**
615
	 * Executes the javascript code $js when $event fires on $element
616
	 *
617
	 * @param string $event
618
	 * @param string $element
619
	 * @param string $js
620
	 *        	Code to execute
621
	 * @param array $parameters
622
	 *        	default : array("preventDefault"=>false,"stopPropagation"=>false,"immediatly"=>true)
623
	 * @return String
624
	 */
625
	public function execOn($event, $element, $js, $parameters = array()) {
626
		$stopPropagation = false;
627
		$preventDefault = false;
628
		$immediatly = true;
629
		extract($parameters);
630
		$script = $this->_add_event($element, $this->exec($js), $event, $preventDefault, $stopPropagation, $immediatly);
631
		return $script;
632
	}
633
634
	public function setJsonToElement($json, $elementClass = "_element", $immediatly = true) {
0 ignored issues
show
Unused Code introduced by
The parameter $elementClass is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

634
	public function setJsonToElement($json, /** @scrutinizer ignore-unused */ $elementClass = "_element", $immediatly = true) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
635
		$retour = "var data={$json};" . "\n\tdata=($.isPlainObject(data))?data:JSON.parse(data);" . "\n\tvar pk=data['pk'];var object=data['object'];" . "\n\tfor(var field in object){" . "\n\tif($('[data-field='+field+']',$('._element[data-ajax='+pk+']')).length){" . "\n\t\t$('[data-field='+field+']',$('._element[data-ajax='+pk+']')).each(function(){" . "\n\t\t\tif($(this).is('[value]')) { $(this).val(object[field]);} else { $(this).html(object[field]); }" . "\n\t});" . "\n}};\n";
636
		$retour .= "\t$(document).trigger('jsonReady',[data]);\n";
637
		return $this->exec($retour, $immediatly);
638
	}
639
640
	/**
641
	 * Sets an element draggable (HTML5 drag and drop)
642
	 *
643
	 * @param string $element
644
	 *        	The element selector
645
	 * @param array $parameters
646
	 *        	default : array("attr"=>"id","preventDefault"=>false,"stopPropagation"=>false,"immediatly"=>true)
647
	 */
648
	public function setDraggable($element, $parameters = []) {
649
		$attr = "id";
650
		extract($parameters);
651
		$script = $this->_add_event($element, Javascript::draggable($attr), "dragstart", $parameters);
652
		return $script;
653
	}
654
655
	/**
656
	 * Declares an element as a drop zone (HTML5 drag and drop)
657
	 *
658
	 * @param string $element
659
	 *        	The element selector
660
	 * @param array $parameters
661
	 *        	default : array("attr"=>"id","stopPropagation"=>false,"immediatly"=>true,"jqueryDone"=>"append")
662
	 * @param string $jsCallback
663
	 *        	the js script to call when element is dropped
664
	 */
665
	public function asDropZone($element, $jsCallback = "", $parameters = []) {
666
		$stopPropagation = false;
667
		$immediatly = true;
668
		$jqueryDone = "append";
669
		$script = $this->_add_event($element, '', "dragover", true, $stopPropagation, $immediatly);
670
		extract($parameters);
671
		$script .= $this->_add_event($element, Javascript::dropZone($jqueryDone, $jsCallback), "drop", true, $stopPropagation, $immediatly);
672
		return $script;
673
	}
674
675
	/**
676
	 * Calls a function or evaluates an expression at specified intervals (in milliseconds)
677
	 *
678
	 * @param string $jsCode
679
	 *        	The code to execute
680
	 * @param int $time
681
	 *        	The time interval in milliseconds
682
	 * @param string $globalName
683
	 *        	The global name of the interval, used to clear it
684
	 * @param boolean $immediatly
685
	 *        	delayed if false
686
	 * @return string
687
	 */
688
	public function interval($jsCode, $time, $globalName = null, $immediatly = true) {
689
		if (! Javascript::isFunction($jsCode)) {
690
			$jsCode = "function(){\n" . $jsCode . "\n}";
691
		}
692
		if (isset($globalName)) {
693
			$script = "if(window.{$globalName}){clearInterval(window.{$globalName});}\nwindow.{$globalName}=setInterval({$jsCode},{$time});";
694
		} else {
695
			$script = "setInterval({$jsCode},{$time});";
696
		}
697
		return $this->exec($script, $immediatly);
698
	}
699
700
	/**
701
	 * Clears an existing interval
702
	 *
703
	 * @param string $globalName
704
	 *        	The interval global name
705
	 * @param boolean $immediatly
706
	 *        	delayed if false
707
	 * @return string
708
	 */
709
	public function clearInterval($globalName, $immediatly = true) {
710
		return $this->exec("if(window.{$globalName}){clearInterval(window.{$globalName});}", $immediatly);
711
	}
712
713
	/**
714
	 * Associates a counter to the element designated by $counterSelector
715
	 * Triggers the events counter-start and counter-end on finished with the parameters value and limit
716
	 *
717
	 * @param string $counterSelector
718
	 *        	Selector of the existing element wich display the counter
719
	 * @param integer $value
720
	 *        	The initial value of the counter
721
	 * @param integer $limit
722
	 *        	The limit of the counter (minimum if countDown is true, maximum if not)
723
	 * @param string $globalName
724
	 *        	The global name of the counter, to use with the clearInterval method
725
	 * @param boolean $countDown
726
	 *        	count down if true or elapse if false
727
	 * @param boolean $immediatly
728
	 *        	delayed if false
729
	 * @return string
730
	 */
731
	public function counter($counterSelector, $value = 0, $limit = 0, $globalName = null, $countDown = true, $immediatly = true) {
732
		$stop = "";
733
		if ($countDown) {
734
			$stop = "if (--timer < " . $limit . ") {clearInterval(interval);display.trigger({type:'counter-end',value: timer,limit:" . $limit . "});}";
735
		} else {
736
			if ($limit != 0) {
737
				$stop = "if (++timer > " . $limit . ") {clearInterval(interval);display.trigger({type:'counter-end',value: timer,limit:" . $limit . "});}";
738
			}
739
		}
740
		$global = "";
741
		if (isset($globalName)) {
742
			$global = "\nwindow.{$globalName}=interval;";
743
		}
744
		$timer = "var startTimer=function(duration, display) {var timer = duration, minutes, seconds;
745
											display.trigger('counter-start',timer);
746
											display.show();
747
    										var interval=setInterval(function () {
748
        										minutes = parseInt(timer / 60, 10);seconds = parseInt(timer % 60, 10);
749
										        minutes = minutes < 10 ? '0' + minutes : minutes;
750
        										seconds = seconds < 10 ? '0' + seconds : seconds;
751
										        if(display.is('[value]')){display.val(minutes + ':' + seconds);} else {display.html(minutes + ':' + seconds);};
752
										        " . $stop . "
753
    										}, 1000);
754
										" . $global . "
755
										}";
756
		$element = '$("' . $counterSelector . '")';
757
		return $this->exec($timer . "\nstartTimer(" . $value . "," . $element . ");", $immediatly);
758
	}
759
760
	/**
761
	 * Associates a counter to the element designated by $counterSelector when $event is triggered on $element
762
	 *
763
	 * @param string $element
764
	 *        	The triggering element
765
	 * @param string $event
766
	 *        	The triggering event
767
	 * @param string $counterSelector
768
	 *        	Selector of the existing element wich display the counter
769
	 * @param integer $value
770
	 *        	The initial value of the counter
771
	 * @param integer $limit
772
	 *        	The limit of the counter (minimum if countDown is true, maximum if not)
773
	 * @param string $globalName
774
	 *        	The global name of the counter, to use with the clearInterval method
775
	 * @param boolean $countDown
776
	 *        	count down if true or elapse if false
777
	 * @return string
778
	 */
779
	public function counterOn($element, $event, $counterSelector, $value = 0, $limit = 0, $globalName = null, $countDown = true) {
780
		return $this->execOn($event, $element, $this->counter($counterSelector, $value, $limit, $globalName, $countDown, false));
781
	}
782
783
	/**
784
	 * Activates an element if it is active (add the class active)
785
	 *
786
	 * @param string $target
787
	 *        	the container element
788
	 * @param string $property
789
	 *        	default: href
790
	 * @param string $href
791
	 *        	the active href (if null, window.location.href is used)
792
	 * @return string
793
	 */
794
	public function activateLink($target, $property = 'href', $href = null) {
795
		return $this->execAtLast($this->_activateLink($target, $property, $href));
796
	}
797
798
	/**
799
	 * Returns the javascript code for activate an element if it is active (add the class active)
800
	 *
801
	 * @param string $target
802
	 *        	the container element
803
	 * @param string $property
804
	 *        	default: href
805
	 * @param string $href
806
	 *        	the active href (if null, window.location.href is used)
807
	 * @return string
808
	 */
809
	public function _activateLink($target, $property = 'href', $href = null) {
810
		$js = '$("' . $target . ' [' . $property . ']").removeClass("active");';
811
		if (isset($href)) {
812
			$js .= 'var href="' . $href . '";';
813
		} else {
814
			$js .= 'var href=window.location.href;';
815
		}
816
		$js .= '$("' . $target . ' [' . $property . ']").each(function(){if(href.includes($(this).attr("' . $property . '"))) $(this).addClass("active");});';
817
		return $js;
818
	}
819
}
820