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); }
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'); }
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("] ");' . '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/>");' . '}' . '});'); }
/** * @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); }
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); }
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); }
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 ? '&language=' . $this->lang : '') . ($this->region ? '&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>'; }
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; }
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); }
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); }
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(); }
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); }
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); }
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>'; } }
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; }
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} {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); }
/** 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; }
/** 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; } }); }); '); }