Subversion Repositories mdb

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
23 andreas 1
/*
2
 * Copyright (C) 2015 by Andreas Theofilu <andreas@theosys.at>
3
 *
4
 * All rights reserved. No warranty, explicit or implicit, provided.
5
 *
6
 * NOTICE:  All information contained herein is, and remains
7
 * the property of Andreas Theofilu and his suppliers, if any.
8
 * The intellectual and technical concepts contained
9
 * herein are proprietary to Andreas Theofilu and its suppliers and
10
 * may be covered by European and Foreign Patents, patents in process,
11
 * and are protected by trade secret or copyright law.
12
 * Dissemination of this information or reproduction of this material
13
 * is strictly forbidden unless prior written permission is obtained
14
 * from Andreas Theofilu.
15
 */
26 andreas 16
MODULE_NAME='MDB_UI'	(dev dvTPs[], dev vdvMDB, char IP[], char path[], integer nIndex[])
23 andreas 17
 
18
#include 'mSNAPI'
19
 
20
DEFINE_TYPE
21
	struct ST_SONG
22
	{
23
		integer nID;
24
		char sTitle[128];
25
		char sArtist[128];
26
		char sAlbum[128];
27
		char sGenre[128];
28
		char sCover[64];
29
	};
30
 
31
DEFINE_CONSTANT
32
	constant integer MAX_LINES =		5;
33
 
34
	constant char sPopupList[] = 		'MFp_MDB_list';
35
	constant char sPopupAudio[] = 		'MFp_MDB_audio';
36
	constant char sPopupDetail[] = 		'MFp_MDB_detail';
37
	constant char sPopupMenu[] = 		'MFp_MDB_menu';
24 andreas 38
	constant char sPopupUsers[] =		'MFp_MDB_users';
39
	constant char sPopupSelUser[] =		'MFp_MDB_select_user';
23 andreas 40
 
25 andreas 41
	constant integer BTN_SCROLLBAR =	256;
42
 
23 andreas 43
	constant integer BTN_SAVE =			340;
44
	constant integer BTN_DELETE =		341;
45
	constant integer BTN_NOW_PLAYING =	342;
26 andreas 46
	constant integer BTN_SEARCH =		343;
25 andreas 47
	constant integer BTN_QUEUE =		349;
23 andreas 48
 
49
	constant integer BTN_TITLE = 		350;
50
	constant integer BTN_ARTIST =		351;
51
	constant integer BTN_GENRE =		352;
52
	constant integer BTN_ALBUM =		353;
53
	constant integer BTN_PLAYLIST =		354;
25 andreas 54
	constant integer BTN_RETURN =		355;
28 andreas 55
	constant integer BTN_RESET =		356;
23 andreas 56
 
57
	constant integer BTN_LINE1_PIC =	301;
58
	constant integer BTN_LINE1_LINE =	321;
59
	constant integer BTN_LINE2_PIC =	302;
60
	constant integer BTN_LINE2_LINE =	322;
61
	constant integer BTN_LINE3_PIC =	303;
62
	constant integer BTN_LINE3_LINE =	323;
63
	constant integer BTN_LINE4_PIC =	304;
64
	constant integer BTN_LINE4_LINE =	324;
65
	constant integer BTN_LINE5_PIC =	305;
66
	constant integer BTN_LINE5_LINE =	325;
67
	constant integer BTN_LINE6_PIC =	306;
68
	constant integer BTN_LINE6_LINE =	326;
69
	constant integer BTN_LINE7_PIC =	307;
70
	constant integer BTN_LINE7_LINE =	327;
71
	constant integer BTN_LINE8_PIC =	308;
72
	constant integer BTN_LINE8_LINE =	328;
73
	constant integer BTN_LINE9_PIC =	309;
74
	constant integer BTN_LINE9_LINE =	329;
75
	constant integer BTN_LINE10_PIC =	310;
76
	constant integer BTN_LINE10_LINE =	330;
77
 
78
	constant integer BTN_MENU1 =		261;
79
	constant integer BTN_MENU2 =		262;
80
	constant integer BTN_MENU3 =		263;
81
	constant integer BTN_MENU4 =		264;
82
	constant integer BTN_MENU5 =		265;
83
	constant integer BTN_MENU6 =		266;
84
	constant integer BTN_MENU7 =		267;
85
	constant integer BTN_MENU8 =		268;
86
	constant integer BTN_MENU9 =		269;
87
	constant integer BTN_MENU10 =		270;
88
 
25 andreas 89
	constant integer BTN_DETAIL_BACK =	400;
90
	constant integer BTN_USER_OK =		401;
91
	constant integer BTN_USER_CANCEL =	402;
92
 
23 andreas 93
	constant integer TEXT_TITLE =		1001;
94
	constant integer TEXT_PROGRES =		1002;
95
	constant integer TEXT_MENU_TITLE =	1003;
96
 
97
	constant integer TEXT_DETAIL_TITLE =	1011;
98
	constant integer TEXT_DETAIL_ARTIST =	1012;
99
	constant integer TEXT_DETAIL_ALBUM =	1013;
100
	constant integer TEXT_DETAIL_GENRE =	1014;
101
	constant integer TEXT_DETAIL_TIME_PROG =1015;
102
	constant integer TEXT_DETAIL_TIME_TOTAL=1016;
103
 
24 andreas 104
	constant integer TEXT_INPUT_UNAME =		1021;
105
	constant integer TEXT_INPUT_PLAYLIST =	1022;
26 andreas 106
	constant integer TEXT_INPUT_SEARCH =	1023;
24 andreas 107
 
30 andreas 108
	constant integer PIC_COVER =			300;
109
	constant integer PIC_BASE =				300;
110
 
28 andreas 111
	constant integer LVL_PROGRES =			1;
25 andreas 112
	constant integer LVL_SCROLLBAR =		7;
23 andreas 113
 
25 andreas 114
	constant char TOK_TXT_NONE[] =			'NONE';
115
	constant char TOK_TXT_TITLE[] =			'TITLE';
116
	constant char TOK_TXT_ARTIST[] =		'ARTIST';
117
	constant char TOK_TXT_ALBUM[] =			'ALBUM';
118
	constant char TOK_TXT_GENRE[] =			'GENRE';
119
	constant char TOK_TXT_QUEUE[] =			'QUEUE';
120
	constant char TOK_TXT_PLAYLIST[] =		'PLAYLIST';
26 andreas 121
	constant char TOK_TXT_SEARCH[] =		'SEARCH';
23 andreas 122
 
25 andreas 123
	constant integer TOK_NONE =				0;
124
	constant integer TOK_TITLE =			1;
125
	constant integer TOK_ARTIST =			2;
126
	constant integer TOK_ALBUM =			3;
127
	constant integer TOK_GENRE =			4;
128
	constant integer TOK_QUEUE =			5;
129
	constant integer TOK_PLAYLIST =			6;
26 andreas 130
	constant integer TOK_SEARCH =			7;
25 andreas 131
 
132
	constant integer TODO_USER_SELECT = 		1;		// select a user
133
	constant integer TODO_USER_LIST_PLAYLIST =	2;		// List the playlist
134
	constant integer TODO_USER_SAVE_PLAYLIST =	3;		// Save queue to playlist
135
	constant integer TODO_USER_PLAYLIST_QUEUE = 4;		// Move a playlist to the queue
26 andreas 136
	constant integer TODO_SEARCH =				5;		// Search for titles, artists, ...
137
 
138
	constant integer DIR_OPEN =				1;
139
	constant integer DIR_CLOSE =			2;
140
 
23 andreas 141
	constant integer nNavigation[] =
142
	{
143
		BTN_SAVE,
144
		BTN_DELETE,
145
		BTN_NOW_PLAYING,
25 andreas 146
		BTN_QUEUE,
23 andreas 147
		BTN_TITLE,
148
		BTN_ARTIST,
149
		BTN_GENRE,
150
		BTN_ALBUM,
26 andreas 151
		BTN_PLAYLIST,
28 andreas 152
		BTN_SEARCH,
153
		BTN_RESET
23 andreas 154
	};
155
 
156
	constant integer nMenu[] =
157
	{
158
		BTN_MENU1,
159
		BTN_MENU2,
160
		BTN_MENU3,
161
		BTN_MENU4,
162
		BTN_MENU5,
163
		BTN_MENU6,
164
		BTN_MENU7,
165
		BTN_MENU8,
166
		BTN_MENU9,
167
		BTN_MENU10
168
	};
169
 
170
	constant integer nBtns[] =
171
	{
172
		PLAY,
173
		STOP,
174
		PAUSE,
175
		FFWD,						// Jump forward
176
		REW,						// jump backward
177
		SREV,						// Skip backward
178
		SFWD,						// Skip forward
179
		MENU_THUMBS_DN,
180
		MENU_THUMBS_UP,
181
		MEDIA_RANDOM,
24 andreas 182
		MEDIA_REPEAT,
25 andreas 183
		MENU_BACK,
184
		BTN_RETURN
23 andreas 185
	};
186
 
25 andreas 187
	constant integer nBtnUser[] =
188
	{
189
		BTN_DETAIL_BACK,
190
		BTN_USER_OK,
191
		BTN_USER_CANCEL,
192
		TEXT_INPUT_UNAME,
193
		TEXT_INPUT_PLAYLIST
194
	};
195
 
23 andreas 196
	constant integer nLines[] =
197
	{
198
		BTN_LINE1_PIC,
199
		BTN_LINE1_LINE,
200
		BTN_LINE2_PIC,
201
		BTN_LINE2_LINE,
202
		BTN_LINE3_PIC,
203
		BTN_LINE3_LINE,
204
		BTN_LINE4_PIC,
205
		BTN_LINE4_LINE,
206
		BTN_LINE5_PIC,
207
		BTN_LINE5_LINE,
208
		BTN_LINE6_PIC,
209
		BTN_LINE6_LINE,
210
		BTN_LINE7_PIC,
211
		BTN_LINE7_LINE,
212
		BTN_LINE8_PIC,
213
		BTN_LINE8_LINE,
214
		BTN_LINE9_PIC,
215
		BTN_LINE9_LINE,
216
		BTN_LINE10_PIC,
217
		BTN_LINE10_LINE
218
	};
219
 
24 andreas 220
	constant integer PLAYER_PLAY =		1;
221
	constant integer PLAYER_STOP =		2;
222
	constant integer PLAYER_PAUSE =		3;
223
 
23 andreas 224
	constant char sIconTitle[] = 'Song_45x45';
225
	constant char sIconAlbum[] = 'Album_45x45';
226
	constant char sIconGenre[] = 'Genre_45x45';
227
	constant char sIconArtist[] = 'Artist_45x45';
228
	constant char sIconQueue[] = 'Queue_45x45';
229
	constant char sIconPlaylist[] = 'Playlist_45x45';
230
 
30 andreas 231
/*	constant char sIconsMusic[7][24] =
23 andreas 232
	{
233
		sIconTitle,
234
		sIconArtist,
235
		sIconAlbum,
236
		sIconGenre,
237
		sIconQueue,
30 andreas 238
		sIconPlaylist,
239
		sIconTitle
23 andreas 240
	};
30 andreas 241
*/
242
	constant char sIconsMusic[7][24] =
243
	{
244
		'Song_45x45',
245
		'Artist_45x45',
246
		'Album_45x45',
247
		'Genre_45x45',
248
		'Queue_45x45',
249
		'Playlist_45x45',
250
		'Song_45x45'
251
	};
23 andreas 252
 
253
DEFINE_VARIABLE
254
	volatile integer nStart;				// Index position of current position in list.
25 andreas 255
	volatile integer nOldStart;				// Saves the previous value of nStart if a folder is opened
23 andreas 256
	volatile integer nTotal;				// Total number of data
257
	volatile integer nPage;					// The type of the page: TOK_TITLE, ...
26 andreas 258
	volatile integer nOldPage;				// The type of the previous page. Needed for search.
259
	volatile integer nSearch;				// 1 = Search is active
28 andreas 260
	volatile char    sSearchFor[128];		// The expression to search for
24 andreas 261
	volatile integer nPlayStatus;			// Status of the player
23 andreas 262
	volatile ST_SONG stSong[MAX_LINES];		// The register of currently showed songs
263
	volatile integer nSongIdx;				// The index of the song pointer
25 andreas 264
	volatile char    sActPlaylist[128];		// The name of the actual playlist
24 andreas 265
	volatile integer nLastPressedLine;		// The number of the line pressed last
266
	volatile integer nLastPressedMenu;		// The number of the menu line pressed last
267
	volatile integer nKeyboard[50];			// 1 = Keyboard active
25 andreas 268
	volatile char    sActUser[128];			// The name of the actual loaded user
269
	volatile char    sInputUser[128];		// Username in user dialog popup
270
	volatile char    sInputPlaylist[128];	// Name of playlist in user dialog popup
24 andreas 271
	volatile integer nFolder;				// 0 = Top level of list, 1 = Folder opened
25 andreas 272
	volatile char    sActFolder[128];		// The name of the actual selected folder
273
	volatile integer nScrollbarPressed[50];	// 1 = User is sliding the scrollbar
274
	volatile integer nScrollbarLvl;			// The level of the scrollbar when user releases the scrollbar
275
	volatile integer nRepeat;				// 1 = repeat on, 0 = repeat off
276
	volatile integer nRandom;				// 1 = random on, 0 = random off
277
	volatile integer nToDo;					// What to do next
23 andreas 278
	volatile char _strTok[10][256];
279
 
280
 
281
// DecodeURL: Undo URL encoding on a data segment as necessary for CLI protocol
282
//	(Note: Distructive for input; copy str before call if needed)
283
//   str: String to be decoded
284
define_function char[1024] DecodeURL(char oldStr[])
285
{
286
stack_var char str[1024];
287
stack_var char newStr[1024];
288
stack_var char strSegment[1024];
289
stack_var char strHex[2];
290
 
291
    str = oldStr;
292
    // Loop through string looking for '%' prefix characters
293
    strSegment = remove_string(str, '%', 1);
294
 
295
    while (length_array(strSegment) != 0) 
296
	{
297
		// Strip off '%' character from string segment, fetch HEX ASCII byte, reconstruct
298
		set_length_array(strSegment, length_array(strSegment) - 1);
299
		strHex = Left_String(str, 2);
300
		str = Right_String(str, length_array(str) - 2);
301
		newStr = "newStr,strSegment,HexToI(strHex)";
302
 
303
		strSegment = remove_string(str, '%', 1);
304
    }
305
 
306
    newStr = "newStr,str";
307
    return newStr;
308
}
309
 
24 andreas 310
define_function char[1024] EncodeURL(char oldStr[])
311
{
312
stack_var char str[1024];
25 andreas 313
stack_var char replace[64];
24 andreas 314
stack_var integer len;
315
stack_var integer i;
25 andreas 316
stack_var integer j;
317
stack_var integer flag;
24 andreas 318
 
25 andreas 319
	replace = "':;<>"% ',$27";
24 andreas 320
	len = length_string(oldStr);
321
	str = '';
322
 
323
	for (i = 1; i <= len; i++)
324
	{
25 andreas 325
		flag = false;
326
 
327
		for (j = 1; j <= length_string(replace); j++)
328
		{
329
			if (oldStr[i] == replace[j])
330
			{
331
				str = "str,'%',format('%02X', oldStr[i])";
332
				flag = true;
333
				break;
334
			}
335
		}
336
 
337
		if (!flag)
24 andreas 338
			str = "str,mid_string(oldStr, i, 1)";
339
	}
340
 
341
	return str;
342
}
343
 
23 andreas 344
define_function integer strtok(char str[], char tok[])
345
{
346
stack_var integer i;
347
stack_var integer idx;
348
 
25 andreas 349
	idx = 1;
350
 
351
	for (i = 1; i <= 10; i++)
352
		_strTok[i] = '';
353
 
23 andreas 354
	i = find_string(str, tok, 1);
355
 
356
	while (i && idx <= 10)
357
	{
25 andreas 358
		if (i > 1)
359
			_strTok[idx] = left_string(str, i - length_string(tok));
360
		else
361
			_strTok[idx] = '';
362
 
363
		remove_string(str, tok, 1);
364
		i = find_string(str, tok, 1);
23 andreas 365
		idx++;
366
	}
367
 
25 andreas 368
	if (idx <= 10)
369
		_strTok[idx] = str;
370
 
23 andreas 371
	return idx;
372
}
373
 
374
define_function char[256] getStrTok(integer idx)
375
{
376
	if (idx && idx <= 10)
377
		return _strTok[idx];
378
 
379
	return '';
380
}
381
 
28 andreas 382
define_function displayProgresBar(char sTimeA[], char sTimeB[])
383
{
29 andreas 384
stack_var double secA;
385
stack_var double secB;
28 andreas 386
stack_var integer pos;
387
stack_var integer hour;
388
stack_var integer min;
389
stack_var integer sec;
390
 
391
	if (length_string(sTimeA) > 5)
392
	{
393
		hour = atoi(left_string(sTimeA, 2));
394
		min = atoi(mid_string(sTimeA, 4, 2));
29 andreas 395
		sec = atoi(mid_string(sTimeA, 7, 2));
396
		secA = type_cast(hour * 3600 + min * 60 + sec);
28 andreas 397
	}
398
	else
399
	{
400
		min = atoi(mid_string(sTimeA, 1, 2));
29 andreas 401
		sec = atoi(mid_string(sTimeA, 4, 2));
402
		secA = type_cast(min * 60 + sec);
28 andreas 403
	}
404
 
405
	if (length_string(sTimeB) > 5)
406
	{
407
		hour = atoi(left_string(sTimeB, 2));
408
		min = atoi(mid_string(sTimeB, 4, 2));
29 andreas 409
		sec = atoi(mid_string(sTimeB, 7, 2));
410
		secB = type_cast(hour * 3600 + min * 60 + sec);
28 andreas 411
	}
412
	else
413
	{
414
		min = atoi(mid_string(sTimeB, 1, 2));
29 andreas 415
		sec = atoi(mid_string(sTimeB, 4, 2));
416
		secB = type_cast(min * 60 + sec);
28 andreas 417
	}
418
 
29 andreas 419
	pos = type_cast(100.0 / secB * secA);
28 andreas 420
	send_level dvTPs, LVL_PROGRES, pos;
421
}
422
 
26 andreas 423
define_function setPopup(integer dir, char sPg[])
424
{
425
stack_var char pop[16];
426
stack_var integer i;
427
stack_var integer anz;
428
 
429
	if (DIR_OPEN)
430
		pop = '@PPN-';
431
	else
432
		pop = '@PPF-';
433
 
434
	anz = max_length_string(nIndex);
435
 
436
	for (i = 1; i <= anz; i++)
437
	{
438
		if (nIndex[i])
439
			send_command dvTPs[i],"pop,sPg";
440
	}
441
}
442
 
23 andreas 443
define_function clearAllLogos()
444
{
445
	send_command dvTPs,"'^SHO-',itoa(BTN_LINE1_PIC),'.',itoa(BTN_LINE1_PIC+MAX_LINES-1),',0'";
446
}
447
 
448
define_function clearLogo(integer pos)
449
{
450
	if (!pos || pos > MAX_LINES)
451
		return;
452
 
453
	send_command dvTPs,"'^SHO-',itoa(BTN_LINE1_PIC+pos-1),',0'";
454
}
455
 
456
define_function setLogo(char sFile[], integer pos)
457
{
458
stack_var char sHost[64];
459
stack_var char sPath[512];
460
stack_var integer i;
461
 
462
	if (pos > MAX_LINES)
463
		return;
464
 
465
	sHost = IP;
25 andreas 466
	sPath = path;
30 andreas 467
	send_command dvTPs,"'^SHO-',itoa(PIC_BASE+pos),',1'";
23 andreas 468
 
469
	if (!length_string(sFile))
470
	{
30 andreas 471
		if (nPage && pos && nPage != TOK_QUEUE)
472
			send_command dvTPs,"'^BBR-',itoa(PIC_BASE+pos),',0,',sIconsMusic[nPage]";
473
		else if (nPage && pos)
474
			send_command dvTPs,"'^BBR-',itoa(PIC_BASE+pos),',0,',sIconsMusic[1]";
475
		else
476
			send_command dvTPs,"'^BBR-',itoa(PIC_COVER),',0,',sIconsMusic[1]";
23 andreas 477
 
478
		return;
479
	}
480
 
481
	if (pos && pos <= MAX_LINES)
482
	{
30 andreas 483
		send_command dvTPs,"'^RMF-XBMC_Audio',itoa(pos),',%H',sHost,'%A',sPath,'%F',sFile";
484
		send_command dvTPs,"'^BBR-',itoa(PIC_BASE+pos),',0,XBMC_Audio',itoa(pos)";
23 andreas 485
	}
486
	else
487
	{
30 andreas 488
		send_command dvTPs,"'^RMF-XBMC_AudioCover,%H',sHost,'%A',sPath,'%F',sFile";
489
		send_command dvTPs,"'^BBR-',itoa(PIC_COVER),',0,XBMC_AudioCover'";
23 andreas 490
	}
491
}
492
 
493
define_function clearPage()
494
{
495
	clearAllLogos();
25 andreas 496
	send_command dvTPs,"'^TXT-',itoa(BTN_LINE1_LINE),'.',itoa(BTN_LINE1_LINE+MAX_LINES-1),',0,'";
23 andreas 497
}
498
 
499
define_function char[32] requestActualPage()
500
{
28 andreas 501
	return requestPage(nPage);
502
}
503
 
504
define_function char[32] requestPage(integer pg)
505
{
23 andreas 506
stack_var char sPage[32];
507
 
508
	sPage = '';
509
 
28 andreas 510
	if (pg == TOK_NONE)
23 andreas 511
		return sPage;
512
 
28 andreas 513
	switch(pg)
23 andreas 514
	{
515
		case TOK_TITLE:		sPage = TOK_TXT_TITLE;
516
		case TOK_ALBUM:		sPage = TOK_TXT_ALBUM;
517
		case TOK_ARTIST:	sPage = TOK_TXT_ARTIST;
518
		case TOK_GENRE:		sPage = TOK_TXT_GENRE;
519
		case TOK_QUEUE:		sPage = TOK_TXT_QUEUE;
520
		case TOK_PLAYLIST:	sPage = TOK_TXT_PLAYLIST;
26 andreas 521
		case TOK_SEARCH:	sPage = TOK_TXT_SEARCH;
23 andreas 522
	}
523
 
524
	return sPage;
525
}
526
 
26 andreas 527
define_function char[32] requestTitle(integer tok)
528
{
529
stack_var char sPage[32];
530
 
531
	sPage = '';
532
 
533
	switch(nPage)
534
	{
535
		case TOK_NONE:		sPage = 'No list';
536
		case TOK_TITLE:		sPage = 'Title list';
537
		case TOK_ALBUM:		sPage = 'Album list';
538
		case TOK_ARTIST:	sPage = 'Artist list';
539
		case TOK_GENRE:		sPage = 'Genre list';
540
		case TOK_QUEUE:		sPage = 'Queue';
541
		case TOK_PLAYLIST:	sPage = 'Playlists';
542
		case TOK_SEARCH:	sPage = "'Search for ',sSearchFor";
543
	}
544
 
545
	return sPage;
546
}
547
 
24 andreas 548
define_function char[256] getPageLine(integer line)
549
{
550
	if (!line || line > MAX_LINES)
551
		return '';
552
 
553
	switch(nPage)
554
	{
555
		case TOK_TITLE:		return stSong[line].sTitle;
556
		case TOK_ARTIST:	return stSong[line].sArtist;
557
		case TOK_ALBUM:		return stSong[line].sAlbum;
558
		case TOK_GENRE:		return stSong[line].sGenre;
559
	}
560
 
561
	return '';
562
}
563
 
26 andreas 564
define_function setPageLine(integer line, char str[])
565
{
566
	if (!line || line > MAX_LINES)
567
		return;
568
 
569
	switch(nPage)
570
	{
571
		case TOK_TITLE:		stSong[line].sTitle = str;
572
		case TOK_ARTIST:	stSong[line].sArtist = str;
573
		case TOK_ALBUM:		stSong[line].sAlbum = str;
574
		case TOK_GENRE:		stSong[line].sGenre = str;
575
	}
576
}
577
 
578
define_function clearPageLine(integer line)
579
{
580
	if (!line || line > MAX_LINES)
581
		return;
582
 
583
	stSong[line].nID = 0;
584
	stSong[line].sTitle = '';
585
	stSong[line].sArtist = '';
586
	stSong[line].sAlbum = '';
587
	stSong[line].sGenre = '';
588
	stSong[line].sCover = '';
589
}
590
 
23 andreas 591
define_function integer setActualPage(char pg[])
592
{
593
	nPage = TOK_NONE;
594
 
595
	select
596
	{
597
		active (pg == TOK_TXT_TITLE):		nPage = TOK_TITLE;
598
		active (pg == TOK_TXT_ARTIST):		nPage = TOK_ARTIST;
599
		active (pg == TOK_TXT_ALBUM):		nPage = TOK_ALBUM;
600
		active (pg == TOK_TXT_GENRE):		nPage = TOK_GENRE;
601
		active (pg == TOK_TXT_QUEUE):		nPage = TOK_QUEUE;
602
		active (pg == TOK_TXT_PLAYLIST):	nPage = TOK_PLAYLIST;
26 andreas 603
		active (pg == TOK_TXT_SEARCH):		nPage = TOK_SEARCH;
23 andreas 604
	}
605
 
606
	switch(nPage)
607
	{
608
		case TOK_TITLE:
609
		case TOK_ALBUM:
610
		case TOK_ARTIST:
611
		case TOK_GENRE:
612
		case TOK_PLAYLIST:
26 andreas 613
		case TOK_SEARCH:
614
			setPopup(DIR_OPEN, sPopupAudio);
23 andreas 615
		break;
616
 
617
		case TOK_QUEUE:
26 andreas 618
			setPopup(DIR_OPEN, sPopupList);
23 andreas 619
		break;
620
	}
621
 
24 andreas 622
	switch(nPage)
623
	{
624
		case TOK_TITLE:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Titles'";
625
		case TOK_ARTIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Artists'";
626
		case TOK_ALBUM:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Albums'";
627
		case TOK_GENRE:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Genres'";
628
		case TOK_QUEUE:		send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Queue'";
629
		case TOK_PLAYLIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Playlist'";
26 andreas 630
		case TOK_SEARCH:	send_command dvTPs, "'^TXT-',itoa(TEXT_TITLE),',0,Search for ',sSearchFor";
24 andreas 631
	}
632
 
23 andreas 633
	return nPage;
634
}
635
 
24 andreas 636
define_function displayPageInfo(integer st, integer tot)
637
{
638
stack_var integer bis;
639
 
640
	if (st)
641
	{
642
		bis = st + MAX_LINES - 1;
643
		send_command dvTPs, "'^TXT-',itoa(TEXT_PROGRES),',0,',itoa(st),' to ',itoa(bis),' of ',itoa(tot)";
644
	}
645
	else
646
		send_command dvTPs, "'^TXT-',itoa(TEXT_PROGRES),',0,'";
25 andreas 647
 
648
	// Scrollbar initialisieren
649
	if (tot && st <= tot)
650
		bis = type_cast(100.0 / tot * st);
651
	else
652
		bis = 0;
653
 
654
	send_level dvTPs, LVL_SCROLLBAR, bis;
24 andreas 655
}
656
 
23 andreas 657
define_function displaySong(integer idx)
658
{
659
	if (!idx || idx > MAX_LINES)
660
		return;
661
 
25 andreas 662
	send_command dvTPs, "'^TXT-',itoa(BTN_LINE1_LINE+idx-1),',0,',stSong[idx].sTitle,$0d,$0a,stSong[idx].sArtist";
23 andreas 663
}
664
 
24 andreas 665
define_function askMenuList()
666
{
667
	switch(nPage)
668
	{
669
		case TOK_TITLE:
670
		case TOK_ARTIST:
671
		case TOK_ALBUM:
672
		case TOK_GENRE:
26 andreas 673
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 674
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
675
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
676
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
29 andreas 677
 
30 andreas 678
			if (nPage != TOK_TITLE && !nFolder)
29 andreas 679
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Open folder'";
24 andreas 680
		break;
681
 
682
		case TOK_PLAYLIST:
26 andreas 683
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 684
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
685
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
686
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
26 andreas 687
 
688
			if (!nFolder)
29 andreas 689
			{
26 andreas 690
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Show content'";
29 andreas 691
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU4),',0,Delete playlist'";
692
			}
26 andreas 693
			else
29 andreas 694
				send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Delete entry'";
24 andreas 695
		break;
696
 
697
		case TOK_QUEUE:
26 andreas 698
			setPopup(DIR_OPEN, sPopupMenu);
24 andreas 699
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
700
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Play this now'";
701
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Save this to a playlist'";
702
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU3),',0,Delete from queue'";
703
		break;
26 andreas 704
 
705
		case TOK_SEARCH:
706
			setPopup(DIR_OPEN, sPopupMenu);
707
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),'.',itoa(BTN_MENU1+MAX_LINES-1),',0,'";	// Clear all lines
708
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU1),',0,Move to queue and play'";
709
			send_command dvTPs, "'^TXT-',itoa(BTN_MENU2),',0,Add to queue'";
710
		break;
24 andreas 711
	}
712
 
713
	switch(nPage)
714
	{
715
		case TOK_TITLE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Title menu'";
716
		case TOK_ARTIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Artist menu'";
717
		case TOK_ALBUM:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Album menu'";
718
		case TOK_GENRE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Genre menu'";
719
		case TOK_QUEUE:		send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Queue menu'";
720
		case TOK_PLAYLIST:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Playlist menu'";
26 andreas 721
		case TOK_SEARCH:	send_command dvTPs, "'^TXT-',itoa(TEXT_MENU_TITLE),',0,Search menu'";
24 andreas 722
	}
723
}
724
 
29 andreas 725
define_function lineSelect(integer pl)
726
{
727
	nLastPressedLine = pl;
31 andreas 728
 
729
	if (nPage == TOK_PLAYLIST && !nFolder)
730
		sActPlaylist = stSong[pl].sTitle;
731
 
29 andreas 732
	askMenuList();
733
}
734
 
23 andreas 735
DEFINE_START
736
	nStart = 1;
737
	nPage = TOK_NONE;
738
 
739
DEFINE_EVENT
740
	data_event[dvTPs]
741
	{
24 andreas 742
		/*
743
		 * Whenever a panel comes online, it'll be initialized. The actual
744
		 * popup is shown and the pressed (or not pressed) button stated
745
		 * are set.
746
		 */
23 andreas 747
		online:
748
		{
749
			stack_var integer pan;
750
 
751
			pan = get_last(dvTPs);
752
 
753
			switch(nPage)
754
			{
755
				case TOK_TITLE:
25 andreas 756
				case TOK_PLAYLIST:
757
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
758
					send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
759
				break;
760
 
23 andreas 761
				case TOK_ALBUM:
762
				case TOK_ARTIST:
763
				case TOK_GENRE:
764
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
25 andreas 765
					send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 766
				break;
767
 
768
				case TOK_QUEUE:
769
					send_command dvTPs[pan], "'@PPN-',sPopupList";
770
					send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
771
				break;
25 andreas 772
 
773
				default:
774
					send_command dvTPs[pan], "'@PPN-',sPopupAudio";
775
					nStart = 1;
776
					send_command vdvMDB, "'LIST:TITLE:',itoa(nStart),':',itoa(MAX_LINES),';'";
23 andreas 777
			}
778
		}
779
	}
780
 
24 andreas 781
	/*
782
	 * The navigation buttons are for setting the wanted views.
783
	 */
23 andreas 784
	button_event[dvTPs, nNavigation]
785
	{
786
		push:
787
		{
25 andreas 788
		stack_var integer pan;
789
 
790
			pan = get_last(dvTPs);
791
 
23 andreas 792
			switch(BUTTON.INPUT.CHANNEL)
793
			{
25 andreas 794
				case BTN_TITLE:		
795
					send_command vdvMDB, "'LIST:TITLE:1:',itoa(MAX_LINES),';'"; 
796
					nFolder = 0; 
797
					nStart = 1;
26 andreas 798
					nSearch = 0;
25 andreas 799
					nPage = TOK_TITLE;
800
				break;
801
 
802
				case BTN_ARTIST:	
803
					send_command vdvMDB, "'FOLDER:ARTIST:1:',itoa(MAX_LINES),';'"; 
804
					nFolder = 0; 
805
					nStart = 1;
26 andreas 806
					nSearch = 0;
25 andreas 807
					nPage = TOK_ARTIST;
808
				break;
809
 
810
				case BTN_ALBUM:		
811
					send_command vdvMDB, "'FOLDER:ALBUM:1:',itoa(MAX_LINES),';'"; 
812
					nFolder = 0; 
813
					nStart = 1;
26 andreas 814
					nSearch = 0;
25 andreas 815
					nPage = TOK_ALBUM;
816
				break;
817
 
818
				case BTN_GENRE:		
819
					send_command vdvMDB, "'FOLDER:GENRE:1:',itoa(MAX_LINES),';'"; 
820
					nFolder = 0; 
821
					nStart = 1;
26 andreas 822
					nSearch = 0;
25 andreas 823
					nPage = TOK_GENRE;
824
				break;
825
 
826
				case BTN_QUEUE: 
827
					send_command vdvMDB, "'LIST:QUEUE:1:',itoa(MAX_LINES),';'"; 
828
					nFolder = 0; 
829
					nStart = 1;
26 andreas 830
					nSearch = 0;
25 andreas 831
					nPage = TOK_QUEUE;
832
				break;
833
 
834
				case BTN_PLAYLIST:
28 andreas 835
					send_command dvTPs[pan], "'@PPN-',sPopupSelUser";
836
 
25 andreas 837
					if (!length_string(sActUser))
838
					{
839
						send_command dvTPs[pan], "'@AKB-',sActUser,';Enter name of user'";
840
						nKeyboard[pan] = TEXT_INPUT_UNAME;
841
					}
842
					else
843
					{
28 andreas 844
						send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
845
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
25 andreas 846
					}
28 andreas 847
 
848
					nToDo = TODO_USER_SELECT;
25 andreas 849
				break;
850
 
851
				case BTN_NOW_PLAYING:
852
					if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
26 andreas 853
						setPopup(DIR_OPEN, sPopupDetail);
25 andreas 854
				break;
855
 
856
				case BTN_SAVE:
857
					send_command dvTPs[pan], "'@PPN-',sPopupSelUser";
858
					sInputUser = sActUser;
859
					sInputPlaylist = '';
860
					send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sActUser";
29 andreas 861
					send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_PLAYLIST),',0,'";
25 andreas 862
					send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
863
					nToDo = TODO_USER_SAVE_PLAYLIST;
864
					nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
865
				break;
866
 
867
				case BTN_DELETE:
868
					send_command vdvMDB, "'DELETE:QUEUE:-1;'";
29 andreas 869
					nStart = 1;
870
					send_command vdvMDB, "'LIST:QUEUE:',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 871
				break;
26 andreas 872
 
873
				case BTN_SEARCH:
28 andreas 874
					if (!nSearch)
875
					{
876
						send_command dvTPs[pan], "'@AKB-;Search for a ',requestActualPage()";
877
						nToDo = TODO_SEARCH;
878
						nKeyboard[pan] = TEXT_INPUT_SEARCH;
879
					}
26 andreas 880
				break;
28 andreas 881
 
882
				case BTN_RESET:
883
					send_command vdvMDB, 'RESET;';
884
				break;
23 andreas 885
			}
886
		}
887
	}
888
 
24 andreas 889
	/*
890
	 * This buttons control mostly the player. With them you can play, stop
891
	 * pause, etc. the player and scroll through lists.
892
	 * Common to this buttons is, that they conform to the AMX SNAPI standard.
893
	 * All of them are declared in the file "mSNAPI.axi".
894
	 */
23 andreas 895
	button_event[dvTPs, nBtns]
896
	{
897
		push:
898
		{
899
			switch(BUTTON.INPUT.CHANNEL)
900
			{
901
				case PLAY:			send_command vdvMDB, 'PLAY;';
25 andreas 902
				case PAUSE:			send_command vdvMDB, 'PLAYPAUSE;';
23 andreas 903
				case STOP:			send_command vdvMDB, 'STOP;';
904
				case FFWD:			send_command vdvMDB, 'FORWARD;';
905
				case REW:			send_command vdvMDB, 'REWIND;';
906
				case SREV:			send_command vdvMDB, 'SKIPREW;';
907
				case SFWD:			send_command vdvMDB, 'SKIPFWD;';
908
				case MEDIA_RANDOM:	send_command vdvMDB, 'RANDOM;';
909
				case MEDIA_REPEAT:	send_command vdvMDB, 'REPEAT;';
910
 
25 andreas 911
				case MENU_THUMBS_UP:
23 andreas 912
					if (nStart > MAX_LINES)
913
					{
914
						nStart = nStart - MAX_LINES;
25 andreas 915
 
29 andreas 916
						if (nPage == TOK_TITLE || nPage == TOK_QUEUE)
25 andreas 917
							send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
28 andreas 918
						else if (nPage == TOK_SEARCH)
919
							send_command vdvMDB, "'SEARCH:',requestPage(nOldPage),':',EncodeURL(sSearchFor),':',itoa(nStart),':',itoa(MAX_LINES),';'";
29 andreas 920
						else if (nPage == TOK_PLAYLIST)
921
						{
922
							if (!nFolder)
923
								send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
924
							else
925
								send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),':',itoa(nStart),':',itoa(MAX_LINES),';'";
926
						}
25 andreas 927
						else
29 andreas 928
						{
929
							if (!nFolder)
930
								send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
931
							else
932
								send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',EncodeURL(sActFolder),':',itoa(nStart),':',itoa(MAX_LINES),';'";
933
						}
23 andreas 934
					}
935
				break;
936
 
25 andreas 937
				case MENU_THUMBS_DN:
23 andreas 938
					if (nTotal && (nStart+MAX_LINES) <= nTotal)
939
					{
940
						nStart = nStart + MAX_LINES;
25 andreas 941
 
29 andreas 942
						if (nPage == TOK_TITLE || nPage == TOK_QUEUE)
25 andreas 943
							send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
28 andreas 944
						else if (nPage == TOK_SEARCH)
945
							send_command vdvMDB, "'SEARCH:',requestPage(nOldPage),':',EncodeURL(sSearchFor),':',itoa(nStart),':',itoa(MAX_LINES),';'";
29 andreas 946
						else if (nPage == TOK_PLAYLIST)
947
						{
948
							if (!nFolder)
949
								send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
950
							else
951
								send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),':',itoa(nStart),':',itoa(MAX_LINES),';'";
952
						}
25 andreas 953
						else
29 andreas 954
						{
955
							if (!nFolder)
956
								send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
957
							else
958
								send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',EncodeURL(sActFolder),':',itoa(nStart),':',itoa(MAX_LINES),';'";
959
						}
23 andreas 960
					}
961
				break;
24 andreas 962
 
963
				case MENU_BACK:
25 andreas 964
				case BTN_RETURN:
24 andreas 965
					if (nFolder)
25 andreas 966
					{
967
						nStart = nOldStart;
968
						nFolder = 0;
969
					}
26 andreas 970
					else if (nSearch)
971
					{
972
						nStart = nOldStart;
973
						nPage = nOldPage;
974
						nSearch = 0;
975
					}
25 andreas 976
 
977
					if (nPage == TOK_TITLE || nPage == TOK_QUEUE || nPage == TOK_PLAYLIST)
24 andreas 978
						send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 979
					else
980
						send_command vdvMDB, "'FOLDER:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
24 andreas 981
				break;
23 andreas 982
			}
983
		}
24 andreas 984
 
985
		hold[2,repeat]:
986
		{
987
			switch(BUTTON.INPUT.CHANNEL)
988
			{
989
				case FFWD:			send_command vdvMDB, 'FORWARD;';
990
				case REW:			send_command vdvMDB, 'REWIND;';
991
			}
992
		}
23 andreas 993
	}
994
 
24 andreas 995
	button_event[dvTPs,nLines]
996
	{
997
		push:
998
		{
999
			switch(BUTTON.INPUT.CHANNEL)
1000
			{
1001
				case BTN_LINE1_PIC:
1002
				case BTN_LINE1_LINE:
29 andreas 1003
					lineSelect(1);
24 andreas 1004
				break;
1005
 
1006
				case BTN_LINE2_PIC:
1007
				case BTN_LINE2_LINE:
29 andreas 1008
					lineSelect(2);
24 andreas 1009
				break;
1010
 
1011
				case BTN_LINE3_PIC:
1012
				case BTN_LINE3_LINE:
29 andreas 1013
					lineSelect(3);
24 andreas 1014
				break;
1015
 
1016
				case BTN_LINE4_PIC:
1017
				case BTN_LINE4_LINE:
29 andreas 1018
					lineSelect(4);
24 andreas 1019
				break;
1020
 
1021
				case BTN_LINE5_PIC:
1022
				case BTN_LINE5_LINE:
29 andreas 1023
					lineSelect(5);
24 andreas 1024
				break;
1025
 
1026
				case BTN_LINE6_PIC:
1027
				case BTN_LINE6_LINE:
29 andreas 1028
					lineSelect(6);
24 andreas 1029
				break;
1030
 
1031
				case BTN_LINE7_PIC:
1032
				case BTN_LINE7_LINE:
29 andreas 1033
					lineSelect(7);
24 andreas 1034
				break;
1035
 
1036
				case BTN_LINE8_PIC:
1037
				case BTN_LINE8_LINE:
29 andreas 1038
					lineSelect(8);
24 andreas 1039
				break;
1040
 
1041
				case BTN_LINE9_PIC:
1042
				case BTN_LINE9_LINE:
29 andreas 1043
					lineSelect(9);
24 andreas 1044
				break;
1045
 
1046
				case BTN_LINE10_PIC:
1047
				case BTN_LINE10_LINE:
29 andreas 1048
					lineSelect(10);
24 andreas 1049
				break;
1050
			}
1051
		}
1052
	}
1053
 
1054
	button_event[dvTPs,nMenu]
1055
	{
1056
		push:
1057
		{
1058
		stack_var integer pan;
1059
 
1060
			pan = get_last(dvTPs);
1061
 
1062
			switch(BUTTON.INPUT.CHANNEL)
1063
			{
1064
				case BTN_MENU1:
1065
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE)	// Move to queue and play
1066
					{
1067
						if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
1068
							send_command vdvMDB, 'STOP;';
1069
 
1070
						send_command vdvMDB, 'DELETE:QUEUE:-1;';
25 andreas 1071
 
31 andreas 1072
						if (nPage == TOK_TITLE || nPage == TOK_SEARCH || nFolder)
25 andreas 1073
							send_command vdvMDB, "'PLAY:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1074
						else
1075
							send_command vdvMDB, "'PLAY:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,';'";
31 andreas 1076
 
1077
						nFolder = 0;
1078
						nStart = 1;
1079
						nSearch = 0;
1080
						nPage = TOK_QUEUE;
1081
						send_command vdvMDB, "'LIST:QUEUE:',itoa(nStart),':',itoa(MAX_LINES),';'";
24 andreas 1082
					}
1083
					else if (nPage == TOK_PLAYLIST)
1084
					{
1085
						if (length_string(sActUser) && length_string(sActPlaylist))
1086
						{
1087
							if (nPlayStatus == PLAYER_PLAY || nPlayStatus == PLAYER_PAUSE)
1088
								send_command vdvMDB, 'STOP;';
1089
 
1090
							send_command vdvMDB, 'DELETE:QUEUE:-1;';
31 andreas 1091
 
1092
							if (!nFolder)
1093
								send_command vdvMDB, "'PLAY:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1094
							else
1095
								send_command vdvMDB, "'PLAY:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1096
 
1097
							nFolder = 0;
1098
							nStart = 1;
1099
							nSearch = 0;
1100
							nPage = TOK_QUEUE;
1101
							send_command vdvMDB, "'LIST:QUEUE:',itoa(nStart),':',itoa(MAX_LINES),';'";
24 andreas 1102
						}
1103
					}
1104
					else if (nPage == TOK_QUEUE)
1105
						send_command vdvMDB, "'PLAY:QUEUE:',itoa(nStart+nLastPressedLine-1),';'";
1106
				break;
1107
 
1108
				case BTN_MENU2:
1109
					if (nPage != TOK_PLAYLIST && nPage != TOK_QUEUE)	// Add to queue
25 andreas 1110
					{
31 andreas 1111
						if (nPage == TOK_TITLE || nPage == TOK_SEARCH || nFolder)
25 andreas 1112
							send_command vdvMDB, "'ADD:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1113
						else
1114
							send_command vdvMDB, "'ADD:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,';'";
1115
					}
24 andreas 1116
					else if (nPage == TOK_PLAYLIST)
31 andreas 1117
					{
1118
						if (!nFolder)
1119
							send_command vdvMDB, "'ADD:PLAYLIST:',EncodeURL(sActPlaylist),';'";
1120
						else
1121
							send_command vdvMDB, "'ADD:ID:',itoa(stSong[nLastPressedLine].nID),';'";
1122
					}
24 andreas 1123
					else if (nPage == TOK_QUEUE)
1124
					{
26 andreas 1125
						setPopup(DIR_OPEN, sPopupSelUser);
25 andreas 1126
						sInputUser = sActUser;
1127
						sInputPlaylist = '';
24 andreas 1128
						send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sActUser";
1129
						send_command dvTPs[pan], "'@AKB-',sActPlaylist,';Enter name of playlist'";
25 andreas 1130
						nToDo = TODO_USER_PLAYLIST_QUEUE;
24 andreas 1131
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
1132
					}
1133
				break;
1134
 
1135
				case BTN_MENU3:
29 andreas 1136
					if (nPage != TOK_TITLE && nPage != TOK_PLAYLIST && nPage != TOK_QUEUE && nPage != TOK_SEARCH)	// Open folder
24 andreas 1137
					{
25 andreas 1138
						sActFolder = stSong[nLastPressedLine].sTitle;	// Get name of folder
1139
						nFolder = true;									// Set marker for folder
1140
						nOldStart = nStart;								// Save current position
1141
						nStart = 1;										// Reset start position
1142
						send_command vdvMDB, "'LISTFOLDER:',requestActualPage(),':',stSong[nLastPressedLine].sTitle,':1:',itoa(MAX_LINES),';'";
24 andreas 1143
					}
1144
					else if (nPage == TOK_PLAYLIST)
1145
					{
29 andreas 1146
						if (!nFolder)
1147
						{
1148
							sActUser = sInputUser;
1149
							sActPlaylist = stSong[nLastPressedLine].sTitle;
1150
							nOldStart = nStart;
1151
							nFolder = 1;
1152
							nStart = 1;
1153
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1154
						}
1155
						else		// Delete entry
1156
						{
1157
							send_command vdvMDB, "'DELETE:PTITLE:',itoa(stSong[nLastPressedLine].nID),';'";
1158
							nStart = 1;
1159
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1160
						}
24 andreas 1161
					}
1162
					else if (nPage == TOK_QUEUE)
29 andreas 1163
					{
24 andreas 1164
						send_command vdvMDB, "'DELETE:QUEUE:',itoa(stSong[nLastPressedLine].nID),';'";
29 andreas 1165
						nStart = 1;
1166
						send_command vdvMDB, "'LIST:QUEUE:',itoa(nStart),':',itoa(MAX_LINES),';'";
1167
					}
24 andreas 1168
				break;
29 andreas 1169
 
1170
				case BTN_MENU4:
1171
					if (nPage == TOK_PLAYLIST && !nFolder)
1172
					{
1173
						send_command vdvMDB, "'DELETE:PLAYLIST:',itoa(stSong[nLastPressedLine].nID),';'";
1174
						nStart = 1;
1175
						send_command vdvMDB, "'LIST:PLAYLIST:',itoa(nStart),':',itoa(MAX_LINES),';'";
1176
					}
1177
				break;
24 andreas 1178
			}
25 andreas 1179
 
1180
			if (nPage != TOK_QUEUE)
26 andreas 1181
				setPopup(DIR_OPEN, sPopupAudio);
25 andreas 1182
			else
26 andreas 1183
				setPopup(DIR_OPEN, sPopupList);
24 andreas 1184
		}
1185
	}
1186
 
25 andreas 1187
	button_event[dvTPs,nBtnUser]
24 andreas 1188
	{
1189
		push:
1190
		{
1191
			stack_var integer pan;
1192
 
1193
			pan = get_last(dvTPs);
1194
 
25 andreas 1195
			switch(BUTTON.INPUT.CHANNEL)
24 andreas 1196
			{
25 andreas 1197
				case TEXT_INPUT_UNAME:
1198
					if (!nKeyboard[pan])
1199
					{
1200
						nKeyboard[pan] = TEXT_INPUT_UNAME;
1201
						send_command dvTPs[pan],"'@AKB-',sActUser,';Enter user name'";
1202
					}
1203
				break;
24 andreas 1204
 
25 andreas 1205
				case TEXT_INPUT_PLAYLIST:
1206
					if (!nKeyboard[pan])
1207
					{
1208
						nKeyboard[pan] = TEXT_INPUT_PLAYLIST;
1209
						send_command dvTPs[pan],"'@AKB-',sActPlaylist,';Enter name of playlist'";
1210
					}
1211
				break;
24 andreas 1212
 
25 andreas 1213
				case BTN_USER_OK:
1214
					send_command dvTPs[pan],"'@PPF-',sPopupSelUser";
24 andreas 1215
 
25 andreas 1216
					switch(nToDo)
1217
					{
1218
						case TODO_USER_SELECT:
1219
							sActUser = sInputUser;
1220
							send_command vdvMDB, "'USER:',EncodeURL(sInputUser),':;'";
29 andreas 1221
							nStart = 1;
1222
							nPage = TOK_PLAYLIST;
1223
							nFolder = 0;
1224
							nSearch = 0;
1225
							send_command vdvMDB, "'LIST:PLAYLIST:',itoa(nStart),':',itoa(MAX_LINES),';'";
25 andreas 1226
						break;
1227
 
1228
						case TODO_USER_LIST_PLAYLIST:
1229
							sActPlaylist = sInputPlaylist;
1230
							nOldStart = nStart;
1231
							nFolder = 1;
1232
							nStart = 1;
1233
							send_command vdvMDB, "'PLIST:',EncodeURL(sActUser),':',EncodeURL(stSong[nLastPressedLine].sTitle),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1234
						break;
1235
 
1236
						case TODO_USER_SAVE_PLAYLIST:
1237
							sActUser = sInputUser;
1238
							sActPlaylist = sInputPlaylist;
1239
 
1240
							if (length_string(sActUser) && length_string(sActPlaylist))
1241
								send_command vdvMDB, "'SAVEQUEUE:',EncodeURL(sActUser),':',EncodeURL(sActPlaylist),';'";
1242
						break;
1243
 
1244
						case TODO_USER_PLAYLIST_QUEUE:
1245
							sActUser = sInputUser;
29 andreas 1246
							sActPlaylist = stSong[nLastPressedLine].sTitle;
25 andreas 1247
 
1248
							if (length_string(sActUser) && length_string(sActPlaylist))
29 andreas 1249
								send_command vdvMDB, "'ADD:PLAYLIST:',EncodeURL(stSong[nLastPressedLine].sTitle),';'";
25 andreas 1250
						break;
1251
					}
1252
 
1253
					nToDo = 0;
1254
				break;
1255
 
1256
				case BTN_USER_CANCEL:
1257
					nToDo = 0;
1258
					send_command dvTPs[pan],"'@PPF-',sPopupSelUser";
1259
				break;
1260
 
1261
				case BTN_DETAIL_BACK:
1262
					if (nPage == TOK_QUEUE)
26 andreas 1263
						setPopup(DIR_OPEN, sPopupAudio);
25 andreas 1264
					else
26 andreas 1265
						setPopup(DIR_OPEN, sPopupList);
25 andreas 1266
				break;
24 andreas 1267
			}
1268
		}
1269
	}
1270
 
1271
	/*
1272
	 * This event catches everything comming from the COMM - module. Here the
1273
	 * AMX part of the COMM - module only makes a network connection to the
1274
	 * player. The API of the player is made to replace a heavy AMX COMM -
1275
	 * module. Everything normally is done inside an AMX COMM - module, is
1276
	 * done by the player itself, running on a Linux platform. This makes the
1277
	 * communication with it fairly easy.
1278
	 */
23 andreas 1279
	data_event[vdvMDB]
1280
	{
1281
		string:
1282
		{
1283
			stack_var char buf[8192];
1284
 
1285
			while (find_string(DATA.TEXT, ';', 1))
1286
			{
1287
				buf = remove_string(DATA.TEXT, ';', 1);
1288
				set_length_string(buf, length_string(buf) - 1);
1289
 
1290
				select
1291
				{
24 andreas 1292
					/*
1293
					 * This is send by the player whenever the UI should
1294
					 * display a list with song details.
1295
					 * The correct popup must be displayed and the contents
1296
					 * should be filled with the data from the player.
1297
					 */
25 andreas 1298
					active(find_string(buf, 'LINE:', 1)):
23 andreas 1299
					{
1300
					stack_var char sPg[32];
1301
					stack_var integer nSongID;
1302
					stack_var integer nLine;
1303
					stack_var integer anz;
1304
					stack_var integer i;
1305
 
25 andreas 1306
						remove_string(buf, 'LINE:', 1);
23 andreas 1307
						anz = strtok(buf, ':');
25 andreas 1308
 
23 andreas 1309
						for (i = 1; i <= anz; i++)
1310
						{
1311
							switch (i)
1312
							{
1313
								case 1: sPg = getStrTok(i);
1314
								case 2: nSongID = atoi(getStrTok(i));
26 andreas 1315
 
1316
								case 3:
1317
									nLine = atoi(getStrTok(i));
1318
									clearPageLine(nLine);
1319
									stSong[nLine].nID = nSongID;
1320
								break;
1321
 
25 andreas 1322
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1323
								case 5: stSong[nLine].sArtist = DecodeURL(getStrTok(i));
1324
								case 6: stSong[nLine].sAlbum = DecodeURL(getStrTok(i));
1325
								case 7: stSong[nLine].sGenre = DecodeURL(getStrTok(i));
1326
								case 8: stSong[nLine].sCover = DecodeURL(getStrTok(i));
23 andreas 1327
							}
1328
						}
1329
 
1330
						if (nLine == 1)
1331
						{
1332
							setActualPage(sPg);
1333
							clearPage();
1334
						}
1335
 
1336
						displaySong(nLine);
30 andreas 1337
						setLogo(stSong[nline].sCover, nLine);
23 andreas 1338
					}
1339
 
25 andreas 1340
					active(find_string(buf, 'FOLDER:', 1)):
1341
					{
1342
					stack_var char sPg[32];
1343
					stack_var integer nLine;
1344
					stack_var integer anz;
1345
					stack_var integer i;
1346
 
1347
						remove_string(buf, 'FOLDER:', 1);
1348
						anz = strtok(buf, ':');
1349
 
1350
						for (i = 1; i <= anz; i++)
1351
						{
1352
							switch(i)
1353
							{
1354
								case 1: sPg = getStrTok(i);
26 andreas 1355
 
1356
								case 2:
1357
									nLine = atoi(getStrTok(i));
1358
									clearPageLine(nLine);
1359
								break;
1360
 
25 andreas 1361
								case 3: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1362
								case 4: stSong[nLine].sCover = DecodeURL(getStrTok(i));
1363
							}
1364
						}
1365
 
1366
						stSong[nLine].nID = 0;
1367
						stSong[nLine].sAlbum = '';
1368
						stSong[nLine].sArtist = '';
1369
						stSong[nLine].sGenre = '';
1370
 
1371
						if (nLine == 1)
1372
						{
1373
							setActualPage(sPg);
1374
							clearPage();
1375
						}
1376
 
1377
						displaySong(nLine);
30 andreas 1378
						setLogo(stSong[nline].sCover, nLine);
25 andreas 1379
					}
1380
 
1381
					active(find_string(buf, 'PLAYLIST:', 1)):
1382
					{
1383
					stack_var integer nLine;
29 andreas 1384
					stack_var integer id;
25 andreas 1385
					stack_var integer anz;
1386
					stack_var integer i;
1387
 
1388
						remove_string(buf, 'PLAYLIST:', 1);
1389
						anz = strtok(buf, ':');
1390
 
1391
						for (i = 1; i <= anz; i++)
1392
						{
1393
							switch(i)
1394
							{
26 andreas 1395
								case 1: 
1396
									nLine = atoi(getStrTok(i));
1397
									clearPageLine(nLine);
1398
								break;
1399
 
29 andreas 1400
								case 2: stSong[nLine].nID = atoi(getStrTok(i));
1401
								case 3: sActUser = DecodeURL(getStrTok(i));
1402
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
25 andreas 1403
							}
1404
						}
1405
 
26 andreas 1406
						if (nLine == 1)
1407
						{
1408
							setActualPage(TOK_TXT_PLAYLIST);
1409
							clearPage();
1410
						}
25 andreas 1411
 
26 andreas 1412
						displaySong(nLine);
1413
					}
1414
 
1415
					// SEARCH:<type>:<id>:<line>:<title>:<artist>:<album>:<genre>;
1416
					active(find_string(buf, 'SEARCH:', 1)):
1417
					{
1418
					stack_var char sPg[32];
1419
					stack_var integer id;
1420
					stack_var integer nLine;
1421
					stack_var integer anz;
1422
					stack_var integer i;
1423
 
1424
						remove_string(buf, 'SEARCH:', 1);
1425
						anz = strtok(buf, ':');
1426
 
1427
						for (i = 1; i <= anz; i++)
1428
						{
1429
							switch(i)
1430
							{
1431
								case 1: sPg = getStrTok(i);
1432
								case 2: id = atoi(getStrTok(i));
1433
 
1434
								case 3:
1435
									nLine = atoi(getStrTok(i));
1436
									clearPageLine(nLine);
1437
									stSong[nLine].nID = id;
1438
								break;
1439
 
1440
								case 4: stSong[nLine].sTitle = DecodeURL(getStrTok(i));
1441
								case 5: stSong[nLine].sArtist = DecodeURL(getStrTok(i));
1442
								case 6: stSong[nLine].sAlbum = DecodeURL(getStrTok(i));
1443
								case 7: stSong[nLine].sGenre = DecodeURL(getStrTok(i));
1444
								case 8: stSong[nLine].sCover = DecodeURL(getStrTok(i));
1445
							}
1446
						}
1447
 
25 andreas 1448
						if (nLine == 1)
1449
						{
26 andreas 1450
							setActualPage(TOK_TXT_SEARCH);
25 andreas 1451
							clearPage();
1452
						}
1453
 
1454
						displaySong(nLine);
1455
					}
1456
 
1457
					active(find_string(buf, 'FOLDERNAME:', 1)):
1458
					{
1459
						remove_string(buf, 'FOLDERNAME:', 1);
1460
						sActFolder = buf;
1461
						nFolder = 1;
1462
					}
1463
 
24 andreas 1464
					active(find_string(buf, 'PLAYING:', 1)):
1465
					{
1466
					stack_var integer nSongID;
1467
					stack_var char sTitle[256];
1468
					stack_var char sArtist[256];
1469
					stack_var char sAlbum[256];
1470
					stack_var char sGenre[256];
1471
					stack_var char sCover[256];
1472
					stack_var integer anz;
1473
					stack_var integer i;
1474
 
1475
						remove_string(buf, 'PLAYING:', 1);
1476
						anz = strtok(buf, ':');
1477
 
1478
						for (i = 1; i <= anz; i++)
1479
						{
1480
							switch (i)
1481
							{
1482
								case 1: nSongID = atoi(getStrTok(i));
1483
								case 2: sTitle = DecodeURL(getStrTok(i));
1484
								case 3: sArtist = DecodeURL(getStrTok(i));
1485
								case 4: sAlbum = DecodeURL(getStrTok(i));
1486
								case 5: sGenre = DecodeURL(getStrTok(i));
1487
								case 6: sCover = DecodeURL(getStrTok(i));
1488
							}
1489
						}
1490
 
1491
						// Initialize detail fields
25 andreas 1492
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TITLE),',0,',sTitle";
1493
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_ARTIST),',0,',sArtist";
1494
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_ALBUM),',0,',sAlbum";
1495
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_GENRE),',0,',sGenre";
24 andreas 1496
						setLogo(sCover, 0);
1497
					}
1498
 
28 andreas 1499
					active(find_string(buf, 'POSITION:', 1)):
1500
					{
1501
						stack_var char sTimeA[16];
1502
						stack_var char sTimeB[16];
1503
						stack_var char sTimeC[16];
1504
						stack_var integer anz;
1505
						stack_var integer i;
1506
 
1507
						remove_string(buf, 'POSITION:', 1);
1508
						anz = strtok(buf, ':');
1509
 
1510
						for (i = 1; i <= anz; i++)
1511
						{
1512
							switch(i)
1513
							{
1514
								case 1: sTimeA = DecodeURL(getStrTok(i));
1515
								case 2: sTimeB = DecodeURL(getStrTok(i));
1516
								case 3: sTimeC = DecodeURL(getStrTok(i));
1517
							}
1518
						}
1519
 
1520
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TIME_PROG),',0,',sTimeA";
1521
						send_command dvTPs, "'^TXT-',itoa(TEXT_DETAIL_TIME_TOTAL),',0,',sTimeC";
1522
						displayProgresBar(sTimeA, sTimeC);
1523
					}
1524
 
25 andreas 1525
					active(find_string(buf, 'USER:', 1)):
1526
					{
1527
						remove_string(buf, 'USER:', 1);
1528
						sActUser = DecodeURL(buf);
1529
					}
1530
 
23 andreas 1531
					active(find_string(buf, 'TOTAL:', 1)):
1532
					{
1533
						remove_string(buf, 'TOTAL:', 1);
1534
						nTotal = atoi(buf);
24 andreas 1535
						displayPageInfo(nStart, nTotal);
29 andreas 1536
 
1537
						if (nTotal == 0)
1538
							clearPage();
23 andreas 1539
					}
1540
 
1541
					active(find_string(buf, 'PAGE:', 1)):
1542
					{
1543
						remove_string(buf, 'PAGE:', 1);
1544
						setActualPage(buf);
24 andreas 1545
						displayPageInfo(nStart, nTotal);
23 andreas 1546
					}
24 andreas 1547
 
25 andreas 1548
					active(find_string(buf, 'PLAYER:', 1)):
24 andreas 1549
					{
1550
						remove_string(buf, 'PLAYER:', 1);
1551
 
1552
						if (buf == 'PLAY')
1553
						{
1554
							nPlayStatus = PLAYER_PLAY;
1555
							on[dvTPs,PLAY];
1556
							off[dvTPs,STOP];
1557
							off[dvTPs,PAUSE];
1558
						}
1559
						else if (buf == 'STOP')
1560
						{
1561
							nPlayStatus = PLAYER_STOP;
1562
							off[dvTPs,PLAY];
1563
							on[dvTPs,STOP];
1564
							off[dvTPs,PAUSE];
1565
						}
1566
						else if (buf == 'PAUSE')
1567
						{
1568
							nPlayStatus = PLAYER_PAUSE;
1569
							off[dvTPs,PLAY];
1570
							off[dvTPs,STOP];
1571
							on[dvTPs,PAUSE];
1572
						}
1573
						else
1574
						{
1575
							nPlayStatus = 0;
1576
							off[dvTPs,PLAY];
1577
							off[dvTPs,STOP];
1578
							off[dvTPs,PAUSE];
1579
						}
1580
					}
1581
 
25 andreas 1582
					active(find_string(buf, 'RANDOM:', 1)):
1583
					{
1584
						remove_string(buf, 'RANDOM:', 1);
1585
 
1586
						if (buf == 'TRUE')
1587
							nRandom = 1;
1588
						else
1589
							nRandom = 0;
1590
					}
1591
 
1592
					active(find_string(buf, 'REPEAT:', 1)):
1593
					{
1594
						remove_string(buf, 'REPEAT:', 1);
1595
 
1596
						if (buf == 'TRUE')
1597
							nRepeat = 1;
1598
						else
1599
							nRepeat = 0;
1600
					}
1601
 
1602
					active(find_string(buf, 'ERROR:PLAYLIST:No user selected', 1)):
1603
					{
1604
						sActUser = '';
1605
						nKeyboard[get_last(dvTPs)] = TEXT_INPUT_UNAME;
1606
						send_command dvTPs[get_last(dvTPs)],"'@AKB-',sActUser,';Enter user name'";
1607
					}
1608
 
24 andreas 1609
					active(find_string(buf, 'KEYBOARD:', 1)):
1610
					{
1611
					stack_var integer pan;
1612
 
1613
						remove_string(buf, 'KEYBOARD:', 1);
1614
						pan = atoi(buf);
1615
						remove_string(buf, ':', 1);
1616
 
1617
						if (nKeyboard[pan] == TEXT_INPUT_UNAME)
1618
						{
25 andreas 1619
							sInputUser = buf;
1620
							send_command dvTPs[pan], "'^TXT-',itoa(TEXT_INPUT_UNAME),',0,',sInputUser";
24 andreas 1621
							nKeyboard[pan] = 0;
1622
						}
1623
						else if (nKeyboard[pan] == TEXT_INPUT_PLAYLIST)
1624
						{
25 andreas 1625
							sInputPlaylist = buf;
1626
							send_command dvTPs, "'^TXT-',itoa(TEXT_INPUT_PLAYLIST),',0,',sInputPlaylist";
24 andreas 1627
							nKeyboard[pan] = 0;
1628
						}
26 andreas 1629
						else if (nKeyboard[pan] == TEXT_INPUT_SEARCH)
1630
						{
1631
							setPopup(DIR_OPEN, sPopupAudio);
1632
							nOldStart = nStart;
1633
							nStart = 1;
1634
							nSearch = 1;
1635
							nOldPage = nPage;
28 andreas 1636
							sSearchFor = buf;
26 andreas 1637
							send_command vdvMDB, "'SEARCH:',requestActualPage(),':',EncodeURL(buf),':1:',itoa(MAX_LINES),';'";
1638
						}
24 andreas 1639
					}
23 andreas 1640
				}
1641
			}
1642
		}
1643
	}
25 andreas 1644
 
1645
	button_event[dvTPs,BTN_SCROLLBAR]
1646
	{
1647
		push:
1648
		{
1649
		stack_var integer pan;
1650
 
1651
			pan = get_last(dvTPs)
1652
			nScrollbarPressed[pan] = 1;
1653
		}
1654
 
1655
		release:
1656
		{
1657
		stack_var integer pan;
1658
 
1659
			pan = get_last(dvTPs)
1660
			nScrollbarPressed[pan] = 0;
1661
 
1662
			if (nTotal)
1663
			{
1664
				nStart = type_cast(nTotal / 100.0 * nScrollbarLvl);
1665
				send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
1666
			}
1667
		}
1668
	}
1669
 
1670
	level_event[dvTPs,LVL_SCROLLBAR]
1671
	{
1672
	stack_var integer pan;
1673
 
1674
		pan = get_last(dvTPs);
1675
 
1676
		if (nScrollbarPressed[pan])
1677
			nScrollbarLvl = LEVEL.VALUE;
1678
	}
1679
 
1680
DEFINE_PROGRAM
1681
	[dvTPs,MEDIA_RANDOM] = nRandom;
1682
	[dvTPs,MEDIA_REPEAT] = nRepeat;