2448addd00c861beeaeae1f376635c31717248e2
[moodle.git] / theme / mymobile / renderers.php
1 <?php
2  // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * renderers file for mymobile theme
19  *
20  * @package    theme
21  * @subpackage mymobile
22  * @copyright  John Stabinger
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
25 class theme_mymobile_core_renderer extends core_renderer {
26  
27  public function themeswatch() {
28     if (!empty($this->page->theme->settings->mswatch)) {
29     $showswatch = $this->page->theme->settings->mswatch;
30     } else {
31     $showswatch = 'light';
32     }
33     if ($showswatch == 'light') {
34     $dtheme = 'b';
35     }
36     else {
37     $dtheme = 'd';
38     }
39     return $dtheme;
40  }
41  
42  public function heading($text, $level = 2, $classes = 'main', $id = null) {
43     
44     if (!empty($this->page->theme->settings->mswatch)) {
45     $showswatch = $this->page->theme->settings->mswatch;
46     } else {
47     $showswatch = 'light';
48     }
49     if ($showswatch == 'light') {
50     $dtheme = 'b';
51     }
52     else {
53     $dtheme = 'd';
54     }
56     if ($classes == 'helpheading') { 
57     //keeps wrap from help headings in dialog 
58      $content = parent::heading($text, $level, $classes, $id);
59     } else {
60     $content  = html_writer::start_tag('div', array('class'=>'headingwrap ui-bar-'.$dtheme .' ui-footer'));
61     $classes .= ' ui-title';
62     $content .= parent::heading($text, $level, $classes, $id);
63     $content .= html_writer::end_tag('div');
64     }
65     return $content;
66 }
67  
68   public function box2($contents, $classes = 'generalbox2', $id = null) {
69     if (!empty($this->page->theme->settings->mswatch)) {
70     $showswatch = $this->page->theme->settings->mswatch;
71     } else {
72     $showswatch = 'light';
73     }
74     if ($showswatch == 'light') {
75     $dtheme = 'b';
76     }
77     else {
78     $dtheme = 'd';
79     }
80           $content  = html_writer::start_tag('ul', array('data-role'=>'listview', 'data-inset'=>'true', 'data-dividertheme'=>''.$dtheme .''));
81           $content .= $contents;
82           $content .= html_writer::end_tag('ul');
83         return $content;
84     }
86  
87         function block(block_contents $bc, $region) {
88         if (!empty($this->page->theme->settings->mswatch)) {
89         $showswatch = $this->page->theme->settings->mswatch;
90         } else {
91         $showswatch = '';
92         }
93         if ($showswatch == 'light') {
94         $dtheme = 'd';
95         }
96         else {
97         $dtheme = 'c';
98          }
100         $bc = clone($bc); // Avoid messing up the object passed in.
101         if (empty($bc->blockinstanceid) || !strip_tags($bc->title)) {
102             $bc->collapsible = block_contents::NOT_HIDEABLE;
103         }
104         if ($bc->collapsible == block_contents::HIDDEN) {
105         
106         }
107         if (!empty($bc->controls)) {
108           
109         }
110         
111         $skiptitle = strip_tags($bc->title);
112         if (empty($skiptitle)) {
113             $output = '';
114             $skipdest = '';
115         } else {
116             $output = html_writer::tag('a', get_string('skipa', 'access', $skiptitle), array('href' => '#sb-' . $bc->skipid, 'class' => 'skip-block'));
117             $skipdest = html_writer::tag('span', '', array('id' => 'sb-' . $bc->skipid, 'class' => 'skip-block-to'));
118         }
119         $testb = $bc->attributes['class'];
120         
121         if ($testb == "block_calendar_month2  block") {
122         $output  = html_writer::start_tag('span');
123         }
124         
125         else if ($testb == "block_course_overview  block") {
126         $output  = html_writer::start_tag('div');
127         }
128         
129         else {
130         $output  = html_writer::start_tag('div', array('data-role'=>'collapsible','data-collapsed'=>'true','data-content-theme'=>$dtheme));
131         }
132         
133         $colheader = $this->block_header($bc);
134         if ($colheader == "") {
135             $colheader = "&nbsp;";
136         }
137         
138         $output  .= html_writer::start_tag('h1');
139         $output .= $colheader;
140         $output .= html_writer::end_tag('h1');
141         $output .= html_writer::start_tag('div', $bc->attributes);
142         $output .= $this->block_content($bc);
144         $output .= html_writer::end_tag('div');
145         $output .= html_writer::end_tag('div');
147         $output .= $this->block_annotation($bc);
149         $output .= $skipdest;
151         return $output;
152     }
154  
155   
156     protected function block_header(block_contents $bc) {
158         $title = '';
159         if ($bc->title) {
160             $title = $bc->title;
161         }
163             $controlshtml = "";
164         $output = '';
165         if ($title || $controlshtml) {
166            $output .= html_writer::tag('div', html_writer::tag('div', html_writer::tag('div', '', array('class'=>'block_action')). $title . $controlshtml, array('class' => 'title')), array('class' => 'header'));
167            
168         }
169         return $output;
170     }
172   protected function init_block_hider_js(block_contents $bc) {
173         if (!empty($bc->attributes['id']) and $bc->collapsible != block_contents::NOT_HIDEABLE) {
174             $config = new stdClass;
175             $config->id = $bc->attributes['id'];
176             $config->title = strip_tags($bc->title);
177             $config->preference = 'block' . $bc->blockinstanceid . 'hidden';
178             $config->tooltipVisible = get_string('hideblocka', 'access', $config->title);
179             $config->tooltipHidden = get_string('showblocka', 'access', $config->title);
181         }
182     }
183  
184   public function navbar() {
185          $items = $this->page->navbar->get_items();
187         $count = 0;
189         $htmlblocks = array();
190         // Iterate the navarray and display each node
191         $itemcount = count($items);
192         $separator = "";
193        
194       for ($i=0;$i < $itemcount;$i++) {
195             $item = $items[$i];
196             $item->hideicon = true;
197             
198             if ($i===0) {
199         
200                 $testg = $item->action;
201                 $content = html_writer::tag('option', $this->render($item), array('value' => ''.$testg.''));
202                 
203             } else {
204                 //by john to check for action type and list div
205                 if (empty($item->action)) {
206                   $content = "";
207                 } else {
208                 $testg = $item->action;
209                 $content = html_writer::tag('option', $this->render($item), array('value' => ''.$testg.''));
210                 }
211             }
212             $htmlblocks[] = $content;
213         }
215     
216     if (!empty($this->page->theme->settings->mswatch)) {
217     $showswatch = $this->page->theme->settings->mswatch;
218     } else {
219     $showswatch = "";
220     }
221     if ($showswatch == "light") {
222     $dtheme = "b";
223     }
224     else {
225     $dtheme = "d";
226     }
228         $navbarcontent =  join('', $htmlblocks);
229         // XHTML
230         return $navbarcontent;
231     } 
232  
233  
234  protected function render_navigation_node(navigation_node $item) {
235         $content = $item->get_content();
236         $title = $item->get_title();
237         if ($item->icon instanceof renderable && !$item->hideicon) {
238             $icon = $this->render($item->icon);
239             $content = $icon.$content; // use CSS for spacing of icons
240         }
241         if ($item->helpbutton !== null) {
242             $content = trim($item->helpbutton).html_writer::tag('span', $content, array('class'=>'clearhelpbutton'));
243         }
244         if ($content === '') {
245             return '';
246         }
247         if ($item->action instanceof action_link) {
248             //TODO: to be replaced with something else
249             $link = $item->action;
250             if ($item->hidden) {
251                 $link->add_class('dimmed');
252             }
253             $content = $this->render($link);
254         } else if ($item->action instanceof moodle_url) {
255             $attributes = array();
256             if ($title !== '') {
257                 $attributes['title'] = $title;
258             }
259             if ($item->hidden) {
260                 $attributes['class'] = 'dimmed_text';
261             }
262             $content = html_writer::link($item->action, $content, $attributes);
264         } else if (is_string($item->action) || empty($item->action)) {
265             $attributes = array();
266             if ($title !== '') {
267                 $attributes['title'] = $title;
268             }
269             if ($item->hidden) {
270                 $attributes['class'] = 'dimmed_text';
271             }
272             $content = html_writer::tag('span', $content, $attributes);
273         }
274         return $content;
275     }
277  
278    public function login_info() {
279         global $USER, $CFG, $DB, $SESSION;
281         if (during_initial_install()) {
282             return '';
283         }
285         $course = $this->page->course;
287         if (session_is_loggedinas()) {
288             $realuser = session_get_realuser();
289             $fullname = fullname($realuser, true);
290            
291             $realuserinfo = " [<a href=\"$CFG->wwwroot/course/loginas.php?id=$course->id&amp;sesskey=".sesskey()."\">$fullname</a>] ";
292         } else {
293             $realuserinfo = '';
294         }
296         $loginurl = get_login_url();
298         if (empty($course->id)) {
299             // $course->id is not defined during installation
300             return '';
301         } else if (isloggedin()) {
302             $context = get_context_instance(CONTEXT_COURSE, $course->id);
304             $fullname = fullname($USER, true);
305             
306             // Since Moodle 2.0 this link always goes to the public profile page (not the course profile page)
307            $username = "";
308             if (is_mnet_remote_user($USER) and $idprovider = $DB->get_record('mnet_host', array('id'=>$USER->mnethostid))) {
309                 $username .= " from <a href=\"{$idprovider->wwwroot}\">{$idprovider->name}</a>";
310             }
311             if (isguestuser()) {
312                 $loggedinas = $realuserinfo.get_string('loggedinasguest').
313                           " (<a href=\"$loginurl\">".get_string('login').'</a>)';
314             } else if (is_role_switched($course->id)) { // Has switched roles
315                 $rolename = '';
316                 if ($role = $DB->get_record('role', array('id'=>$USER->access['rsw'][$context->path]))) {
317                     $rolename = ': '.format_string($role->name);
318                 }
319              
320                  
321             } else {
322                 $loggedinas = $realuserinfo.$username.' '.
323                           '<a id="mypower" data-inline="true" data-role="button" data-icon="mypower" data-ajax="false" class="ui-btn-right mypower" href="'.$CFG->wwwroot.'/login/logout.php?sesskey='.sesskey().'\">'.get_string('logout').'</a>';
324             }
325         } else {
326              $loggedinas = '<a data-role="button" data-icon="alert" class="ui-btn-right nolog" href="'.$loginurl.'" data-prefetch>'.get_string('login').'</a>';            
327         }
329         $loggedinas = $loggedinas;
331         if (isset($SESSION->justloggedin)) {
332             unset($SESSION->justloggedin);
333             if (!empty($CFG->displayloginfailures)) {
334                 if (!isguestuser()) {
335                     if ($count = count_login_failures($CFG->displayloginfailures, $USER->username, $USER->lastlogin)) {
336                         $loggedinas .= '&nbsp;<div class="loginfailures">';
337                         if (empty($count->accounts)) {
338                             $loggedinas .= get_string('failedloginattempts', '', $count);
339                         } else {
340                             $loggedinas .= get_string('failedloginattemptsall', '', $count);
341                         }
342                         if (has_capability('coursereport/log:view', get_context_instance(CONTEXT_SYSTEM))) {
343                             $loggedinas .= ' (<a href="'.$CFG->wwwroot.'/course/report/log/index.php'.
344                                                  '?chooselog=1&amp;id=1&amp;modid=site_errors">'.get_string('logs').'</a>)';
345                         }
346                         $loggedinas .= '</div>';
347                     }
348                 }
349             }
350         }
352         return $loggedinas;
353     }
355  
356  public function login_infoB() {
357         global $USER, $CFG, $DB, $SESSION;
359         if (during_initial_install()) {
360             return '';
361         }
363         $loginapge = ((string)$this->page->url === get_login_url());
364         $course = $this->page->course;
366         if (session_is_loggedinas()) {
367             $realuser = session_get_realuser();
368             $fullname = fullname($realuser, true);
369             $realuserinfo = ' [<a href="'.$CFG->wwwroot.'/course/loginas.php?id=$course->id&amp;sesskey='.sesskey().'">$fullname</a>] ';
370         } else {
371             $realuserinfo = '';
372         }
374         $loginurl = get_login_url();
376         if (empty($course->id)) {
377             // $course->id is not defined during installation
378             return '';
379         } else if (isloggedin()) {
380             $context = get_context_instance(CONTEXT_COURSE, $course->id);
382             $fullname = fullname($USER, true);
383             // Since Moodle 2.0 this link always goes to the public profile page (not the course profile page)
384             $username = '<a href="'.$CFG->wwwroot.'/user/profile.php?id='.$USER->id.'">'.$fullname.'</a>';
385             if (is_mnet_remote_user($USER) and $idprovider = $DB->get_record('mnet_host', array('id'=>$USER->mnethostid))) {
386                 $username .= " from <a href=\"{$idprovider->wwwroot}\">{$idprovider->name}</a>";
387             }
388             if (isguestuser()) {
389                 $loggedinas = $realuserinfo.get_string('loggedinasguest');
390                 if (!$loginapge) {
391                     $loggedinas .= " (<a href=\"$loginurl\">".get_string('login').'</a>)';
392                 }
393             } else if (is_role_switched($course->id)) { // Has switched roles
394                 $rolename = '';
395                 if ($role = $DB->get_record('role', array('id'=>$USER->access['rsw'][$context->path]))) {
396                     $rolename = ': '.format_string($role->name);
397                 }
398                 $loggedinas = get_string('loggedinas', 'moodle', $username).$rolename.
399                           " (<a href=\"$CFG->wwwroot/course/view.php?id=$course->id&amp;switchrole=0&amp;sesskey=".sesskey()."\">".get_string('switchrolereturn').'</a>)';
400             } else {
401                 $loggedinas = $realuserinfo.get_string('loggedinas', 'moodle', $username).' '.
402                           " (<a href=\"$CFG->wwwroot/login/logout.php?sesskey=".sesskey()."\" data-ajax=\"false\">".get_string('logout').'</a>)';
403             }
404         } else {
405             $loggedinas = get_string('loggedinnot', 'moodle');
406             if (!$loginapge) {
407                 $loggedinas .= " (<a href=\"$loginurl\">".get_string('login').'</a>)';
408             }
409         }
411         $loggedinas = '<div class="logininfo">'.$loggedinas.'</div>';
413         if (isset($SESSION->justloggedin)) {
414             unset($SESSION->justloggedin);
415             if (!empty($CFG->displayloginfailures)) {
416                 if (!isguestuser()) {
417                     if ($count = count_login_failures($CFG->displayloginfailures, $USER->username, $USER->lastlogin)) {
418                         $loggedinas .= '&nbsp;<div class="loginfailures">';
419                         if (empty($count->accounts)) {
420                             $loggedinas .= get_string('failedloginattempts', '', $count);
421                         } else {
422                             $loggedinas .= get_string('failedloginattemptsall', '', $count);
423                         }
424                         if (has_capability('coursereport/log:view', get_context_instance(CONTEXT_SYSTEM))) {
425                             $loggedinas .= ' (<a href="'.$CFG->wwwroot.'/course/report/log/index.php'.
426                                                  '?chooselog=1&amp;id=1&amp;modid=site_errors">'.get_string('logs').'</a>)';
427                         }
428                         $loggedinas .= '</div>';
429                     }
430                 }
431             }
432         }
434         return $loggedinas;
435     }
437  
438      public function redirect_message($encodedurl, $message, $delay, $debugdisableredirect) {
439         global $CFG;
440         $url = str_replace('&amp;', '&', $encodedurl);
441         //the below to fix redirect issues with ajax... John
442         $encodedurl = str_replace('#', '&', $encodedurl);
443         
444          $urlcheck = substr($encodedurl, 0, 4);
445          
446         
447         switch ($this->page->state) {
448             case moodle_page::STATE_BEFORE_HEADER :
449                 // No output yet it is safe to delivery the full arsenal of redirect methods
450                 if (!$debugdisableredirect) {
451                     // Don't use exactly the same time here, it can cause problems when both redirects fire at the same time.
452                     $this->metarefreshtag = '<meta http-equiv="refresh" content="'. $delay .'; url='. $encodedurl .'" />'."\n";
453                   
454                 }
455                 $output = $this->header();
456                 break;
457             case moodle_page::STATE_PRINTING_HEADER :
458                 // We should hopefully never get here
459                 throw new coding_exception('You cannot redirect while printing the page header');
460                 break;
461             case moodle_page::STATE_IN_BODY :
462                 // We really shouldn't be here but we can deal with this
463                 debugging("You should really redirect before you start page output");
464                 if (!$debugdisableredirect) {
465                     $this->page->requires->js_function_call('document.location.replace', array($url), false, $delay);
466                 }
467                 $output = $this->opencontainers->pop_all_but_last();
468                 break;
469             case moodle_page::STATE_DONE :
470                 // Too late to be calling redirect now
471                 throw new coding_exception('You cannot redirect after the entire page has been generated');
472                 break;
473         }
474         $output .= $this->notification($message, 'redirectmessage');
475          if ($urlcheck != "http") {
476          //if it is not a full http request, do local ajax load.
477                $output .= '<div class="continuebutton"><a data-ajax="false" data-role="button" href="'. $encodedurl .'">'. get_string('continue') .'</a></div>';
478                }
479                else {
480         $output .= '<div class="continuebutton"><a data-ajax="false" data-role="button" href="'. $encodedurl .'">'. get_string('continue') .'</a></div>';
481                 }
482         if ($debugdisableredirect) {
483             $output .= '<p><strong>Error output, so disabling automatic redirect.</strong></p>';
484         }
485         $output .= $this->footer();
486         return $output;
487     }
488   
492   protected function render_help_icon(help_icon $helpicon) {
493         global $CFG;
495         // first get the help image icon
496         $src = $this->pix_url('help');
498         $title = get_string($helpicon->identifier, $helpicon->component);
500         if (empty($helpicon->linktext)) {
501             $alt = $title;
502         } else {
503             $alt = get_string('helpwiththis');
504         }
506         $attributes = array('src'=>$src, 'alt'=>$alt, 'class'=>'iconhelp', 'data-role'=>'button', 'data-inline'=>'true');
507         $output = html_writer::empty_tag('img', $attributes);
509         // add the link text if given
510         if (!empty($helpicon->linktext)) {
511             // the spacing has to be done through CSS
512             $output .= $helpicon->linktext;
513         }
515         // now create the link around it
516         $url = new moodle_url('/help.php', array('component' => $helpicon->component, 'identifier' => $helpicon->identifier, 'lang'=>current_language(), 'theme'=>'mymobile'));
518         // note: this title is displayed only if JS is disabled, otherwise the link will have the new ajax tooltip
519         $title = get_string('helpprefix2', '', trim($title, ". \t"));
521         $attributes = array('href'=>$url, 'title'=>$title);
522         $id = html_writer::random_id('helpicon');
523         $attributes['id'] = $id;
524         $attributes['rel'] = 'notexternal';
525         $attributes['data-rel'] = 'dialog';
526         $attributes['data-transition'] = 'slideup';
527         $output = html_writer::tag('a', $output, $attributes);
529         // and finally span
530         return html_writer::tag('span', $output, array('class' => 'helplink2'));
531     }
532  
533  
535  
536        protected function render_single_button(single_button $button) {
537         $attributes = array('type'     => 'submit',
538                             'value'    => $button->label,
539                             'disabled' => $button->disabled ? 'disabled' : null,
540                             'title'    => $button->tooltip);
542         if ($button->actions) {
543             $id = html_writer::random_id('single_button');
544             $attributes['id'] = $id;
545             foreach ($button->actions as $action) {
546                 $this->add_action_handler($action, $id);
547             }
548         }
550         // first the input element
551         $output = html_writer::empty_tag('input', $attributes);
553         // then hidden fields
554         $params = $button->url->params();
555         if ($button->method === 'post') {
556             $params['sesskey'] = sesskey();
557         }
558         foreach ($params as $var => $val) {
559             $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => $var, 'value' => $val));
560         }
562         // then div wrapper for xhtml strictness
563         $output = html_writer::tag('div', $output, array('rel' => ''.$button->url->out_omit_querystring().''));
564         
565         // now the form itself around it
566         $url = $button->url->out_omit_querystring(); // url without params
567      
568        $urlcheck = substr($url, 0, 4);
569        if ($url === '') {
570             $url = '#'; // there has to be always some action
571         }
572        
573        //if the url has http, cool, if not we need to add it, JOHN 
574        if ($urlcheck != 'http') {
575        $url = $this->page->url->out_omit_querystring();
576                }
577        
578         
579         
580         $attributes = array('method' => $button->method,
581                             'action' => $url,
582                             'id'     => $button->formid);
583         $output = html_writer::tag('form', $output, $attributes);
585         // and finally one more wrapper with class
586         return html_writer::tag('div', $output, array('class' => $button->class));
587     }
588  
589  
590  
591   public function header() {
592         global $USER, $CFG;
594         if (session_is_loggedinas()) {
595             $this->page->add_body_class('userloggedinas');
596         }
597         
598         $this->page->set_state(moodle_page::STATE_PRINTING_HEADER);
600         // Find the appropriate page layout file, based on $this->page->pagelayout.
601         
602         $layoutfile = $this->page->theme->layout_file($this->page->pagelayout);
603         // Render the layout using the layout file.
604         $rendered = $this->render_page_layout($layoutfile);
606         // Slice the rendered output into header and footer.
607         $cutpos = strpos($rendered, self::MAIN_CONTENT_TOKEN);
608         if ($cutpos === false) {
609             //turned off error by john for ajax load of blocks without main content.
610            // throw new coding_exception('page layout file ' . $layoutfile .
611             //        ' does not contain the string "' . self::MAIN_CONTENT_TOKEN . '".');
612         }
613         $header = substr($rendered, 0, $cutpos);
614         $footer = substr($rendered, $cutpos + strlen(self::MAIN_CONTENT_TOKEN));
616         if (empty($this->contenttype)) {
617             debugging('The page layout file did not call $OUTPUT->doctype()');
618             $header = $this->doctype() . $header;
619         }
621         send_headers($this->contenttype, $this->page->cacheable);
623         $this->opencontainers->push('header/footer', $footer);
624         $this->page->set_state(moodle_page::STATE_IN_BODY);
626         return $header . $this->skip_link_target('maincontent');
627     }
629   public function notification($message, $classes = 'notifyproblem') {
630         return html_writer::tag('div', clean_text($message), array('data-role'=>'none', 'data-icon'=>'alert', 'data-theme'=>'d', 'class' => renderer_base::prepare_classes($classes)));
631     }
632  
633  public function blocks_for_region($region) {
634         $blockcontents = $this->page->blocks->get_content_for_region($region, $this);
635         $output = '';
636         foreach ($blockcontents as $bc) {
637             if ($bc instanceof block_contents) {
638                 if (!($bc->attributes['class'] == 'block_settings  block')
639                         && !($bc->attributes['class'] == 'block_navigation  block')) {
640                     $output .= $this->block($bc, $region);
641                 }
642             } else if ($bc instanceof block_move_target) {
643                 $output .= $this->block_move_target($bc);
644             } else {
645                 throw new coding_exception('Unexpected type of thing (' . get_class($bc) . ') found in list of block contents.');
646             }
647         }
648         //by john for no blocks
649         if ($output =="") {
650         //$output = "<h2>No blocks found.</h2>";
651         }
652         
653         return $output;
654     }
657   
658  protected function render_single_select(single_select $select) {
659         $select = clone($select);
660         if (empty($select->formid)) {
661             $select->formid = html_writer::random_id('single_select_f');
662         }
664         $output = '';
665         $params = $select->url->params();
666         if ($select->method === 'post') {
667             $params['sesskey'] = sesskey();
668         }
669         foreach ($params as $name=>$value) {
670             $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>$name, 'value'=>$value));
671         }
673         if (empty($select->attributes['id'])) {
674             $select->attributes['id'] = html_writer::random_id('single_select');
675              //$select->attributes['data-native-menu'] = 'false';
676              //above by john for select elements to use native style and help performance?
677         }
679         if ($select->disabled) {
680             $select->attributes['disabled'] = 'disabled';
681         }
683         if ($select->tooltip) {
684             $select->attributes['title'] = $select->tooltip;
685         }
687         if ($select->label) {
688             $output .= html_writer::label($select->label, $select->attributes['id']);
689         }
691         if ($select->helpicon instanceof help_icon) {
692             $output .= $this->render($select->helpicon);
693         } else if ($select->helpicon instanceof old_help_icon) {
694             $output .= $this->render($select->helpicon);
695         }
697         $output .= html_writer::select($select->options, $select->name, $select->selected, $select->nothing, $select->attributes);
698         
699         //by john show go button to fix selects
700         $go = '';
701         $output .= html_writer::empty_tag('input data-inline="true"', array('type'=>'submit', 'value'=>get_string('go')));
702         $output .= html_writer::tag('noscript', html_writer::tag('div', $go), array('style'=>'inline'));
704         $nothing = empty($select->nothing) ? false : key($select->nothing);
705         $this->page->requires->js_init_call('M.util.init_select_autosubmit', array($select->formid, $select->attributes['id'], $nothing));
707         // then div wrapper for xhtml strictness
708         $output = html_writer::tag('div', $output);
710         // now the form itself around it
711         $formattributes = array('method' => $select->method,
712                                 'action' => $select->url->out_omit_querystring(),
713                                 'id'     => $select->formid);
714         $output = html_writer::tag('form', $output, $formattributes);
716         // and finally one more wrapper with class
717         return html_writer::tag('div', $output, array('class' => $select->class));
718     }
724 class theme_mymobile_mod_choice_renderer extends plugin_renderer_base {
726     /**
727      * Returns HTML to display choices of option
728      * @param object $options
729      * @param int  $coursemoduleid
730      * @param bool $vertical
731      * @return string
732      */
733     public function display_options($options, $coursemoduleid, $vertical = false) {
734         $layoutclass = 'horizontal';
735         if ($vertical) {
736             $layoutclass = 'vertical';
737         }
738         $target = new moodle_url('/mod/choice/view.php');
739         //changed below to post from target john
740         $attributes = array('method'=>'POST', 'action'=>$target, 'class'=> $layoutclass);
742         $html = html_writer::start_tag('form', $attributes);
743         $html .= html_writer::start_tag('ul', array('class'=>'choices', 'data-role'=>'controlgroup' ));
744         
745         $availableoption = count($options['options']);
746         foreach ($options['options'] as $option) {
747            $html .= html_writer::start_tag('li', array('class'=>'option'));
748             $rande = rand();
749             $option->attributes->name = 'answer';
750             $option->attributes->type = 'radio';
751             $option->attributes->id = "answer$rande";
753             $labeltext = $option->text;
754             if (!empty($option->attributes->disabled)) {
755                 $labeltext .= ' ' . get_string('full', 'choice');
756                 $availableoption--;
757             }
759             $html .= html_writer::empty_tag('input', (array)$option->attributes);
760             $html .= html_writer::tag('label', $labeltext, array('for'=>$option->attributes->id));
761             $html .= html_writer::end_tag('li');
762         }
763         $html .= html_writer::tag('li','', array('class'=>'clearfloat'));
764         $html .= html_writer::end_tag('ul');
765         $html .= html_writer::tag('div', '', array('class'=>'clearfloat'));
766         $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'sesskey', 'value'=>sesskey()));
767         $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'id', 'value'=>$coursemoduleid));
769         if (!empty($options['hascapability']) && ($options['hascapability'])) {
770             if ($availableoption < 1) {
771                $html .= html_writer::tag('label', get_string('choicefull', 'choice'));
772             } else {
773                 $html .= html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('savemychoice','choice'), 'class'=>'button'));
774             }
776             if (!empty($options['allowupdate']) && ($options['allowupdate'])) {
777                 $url = new moodle_url('view.php', array('id'=>$coursemoduleid, 'action'=>'delchoice', 'sesskey'=>sesskey()));
778                 $html .= html_writer::link($url, get_string('removemychoice','choice'));
779             }
780         } else {
781             $html .= html_writer::tag('label', get_string('havetologin', 'choice'));
782         }
784         $html .= html_writer::end_tag('ul');
785         $html .= html_writer::end_tag('form');
787         return $html;
788     }
790     /**
791      * Returns HTML to display choices result
792      * @param object $choices
793      * @param bool $forcepublish
794      * @return string
795      */
796     public function display_result($choices, $forcepublish = false) {
797         if (empty($forcepublish)) { //allow the publish setting to be overridden
798             $forcepublish = $choices->publish;
799         }
801         $displaylayout = $choices->display;
803         if ($forcepublish) {  //CHOICE_PUBLISH_NAMES
804             return $this->display_publish_name_vertical($choices);
805         } else { //CHOICE_PUBLISH_ANONYMOUS';
806             if ($displaylayout == DISPLAY_HORIZONTAL_LAYOUT) {
807                 return $this->display_publish_anonymous_horizontal($choices);
808             }
809             return $this->display_publish_anonymous_vertical($choices);
810         }
811     }
813     /**
814      * Returns HTML to display choices result
815      * @param object $choices
816      * @param bool $forcepublish
817      * @return string
818      */
819     public function display_publish_name_vertical($choices) {
820         $html ='';
821         $html .= html_writer::tag('h2',format_string(get_string("responses", "choice")), array('class'=>'main'));
823         $attributes = array('method'=>'POST');
824         $attributes['action'] = new moodle_url('/mod/choice/view.php');
825         $attributes['id'] = 'attemptsform';
827         if ($choices->viewresponsecapability) {
828             $html .= html_writer::start_tag('form', $attributes);
829             $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'id', 'value'=> $choices->coursemoduleid));
830             $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'sesskey', 'value'=> sesskey()));
831             $html .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'mode', 'value'=>'overview'));
832         }
834         $table = new html_table();
835         $table->cellpadding = 0;
836         $table->cellspacing = 0;
837         $table->attributes['class'] = 'results names ';
838         $table->tablealign = 'center';
839         $table->data = array();
841         $count = 0;
842         ksort($choices->options);
844         $columns = array();
845         foreach ($choices->options as $optionid => $options) {
846             $coldata = '';
847             if ($choices->showunanswered && $optionid == 0) {
848                 $coldata .= html_writer::tag('div', format_string(get_string('notanswered', 'choice')), array('class'=>'option'));
849             } else if ($optionid > 0) {
850                 $coldata .= html_writer::tag('div', format_string($choices->options[$optionid]->text), array('class'=>'option'));
851             }
852             $numberofuser = 0;
853             if (!empty($options->user) && count($options->user) > 0) {
854                 $numberofuser = count($options->user);
855             }
857             $coldata .= html_writer::tag('div', ' ('.$numberofuser. ')', array('class'=>'numberofuser', 'title' => get_string('numberofuser', 'choice')));
858             $columns[] = $coldata;
859         }
861         $table->head = $columns;
863         $coldata = '';
864         $columns = array();
865         foreach ($choices->options as $optionid => $options) {
866             $coldata = '';
867             if ($choices->showunanswered || $optionid > 0) {
868                 if (!empty($options->user)) {
869                     foreach ($options->user as $user) {
870                         $data = '';
871                         if (empty($user->imagealt)){
872                             $user->imagealt = '';
873                         }
875                         if ($choices->viewresponsecapability && $choices->deleterepsonsecapability  && $optionid > 0) {
876                             $attemptaction = html_writer::checkbox('attemptid[]', $user->id,'');
877                             $data .= html_writer::tag('div', $attemptaction, array('class'=>'attemptaction'));
878                         }
879                         $userimage = $this->output->user_picture($user, array('courseid'=>$choices->courseid));
880                         $data .= html_writer::tag('div', $userimage, array('class'=>'image'));
882                         $userlink = new moodle_url('/user/view.php', array('id'=>$user->id,'course'=>$choices->courseid));
883                         $name = html_writer::tag('a', fullname($user, $choices->fullnamecapability), array('href'=>$userlink, 'class'=>'username'));
884                         $data .= html_writer::tag('div', $name, array('class'=>'fullname'));
885                         $data .= html_writer::tag('div','', array('class'=>'clearfloat'));
886                         $coldata .= html_writer::tag('div', $data, array('class'=>'user'));
887                     }
888                 }
889             }
891             $columns[] = $coldata;
892             $count++;
893         }
895         $table->data[] = $columns;
896         foreach ($columns as $d) {
897             $table->colclasses[] = 'data';
898         }
899         $html .= html_writer::tag('div', html_writer::table($table), array('class'=>'response'));
901         $actiondata = '';
902         if ($choices->viewresponsecapability && $choices->deleterepsonsecapability) {
903             $selecturl = new moodle_url('#');
905             $selectallactions = new component_action('click',"select_all_in", array('div',null,'tablecontainer'));
906             $selectall = new action_link($selecturl, get_string('selectall'), $selectallactions);
907             $actiondata .= $this->output->render($selectall) . ' / ';
909             $deselectallactions = new component_action('click',"deselect_all_in", array('div',null,'tablecontainer'));
910             $deselectall = new action_link($selecturl, get_string('deselectall'), $deselectallactions);
911             $actiondata .= $this->output->render($deselectall);
912             //below john fixed
913             $actiondata .= html_writer::tag('label', ' ' . get_string('withselected', 'choice') . ' ', array('for'=>'menuaction'));
915             $actionurl = new moodle_url('/mod/choice/view.php', array('sesskey'=>sesskey(), 'action'=>'delete_confirmation()'));
916             $select = new single_select($actionurl, 'action', array('delete'=>get_string('delete')), null, array(''=>get_string('moveselectedusersto', 'choice')), 'attemptsform');
918             $actiondata .= $this->output->render($select);
919         }
920         $html .= html_writer::tag('div', $actiondata, array('class'=>'responseaction'));
922         if ($choices->viewresponsecapability) {
923             $html .= html_writer::end_tag('form');
924         }
926         return $html;
927     }
930     /**
931      * Returns HTML to display choices result
932      * @param object $choices
933      * @return string
934      */
935     public function display_publish_anonymous_vertical($choices) {
936         global $CHOICE_COLUMN_HEIGHT;
938         $html = '';
939         $table = new html_table();
940         $table->cellpadding = 5;
941         $table->cellspacing = 0;
942         $table->attributes['class'] = 'results anonymous ';
943         $table->data = array();
944         $count = 0;
945         ksort($choices->options);
946         $columns = array();
947         $rows = array();
949         foreach ($choices->options as $optionid => $options) {
950             $numberofuser = 0;
951             if (!empty($options->user)) {
952                $numberofuser = count($options->user);
953             }
954             $height = 0;
955             $percentageamount = 0;
956             if($choices->numberofuser > 0) {
957                $height = ($CHOICE_COLUMN_HEIGHT * ((float)$numberofuser / (float)$choices->numberofuser));
958                $percentageamount = ((float)$numberofuser/(float)$choices->numberofuser)*100.0;
959             }
961             $displaydiagram = html_writer::tag('img','', array('style'=>'height:'.$height.'px;width:49px;', 'alt'=>'', 'src'=>$this->output->pix_url('column', 'choice')));
963             $cell = new html_table_cell();
964             $cell->text = $displaydiagram;
965             $cell->attributes = array('class'=>'graph vertical data');
966             $columns[] = $cell;
967         }
968         $rowgraph = new html_table_row();
969         $rowgraph->cells = $columns;
970         $rows[] = $rowgraph;
972         $columns = array();
973         $printskiplink = true;
974         foreach ($choices->options as $optionid => $options) {
975             $columndata = '';
976             $numberofuser = 0;
977             if (!empty($options->user)) {
978                $numberofuser = count($options->user);
979             }
981             if ($printskiplink) {
982                 $columndata .= html_writer::tag('div', '', array('class'=>'skip-block-to', 'id'=>'skipresultgraph'));
983                 $printskiplink = false;
984             }
986             if ($choices->showunanswered && $optionid == 0) {
987                 $columndata .= html_writer::tag('div', format_string(get_string('notanswered', 'choice')), array('class'=>'option'));
988             } else if ($optionid > 0) {
989                 $columndata .= html_writer::tag('div', format_string($choices->options[$optionid]->text), array('class'=>'option'));
990             }
991             $columndata .= html_writer::tag('div', ' ('.$numberofuser.')', array('class'=>'numberofuser', 'title'=> get_string('numberofuser', 'choice')));
993             if($choices->numberofuser > 0) {
994                $percentageamount = ((float)$numberofuser/(float)$choices->numberofuser)*100.0;
995             }
996             $columndata .= html_writer::tag('div', format_float($percentageamount,1). '%', array('class'=>'percentage'));
998             $cell = new html_table_cell();
999             $cell->text = $columndata;
1000             $cell->attributes = array('class'=>'data header');
1001             $columns[] = $cell;
1002         }
1003         $rowdata = new html_table_row();
1004         $rowdata->cells = $columns;
1005         $rows[] = $rowdata;
1007         $table->data = $rows;
1009         $header = html_writer::tag('h2',format_string(get_string("responses", "choice")));
1010         $html .= html_writer::tag('div', $header, array('class'=>'responseheader'));
1011         $html .= html_writer::tag('a', get_string('skipresultgraph', 'choice'), array('href'=>'#skipresultgraph', 'class'=>'skip-block'));
1012         $html .= html_writer::tag('div', html_writer::table($table), array('class'=>'response'));
1014         return $html;
1015     }
1017     /**
1018      * Returns HTML to display choices result
1019      * @param object $choices
1020      * @return string
1021      */
1022     public function display_publish_anonymous_horizontal($choices) {
1023         global $CHOICE_COLUMN_WIDTH;
1025         $table = new html_table();
1026         $table->cellpadding = 5;
1027         $table->cellspacing = 0;
1028         $table->attributes['class'] = 'results anonymous ';
1029         $table->data = array();
1031         $count = 0;
1032         ksort($choices->options);
1034         $rows = array();
1035         foreach ($choices->options as $optionid => $options) {
1036             $numberofuser = 0;
1037             $graphcell = new html_table_cell();
1038             if (!empty($options->user)) {
1039                $numberofuser = count($options->user);
1040             }
1042             $width = 0;
1043             $percentageamount = 0;
1044             $columndata = '';
1045             if($choices->numberofuser > 0) {
1046                $width = ($CHOICE_COLUMN_WIDTH * ((float)$numberofuser / (float)$choices->numberofuser));
1047                $percentageamount = ((float)$numberofuser/(float)$choices->numberofuser)*100.0;
1048             }
1049             $displaydiagram = html_writer::tag('img','', array('style'=>'height:50px; width:'.$width.'px', 'alt'=>'', 'src'=>$this->output->pix_url('row', 'choice')));
1051             $skiplink = html_writer::tag('a', get_string('skipresultgraph', 'choice'), array('href'=>'#skipresultgraph'. $optionid, 'class'=>'skip-block'));
1052             $skiphandler = html_writer::tag('span', '', array('class'=>'skip-block-to', 'id'=>'skipresultgraph'.$optionid));
1054             $graphcell->text = $skiplink . $displaydiagram . $skiphandler;
1055             $graphcell->attributes = array('class'=>'graph horizontal');
1057             $datacell = new html_table_cell();
1058             if ($choices->showunanswered && $optionid == 0) {
1059                 $columndata .= html_writer::tag('div', format_string(get_string('notanswered', 'choice')), array('class'=>'option'));
1060             } else if ($optionid > 0) {
1061                 $columndata .= html_writer::tag('div', format_string($choices->options[$optionid]->text), array('class'=>'option'));
1062             }
1063             $columndata .= html_writer::tag('div', ' ('.$numberofuser.')', array('title'=> get_string('numberofuser', 'choice'), 'class'=>'numberofuser'));
1065             if($choices->numberofuser > 0) {
1066                $percentageamount = ((float)$numberofuser/(float)$choices->numberofuser)*100.0;
1067             }
1068             $columndata .= html_writer::tag('div', format_float($percentageamount,1). '%', array('class'=>'percentage'));
1070             $datacell->text = $columndata;
1071             $datacell->attributes = array('class'=>'header');
1073             $row = new html_table_row();
1074             $row->cells = array($datacell, $graphcell);
1075             $rows[] = $row;
1076         }
1078         $table->data = $rows;
1080         $html = '';
1081         $header = html_writer::tag('h2',format_string(get_string("responses", "choice")));
1082         $html .= html_writer::tag('div', $header, array('class'=>'responseheader'));
1083         $html .= html_writer::table($table);
1085         return $html;
1086     }