function render()
 {
     if (!$this->name) {
         throw new \Exception('must set a name');
     }
     if (!$this->xhr_url) {
         throw new \Exception('must set xhr url');
     }
     if (!$this->js_format_result || !$this->result_fields) {
         throw new \Exception('need js code');
     }
     $header = XhtmlHeader::getInstance();
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/fonts/fonts-min.css');
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/autocomplete/assets/skins/sam/autocomplete.css');
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/button/assets/skins/sam/button.css');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/get/get-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/animation/animation-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/datasource/datasource-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/autocomplete/autocomplete-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/element/element-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/button/button-min.js');
     $div_holder = 'yui_ac' . mt_rand();
     $container_holder = 'ac_contain_' . mt_rand();
     $button_id = 'ac_toggle_' . mt_rand();
     $input_id = 'ac_input_' . mt_rand();
     $header->embedJs('function highlight(s,h)' . '{' . 'var regex = new RegExp("("+h+")","ig");' . 'return s.replace(regex, "<span class=\\"highlighted\\">$1</span>");' . '}');
     $header->embedCss('label {' . 'color:#E76300;' . 'font-weight:bold;' . '}' . '#' . $div_holder . ' {' . 'width:20em;' . '}' . '.yui-ac .result {position:relative;height:20px;}' . '.yui-ac .name {position:absolute;bottom:0;}' . '.highlighted {color:#CA485E;font-weight:bold; }' . '.yui-ac .yui-button {vertical-align:middle;}' . '.yui-ac .yui-button button {background: url(http://developer.yahoo.com/yui/examples/autocomplete/assets/img/ac-arrow-rt.png) center center no-repeat}' . '.yui-ac .open .yui-button button {background: url(http://developer.yahoo.com/yui/examples/autocomplete/assets/img/ac-arrow-dn.png) center center no-repeat}' . '.yui-skin-sam .yui-ac-input {position:static; vertical-align:middle;}' . '.yui-skin-sam .yui-ac-content {' . 'max-height:250px;overflow:auto;overflow-x:hidden;' . '}');
     $res = 'YAHOO.example.CustomFormatting = (function(){' . 'var oDS = new YAHOO.util.ScriptNodeDataSource("' . $this->xhr_url . '");' . 'oDS.responseSchema = {' . 'resultsList:"records",' . 'fields:' . Json::encode($this->result_fields, false) . '};' . 'var oAC = new YAHOO.widget.AutoComplete("' . $input_id . '","' . $container_holder . '", oDS);' . 'oAC.minQueryLength = 0;' . 'oAC.queryDelay = ' . $this->query_delay . ';' . 'oAC.animSpeed = 0.01;' . 'oAC.maxResultsDisplayed = 100;' . 'oAC.forceSelection = true;' . 'oAC.generateRequest = function(sQuery) {' . 'return sQuery + "&format=json";' . '};' . 'oAC.resultTypeList = false;' . 'oAC.formatResult = function(oResultData, sQuery, sResultMatch) {' . $this->js_format_result . '};' . 'oAC.itemSelectEvent.subscribe(function(sType, aArgs) {' . 'var oData = aArgs[2];' . 'var input = document.createElement("input");' . 'input.setAttribute("type", "hidden");' . 'input.setAttribute("name", "' . $this->name . '");' . 'input.setAttribute("value", oData.id);' . 'document.getElementById("' . $div_holder . '").appendChild(input);' . '});' . 'var validateForm = function() {' . 'return true;' . '};' . 'return {' . 'oDS: oDS,' . 'oAC: oAC,' . 'validateForm: validateForm' . '}' . '})();';
     $in = new XhtmlComponentInput();
     $in->name = $input_id;
     $in->width = 200;
     // XXXX HACK, should not set width at all.. but we do it now so button dont end up on the next line
     return '<div id="' . $div_holder . '">' . $in->render() . '<div id="' . $container_holder . '"></div>' . '</div>' . js_embed($res);
 }
Example #2
0
 public static function render()
 {
     if (!HttpUserAgent::isIOS()) {
         return;
     }
     $header = XhtmlHeader::getInstance();
     $header->embedJs('var addToHomeConfig=' . '{' . 'touchIcon:true,' . 'lifespan:10000,' . 'message:"Lägg till denna app på din %device: tryck på %icon och sedan <strong>Lägg till på hemskärmen</strong>."' . '};');
     $header->includeCss('core_dev/js/ext/ios-add2home/assets/add2home.css');
     $header->includeJsLast('core_dev/js/ext/ios-add2home/add2home.js');
 }
Example #3
0
 function render()
 {
     $header = XhtmlHeader::getInstance();
     $page = XmlDocumentHandler::getInstance();
     $header->includeJs('http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js');
     $header->includeJs($page->getRelativeCoreDevUrl() . 'js/ext/gallery-lightbox/gallery-lightbox-min.js');
     $header->includeCss($page->getRelativeCoreDevUrl() . 'js/ext/gallery-lightbox/assets/skins/sam/gallery-lightbox-skin.css');
     $js = 'YUI().use("gallery-lightbox", "node-deprecated", ' . 'function (Y)' . '{' . 'Y.Lightbox.init();' . '}' . ');';
     return js_embed($js);
 }
 public static function init($room_id, $div_name, $form_id)
 {
     $header = XhtmlHeader::getInstance();
     $header->includeJs('http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js');
     $session = SessionHandler::getInstance();
     $interval = 1000 * parse_duration('1s');
     // milliseconds
     $locale = 'sv-SE';
     $header->registerJsFunction('function scroll_to_bottom(div)' . '{' . 'var elm = get_el(div);' . 'try {' . 'elm.scrollTop = elm.scrollHeight;' . '} catch(e) {' . 'var f = document.createElement("input");' . 'if (f.setAttribute) f.setAttribute("type","text");' . 'if (elm.appendChild) elm.appendChild(f);' . 'f.style.width = "0px";' . 'f.style.height = "0px";' . 'if (f.focus) f.focus();' . 'if (elm.removeChild) elm.removeChild(f);' . '}' . '}');
     $header->embedJs('YUI({lang:"' . $locale . '"}).use("io-form","node","json-parse","datatype-date", function(Y)' . '{' . 'Y.on("load", function() {' . 'Init();' . '});' . 'function Init(ts)' . '{' . 'var latest;' . 'if (typeof ts === "undefined") {' . 'var uri = "/u/chatroom/update/" + ' . $room_id . ';' . '} else {' . 'var uri = "/u/chatroom/update/" + ' . $room_id . ' + "?ts=" + ts;' . '}' . 'function complete(id, o)' . '{' . 'var data = o.responseText;' . 'var node = Y.one("#' . $div_name . '");' . 'try {' . 'var data = Y.JSON.parse(data);' . '} catch (e) {' . 'console.log("invalid data from " + uri);' . 'return;' . '}' . 'if (typeof ts === "undefined")' . 'node.setContent("");' . 'for (var i = data.length-1; i >= 0; --i) {' . 'var p = data[i];' . 'if ((typeof ts === "undefined") || p.from != ' . $session->id . ')' . 'msg_render(p,node);' . '}' . 'if (data.length)' . 'scroll_to_bottom("' . $div_name . '");' . 'latest = data[0] ? data[0].ts : ts;' . 'setTimeout(Init,' . $interval . ',latest);' . '};' . 'Y.once("io:complete",complete,Y);' . 'var request = Y.io(uri);' . '}' . 'Y.one("#' . $form_id . '").on("submit", function(e)' . '{' . 'e.preventDefault();' . 'e.stopPropagation();' . 'frm = get_el( this.get("id") );' . 'if (!frm.msg.value)' . 'return false;' . 'var uri = "/u/chatroom/send/" + ' . $room_id . ' + "?m=" + frm.msg.value;' . 'var request = Y.io(uri);' . 'var node = Y.one("#' . $div_name . '");' . 'var p = {' . '"name":"' . $session->username . '",' . '"from":' . $session->id . ',' . '"msg":frm.msg.value,' . '"ts":new Date().getTime()/1000' . '};' . 'msg_render(p,node);' . 'scroll_to_bottom("' . $div_name . '");' . 'frm.msg.value = "";' . 'return false;' . '});' . 'function msg_render(p,node)' . '{' . 'var d = new Date(p.ts*1000);' . 'var today = new Date( new Date().getFullYear(), new Date().getMonth(), new Date().getDate(),0,0,0);' . 'node.append("[");' . 'if (d >= today) {' . 'node.append( Y.DataType.Date.format(d, {format:"%H:%M"}) );' . '} else {' . 'node.append( Y.DataType.Date.format(d, {format:"%a %d %b %H:%M"}) );' . '}' . 'node.append("]&nbsp;");' . 'var who = Y.Node.create("<span class=\\"yui3-hastooltip\\" id=\\"tt_usr_"+p.from+"\\">"+p.name+"</span>");' . 'who.addClass("yui3-hastooltip");' . 'node.append(who);' . 'node.append(": "+p.msg+"<br/>");' . '}' . '});');
 }
Example #5
0
 /**
  * @param $id album id
  */
 public static function albumUploader($id)
 {
     $header = XhtmlHeader::getInstance();
     $page = XmlDocumentHandler::getInstance();
     $header->includeJs($page->getRelativeCoreDevUrl() . 'js/ext/html5uploader.js');
     $header->embedJsOnload("new uploader('drop', 'status', '/u/upload/album/" . $id . "', 'list');");
     $header->embedCss('#box{' . 'width:300px;' . 'border:2px solid #454545;' . 'border-radius:6px;' . '}' . '#drop{' . 'width:100%;' . 'height:200px;' . 'background-color:#E5E5E5;' . '}' . '#status{' . 'font-size:10px;' . 'color:#fff;' . 'padding:5px;' . 'background:#7F7F7F;' . 'filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#7F7F7F", endColorstr="#242424");' . 'background: -webkit-gradient(linear, left top, left bottom, from(#7F7F7F), to(#242424));' . 'background: -moz-linear-gradient(top, #7F7F7F, #242424);' . 'background: -o-linear-gradient(top, #7F7F7F, #242424);' . '}' . '#list{' . 'width:100%;' . 'font-size:10px;' . 'float:left;' . 'margin-left:10px;' . '}' . '.addedIMG{' . 'height:100px;' . '}');
     $txt = 'Drag the images from a folder to the area below ...';
     $res = '<div id="box">' . '<div id="status">' . $txt . '</div>' . '<div id="drop"></div>' . '</div>' . '<div id="list"></div>';
     return $res;
 }
 function render()
 {
     if (!$this->data_source) {
         throw new \Exception('need data source');
     }
     $header = XhtmlHeader::getInstance();
     $header->includeCss('http://yui.yahooapis.com/3.3.0/build/cssfonts/fonts-min.css');
     $header->includeJs('http://yui.yahooapis.com/3.3.0/build/yui/yui-min.js');
     $res = 'YUI().use("autocomplete", "autocomplete-filters", "autocomplete-highlighters", function (Y)' . '{' . 'var inputNode = Y.one("#ac-input"),' . 'tags = ' . Json::encode($this->data_source, false) . ';' . 'inputNode.plug(Y.Plugin.AutoComplete, {' . 'allowTrailingDelimiter: true,' . 'minQueryLength: 0,' . 'queryDelay: 0,' . 'queryDelimiter: ",",' . 'source: tags,' . 'resultHighlighter: "startsWith",' . 'resultFilters: ["startsWith", function (query, results) {' . 'var selected = inputNode.ac.get("value").split(/\\s*,\\s*/);' . 'selected.pop();' . 'selected = Y.Array.hash(selected);' . 'return Y.Array.filter(results, function (result) {' . 'return !selected.hasOwnProperty(result.text);' . '});' . '}]' . '});' . 'inputNode.on("focus", function () {' . 'inputNode.ac.sendRequest("");' . '});' . 'inputNode.ac.after("select", function () {' . 'inputNode.ac.sendRequest("");' . 'inputNode.ac.show();' . '});' . '});';
     return '<div id="demo">' . '<label for="ac-input">Tags:</label><br/>' . '<input id="ac-input" type="text"/>' . '</div>' . js_embed($res);
 }
Example #7
0
 function render()
 {
     $header = XhtmlHeader::getInstance();
     $header->includeJs('http://yui.yahooapis.com/3.3.0/build/yui/yui-min.js');
     $div_holder = 'yui_chart' . mt_rand();
     $header->embedCss('#' . $div_holder . ' { width: ' . $this->width . 'px; height: ' . $this->height . 'px; }');
     $total_items = 0;
     foreach ($this->data_source as $i) {
         $total_items += $i['value'];
     }
     $res = 'YUI().use("charts", function (Y)' . '{' . 'var myDataValues = ' . JSON::encode($this->data_source) . ';' . 'var myTooltip = {' . 'styles: { ' . 'backgroundColor: "#333",' . 'color: "#eee",' . 'borderColor: "#fff",' . 'textAlign: "center"' . '},' . 'markerLabelFunction: function(categoryItem, valueItem, itemIndex, series, seriesIndex)' . '{' . 'return ' . '"<span style=\\"text-decoration:underline\\">" + categoryItem.value + "</span><br/>' . '<div style=\\"margin-top:5px;font-weight:bold\\">" + valueItem.value + " (" + Math.round(valueItem.value / ' . $total_items . ' * 100) + " %)</div>";' . '}' . '};' . 'var mychart = new Y.Chart({' . 'dataProvider:myDataValues,' . 'categoryKey:"' . $this->category_key . '",' . 'type:"pie",' . 'render: "#' . $div_holder . '",' . 'tooltip: myTooltip,' . 'seriesKeys:["value"],' . 'seriesCollection:[' . '{' . 'categoryKey:"' . $this->category_key . '",' . 'valueKey:"value"' . '}' . ']' . '});' . '});';
     return '<div id="' . $div_holder . '">' . '</div>' . js_embed($res);
 }
Example #8
0
 function render()
 {
     if (!$this->name) {
         throw new \Exception('must set a name');
     }
     $header = XhtmlHeader::getInstance();
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/calendar/assets/skins/sam/calendar.css');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/calendar/calendar-min.js');
     $locale = LocaleHandler::getInstance();
     $div_holder = 'yui_date_hold' . mt_rand();
     $res = 'YAHOO.namespace("example.calendar");' . 'YAHOO.example.calendar.init = function() {' . 'var inTxt = YAHOO.util.Dom.get("' . $this->name . '");' . ($this->selected_date ? 'inTxt.value  = "' . sql_date($this->selected_date) . '";' : '') . 'var cal = YAHOO.example.calendar.cal1 = new YAHOO.widget.Calendar("' . $div_holder . '");' . ($this->selected_date ? 'cal.cfg.setProperty("selected", "' . js_date($this->selected_date) . '");' . 'cal.cfg.setProperty("pagedate", "' . date('n/Y', $this->selected_date) . '");' : '') . 'cal.cfg.setProperty("start_weekday",' . $this->start_weekday . ');' . 'cal.cfg.setProperty("MONTHS_SHORT",' . Json::encode($locale->handle->month_short, false) . ');' . 'cal.cfg.setProperty("MONTHS_LONG",' . Json::encode($locale->handle->month_long, false) . ');' . 'cal.cfg.setProperty("WEEKDAYS_1CHAR",' . Json::encode($locale->handle->weekday_1char, false) . ');' . 'cal.cfg.setProperty("WEEKDAYS_SHORT",' . Json::encode($locale->handle->weekday_short, false) . ');' . 'cal.cfg.setProperty("WEEKDAYS_MEDIUM",' . Json::encode($locale->handle->weekday_medium, false) . ');' . 'cal.cfg.setProperty("WEEKDAYS_LONG",' . Json::encode($locale->handle->weekday_long, false) . ');' . 'cal.selectEvent.subscribe(function() {' . 'var dates = this.getSelectedDates();' . 'var inDate = dates[0];' . 'inTxt.value = inDate.getFullYear() + "-" + (inDate.getMonth() + 1) + "-" + inDate.getDate();' . '}, cal, true);' . 'cal.render();' . '}' . "\n" . 'YAHOO.util.Event.onDOMReady(YAHOO.example.calendar.init);';
     return '<div id="' . $div_holder . '"></div>' . '<div style="clear:both"></div>' . xhtmlInput($this->name) . '<br/>' . js_embed($res);
 }
Example #9
0
 function render()
 {
     if ($this->latitude === false || $this->longitude === false) {
         throw new \Exception('initial center coords required but not set!');
     }
     $header = XhtmlHeader::getInstance();
     $header->includeJs('http://maps.google.com/maps/api/js' . '?sensor=' . sbool($this->sensor) . ($this->lang ? '&amp;language=' . $this->lang : '') . ($this->region ? '&amp;region=' . $this->region : ''));
     $div_id = 'gmap_' . mt_rand();
     $res = 'var myOptions={' . 'center:new google.maps.LatLng(' . $this->latitude . ',' . $this->longitude . '),' . 'zoom:' . $this->zoom . ',' . 'mapTypeId:google.maps.MapTypeId.ROADMAP' . '};' . 'var myMap=new google.maps.Map(document.getElementById("' . $div_id . '"),myOptions);';
     foreach ($this->markers as $idx => $m) {
         $res .= 'var mk' . $idx . '=new google.maps.Marker({' . 'position:new google.maps.LatLng(' . $m->latitude . ',' . $m->longitude . '),' . ($m->icon ? 'icon:"' . $m->icon . '",' : '') . ($m->tooltip ? 'title:"' . $m->tooltip . '",' : '') . ($m->zIndex ? 'zIndex:' . $m->zIndex . ',' : '') . ($m->flat ? 'flat:true,' : '') . 'map:myMap' . '});';
     }
     $header->embedJsOnload($res);
     return '<div id="' . $div_id . '" style="width:' . $this->width . 'px;height:' . $this->height . 'px;"></div>';
 }
Example #10
0
 function render()
 {
     if (!$this->name) {
         throw new \Exception('name must be configured');
     }
     $header = XhtmlHeader::getInstance();
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/calendar/assets/skins/sam/calendar.css');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/calendar/calendar-min.js');
     $res = '(function()' . '{' . 'function IntervalCalendar(container, cfg)' . '{' . 'this._iState = 0;' . 'cfg = cfg || {};' . 'cfg.multi_select = true;' . 'IntervalCalendar.superclass.constructor.call(this, container, cfg);' . 'this.beforeSelectEvent.subscribe(this._intervalOnBeforeSelect, this, true);' . 'this.selectEvent.subscribe(this._intervalOnSelect, this, true);' . 'this.beforeDeselectEvent.subscribe(this._intervalOnBeforeDeselect, this, true);' . 'this.deselectEvent.subscribe(this._intervalOnDeselect, this, true);' . '}' . 'IntervalCalendar._DEFAULT_CONFIG = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG;' . 'YAHOO.lang.extend(IntervalCalendar, YAHOO.widget.CalendarGroup,' . '{' . '_dateString : function(d) {' . 'var a = [];' . 'a[this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.MDY_MONTH_POSITION.key)-1] = (d.getMonth() + 1);' . 'a[this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.MDY_DAY_POSITION.key)-1] = d.getDate();' . 'a[this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.MDY_YEAR_POSITION.key)-1] = d.getFullYear();' . 'var s = this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.DATE_FIELD_DELIMITER.key);' . 'return a.join(s);' . '},' . '_dateIntervalString : function(l, u) {' . 'var s = this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.DATE_RANGE_DELIMITER.key);' . 'return (this._dateString(l) + s + this._dateString(u));' . '},' . 'getInterval : function() {' . 'var dates = this.getSelectedDates();' . 'if(dates.length > 0) {' . 'var l = dates[0];' . 'var u = dates[dates.length - 1];' . 'return [l, u];' . '} else {' . 'return [];' . '}' . '},' . 'setInterval : function(d1, d2) {' . 'var b = (d1 <= d2);' . 'var l = b ? d1 : d2;' . 'var u = b ? d2 : d1;' . 'this.cfg.setProperty("selected", this._dateIntervalString(l, u), false);' . 'this._iState = 2;' . '},' . 'resetInterval : function() {' . 'this.cfg.setProperty("selected", [], false);' . 'this._iState = 0;' . '},' . '_intervalOnBeforeSelect : function(t,a,o) {' . 'this._iState = (this._iState + 1) % 3;' . 'if(this._iState == 0) {' . 'this.deselectAll();' . 'this._iState++;' . '}' . '},' . '_intervalOnSelect : function(t,a,o) {' . 'var dates = this.getSelectedDates();' . 'if(dates.length > 1) {' . 'var l = dates[0];' . 'var u = dates[dates.length - 1];' . 'this.cfg.setProperty("selected", this._dateIntervalString(l, u), false);' . '}' . 'this.render();' . '},' . '_intervalOnBeforeDeselect : function(t,a,o) {' . 'if(this._iState != 0) {' . 'return false;' . '}' . '},' . '_intervalOnDeselect : function(t,a,o) {' . 'if(this._iState != 0) {' . 'this._iState = 0;' . 'this.deselectAll();' . 'var d = a[0];' . 'var date = YAHOO.widget.DateMath.getDate(d[0], d[1] - 1, d[2]);' . 'var page = this.getCalendarPage(date);' . 'if(page) {' . 'page.beforeSelectEvent.fire();' . 'this.cfg.setProperty("selected", this._dateString(date), false);' . 'page.selectEvent.fire([d]);' . '}' . 'return false;' . '}' . '}' . '});' . 'YAHOO.namespace("example.calendar");' . 'YAHOO.example.calendar.IntervalCalendar = IntervalCalendar;' . '})();';
     $locale = LocaleHandler::getInstance();
     $div_holder = 'yui_di_hold' . mt_rand();
     $res .= 'YAHOO.util.Event.onDOMReady(function()' . '{' . 'var inTxt  = YAHOO.util.Dom.get("' . $this->name . '_from");' . 'var outTxt = YAHOO.util.Dom.get("' . $this->name . '_to");' . 'var inDate, outDate, interval;' . ($this->select_from ? 'inTxt.value  = "' . sql_date($this->select_from) . '";' : '') . ($this->select_to ? 'outTxt.value = "' . sql_date($this->select_to) . '";' : '') . 'var myConfigs =' . '{' . 'pages:2,' . ($this->select_from && $this->select_to ? 'selected:"' . js_date($this->select_from) . '-' . js_date($this->select_to) . '",' . 'pagedate:"' . date('n/Y', $this->select_from) . '",' : '') . 'start_weekday:' . $this->start_weekday . ',' . 'MONTHS_SHORT:' . Json::encode($locale->handle->month_short, false) . ',' . 'MONTHS_LONG:' . Json::encode($locale->handle->month_long, false) . ',' . 'WEEKDAYS_1CHAR:' . Json::encode($locale->handle->weekday_1char, false) . ',' . 'WEEKDAYS_SHORT:' . Json::encode($locale->handle->weekday_short, false) . ',' . 'WEEKDAYS_MEDIUM:' . Json::encode($locale->handle->weekday_medium, false) . ',' . 'WEEKDAYS_LONG:' . Json::encode($locale->handle->weekday_long, false) . ',' . '};' . 'var cal = new YAHOO.example.calendar.IntervalCalendar("' . $div_holder . '",myConfigs);' . 'cal.selectEvent.subscribe(function()' . '{' . 'interval = this.getInterval();' . 'if (interval.length == 2) {' . 'inDate = interval[0];' . 'inTxt.value =  inDate.getFullYear() + "-" + (inDate.getMonth() + 1) + "-" + inDate.getDate();' . 'if (interval[0].getTime() != interval[1].getTime()) {' . 'outDate = interval[1];' . 'outTxt.value = outDate.getFullYear() + "-" + (outDate.getMonth() + 1) + "-" + outDate.getDate();' . '} else {' . 'outTxt.value = "";' . '}' . '}' . '}, cal, true);' . 'cal.render();' . '});';
     return '<div id="' . $div_holder . '"></div>' . '<div style="clear:both"></div>' . js_embed($res) . xhtmlInput($this->name . '_from') . ' - ' . xhtmlInput($this->name . '_to');
 }
 function render()
 {
     $div_id = 'omap_' . mt_rand();
     $header = XhtmlHeader::getInstance();
     $header->includeJsLast('core_dev/js/ext/openlayers/OpenLayers.js');
     // version 2.11
     $js = 'map=new OpenLayers.Map("' . $div_id . '");' . 'map.addLayer(new OpenLayers.Layer.OSM());' . 'var ll=new OpenLayers.LonLat(' . $this->longitude . ',' . $this->latitude . ')' . '.transform(' . 'new OpenLayers.Projection("EPSG:4326"),' . 'map.getProjectionObject()' . ');' . 'var markers = new OpenLayers.Layer.Markers( "Markers" );' . 'map.addLayer(markers);';
     foreach ($this->markers as $idx => $m) {
         $js .= 'mll=new OpenLayers.LonLat(' . $m->longitude . ',' . $m->latitude . ')' . '.transform(' . 'new OpenLayers.Projection("EPSG:4326"),' . 'map.getProjectionObject()' . ');';
         if ($m->icon) {
             $js .= 'var size = new OpenLayers.Size(16,11);' . 'var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);' . 'icon=new OpenLayers.Icon("' . $m->icon . '",size,offset);' . 'markers.addMarker(new OpenLayers.Marker(mll,icon));';
         } else {
             $js .= 'markers.addMarker(new OpenLayers.Marker(mll));';
         }
     }
     $js .= 'map.setCenter(ll,' . $this->zoom . ');';
     $header->embedJsOnload($js);
     return '<div id="' . $div_id . '" style="width:' . $this->width . 'px;height:' . $this->height . 'px;"></div>';
 }
 function render()
 {
     if (!is_array($this->options)) {
         throw new \Exception('options not an array: ' . $this->options);
     }
     $page = XmlDocumentHandler::getInstance();
     $header = XhtmlHeader::getInstance();
     $el_id = 'multi_' . mt_rand();
     $header->registerJsFunction('function toggle_multi_opt(n) {' . 'var e = document.getElementById(n);' . 'if (e.multiple == true) {' . 'e.multiple = false;' . 'e.size = ' . $this->collapsed_size . ';' . '} else {' . 'e.multiple = true;' . 'e.size = ' . $this->expanded_size . ';' . '}' . '}');
     $out = '<select id="' . $el_id . '" name="' . strip_tags($this->name) . '[]"' . ($this->js_onchange ? ' onchange="' . $this->js_onchange . '"' : '') . '>';
     $out .= '<option value="0">---</option>';
     //default to "0" instead of an empty string for "no option selected"
     foreach ($this->options as $id => $title) {
         $out .= '<option value="' . $id . '"' . ($this->value && $this->value == $id ? ' selected="selected"' : '') . '>' . $title . '</option>';
     }
     $out .= '</select>';
     $out .= '<a href="#" onclick="toggle_multi_opt(\'' . $el_id . '\'); return false;" style="vertical-align: bottom;"><img src="' . $page->getRelativeCoreDevUrl() . 'gfx/bullet_toggle_plus.png"/></a>';
     return $out;
 }
Example #13
0
 function render()
 {
     $header = XhtmlHeader::getInstance();
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/assets/skins/sam/skin.css');
     // utility Dependencies
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/element/element-min.js');
     // needed for Menus, Buttons and Overlays used in the Toolbar
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/container/container_core-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/menu/menu-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/button/button-min.js');
     // source file for Rich Text Editor
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/editor/editor-min.js');
     $div_id = $this->name ? $this->name : 're_' . mt_rand();
     $res = 'var myEditor = new YAHOO.widget.Editor("' . $div_id . '",' . '{' . 'width: "' . $this->width . 'px",' . 'height: "' . $this->height . 'px",' . 'dompath: ' . ($this->show_dompath ? 'true' : 'false') . ',' . 'animate: true,' . 'handleSubmit: true,' . 'toolbar: {' . ($this->titlebar ? 'titlebar: "' . $this->titlebar . '",' : '') . 'buttons: [' . '{ group: "textstyle", label: " ",' . 'buttons: [' . '{ type: "push", label: "Bold", value: "bold" },' . '{ type: "push", label: "Italic", value: "italic" },' . '{ type: "push", label: "Underline", value: "underline" },' . '{ type: "separator" },' . '{ type: "select", label: "Arial", value: "fontname", disabled: true,' . 'menu: [' . '{ text: "Arial", checked: true },' . '{ text: "Arial Black" },' . '{ text: "Comic Sans MS" },' . '{ text: "Courier New" },' . '{ text: "Lucida Console" },' . '{ text: "Tahoma" },' . '{ text: "Times New Roman" },' . '{ text: "Trebuchet MS" },' . '{ text: "Verdana" }' . ']' . '},' . '{ type: "spin", label: "13", value: "fontsize", range: [ 9, 75 ], disabled: true },' . '{ type: "separator" },' . '{ type: "color", label: "Font Color", value: "forecolor", disabled: true },' . '{ type: "color", label: "Background Color", value: "backcolor", disabled: true },' . '{ type: "separator" },' . '{ type: "push", label: "Create an Unordered List", value: "insertunorderedlist" },' . '{ type: "push", label: "Create an Ordered List", value: "insertorderedlist" },' . ']' . '}' . ']' . '}' . '}' . ');' . 'myEditor.render();';
     $hold = new XhtmlComponentTextarea();
     $hold->name = $this->name;
     $hold->value = $this->value;
     $hold->width = 1;
     $hold->height = 1;
     return $hold->render() . js_embed($res);
 }
Example #14
0
 function render()
 {
     if (!$this->name) {
         throw new \Exception('must set a name');
     }
     $header = XhtmlHeader::getInstance();
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/fonts/fonts-min.css');
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/button/assets/skins/sam/button.css');
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/container/assets/skins/sam/container.css');
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/calendar/assets/skins/sam/calendar.css');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/dragdrop/dragdrop-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/element/element-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/button/button-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/container/container-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/calendar/calendar-min.js');
     $header->embedCss('#container .bd form {' . 'clear:left;' . '}' . '#container .bd {' . 'padding:0;' . '}' . '#container .hd {' . 'text-align:left;' . '}' . '#container .ft .button-group {' . 'text-align:center;' . '}' . '#container_c.yui-overlay-hidden table {' . '*display:none;' . '}' . '#cal {' . 'border:none;' . 'padding:1em;' . '}');
     $locale = LocaleHandler::getInstance();
     $button_name = 'yui_dp_show_' . mt_rand();
     $res = 'YAHOO.util.Event.onDOMReady(function(){' . 'var Event = YAHOO.util.Event,' . 'Dom = YAHOO.util.Dom,' . 'dialog,' . 'calendar;' . 'var showBtn = Dom.get("' . $button_name . '");' . 'Event.on(showBtn, "click", function() {' . 'if (!dialog) {' . 'Event.on(document, "click", function(e) {' . 'var el = Event.getTarget(e);' . 'var dialogEl = dialog.element;' . 'if (el != dialogEl && !Dom.isAncestor(dialogEl, el) && el != showBtn && !Dom.isAncestor(showBtn, el)) {' . 'dialog.hide();' . '}' . '});' . 'function resetHandler() {' . 'var selDates = calendar.getSelectedDates();' . 'var resetDate;' . 'if (selDates.length > 0) {' . 'resetDate = selDates[0];' . '} else {' . 'resetDate = calendar.today;' . '}' . 'calendar.cfg.setProperty("pagedate", resetDate);' . 'calendar.render();' . '}' . 'function closeHandler() {' . 'dialog.hide();' . '}' . 'dialog = new YAHOO.widget.Dialog("container", {' . 'visible:false,' . 'context:["' . $button_name . '", "tl", "bl"],' . 'buttons:[ {text:"Reset", handler: resetHandler, isDefault:true}, {text:"Close", handler: closeHandler}],' . 'draggable:false,' . 'close:true' . '});' . 'dialog.setHeader("Pick A Date");' . 'dialog.setBody(\'<div id="cal"></div>\');' . 'dialog.render(document.body);' . 'dialog.showEvent.subscribe(function() {' . 'if (YAHOO.env.ua.ie) {' . 'dialog.fireEvent("changeContent");' . '}' . '});' . '}' . 'if (!calendar) {' . 'calendar = new YAHOO.widget.Calendar("cal", {' . 'iframe:false,' . 'hide_blank_weeks:true,' . ($this->selected_date ? 'selected:"' . js_date($this->selected_date) . '",' . 'pagedate:"' . date('n/Y', $this->selected_date) . '",' : '') . 'start_weekday:' . $this->start_weekday . ',' . 'MONTHS_SHORT:' . Json::encode($locale->handle->month_short, false) . ',' . 'MONTHS_LONG:' . Json::encode($locale->handle->month_long, false) . ',' . 'WEEKDAYS_1CHAR:' . Json::encode($locale->handle->weekday_1char, false) . ',' . 'WEEKDAYS_SHORT:' . Json::encode($locale->handle->weekday_short, false) . ',' . 'WEEKDAYS_MEDIUM:' . Json::encode($locale->handle->weekday_medium, false) . ',' . 'WEEKDAYS_LONG:' . Json::encode($locale->handle->weekday_long, false) . ',' . '});' . 'calendar.render();' . 'calendar.selectEvent.subscribe(function() {' . 'if (calendar.getSelectedDates().length > 0) {' . 'var selDate = calendar.getSelectedDates()[0];' . 'Dom.get("' . $this->name . '").value = selDate.getFullYear() + "-" + (selDate.getMonth() + 1) + "-" + selDate.getDate();' . '} else {' . 'Dom.get("' . $this->name . '").value = "";' . '}' . 'dialog.hide();' . '});' . 'calendar.renderEvent.subscribe(function() {' . 'dialog.fireEvent("changeContent");' . '});' . '}' . 'var seldate = calendar.getSelectedDates();' . 'if (seldate.length > 0) {' . 'calendar.cfg.setProperty("pagedate", seldate[0]);' . 'calendar.render();' . '}' . 'dialog.show();' . '});' . '});';
     return xhtmlInput($this->name, sql_date($this->selected_date), 8) . ' ' . '<button type="button" id="' . $button_name . '" title="Pick a date">' . '<img src="' . relurl('core_dev/gfx/icon_date-picker.png') . '" alt="Pick a date"/>' . '</button>' . js_embed($res);
 }
Example #15
0
 public function render()
 {
     //available variables in the scope of the view
     if (class_exists('\\cd\\ErrorHandler')) {
         $error = ErrorHandler::getInstance();
     }
     if (class_exists('\\cd\\SessionHandler')) {
         $session = SessionHandler::getInstance();
     }
     if (class_exists('\\cd\\SqlHandler')) {
         $db = SqlHandler::getInstance();
     }
     if (class_exists('\\cd\\XhtmlHeader')) {
         $header = XhtmlHeader::getInstance();
     }
     if (class_exists('\\cd\\XmlDocumentHandler')) {
         $page = XmlDocumentHandler::getInstance();
     }
     if (class_exists('\\cd\\LocaleHandler')) {
         $locale = LocaleHandler::getInstance();
     }
     if (class_exists('\\cd\\TempStore')) {
         $temp = TempStore::getInstance();
     }
     // make reference to calling object available in the namespace of the view
     $caller = $this->caller;
     $file = $page->getCoreDevPath() . $this->template;
     if (!file_exists($file)) {
         // if not built in view, look in app dir
         $file = $this->template;
         if (!file_exists($file)) {
             throw new \Exception('cannot find ' . $this->template);
         }
     }
     ob_start();
     require $file;
     return ob_get_clean();
 }
Example #16
0
 function render()
 {
     $header = XhtmlHeader::getInstance();
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/treeview/assets/skins/sam/treeview.css');
     // XXX disable this css to get windows-style treeview object
     // $header->includeCss('http://developer.yahoo.com/yui/build/treeview/assets/treeview-menu.css');
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/calendar/assets/skins/sam/calendar.css');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/animation/animation-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/calendar/calendar-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/json/json-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/connection/connection-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/treeview/treeview-min.js');
     $locale = LocaleHandler::getInstance();
     $div_holder = 'yui_tree_hold' . mt_rand();
     if ($this->allow_expand_all) {
         $node_type = 'TextNode';
     } else {
         $node_type = 'MenuNode';
     }
     $res = 'function loadNodeData(node, fnLoadComplete)' . '{' . 'var sUrl = "' . $this->xhr_url . '" + encodeURI(node.data.id);' . 'var callback = {' . 'success: function(oResponse) {' . 'var oResults = YAHOO.lang.JSON.parse(oResponse.responseText);' . 'if (oResults.records && oResults.records.length) {' . 'for (var i=0; i<oResults.records.length; i++) {' . 'var newNode = new YAHOO.widget.' . $node_type . '({label:oResults.records[i].name,id:oResults.records[i].id}, node, false);' . '}' . '}' . 'oResponse.argument.fnLoadComplete();' . '},' . 'failure: function(oResponse) {' . 'YAHOO.log("Failed to process XHR transaction.", "info", "example");' . 'oResponse.argument.fnLoadComplete();' . '},' . 'argument: {' . '"node": node,' . '"fnLoadComplete": fnLoadComplete' . '},' . 'timeout:' . $this->ms_timeout . '};' . 'YAHOO.util.Connect.asyncRequest("GET", sUrl, callback);' . '}' . 'var tree = new YAHOO.widget.TreeView("' . $div_holder . '");' . ($this->xhr_url ? 'tree.setDynamicLoad(loadNodeData,' . ($this->leaf_mode ? '1' : '0') . ');' : '') . 'var root = tree.getRoot();' . ($this->root_nodes ? 'var aChilds = ' . JSON::encode($this->root_nodes) . ';' . 'for (var i=0, j=aChilds.length; i<j; i++) {' . 'var tempNode = new YAHOO.widget.' . $node_type . '({label:aChilds[i].name,id:aChilds[i].id}, root, false);' . '}' : '') . ($this->js_click ? 'tree.subscribe("clickEvent",function(oArgs){' . $this->js_click . '});' : '') . ($this->js_dblclick ? 'tree.subscribe("dblClickEvent",function(oArgs){' . $this->js_dblclick . '});' : '') . 'tree.render();';
     return '<div id="' . $div_holder . '"></div>' . js_embed($res);
 }
Example #17
0
 function render()
 {
     /*if (!$this->data_source)
                 throw new \Exception ('no data source set');
     */
     $header = XhtmlHeader::getInstance();
     $header->includeJs('http://yui.yahooapis.com/3.7.1/build/yui/yui-min.js');
     $div_holder = 'yui_chart' . mt_rand();
     $header->embedCss('#' . $div_holder . ' { width: ' . $this->width . 'px; height: ' . $this->height . 'px; }');
     $res = 'YUI().use("charts", function (Y)' . '{' . 'var myTooltip = {' . 'styles: { ' . 'backgroundColor: "#333",' . 'color: "#eee",' . 'borderColor: "#fff",' . 'textAlign: "center"' . '},' . 'markerLabelFunction: function(categoryItem, valueItem, itemIndex, series, seriesIndex)' . '{' . 'return ' . '"<span style=\\"text-decoration:underline\\">" + valueItem.displayName + " for " + categoryItem.value + "</span><br/>' . '<div style=\\"margin-top:5px;font-weight:bold\\">" + (valueItem.value ? valueItem.value : "0") + "</div>";' . '},' . 'setTextFunction: function(textField, val)' . '{' . 'textField.setHTML(val);' . '}' . '};' . 'var styleDef = {' . 'axes:{' . 'values:{' . 'label:{' . 'color:"' . $this->color_label . '"' . '}' . '},' . $this->category_key . ':{' . 'label:{' . 'rotation:-45,' . 'color: "' . $this->color_label . '"' . '}' . '}' . '}' . '};' . 'var myDataValues = ' . JSON::encode($this->data_source) . ';' . 'var mychart = new Y.Chart(' . '{' . 'dataProvider:myDataValues,' . 'categoryKey:"' . $this->category_key . '",' . ($this->x_type ? 'categoryType:"' . $this->x_type . '",' : '') . 'render: "#' . $div_holder . '",' . 'tooltip: myTooltip,' . 'styles: styleDef,' . 'horizontalGridlines: {' . 'styles: { line: { color: "' . $this->color_grid . '" } }' . '},' . 'verticalGridlines: {' . 'styles: { line: { color: "' . $this->color_grid . '" } }' . '}' . '});' . '});';
     return '<div id="' . $div_holder . '">' . '</div>' . js_embed($res);
 }
Example #18
0
         throw new \Exception('XXX');
     }
     Rating::addVote(POLL, $this->child, $this->child2);
     $page->disableDesign();
     echo '1';
     break;
 case 'show':
     //child = poll id
     if (!$this->child) {
         throw new \Exception('no id set');
     }
     $poll = PollItem::get($this->child);
     if (!$poll) {
         die('meh');
     }
     $header = XhtmlHeader::getInstance();
     $header->embedCss('.poll_item{' . 'background-color:#eee;' . 'padding:5px;' . 'cursor:pointer;' . '}');
     $header->includeJs('http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js');
     $header->embedJs('function submit_poll(id,opt)' . '{' . 'YUI().use("io-base", function(Y) {' . 'var uri = "' . relurl('') . 'u/polls/vote/" + id + "/" + opt;' . 'Y.on("io:complete", function(id,o){' . 'var id = id;' . 'var data = o.responseText;' . 'if (data==1) return;' . 'alert("Voting error " + data);' . '});' . 'var request = Y.io(uri);' . '});' . 'hide_el("poll"+id);' . 'show_el("poll_voted"+id);' . '}');
     $active = false;
     if (time() >= ts($poll->time_start) && time() <= ts($poll->time_end)) {
         $active = true;
     }
     if (!$poll->time_start) {
         $active = true;
     }
     echo '<div class="item">';
     if ($active) {
         echo 'Active poll: ';
     }
     echo $poll->text . '<br/><br/>';
 function render()
 {
     $head = '';
     $foot = '';
     if ($this->enable_design) {
         if ($this->design_head) {
             $view = new ViewModel($this->design_head);
             $head .= $view->render();
         }
         $view = new ViewModel('views/core/required_js.php');
         $head .= $view->render();
         if ($this->design_foot) {
             $view = new ViewModel($this->design_foot);
             $foot .= $view->render();
         }
     }
     $main = '';
     foreach ($this->objs as $obj) {
         $main .= $obj->render();
     }
     if ($this->enable_design && $this->enable_profiler) {
         $view = new ViewModel('views/profiler/page.php');
         $main .= $view->render();
     }
     $this->sendHeaders();
     $header = XhtmlHeader::getInstance();
     $enable_fb = false;
     if ($this->enable_design && class_exists('\\cd\\SessionHandler') && SessionHandler::getInstance()->facebook_app_id) {
         $enable_fb = true;
         $header->includeJs($this->getScheme() . '://connect.facebook.net/en_US/all.js');
         $this->registerXmlNs('fb', 'http://www.facebook.com/2008/fbml');
         $header->embedJs('window.fbAsyncInit = function() {' . 'FB.init({' . 'appId:"' . SessionHandler::getInstance()->facebook_app_id . '",' . 'status:true,' . 'cookie:true,' . 'xfbml:true,' . 'channelUrl:"' . $this->getUrl() . 'c/fbchannel",' . '});' . '};' . '(function() {' . 'var e = document.createElement("script"); e.async = true;' . 'e.src = document.location.protocol + "//connect.facebook.net/en_US/all.js";' . 'e.async = true;' . 'document.getElementById("fb-root").appendChild(e);' . '}());');
     }
     if ($this->enable_html_headers) {
         switch ($this->html_mode) {
             case 'xhtml':
                 // XHTML 1.0 Transitional
                 echo '<!DOCTYPE html' . ' PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' . ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n" . '<html' . ' xmlns="http://www.w3.org/1999/xhtml"';
                 break;
             case 'html5':
                 // HTML 5
                 echo '<!DOCTYPE html>' . "\n" . '<html';
                 //            ' manifest="cache.manifest"'.   // The "HTML5" manifest="cache.manifest" property on the <html> tag is how the browser knows that we want to cache this web page offline.
                 break;
         }
         //            ' xml:lang="'.$this->language_code.'" lang="'.$this->language_code.'"'
         foreach ($this->xmlns as $name => $uri) {
             echo ' xmlns:' . $name . '="' . $uri . '"';
         }
         echo '>' . "\n";
         echo $header->render();
         if ($enable_fb) {
             echo '<div id="fb-root"></div>';
         }
         // required for Facebook API
     }
     if ($this->enable_design) {
         echo $head;
     }
     echo $main;
     if ($this->enable_design) {
         echo $foot;
     }
     if ($this->enable_design) {
         echo '</body>';
         // <body> tag is opened in XhtmlHeader->render()
         echo '</html>';
     }
 }
Example #20
0
 function render()
 {
     if (empty($_SESSION['cd_errors'])) {
         return '';
     }
     $div_class = 'error_' . mt_rand();
     $header = XhtmlHeader::getInstance();
     $header->embedCss('.' . $div_class . ' {' . 'border: 1px dashed;' . 'color: #000;' . 'padding: 5px;' . 'line-height: 20px;' . 'background-color: #FB9B9B;' . '}');
     $res = '';
     foreach ($_SESSION['cd_errors'] as $e) {
         $res .= '<div class="' . $div_class . '">' . $e . '</div><br/>';
     }
     // clear errors
     $this->reset();
     return $res;
 }
Example #21
0
 function render()
 {
     if (!$this->columns) {
         throw new \Exception('no columns');
     }
     $header = XhtmlHeader::getInstance();
     if ($this->show_paginator) {
         $header->includeCss('core_dev/js/ext/yui/2.9.0/build/paginator/assets/skins/sam/paginator.css');
     }
     $header->includeCss('core_dev/js/ext/yui/2.9.0/build/datatable/assets/skins/sam/datatable.css');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/connection/connection-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/datasource/datasource-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/element/element-min.js');
     if ($this->show_paginator) {
         $header->includeJs('core_dev/js/ext/yui/2.9.0/build/paginator/paginator-min.js');
     }
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/datatable/datatable-min.js');
     $header->includeJs('core_dev/js/ext/yui/2.9.0/build/json/json-min.js');
     $div_holder = 'yui_dt' . mt_rand();
     $data_var = 'yui_dt_data' . mt_rand();
     $pag_holder = 'yui_pag' . mt_rand();
     $res = 'YAHOO.util.Event.addListener(window, "load", function() {' . 'YAHOO.example.Basic = function() {' . 'this.formatLink = function(elLiner, oRecord, oColumn, oData) {' . 'if (!oData) return;' . 'var prefix = oColumn["extra_data"];' . 'var col_label_name = oColumn["col_label"];' . 'var col_label = oRecord._oData[col_label_name];' . 'elLiner.innerHTML = "<a href=\\"" + prefix + oData + "\\">" + (col_label ? col_label : oData) + "</a>";' . '};' . 'this.formatDate = function(elLiner, oRecord, oColumn, oData) {' . 'if (!oData) return;' . 'var a1 = oData.substr(0,10).split("-");' . 'elLiner.innerHTML = a1[0]+"-"+a1[1]+"-"+a1[2];' . '};' . 'this.formatTime = function(elLiner, oRecord, oColumn, oData) {' . 'if (!oData) return;' . 'var a1 = oData.substr(0,10).split("-");' . 'var a2 = oData.substr(11,8).split(":");' . 'elLiner.innerHTML = a1[0]+"-"+a1[1]+"-"+a1[2]+" "+a2[0]+":"+a2[1]+":"+a2[2];' . '};' . 'this.formatMoney = function(elLiner, oRecord, oColumn, oData) {' . 'var val = Number(oData) / 100;' . 'elLiner.innerHTML = val.toFixed(2);' . '};' . 'this.formatBool = function(elLiner, oRecord, oColumn, oData) {' . 'elLiner.innerHTML = \'<img src="' . relurl('core_dev/gfx/icon_ok') . '\' + ( oData == 1 ? "" : "_gray") + \'.png"/>\';' . '};';
     for ($i = 0; $i < count($this->embed_arrays); $i++) {
         $res .= 'this.formatArray' . $i . ' = function(elLiner, oRecord, oColumn, oData) {' . 'var a=' . Json::encodeObject($this->embed_arrays[$i]) . ';' . 'elLiner.innerHTML = a[oData];' . '};' . 'YAHOO.widget.DataTable.Formatter.formatArray' . $i . ' = this.formatArray' . $i . ';';
     }
     $res .= 'YAHOO.widget.DataTable.Formatter.formatLink = this.formatLink;' . 'YAHOO.widget.DataTable.Formatter.formatDate = this.formatDate;' . 'YAHOO.widget.DataTable.Formatter.formatTime = this.formatTime;' . 'YAHOO.widget.DataTable.Formatter.formatMoney = this.formatMoney;' . 'YAHOO.widget.DataTable.Formatter.formatBool = this.formatBool;' . 'myColumnDefs = ' . Json::encode($this->columns) . ';' . "\n" . (is_array($this->data_source) ? 'var ' . $data_var . ' = ' . Json::encode($this->data_source) . ';' . "\n" . 'var myDataSource = new YAHOO.util.DataSource(' . $data_var . ');' . 'myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;' . 'myDataSource.responseSchema = { fields:' . Json::encode($this->response_fields, false) . '};' : 'var myDataSource = new YAHOO.util.DataSource("' . $this->data_source . '");' . 'myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;' . 'myDataSource.responseSchema = {' . 'resultsList: "records",' . 'fields: ' . Json::encode($this->response_fields, false) . ',' . 'metaFields: { totalRecords:"totalRecords" }' . '};');
     if ($this->color_rows) {
         // Define a custom row formatter function
         $res .= 'var myRowFormatter = function(elTr, oRecord) {';
         foreach ($this->color_rows as $col) {
             $c1 = is_numeric($col->c1) ? $col->c1 : 'parseInt( oRecord.getData("' . $col->c1 . '") )';
             $c2 = is_numeric($col->c2) ? $col->c2 : 'parseInt( oRecord.getData("' . $col->c2 . '") )';
             $res .= 'if (' . $c1 . ' ' . $col->comparison . ' ' . $c2 . ') YAHOO.util.Dom.addClass(elTr, "' . $col->css . '");';
             //                        'alert( '.$c1.' + " '.$col->comparison.' " + '.$c2.' + " = " + ('.$c1.' '.$col->comparison.' '.$c2.')   );';
         }
         $res .= 'return true;' . '};';
     }
     $res .= 'var myConfigs = {' . 'caption:"' . $this->caption . '",' . ($this->pixel_width ? 'width:"' . $this->pixel_width . 'px",' : '') . ($this->pixel_height ? 'height:"' . $this->pixel_height . 'px",' : '') . ($this->sort_order ? 'sortedBy: {' . 'key:"' . $this->columns[$this->sort_column]->key . '",' . 'dir:YAHOO.widget.DataTable.' . ($this->sort_order == 'asc' ? 'CLASS_ASC' : 'CLASS_DESC') . '},' : '') . ($this->color_rows ? 'formatRow: myRowFormatter,' : '') . ($this->show_paginator ? 'paginator: new YAHOO.widget.Paginator({' . (is_array($this->data_source) ? 'totalRecords:' . count($this->data_source) . ',' : '') . 'rowsPerPage:' . $this->rows_per_page . ',' . 'rowsPerPageOptions:[' . implode(',', $this->rpp_opts) . '],' . 'containers:["' . $pag_holder . '"],' . 'template:"{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} &nbsp; {CurrentPageReport} {RowsPerPageDropdown} per page",' . 'pageReportTemplate:"Showing items {startRecord} - {endRecord} of {totalRecords}",' . '}),' : '') . (!is_array($this->data_source) ? 'dynamicData:true,' . 'initialRequest:"startIndex=0' . ($this->sort_column !== false ? '&sort=' . $this->columns[$this->sort_column]->key : '') . ($this->sort_order ? '&dir=' . $this->sort_order : '') . '&results=' . $this->rows_per_page . '"' : '') . '};';
     $tbl_type = $this->pixel_width || $this->pixel_height ? 'ScrollingDataTable' : 'DataTable';
     $res .= 'tbl = new YAHOO.widget.' . $tbl_type . '("' . $div_holder . '",myColumnDefs, myDataSource, myConfigs);' . (!is_array($this->data_source) ? 'tbl.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {' . 'oPayload.totalRecords = oResponse.meta.totalRecords;' . 'return oPayload;' . '};' : '') . 'tbl.subscribe("rowMouseoverEvent", tbl.onEventHighlightRow);' . 'tbl.subscribe("rowMouseoutEvent", tbl.onEventUnhighlightRow);' . 'return {' . 'oDS: myDataSource,' . 'oDT: tbl' . '};' . '}();' . '});';
     return '<div id="' . $pag_holder . '"></div>' . '<div id="' . $div_holder . '"></div>' . js_embed($res);
 }
Example #22
0
 /** Renders the form in XHTML */
 function render()
 {
     //        if (!function_exists($this->post_handler) && !$this->js_onsubmit)
     //          throw new \Exception ('FATAL: XhtmlForm no post handler or js handler set');
     if (!$this->name) {
         throw new \Exception('need a form name');
     }
     if (!$this->handled) {
         $this->handle();
     }
     $res = '';
     $error = ErrorHandler::getInstance();
     if ($error->getErrorCount()) {
         $res .= $error->render(true);
     }
     $header = XhtmlHeader::getInstance();
     if ($this->focus_element) {
         $header->embedJsOnload('document.' . $this->name . '.' . $this->focus_element . '.focus();');
     }
     $res .= '<form' . ' action="' . $this->url_handler . '"' . ' method="post"' . ' name="' . $this->name . '"' . (!$this->autocomplete ? ' autocomplete="off"' : '') . ($this->id ? ' id="' . $this->id . '"' : '') . ($this->title ? ' title="' . $this->title . '"' : '') . ($this->file_upload ? ' enctype="multipart/form-data"' : '') . ($this->js_onsubmit ? ' onsubmit="' . $this->js_onsubmit . '"' : '') . '>' . '<table' . ' style="padding: 6px;' . $this->css_table . '"' . '>';
     $hidden = '';
     // fills in form with previous entered data        XXXXX merge some code with handle()
     foreach ($this->elems as $e) {
         if (!isset($e['obj'])) {
             throw new \Exception('ehjohohohoh: ' . $e['obj']);
         }
         if (!$e['obj'] instanceof XhtmlComponent) {
             throw new \Exception('obj not a XhtmlComponent');
         }
         if ($e['obj2'] && !$e['obj2'] instanceof XhtmlComponent) {
             throw new \Exception('obj2 not a XhtmlComponent');
         }
         if (isset($e['obj']->value)) {
             $e['obj']->value = htmlspecialchars($e['obj']->value);
         }
         if ($e['obj'] instanceof XhtmlComponentHidden) {
             $hidden .= $e['obj']->render();
             continue;
         }
         if ($e['obj'] instanceof XhtmlComponentCheckbox) {
             if (isset($this->form_data[$e['obj']->name])) {
                 $e['obj']->checked = $this->form_data[$e['obj']->name];
             } else {
                 if (!empty($this->form_data[$e['obj']->name]) && property_exists($e['obj'], 'value')) {
                     $e['obj']->value = $this->form_data[$e['obj']->name];
                 }
             }
         }
         $res .= '<tr>' . ($e['str'] ? '<td>' . $e['str'] . '</td><td>' : '<td colspan="2">') . $e['obj']->render() . ($e['obj2'] instanceof XhtmlComponent ? $e['obj2']->render() : '') . '</td>' . '</tr>';
     }
     $res .= '</table>' . $hidden . '</form>';
     return $res;
 }
Example #23
0
    /** registers tooltips on all tags with class="yui3-hastooltip" */
    public static function init()
    {
        $header = XhtmlHeader::getInstance();
        $header->includeJs('http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js');
        $header->embedCss('.yui3-tooltip {' . 'position:absolute;' . '}' . '.yui3-tooltip-hidden {' . 'visibility:hidden;' . '}' . '.yui3-tooltip-content {' . 'color: #000;' . 'padding: 2px 5px;' . 'border-color: #D4C237 #A6982B #A6982B #A6982B;' . 'border-width: 1px;' . 'border-style: solid;' . 'background-color: #FFEE69;' . '}');
        $header->embedCss('span.yui3-hastooltip {' . 'border:1px solid #243356;' . 'background-color:#406ED9;' . 'color:#fff;' . 'cursor:pointer;' . '}');
        $header->embedJs('YUI().use("event-mouseenter","event-custom","io-base","widget","widget-position","widget-stack","node-event-delegate","event-key", function(Y)
        {
            var Lang = Y.Lang,
                Node = Y.Node,
                OX = -10000,
                OY = -10000;

            var Tooltip = Y.Base.create("tooltip", Y.Widget, [Y.WidgetPosition, Y.WidgetStack], {

                // PROTOTYPE METHODS/PROPERTIES

                /*
                 * Initialization Code: Sets up privately used state
                 * properties, and publishes the events Tooltip introduces
                 */
                initializer : function(config) {

                    this._triggerClassName = this.getClassName("trigger");

                    // Currently bound trigger node information
                    this._currTrigger = {
                        node: null,
                        title: null,
                        mouseX: Tooltip.OFFSCREEN_X,
                        mouseY: Tooltip.OFFSCREEN_Y
                    };

                    // Event handles - mouse over is set on the delegate
                    // element, mousemove and mouseleave are set on the trigger node
                    this._eventHandles = {
                        delegate: null,
                        trigger: {
                            mouseMove : null,
                            mouseOut: null
                        }
                    };

                    // Show/hide timers
                    this._timers = {
                        show: null,
                        hide: null
                    };

                    // Publish events introduced by Tooltip. Note the triggerEnter event is preventable,
                    // with the default behavior defined in the _defTriggerEnterFn method
                    this.publish("triggerEnter", {defaultFn: this._defTriggerEnterFn, preventable:true});
                    this.publish("triggerLeave", {preventable:false});
                },

                /*
                 * Destruction Code: Clears event handles, timers,
                 * and current trigger information
                 */
                destructor : function() {
                    this._clearCurrentTrigger();
                    this._clearTimers();
                    this._clearHandles();
                },

                /*
                 * bindUI is used to bind attribute change and dom event
                 * listeners
                 */
                bindUI : function() {
                    this.after("delegateChange", this._afterSetDelegate);
                    this.after("nodesChange", this._afterSetNodes);

                    this._bindDelegate();
                },

                /*
                 * syncUI is used to update the rendered DOM, based on the current
                 * Tooltip state
                 */
                syncUI : function() {
                    this._uiSetNodes(this.get("triggerNodes"));
                },

                /*
                 * Public method, which can be used by triggerEvent event listeners
                 * to set the content of the tooltip for the current trigger node
                 */
                setTriggerContent : function(content) {
                    var contentBox = this.get("contentBox");
                    contentBox.set("innerHTML", "");

                    if (content) {
                        if (content instanceof Node) {
                            for (var i = 0, l = content.size(); i < l; ++i) {
                                contentBox.appendChild(content.item(i));
                            }
                        } else if (Lang.isString(content)) {
                            contentBox.set("innerHTML", content);
                        }
                    }
                },

                /*
                 * Default attribute change listener for
                 * the triggerNodes attribute
                 */
                _afterSetNodes : function(e) {
                    this._uiSetNodes(e.newVal);
                },

                /*
                 * Default attribute change listener for
                 * the delegate attribute
                 */
                _afterSetDelegate : function(e) {
                    this._bindDelegate(e.newVal);
                },

                /*
                 * Updates the rendered DOM to reflect the
                 * set of trigger nodes passed in
                 */
                _uiSetNodes : function(nodes) {
                    if (this._triggerNodes) {
                        this._triggerNodes.removeClass(this._triggerClassName);
                    }

                    if (nodes) {
                        this._triggerNodes = nodes;
                        this._triggerNodes.addClass(this._triggerClassName);
                    }
                },

                /*
                 * Attaches the default mouseover DOM listener to the
                 * current delegate node
                 */
                _bindDelegate : function() {
                    var eventHandles = this._eventHandles;

                    if (eventHandles.delegate) {
                        eventHandles.delegate.detach();
                        eventHandles.delegate = null;
                    }
                    eventHandles.delegate = Y.delegate("mouseenter", Y.bind(this._onNodeMouseEnter, this), this.get("delegate"), "." + this._triggerClassName);
                },

                /*
                 * Default mouse enter DOM event listener.
                 *
                 * Delegates to the _enterTrigger method,
                 * if the mouseover enters a trigger node.
                 */
                _onNodeMouseEnter : function(e) {
                    var node = e.currentTarget;
                    if (node && (!this._currTrigger.node || !node.compareTo(this._currTrigger.node))) {
                        this._enterTrigger(node, e.pageX, e.pageY);
                    }
                },

                /*
                 * Default mouse leave DOM event listener
                 *
                 * Delegates to _leaveTrigger if the mouse
                 * leaves the current trigger node
                 */
                _onNodeMouseLeave : function(e) {
                    this._leaveTrigger(e.currentTarget);
                },

                /*
                 * Default mouse move DOM event listener
                 */
                _onNodeMouseMove : function(e) {
                    this._overTrigger(e.pageX, e.pageY);
                },

                /*
                 * Default handler invoked when the mouse enters
                 * a trigger node. Fires the triggerEnter
                 * event which can be prevented by listeners to
                 * show the tooltip from being displayed.
                 */
                _enterTrigger : function(node, x, y) {
                    this._setCurrentTrigger(node, x, y);
                    this.fire("triggerEnter", {node:node, pageX:x, pageY:y});
                },

                /*
                 * Default handler for the triggerEvent event,
                 * which will setup the timer to display the tooltip,
                 * if the default handler has not been prevented.
                 */
                _defTriggerEnterFn : function(e) {
                    var node = e.node;
                    if (!this.get("disabled")) {
                        this._clearTimers();
                        var delay = (this.get("visible")) ? 0 : this.get("showDelay");
                        this._timers.show = Y.later(delay, this, this._showTooltip, [node]);
                    }
                },

                /*
                 * Default handler invoked when the mouse leaves
                 * the current trigger node. Fires the triggerLeave
                 * event and sets up the hide timer
                 */
                _leaveTrigger : function(node) {
                    this.fire("triggerLeave");

                    this._clearCurrentTrigger();
                    this._clearTimers();

                    this._timers.hide = Y.later(this.get("hideDelay"), this, this._hideTooltip);
                },

                /*
                 * Default handler invoked for mousemove events
                 * on the trigger node. Stores the current mouse
                 * x, y positions
                 */
                _overTrigger : function(x, y) {
                    this._currTrigger.mouseX = x;
                    this._currTrigger.mouseY = y;
                },

                /*
                 * Shows the tooltip, after moving it to the current mouse
                 * position.
                 */
                _showTooltip : function(node) {
                    var x = this._currTrigger.mouseX;
                    var y = this._currTrigger.mouseY;

                    this.move(x + Tooltip.OFFSET_X, y + Tooltip.OFFSET_Y);

                    this.show();
                    this._clearTimers();

                    this._timers.hide = Y.later(this.get("autoHideDelay"), this, this._hideTooltip);
                },

                /*
                 * Hides the tooltip, after clearing existing timers.
                 */
                _hideTooltip : function() {
                    this._clearTimers();
                    this.hide();
                },

                /*
                 * Set the rendered content of the tooltip for the current
                 * trigger, based on (in order of precedence):
                 *
                 * a). The string/node content attribute value
                 * b). From the content lookup map if it is set, or
                 * c). From the title attribute if set.
                 */
                _setTriggerContent : function(node) {
                    var content = this.get("content");
                    if (content && !(content instanceof Node || Lang.isString(content))) {
                        content = content[node.get("id")] || node.getAttribute("title");
                    }
                    this.setTriggerContent(content);
                },

                /*
                 * Set the currently bound trigger node information, clearing
                 * out the title attribute if set and setting up mousemove/out
                 * listeners.
                 */
                _setCurrentTrigger : function(node, x, y) {

                    var currTrigger = this._currTrigger,
                        triggerHandles = this._eventHandles.trigger;

                    this._setTriggerContent(node);

                    triggerHandles.mouseMove = Y.on("mousemove", Y.bind(this._onNodeMouseMove, this), node);
                    triggerHandles.mouseOut = Y.on("mouseleave", Y.bind(this._onNodeMouseLeave, this), node);

                    var title = node.getAttribute("title");
                    node.setAttribute("title", "");

                    currTrigger.mouseX = x;
                    currTrigger.mouseY = y;
                    currTrigger.node = node;
                    currTrigger.title = title;
                },

                /*
                 * Clear out the current trigger state, restoring
                 * the title attribute on the trigger node,
                 * if it was originally set.
                 */
                _clearCurrentTrigger : function() {

                    var currTrigger = this._currTrigger,
                        triggerHandles = this._eventHandles.trigger;

                    if (currTrigger.node) {
                        var node = currTrigger.node;
                        var title = currTrigger.title || "";

                        currTrigger.node = null;
                        currTrigger.title = "";

                        triggerHandles.mouseMove.detach();
                        triggerHandles.mouseOut.detach();
                        triggerHandles.mouseMove = null;
                        triggerHandles.mouseOut = null;

                        node.setAttribute("title", title);
                    }
                },

                /*
                 * Cancel any existing show/hide timers
                 */
                _clearTimers : function() {
                    var timers = this._timers;
                    if (timers.hide) {
                        timers.hide.cancel();
                        timers.hide = null;
                    }
                    if (timers.show) {
                      timers.show.cancel();
                      timers.show = null;
                    }
                },

                /*
                 * Detach any stored event handles
                 */
                _clearHandles : function() {
                    var eventHandles = this._eventHandles;

                    if (eventHandles.delegate) {
                        this._eventHandles.delegate.detach();
                    }
                    if (eventHandles.trigger.mouseOut) {
                        eventHandles.trigger.mouseOut.detach();
                    }
                    if (eventHandles.trigger.mouseMove) {
                        eventHandles.trigger.mouseMove.detach();
                    }
                }
            }, {

                // STATIC METHODS/PROPERTIES

                OFFSET_X : 15,
                OFFSET_Y : 15,
                OFFSCREEN_X : OX,
                OFFSCREEN_Y : OY,

                ATTRS : {

                    /*
                     * The tooltip content. This can either be a fixed content value,
                     * or a map of id-to-values, designed to be used when a single
                     * tooltip is mapped to multiple trigger elements.
                     */
                    content : {
                        value: null
                    },

                    /*
                     * The set of nodes to bind to the tooltip instance. Can be a string,
                     * or a node instance.
                     */
                    triggerNodes : {
                        value: null,
                        setter: function(val) {
                            if (val && Lang.isString(val)) {
                                val = Node.all(val);
                            }
                            return val;
                        }
                    },

                    /*
                     * The delegate node to which event listeners should be attached.
                     * This node should be an ancestor of all trigger nodes bound
                     * to the instance. By default the document is used.
                     */
                    delegate : {
                        value: null,
                        setter: function(val) {
                            return Y.one(val) || Y.one("document");
                        }
                    },

                    /*
                     * The time to wait, after the mouse enters the trigger node,
                     * to display the tooltip
                     */
                    showDelay : {
                        value:250
                    },

                    /*
                     * The time to wait, after the mouse leaves the trigger node,
                     * to hide the tooltip
                     */
                    hideDelay : {
                        value:10
                    },

                    /*
                     * The time to wait, after the tooltip is first displayed for
                     * a trigger node, to hide it, if the mouse has not left the
                     * trigger node
                     */
                    autoHideDelay : {
                        value:2000
                    },

                    /*
                     * Override the default visibility set by the widget base class
                     */
                    visible : {
                        value:false
                    },

                    /*
                     * Override the default XY value set by the widget base class,
                     * to position the tooltip offscreen
                     */
                    xy: {
                        value:[OX, OY]
                    }
                }
            });' . '
                var tt = new Tooltip({
                    triggerNodes:".yui3-hastooltip",
                    shim:false,
                    showDelay:500,           // 0.5s
                    autoHideDelay:30000,     /// 30s
                    zIndex:2
                });
                tt.render();


                tt.on("triggerEnter", function(e)
                {
                    var node = e.node;
                    if (!node) {
                        console.log("XXX failed to get node");
                        return;
                    }

                    var node_id = node.get("id");

                    var p1 = node_id.substr(0,7);
                    var p2 = node_id.substr(7,20);
                    if (!isNumber(p2)) {
                        console.log("XXX p2 not a number: " +p2);
                        return;
                    }

                    this.setTriggerContent("loading ...");

                    switch (p1) {
                    case "tt_usr_":
    //                    console.log("show user "+p2);
                        var uri = "/u/tooltip/user/"+p2;

                        // subscribe once to event io:complete
                        Y.once("io:complete", function (id, o)' . '{' . 'var data = o.responseText;' . 'this.setTriggerContent(data);' . '}' . ',this);' . 'var request = Y.io(uri);
                        break;

                    default:
                        console.log("unknown form "+p1);
                        return;
                    }

                });

        });
            ');
    }