/[drupal]/contributions/modules/wowroster/wowroster.module
ViewVC logotype

Contents of /contributions/modules/wowroster/wowroster.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (show annotations) (download) (as text)
Tue Nov 28 17:34:22 2006 UTC (3 years ago) by mosh
Branch: MAIN
CVS Tags: HEAD
Branch point for: DRUPAL-5, DRUPAL-4-7
Changes since 1.2: +4 -4 lines
File MIME type: text/x-php
fixed some t() errors
1 <?php
2 /**
3 * $Id: wowroster.module,v 1.2 2006/11/27 16:52:26 mosh Exp $
4 */
5
6
7
8 /**
9 * Display help and module information
10 * @param section which section of the site we're displaying help
11 * @return help text for section
12 */
13 function wowroster_help($section='') {
14 $output = '';
15
16 switch ($section) {
17 case "admin/modules#description":
18 case "admin/help#wowroster":
19 $output = t("Allows the retrieval and display of some information from your WoWRoster.");
20 break;
21 }
22
23 return $output;
24 }
25 /** END: function wowroster_help **********************************************/
26
27
28
29 /**
30 * Valid permissions for wowroster
31 * @return An array of valid permissions for the wowroster module
32 */
33 function wowroster_perm() {
34 return array('administer wowroster', 'view wowroster');
35 }
36 /** END: function wowroster_perm **********************************************/
37
38
39
40 /**
41 * Implementation of hook_menu().
42 * @return array of menu items
43 */
44 function wowroster_menu($may_cache) {
45 $items = array();
46 if ($may_cache) {
47 // wowroster_iframe
48 $items[] = array(
49 'path' => 'wowroster_iframe',
50 'title' => t('WoWRoster'),
51 'callback' => 'wowroster_iframe',
52 'access' => user_access('view wowroster'),
53 'type' => MENU_NORMAL_ITEM,
54 );
55 // simpleroster
56 $items[] = array(
57 'path' => 'wowroster',
58 'title' => t('complete roster'),
59 'callback' => 'wowroster_simpleroster',
60 'access' => user_access('view wowroster'),
61 'type' => MENU_CALLBACK,
62 );
63 // profile
64 $items[] = array(
65 'path' => 'wowroster/profile',
66 'callback' => 'wowroster_player',
67 'access' => user_access('view wowroster'),
68 'type' => MENU_CALLBACK,
69 );
70 // installer
71 $items[] = array(
72 'path' => 'admin/wowroster/installer',
73 'title' => t('WoWRoster Installer'),
74 'callback' => 'wowroster_installer',
75 'access' => user_access('access administration pages'),
76 'access' => user_access('administer wowroster'),
77 'type' => MENU_NORMAL_ITEM,
78 );
79 } else {
80 // user/uid/wowroster/profile
81 if (arg(0) == 'user' && is_numeric(arg(1))) {
82 include_once('wowroster.inc');
83
84 // determine if the current drupal-user has a drupal_char-text-field
85 // corresponding to a valid wow player
86 $roster_id = _wowroster_drupaluser_to_wowplayer();
87
88 if (is_numeric($roster_id)) {
89 $items[] = array(
90 'path' => 'user/'. arg(1) .'/wowroster/profile',
91 'title' => t('WoWRoster Profiles'),
92 'callback' => 'wowroster_player',
93 'callback arguments' => array($roster_id),
94 'access' => $access,
95 'type' => MENU_LOCAL_TASK,
96 'weight' => -1,
97 );
98 }
99 }
100 }
101 return $items;
102 }
103 /** END: function wowroster_menu **********************************************/
104
105
106
107 /**
108 * Module configuration settings
109 * @return settings HTML or deny access
110 */
111 function wowroster_settings() {
112 include_once('wowroster.inc');
113 // only administrators can access this function
114 if (!user_access('administer wowroster')) {
115 return drupal_set_message(t('access denied'));
116 }
117
118 // settings_roster
119 $form['settings_roster'] = array(
120 '#type' => 'fieldset',
121 '#title' => t('Roster Information'),
122 '#collapsible' => TRUE,
123 );
124 $form['settings_roster']['wowroster_roster_tableprefix'] = array(
125 '#type' => 'textfield',
126 '#title' => t("WoWRosters table prefix"),
127 '#default_value' => variable_get('wowroster_roster_tableprefix', ''),
128 '#description' => t("The table prefix for WoWRoster. Include the trailing underscore. ex: roster_"),
129 '#size' => '15',
130 );
131
132 // settings_simpleroster
133 $form['settings_simpleroster'] = array(
134 '#type' => 'fieldset',
135 '#title' => t("Simple Roster Options"),
136 '#collapsible' => TRUE,
137 );
138 $form['settings_simpleroster']['wowroster_simpleroster_max'] = array(
139 '#type' => 'textfield',
140 '#title' => t("Maximum members per page"),
141 '#default_value' => variable_get('wowroster_simpleroster_max', 25),
142 '#description' => t("The maxmimum users that will be displayed on each page"),
143 '#size' => '3',
144 );
145
146 // settings_roster_profiles
147 $form['settings_roster_profiles'] = array(
148 '#type' => 'fieldset',
149 '#title' => t("Roster Profiles"),
150 '#collapsible' => TRUE,
151 );
152 $profile_fields = _drupal_get_profile_fields();
153 if (is_array($profile_fields)) {
154 array_unshift($profile_fields, t('Drupal-User'));
155 } else {
156 $profile_fields = array(t('Drupal-User'));
157 }
158 $form['settings_roster_profiles']['drupal_char-text_field'] = array(
159 '#type' => 'select',
160 '#title' => t("drupal-profile-field to associate with wow-charname"),
161 '#default_value' => variable_get('drupal_char-text_field', t('Drupal-User')),
162 '#options' => $profile_fields,
163 '#description' => '',
164 );
165 $form['settings_roster_profiles']['wowroster_main-text_search'] = array(
166 '#type' => 'textfield',
167 '#title' => t("Text used to designate mainchars"),
168 '#default_value' => variable_get('wowroster_main-text_search', 'Main'),
169 '#description' => t("Text used to designate mainchars"),
170 '#size' => '5',
171 );
172 $form['settings_roster_profiles']['wowroster_main-text_field'] = array(
173 '#type' => 'textfield',
174 '#title' => t("What field to search for main-text"),
175 '#default_value' => variable_get('wowroster_main-text_field', 'note'),
176 '#description' => t("What field to search for main-text"),
177 '#size' => '5',
178 );
179 $form['settings_roster_profiles']['wowroster_alt-text_search'] = array(
180 '#type' => 'textfield',
181 '#title' => t("Text used to designate alts"),
182 '#default_value' => variable_get('wowroster_alt-text_search', 'Twink'),
183 '#description' => t("Text used to designate alts"),
184 '#size' => '5',
185 );
186 $form['settings_roster_profiles']['wowroster_alt-text_field'] = array(
187 '#type' => 'textfield',
188 '#title' => t("What field to search for alt-text"),
189 '#default_value' => variable_get('wowroster_alt-text_field', 'note'),
190 '#description' => t("What field to search for alt-text"),
191 '#size' => '5',
192 );
193
194 return $form;
195 }
196 /** END: function wowroster_settings ******************************************/
197
198
199
200 /**
201 * WoWRoster Installer IFrame integration.
202 */
203 function wowroster_installer() {
204 // check if WoWRoster is marked as installed for this module
205 include_once('wowroster.inc');
206 if (TRUE === _wowroster_get_status()) {
207 $output = t('WoWRoster seems to be properly installed.');
208 } else if (!is_dir(drupal_get_path('module', 'wowroster').'/roster')) {
209 drupal_set_message(t('You have to unpack WoWRoster into').' '.drupal_get_path('module', 'wowroster').'/roster', 'error');
210 } else {
211 $output = "<div style='text-align:center;'>";
212 $output .= t('Follow the normal WoWRoster installation process.<br />When it points you to "Remove Install Files", click on "finish WoWRoster installation".<br /><br />');
213 $output .= wowroster_installer_form($form_id);
214 $output .= "</div><br />";
215
216 $frame = "<iframe src=\"".url(drupal_get_path('module','wowroster'))."/roster/install.php\" width=\"100%\" height=\"600px\">";
217 $frame .= "<!-- Alternate content for non-supporting browsers -->";
218 $frame .= "Your browser won't work here. You'll need IE5.5+";
219 $frame .= "</iframe>";
220
221 $output .= $frame;
222 }
223 print theme("page", $output);
224 }
225
226 function wowroster_installer_form($form_id) {
227 $form['submit'] = array('#type' => 'submit',
228 '#value' => t('finish WoWRoster installation'));
229 $output = drupal_get_form('wowroster_installer_form', $form);
230 return $output;
231 }
232
233 function wowroster_installer_form_submit($form_id,$form_values) {
234 include_once('wowroster.inc');
235 $roster_dir = drupal_get_path('module','wowroster')."/roster/";
236 _removeDir($roster_dir."install");
237 @unlink($roster_dir."install.php");
238 @unlink($roster_dir."upgrade.php");
239 db_query("UPDATE {wowroster_status} SET wowroster_is_installed = 1");
240 drupal_goto();
241 }
242 /** END: WoWRoster Installer IFrame integtation *******************************/
243
244
245
246 /**
247 * Generate HTML for the wowroster blocks
248 * @param op the operation from the URL
249 * @param delta offset
250 * @return block HTML
251 */
252 function wowroster_block($op='list', $delta = 0, $edit = array()) {
253 include_once('wowroster.inc');
254
255 // admin/blocks
256 if ($op == 'list' && TRUE === _wowroster_get_status()) {
257 $blocks[0]['info'] = t('Roster Player Listing');
258 $blocks[1]['info'] = t('Roster Realm Status');
259 $blocks[2]['info'] = t('Roster Richest Players');
260 $blocks[3]['info'] = t('Roster Guild MOTD');
261 return $blocks;
262
263 // Roster Player Listing block configuration
264 } elseif ($op == 'configure' && $delta == 0) {
265 // Configures how many members to show on the roster block
266 $form['wowroster_block_rostermaxdisp'] = array(
267 '#type' => 'textfield',
268 '#title' => t("Number of members to display"),
269 '#default_value' => variable_get('wowroster_block_rostermaxdisp', 5),
270 '#description' => t("The maximum number of members to display in roster block."),
271 '#maxlength' => '2',
272 '#size' => '2'
273 );
274 // Show only uploaded characters?
275 $form['wowroster_block_rosterdispul'] = array(
276 '#type' => 'checkbox',
277 '#title' => t("Show uploaded characters only"),
278 '#default_value' => variable_get('wowroster_block_rosterdispul', false),
279 '#description' => t("If this box is selected, only characters that have uploaded their profiles will be displayed.")
280 );
281 return $form;
282
283 // Roster Richest Players block configuration
284 } elseif ($op == 'configure' && $delta == 2) {
285 $form['wowroster_block_richmaxdisp'] = array(
286 '#type' => 'textfield',
287 '#title' => t("Number of members to display"),
288 '#default_value' => variable_get('wowroster_block_richmaxdisp', 5),
289 '#description' => t("The maximum number of members to display in richest players block."),
290 '#maxlength' => '2',
291 '#size' => '2'
292 );
293 $form['wowroster_block_richmondisp'] = array(
294 '#type' => 'checkbox',
295 '#title' => t("Show money"),
296 '#default_value' => variable_get('wowroster_block_richmondisp', true),
297 '#description' => t("Whether to display the members money.")
298 );
299 return $form;
300
301 // Roster Guild MOTD block configuration
302 } elseif ($op == 'configure' && $delta == 3) {
303 $form['wowroster_block_motd_as_img'] = array(
304 '#type' => 'checkbox',
305 '#title' => t("Display guild MOTD as image"),
306 '#default_value' => variable_get('wowroster_block_motd_as_img', true),
307 '#description' => t("Display guild MOTD as image or as text.")
308 );
309 return $form;
310
311 // Save Roster Player Listing block configuration
312 } elseif ($op == 'save' && $delta == 0) {
313 variable_set('wowroster_block_rostermaxdisp', $edit['wowroster_block_rostermaxdisp']);
314 variable_set('wowroster_block_rosterdispul', $edit['wowroster_block_rosterdispul']);
315 return;
316
317 // Save Roster Richest Players block configuration
318 } elseif ($op == 'save' && $delta == 2) {
319 variable_set('wowroster_block_richmaxdisp', $edit['wowroster_block_richmaxdisp']);
320 variable_set('wowroster_block_richmondisp', $edit['wowroster_block_richmondisp']);
321 return;
322
323 // Save Guild MOTD block configuration
324 } elseif ($op == 'save' && $delta == 3) {
325 variable_set('wowroster_block_motd_as_img', $edit['wowroster_block_motd_as_img']);
326 return;
327 }
328
329 elseif ($op == 'view' && TRUE == user_access('view wowroster')) {
330 $roster_url = base_path() . drupal_get_path('module', 'wowroster').'/roster';
331 $roster_tblpref = variable_get('wowroster_roster_tableprefix', '');
332 $roster_disul = variable_get('wowroster_block_rosterdispul', false);
333 switch($delta) {
334 // Display a list of members in the roster
335 case 0:
336 $block_content = '';
337 $block_limitnum = variable_get('wowroster_block_rostermaxdisp', 5);
338
339 // Only print the uploaded characters
340 if ($roster_disul) {
341 $block_content .= "<h3>Uploaded Characters</h3>";
342 $query = '
343 SELECT '.$roster_tblpref.'members.member_id,
344 '.$roster_tblpref.'members.name,
345 '.$roster_tblpref.'members.guild_title
346 FROM '.$roster_tblpref.'members
347 LEFT JOIN '.$roster_tblpref.'players
348 ON '.$roster_tblpref.'members.member_id = '.$roster_tblpref.'players.member_id
349 WHERE '.$roster_tblpref.'members.member_id = '.$roster_tblpref.'players.member_id
350 ORDER BY '.$roster_tblpref.'members.name ASC';
351 db_set_active('wowroster');
352 $queryResult = db_query_range($query, 1, $block_limitnum);
353 db_set_active('default');
354
355 while ($row = db_fetch_object($queryResult)) {
356 $block_content .= _wowroster_simpleroster_link($row->name, $row->member_id). " - ".$row->guild_title. "<br />";
357 }
358 }
359 else {
360 $query = 'SELECT member_id, name, guild_title
361 FROM '.$roster_tblpref.'members
362 ORDER BY name ASC';
363 db_set_active('wowroster');
364 $queryResult = db_query_range($query, 1, $block_limitnum);
365 db_set_active('default');
366
367 while ($row = db_fetch_object($queryResult)) {
368 if (_wowroster_is_uploaded($row->member_id)) {
369 $block_content .= _wowroster_simpleroster_link($row->name, $row->member_id). " - ".$row->guild_title. "<br />";
370 } else {
371 $block_content .= $row->name."<br />";
372 }
373 }
374 }
375 if ($block_content == "") {
376 $block_content .= "There are no members in the roster.";
377 return;
378 }
379
380 $block_content .= "<div class=\"more-link\">".
381 l(t("Full Roster"), "wowroster", array("title" => t("Full Roster")))
382 ."</div>";
383
384 $block['subject'] = 'Roster Listing';
385 $block['content'] = $block_content;
386 break;
387
388 // Display the realm status image
389 case 1:
390 $block_content .= '<div align="center"><img src="'.$roster_url.'/realmstatus.php" alt="realmstatus" /></div>';
391
392 $block['subject'] = 'Realm Status';
393 $block['content'] = $block_content;
394 break;
395
396 // Display the richest members
397 case 2:
398 $block_content .= '';
399 $block_limitrich = variable_get("wowroster_block_richmaxdisp", 5);
400 $block_displaymon = variable_get("wowroster_block_richmondisp", true);
401
402 $query = 'SELECT member_id,name, money_c, money_s, money_g FROM '.$roster_tblpref.'players ORDER BY money_g DESC, money_s DESC, money_c DESC LIMIT '.$block_limitrich.'';
403 db_set_active('wowroster');
404 $queryResult = db_query($query);
405 db_set_active('default');
406
407 while ($row = db_fetch_object($queryResult)) {
408 $block_content .= _wowroster_simpleroster_link($row->name, $row->member_id);
409
410 if ($block_displaymon){
411 $block_content .= '<br />With: ' .$row->money_g. '<img src="'.$roster_url.'/img/bagcoingold.gif" alt="" />' .$row->money_s. '<img src="'.$roster_url.'/img/bagcoinsilver.gif" alt="" />' .$row->money_c. '<img src="'.$roster_url.'/img/bagcoinbronze.gif" alt="" /><br />';
412 }
413 else {
414 $block_content .= '<br />';
415 }
416 }
417 if ($block_content == '') {
418 $block_content .= 'There are no rich players!';
419 return;
420 }
421 $block['subject'] = 'Top '.$block_limitrich.' Richest Players';
422 $block['content'] = $block_content;
423 break;
424
425 // Display the guild motd
426 case 3:
427 $roster_motd_as_img = variable_get('wowroster_block_motd_as_img', TRUE);
428
429 $path = base_path() . drupal_get_path('module', 'wowroster');
430 $style = theme_stylesheet_import($path.'/wowroster.css', $media = 'all');
431 drupal_set_html_head($style);
432
433 if ($roster_motd_as_img) {
434 $block_content .= '<img src="'.$roster_url.'/motd.php" alt="realmstatus" />';
435 } else {
436 $roster_tblpref = variable_get('wowroster_roster_tableprefix', '');
437 $query = 'SELECT guild_motd FROM '.$roster_tblpref.'guild';
438 db_set_active('wowroster');
439 $result = db_query($query);
440 db_set_active('default');
441 $motd = db_fetch_array($result);
442 $block_content = "<div id='text-motd'>".$motd['guild_motd']."</div>";
443 }
444
445 $block['content'] = $block_content;
446 break;
447
448
449 }
450 return $block;
451 }
452 }
453 /** END: wowroster_block ******************************************************/
454
455
456
457 /**
458 * Diplay the simple roster
459 * @return simeple roster HTML
460 *
461 */
462 function wowroster_simpleroster() {
463 include_once('wowroster.inc');
464 $roster_url = base_path() . drupal_get_path('module', 'wowroster').'/roster';
465 $roster_tblpref = variable_get('wowroster_roster_tableprefix', '');
466 $page_limitnum = variable_get("wowroster_simpleroster_max", 25);
467
468 // Query to get the list of members, and some details about them
469 $query = 'SELECT member_id, name, level, class, guild_title, note FROM '.$roster_tblpref.'members';
470
471 // Make the header array
472 $header = array(
473 array('data' => t('Name'), 'field' => 'name', 'sort' => 'asc'),
474 array('data' => t('Level'), 'field' => 'level'),
475 array('data' => t('Class'), 'field' => 'class'),
476 array('data' => t('Guild Rank'), 'field' => 'guild_title'),
477 array('data' => t('Note'), 'field' => 'note')
478 );
479
480 $query .= tablesort_sql($header);
481
482 // Run the query with pagable results
483 db_set_active('wowroster');
484 $result = pager_query($query, $page_limitnum);
485 db_set_active('default');
486
487
488 $imgurl = $roster_url."/img/Interface/Icons";
489 while ($member = db_fetch_object($result)) {
490
491 // Create the image depending on the class
492 switch($member->class) {
493 case 'Druid':
494 case 'Druide':
495 $classimg = "<img src='".$imgurl."/Ability_Druid_Maul.jpg' alt='[D]' width='16' height='16'> ";
496 break;
497 case 'Hunter':
498 case 'Jäger':
499 $classimg = "<img src='".$imgurl."/INV_Weapon_Bow_08.jpg' alt='[H]' width='16' height='16'> ";
500 break;
501 case 'Mage':
502 case 'Magier':
503 $classimg = "<img src='".$imgurl."/INV_Staff_13.jpg' alt='[M]' width='16' height='16'> ";
504 break;
505 case 'Paladin':
506 $classimg = "<img src='".$imgurl."/Spell_Fire_FlameTounge.jpg' alt='[P]' width='16' height='16'> ";
507 break;
508 case 'Priest':
509 case 'Priester':
510 $classimg = "<img src='".$imgurl."/Spell_Holy_LayOnHands.jpg' alt='[P]' width='16' height='16'> ";
511 break;
512 case 'Rogue':
513 case 'Schurke':
514 $classimg = "<img src='".$imgurl."/INV_ThrowingKnife_04.jpg' alt='[R]' width='16' height='16'> ";
515 break;
516 case 'Warlock':
517 case 'Hexenmeister':
518 $classimg = "<img src='".$imgurl."/Spell_Shadow_Cripple.jpg' alt='[W]' width='16' height='16'> ";
519 break;
520 case 'Warrior':
521 case 'Krieger':
522 $classimg = "<img src='".$imgurl."/INV_Sword_25.jpg' width='16' alt='[W]' height='16'> ";
523 break;
524 default:
525 $classimg = '[NA] ';
526 break;
527 }
528
529 if (_wowroster_is_uploaded($member->member_id)) {
530 $rows[] = array(_wowroster_simpleroster_link($member->name, $member->member_id), $member->level, $classimg . $member->class, $member->guild_title, $member->note);
531 } else {
532 $rows[] = array($member->name, $member->level, $classimg . $member->class, $member->guild_title, $member->note);
533 }
534 }
535
536 // Output the table
537 $output = theme('table', $header, $rows);
538 $output .= theme('pager', NULL, $page_limitnum);
539 return $output;
540 }
541 /** END: wowroster_simpleroster ***********************************************/
542
543
544
545 /**
546 * WoWRoster iframe integration
547 */
548 function wowroster_iframe() {
549 $frame = "<iframe src=\"".drupal_get_path('module','wowroster')."/roster/index.php\" width=\"100%\" height=\"600px\">";
550 $frame .= "<!-- Alternate content for non-supporting browsers -->";
551 $frame .= "Your browser won't work here. You'll need IE5.5+";
552 $frame .= "</iframe>";
553
554 print theme("page", $frame);
555 }
556 /** END: function wowroster ***************************************************/
557
558
559
560 /**
561 * Display a short description of all characters related to $memberid
562 *
563 * @param profile_id the profile_id of the user
564 * @return player(s) HTML
565 */
566 function wowroster_player($memberid) {
567 include_once('wowroster.inc');
568 // Get the variables we need
569 $roster_url = base_path().drupal_get_path('module', 'wowroster').'/roster';
570
571 $roster_tblpref = variable_get('wowroster_roster_tableprefix', '');
572 $main_text_field = variable_get('wowroster_main-text-field', 'note');
573 $main_text_search = variable_get('wowroster_main-text-search', 'Main');
574 $alt_text_field = variable_get('wowroster_alt-text-field', 'note');
575 $alt_text_search = variable_get('wowroster_alt-text-search', 'Twink');
576
577 // check if chartype member is main, alt or undefined
578 $chartype = _wowroster_player_is_chartype($memberid);
579
580 switch($chartype) {
581 // member is main
582 case 'main':
583 case 'alt':
584 // get main char
585 $chars[$main_text_search] = _wowroster_get_main($memberid, $chartype);
586
587 // get related twinks
588 $chars[$alt_text_search] = _wowroster_get_alts($chars[$main_text_search]['name']);
589
590 // DEBUG
591 #echo "<pre>";print_r($chars);echo "</pre>";
592 // DEBUG
593 break;
594
595 // member is undefined
596 case 'undefined':
597 // get only this char
598 $chars[$main_text_search] = _wowroster_get_main($memberid, $chartype);
599 break;
600 }
601
602 $output = theme('wowroster_player', $chars[$main_text_search], $memberid);
603 if ($chartype !== 'undefined') {
604 foreach ($chars[$alt_text_search] as $char) {
605 $output .= theme('wowroster_player', $char, $memberid);
606 }
607 }
608
609 // Output the users profiles
610 return $output;
611 }
612 /** END: wowroster_player *****************************************************/
613
614
615
616 /**
617 * Theme the data for one member into a fieldset
618 */
619 function theme_wowroster_player($char, $memberid) {
620
621 // DEBUG
622 #echo "<pre>";print_r($char);echo "</pre>";
623 // DEBUG
624
625 // Generate the user profile
626 $table = "
627 <table summary='' width='100%' border='1' cellspacing='0' cellpadding='4'>
628 <tr>
629 <td width='155'>".t('Character Description:')." </td>
630 <td>".$char['RankName']." ".$char['name']." ".t('is a level')." ".$char['level']." ".$char['sex']." ".$char['race']." ".$char['class'].".</td>
631 </tr>
632 <tr>
633 <td>Character Details: </td>
634 <td></td>
635 </tr>
636 </table>";
637
638 $collapsed = ($memberid == $char['member_id']) ? FALSE : TRUE;
639
640 $output .= theme(
641 'fieldset',
642 array('#title' => $char['name'],
643 '#collapsible' => TRUE,
644 '#collapsed' => $collapsed,
645 '#children' => $table)
646 );
647
648 return $output;
649 }
650 /** END: theme_wowroster_player ***********************************************/

  ViewVC Help
Powered by ViewVC 1.1.2