function Setup(&$mod, &$smarty, &$data, $id, $returnid, $activetab = '', $message = '') { $gCms = cmsms(); $config = $gCms->GetConfig(); if (isset($data->readonly)) { unset($data->readonly); $pmod = FALSE; $pscore = FALSE; } else { $pmod = $mod->CheckAccess('admod'); $pscore = $pmod || $mod->CheckAccess('score'); } $smarty->assign('canmod', $pmod ? 1 : 0); // $smarty->assign('canscore',$pscore ? 1:0); if (!empty($message)) { $smarty->assign('message', $message); } $smarty->assign('form_start', $mod->CreateFormStart($id, 'addedit_comp', $returnid)); $smarty->assign('form_end', $mod->CreateFormEnd()); if ($activetab == FALSE) { $activetab = 'maintab'; } $smarty->assign('tabs_start', $mod->StartTabHeaders() . $mod->SetTabHeader('maintab', $mod->Lang('tab_main'), $activetab == 'maintab') . $mod->SetTabHeader('scheduletab', $mod->Lang('tab_schedule'), $activetab == 'scheduletab') . $mod->SetTabHeader('advancedtab', $mod->Lang('tab_advanced'), $activetab == 'advancedtab') . $mod->SetTabHeader('charttab', $mod->Lang('tab_chart'), $activetab == 'charttab') . $mod->SetTabHeader('playerstab', $mod->Lang('tab_players'), $activetab == 'playerstab') . $mod->SetTabHeader('matchestab', $mod->Lang('tab_matches'), $activetab == 'matchestab') . $mod->SetTabHeader('resultstab', $mod->Lang('tab_results'), $activetab == 'resultstab') . $mod->EndTabHeaders() . $mod->StartTabContent()); $smarty->assign('tabs_end', $mod->EndTabContent()); $smarty->assign('maintab_start', $mod->StartTab('maintab')); $smarty->assign('scheduletab_start', $mod->StartTab('scheduletab')); $smarty->assign('advancedtab_start', $mod->StartTab('advancedtab')); $smarty->assign('charttab_start', $mod->StartTab('charttab')); $smarty->assign('playertab_start', $mod->StartTab('playerstab')); $smarty->assign('matchtab_start', $mod->StartTab('matchestab')); $smarty->assign('resultstab_start', $mod->StartTab('resultstab')); // $smarty->assign('historytab_start',$mod->StartTab('historytab')); $smarty->assign('tab_end', $mod->EndTab()); //accumulator for hidden items,to be parked on page $hidden = $mod->CreateInputHidden($id, 'bracket_id', $data->bracket_id); if (!empty($data->added)) { $hidden .= $mod->CreateInputHidden($id, 'newbracket', $data->bracket_id); } $hidden .= $mod->CreateInputHidden($id, 'active_tab') . $mod->CreateInputHidden($id, 'real_action'); //accumulators for script funcs,to be parked at end of the page $jsfuncs = array(); $jsloads = array(); $smarty->assign('incpath', $mod->GetModuleURLPath() . '/include/'); if ($pmod) { //setup some ajax-parameters - partial data for tableDnD::onDrop $url = $mod->CreateLink($id, 'move_team', NULL, NULL, array('bracket_id' => $data->bracket_id, 'neworders' => ''), NULL, TRUE); $offs = strpos($url, '?mact='); $ajfirst = str_replace('amp;', '', substr($url, $offs + 1)); $jsfuncs[] = <<<EOS function ajaxData(droprow,dropcount) { var orders = []; \$(droprow.parentNode).find('tr td.ord').each(function(){ orders[orders.length] = this.innerHTML; }); var ajaxdata = '{$ajfirst}'+orders.join(); return ajaxdata; } function dropresponse(data,status) { if(status == 'success' && data) { var i = 1; \$('#tmt_players').find('.ord').each(function(){\$(this).html(i++);}); var name; var oddclass = 'row1'; var evenclass = 'row2'; i = true; \$('#tmt_players').trigger('update').find('tbody tr').each(function() { \tname = i ? oddclass : evenclass; \t\$(this).removeClass().addClass(name); \ti = !i; }); } else { \$('#page_tabs').prepend('<p style="font-weight:bold;color:red;">{$mod->Lang('err_ajax')}!</p><br />'); } } EOS; $onsort = <<<EOS function () { var orders = []; \$(this).find('tbody tr td.ord').each(function(){ orders[orders.length] = this.innerHTML; }); var ajaxdata = '{$ajfirst}'+orders.join(); \$.ajax({ url: 'moduleinterface.php', type: 'POST', data: ajaxdata, dataType: 'text', success: function (data,status) { if(status == 'success' && data) { var i = 1; \$('#tmt_players').find('.ord').each(function(){ \t \$(this).html(i++); \t }); } else { \$('#page_tabs').prepend('<p style="font-weight:bold;color:red;">{$mod->Lang('err_ajax')}!</p><br />'); } } }); } EOS; } else { $onsort = 'null'; } //no sort-processing if no mods allowed $jsloads[] = <<<EOS \$.SSsort.addParser({ id: 'neglastinput', is: function(s,node) { var n = node.childNodes[0]; if(n && n.nodeName.toLowerCase() == 'input' && n.type.toLowerCase() == 'text') { var v = n.value; return (!isNaN(parseFloat(v)) && isFinite(v)); } else { return false; } }, format: function(s,node) { var v = node.childNodes[0].value; if (v) { var n = Number(v); if (isNaN(n) || n==0) {return 0;} return (n>0) ? n:n+10000; } else if ((v+'').length > 0) { return 0; } else { return 9000; } }, watch: true, type: 'numeric' }); \$.SSsort.addParser({ id: 'isoinput', is: function(s,node) { var n = node.childNodes[0]; if(n && n.nodeName.toLowerCase() == 'input' && n.type.toLowerCase() == 'text') { p = /^[12]\\d{3}[\\/-][01]\\d[\\/-]\\[0-3]\\d +([01]\\d|2[0-3])( *: *[0-5]\\d){1,2}/; return p.test(\$.trim(n.value)); } else { return false; } }, format: function(s,node) { return Date.parse(node.childNodes[0].value); }, watch: true, type: 'numeric' }); \$.SSsort.addParser({ id: 'textinput', is: function(s,node) { var n = node.childNodes[0]; return (n && n.nodeName.toLowerCase() == 'input' && n.type.toLowerCase() == 'text'); }, format: function(s,node) { var t = node.childNodes[0].value; return \$.trim(t); }, watch: true, type: 'text' }); var opts = { sortClass: 'SortAble', ascClass: 'SortUp', descClass: 'SortDown', oddClass: 'row1', evenClass: 'row2', oddsortClass: 'row1s', evensortClass: 'row2s', onSorted: {$onsort} }; \$('#tmt_players').addClass('table_sort').SSsort(opts); delete opts.onSorted; \$('#tmt_matches').addClass('table_sort').SSsort(opts); \$('#tmt_results').addClass('table_sort').SSsort(opts); \$('.tem_name,.tem_seed,.mat_playwhen,.mat_playwhere,.res_playwhen').blur(function (ev) { \$(this).closest('table').trigger('update'); }); EOS; $jsfuncs[] = <<<EOS function eventCancel(ev) { if(!ev) { if(window.event) ev = window.event; else return; } if(ev.cancelBubble !== null) ev.cancelBubble = true; if(ev.stopPropagation) ev.stopPropagation(); if(ev.preventDefault) ev.preventDefault(); if(window.event) ev.returnValue = false; if(ev.cancel !== null) ev.cancel = true; } function set_action(btn) { \$('#{$id}real_action').val(btn.name); } function set_tab() { var active = \$('#page_tabs > .active'); \$('#{$id}active_tab').val(active.attr('id')); } function set_params(btn) { set_action(btn); set_tab(); } EOS; $this->MatchExists($data->bracket_id); $funcs = new tmtData(); $theme = cmsms()->get_variable('admintheme'); $iconinfo = $theme->DisplayImage('icons/system/info.gif', $mod->Lang('showhelp'), '', '', 'systemicon tipper'); $smarty->assign('showtip', $iconinfo); //========= MAIN OPTIONS ========== $main = array(); $main[] = array($mod->Lang('title_title'), $pmod ? $mod->CreateInputText($id, 'tmt_name', $data->name, 50) : $data->name); $main[] = array($mod->Lang('title_desc'), $pmod ? $mod->CreateTextArea(TRUE, $id, $data->description, 'tmt_description', '', '', '', '', 65, 10, '', '', 'style="height:8em;"') : $data->description); $main[] = array($mod->Lang('title_alias'), $pmod ? $mod->CreateInputText($id, 'tmt_alias', $data->alias, 30) : $data->alias, $mod->Lang('help_alias')); $options = $mod->GetGroups(); if ($options) { foreach ($options as &$row) { $row = $row['name']; } unset($row); $options = array_flip($options); } else { $options = array($mod->Lang('groupdefault') => 0); } //ensure something exists $main[] = array($mod->Lang('title_group'), $pmod && !$this->committed ? $mod->CreateInputDropdown($id, 'tmt_groupid', $options, '', $data->groupid) : array_search($data->groupid, $options, TRUE) . ($pmod ? $mod->CreateInputHidden($id, 'tmt_groupid', $data->groupid) : ''), $mod->Lang('help_group')); $options = $funcs->GetTypeNames($mod); $main[] = array($mod->Lang('title_type'), $pmod && !$this->committed ? $mod->CreateInputDropdown($id, 'tmt_type', $options, '', $data->type) : array_search($data->type, $options, TRUE) . ($pmod ? $mod->CreateInputHidden($id, 'tmt_type', $data->type) : '')); $main[] = array($mod->Lang('title_zone'), $pmod && !$this->committed ? $mod->CreateInputDropdown($id, 'tmt_timezone', $mod->GetTimeZones(), '', $data->timezone) : $data->timezone . ($pmod ? $mod->CreateInputHidden($id, 'tmt_timezone', $data->timezone) : ''), $mod->Lang('help_zone2')); $main[] = array($mod->Lang('title_teamsize'), $pmod ? $mod->CreateInputText($id, 'tmt_teamsize', $data->teamsize, 2, 2) : $data->teamsize); $options = array($mod->Lang('seed_none') => 0, $mod->Lang('seed_toponly') => 1, $mod->Lang('seed_balanced') => 2, $mod->Lang('seed_unbalanced') => 3, $mod->Lang('seed_randbalance') => 4); $main[] = array($mod->Lang('title_seedtype'), $pmod && !$this->committed ? $mod->CreateInputDropdown($id, 'tmt_seedtype', $options, '', $data->seedtype) : array_search($data->seedtype, $options) . ($pmod ? $mod->CreateInputHidden($id, 'tmt_seedtype', $data->seedtype) : ''), $mod->Lang('help_seedtype')); $options = array($mod->Lang('fix_none') => 0, $mod->Lang('fix_adjacent') => 1, $mod->Lang('fix_balanced') => 2, $mod->Lang('fix_unbalanced') => 3); $main[] = array($mod->Lang('title_fixtype'), $pmod && !$this->committed ? $mod->CreateInputDropdown($id, 'tmt_fixtype', $options, '', $data->fixtype) : array_search($data->fixtype, $options) . ($pmod ? $mod->CreateInputHidden($id, 'tmt_fixtype', $data->fixtype) : ''), $mod->Lang('help_fixtype')); $main[] = array($mod->Lang('title_owner'), $pmod ? $mod->CreateInputText($id, 'tmt_owner', $data->owner, 50) : $data->owner, $mod->Lang('help_owner')); $main[] = array($mod->Lang('title_contact'), $pmod ? $mod->CreateInputText($id, 'tmt_contact', $data->contact, 50) : $data->contact, $mod->Lang('help_contact')); $help = $mod->Lang('help_twt1'); if ($pmod) { $twt = new tmtTweet(); if ($twt->GetTokens($data->bracket_id, TRUE, TRUE)) { $help .= $mod->Lang('help_twt2', $data->twtfrom); } else { $help .= $mod->Lang('help_twt3'); } $help .= ' ' . $mod->Lang('help_twt4'); } $main[] = array($mod->Lang('title_twtfrom'), $pmod ? $mod->CreateInputText($id, 'tmt_twtfrom', $data->twtfrom, 16) . ' ' . $mod->CreateInputSubmit($id, 'connect', $mod->Lang('connect'), 'title="' . $mod->Lang('title_auth') . '" onclick="set_params(this);"') : $data->twtfrom, $help); $sms = class_exists('SMSG', FALSE); if ($sms) { $main[] = array($mod->Lang('title_smsfrom'), $pmod ? $mod->CreateInputText($id, 'tmt_smsfrom', $data->smsfrom, 16) : $data->smsfrom, $mod->Lang('help_smsfrom')); $main[] = array($mod->Lang('title_smsprefix'), $pmod ? $mod->CreateInputText($id, 'tmt_smsprefix', $data->smsprefix, 4) : $data->smsprefix, $mod->Lang('help_smsprefix')); } $ob = cms_utils::get_module('FrontEndUsers'); if ($ob) { //TODO if possible for feu, filter on permitted groups only c.f. MBVFaq if ($pmod) { $grpnames = $ob->GetGroupList(); } unset($ob); $main[] = array($mod->Lang('title_feu_eds'), $pmod ? $mod->CreateInputDropdown($id, 'tmt_feu_editgroup', array($mod->Lang('no_groups') => 'none', $mod->Lang('all_groups') => 'any') + $grpnames, '', $data->feu_editgroup) : $data->feu_editgroup, $mod->Lang('help_login')); } $smarty->assign('main', $main); //========= ADVANCED OPTIONS ========== $adv = array(); $adv[] = array($mod->Lang('title_locale'), $pmod ? $mod->CreateInputText($id, 'tmt_locale', $data->locale, 8, 12) : $data->locale, $mod->Lang('help_locale')); if ($sms) { $adv[] = array($mod->Lang('title_phone_regex'), $pmod ? $mod->CreateInputText($id, 'tmt_smspattern', $data->smspattern, 30, 32) : $data->smspattern, $mod->Lang('help_phone_regex')); } $mail = class_exists('CMSMailer', FALSE); $tplhelp = array(); $tplhelp[] = $mod->Lang('help_template'); foreach (array('title', 'description', 'owner', 'contact', 'smsfrom', 'where', 'when', 'date', 'time', 'opponent', 'teams', 'recipient', 'toall') as $varname) { $tplhelp[] = ' $' . $varname . ': ' . $mod->Lang('desc_' . $varname); } $tplhelp[] = $mod->Lang('help_mailout_template'); $help = implode('<br />', $tplhelp); $helpabove = $mod->Lang('seeabove'); if ($mail) { if ($pmod) { $hidden .= $mod->CreateInputHidden($id, 'tmt_html', 0); } $adv[] = array($mod->Lang('title_emailhtml'), $pmod ? $mod->CreateInputCheckbox($id, 'tmt_html', '1', $data->html) : ($data->html ? $mod->Lang('yes') : $mod->Lang('no'))); $adv[] = array($mod->Lang('title_mailouttemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->motemplate, 'tmt_motemplate', '', '', '', '', 65, 10, '', '', 'style="height:8em"') : $data->motemplate, $help); } $adv[] = array($mod->Lang('title_tweetouttemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->totemplate, 'tmt_totemplate', '', '', '', '', 65, 3, '', '', 'style="height:3em"') : $data->totemplate, $mail ? $helpabove : $help); //TODO maybe specific $tplhelp[] if ($mail) { $adv[] = array($mod->Lang('title_mailcanceltemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->mcanctemplate, 'tmt_mcanctemplate', '', '', '', '', 65, 10, '', '', 'style="height:8em"') : $data->mcanctemplate, $helpabove); } $adv[] = array($mod->Lang('title_tweetcanceltemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->tcanctemplate, 'tmt_tcanctemplate', '', '', '', '', 65, 3, '', '', 'style="height:3em"') : $data->tcanctemplate, $helpabove); //TODO maybe specific $tplhelp[] if ($mail) { $adv[] = array($mod->Lang('title_mailrequesttemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->mreqtemplate, 'tmt_mreqtemplate', '', '', '', '', 65, 10, '', '', 'style="height:8em"') : $data->mreqtemplate, $helpabove); } $adv[] = array($mod->Lang('title_tweetrequesttemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->treqtemplate, 'tmt_treqtemplate', '', '', '', '', 65, 3, '', '', 'style="height:3em"') : $data->totemplate, $helpabove); //TODO maybe specific $tplhelp[] $tplhelp = array(); $tplhelp[] = $mod->Lang('help_template'); foreach (array('title', 'description', 'where', 'when', 'date', 'time', 'report') as $varname) { $tplhelp[] = ' $' . $varname . ': ' . $mod->Lang('desc_' . $varname); } $tplhelp[] = $mod->Lang('help_mailin_template'); $help = implode('<br />', $tplhelp); if ($mail) { $adv[] = array($mod->Lang('title_mailintemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->mitemplate, 'tmt_mitemplate', '', '', '', '', 65, 10, '', '', 'style="height:8em"') : $data->mitemplate, $help); } $adv[] = array($mod->Lang('title_tweetintemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->titemplate, 'tmt_titemplate', '', '', '', '', 65, 3, '', '', 'style="height:3em"') : $data->titemplate, $mail ? $helpabove : $help); //TODO maybe specific $tplhelp[] $adv[] = array($mod->Lang('title_logic'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->logic, 'tmt_logic', '', '', '', '', 65, 15, '', '', 'style="height:8em"') : $data->logic, $mod->Lang('help_logic')); $smarty->assign('advanced', $adv); //========= SCHEDULE ========== $sched = array(); if ($pmod) { if (!$this->committed) { $i = $mod->CreateInputText($id, 'tmt_startdate', $data->startdate, 15, 20); $i = str_replace('class="', 'class="pickdate ', $i); } elseif ($data->startdate) { $i = $data->startdate . $mod->CreateInputHidden($id, 'tmt_startdate', $data->startdate); } else { $i = ' ' . $mod->CreateInputHidden($id, 'tmt_startdate', ''); } } elseif ($data->startdate) { $i = $data->startdate; } else { $i = ' '; } $sched[] = array($mod->Lang('title_start_date'), $i, $mod->Lang('help_date')); if ($pmod) { $i = $mod->CreateInputText($id, 'tmt_enddate', $data->enddate, 15, 20); $i = str_replace('class="', 'class="pickdate ', $i); } else { $i = $data->enddate ? $data->enddate : ' '; } $sched[] = array($mod->Lang('title_end_date'), $i, $mod->Lang('help_date')); if ($pmod) { //for popup calendars $nextm = $mod->Lang('nextm'); $prevm = $mod->Lang('prevm'); //js wants quoted period-names $t = $mod->Lang('longmonths'); $mnames = "'" . str_replace(",", "','", $t) . "'"; $t = $mod->Lang('longdays'); $dnames = "'" . str_replace(",", "','", $t) . "'"; $t = $mod->Lang('shortdays'); $sdnames = "'" . str_replace(",", "','", $t) . "'"; $jsloads[] = <<<EOS \$('.pickdate').each(function() { \$(this).Pikaday({ container: this.parentNode, format: 'YYYY-MM-DD', i18n: { previousMonth: '{$prevm}', nextMonth: '{$nextm}', months: [{$mnames}], weekdays: [{$dnames}], weekdaysShort: [{$sdnames}] } }); }); EOS; } if (class_exists('Booker', FALSE)) { $sched[] = array($mod->Lang('title_calendar') . ' (NOT YET WORKING)', $pmod ? $mod->CreateInputText($id, 'tmt_calendarid', $data->calendarid, 15, 20) : $data->calendarid, $mod->Lang('help_calendar')); } $sched[] = array($mod->Lang('title_available') . ' (NOT YET WORKING)', $pmod ? $mod->CreateTextArea(FALSE, $id, $data->available, 'tmt_available', '', '', '', '', 40, 3, '', '', 'style="height:3em"') : $data->available, $mod->Lang('help_available')); $sched[] = array($mod->Lang('title_latitude'), $pmod ? $mod->CreateInputText($id, 'tmt_latitude', $data->latitude, 8) : $data->latitude, $mod->Lang('help_latitude')); $sched[] = array($mod->Lang('title_longitude'), $pmod ? $mod->CreateInputText($id, 'tmt_longitude', $data->longitude, 8) : $data->longitude, $mod->Lang('help_longitude')); $sched[] = array($mod->Lang('title_same_time'), $pmod ? $mod->CreateInputText($id, 'tmt_sametime', $data->sametime, 3) : $data->sametime, $mod->Lang('help_same_time')); $cal = new tmtCalendar($mod); $opts = $cal->IntervalNames(array(0, 1, 2, 3, 4), TRUE); //plural choices up to weeks unset($cal); if ($pmod) { $opts = array_flip($opts); } //selector needs other form of array $sched[] = array($mod->Lang('title_place_gap'), $pmod ? $mod->CreateInputText($id, 'tmt_placegap', $data->placegap, 3, 5) . ' ' . $mod->CreateInputDropdown($id, 'tmt_placegaptype', $opts, -1, $data->placegaptype) : $data->placegap . ' ' . $opts[$data->placegaptype], $mod->Lang('help_place_gap')); $sched[] = array($mod->Lang('title_play_gap'), $pmod ? $mod->CreateInputText($id, 'tmt_playgap', $data->playgap, 3, 5) . ' ' . $mod->CreateInputDropdown($id, 'tmt_playgaptype', $opts, -1, $data->playgaptype) : $data->playgap . ' ' . $opts[$data->playgaptype], $mod->Lang('help_play_gap')); $smarty->assign('schedulers', $sched); //========= CHART ========== $names = array(); $names[] = array($mod->Lang('title_final'), $pmod ? $mod->CreateInputText($id, 'tmt_final', $data->final, 30) : $data->final); $names[] = array($mod->Lang('title_semi'), $pmod ? $mod->CreateInputText($id, 'tmt_semi', $data->semi, 30) : $data->semi); $names[] = array($mod->Lang('title_quarter'), $pmod ? $mod->CreateInputText($id, 'tmt_quarter', $data->quarter, 30) : $data->quarter); $names[] = array($mod->Lang('title_eighth'), $pmod ? $mod->CreateInputText($id, 'tmt_eighth', $data->eighth, 30) : $data->eighth); $names[] = array($mod->Lang('title_roundname'), $pmod ? $mod->CreateInputText($id, 'tmt_roundname', $data->roundname, 30) : $data->roundname, $mod->Lang('help_match_names')); $names[] = array($mod->Lang('title_against'), $pmod ? $mod->CreateInputText($id, 'tmt_versus', $data->versus, 30) : $data->versus); $names[] = array($mod->Lang('title_defeated'), $pmod ? $mod->CreateInputText($id, 'tmt_defeated', $data->defeated, 30) : $data->defeated); $names[] = array($mod->Lang('title_cantie'), $pmod ? $mod->CreateInputCheckbox($id, 'tmt_cantie', 1, $data->cantie) : ($data->cantie ? $mod->Lang('yesties') : $mod->Lang('noties'))); $names[] = array($mod->Lang('title_tied'), $pmod ? $mod->CreateInputText($id, 'tmt_tied', $data->tied, 30) : $data->tied); $names[] = array($mod->Lang('title_noop'), $pmod ? $mod->CreateInputText($id, 'tmt_bye', $data->bye, 30) : $data->bye); $names[] = array($mod->Lang('title_forfeit'), $pmod ? $mod->CreateInputText($id, 'tmt_forfeit', $data->forfeit, 30) : $data->forfeit); $names[] = array($mod->Lang('title_abandoned'), $pmod ? $mod->CreateInputText($id, 'tmt_nomatch', $data->nomatch, 30) : $data->nomatch); $names[] = array($mod->Lang('title_atformat'), $pmod ? $mod->CreateInputText($id, 'tmt_atformat', $data->atformat, 16) : $data->atformat, $mod->Lang('help_date_format')); $names[] = array($mod->Lang('title_cssfile'), $pmod ? $mod->CreateInputText($id, 'tmt_chartcss', $data->chartcss, 20, 128) . ' ' . $mod->CreateInputSubmit($id, 'upload_css', $mod->Lang('upload'), 'title="' . $mod->Lang('upload_tip') . '" onclick="set_params(this);"') : $data->chartcss, $mod->Lang('help_cssfile')); $tplhelp = array(); $tplhelp[] = $mod->Lang('help_template'); foreach (array('title', 'description', 'owner', 'contact', 'image', 'imgdate', 'imgheight', 'imgwidth') as $varname) { $tplhelp[] = ' $' . $varname . ': ' . $mod->Lang('desc_' . $varname); } $tplhelp[] = $mod->Lang('help_chttemplate'); $help = implode('<br />', $tplhelp); $names[] = array($mod->Lang('title_chttemplate'), $pmod ? $mod->CreateTextArea(FALSE, $id, $data->chttemplate, 'tmt_chttemplate', '', '', '', '', 65, 20, '', '', 'style="height:10em"') : $data->chttemplate, $help); $smarty->assign('names', $names); $smarty->assign('print', $mod->CreateInputSubmit($id, 'print', $mod->Lang('print'), 'title="' . $mod->Lang('print_tip') . '" onclick="set_params(this);"')); //========= TEAMS ========== $smarty->assign('ordertitle', $mod->Lang('title_order')); $smarty->assign('seedtitle', $mod->Lang('title_seed')); $smarty->assign('contacttitle', $mod->Lang('title_contact')); $smarty->assign('movetitle', $mod->Lang('title_move')); $isteam = (int) $data->teamsize > 1; $teamtitle = $isteam ? $mod->Lang('title_team') : $mod->Lang('title_player'); $smarty->assign('teamtitle', $teamtitle); $finds = array('/class="(.*)"/', '/id=.*\\[\\]" /'); //for xhtml string cleanup if ($data->teams) { $tcount = count($data->teams); $teams = array(); $indx = 1; $rowclass = 'row1'; //used to alternate row colors $theme = $gCms->variables['admintheme']; if ($pmod) { $downtext = $mod->Lang('down'); $uptext = $mod->Lang('up'); $tmp = $isteam ? $mod->Lang('team') : $mod->Lang('player'); } foreach ($data->teams as $tid => $tdata) { $one = new stdClass(); $one->rowclass = $rowclass; if ($pmod) { $one->hidden = $mod->CreateInputHidden($id, 'tem_teamid[]', $tid) . $mod->CreateInputHidden($id, 'tem_contactall[]', $tdata['contactall']); $one->order = $tdata['displayorder']; $tmp = $mod->CreateInputText($id, 'tem_name[]', $tdata['name'], 20, 64); $one->name = preg_replace($finds, array('class="tem_name $1"', ''), $tmp); //fails if backref first! $tmp = $mod->CreateInputText($id, 'tem_seed[]', $tdata['seeding'], 3, 3); $one->seed = preg_replace($finds, array('class="tem_seed $1"', ''), $tmp); $tmp = $mod->CreateInputText($id, 'tem_contact[]', $tdata['contact'], 30, 64); $one->contact = preg_replace($finds, array('class="tem_contact $1"', ''), $tmp); //need input-objects that look like page-link, to get all form parameters upon activation if ($indx > 1) { $one->uplink = $mod->CreateInputLinks($id, 'moveup[' . $tid . ']', 'arrow-u.gif', FALSE, $uptext, 'onclick="set_params(this);"'); } else { $one->uplink = ''; } if ($indx < $tcount) { $one->downlink = $mod->CreateInputLinks($id, 'movedown[' . $tid . ']', 'arrow-d.gif', FALSE, $downtext, 'onclick="set_params(this);"'); } else { $one->downlink = ''; } $indx++; $one->editlink = $mod->CreateInputLinks($id, 'edit[' . $tid . ']', 'edit.gif', FALSE, $mod->Lang('edit'), 'onclick="set_params(this);"'); $one->deletelink = $mod->CreateInputLinks($id, 'delete_team[' . $tid . ']', 'delete.gif', FALSE, $mod->Lang('delete')); //confirmation via modal dialog $one->selected = $mod->CreateInputCheckbox($id, 'tsel[]', $tid, -1); } else { $one->order = $tdata['displayorder']; $one->name = $tdata['name']; $one->seed = $tdata['seeding']; $one->contact = $tdata['contact']; } $teams[] = $one; $rowclass == 'row1' ? $rowclass = 'row2' : ($rowclass = 'row1'); } $smarty->assign('teams', $teams); if ($pmod) { if ($tcount > 1) { $jsloads[] = <<<EOS \$('#tmt_players').addClass('table_drag').tableDnD({ \tdragClass: 'row1hover', \tonDrop: function(table, droprows) { \t\tvar odd = true; \t\tvar oddclass = 'row1'; \t\tvar evenclass = 'row2'; \t\tvar droprow = \$(droprows)[0]; \t\t\$(table).find('tbody tr').each(function() { \t\t\tvar name = odd ? oddclass : evenclass; \t\t\tif (this === droprow) { \t\t\t\tname = name+'hover'; \t\t\t} \t\t\t\$(this).removeClass().addClass(name); \t\t\todd = !odd; \t\t}); \t\tif (typeof ajaxData !== 'undefined' && \$.isFunction(ajaxData)) {\t\t \t\t\tvar ajaxdata = ajaxData(droprow,droprows.length); \t\t\tif (ajaxdata) { \t\t\t\t\$.ajax({ \t\t\t\t url: 'moduleinterface.php', \t\t\t\t type: 'POST', \t\t\t\t data: ajaxdata, \t\t\t\t dataType: 'text', \t\t\t\t success: dropresponse \t\t\t\t}); \t\t\t} \t\t} \t } }).find('tbody tr').removeAttr('onmouseover').removeAttr('onmouseout').mouseover(function() { \t\tvar now = \$(this).attr('class'); \t\t\$(this).attr('class', now+'hover'); }).mouseout(function() { \t\tvar now = \$(this).attr('class'); \t\tvar to = now.indexOf('hover'); \t\t\$(this).attr('class', now.substring(0,to)); }); \$('.updown').hide(); \$('.dndhelp').css('display','block'); EOS; } $jsloads[] = <<<EOS \$('#tmt_players').find('.tem_delete').children().modalconfirm({ overlayID: 'confirm', preShow: function(d){ \t var teamname = \$(this).closest('tr').find('.tem_name').attr('value'); \t var para = d.children('p:first')[0]; \t para.innerHTML = '{$mod->Lang('confirm_delete', '%s')}'.replace('%s',teamname); }, onConfirm: function(){ \t set_tab(); \t \$('#{$id}real_action').val(this.name); \t return true; } }); EOS; } } else { $tcount = 0; $smarty->assign('noteams', $mod->Lang('info_noteam')); } $smarty->assign('teamcount', $tcount); $t = ''; if ($pmod) { $this->SpareSlot($data->bracket_id, $data->type != Tourney::RRTYPE); if ($this->spare) { $linktext = $mod->Lang('title_add', strtolower($teamtitle)); //need input-object that looks like page-link, to get all form parameters upon activation $t = $mod->CreateInputLinks($id, 'addteam', 'newobject.gif', TRUE, $linktext, 'onclick="set_params(this);"'); } } $smarty->assign('addteam', $t); if ($tcount) { if ($tcount > 1) { $jsfuncs[] = <<<EOS function select_all_teams(cb) { \$('#tmt_players > tbody').find('input[type="checkbox"]').attr('checked',cb.checked); } EOS; $smarty->assign('selteams', $mod->CreateInputCheckbox($id, 't', FALSE, -1, 'id="teamsel" onclick="select_all_teams(this);"')); } else { $smarty->assign('selteams', ''); } $jsfuncs[] = <<<EOS function team_count() { var cb = \$('#tmt_players > tbody').find('input:checked'); return cb.length; } function teams_selected(ev,btn) { if(team_count() > 0) { set_params(btn); return true; } else { eventCancel(ev); return false; } } EOS; if ($pmod) { if ($data->matches || !$this->any) { $smarty->assign('dndhelp', $mod->Lang('help_dnd')); $smarty->assign('update1', $mod->CreateInputSubmit($id, 'update[' . $id . 'teams]', $mod->Lang('update'), 'title="' . $mod->Lang('update_tip') . '" onclick="return teams_selected(event,this);"')); $smarty->assign('delete', $mod->CreateInputSubmit($id, 'delteams', $mod->Lang('delete'), 'title="' . $mod->Lang('delete_tip') . '"')); $t = $isteam ? $mod->Lang('sel_teams') : $mod->Lang('sel_players'); $t = $mod->Lang('confirm_delete', $t); $jsloads[] = <<<EOS \$('#{$id}delteams').modalconfirm({ overlayID: 'confirm', doCheck: function(){ \t return (team_count() > 0); }, preShow: function(d){ \t var para = d.children('p:first')[0]; \t para.innerHTML = '{$t}'; }, onConfirm: function(){ \t set_tab(); \t \$('#{$id}real_action').val(this.name); \t return true; } }); EOS; } else { $smarty->assign('dndhelp', ''); $smarty->assign('update1', ''); $smarty->assign('delete', ''); } } $smarty->assign('export', $mod->CreateInputSubmit($id, 'export', $mod->Lang('export'), 'title="' . $mod->Lang('export_tip') . '" onclick="return teams_selected(event,this);"')); } if ($pmod && ($data->matches || !$this->any)) { //not finished $t = $mod->CreateInputSubmit($id, 'import_team', $mod->Lang('import'), 'title="' . $mod->Lang('import_tip') . '" onclick="set_params(this);"'); } else { $t = ''; } $smarty->assign('import', $t); //========== MATCHES =========== if (empty($data->matchview)) { $data->matchview = 'actual'; } $plan = $data->matchview != 'actual'; //these labels are shared with results tab, and may be used for history-view when all matches finished i.e. none displayed now $smarty->assign('scheduledtitle', $mod->Lang('scheduled')); $smarty->assign('placetitle', $mod->Lang('title_venue')); $smarty->assign('statustitle', $mod->Lang('title_status')); if ($data->matches) { if ($plan) { switch ($data->type) { case Tourney::RRTYPE: $anon = $mod->Lang('anonother'); break; case Tourney::DETYPE: $rnd = new tmtRoundsDE(); //partial bracket data for downstream to use when naming $bdata = array('final' => $data->final, 'semi' => $data->semi, 'quarter' => $data->quarter, 'eighth' => $data->eighth, 'roundname' => $data->roundname, 'bye' => $data->bye); $tc = count($data->teams); break; default: $rnd = new tmtRoundsKO(); break; } } if ($pmod) { $firmed = $mod->Lang('confirmed'); $told = $mod->Lang('notified'); $asked = $mod->Lang('asked'); $items = array($mod->Lang('notyet') => Tourney::NOTYET, $mod->Lang('possible') => Tourney::SOFT, $firmed => Tourney::FIRM); $group = $mod->CreateInputRadioGroup($id, 'mat_status', $items, '', '', '|'); $choices = explode('|', $group); } $rowclass = 'row1'; $matches = array(); foreach ($data->matches as $mid => $mdata) { $one = new stdClass(); $one->rowclass = $rowclass; if ($plan) { $one->mid = $mid; $prev = FALSE; if ($mdata['teamA'] != NULL) { $one->teamA = $mod->TeamName($mdata['teamA'], FALSE); if (!$one->teamA) { $one->teamA = $data->bye; } } else { switch ($data->type) { case Tourney::RRTYPE: $one->teamA = $anon; break; case Tourney::DETYPE: $level = $rnd->MatchLevel($tc, $data->matches, $mid); $one->teamA = $rnd->MatchTeamID_Team($mod, $bdata, $tc, $data->matches, $mid, $level, $mdata['teamB']); //team id may be NULL or -1 break; default: $one->teamA = $rnd->MatchTeamID_Mid($mod, $data->matches, $mid); break; } } if ($mdata['teamB'] != NULL) { $one->teamB = $mod->TeamName($mdata['teamB'], FALSE); if (!$one->teamB) { if ($one->teamA != $data->bye) { $one->teamB = $data->bye; } else { $one->teamA = $mod->Lang('nomatch'); $one->teamB = ''; } } } else { switch ($data->type) { case Tourney::RRTYPE: $one->teamB = $anon; break; case Tourney::DETYPE: $level = $rnd->MatchLevel($tc, $data->matches, $mid); if ($mdata['teamA']) { $name = $rnd->MatchTeamID_Team($mod, $bdata, $tc, $data->matches, $mid, $level, $mdata['teamA']); } else { $excl = key($data->matches); if ($excl) { $excl--; } $name = $rnd->MatchTeamID_Mid($mod, $bdata, $tc, $data->matches, $mid, $level, $excl); } if ($name != $data->bye || $one->teamA != $data->bye) { $one->teamB = $name; } else { $one->teamA = $mod->Lang('nomatch'); $one->teamB = ''; } break; default: $excl = $mdata['teamA'] ? (int) $mdata['teamA'] : key($data->matches) - 1; $one->teamB = $rnd->MatchTeamID_Mid($mod, $data->matches, $mid, $excl); break; } } } else { $one->teamA = $mod->TeamName($mdata['teamA']); $one->teamB = $mod->TeamName($mdata['teamB']); } if ($pmod) { $tmp = $mod->CreateInputText($id, 'mat_playwhen[]', $mdata['playwhen'], 20, 48); $repls = array('class="mat_playwhen $1"', ''); $one->schedule = preg_replace($finds, $repls, $tmp); $tmp = $mod->CreateInputText($id, 'mat_playwhere[]', $mdata['place'], 20, 64); $repls = array('class="mat_playwhere $1"', ''); $one->place = preg_replace($finds, $repls, $tmp); $one->hidden = $mod->CreateInputHidden($id, 'mat_teamA[]', $mdata['teamA']) . $mod->CreateInputHidden($id, 'mat_teamB[]', $mdata['teamB']); if ($mdata['status'] >= Tourney::MRES) { //completed, no going back $one->hidden .= $mod->CreateInputHidden($id, 'mat_status[' . $mid . ']', $mdata['status']); if ($mdata['teamA'] == -1 || $mdata['teamB'] == -1) { $one->btn1 = ''; } else { $one->btn1 = $mod->Lang('status_complete'); } $one->btn2 = ''; $one->btn3 = ''; } else { $r = 'mat_status[' . $mid . ']"'; //unique name for each radio-group,also returns match-id $one->btn1 = str_replace('mat_status"', $r, $choices[0]); $one->btn2 = str_replace('mat_status"', $r, $choices[1]); $one->btn3 = str_replace('mat_status"', $r, $choices[2]); //tailor content switch ((int) $mdata['status']) { case Tourney::TOLD: $one->btn3 = str_replace(array($firmed, 'value="' . Tourney::FIRM . '"'), array($told, 'value="' . Tourney::TOLD . '"'), $one->btn3); break; case Tourney::ASKED: $one->btn3 = str_replace(array($firmed, 'value="' . Tourney::FIRM . '"'), array($asked, 'value="' . Tourney::ASKED . '"'), $one->btn3); break; case Tourney::ASOFT: case Tourney::AFIRM: $one->btn2 = str_replace('value="' . Tourney::SOFT, 'value="' . Tourney::ASOFT, $one->btn2); $one->btn3 = str_replace('value="' . Tourney::FIRM, 'value="' . Tourney::AFIRM, $one->btn3); break; } //select relevant radio item switch ((int) $mdata['status']) { case Tourney::SOFT: case Tourney::ASOFT: $one->btn2 = str_replace(' />', ' checked="checked" />', $one->btn2); break; case Tourney::FIRM: case Tourney::TOLD: case Tourney::ASKED: case Tourney::AFIRM: $one->btn3 = str_replace(' />', ' checked="checked" />', $one->btn3); break; default: $one->btn1 = str_replace(' />', ' checked="checked" />', $one->btn1); break; } } $one->selected = $mod->CreateInputCheckbox($id, 'msel[]', $mid, -1); } else { $one->schedule = $mdata['playwhen']; $one->place = $mdata['place']; $one->btn1 = ''; $one->btn2 = ''; switch (intval($mdata['status'])) { case Tourney::SOFT: case Tourney::ASOFT: $one->btn3 = $mod->Lang('possible'); break; case Tourney::FIRM: case Tourney::AFIRM: $one->btn3 = $mod->Lang('confirmed'); break; case Tourney::TOLD: $one->btn3 = $mod->Lang('notified'); break; case Tourney::ASKED: $one->btn3 = $mod->Lang('asked'); break; default: $one->btn3 = $mod->Lang('notyet'); break; } $one->selected = ''; } $matches[] = $one; $rowclass == 'row1' ? $rowclass = 'row2' : ($rowclass = 'row1'); } $smarty->assign('matches', $matches); if ($pmod && $matches) { //embedded vars here were defined for start/end-date calendars $jsloads[] = <<<EOS \$('.mat_playwhen').each(function() { \$(this).Pikaday({ container: this.parentNode, format: 'YYYY-MM-DD HH:mm', i18n: { previousMonth: '{$prevm}', nextMonth: '{$nextm}', months: [{$mnames}], weekdays: [{$dnames}], weekdaysShort: [{$sdnames}] } }); }); EOS; } if ($pmod && count($matches) > 1) { $jsfuncs[] = <<<EOS function select_all_matches(cb) { \$('#tmt_matches > tbody').find('input[type="checkbox"]').attr('checked',cb.checked); } EOS; $smarty->assign('selmatches', $mod->CreateInputCheckbox($id, 'm', FALSE, -1, 'id="matchsel" onclick="select_all_matches(this);"')); } else { $smarty->assign('selmatches', ''); } $jsfuncs[] = <<<EOS function match_count() { var cb = \$('#tmt_matches > tbody').find('input[type=checkbox]:checked'); return cb.length; } function matches_selected(ev,btn) { if(match_count() > 0) { set_params(btn); return true; } else { eventCancel(ev); return false; } } EOS; if ($pmod) { $smarty->assign('update2', $mod->CreateInputSubmit($id, 'update[' . $id . 'matches]', $mod->Lang('update'), 'title="' . $mod->Lang('update_tip') . '" onclick="return matches_selected(event,this);"')); if (!$this->committed) { $smarty->assign('reset', $mod->CreateInputSubmit($id, 'reset', $mod->Lang('reset'), 'title="' . $mod->Lang('reset_tip') . '"')); $jsloads[] = <<<EOS \$('#{$id}reset').modalconfirm({ overlayID: 'confirm', preShow: function(d){ \t var para = d.children('p:first')[0]; \t para.innerHTML = '{$mod->Lang('confirm_delete', $mod->Lang('match_data'))}'; }, onConfirm: function(){ \t set_tab(); \t \$('#{$id}real_action').val(this.name); \t return true; } }); EOS; } } $jsloads[] = <<<EOS \$('#{$id}notify,#{$id}abandon').modalconfirm({ overlayID: 'confirm', doCheck: function(){ \t return (match_count() > 0); }, preShow: function(d){ \t var para = d.children('p:first')[0]; \t para.innerHTML = '{$mod->Lang('allsaved')}'; }, onConfirm: function(){ \t set_tab(); \t \$('#{$id}real_action').val(this.name); \t return true; } }); EOS; $smarty->assign('notify', $mod->CreateInputSubmit($id, 'notify', $mod->Lang('notify'), 'title="' . $mod->Lang('notify_tip') . '"')); //modal confirm for this $smarty->assign('abandon', $mod->CreateInputSubmit($id, 'abandon', $mod->Lang('abandon'), 'title="' . $mod->Lang('abandon_tip') . '"')); //modal confirm for this if ($plan) { $bdata = array('bracket_id' => $data->bracket_id, 'name' => $data->name, 'description' => '', 'type' => $data->type, 'chartcss' => $data->chartcss, 'timezone' => $data->timezone, 'atformat' => $data->atformat, 'final' => $data->final, 'semi' => $data->semi, 'quarter' => $data->quarter, 'eighth' => $data->eighth, 'roundname' => $data->roundname, 'versus' => $data->versus, 'defeated' => $data->defeated, 'tied' => $data->tied, 'bye' => $data->bye, 'forfeit' => $data->forfeit, 'nomatch' => $data->nomatch, 'chartbuild' => TRUE); $lyt = new tmtLayout(); list($chartfile, $errkey) = $lyt->GetChart($mod, $bdata, $data->chartcss, 2); if ($chartfile) { //nobody else should see this chart $db = cmsms()->GetDb(); $sql = 'UPDATE ' . cms_db_prefix() . 'module_tmt_brackets SET chartbuild=1 WHERE bracket_id=?'; $db->Execute($sql, array($data->bracket_id)); $basename = basename($chartfile); list($height, $width) = $lyt->GetChartSize(); $smarty->assign('image', $mod->CreateImageObject($config['root_url'] . '/tmp/' . $basename, (int) $height + 30)); } else { $message = $mod->Lang('err_chart'); if ($errkey) { $message .= '<br /><br />' . $mod->Lang($errkey); } $smarty->assign('image', $message); } } $smarty->assign('malldone', 0); } elseif ($this->any) { $smarty->assign('malldone', 1); $smarty->assign('nomatches', $mod->Lang('info_nomatch2')); } else { $smarty->assign('malldone', 0); $smarty->assign('nomatches', $mod->Lang('info_nomatch')); if ($pmod && $tcount > 1) { $smarty->assign('schedule', $mod->CreateInputSubmit($id, 'schedule', $mod->Lang('schedule'), 'onclick="set_params(this);"')); } } $hidden .= $mod->CreateInputHidden($id, 'matchview', $data->matchview); $jsfuncs[] = <<<EOS function matches_view(btn) { set_tab(); \$('#{$id}real_action').val('match_view'); var newmode = (btn.name=='{$id}actual')?'actual':'plan'; \$('#{$id}matchview').val(newmode); } EOS; if ($plan) { $smarty->assign('plan', 1); $smarty->assign('idtitle', $mod->Lang('title_mid')); $smarty->assign('altmview', $mod->CreateInputSubmit($id, 'actual', $mod->Lang('actual'), 'title="' . $mod->Lang('actual_tip') . '" onclick="matches_view(this);"')); } else { $smarty->assign('plan', 0); $smarty->assign('altmview', $mod->CreateInputSubmit($id, 'plan', $mod->Lang('plan'), 'title="' . $mod->Lang('plan_tip') . '" onclick="matches_view(this);"')); } //these may be used on results tab as well or instead $smarty->assign('chart', $mod->CreateInputSubmit($id, 'chart', $mod->Lang('chart'), 'onclick="set_params(this);"')); $smarty->assign('list', $mod->CreateInputSubmit($id, 'list', $mod->Lang('list'), 'onclick="set_params(this);"')); //========= RESULTS ========== if (empty($data->resultview)) { $data->resultview = 'future'; } $future = $data->resultview == 'future'; if ($data->results) { if ($pmod) { $extras = $future ? array($mod->Lang('chooseone') => -1) : array($mod->Lang('notyet') => Tourney::NOTYET, $mod->Lang('possible') => Tourney::SOFT, $mod->Lang('confirmed') => Tourney::FIRM); } $relations = $mod->ResultTemplates($data->bracket_id, FALSE); $results = array(); $rowclass = 'row1'; //populate array excluding byes foreach ($data->results as $mid => $mdata) { if (!($mdata['teamA'] == '-1' || $mdata['teamB'] == '-1')) { $one = new stdClass(); $one->rowclass = $rowclass; $one->schedule = $mdata['playwhen']; if ($pmod) { $one->hidden = $mod->CreateInputHidden($id, 'res_matchid[]', $mid) . $mod->CreateInputHidden($id, 'res_teamA[]', $mdata['teamA']) . $mod->CreateInputHidden($id, 'res_teamB[]', $mdata['teamB']); $tmp = $mod->CreateInputText($id, 'res_playwhen[]', $one->schedule, 15, 30); $repls = array('class="res_playwhen $1"', ''); $one->actual = preg_replace($finds, $repls, $tmp); $one->teamA = $mod->TeamName($mdata['teamA']); $one->teamB = $mod->TeamName($mdata['teamB']); $choices = $extras + array(str_replace('%s', $one->teamA, $relations['won']) => Tourney::WONA, str_replace('%s', $one->teamB, $relations['won']) => Tourney::WONB, str_replace('%s', $one->teamA, $relations['forf']) => Tourney::FORFA, str_replace('%s', $one->teamB, $relations['forf']) => Tourney::FORFB); if ($data->cantie) { $choices[$data->tied] = Tourney::MTIED; } $choices[$data->nomatch] = Tourney::NOWIN; $sel = $future ? -1 : (int) $mdata['status']; $one->result = $mod->CreateInputDropdown($id, 'res_status[' . $mid . ']', $choices, '', $sel); $tmp = $mod->CreateInputText($id, 'res_score[]', $mdata['score'], 15, 30); $repls = array('class="res_score $1"', ''); $one->score = preg_replace($finds, $repls, $tmp); $one->selected = $mod->CreateInputCheckbox($id, 'rsel[]', $mid, -1); } else { $one->actual = substr($mdata['playwhen'], 0, -3); //without any seconds display $one->teamA = ''; $one->teamB = ''; $tA = $mod->TeamName($mdata['teamA']); $tB = $mod->TeamName($mdata['teamB']); switch (intval($mdata['status'])) { case Tourney::WONA: $one->result = str_replace('%s', $tA, $relations['won']); break; case Tourney::WONB: $one->result = str_replace('%s', $tB, $relations['won']); break; case Tourney::FORFA: $one->result = str_replace('%s', $tA, $relations['forf']); break; case Tourney::FORFB: $one->result = str_replace('%s', $tB, $relations['forf']); break; case Tourney::MTIED: $one->result = sprintf($relations['tied'], $tA, $tB); break; case Tourney::NOWIN: $one->result = $mod->Lang('name_abandoned'); break; default: $one->result = $mod->Lang('notyet'); break; } $one->score = $mdata['score']; } $results[] = $one; $rowclass == 'row1' ? $rowclass = 'row2' : ($rowclass = 'row1'); } } if ($results) { $smarty->assign('results', $results); if ($pmod) { //embedded vars here were defined for start/end-date calendars $jsloads[] = <<<EOS \$('.res_playwhen').each(function() { \$(this).Pikaday({ container: this.parentNode, format: 'YYYY-MM-DD HH:mm', i18n: { previousMonth: '{$prevm}', nextMonth: '{$nextm}', months: [{$mnames}], weekdays: [{$dnames}], weekdaysShort: [{$sdnames}] } }); }); EOS; } if (count($results) > 1) { $jsfuncs[] = <<<EOS function select_all_results(cb) { \$('#tmt_results > tbody').find('input[type="checkbox"]').attr('checked',cb.checked); } EOS; $smarty->assign('selresults', $mod->CreateInputCheckbox($id, 'r', FALSE, -1, 'id="resultsel" onclick="select_all_results(this);"')); } else { $smarty->assign('selresults', ''); } $smarty->assign('playedtitle', $mod->Lang('played')); $smarty->assign('resulttitle', $mod->Lang('title_result')); $smarty->assign('scoretitle', $mod->Lang('score')); $jsfuncs[] = <<<EOS function result_count() { var cb = \$('#tmt_results > tbody').find('input:checked'); return cb.length; } function results_selected(ev,btn) { if(result_count() > 0) { set_params(btn); return true; } else { eventCancel(ev); return false; } } EOS; $smarty->assign('update3', $mod->CreateInputSubmit($id, 'update[' . $id . 'results]', $mod->Lang('update'), 'title="' . $mod->Lang('update_tip') . '" onclick="return results_selected(event,this);"')); } else { $smarty->assign('ralldone', 0); $smarty->assign('noresults', $mod->Lang('info_noresult')); } } elseif ($this->any) { $smarty->assign('ralldone', 1); $key = $this->committed ? 'info_noresult2' : 'info_noresult'; $smarty->assign('noresults', $mod->Lang($key)); } else { $smarty->assign('ralldone', 0); $smarty->assign('noresults', $mod->Lang('info_noresult')); } $hidden .= $mod->CreateInputHidden($id, 'resultview', $data->resultview); $jsfuncs[] = <<<EOS function results_view(btn) { set_tab(); \$('#{$id}real_action').val('result_view'); var newmode = (btn.name=='{$id}future')?'future':'past'; \$('#{$id}resultview').val(newmode); } EOS; if ($future) { $smarty->assign('altrview', $mod->CreateInputSubmit($id, 'past', $mod->Lang('history'), 'title="' . $mod->Lang('history_tip') . '" onclick="results_view(this);"')); } else { $smarty->assign('altrview', $mod->CreateInputSubmit($id, 'future', $mod->Lang('future'), 'title="' . $mod->Lang('future_tip') . '" onclick="results_view(this);"')); } $smarty->assign('changes', $mod->CreateInputSubmit($id, 'changelog', $mod->Lang('changes'), 'title="' . $mod->Lang('changes_tip') . '" onclick="set_action(this);"')); $smarty->assign('getscore', $mod->CreateInputSubmit($id, 'getscore', $mod->Lang('getscore'), 'title="' . $mod->Lang('getscore_tip') . '" onclick="return results_selected(event,this);"')); //=============================== $smarty->assign('save', $mod->CreateInputSubmitDefault($id, 'submit', $mod->Lang('save'), 'onclick="set_action(this);"')); $smarty->assign('apply', $mod->CreateInputSubmit($id, 'apply', $mod->Lang('apply'), 'title = "' . $mod->Lang('apply_tip') . '" onclick="set_params(this);"')); //setup cancel-confirmation popup if (!empty($data->added)) { //allways check cancellation for new bracket $test = 'null'; } else { $url = $mod->CreateLink($id, 'check_data', NULL, NULL, array('bracket_id' => $data->bracket_id), NULL, TRUE); $offs = strpos($url, '?mact='); $ajaxdata = str_replace('amp;', '', substr($url, $offs + 1)); $test = <<<EOS function(){ \t var check = false; \t \$.ajax({ \t\turl: 'moduleinterface.php', \t\tasync: false, \t\ttype: 'POST', \t\tdata: '{$ajaxdata}', \t\tdataType: 'text', \t\tsuccess: function(data,status) { \t\t\tif(status=='success') check = (data=='1'); \t\t} \t }).fail(function() { \t\talert('{$mod->Lang('err_ajax')}'); \t }); \t return check; \t} EOS; } $smarty->assign('cancel', $mod->CreateInputSubmit($id, 'cancel', $mod->Lang('cancel'))); //for popup confirmation $smarty->assign('no', $mod->Lang('no')); $smarty->assign('yes', $mod->Lang('yes')); //onCheckFail: true means onConfirm() if no check needed $jsloads[] = <<<EOS \$('#{$id}cancel').modalconfirm({ overlayID: 'confirm', doCheck: {$test}, preShow: function(d){ \t var para = d.children('p:first')[0]; \t para.innerHTML = '{$mod->Lang('allabandon')}'; }, onCheckFail: true, onConfirm: function(){ \t \$('#{$id}real_action').val(this.name); \t return true; } }); EOS; //prevent immediate activation by textinput <Enter> press $jsloads[] = <<<EOS \$('form input[type=text]').keypress(function(e){ if (e.which == 13) { // \$('input[type=submit].default').focus(); return false; } }); EOS; $smarty->assign('hidden', $hidden); if ($jsloads) { $jsfuncs[] = ' $(document).ready(function() { '; $jsfuncs = array_merge($jsfuncs, $jsloads); $jsfuncs[] = '}); '; } $smarty->assign('jsfuncs', $jsfuncs); }
/** ScheduleMatches: @mod: reference to module object @bracket_id: the bracket identifier Setup dates/times for matches whose participants are known. The matches table is updated accordingly. Returns: FALSE upon error or nothing to process or no startdate or timezone for the bracket */ function ScheduleMatches(&$mod, $bracket_id) { $pref = cms_db_prefix(); $db = cmsms()->GetDb(); $sql = 'SELECT * FROM ' . $pref . 'module_tmt_brackets WHERE bracket_id=?'; $bdata = $db->GetRow($sql, array($bracket_id)); if ($bdata == FALSE) { return FALSE; } if (empty($bdata['startdate']) || empty($bdata['timezone'])) { return FALSE; } $cal = new tmtCalendar($mod); if (!$cal->ParseCondition($bdata['available'], $bdata['locale'])) { return FALSE; } $tz = new DateTimeZone($bdata['timezone']); $sdt = new DateTime($bdata['startdate'], $tz); $sstamp = $sdt->getTimestamp(); //when the tournament start{s|ed} //allow minimum leadtime before the next match $dt = new DateTime('+' . Tourney::LEADHOURS . ' hours', $tz); $stamp = $dt->getTimestamp(); if ($stamp < $sstamp) { $stamp = $sstamp; } $at = self::GetNextSlot($cal, $bdata, $stamp, FALSE); //find 1st slot if ($at == FALSE) { return FALSE; } //matches in DESC order so next foreach overwrites newer ones in $allteams array //CHECKME also get SOFT matches before now? $sql = 'SELECT match_id,teamA,teamB FROM ' . $pref . 'module_tmt_matches WHERE bracket_id=? AND flags=0 AND status<' . Tourney::ANON . ' AND playwhen IS NULL AND teamA IS NOT NULL AND teamB IS NOT NULL ORDER BY match_id DESC'; $mdata = $db->GetAssoc($sql, array($bracket_id)); if ($mdata == FALSE) { return FALSE; } $tz = new DateTimeZone($bdata['timezone']); $playorder = array(); $allteams = array(); $sql1 = 'SELECT MAX(playwhen) AS last FROM ' . $pref . 'module_tmt_matches WHERE (teamA=? OR teamA=?) AND flags=0'; $sql2 = 'SELECT MAX(playwhen) AS last FROM ' . $pref . 'module_tmt_matches WHERE (teamB=? OR teamB=?) AND flags=0'; foreach ($mdata as $mid => $mteams) { $t = $db->GetOne($sql1, array($mteams['teamA'], $mteams['teamB'])); $dt = $t != null ? new DateTime($t, $tz) : $sdt; $playorder[$mteams['teamA']] = $dt->getTimestamp(); $allteams[$mteams['teamA']] = $mid; $t = $db->GetOne($sql2, array($mteams['teamA'], $mteams['teamB'])); $dt = $t != null ? new DateTime($t, $tz) : $sdt; $playorder[$mteams['teamB']] = $dt->getTimestamp(); $allteams[$mteams['teamB']] = $mid; } asort($playorder, SORT_NUMERIC); //TODO for RR? $save = strftime('%F %R', $at); $diff = self::GapSeconds($bdata['playgaptype'], $bdata['playgap']); //initial threshold if ($stamp == $sstamp) { $threshold = $sstamp; } else { $threshold = $at - $diff; } $slotcount = $bdata['sametime']; //maybe null $sql = 'UPDATE ' . $pref . 'module_tmt_matches SET playwhen=?,status=? WHERE match_id=?'; foreach ($playorder as $tid => $last) { if ($last <= $threshold) { $mid = $allteams[$tid]; $pair = $mdata[$mid]; $oid = $tid == $pair['teamA'] ? (int) $pair['teamB'] : (int) $pair['teamA']; if ($oid != -1 && $playorder[$oid] <= $threshold) { $db->Execute($sql, array($save, Tourney::SOFT, $mid)); if (!empty($slotcount)) { if (--$slotcount == 0) { $at = self::GetNextSlot($cal, $bdata, $at, TRUE); if ($at == FALSE) { return FALSE; } $save = strftime('%F %R', $at); $threshold = $at - $diff; $slotcount = $bdata['sametime']; } } unset($playorder[$oid]); //no need to process that one again } } } return TRUE; }