diff options
Diffstat (limited to 'lib/dijit')
414 files changed, 0 insertions, 42145 deletions
diff --git a/lib/dijit/BackgroundIframe.js.uncompressed.js b/lib/dijit/BackgroundIframe.js.uncompressed.js deleted file mode 100644 index 06ee17e06..000000000 --- a/lib/dijit/BackgroundIframe.js.uncompressed.js +++ /dev/null @@ -1,110 +0,0 @@ -define("dijit/BackgroundIframe", [ - "require", // require.toUrl - "./main", // to export dijit.BackgroundIframe - "dojo/_base/config", - "dojo/dom-construct", // domConstruct.create - "dojo/dom-style", // domStyle.set - "dojo/_base/lang", // lang.extend lang.hitch - "dojo/on", - "dojo/sniff", // has("ie"), has("mozilla"), has("quirks") - "dojo/_base/window" // win.doc.createElement -], function(require, dijit, config, domConstruct, domStyle, lang, on, has, win){ - - // module: - // dijit/BackgroundIFrame - - // TODO: remove _frames, it isn't being used much, since popups never release their - // iframes (see [22236]) - var _frames = new function(){ - // summary: - // cache of iframes - - var queue = []; - - this.pop = function(){ - var iframe; - if(queue.length){ - iframe = queue.pop(); - iframe.style.display=""; - }else{ - if(has("ie") < 9){ - var burl = config["dojoBlankHtmlUrl"] || require.toUrl("dojo/resources/blank.html") || "javascript:\"\""; - var html="<iframe src='" + burl + "' role='presentation'" - + " style='position: absolute; left: 0px; top: 0px;" - + "z-index: -1; filter:Alpha(Opacity=\"0\");'>"; - iframe = win.doc.createElement(html); - }else{ - iframe = domConstruct.create("iframe"); - iframe.src = 'javascript:""'; - iframe.className = "dijitBackgroundIframe"; - iframe.setAttribute("role", "presentation"); - domStyle.set(iframe, "opacity", 0.1); - } - iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work. - } - return iframe; - }; - - this.push = function(iframe){ - iframe.style.display="none"; - queue.push(iframe); - } - }(); - - - dijit.BackgroundIframe = function(/*DomNode*/ node){ - // summary: - // For IE/FF z-index schenanigans. id attribute is required. - // - // description: - // new dijit.BackgroundIframe(node). - // - // Makes a background iframe as a child of node, that fills - // area (and position) of node - - if(!node.id){ throw new Error("no id"); } - if(has("ie") || has("mozilla")){ - var iframe = (this.iframe = _frames.pop()); - node.appendChild(iframe); - if(has("ie")<7 || has("quirks")){ - this.resize(node); - this._conn = on(node, 'resize', lang.hitch(this, function(){ - this.resize(node); - })); - }else{ - domStyle.set(iframe, { - width: '100%', - height: '100%' - }); - } - } - }; - - lang.extend(dijit.BackgroundIframe, { - resize: function(node){ - // summary: - // Resize the iframe so it's the same size as node. - // Needed on IE6 and IE/quirks because height:100% doesn't work right. - if(this.iframe){ - domStyle.set(this.iframe, { - width: node.offsetWidth + 'px', - height: node.offsetHeight + 'px' - }); - } - }, - destroy: function(){ - // summary: - // destroy the iframe - if(this._conn){ - this._conn.remove(); - this._conn = null; - } - if(this.iframe){ - _frames.push(this.iframe); - delete this.iframe; - } - } - }); - - return dijit.BackgroundIframe; -}); diff --git a/lib/dijit/Calendar.js.uncompressed.js b/lib/dijit/Calendar.js.uncompressed.js deleted file mode 100644 index 8aafae0b6..000000000 --- a/lib/dijit/Calendar.js.uncompressed.js +++ /dev/null @@ -1,312 +0,0 @@ -define("dijit/Calendar", [ - "dojo/_base/array", // array.map - "dojo/date", - "dojo/date/locale", - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.get - "dojo/dom-class", // domClass.add domClass.contains domClass.remove domClass.toggle - "dojo/_base/event", // event.stop - "dojo/_base/kernel", // kernel.deprecated - "dojo/keys", // keys - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("ie") - "./CalendarLite", - "./_Widget", - "./_CssStateMixin", - "./_TemplatedMixin", - "./form/DropDownButton" -], function(array, date, local, declare, domAttr, domClass, event, kernel, keys, lang, has, - CalendarLite, _Widget, _CssStateMixin, _TemplatedMixin, DropDownButton){ - - // module: - // dijit/Calendar - - var Calendar = declare("dijit.Calendar", - [CalendarLite, _Widget, _CssStateMixin], // _Widget for deprecated methods like setAttribute() - { - // summary: - // A simple GUI for choosing a date in the context of a monthly calendar. - // - // description: - // See CalendarLite for general description. Calendar extends CalendarLite, adding: - // - // - month drop down list - // - keyboard navigation - // - CSS classes for hover/mousepress on date, month, and year nodes - // - support of deprecated methods (will be removed in 2.0) - - // Set node classes for various mouse events, see dijit._CssStateMixin for more details - cssStateNodes: { - "decrementMonth": "dijitCalendarArrow", - "incrementMonth": "dijitCalendarArrow", - "previousYearLabelNode": "dijitCalendarPreviousYear", - "nextYearLabelNode": "dijitCalendarNextYear" - }, - - setValue: function(/*Date*/ value){ - // summary: - // Deprecated. Use set('value', ...) instead. - // tags: - // deprecated - kernel.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.", "", "2.0"); - this.set('value', value); - }, - - _createMonthWidget: function(){ - // summary: - // Creates the drop down button that displays the current month and lets user pick a new one - - return new Calendar._MonthDropDownButton({ - id: this.id + "_mddb", - tabIndex: -1, - onMonthSelect: lang.hitch(this, "_onMonthSelect"), - lang: this.lang, - dateLocaleModule: this.dateLocaleModule - }, this.monthNode); - }, - - postCreate: function(){ - this.inherited(arguments); - - // Events specific to Calendar, not used in CalendarLite - this.connect(this.domNode, "onkeydown", "_onKeyDown"); - this.connect(this.dateRowsNode, "onmouseover", "_onDayMouseOver"); - this.connect(this.dateRowsNode, "onmouseout", "_onDayMouseOut"); - this.connect(this.dateRowsNode, "onmousedown", "_onDayMouseDown"); - this.connect(this.dateRowsNode, "onmouseup", "_onDayMouseUp"); - }, - - _onMonthSelect: function(/*Number*/ newMonth){ - // summary: - // Handler for when user selects a month from the drop down list - // tags: - // protected - - // move to selected month, bounding by the number of days in the month - // (ex: jan 31 --> feb 28, not feb 31) - var date = new this.dateClassObj(this.currentFocus); - date.setDate(1); - date.setMonth(newMonth); - var daysInMonth = this.dateModule.getDaysInMonth(date); - var currentDate = this.currentFocus.getDate(); - date.setDate(Math.min(currentDate, daysInMonth)); - this._setCurrentFocusAttr(date); - }, - - _onDayMouseOver: function(/*Event*/ evt){ - // summary: - // Handler for mouse over events on days, sets hovered style - // tags: - // protected - - // event can occur on <td> or the <span> inside the td, - // set node to the <td>. - var node = - domClass.contains(evt.target, "dijitCalendarDateLabel") ? - evt.target.parentNode : - evt.target; - - if(node && ( - (node.dijitDateValue && !domClass.contains(node, "dijitCalendarDisabledDate")) - || node == this.previousYearLabelNode || node == this.nextYearLabelNode - )){ - domClass.add(node, "dijitCalendarHoveredDate"); - this._currentNode = node; - } - }, - - _onDayMouseOut: function(/*Event*/ evt){ - // summary: - // Handler for mouse out events on days, clears hovered style - // tags: - // protected - - if(!this._currentNode){ return; } - - // if mouse out occurs moving from <td> to <span> inside <td>, ignore it - if(evt.relatedTarget && evt.relatedTarget.parentNode == this._currentNode){ return; } - var cls = "dijitCalendarHoveredDate"; - if(domClass.contains(this._currentNode, "dijitCalendarActiveDate")){ - cls += " dijitCalendarActiveDate"; - } - domClass.remove(this._currentNode, cls); - this._currentNode = null; - }, - - _onDayMouseDown: function(/*Event*/ evt){ - var node = evt.target.parentNode; - if(node && node.dijitDateValue && !domClass.contains(node, "dijitCalendarDisabledDate")){ - domClass.add(node, "dijitCalendarActiveDate"); - this._currentNode = node; - } - }, - - _onDayMouseUp: function(/*Event*/ evt){ - var node = evt.target.parentNode; - if(node && node.dijitDateValue){ - domClass.remove(node, "dijitCalendarActiveDate"); - } - }, - - handleKey: function(/*Event*/ evt){ - // summary: - // Provides keyboard navigation of calendar. - // description: - // Called from _onKeyDown() to handle keypress on a stand alone Calendar, - // and also from `dijit/form/_DateTimeTextBox` to pass a keydown event - // from the `dijit/form/DateTextBox` to be handled in this widget - // returns: - // False if the key was recognized as a navigation key, - // to indicate that the event was handled by Calendar and shouldn't be propagated - // tags: - // protected - var increment = -1, - interval, - newValue = this.currentFocus; - switch(evt.keyCode){ - case keys.RIGHT_ARROW: - increment = 1; - //fallthrough... - case keys.LEFT_ARROW: - interval = "day"; - if(!this.isLeftToRight()){ increment *= -1; } - break; - case keys.DOWN_ARROW: - increment = 1; - //fallthrough... - case keys.UP_ARROW: - interval = "week"; - break; - case keys.PAGE_DOWN: - increment = 1; - //fallthrough... - case keys.PAGE_UP: - interval = evt.ctrlKey || evt.altKey ? "year" : "month"; - break; - case keys.END: - // go to the next month - newValue = this.dateModule.add(newValue, "month", 1); - // subtract a day from the result when we're done - interval = "day"; - //fallthrough... - case keys.HOME: - newValue = new this.dateClassObj(newValue); - newValue.setDate(1); - break; - case keys.ENTER: - case keys.SPACE: - this.set("value", this.currentFocus); - break; - default: - return true; - } - - if(interval){ - newValue = this.dateModule.add(newValue, interval, increment); - } - - this._setCurrentFocusAttr(newValue); - - return false; - }, - - _onKeyDown: function(/*Event*/ evt){ - // summary: - // For handling keypress events on a stand alone calendar - if(!this.handleKey(evt)){ - event.stop(evt); - } - }, - - onValueSelected: function(/*Date*/ /*===== date =====*/){ - // summary: - // Deprecated. Notification that a date cell was selected. It may be the same as the previous value. - // description: - // Formerly used by `dijit/form/_DateTimeTextBox` (and thus `dijit/form/DateTextBox`) - // to get notification when the user has clicked a date. Now onExecute() (above) is used. - // tags: - // protected - }, - - onChange: function(value){ - this.onValueSelected(value); // remove in 2.0 - }, - - getClassForDate: function(/*===== dateObject, locale =====*/){ - // summary: - // May be overridden to return CSS classes to associate with the date entry for the given dateObject, - // for example to indicate a holiday in specified locale. - // dateObject: Date - // locale: String? - // tags: - // extension - -/*===== - return ""; // String -=====*/ - } - }); - - Calendar._MonthDropDownButton = declare("dijit.Calendar._MonthDropDownButton", DropDownButton, { - // summary: - // DropDownButton for the current month. Displays name of current month - // and a list of month names in the drop down - - onMonthSelect: function(){ }, - - postCreate: function(){ - this.inherited(arguments); - this.dropDown = new Calendar._MonthDropDown({ - id: this.id + "_mdd", //do not change this id because it is referenced in the template - onChange: this.onMonthSelect - }); - }, - _setMonthAttr: function(month){ - // summary: - // Set the current month to display as a label - var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month); - this.dropDown.set("months", monthNames); - - // Set name of current month and also fill in spacer element with all the month names - // (invisible) so that the maximum width will affect layout. But not on IE6 because then - // the center <TH> overlaps the right <TH> (due to a browser bug). - this.containerNode.innerHTML = - (has("ie") == 6 ? "" : "<div class='dijitSpacer'>" + this.dropDown.domNode.innerHTML + "</div>") + - "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" + monthNames[month.getMonth()] + "</div>"; - } - }); - - Calendar._MonthDropDown = declare("dijit.Calendar._MonthDropDown", [_Widget, _TemplatedMixin], { - // summary: - // The list-of-months drop down from the MonthDropDownButton - - // months: String[] - // List of names of months, possibly w/some undefined entries for Hebrew leap months - // (ex: ["January", "February", undefined, "April", ...]) - months: [], - - templateString: "<div class='dijitCalendarMonthMenu dijitMenu' " + - "data-dojo-attach-event='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>", - - _setMonthsAttr: function(/*String[]*/ months){ - this.domNode.innerHTML = array.map(months, function(month, idx){ - return month ? "<div class='dijitCalendarMonthLabel' month='" + idx +"'>" + month + "</div>" : ""; - }).join(""); - }, - - _onClick: function(/*Event*/ evt){ - this.onChange(domAttr.get(evt.target, "month")); - }, - - onChange: function(/*Number*/ /*===== month =====*/){ - // summary: - // Callback when month is selected from drop down - }, - - _onMenuHover: function(evt){ - domClass.toggle(evt.target, "dijitCalendarMonthLabelHover", evt.type == "mouseover"); - } - }); - - return Calendar; -}); diff --git a/lib/dijit/CalendarLite.js.uncompressed.js b/lib/dijit/CalendarLite.js.uncompressed.js deleted file mode 100644 index 960cf520d..000000000 --- a/lib/dijit/CalendarLite.js.uncompressed.js +++ /dev/null @@ -1,501 +0,0 @@ -require({cache:{ -'url:dijit/templates/Calendar.html':"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" aria-labelledby=\"${id}_mddb ${id}_year\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div data-dojo-attach-point=\"monthNode\">\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr role=\"row\">\n\t\t\t${!dayCellsHtml}\n\t\t</tr>\n\t</thead>\n\t<tbody data-dojo-attach-point=\"dateRowsNode\" data-dojo-attach-event=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t\t${!dateRowsHtml}\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\" role=\"presentation\">\n\t\t\t\t<div class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span data-dojo-attach-point=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\" role=\"button\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\" role=\"button\" id=\"${id}_year\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\" role=\"button\"></span>\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\n"}}); -define("dijit/CalendarLite", [ - "dojo/_base/array", // array.forEach array.map - "dojo/_base/declare", // declare - "dojo/cldr/supplemental", // cldrSupplemental.getFirstDayOfWeek - "dojo/date", // date - "dojo/date/locale", - "dojo/date/stamp", // stamp.fromISOString - "dojo/dom", // dom.setSelectable - "dojo/dom-class", // domClass.contains - "dojo/_base/event", // event.stop - "dojo/_base/lang", // lang.getObject, lang.hitch - "dojo/sniff", // has("ie") has("webkit") - "dojo/string", // string.substitute - "./_WidgetBase", - "./_TemplatedMixin", - "dojo/text!./templates/Calendar.html", - "./hccss" // not used directly, but sets CSS class on <body> -], function(array, declare, cldrSupplemental, date, locale, stamp, dom, domClass, event, lang, has, string, - _WidgetBase, _TemplatedMixin, template){ - - - // module: - // dijit/CalendarLite - - var CalendarLite = declare("dijit.CalendarLite", [_WidgetBase, _TemplatedMixin], { - // summary: - // Lightweight version of Calendar widget aimed towards mobile use - // - // description: - // A simple GUI for choosing a date in the context of a monthly calendar. - // This widget can't be used in a form because it doesn't serialize the date to an - // `<input>` field. For a form element, use dijit/form/DateTextBox instead. - // - // Note that the parser takes all dates attributes passed in the - // [RFC 3339 format](http://www.faqs.org/rfcs/rfc3339.html), e.g. `2005-06-30T08:05:00-07:00` - // so that they are serializable and locale-independent. - // - // Also note that this widget isn't keyboard accessible; use dijit.Calendar for that - // example: - // | var calendar = new dijit.CalendarLite({}, dojo.byId("calendarNode")); - // - // example: - // | <div data-dojo-type="dijit/CalendarLite"></div> - - // Template for main calendar - templateString: template, - - // Template for cell for a day of the week (ex: M) - dowTemplateString: '<th class="dijitReset dijitCalendarDayLabelTemplate" role="columnheader"><span class="dijitCalendarDayLabel">${d}</span></th>', - - // Templates for a single date (ex: 13), and for a row for a week (ex: 20 21 22 23 24 25 26) - dateTemplateString: '<td class="dijitReset" role="gridcell" data-dojo-attach-point="dateCells"><span class="dijitCalendarDateLabel" data-dojo-attach-point="dateLabels"></span></td>', - weekTemplateString: '<tr class="dijitReset dijitCalendarWeekTemplate" role="row">${d}${d}${d}${d}${d}${d}${d}</tr>', - - // value: Date - // The currently selected Date, initially set to invalid date to indicate no selection. - value: new Date(""), - // TODO: for 2.0 make this a string (ISO format) rather than a Date - - // datePackage: String - // JavaScript namespace to find calendar routines. If unspecified, uses Gregorian calendar routines - // at dojo/date and dojo/date/locale. - datePackage: "", - // TODO: for 2.0, replace datePackage with dateModule and dateLocalModule attributes specifying MIDs, - // or alternately just get rid of this completely and tell user to use module ID remapping - // via require - - // dayWidth: String - // How to represent the days of the week in the calendar header. See locale - dayWidth: "narrow", - - // tabIndex: String - // Order fields are traversed when user hits the tab key - tabIndex: "0", - - // currentFocus: Date - // Date object containing the currently focused date, or the date which would be focused - // if the calendar itself was focused. Also indicates which year and month to display, - // i.e. the current "page" the calendar is on. - currentFocus: new Date(), - - baseClass:"dijitCalendar", - - _isValidDate: function(/*Date*/ value){ - // summary: - // Runs various tests on the value, checking that it's a valid date, rather - // than blank or NaN. - // tags: - // private - return value && !isNaN(value) && typeof value == "object" && - value.toString() != this.constructor.prototype.value.toString(); - }, - - _getValueAttr: function(){ - // summary: - // Support get('value') - - // this.value is set to 1AM, but return midnight, local time for back-compat - if(this.value && !isNaN(this.value)){ - var value = new this.dateClassObj(this.value); - value.setHours(0, 0, 0, 0); - - // If daylight savings pushes midnight to the previous date, fix the Date - // object to point at 1am so it will represent the correct day. See #9366 - if(value.getDate() < this.value.getDate()){ - value = this.dateModule.add(value, "hour", 1); - } - return value; - }else{ - return null; - } - }, - - _setValueAttr: function(/*Date|Number*/ value, /*Boolean*/ priorityChange){ - // summary: - // Support set("value", ...) - // description: - // Set the current date and update the UI. If the date is disabled, the value will - // not change, but the display will change to the corresponding month. - // value: - // Either a Date or the number of seconds since 1970. - // tags: - // protected - if(typeof value == "string"){ - value = stamp.fromISOString(value); - } - value = this._patchDate(value); - - if(this._isValidDate(value) && !this.isDisabledDate(value, this.lang)){ - this._set("value", value); - - // Set focus cell to the new value. Arguably this should only happen when there isn't a current - // focus point. This will also repopulate the grid to new month/year if necessary. - this.set("currentFocus", value); - - // Mark the selected date - this._markSelectedDates([value]); - - if(this._created && (priorityChange || typeof priorityChange == "undefined")){ - this.onChange(this.get('value')); - } - }else{ - // clear value, and mark all dates as unselected - this._set("value", null); - this._markSelectedDates([]); - } - }, - - _patchDate: function(/*Date|Number*/ value){ - // summary: - // Convert Number into Date, or copy Date object. Then, round to nearest day, - // setting to 1am to avoid issues when DST shift occurs at midnight, see #8521, #9366) - if(value){ - value = new this.dateClassObj(value); - value.setHours(1, 0, 0, 0); - } - return value; - }, - - _setText: function(node, text){ - // summary: - // This just sets the content of node to the specified text. - // Can't do "node.innerHTML=text" because of an IE bug w/tables, see #3434. - // tags: - // private - while(node.firstChild){ - node.removeChild(node.firstChild); - } - node.appendChild(node.ownerDocument.createTextNode(text)); - }, - - _populateGrid: function(){ - // summary: - // Fills in the calendar grid with each day (1-31). - // Call this on creation, when moving to a new month. - // tags: - // private - - var month = new this.dateClassObj(this.currentFocus); - month.setDate(1); - - var firstDay = month.getDay(), - daysInMonth = this.dateModule.getDaysInMonth(month), - daysInPreviousMonth = this.dateModule.getDaysInMonth(this.dateModule.add(month, "month", -1)), - today = new this.dateClassObj(), - dayOffset = cldrSupplemental.getFirstDayOfWeek(this.lang); - if(dayOffset > firstDay){ dayOffset -= 7; } - - // Mapping from date (as specified by number returned from Date.valueOf()) to corresponding <td> - this._date2cell = {}; - - // Iterate through dates in the calendar and fill in date numbers and style info - array.forEach(this.dateCells, function(template, idx){ - var i = idx + dayOffset; - var date = new this.dateClassObj(month), - number, clazz = "dijitCalendar", adj = 0; - - if(i < firstDay){ - number = daysInPreviousMonth - firstDay + i + 1; - adj = -1; - clazz += "Previous"; - }else if(i >= (firstDay + daysInMonth)){ - number = i - firstDay - daysInMonth + 1; - adj = 1; - clazz += "Next"; - }else{ - number = i - firstDay + 1; - clazz += "Current"; - } - - if(adj){ - date = this.dateModule.add(date, "month", adj); - } - date.setDate(number); - - if(!this.dateModule.compare(date, today, "date")){ - clazz = "dijitCalendarCurrentDate " + clazz; - } - - if(this.isDisabledDate(date, this.lang)){ - clazz = "dijitCalendarDisabledDate " + clazz; - template.setAttribute("aria-disabled", "true"); - }else{ - clazz = "dijitCalendarEnabledDate " + clazz; - template.removeAttribute("aria-disabled"); - template.setAttribute("aria-selected", "false"); - } - - var clazz2 = this.getClassForDate(date, this.lang); - if(clazz2){ - clazz = clazz2 + " " + clazz; - } - - template.className = clazz + "Month dijitCalendarDateTemplate"; - - // Each cell has an associated integer value representing it's date - var dateVal = date.valueOf(); - this._date2cell[dateVal] = template; - template.dijitDateValue = dateVal; - - // Set Date string (ex: "13"). - this._setText(this.dateLabels[idx], date.getDateLocalized ? date.getDateLocalized(this.lang) : date.getDate()); - }, this); - }, - - _populateControls: function(){ - // summary: - // Fill in localized month, and prev/current/next years - // tags: - // protected - - var month = new this.dateClassObj(this.currentFocus); - month.setDate(1); - - // set name of this month - this.monthWidget.set("month", month); - - var y = month.getFullYear() - 1; - var d = new this.dateClassObj(); - array.forEach(["previous", "current", "next"], function(name){ - d.setFullYear(y++); - this._setText(this[name+"YearLabelNode"], - this.dateLocaleModule.format(d, {selector:'year', locale:this.lang})); - }, this); - }, - - goToToday: function(){ - // summary: - // Sets calendar's value to today's date - this.set('value', new this.dateClassObj()); - }, - - constructor: function(params /*===== , srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree - - this.dateModule = params.datePackage ? lang.getObject(params.datePackage, false) : date; - this.dateClassObj = this.dateModule.Date || Date; - this.dateLocaleModule = params.datePackage ? lang.getObject(params.datePackage+".locale", false) : locale; - }, - - _createMonthWidget: function(){ - // summary: - // Creates the drop down button that displays the current month and lets user pick a new one - - return CalendarLite._MonthWidget({ - id: this.id + "_mw", - lang: this.lang, - dateLocaleModule: this.dateLocaleModule - }, this.monthNode); - }, - - buildRendering: function(){ - // Markup for days of the week (referenced from template) - var d = this.dowTemplateString, - dayNames = this.dateLocaleModule.getNames('days', this.dayWidth, 'standAlone', this.lang), - dayOffset = cldrSupplemental.getFirstDayOfWeek(this.lang); - this.dayCellsHtml = string.substitute([d,d,d,d,d,d,d].join(""), {d: ""}, function(){ - return dayNames[dayOffset++ % 7]; - }); - - // Markup for dates of the month (referenced from template), but without numbers filled in - var r = string.substitute(this.weekTemplateString, {d: this.dateTemplateString}); - this.dateRowsHtml = [r,r,r,r,r,r].join(""); - - // Instantiate from template. - // dateCells and dateLabels arrays filled when _Templated parses my template. - this.dateCells = []; - this.dateLabels = []; - this.inherited(arguments); - - dom.setSelectable(this.domNode, false); - - var dateObj = new this.dateClassObj(this.currentFocus); - - this.monthWidget = this._createMonthWidget(); - - this.set('currentFocus', dateObj, false); // draw the grid to the month specified by currentFocus - }, - - postCreate: function(){ - this.inherited(arguments); - this._connectControls(); - }, - - _connectControls: function(){ - // summary: - // Set up connects for increment/decrement of months/years - // tags: - // protected - - var connect = lang.hitch(this, function(nodeProp, part, amount){ - this.connect(this[nodeProp], "onclick", function(){ - this._setCurrentFocusAttr(this.dateModule.add(this.currentFocus, part, amount)); - }); - }); - - connect("incrementMonth", "month", 1); - connect("decrementMonth", "month", -1); - connect("nextYearLabelNode", "year", 1); - connect("previousYearLabelNode", "year", -1); - }, - - _setCurrentFocusAttr: function(/*Date*/ date, /*Boolean*/ forceFocus){ - // summary: - // If the calendar currently has focus, then focuses specified date, - // changing the currently displayed month/year if necessary. - // If the calendar doesn't have focus, updates currently - // displayed month/year, and sets the cell that will get focus - // when Calendar is focused. - // forceFocus: - // If true, will focus() the cell even if calendar itself doesn't have focus - - var oldFocus = this.currentFocus, - oldCell = this._getNodeByDate(oldFocus); - date = this._patchDate(date); - - this._set("currentFocus", date); - - // If the focus is on a different month than the current calendar month, switch the displayed month. - // Also will populate the grid initially, on Calendar creation. - if(!this._date2cell || this.dateModule.difference(oldFocus, date, "month") != 0){ - this._populateGrid(); - this._populateControls(); - this._markSelectedDates([this.value]); - } - - // set tabIndex=0 on new cell, and focus it (but only if Calendar itself is focused) - var newCell = this._getNodeByDate(date); - newCell.setAttribute("tabIndex", this.tabIndex); - if(this.focused || forceFocus){ - newCell.focus(); - } - - // set tabIndex=-1 on old focusable cell - if(oldCell && oldCell != newCell){ - if(has("webkit")){ // see #11064 about webkit bug - oldCell.setAttribute("tabIndex", "-1"); - }else{ - oldCell.removeAttribute("tabIndex"); - } - } - }, - - focus: function(){ - // summary: - // Focus the calendar by focusing one of the calendar cells - this._setCurrentFocusAttr(this.currentFocus, true); - }, - - _onDayClick: function(/*Event*/ evt){ - // summary: - // Handler for day clicks, selects the date if appropriate - // tags: - // protected - event.stop(evt); - for(var node = evt.target; node && !node.dijitDateValue; node = node.parentNode); - if(node && !domClass.contains(node, "dijitCalendarDisabledDate")){ - this.set('value', node.dijitDateValue); - } - }, - - _getNodeByDate : function(/*Date*/ value){ - // summary: - // Returns the cell corresponding to the date, or null if the date is not within the currently - // displayed month. - value = this._patchDate(value); - return value && this._date2cell ? this._date2cell[value.valueOf()] : null; - }, - - _markSelectedDates: function(/*Date[]*/ dates){ - // summary: - // Marks the specified cells as selected, and clears cells previously marked as selected. - // For CalendarLite at most one cell is selected at any point, but this allows an array - // for easy subclassing. - - // Function to mark a cell as selected or unselected - function mark(/*Boolean*/ selected, /*DomNode*/ cell){ - domClass.toggle(cell, "dijitCalendarSelectedDate", selected); - cell.setAttribute("aria-selected", selected ? "true" : "false"); - } - - // Clear previously selected cells. - array.forEach(this._selectedCells || [], lang.partial(mark, false)); - - // Mark newly selected cells. Ignore dates outside the currently displayed month. - this._selectedCells = array.filter(array.map(dates, this._getNodeByDate, this), function(n){ return n;}); - array.forEach(this._selectedCells, lang.partial(mark, true)); - }, - - onChange: function(/*Date*/ /*===== date =====*/){ - // summary: - // Called only when the selected date has changed - }, - - isDisabledDate: function(/*===== dateObject, locale =====*/){ - // summary: - // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend` - // dateObject: Date - // locale: String? - // tags: - // extension -/*===== - return false; // Boolean -=====*/ - }, - - getClassForDate: function(/*===== dateObject, locale =====*/){ - // summary: - // May be overridden to return CSS classes to associate with the date entry for the given dateObject, - // for example to indicate a holiday in specified locale. - // dateObject: Date - // locale: String? - // tags: - // extension - -/*===== - return ""; // String -=====*/ - } - }); - - CalendarLite._MonthWidget = declare("dijit.CalendarLite._MonthWidget", _WidgetBase, { - // summary: - // Displays name of current month padded to the width of the month - // w/the longest name, so that changing months doesn't change width. - // - // Create as: - // | new Calendar._MonthWidget({ - // | lang: ..., - // | dateLocaleModule: ... - // | }) - - _setMonthAttr: function(month){ - // summary: - // Set the current month to display as a label - var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month), - spacer = - (has("ie") == 6 ? "" : "<div class='dijitSpacer'>" + - array.map(monthNames, function(s){ return "<div>" + s + "</div>"; }).join("") + "</div>"); - - // Set name of current month and also fill in spacer element with all the month names - // (invisible) so that the maximum width will affect layout. But not on IE6 because then - // the center <TH> overlaps the right <TH> (due to a browser bug). - this.domNode.innerHTML = - spacer + - "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" + - monthNames[month.getMonth()] + "</div>"; - } - }); - - return CalendarLite; -}); diff --git a/lib/dijit/CheckedMenuItem.js.uncompressed.js b/lib/dijit/CheckedMenuItem.js.uncompressed.js deleted file mode 100644 index b28a9887d..000000000 --- a/lib/dijit/CheckedMenuItem.js.uncompressed.js +++ /dev/null @@ -1,53 +0,0 @@ -require({cache:{ -'url:dijit/templates/CheckedMenuItem.html':"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">✓</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\"> </td>\n</tr>\n"}}); -define("dijit/CheckedMenuItem", [ - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.toggle - "./MenuItem", - "dojo/text!./templates/CheckedMenuItem.html", - "./hccss" -], function(declare, domClass, MenuItem, template){ - - // module: - // dijit/CheckedMenuItem - - return declare("dijit.CheckedMenuItem", MenuItem, { - // summary: - // A checkbox-like menu item for toggling on and off - - templateString: template, - - // checked: Boolean - // Our checked state - checked: false, - _setCheckedAttr: function(/*Boolean*/ checked){ - // summary: - // Hook so attr('checked', bool) works. - // Sets the class and state for the check box. - domClass.toggle(this.domNode, "dijitCheckedMenuItemChecked", checked); - this.domNode.setAttribute("aria-checked", checked ? "true" : "false"); - this._set("checked", checked); - }, - - iconClass: "", // override dijitNoIcon - - onChange: function(/*Boolean*/ /*===== checked =====*/){ - // summary: - // User defined function to handle check/uncheck events - // tags: - // callback - }, - - _onClick: function(evt){ - // summary: - // Clicking this item just toggles its state - // tags: - // private - if(!this.disabled){ - this.set("checked", !this.checked); - this.onChange(this.checked); - } - this.onClick(evt); - } - }); -}); diff --git a/lib/dijit/ColorPalette.js.uncompressed.js b/lib/dijit/ColorPalette.js.uncompressed.js deleted file mode 100644 index af406bec8..000000000 --- a/lib/dijit/ColorPalette.js.uncompressed.js +++ /dev/null @@ -1,161 +0,0 @@ -require({cache:{ -'url:dijit/templates/ColorPalette.html':"<div class=\"dijitInline dijitColorPalette\">\n\t<table dojoAttachPoint=\"paletteTableNode\" class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\" role=\"grid\">\n\t\t<tbody data-dojo-attach-point=\"gridNode\"></tbody>\n\t</table>\n</div>\n"}}); -define("dijit/ColorPalette", [ - "require", // require.toUrl - "dojo/text!./templates/ColorPalette.html", - "./_Widget", // used also to load dijit/hccss for setting has("highcontrast") - "./_TemplatedMixin", - "./_PaletteMixin", - "./hccss", // has("highcontrast") - "dojo/i18n", // i18n.getLocalization - "dojo/_base/Color", // dojo.Color dojo.Color.named - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.place - "dojo/string", // string.substitute - "dojo/i18n!dojo/nls/colors", // translations - "dojo/colors" // extend dojo.Color w/names of other colors -], function(require, template, _Widget, _TemplatedMixin, _PaletteMixin, has, i18n, Color, - declare, domConstruct, string){ - -// module: -// dijit/ColorPalette - -var ColorPalette = declare("dijit.ColorPalette", [_Widget, _TemplatedMixin, _PaletteMixin], { - // summary: - // A keyboard accessible color-picking widget - // description: - // Grid showing various colors, so the user can pick a certain color. - // Can be used standalone, or as a popup. - // - // example: - // | <div data-dojo-type="dijit/ColorPalette"></div> - // - // example: - // | var picker = new dijit.ColorPalette({ },srcNode); - // | picker.startup(); - - - // palette: [const] String - // Size of grid, either "7x10" or "3x4". - palette: "7x10", - - // _palettes: [protected] Map - // This represents the value of the colors. - // The first level is a hashmap of the different palettes available. - // The next two dimensions represent the columns and rows of colors. - _palettes: { - "7x10": [["white", "seashell", "cornsilk", "lemonchiffon","lightyellow", "palegreen", "paleturquoise", "lightcyan", "lavender", "plum"], - ["lightgray", "pink", "bisque", "moccasin", "khaki", "lightgreen", "lightseagreen", "lightskyblue", "cornflowerblue", "violet"], - ["silver", "lightcoral", "sandybrown", "orange", "palegoldenrod", "chartreuse", "mediumturquoise", "skyblue", "mediumslateblue","orchid"], - ["gray", "red", "orangered", "darkorange", "yellow", "limegreen", "darkseagreen", "royalblue", "slateblue", "mediumorchid"], - ["dimgray", "crimson", "chocolate", "coral", "gold", "forestgreen", "seagreen", "blue", "blueviolet", "darkorchid"], - ["darkslategray","firebrick","saddlebrown", "sienna", "olive", "green", "darkcyan", "mediumblue","darkslateblue", "darkmagenta" ], - ["black", "darkred", "maroon", "brown", "darkolivegreen", "darkgreen", "midnightblue", "navy", "indigo", "purple"]], - - "3x4": [["white", "lime", "green", "blue"], - ["silver", "yellow", "fuchsia", "navy"], - ["gray", "red", "purple", "black"]] - }, - - // templateString: String - // The template of this widget. - templateString: template, - - baseClass: "dijitColorPalette", - - _dyeFactory: function(value, row, col, title){ - // Overrides _PaletteMixin._dyeFactory(). - return new this._dyeClass(value, row, col, title); - }, - - buildRendering: function(){ - // Instantiate the template, which makes a skeleton into which we'll insert a bunch of - // <img> nodes - this.inherited(arguments); - - // Creates customized constructor for dye class (color of a single cell) for - // specified palette and high-contrast vs. normal mode. Used in _getDye(). - this._dyeClass = declare(ColorPalette._Color, { - palette: this.palette - }); - - // Creates <img> nodes in each cell of the template. - this._preparePalette( - this._palettes[this.palette], - i18n.getLocalization("dojo", "colors", this.lang)); - } -}); - -ColorPalette._Color = declare("dijit._Color", Color, { - // summary: - // Object associated with each cell in a ColorPalette palette. - // Implements dijit/Dye. - - // Template for each cell in normal (non-high-contrast mode). Each cell contains a wrapper - // node for showing the border (called dijitPaletteImg for back-compat), and dijitColorPaletteSwatch - // for showing the color. - template: - "<span class='dijitInline dijitPaletteImg'>" + - "<img src='${blankGif}' alt='${alt}' title='${title}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>" + - "</span>", - - // Template for each cell in high contrast mode. Each cell contains an image with the whole palette, - // but scrolled and clipped to show the correct color only - hcTemplate: - "<span class='dijitInline dijitPaletteImg' style='position: relative; overflow: hidden; height: 12px; width: 14px;'>" + - "<img src='${image}' alt='${alt}' title='${title}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>" + - "</span>", - - // _imagePaths: [protected] Map - // This is stores the path to the palette images used for high-contrast mode display - _imagePaths: { - "7x10": require.toUrl("./themes/a11y/colors7x10.png"), - "3x4": require.toUrl("./themes/a11y/colors3x4.png") - }, - - constructor: function(alias, row, col, title){ - // summary: - // Constructor for ColorPalette._Color - // alias: String - // English name of the color. - // row: Number - // Vertical position in grid. - // column: Number - // Horizontal position in grid. - // title: String - // Localized name of the color. - this._title = title; - this._row = row; - this._col = col; - this.setColor(Color.named[alias]); - }, - - getValue: function(){ - // summary: - // Note that although dijit._Color is initialized with a value like "white" getValue() always - // returns a hex value - return this.toHex(); - }, - - fillCell: function(/*DOMNode*/ cell, /*String*/ blankGif){ - var html = string.substitute(has("highcontrast") ? this.hcTemplate : this.template, { - // substitution variables for normal mode - color: this.toHex(), - blankGif: blankGif, - alt: this._title, - title: this._title, - - // variables used for high contrast mode - image: this._imagePaths[this.palette].toString(), - left: this._col * -20 - 5, - top: this._row * -20 - 5, - size: this.palette == "7x10" ? "height: 145px; width: 206px" : "height: 64px; width: 86px" - }); - - domConstruct.place(html, cell); - } -}); - - -return ColorPalette; -}); diff --git a/lib/dijit/Declaration.js.uncompressed.js b/lib/dijit/Declaration.js.uncompressed.js deleted file mode 100644 index 0b4bc28bf..000000000 --- a/lib/dijit/Declaration.js.uncompressed.js +++ /dev/null @@ -1,105 +0,0 @@ -define("dijit/Declaration", [ - "dojo/_base/array", // array.forEach array.map - "dojo/_base/connect", // connect.connect - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.getObject - "dojo/parser", // parser._functionFromScript - "dojo/query", // query - "./_Widget", - "./_TemplatedMixin", - "./_WidgetsInTemplateMixin", - "dojo/NodeList-dom" -], function(array, connect, declare, lang, parser, query, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin){ - - // module: - // dijit/Declaration - - return declare("dijit.Declaration", _Widget, { - // summary: - // The Declaration widget allows a developer to declare new widget - // classes directly from a snippet of markup. - - // _noScript: [private] Boolean - // Flag to parser to leave alone the script tags contained inside of me - _noScript: true, - - // stopParser: [private] Boolean - // Flag to parser to not try and parse widgets declared inside of me - stopParser: true, - - // widgetClass: [const] String - // Name of class being declared, ex: "acme.myWidget" - widgetClass: "", - - // propList: [const] Object - // Set of attributes for this widget along with default values, ex: - // {delay: 100, title: "hello world"} - defaults: null, - - // mixins: [const] String[] - // List containing the prototype for this widget, and also any mixins, - // ex: ["dijit._Widget", "dijit._Container"] - mixins: [], - - buildRendering: function(){ - var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef), - methods = query("> script[type^='dojo/method']", src).orphan(), - connects = query("> script[type^='dojo/connect']", src).orphan(), - srcType = src.nodeName; - - var propList = this.defaults || {}; - - // For all methods defined like <script type="dojo/method" data-dojo-event="foo">, - // add that method to prototype. - // If there's no "event" specified then it's code to run on instantiation, - // so it becomes a connection to "postscript" (handled below). - array.forEach(methods, function(s){ - var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event"), - func = parser._functionFromScript(s); - if(evt){ - propList[evt] = func; - }else{ - connects.push(s); - } - }); - - // map array of strings like [ "dijit.form.Button" ] to array of mixin objects - // (note that array.map(this.mixins, lang.getObject) doesn't work because it passes - // a bogus third argument to getObject(), confusing it) - if(this.mixins.length){ - this.mixins = array.map(this.mixins, function(name){ return lang.getObject(name); } ); - }else{ - this.mixins = [ _Widget, _TemplatedMixin, _WidgetsInTemplateMixin ]; - } - - propList._skipNodeCache = true; - propList.templateString = - "<"+srcType+" class='"+src.className+"'" + - " data-dojo-attach-point='"+ - (src.getAttribute("data-dojo-attach-point") || src.getAttribute("dojoAttachPoint") || '')+ - "' data-dojo-attach-event='"+ - (src.getAttribute("data-dojo-attach-event") || src.getAttribute("dojoAttachEvent") || '')+ - "' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">"; - - // create the new widget class - var wc = declare( - this.widgetClass, - this.mixins, - propList - ); - - // Handle <script> blocks of form: - // <script type="dojo/connect" data-dojo-event="foo"> - // and - // <script type="dojo/method"> - // (Note that the second one is just shorthand for a dojo/connect to postscript) - // Since this is a connect in the declaration, we are actually connection to the method - // in the _prototype_. - array.forEach(connects, function(s){ - var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event") || "postscript", - func = parser._functionFromScript(s); - connect.connect(wc.prototype, evt, func); - }); - } - }); -}); diff --git a/lib/dijit/Destroyable.js.uncompressed.js b/lib/dijit/Destroyable.js.uncompressed.js deleted file mode 100644 index ee6b8893e..000000000 --- a/lib/dijit/Destroyable.js.uncompressed.js +++ /dev/null @@ -1,59 +0,0 @@ -define("dijit/Destroyable", [ - "dojo/_base/array", // array.forEach array.map - "dojo/aspect", - "dojo/_base/declare" -], function(array, aspect, declare){ - -// module: -// dijit/Destroyable - -return declare("dijit.Destroyable", null, { - // summary: - // Mixin to track handles and release them when instance is destroyed. - // description: - // Call this.own(...) on list of handles (returned from dojo/aspect, dojo/on, - // dojo/Stateful::watch, or any class (including widgets) with a destroyRecursive() or destroy() method. - // Then call destroy() later to destroy this instance and release the resources. - - destroy: function(/*Boolean*/ preserveDom){ - // summary: - // Destroy this class, releasing any resources registered via own(). - this._destroyed = true; - }, - - own: function(){ - // summary: - // Track specified handles and remove/destroy them when this instance is destroyed, unless they were - // already removed/destroyed manually. - // tags: - // protected - // returns: - // The array of specified handles, so you can do for example: - // | var handle = this.own(on(...))[0]; - - array.forEach(arguments, function(handle){ - var destroyMethodName = - "destroyRecursive" in handle ? "destroyRecursive" : // remove "destroyRecursive" for 2.0 - "destroy" in handle ? "destroy" : - "remove"; - - // When this.destroy() is called, destroy handle. Since I'm using aspect.before(), - // the handle will be destroyed before a subclass's destroy() method starts running, before it calls - // this.inherited() or even if it doesn't call this.inherited() at all. If that's an issue, make an - // onDestroy() method and connect to that instead. - var odh = aspect.before(this, "destroy", function(preserveDom){ - handle[destroyMethodName](preserveDom); - }); - - // If handle is destroyed manually before this.destroy() is called, remove the listener set directly above. - var hdh = aspect.after(handle, destroyMethodName, function(){ - odh.remove(); - hdh.remove(); - }, true); - }, this); - - return arguments; // handle - } -}); - -}); diff --git a/lib/dijit/Dialog.js.uncompressed.js b/lib/dijit/Dialog.js.uncompressed.js deleted file mode 100644 index 5122b716a..000000000 --- a/lib/dijit/Dialog.js.uncompressed.js +++ /dev/null @@ -1,661 +0,0 @@ -require({cache:{ -'url:dijit/templates/Dialog.html':"<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div data-dojo-attach-point=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t\t<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"\n\t\t\t\trole=\"heading\" level=\"1\"></span>\n\t\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t\t</span>\n\t</div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"}}); -define("dijit/Dialog", [ - "require", - "dojo/_base/array", // array.forEach array.indexOf array.map - "dojo/_base/connect", // connect._keypress - "dojo/_base/declare", // declare - "dojo/_base/Deferred", // Deferred - "dojo/dom", // dom.isDescendant - "dojo/dom-class", // domClass.add domClass.contains - "dojo/dom-geometry", // domGeometry.position - "dojo/dom-style", // domStyle.set - "dojo/_base/event", // event.stop - "dojo/_base/fx", // fx.fadeIn fx.fadeOut - "dojo/i18n", // i18n.getLocalization - "dojo/keys", - "dojo/_base/lang", // lang.mixin lang.hitch - "dojo/on", - "dojo/ready", - "dojo/sniff", // has("ie") has("opera") has("dijit-legacy-requires") - "dojo/window", // winUtils.getBox, winUtils.get - "dojo/dnd/Moveable", // Moveable - "dojo/dnd/TimedMoveable", // TimedMoveable - "./focus", - "./_base/manager", // manager.defaultDuration - "./_Widget", - "./_TemplatedMixin", - "./_CssStateMixin", - "./form/_FormMixin", - "./_DialogMixin", - "./DialogUnderlay", - "./layout/ContentPane", - "dojo/text!./templates/Dialog.html", - "./main", // for back-compat, exporting dijit._underlay (remove in 2.0) - "dojo/i18n!./nls/common" -], function(require, array, connect, declare, Deferred, - dom, domClass, domGeometry, domStyle, event, fx, i18n, keys, lang, on, ready, has, winUtils, - Moveable, TimedMoveable, focus, manager, _Widget, _TemplatedMixin, _CssStateMixin, _FormMixin, _DialogMixin, - DialogUnderlay, ContentPane, template, dijit){ - - // module: - // dijit/Dialog - - /*===== - dijit._underlay = function(kwArgs){ - // summary: - // A shared instance of a `dijit.DialogUnderlay` - // - // description: - // A shared instance of a `dijit.DialogUnderlay` created and - // used by `dijit.Dialog`, though never created until some Dialog - // or subclass thereof is shown. - }; - =====*/ - - var _DialogBase = declare("dijit._DialogBase", [_TemplatedMixin, _FormMixin, _DialogMixin, _CssStateMixin], { - templateString: template, - - baseClass: "dijitDialog", - - cssStateNodes: { - closeButtonNode: "dijitDialogCloseIcon" - }, - - // Map widget attributes to DOMNode attributes. - _setTitleAttr: [ - { node: "titleNode", type: "innerHTML" }, - { node: "titleBar", type: "attribute" } - ], - - // open: [readonly] Boolean - // True if Dialog is currently displayed on screen. - open: false, - - // duration: Integer - // The time in milliseconds it takes the dialog to fade in and out - duration: manager.defaultDuration, - - // refocus: Boolean - // A Toggle to modify the default focus behavior of a Dialog, which - // is to re-focus the element which had focus before being opened. - // False will disable refocusing. Default: true - refocus: true, - - // autofocus: Boolean - // A Toggle to modify the default focus behavior of a Dialog, which - // is to focus on the first dialog element after opening the dialog. - // False will disable autofocusing. Default: true - autofocus: true, - - // _firstFocusItem: [private readonly] DomNode - // The pointer to the first focusable node in the dialog. - // Set by `dijit/_DialogMixin._getFocusItems()`. - _firstFocusItem: null, - - // _lastFocusItem: [private readonly] DomNode - // The pointer to which node has focus prior to our dialog. - // Set by `dijit/_DialogMixin._getFocusItems()`. - _lastFocusItem: null, - - // doLayout: [protected] Boolean - // Don't change this parameter from the default value. - // This ContentPane parameter doesn't make sense for Dialog, since Dialog - // is never a child of a layout container, nor can you specify the size of - // Dialog in order to control the size of an inner widget. - doLayout: false, - - // draggable: Boolean - // Toggles the moveable aspect of the Dialog. If true, Dialog - // can be dragged by it's title. If false it will remain centered - // in the viewport. - draggable: true, - - _setDraggableAttr: function(/*Boolean*/ val){ - // Avoid _WidgetBase behavior of copying draggable attribute to this.domNode, - // as that prevents text select on modern browsers (#14452) - this._set("draggable", val); - }, - - // aria-describedby: String - // Allows the user to add an aria-describedby attribute onto the dialog. The value should - // be the id of the container element of text that describes the dialog purpose (usually - // the first text in the dialog). - // | <div data-dojo-type="dijit/Dialog" aria-describedby="intro" .....> - // | <div id="intro">Introductory text</div> - // | <div>rest of dialog contents</div> - // | </div> - "aria-describedby": "", - - // maxRatio: Number - // Maximum size to allow the dialog to expand to, relative to viewport size - maxRatio: 0.9, - - postMixInProperties: function(){ - var _nlsResources = i18n.getLocalization("dijit", "common"); - lang.mixin(this, _nlsResources); - this.inherited(arguments); - }, - - postCreate: function(){ - domStyle.set(this.domNode, { - display: "none", - position:"absolute" - }); - this.ownerDocumentBody.appendChild(this.domNode); - - this.inherited(arguments); - - this.connect(this, "onExecute", "hide"); - this.connect(this, "onCancel", "hide"); - this._modalconnects = []; - }, - - onLoad: function(){ - // summary: - // Called when data has been loaded from an href. - // Unlike most other callbacks, this function can be connected to (via `dojo.connect`) - // but should *not* be overridden. - // tags: - // callback - - // when href is specified we need to reposition the dialog after the data is loaded - // and find the focusable elements - this._position(); - if(this.autofocus && DialogLevelManager.isTop(this)){ - this._getFocusItems(this.domNode); - focus.focus(this._firstFocusItem); - } - this.inherited(arguments); - }, - - _onBlur: function(by){ - this.inherited(arguments); - - // If focus was accidentally removed from the dialog, such as if the user clicked a blank - // area of the screen, or clicked the browser's address bar and then tabbed into the page, - // then refocus. Won't do anything if focus was removed because the Dialog was closed, or - // because a new Dialog popped up on top of the old one. - var refocus = lang.hitch(this, function(){ - if(this.open && !this._destroyed && DialogLevelManager.isTop(this)){ - this._getFocusItems(this.domNode); - focus.focus(this._firstFocusItem); - } - }); - if(by == "mouse"){ - // wait for mouse up, and then refocus dialog; otherwise doesn't work - on.once(this.ownerDocument, "mouseup", refocus); - }else{ - refocus(); - } - }, - - _endDrag: function(){ - // summary: - // Called after dragging the Dialog. Saves the position of the dialog in the viewport, - // and also adjust position to be fully within the viewport, so user doesn't lose access to handle - var nodePosition = domGeometry.position(this.domNode), - viewport = winUtils.getBox(this.ownerDocument); - nodePosition.y = Math.min(Math.max(nodePosition.y, 0), (viewport.h - nodePosition.h)); - nodePosition.x = Math.min(Math.max(nodePosition.x, 0), (viewport.w - nodePosition.w)); - this._relativePosition = nodePosition; - this._position(); - }, - - _setup: function(){ - // summary: - // Stuff we need to do before showing the Dialog for the first - // time (but we defer it until right beforehand, for - // performance reasons). - // tags: - // private - - var node = this.domNode; - - if(this.titleBar && this.draggable){ - this._moveable = new ((has("ie") == 6) ? TimedMoveable // prevent overload, see #5285 - : Moveable)(node, { handle: this.titleBar }); - this.connect(this._moveable, "onMoveStop", "_endDrag"); - }else{ - domClass.add(node,"dijitDialogFixed"); - } - - this.underlayAttrs = { - dialogId: this.id, - "class": array.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" "), - ownerDocument: this.ownerDocument - }; - }, - - _size: function(){ - // summary: - // If necessary, shrink dialog contents so dialog fits in viewport - // tags: - // private - - this._checkIfSingleChild(); - - // If we resized the dialog contents earlier, reset them back to original size, so - // that if the user later increases the viewport size, the dialog can display w/out a scrollbar. - // Need to do this before the domGeometry.position(this.domNode) call below. - if(this._singleChild){ - if(typeof this._singleChildOriginalStyle != "undefined"){ - this._singleChild.domNode.style.cssText = this._singleChildOriginalStyle; - delete this._singleChildOriginalStyle; - } - }else{ - domStyle.set(this.containerNode, { - width:"auto", - height:"auto" - }); - } - - var bb = domGeometry.position(this.domNode); - - // Get viewport size but then reduce it by a bit; Dialog should always have some space around it - // to indicate that it's a popup. This will also compensate for possible scrollbars on viewport. - var viewport = winUtils.getBox(this.ownerDocument); - viewport.w *= this.maxRatio; - viewport.h *= this.maxRatio; - - if(bb.w >= viewport.w || bb.h >= viewport.h){ - // Reduce size of dialog contents so that dialog fits in viewport - - var containerSize = domGeometry.position(this.containerNode), - w = Math.min(bb.w, viewport.w) - (bb.w - containerSize.w), - h = Math.min(bb.h, viewport.h) - (bb.h - containerSize.h); - - if(this._singleChild && this._singleChild.resize){ - if(typeof this._singleChildOriginalStyle == "undefined"){ - this._singleChildOriginalStyle = this._singleChild.domNode.style.cssText; - } - this._singleChild.resize({w: w, h: h}); - }else{ - domStyle.set(this.containerNode, { - width: w + "px", - height: h + "px", - overflow: "auto", - position: "relative" // workaround IE bug moving scrollbar or dragging dialog - }); - } - }else{ - if(this._singleChild && this._singleChild.resize){ - this._singleChild.resize(); - } - } - }, - - _position: function(){ - // summary: - // Position modal dialog in the viewport. If no relative offset - // in the viewport has been determined (by dragging, for instance), - // center the node. Otherwise, use the Dialog's stored relative offset, - // and position the node to top: left: values based on the viewport. - if(!domClass.contains(this.ownerDocumentBody, "dojoMove")){ // don't do anything if called during auto-scroll - var node = this.domNode, - viewport = winUtils.getBox(this.ownerDocument), - p = this._relativePosition, - bb = p ? null : domGeometry.position(node), - l = Math.floor(viewport.l + (p ? p.x : (viewport.w - bb.w) / 2)), - t = Math.floor(viewport.t + (p ? p.y : (viewport.h - bb.h) / 2)) - ; - domStyle.set(node,{ - left: l + "px", - top: t + "px" - }); - } - }, - - _onKey: function(/*Event*/ evt){ - // summary: - // Handles the keyboard events for accessibility reasons - // tags: - // private - - if(evt.charOrCode){ - var node = evt.target; - if(evt.charOrCode === keys.TAB){ - this._getFocusItems(this.domNode); - } - var singleFocusItem = (this._firstFocusItem == this._lastFocusItem); - // see if we are shift-tabbing from first focusable item on dialog - if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === keys.TAB){ - if(!singleFocusItem){ - focus.focus(this._lastFocusItem); // send focus to last item in dialog - } - event.stop(evt); - }else if(node == this._lastFocusItem && evt.charOrCode === keys.TAB && !evt.shiftKey){ - if(!singleFocusItem){ - focus.focus(this._firstFocusItem); // send focus to first item in dialog - } - event.stop(evt); - }else{ - // see if the key is for the dialog - while(node){ - if(node == this.domNode || domClass.contains(node, "dijitPopup")){ - if(evt.charOrCode == keys.ESCAPE){ - this.onCancel(); - }else{ - return; // just let it go - } - } - node = node.parentNode; - } - // this key is for the disabled document window - if(evt.charOrCode !== keys.TAB){ // allow tabbing into the dialog for a11y - event.stop(evt); - // opera won't tab to a div - }else if(!has("opera")){ - try{ - this._firstFocusItem.focus(); - }catch(e){ /*squelch*/ } - } - } - } - }, - - show: function(){ - // summary: - // Display the dialog - // returns: dojo/_base/Deferred - // Deferred object that resolves when the display animation is complete - - if(this.open){ return; } - - if(!this._started){ - this.startup(); - } - - // first time we show the dialog, there's some initialization stuff to do - if(!this._alreadyInitialized){ - this._setup(); - this._alreadyInitialized=true; - } - - if(this._fadeOutDeferred){ - this._fadeOutDeferred.cancel(); - } - - // Recenter Dialog if user scrolls browser. Connecting to document doesn't work on IE, need to use window. - var win = winUtils.get(this.ownerDocument); - this._modalconnects.push(on(win, "scroll", lang.hitch(this, "resize"))); - - this._modalconnects.push(on(this.domNode, connect._keypress, lang.hitch(this, "_onKey"))); - - domStyle.set(this.domNode, { - opacity:0, - display:"" - }); - - this._set("open", true); - this._onShow(); // lazy load trigger - - this._size(); - this._position(); - - // fade-in Animation object, setup below - var fadeIn; - - this._fadeInDeferred = new Deferred(lang.hitch(this, function(){ - fadeIn.stop(); - delete this._fadeInDeferred; - })); - - fadeIn = fx.fadeIn({ - node: this.domNode, - duration: this.duration, - beforeBegin: lang.hitch(this, function(){ - DialogLevelManager.show(this, this.underlayAttrs); - }), - onEnd: lang.hitch(this, function(){ - if(this.autofocus && DialogLevelManager.isTop(this)){ - // find focusable items each time dialog is shown since if dialog contains a widget the - // first focusable items can change - this._getFocusItems(this.domNode); - focus.focus(this._firstFocusItem); - } - this._fadeInDeferred.resolve(true); - delete this._fadeInDeferred; - }) - }).play(); - - return this._fadeInDeferred; - }, - - hide: function(){ - // summary: - // Hide the dialog - // returns: dojo/_base/Deferred - // Deferred object that resolves when the hide animation is complete - - // If we haven't been initialized yet then we aren't showing and we can just return. - // Likewise if we are already hidden, or are currently fading out. - if(!this._alreadyInitialized || !this.open){ - return; - } - if(this._fadeInDeferred){ - this._fadeInDeferred.cancel(); - } - - // fade-in Animation object, setup below - var fadeOut; - - this._fadeOutDeferred = new Deferred(lang.hitch(this, function(){ - fadeOut.stop(); - delete this._fadeOutDeferred; - })); - // fire onHide when the promise resolves. - this._fadeOutDeferred.then(lang.hitch(this, 'onHide')); - - fadeOut = fx.fadeOut({ - node: this.domNode, - duration: this.duration, - onEnd: lang.hitch(this, function(){ - this.domNode.style.display = "none"; - DialogLevelManager.hide(this); - this._fadeOutDeferred.resolve(true); - delete this._fadeOutDeferred; - }) - }).play(); - - if(this._scrollConnected){ - this._scrollConnected = false; - } - var h; - while(h = this._modalconnects.pop()){ - h.remove(); - } - - if(this._relativePosition){ - delete this._relativePosition; - } - this._set("open", false); - - return this._fadeOutDeferred; - }, - - resize: function(){ - // summary: - // Called when viewport scrolled or size changed. Position the Dialog and the underlay. - // tags: - // private - if(this.domNode.style.display != "none"){ - if(DialogUnderlay._singleton){ // avoid race condition during show() - DialogUnderlay._singleton.layout(); - } - this._position(); - this._size(); - } - }, - - destroy: function(){ - if(this._fadeInDeferred){ - this._fadeInDeferred.cancel(); - } - if(this._fadeOutDeferred){ - this._fadeOutDeferred.cancel(); - } - if(this._moveable){ - this._moveable.destroy(); - } - var h; - while(h = this._modalconnects.pop()){ - h.remove(); - } - - DialogLevelManager.hide(this); - - this.inherited(arguments); - } - }); - - var Dialog = declare("dijit.Dialog", [ContentPane, _DialogBase], { - // summary: - // A modal dialog Widget. - // description: - // Pops up a modal dialog window, blocking access to the screen - // and also graying out the screen Dialog is extended from - // ContentPane so it supports all the same parameters (href, etc.). - // example: - // | <div data-dojo-type="dijit/Dialog" data-dojo-props="href: 'test.html'"></div> - // example: - // | var foo = new Dialog({ title: "test dialog", content: "test content" }; - // | foo.placeAt(win.body()); - // | foo.startup(); - }); - Dialog._DialogBase = _DialogBase; // for monkey patching and dojox/widget/DialogSimple - - var DialogLevelManager = Dialog._DialogLevelManager = { - // summary: - // Controls the various active "levels" on the page, starting with the - // stuff initially visible on the page (at z-index 0), and then having an entry for - // each Dialog shown. - - _beginZIndex: 950, - - show: function(/*dijit/_WidgetBase*/ dialog, /*Object*/ underlayAttrs){ - // summary: - // Call right before fade-in animation for new dialog. - // Saves current focus, displays/adjusts underlay for new dialog, - // and sets the z-index of the dialog itself. - // - // New dialog will be displayed on top of all currently displayed dialogs. - // - // Caller is responsible for setting focus in new dialog after the fade-in - // animation completes. - - // Save current focus - ds[ds.length-1].focus = focus.curNode; - - // Display the underlay, or if already displayed then adjust for this new dialog - // TODO: one underlay per document (based on dialog.ownerDocument) - var underlay = DialogUnderlay._singleton; - if(!underlay || underlay._destroyed){ - underlay = dijit._underlay = DialogUnderlay._singleton = new DialogUnderlay(underlayAttrs); - }else{ - underlay.set(dialog.underlayAttrs); - } - - // Set z-index a bit above previous dialog - var zIndex = ds[ds.length-1].dialog ? ds[ds.length-1].zIndex + 2 : Dialog._DialogLevelManager._beginZIndex; - if(ds.length == 1){ // first dialog - underlay.show(); - } - domStyle.set(DialogUnderlay._singleton.domNode, 'zIndex', zIndex - 1); - - // Dialog - domStyle.set(dialog.domNode, 'zIndex', zIndex); - - ds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex}); - }, - - hide: function(/*dijit/_WidgetBase*/ dialog){ - // summary: - // Called when the specified dialog is hidden/destroyed, after the fade-out - // animation ends, in order to reset page focus, fix the underlay, etc. - // If the specified dialog isn't open then does nothing. - // - // Caller is responsible for either setting display:none on the dialog domNode, - // or calling dijit/popup.hide(), or removing it from the page DOM. - - if(ds[ds.length-1].dialog == dialog){ - // Removing the top (or only) dialog in the stack, return focus - // to previous dialog - - ds.pop(); - - var pd = ds[ds.length-1]; // the new active dialog (or the base page itself) - - // Adjust underlay, unless the underlay widget has already been destroyed - // because we are being called during page unload (when all widgets are destroyed) - if(!DialogUnderlay._singleton._destroyed){ - if(ds.length == 1){ - // Returning to original page. Hide the underlay. - DialogUnderlay._singleton.hide(); - }else{ - // Popping back to previous dialog, adjust underlay. - domStyle.set(DialogUnderlay._singleton.domNode, 'zIndex', pd.zIndex - 1); - DialogUnderlay._singleton.set(pd.underlayAttrs); - } - } - - // Adjust focus - if(dialog.refocus){ - // If we are returning control to a previous dialog but for some reason - // that dialog didn't have a focused field, set focus to first focusable item. - // This situation could happen if two dialogs appeared at nearly the same time, - // since a dialog doesn't set it's focus until the fade-in is finished. - var focus = pd.focus; - if(pd.dialog && (!focus || !dom.isDescendant(focus, pd.dialog.domNode))){ - pd.dialog._getFocusItems(pd.dialog.domNode); - focus = pd.dialog._firstFocusItem; - } - - if(focus){ - // Refocus the button that spawned the Dialog. This will fail in corner cases including - // page unload on IE, because the dijit/form/Button that launched the Dialog may get destroyed - // before this code runs. (#15058) - try{ - focus.focus(); - }catch(e){} - } - } - }else{ - // Removing a dialog out of order (#9944, #10705). - // Don't need to mess with underlay or z-index or anything. - var idx = array.indexOf(array.map(ds, function(elem){return elem.dialog}), dialog); - if(idx != -1){ - ds.splice(idx, 1); - } - } - }, - - isTop: function(/*dijit/_WidgetBase*/ dialog){ - // summary: - // Returns true if specified Dialog is the top in the task - return ds[ds.length-1].dialog == dialog; - } - }; - - // Stack representing the various active "levels" on the page, starting with the - // stuff initially visible on the page (at z-index 0), and then having an entry for - // each Dialog shown. - // Each element in stack has form { - // dialog: dialogWidget, - // focus: returnFromGetFocus(), - // underlayAttrs: attributes to set on underlay (when this widget is active) - // } - var ds = Dialog._dialogStack = [ - {dialog: null, focus: null, underlayAttrs: null} // entry for stuff at z-index: 0 - ]; - - // Back compat w/1.6, remove for 2.0 - if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/TooltipDialog"]; - require(requires); // use indirection so modules not rolled into a build - }); - } - - return Dialog; -}); diff --git a/lib/dijit/DialogUnderlay.js.uncompressed.js b/lib/dijit/DialogUnderlay.js.uncompressed.js deleted file mode 100644 index 040c5411f..000000000 --- a/lib/dijit/DialogUnderlay.js.uncompressed.js +++ /dev/null @@ -1,102 +0,0 @@ -define("dijit/DialogUnderlay", [ - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/window", // winUtils.getBox - "./_Widget", - "./_TemplatedMixin", - "./BackgroundIframe" -], function(declare, domAttr, winUtils, _Widget, _TemplatedMixin, BackgroundIframe){ - - // module: - // dijit/DialogUnderlay - - return declare("dijit.DialogUnderlay", [_Widget, _TemplatedMixin], { - // summary: - // The component that blocks the screen behind a `dijit.Dialog` - // - // description: - // A component used to block input behind a `dijit.Dialog`. Only a single - // instance of this widget is created by `dijit.Dialog`, and saved as - // a reference to be shared between all Dialogs as `dijit._underlay` - // - // The underlay itself can be styled based on and id: - // | #myDialog_underlay { background-color:red; } - // - // In the case of `dijit.Dialog`, this id is based on the id of the Dialog, - // suffixed with _underlay. - - // Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe. - // Inner div has opacity specified in CSS file. - templateString: "<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' data-dojo-attach-point='node'></div></div>", - - // Parameters on creation or updatable later - - // dialogId: String - // Id of the dialog.... DialogUnderlay's id is based on this id - dialogId: "", - - // class: String - // This class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay - "class": "", - - _setDialogIdAttr: function(id){ - domAttr.set(this.node, "id", id + "_underlay"); - this._set("dialogId", id); - }, - - _setClassAttr: function(clazz){ - this.node.className = "dijitDialogUnderlay " + clazz; - this._set("class", clazz); - }, - - postCreate: function(){ - // summary: - // Append the underlay to the body - this.ownerDocumentBody.appendChild(this.domNode); - }, - - layout: function(){ - // summary: - // Sets the background to the size of the viewport - // - // description: - // Sets the background to the size of the viewport (rather than the size - // of the document) since we need to cover the whole browser window, even - // if the document is only a few lines long. - // tags: - // private - - var is = this.node.style, - os = this.domNode.style; - - // hide the background temporarily, so that the background itself isn't - // causing scrollbars to appear (might happen when user shrinks browser - // window and then we are called to resize) - os.display = "none"; - - // then resize and show - var viewport = winUtils.getBox(this.ownerDocument); - os.top = viewport.t + "px"; - os.left = viewport.l + "px"; - is.width = viewport.w + "px"; - is.height = viewport.h + "px"; - os.display = "block"; - }, - - show: function(){ - // summary: - // Show the dialog underlay - this.domNode.style.display = "block"; - this.layout(); - this.bgIframe = new BackgroundIframe(this.domNode); - }, - - hide: function(){ - // summary: - // Hides the dialog underlay - this.bgIframe.destroy(); - delete this.bgIframe; - this.domNode.style.display = "none"; - } - }); -}); diff --git a/lib/dijit/DropDownMenu.js.uncompressed.js b/lib/dijit/DropDownMenu.js.uncompressed.js deleted file mode 100644 index 0d5234c98..000000000 --- a/lib/dijit/DropDownMenu.js.uncompressed.js +++ /dev/null @@ -1,58 +0,0 @@ -require({cache:{ -'url:dijit/templates/Menu.html':"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\"\n\t data-dojo-attach-event=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" data-dojo-attach-point=\"containerNode\"></tbody>\n</table>\n"}}); -define("dijit/DropDownMenu", [ - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/keys", // keys - "dojo/text!./templates/Menu.html", - "./_OnDijitClickMixin", - "./_MenuBase" -], function(declare, event, keys, template, _OnDijitClickMixin, _MenuBase){ - - // module: - // dijit/DropDownMenu - - return declare("dijit.DropDownMenu", [_MenuBase, _OnDijitClickMixin], { - // summary: - // A menu, without features for context menu (Meaning, drop down menu) - - templateString: template, - - baseClass: "dijitMenu", - - postCreate: function(){ - this.inherited(arguments); - var l = this.isLeftToRight(); - this._openSubMenuKey = l ? keys.RIGHT_ARROW : keys.LEFT_ARROW; - this._closeSubMenuKey = l ? keys.LEFT_ARROW : keys.RIGHT_ARROW; - this.connectKeyNavHandlers([keys.UP_ARROW], [keys.DOWN_ARROW]); - }, - - _onKeyPress: function(/*Event*/ evt){ - // summary: - // Handle keyboard based menu navigation. - // tags: - // protected - - if(evt.ctrlKey || evt.altKey){ return; } - - switch(evt.charOrCode){ - case this._openSubMenuKey: - this._moveToPopup(evt); - event.stop(evt); - break; - case this._closeSubMenuKey: - if(this.parentMenu){ - if(this.parentMenu._isMenuBar){ - this.parentMenu.focusPrev(); - }else{ - this.onCancel(false); - } - }else{ - event.stop(evt); - } - break; - } - } - }); -}); diff --git a/lib/dijit/Editor.js.uncompressed.js b/lib/dijit/Editor.js.uncompressed.js deleted file mode 100644 index 9c2e30042..000000000 --- a/lib/dijit/Editor.js.uncompressed.js +++ /dev/null @@ -1,865 +0,0 @@ -define("dijit/Editor", [ - "require", - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/_base/Deferred", // Deferred - "dojo/i18n", // i18n.getLocalization - "dojo/dom-attr", // domAttr.set - "dojo/dom-class", // domClass.add - "dojo/dom-geometry", - "dojo/dom-style", // domStyle.set, get - "dojo/_base/event", // event.stop - "dojo/keys", // keys.F1 keys.F15 keys.TAB - "dojo/_base/lang", // lang.getObject lang.hitch - "dojo/sniff", // has("ie") has("mac") has("webkit") - "dojo/string", // string.substitute - "dojo/topic", // topic.publish() - "dojo/_base/window", // win.withGlobal - "./_base/focus", // dijit.getBookmark() - "./_Container", - "./Toolbar", - "./ToolbarSeparator", - "./layout/_LayoutWidget", - "./form/ToggleButton", - "./_editor/_Plugin", - "./_editor/plugins/EnterKeyHandling", - "./_editor/html", - "./_editor/range", - "./_editor/RichText", - "./main", // dijit._scopeName - "dojo/i18n!./_editor/nls/commands" -], function(require, array, declare, Deferred, i18n, domAttr, domClass, domGeometry, domStyle, - event, keys, lang, has, string, topic, win, - focusBase, _Container, Toolbar, ToolbarSeparator, _LayoutWidget, ToggleButton, - _Plugin, EnterKeyHandling, html, rangeapi, RichText, dijit){ - - // module: - // dijit/Editor - - var Editor = declare("dijit.Editor", RichText, { - // summary: - // A rich text Editing widget - // - // description: - // This widget provides basic WYSIWYG editing features, based on the browser's - // underlying rich text editing capability, accompanied by a toolbar (`dijit.Toolbar`). - // A plugin model is available to extend the editor's capabilities as well as the - // the options available in the toolbar. Content generation may vary across - // browsers, and clipboard operations may have different results, to name - // a few limitations. Note: this widget should not be used with the HTML - // <TEXTAREA> tag -- see dijit/_editor/RichText for details. - - // plugins: [const] Object[] - // A list of plugin names (as strings) or instances (as objects) - // for this widget. - // - // When declared in markup, it might look like: - // | plugins="['bold',{name:'dijit._editor.plugins.FontChoice', command:'fontName', generic:true}]" - plugins: null, - - // extraPlugins: [const] Object[] - // A list of extra plugin names which will be appended to plugins array - extraPlugins: null, - - constructor: function(/*===== params, srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Initial settings for any of the attributes, except readonly attributes. - // srcNodeRef: DOMNode - // The editor replaces the specified DOMNode. - - if(!lang.isArray(this.plugins)){ - this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|", - "insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull", - EnterKeyHandling /*, "createLink"*/]; - } - - this._plugins=[]; - this._editInterval = this.editActionInterval * 1000; - - //IE will always lose focus when other element gets focus, while for FF and safari, - //when no iframe is used, focus will be lost whenever another element gets focus. - //For IE, we can connect to onBeforeDeactivate, which will be called right before - //the focus is lost, so we can obtain the selected range. For other browsers, - //no equivalent of onBeforeDeactivate, so we need to do two things to make sure - //selection is properly saved before focus is lost: 1) when user clicks another - //element in the page, in which case we listen to mousedown on the entire page and - //see whether user clicks out of a focus editor, if so, save selection (focus will - //only lost after onmousedown event is fired, so we can obtain correct caret pos.) - //2) when user tabs away from the editor, which is handled in onKeyDown below. - if(has("ie")){ - this.events.push("onBeforeDeactivate"); - this.events.push("onBeforeActivate"); - } - }, - - postMixInProperties: function(){ - // summary: - // Extension to make sure a deferred is in place before certain functions - // execute, like making sure all the plugins are properly inserted. - - // Set up a deferred so that the value isn't applied to the editor - // until all the plugins load, needed to avoid timing condition - // reported in #10537. - this.setValueDeferred = new Deferred(); - this.inherited(arguments); - }, - - postCreate: function(){ - //for custom undo/redo, if enabled. - this._steps=this._steps.slice(0); - this._undoedSteps=this._undoedSteps.slice(0); - - if(lang.isArray(this.extraPlugins)){ - this.plugins=this.plugins.concat(this.extraPlugins); - } - - this.inherited(arguments); - - this.commands = i18n.getLocalization("dijit._editor", "commands", this.lang); - - if(!this.toolbar){ - // if we haven't been assigned a toolbar, create one - this.toolbar = new Toolbar({ - ownerDocument: this.ownerDocument, - dir: this.dir, - lang: this.lang - }); - this.header.appendChild(this.toolbar.domNode); - } - - array.forEach(this.plugins, this.addPlugin, this); - - // Okay, denote the value can now be set. - this.setValueDeferred.resolve(true); - - domClass.add(this.iframe.parentNode, "dijitEditorIFrameContainer"); - domClass.add(this.iframe, "dijitEditorIFrame"); - domAttr.set(this.iframe, "allowTransparency", true); - - if(has("webkit")){ - // Disable selecting the entire editor by inadvertent double-clicks. - // on buttons, title bar, etc. Otherwise clicking too fast on - // a button such as undo/redo selects the entire editor. - domStyle.set(this.domNode, "KhtmlUserSelect", "none"); - } - this.toolbar.startup(); - this.onNormalizedDisplayChanged(); //update toolbar button status - }, - destroy: function(){ - array.forEach(this._plugins, function(p){ - if(p && p.destroy){ - p.destroy(); - } - }); - this._plugins=[]; - this.toolbar.destroyRecursive(); - delete this.toolbar; - this.inherited(arguments); - }, - addPlugin: function(/*String||Object||Function*/ plugin, /*Integer?*/ index){ - // summary: - // takes a plugin name as a string or a plugin instance and - // adds it to the toolbar and associates it with this editor - // instance. The resulting plugin is added to the Editor's - // plugins array. If index is passed, it's placed in the plugins - // array at that index. No big magic, but a nice helper for - // passing in plugin names via markup. - // plugin: - // String, args object, plugin instance, or plugin constructor - // args: - // This object will be passed to the plugin constructor - // index: - // Used when creating an instance from - // something already in this.plugins. Ensures that the new - // instance is assigned to this.plugins at that index. - var args=lang.isString(plugin)?{name:plugin}:lang.isFunction(plugin)?{ctor:plugin}:plugin; - if(!args.setEditor){ - var o={"args":args,"plugin":null,"editor":this}; - if(args.name){ - // search registry for a plugin factory matching args.name, if it's not there then - // fallback to 1.0 API: - // ask all loaded plugin modules to fill in o.plugin if they can (ie, if they implement args.name) - // remove fallback for 2.0. - if(_Plugin.registry[args.name]){ - o.plugin = _Plugin.registry[args.name](args); - }else{ - topic.publish(dijit._scopeName + ".Editor.getPlugin", o); // publish - } - } - if(!o.plugin){ - try{ - // TODO: remove lang.getObject() call in 2.0 - var pc = args.ctor || lang.getObject(args.name) || require(args.name); - if(pc){ - o.plugin = new pc(args); - } - }catch(e){ - throw new Error(this.id + ": cannot find plugin [" + args.name + "]"); - } - } - if(!o.plugin){ - throw new Error(this.id + ": cannot find plugin [" + args.name + "]"); - } - plugin=o.plugin; - } - if(arguments.length > 1){ - this._plugins[index] = plugin; - }else{ - this._plugins.push(plugin); - } - plugin.setEditor(this); - if(lang.isFunction(plugin.setToolbar)){ - plugin.setToolbar(this.toolbar); - } - }, - - //the following 2 functions are required to make the editor play nice under a layout widget, see #4070 - - resize: function(size){ - // summary: - // Resize the editor to the specified size, see `dijit/layout/_LayoutWidget.resize()` - if(size){ - // we've been given a height/width for the entire editor (toolbar + contents), calls layout() - // to split the allocated size between the toolbar and the contents - _LayoutWidget.prototype.resize.apply(this, arguments); - } - /* - else{ - // do nothing, the editor is already laid out correctly. The user has probably specified - // the height parameter, which was used to set a size on the iframe - } - */ - }, - layout: function(){ - // summary: - // Called from `dijit/layout/_LayoutWidget.resize()`. This shouldn't be called directly - // tags: - // protected - - // Converts the iframe (or rather the <div> surrounding it) to take all the available space - // except what's needed for the header (toolbars) and footer (breadcrumbs, etc). - // A class was added to the iframe container and some themes style it, so we have to - // calc off the added margins and padding too. See tracker: #10662 - var areaHeight = (this._contentBox.h - - (this.getHeaderHeight() + this.getFooterHeight() + - domGeometry.getPadBorderExtents(this.iframe.parentNode).h + - domGeometry.getMarginExtents(this.iframe.parentNode).h)); - this.editingArea.style.height = areaHeight + "px"; - if(this.iframe){ - this.iframe.style.height="100%"; - } - this._layoutMode = true; - }, - - _onIEMouseDown: function(/*Event*/ e){ - // summary: - // IE only to prevent 2 clicks to focus - // tags: - // private - var outsideClientArea; - // IE 8's componentFromPoint is broken, which is a shame since it - // was smaller code, but oh well. We have to do this brute force - // to detect if the click was scroller or not. - var b = this.document.body; - var clientWidth = b.clientWidth; - var clientHeight = b.clientHeight; - var clientLeft = b.clientLeft; - var offsetWidth = b.offsetWidth; - var offsetHeight = b.offsetHeight; - var offsetLeft = b.offsetLeft; - - //Check for vertical scroller click. - if(/^rtl$/i.test(b.dir || "")){ - if(clientWidth < offsetWidth && e.x > clientWidth && e.x < offsetWidth){ - // Check the click was between width and offset width, if so, scroller - outsideClientArea = true; - } - }else{ - // RTL mode, we have to go by the left offsets. - if(e.x < clientLeft && e.x > offsetLeft){ - // Check the click was between width and offset width, if so, scroller - outsideClientArea = true; - } - } - if(!outsideClientArea){ - // Okay, might be horiz scroller, check that. - if(clientHeight < offsetHeight && e.y > clientHeight && e.y < offsetHeight){ - // Horizontal scroller. - outsideClientArea = true; - } - } - if(!outsideClientArea){ - delete this._cursorToStart; // Remove the force to cursor to start position. - delete this._savedSelection; // new mouse position overrides old selection - if(e.target.tagName == "BODY"){ - this.defer("placeCursorAtEnd"); - } - this.inherited(arguments); - } - }, - onBeforeActivate: function(){ - this._restoreSelection(); - }, - onBeforeDeactivate: function(e){ - // summary: - // Called on IE right before focus is lost. Saves the selected range. - // tags: - // private - if(this.customUndo){ - this.endEditing(true); - } - //in IE, the selection will be lost when other elements get focus, - //let's save focus before the editor is deactivated - if(e.target.tagName != "BODY"){ - this._saveSelection(); - } - //console.log('onBeforeDeactivate',this); - }, - - /* beginning of custom undo/redo support */ - - // customUndo: Boolean - // Whether we shall use custom undo/redo support instead of the native - // browser support. By default, we now use custom undo. It works better - // than native browser support and provides a consistent behavior across - // browsers with a minimal performance hit. We already had the hit on - // the slowest browser, IE, anyway. - customUndo: true, - - // editActionInterval: Integer - // When using customUndo, not every keystroke will be saved as a step. - // Instead typing (including delete) will be grouped together: after - // a user stops typing for editActionInterval seconds, a step will be - // saved; if a user resume typing within editActionInterval seconds, - // the timeout will be restarted. By default, editActionInterval is 3 - // seconds. - editActionInterval: 3, - - beginEditing: function(cmd){ - // summary: - // Called to note that the user has started typing alphanumeric characters, if it's not already noted. - // Deals with saving undo; see editActionInterval parameter. - // tags: - // private - if(!this._inEditing){ - this._inEditing=true; - this._beginEditing(cmd); - } - if(this.editActionInterval>0){ - if(this._editTimer){ - this._editTimer.remove(); - } - this._editTimer = this.defer("endEditing", this._editInterval); - } - }, - - // TODO: declaring these in the prototype is meaningless, just create in the constructor/postCreate - _steps:[], - _undoedSteps:[], - - execCommand: function(cmd){ - // summary: - // Main handler for executing any commands to the editor, like paste, bold, etc. - // Called by plugins, but not meant to be called by end users. - // tags: - // protected - if(this.customUndo && (cmd == 'undo' || cmd == 'redo')){ - return this[cmd](); - }else{ - if(this.customUndo){ - this.endEditing(); - this._beginEditing(); - } - var r = this.inherited(arguments); - if(this.customUndo){ - this._endEditing(); - } - return r; - } - }, - - _pasteImpl: function(){ - // summary: - // Over-ride of paste command control to make execCommand cleaner - // tags: - // Protected - return this._clipboardCommand("paste"); - }, - - _cutImpl: function(){ - // summary: - // Over-ride of cut command control to make execCommand cleaner - // tags: - // Protected - return this._clipboardCommand("cut"); - }, - - _copyImpl: function(){ - // summary: - // Over-ride of copy command control to make execCommand cleaner - // tags: - // Protected - return this._clipboardCommand("copy"); - }, - - _clipboardCommand: function(cmd){ - // summary: - // Function to handle processing clipboard commands (or at least try to). - // tags: - // Private - var r; - try{ - // Try to exec the superclass exec-command and see if it works. - r = this.document.execCommand(cmd, false, null); - if(has("webkit") && !r){ //see #4598: webkit does not guarantee clipboard support from js - throw { code: 1011 }; // throw an object like Mozilla's error - } - }catch(e){ - //TODO: when else might we get an exception? Do we need the Mozilla test below? - if(e.code == 1011 /* Mozilla: service denied */ || - (e.code == 9 && has("opera") /* Opera not supported */)){ - // Warn user of platform limitation. Cannot programmatically access clipboard. See ticket #4136 - var sub = string.substitute, - accel = {cut:'X', copy:'C', paste:'V'}; - alert(sub(this.commands.systemShortcut, - [this.commands[cmd], sub(this.commands[has("mac") ? 'appleKey' : 'ctrlKey'], [accel[cmd]])])); - } - r = false; - } - return r; - }, - - queryCommandEnabled: function(cmd){ - // summary: - // Returns true if specified editor command is enabled. - // Used by the plugins to know when to highlight/not highlight buttons. - // tags: - // protected - if(this.customUndo && (cmd == 'undo' || cmd == 'redo')){ - return cmd == 'undo' ? (this._steps.length > 1) : (this._undoedSteps.length > 0); - }else{ - return this.inherited(arguments); - } - }, - _moveToBookmark: function(b){ - // summary: - // Selects the text specified in bookmark b - // tags: - // private - var bookmark = b.mark; - var mark = b.mark; - var col = b.isCollapsed; - var r, sNode, eNode, sel; - if(mark){ - if(has("ie") < 9){ - if(lang.isArray(mark)){ - //IE CONTROL, have to use the native bookmark. - bookmark = []; - array.forEach(mark,function(n){ - bookmark.push(rangeapi.getNode(n,this.editNode)); - },this); - win.withGlobal(this.window,'moveToBookmark',focusBase,[{mark: bookmark, isCollapsed: col}]); - }else{ - if(mark.startContainer && mark.endContainer){ - // Use the pseudo WC3 range API. This works better for positions - // than the IE native bookmark code. - sel = rangeapi.getSelection(this.window); - if(sel && sel.removeAllRanges){ - sel.removeAllRanges(); - r = rangeapi.create(this.window); - sNode = rangeapi.getNode(mark.startContainer,this.editNode); - eNode = rangeapi.getNode(mark.endContainer,this.editNode); - if(sNode && eNode){ - // Okay, we believe we found the position, so add it into the selection - // There are cases where it may not be found, particularly in undo/redo, when - // IE changes the underlying DOM on us (wraps text in a <p> tag or similar. - // So, in those cases, don't bother restoring selection. - r.setStart(sNode,mark.startOffset); - r.setEnd(eNode,mark.endOffset); - sel.addRange(r); - } - } - } - } - }else{//w3c range - sel = rangeapi.getSelection(this.window); - if(sel && sel.removeAllRanges){ - sel.removeAllRanges(); - r = rangeapi.create(this.window); - sNode = rangeapi.getNode(mark.startContainer,this.editNode); - eNode = rangeapi.getNode(mark.endContainer,this.editNode); - if(sNode && eNode){ - // Okay, we believe we found the position, so add it into the selection - // There are cases where it may not be found, particularly in undo/redo, when - // formatting as been done and so on, so don't restore selection then. - r.setStart(sNode,mark.startOffset); - r.setEnd(eNode,mark.endOffset); - sel.addRange(r); - } - } - } - } - }, - _changeToStep: function(from, to){ - // summary: - // Reverts editor to "to" setting, from the undo stack. - // tags: - // private - this.setValue(to.text); - var b=to.bookmark; - if(!b){ return; } - this._moveToBookmark(b); - }, - undo: function(){ - // summary: - // Handler for editor undo (ex: ctrl-z) operation - // tags: - // private - var ret = false; - if(!this._undoRedoActive){ - this._undoRedoActive = true; - this.endEditing(true); - var s=this._steps.pop(); - if(s && this._steps.length>0){ - this.focus(); - this._changeToStep(s,this._steps[this._steps.length-1]); - this._undoedSteps.push(s); - this.onDisplayChanged(); - delete this._undoRedoActive; - ret = true; - } - delete this._undoRedoActive; - } - return ret; - }, - redo: function(){ - // summary: - // Handler for editor redo (ex: ctrl-y) operation - // tags: - // private - var ret = false; - if(!this._undoRedoActive){ - this._undoRedoActive = true; - this.endEditing(true); - var s=this._undoedSteps.pop(); - if(s && this._steps.length>0){ - this.focus(); - this._changeToStep(this._steps[this._steps.length-1],s); - this._steps.push(s); - this.onDisplayChanged(); - ret = true; - } - delete this._undoRedoActive; - } - return ret; - }, - endEditing: function(ignore_caret){ - // summary: - // Called to note that the user has stopped typing alphanumeric characters, if it's not already noted. - // Deals with saving undo; see editActionInterval parameter. - // tags: - // private - if(this._editTimer){ - this._editTimer = this._editTimer.remove(); - } - if(this._inEditing){ - this._endEditing(ignore_caret); - this._inEditing=false; - } - }, - - _getBookmark: function(){ - // summary: - // Get the currently selected text - // tags: - // protected - var b=win.withGlobal(this.window,focusBase.getBookmark); - var tmp=[]; - if(b && b.mark){ - var mark = b.mark; - if(has("ie") < 9){ - // Try to use the pseudo range API on IE for better accuracy. - var sel = rangeapi.getSelection(this.window); - if(!lang.isArray(mark)){ - if(sel){ - var range; - if(sel.rangeCount){ - range = sel.getRangeAt(0); - } - if(range){ - b.mark = range.cloneRange(); - }else{ - b.mark = win.withGlobal(this.window,focusBase.getBookmark); - } - } - }else{ - // Control ranges (img, table, etc), handle differently. - array.forEach(b.mark,function(n){ - tmp.push(rangeapi.getIndex(n,this.editNode).o); - },this); - b.mark = tmp; - } - } - try{ - if(b.mark && b.mark.startContainer){ - tmp=rangeapi.getIndex(b.mark.startContainer,this.editNode).o; - b.mark={startContainer:tmp, - startOffset:b.mark.startOffset, - endContainer:b.mark.endContainer===b.mark.startContainer?tmp:rangeapi.getIndex(b.mark.endContainer,this.editNode).o, - endOffset:b.mark.endOffset}; - } - }catch(e){ - b.mark = null; - } - } - return b; - }, - _beginEditing: function(){ - // summary: - // Called when the user starts typing alphanumeric characters. - // Deals with saving undo; see editActionInterval parameter. - // tags: - // private - if(this._steps.length === 0){ - // You want to use the editor content without post filtering - // to make sure selection restores right for the 'initial' state. - // and undo is called. So not using this.value, as it was 'processed' - // and the line-up for selections may have been altered. - this._steps.push({'text':html.getChildrenHtml(this.editNode),'bookmark':this._getBookmark()}); - } - }, - _endEditing: function(){ - // summary: - // Called when the user stops typing alphanumeric characters. - // Deals with saving undo; see editActionInterval parameter. - // tags: - // private - - // Avoid filtering to make sure selections restore. - var v = html.getChildrenHtml(this.editNode); - - this._undoedSteps=[];//clear undoed steps - this._steps.push({text: v, bookmark: this._getBookmark()}); - }, - onKeyDown: function(e){ - // summary: - // Handler for onkeydown event. - // tags: - // private - - //We need to save selection if the user TAB away from this editor - //no need to call _saveSelection for IE, as that will be taken care of in onBeforeDeactivate - if(!has("ie") && !this.iframe && e.keyCode == keys.TAB && !this.tabIndent){ - this._saveSelection(); - } - if(!this.customUndo){ - this.inherited(arguments); - return; - } - var k = e.keyCode; - if(e.ctrlKey && !e.altKey){//undo and redo only if the special right Alt + z/y are not pressed #5892 - if(k == 90 || k == 122){ //z - event.stop(e); - this.undo(); - return; - }else if(k == 89 || k == 121){ //y - event.stop(e); - this.redo(); - return; - } - } - this.inherited(arguments); - - switch(k){ - case keys.ENTER: - case keys.BACKSPACE: - case keys.DELETE: - this.beginEditing(); - break; - case 88: //x - case 86: //v - if(e.ctrlKey && !e.altKey && !e.metaKey){ - this.endEditing();//end current typing step if any - if(e.keyCode == 88){ - this.beginEditing('cut'); - }else{ - this.beginEditing('paste'); - } - //use timeout to trigger after the paste is complete - this.defer("endEditing", 1); - break; - } - //pass through - default: - if(!e.ctrlKey && !e.altKey && !e.metaKey && (e.keyCode<keys.F1 || e.keyCode>keys.F15)){ - this.beginEditing(); - break; - } - //pass through - case keys.ALT: - this.endEditing(); - break; - case keys.UP_ARROW: - case keys.DOWN_ARROW: - case keys.LEFT_ARROW: - case keys.RIGHT_ARROW: - case keys.HOME: - case keys.END: - case keys.PAGE_UP: - case keys.PAGE_DOWN: - this.endEditing(true); - break; - //maybe ctrl+backspace/delete, so don't endEditing when ctrl is pressed - case keys.CTRL: - case keys.SHIFT: - case keys.TAB: - break; - } - }, - _onBlur: function(){ - // summary: - // Called from focus manager when focus has moved away from this editor - // tags: - // protected - - //this._saveSelection(); - this.inherited(arguments); - this.endEditing(true); - }, - _saveSelection: function(){ - // summary: - // Save the currently selected text in _savedSelection attribute - // tags: - // private - try{ - this._savedSelection=this._getBookmark(); - }catch(e){ /* Squelch any errors that occur if selection save occurs due to being hidden simultaneously. */} - }, - _restoreSelection: function(){ - // summary: - // Re-select the text specified in _savedSelection attribute; - // see _saveSelection(). - // tags: - // private - if(this._savedSelection){ - // Clear off cursor to start, we're deliberately going to a selection. - delete this._cursorToStart; - // only restore the selection if the current range is collapsed - // if not collapsed, then it means the editor does not lose - // selection and there is no need to restore it - if(win.withGlobal(this.window,'isCollapsed',focusBase)){ - this._moveToBookmark(this._savedSelection); - } - delete this._savedSelection; - } - }, - - onClick: function(){ - // summary: - // Handler for when editor is clicked - // tags: - // protected - this.endEditing(true); - this.inherited(arguments); - }, - - replaceValue: function(/*String*/ html){ - // summary: - // over-ride of replaceValue to support custom undo and stack maintenance. - // tags: - // protected - if(!this.customUndo){ - this.inherited(arguments); - }else{ - if(this.isClosed){ - this.setValue(html); - }else{ - this.beginEditing(); - if(!html){ - html = " "; // - } - this.setValue(html); - this.endEditing(); - } - } - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - this.setValueDeferred.then(lang.hitch(this, function(){ - if((!this.disabled && value) || (!this._buttonEnabledPlugins && value)){ - // Disable editor: disable all enabled buttons and remember that list - array.forEach(this._plugins, function(p){ - p.set("disabled", true); - }); - }else if(this.disabled && !value){ - // Restore plugins to being active. - array.forEach(this._plugins, function(p){ - p.set("disabled", false); - }); - } - })); - this.inherited(arguments); - }, - - _setStateClass: function(){ - try{ - this.inherited(arguments); - - // Let theme set the editor's text color based on editor enabled/disabled state. - // We need to jump through hoops because the main document (where the theme CSS is) - // is separate from the iframe's document. - if(this.document && this.document.body){ - domStyle.set(this.document.body, "color", domStyle.get(this.iframe, "color")); - } - }catch(e){ /* Squelch any errors caused by focus change if hidden during a state change */} - } - }); - - // Register the "default plugins", ie, the built-in editor commands - function simplePluginFactory(args){ - return new _Plugin({ command: args.name }); - } - function togglePluginFactory(args){ - return new _Plugin({ buttonClass: ToggleButton, command: args.name }); - } - lang.mixin(_Plugin.registry, { - "undo": simplePluginFactory, - "redo": simplePluginFactory, - "cut": simplePluginFactory, - "copy": simplePluginFactory, - "paste": simplePluginFactory, - "insertOrderedList": simplePluginFactory, - "insertUnorderedList": simplePluginFactory, - "indent": simplePluginFactory, - "outdent": simplePluginFactory, - "justifyCenter": simplePluginFactory, - "justifyFull": simplePluginFactory, - "justifyLeft": simplePluginFactory, - "justifyRight": simplePluginFactory, - "delete": simplePluginFactory, - "selectAll": simplePluginFactory, - "removeFormat": simplePluginFactory, - "unlink": simplePluginFactory, - "insertHorizontalRule": simplePluginFactory, - - "bold": togglePluginFactory, - "italic": togglePluginFactory, - "underline": togglePluginFactory, - "strikethrough": togglePluginFactory, - "subscript": togglePluginFactory, - "superscript": togglePluginFactory, - - "|": function(){ - return new _Plugin({ - setEditor: function(editor){ - this.editor = editor; - this.button = new ToolbarSeparator({ownerDocument: editor.ownerDocument}); - } - }); - } - }); - - return Editor; -}); diff --git a/lib/dijit/InlineEditBox.js.uncompressed.js b/lib/dijit/InlineEditBox.js.uncompressed.js deleted file mode 100644 index 212d909da..000000000 --- a/lib/dijit/InlineEditBox.js.uncompressed.js +++ /dev/null @@ -1,659 +0,0 @@ -require({cache:{ -'url:dijit/templates/InlineEditBox.html':"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" class=\"dijitReset dijitInline dijitOffScreen\"\n\tdata-dojo-attach-event=\"onkeypress: _onKeyPress\"\n\t><span data-dojo-attach-point=\"editorPlaceholder\"></span\n\t><span data-dojo-attach-point=\"buttonContainer\"\n\t\t><button data-dojo-type=\"dijit/form/Button\" data-dojo-props=\"label: '${buttonSave}', 'class': 'saveButton'\"\n\t\t\tdata-dojo-attach-point=\"saveButton\" data-dojo-attach-event=\"onClick:save\"></button\n\t\t><button data-dojo-type=\"dijit/form/Button\" data-dojo-props=\"label: '${buttonCancel}', 'class': 'cancelButton'\"\n\t\t\tdata-dojo-attach-point=\"cancelButton\" data-dojo-attach-event=\"onClick:cancel\"></button\n\t></span\n></span>\n"}}); -define("dijit/InlineEditBox", [ - "require", - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set domAttr.get - "dojo/dom-class", // domClass.add domClass.remove domClass.toggle - "dojo/dom-construct", // domConstruct.create domConstruct.destroy - "dojo/dom-style", // domStyle.getComputedStyle domStyle.set domStyle.get - "dojo/_base/event", // event.stop - "dojo/i18n", // i18n.getLocalization - "dojo/_base/kernel", // kernel.deprecated - "dojo/keys", // keys.ENTER keys.ESCAPE - "dojo/_base/lang", // lang.getObject - "dojo/sniff", // has("ie") - "dojo/when", - "./focus", - "./_Widget", - "./_TemplatedMixin", - "./_WidgetsInTemplateMixin", - "./_Container", - "./form/Button", - "./form/_TextBoxMixin", - "./form/TextBox", - "dojo/text!./templates/InlineEditBox.html", - "dojo/i18n!./nls/common" -], function(require, array, declare, domAttr, domClass, domConstruct, domStyle, event, i18n, kernel, keys, lang, has, when, - fm, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _Container, Button, _TextBoxMixin, TextBox, template){ - - // module: - // dijit/InlineEditBox - - var InlineEditor = declare("dijit._InlineEditor", [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], { - // summary: - // Internal widget used by InlineEditBox, displayed when in editing mode - // to display the editor and maybe save/cancel buttons. Calling code should - // connect to save/cancel methods to detect when editing is finished - // - // Has mainly the same parameters as InlineEditBox, plus these values: - // - // style: Object - // Set of CSS attributes of display node, to replicate in editor - // - // value: String - // Value as an HTML string or plain text string, depending on renderAsHTML flag - - templateString: template, - - postMixInProperties: function(){ - this.inherited(arguments); - this.messages = i18n.getLocalization("dijit", "common", this.lang); - array.forEach(["buttonSave", "buttonCancel"], function(prop){ - if(!this[prop]){ - this[prop] = this.messages[prop]; - } - }, this); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // Create edit widget in place in the template - // TODO: remove getObject() for 2.0 - var Cls = typeof this.editor == "string" ? (lang.getObject(this.editor) || require(this.editor)) : this.editor; - - // Copy the style from the source - // Don't copy ALL properties though, just the necessary/applicable ones. - // wrapperStyle/destStyle code is to workaround IE bug where getComputedStyle().fontSize - // is a relative value like 200%, rather than an absolute value like 24px, and - // the 200% can refer *either* to a setting on the node or it's ancestor (see #11175) - var srcStyle = this.sourceStyle, - editStyle = "line-height:" + srcStyle.lineHeight + ";", - destStyle = domStyle.getComputedStyle(this.domNode); - array.forEach(["Weight", "Family", "Size", "Style"], function(prop){ - var textStyle = srcStyle["font" + prop], - wrapperStyle = destStyle["font" + prop]; - if(wrapperStyle != textStyle){ - editStyle += "font-" + prop + ":" + srcStyle["font" + prop] + ";"; - } - }, this); - array.forEach(["marginTop", "marginBottom", "marginLeft", "marginRight", "position", "left", "top", "right", "bottom", "float", "clear", "display"], function(prop){ - this.domNode.style[prop] = srcStyle[prop]; - }, this); - var width = this.inlineEditBox.width; - if(width == "100%"){ - // block mode - editStyle += "width:100%;"; - this.domNode.style.display = "block"; - }else{ - // inline-block mode - editStyle += "width:" + (width + (Number(width) == width ? "px" : "")) + ";"; - } - var editorParams = lang.delegate(this.inlineEditBox.editorParams, { - style: editStyle, - dir: this.dir, - lang: this.lang, - textDir: this.textDir - }); - editorParams[ "displayedValue" in Cls.prototype ? "displayedValue" : "value"] = this.value; - this.editWidget = new Cls(editorParams, this.editorPlaceholder); - - if(this.inlineEditBox.autoSave){ - // Remove the save/cancel buttons since saving is done by simply tabbing away or - // selecting a value from the drop down list - domConstruct.destroy(this.buttonContainer); - } - }, - - postCreate: function(){ - this.inherited(arguments); - - var ew = this.editWidget; - - if(this.inlineEditBox.autoSave){ - // Selecting a value from a drop down list causes an onChange event and then we save - this.connect(ew, "onChange", "_onChange"); - - // ESC and TAB should cancel and save. Note that edit widgets do a stopEvent() on ESC key (to - // prevent Dialog from closing when the user just wants to revert the value in the edit widget), - // so this is the only way we can see the key press event. - this.connect(ew, "onKeyPress", "_onKeyPress"); - }else{ - // If possible, enable/disable save button based on whether the user has changed the value - if("intermediateChanges" in ew){ - ew.set("intermediateChanges", true); - this.connect(ew, "onChange", "_onIntermediateChange"); - this.saveButton.set("disabled", true); - } - } - }, - - startup: function(){ - this.editWidget.startup(); - this.inherited(arguments); - }, - - _onIntermediateChange: function(/*===== val =====*/){ - // summary: - // Called for editor widgets that support the intermediateChanges=true flag as a way - // to detect when to enable/disabled the save button - this.saveButton.set("disabled", (this.getValue() == this._resetValue) || !this.enableSave()); - }, - - destroy: function(){ - this.editWidget.destroy(true); // let the parent wrapper widget clean up the DOM - this.inherited(arguments); - }, - - getValue: function(){ - // summary: - // Return the [display] value of the edit widget - var ew = this.editWidget; - return String(ew.get("displayedValue" in ew ? "displayedValue" : "value")); - }, - - _onKeyPress: function(e){ - // summary: - // Handler for keypress in the edit box in autoSave mode. - // description: - // For autoSave widgets, if Esc/Enter, call cancel/save. - // tags: - // private - - if(this.inlineEditBox.autoSave && this.inlineEditBox.editing){ - if(e.altKey || e.ctrlKey){ - return; - } - // If Enter/Esc pressed, treat as save/cancel. - if(e.charOrCode == keys.ESCAPE){ - event.stop(e); - this.cancel(true); // sets editing=false which short-circuits _onBlur processing - }else if(e.charOrCode == keys.ENTER && e.target.tagName == "INPUT"){ - event.stop(e); - this._onChange(); // fire _onBlur and then save - } - - // _onBlur will handle TAB automatically by allowing - // the TAB to change focus before we mess with the DOM: #6227 - // Expounding by request: - // The current focus is on the edit widget input field. - // save() will hide and destroy this widget. - // We want the focus to jump from the currently hidden - // displayNode, but since it's hidden, it's impossible to - // unhide it, focus it, and then have the browser focus - // away from it to the next focusable element since each - // of these events is asynchronous and the focus-to-next-element - // is already queued. - // So we allow the browser time to unqueue the move-focus event - // before we do all the hide/show stuff. - } - }, - - _onBlur: function(){ - // summary: - // Called when focus moves outside the editor - // tags: - // private - - this.inherited(arguments); - if(this.inlineEditBox.autoSave && this.inlineEditBox.editing){ - if(this.getValue() == this._resetValue){ - this.cancel(false); - }else if(this.enableSave()){ - this.save(false); - } - } - }, - - _onChange: function(){ - // summary: - // Called when the underlying widget fires an onChange event, - // such as when the user selects a value from the drop down list of a ComboBox, - // which means that the user has finished entering the value and we should save. - // tags: - // private - - if(this.inlineEditBox.autoSave && this.inlineEditBox.editing && this.enableSave()){ - fm.focus(this.inlineEditBox.displayNode); // fires _onBlur which will save the formatted value - } - }, - - enableSave: function(){ - // summary: - // User overridable function returning a Boolean to indicate - // if the Save button should be enabled or not - usually due to invalid conditions - // tags: - // extension - return this.editWidget.isValid ? this.editWidget.isValid() : true; - }, - - focus: function(){ - // summary: - // Focus the edit widget. - // tags: - // protected - - this.editWidget.focus(); - - if(this.editWidget.focusNode){ - // IE can take 30ms to report the focus event, but focus manager needs to know before a 0ms timeout. - fm._onFocusNode(this.editWidget.focusNode); - - if(this.editWidget.focusNode.tagName == "INPUT"){ - this.defer(function(){ - _TextBoxMixin.selectInputText(this.editWidget.focusNode); - }); - } - } - } - }); - - - var InlineEditBox = declare("dijit.InlineEditBox", _Widget, { - // summary: - // An element with in-line edit capabilities - // - // description: - // Behavior for an existing node (`<p>`, `<div>`, `<span>`, etc.) so that - // when you click it, an editor shows up in place of the original - // text. Optionally, Save and Cancel button are displayed below the edit widget. - // When Save is clicked, the text is pulled from the edit - // widget and redisplayed and the edit widget is again hidden. - // By default a plain Textarea widget is used as the editor (or for - // inline values a TextBox), but you can specify an editor such as - // dijit.Editor (for editing HTML) or a Slider (for adjusting a number). - // An edit widget must support the following API to be used: - // - // - displayedValue or value as initialization parameter, - // and available through set('displayedValue') / set('value') - // - void focus() - // - DOM-node focusNode = node containing editable text - - // editing: [readonly] Boolean - // Is the node currently in edit mode? - editing: false, - - // autoSave: Boolean - // Changing the value automatically saves it; don't have to push save button - // (and save button isn't even displayed) - autoSave: true, - - // buttonSave: String - // Save button label - buttonSave: "", - - // buttonCancel: String - // Cancel button label - buttonCancel: "", - - // renderAsHtml: Boolean - // Set this to true if the specified Editor's value should be interpreted as HTML - // rather than plain text (ex: `dijit.Editor`) - renderAsHtml: false, - - // editor: String|Function - // MID (ex: "dijit/form/TextBox") or constructor for editor widget - editor: TextBox, - - // editorWrapper: String|Function - // Class name (or reference to the Class) for widget that wraps the editor widget, displaying save/cancel - // buttons. - editorWrapper: InlineEditor, - - // editorParams: Object - // Set of parameters for editor, like {required: true} - editorParams: {}, - - // disabled: Boolean - // If true, clicking the InlineEditBox to edit it will have no effect. - disabled: false, - - onChange: function(/*===== value =====*/){ - // summary: - // Set this handler to be notified of changes to value. - // tags: - // callback - }, - - onCancel: function(){ - // summary: - // Set this handler to be notified when editing is cancelled. - // tags: - // callback - }, - - // width: String - // Width of editor. By default it's width=100% (ie, block mode). - width: "100%", - - // value: String - // The display value of the widget in read-only mode - value: "", - - // noValueIndicator: [const] String - // The text that gets displayed when there is no value (so that the user has a place to click to edit) - noValueIndicator: has("ie") <= 6 ? // font-family needed on IE6 but it messes up IE8 - "<span style='font-family: wingdings; text-decoration: underline;'>    ✍    </span>" : - "<span style='text-decoration: underline;'>    ✍    </span>", //   == - - constructor: function(/*===== params, srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified: - // - // - use srcNodeRef.innerHTML as my value - // - replace srcNodeRef with my generated DOM tree - - this.editorParams = {}; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - - // save pointer to original source node, since Widget nulls-out srcNodeRef - this.displayNode = this.srcNodeRef; - - // connect handlers to the display node - var events = { - ondijitclick: "_onClick", - onmouseover: "_onMouseOver", - onmouseout: "_onMouseOut", - onfocus: "_onMouseOver", - onblur: "_onMouseOut" - }; - for(var name in events){ - this.connect(this.displayNode, name, events[name]); - } - this.displayNode.setAttribute("role", "button"); - if(!this.displayNode.getAttribute("tabIndex")){ - this.displayNode.setAttribute("tabIndex", 0); - } - - if(!this.value && !("value" in this.params)){ // "" is a good value if specified directly so check params){ - this.value = lang.trim(this.renderAsHtml ? this.displayNode.innerHTML : - (this.displayNode.innerText || this.displayNode.textContent || "")); - } - if(!this.value){ - this.displayNode.innerHTML = this.noValueIndicator; - } - - domClass.add(this.displayNode, 'dijitInlineEditBoxDisplayMode'); - }, - - setDisabled: function(/*Boolean*/ disabled){ - // summary: - // Deprecated. Use set('disabled', ...) instead. - // tags: - // deprecated - kernel.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.", "", "2.0"); - this.set('disabled', disabled); - }, - - _setDisabledAttr: function(/*Boolean*/ disabled){ - // summary: - // Hook to make set("disabled", ...) work. - // Set disabled state of widget. - this.domNode.setAttribute("aria-disabled", disabled ? "true" : "false"); - if(disabled){ - this.displayNode.removeAttribute("tabIndex"); - }else{ - this.displayNode.setAttribute("tabIndex", 0); - } - domClass.toggle(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled); - this._set("disabled", disabled); - }, - - _onMouseOver: function(){ - // summary: - // Handler for onmouseover and onfocus event. - // tags: - // private - if(!this.disabled){ - domClass.add(this.displayNode, "dijitInlineEditBoxDisplayModeHover"); - } - }, - - _onMouseOut: function(){ - // summary: - // Handler for onmouseout and onblur event. - // tags: - // private - domClass.remove(this.displayNode, "dijitInlineEditBoxDisplayModeHover"); - }, - - _onClick: function(/*Event*/ e){ - // summary: - // Handler for onclick event. - // tags: - // private - if(this.disabled){ - return; - } - if(e){ - event.stop(e); - } - this._onMouseOut(); - - // Since FF gets upset if you move a node while in an event handler for that node... - this.defer("edit"); - }, - - edit: function(){ - // summary: - // Display the editor widget in place of the original (read only) markup. - // tags: - // private - - if(this.disabled || this.editing){ - return; - } - this._set('editing', true); - - // save some display node values that can be restored later - this._savedTabIndex = domAttr.get(this.displayNode, "tabIndex") || "0"; - - if(this.wrapperWidget){ - var ew = this.wrapperWidget.editWidget; - ew.set("displayedValue" in ew ? "displayedValue" : "value", this.value); - }else{ - // Placeholder for edit widget - // Put place holder (and eventually editWidget) before the display node so that it's positioned correctly - // when Calendar dropdown appears, which happens automatically on focus. - var placeholder = domConstruct.create("span", null, this.domNode, "before"); - - // Create the editor wrapper (the thing that holds the editor widget and the save/cancel buttons) - var Ewc = typeof this.editorWrapper == "string" ? lang.getObject(this.editorWrapper) : this.editorWrapper; - this.wrapperWidget = new Ewc({ - value: this.value, - buttonSave: this.buttonSave, - buttonCancel: this.buttonCancel, - dir: this.dir, - lang: this.lang, - tabIndex: this._savedTabIndex, - editor: this.editor, - inlineEditBox: this, - sourceStyle: domStyle.getComputedStyle(this.displayNode), - save: lang.hitch(this, "save"), - cancel: lang.hitch(this, "cancel"), - textDir: this.textDir - }, placeholder); - if(!this.wrapperWidget._started){ - this.wrapperWidget.startup(); - } - if(!this._started){ - this.startup(); - } - } - var ww = this.wrapperWidget; - - // to avoid screen jitter, we first create the editor with position: absolute, visibility: hidden, - // and then when it's finished rendering, we switch from display mode to editor - // position: absolute releases screen space allocated to the display node - // opacity:0 is the same as visibility: hidden but is still focusable - // visibility: hidden removes focus outline - - domClass.add(this.displayNode, "dijitOffScreen"); - domClass.remove(ww.domNode, "dijitOffScreen"); - domStyle.set(ww.domNode, { visibility: "visible" }); - domAttr.set(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode - - // After edit widget has finished initializing (in particular need to wait for dijit.Editor), - // or immediately if there is no onLoadDeferred Deferred, - // replace the display widget with edit widget, leaving them both displayed for a brief time so that - // focus can be shifted without incident. - when(ww.editWidget.onLoadDeferred, lang.hitch(ww, function(){ - this.defer(function(){ // defer needed so that the change of focus doesn't happen on mousedown which also sets focus - this.focus(); // both nodes are showing, so we can switch focus safely - this._resetValue = this.getValue(); - }); - })); - }, - - _onBlur: function(){ - // summary: - // Called when focus moves outside the InlineEditBox. - // Performs garbage collection. - // tags: - // private - - this.inherited(arguments); - if(!this.editing){ - /* causes IE focus problems, see TooltipDialog_a11y.html... - this.defer(function(){ - if(this.wrapperWidget){ - this.wrapperWidget.destroy(); - delete this.wrapperWidget; - } - }); - */ - } - }, - - destroy: function(){ - if(this.wrapperWidget && !this.wrapperWidget._destroyed){ - this.wrapperWidget.destroy(); - delete this.wrapperWidget; - } - this.inherited(arguments); - }, - - _showText: function(/*Boolean*/ focus){ - // summary: - // Revert to display mode, and optionally focus on display node - // tags: - // private - - var ww = this.wrapperWidget; - domStyle.set(ww.domNode, { visibility: "hidden" }); // hide the editor from mouse/keyboard events - domClass.add(ww.domNode, "dijitOffScreen"); - domClass.remove(this.displayNode, "dijitOffScreen"); - domAttr.set(this.displayNode, "tabIndex", this._savedTabIndex); - if(focus){ - fm.focus(this.displayNode); - } - }, - - save: function(/*Boolean*/ focus){ - // summary: - // Save the contents of the editor and revert to display mode. - // focus: Boolean - // Focus on the display mode text - // tags: - // private - - if(this.disabled || !this.editing){ - return; - } - this._set('editing', false); - - var ww = this.wrapperWidget; - var value = ww.getValue(); - this.set('value', value); // display changed, formatted value - - this._showText(focus); // set focus as needed - }, - - setValue: function(/*String*/ val){ - // summary: - // Deprecated. Use set('value', ...) instead. - // tags: - // deprecated - kernel.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.", "", "2.0"); - return this.set("value", val); - }, - - _setValueAttr: function(/*String*/ val){ - // summary: - // Hook to make set("value", ...) work. - // Inserts specified HTML value into this node, or an "input needed" character if node is blank. - - val = lang.trim(val); - var renderVal = this.renderAsHtml ? val : val.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """).replace(/\n/g, "<br>"); - this.displayNode.innerHTML = renderVal || this.noValueIndicator; - this._set("value", val); - - if(this._started){ - // tell the world that we have changed - this.defer(function(){ - this.onChange(val); - }); // defer prevents browser freeze for long-running event handlers - } - // contextual (auto) text direction depends on the text value - if(this.textDir == "auto"){ - this.applyTextDir(this.displayNode, this.displayNode.innerText); - } - }, - - getValue: function(){ - // summary: - // Deprecated. Use get('value') instead. - // tags: - // deprecated - kernel.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get("value"); - }, - - cancel: function(/*Boolean*/ focus){ - // summary: - // Revert to display mode, discarding any changes made in the editor - // tags: - // private - - if(this.disabled || !this.editing){ - return; - } - this._set('editing', false); - - // tell the world that we have no changes - this.defer("onCancel"); // defer prevents browser freeze for long-running event handlers - - this._showText(focus); - }, - - _setTextDirAttr: function(/*String*/ textDir){ - // summary: - // Setter for textDir. - // description: - // Users shouldn't call this function; they should be calling - // set('textDir', value) - // tags: - // private - if(!this._created || this.textDir != textDir){ - this._set("textDir", textDir); - this.applyTextDir(this.displayNode, this.displayNode.innerText); - this.displayNode.align = this.dir == "rtl" ? "right" : "left"; //fix the text alignment - } - } - }); - - InlineEditBox._InlineEditor = InlineEditor; // for monkey patching - - return InlineEditBox; -});
\ No newline at end of file diff --git a/lib/dijit/Menu.js.uncompressed.js b/lib/dijit/Menu.js.uncompressed.js deleted file mode 100644 index b823a0c86..000000000 --- a/lib/dijit/Menu.js.uncompressed.js +++ /dev/null @@ -1,349 +0,0 @@ -define("dijit/Menu", [ - "require", - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/dom", // dom.byId dom.isDescendant - "dojo/dom-attr", // domAttr.get domAttr.set domAttr.has domAttr.remove - "dojo/dom-geometry", // domStyle.getComputedStyle domGeometry.position - "dojo/dom-style", // domStyle.getComputedStyle - "dojo/keys", // keys.F10 - "dojo/_base/lang", // lang.hitch - "dojo/on", - "dojo/sniff", // has("ie"), has("quirks") - "dojo/_base/window", // win.body win.doc.documentElement win.doc.frames - "dojo/window", // winUtils.get - "./popup", - "./DropDownMenu", - "dojo/ready" -], function(require, array, declare, event, dom, domAttr, domGeometry, domStyle, keys, lang, on, - has, win, winUtils, pm, DropDownMenu, ready){ - -// module: -// dijit/Menu - -// Back compat w/1.6, remove for 2.0 -if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/MenuItem", "dijit/PopupMenuItem", "dijit/CheckedMenuItem", "dijit/MenuSeparator"]; - require(requires); // use indirection so modules not rolled into a build - }); -} - -return declare("dijit.Menu", DropDownMenu, { - // summary: - // A context menu you can assign to multiple elements - - constructor: function(/*===== params, srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified: - // - // - use srcNodeRef.innerHTML as my contents - // - replace srcNodeRef with my generated DOM tree - - this._bindings = []; - }, - - // targetNodeIds: [const] String[] - // Array of dom node ids of nodes to attach to. - // Fill this with nodeIds upon widget creation and it becomes context menu for those nodes. - targetNodeIds: [], - - // selector: String? - // CSS expression to apply this Menu to descendants of targetNodeIds, rather than to - // the nodes specified by targetNodeIds themselves. Useful for applying a Menu to - // a range of rows in a table, tree, etc. - // - // The application must require() an appropriate level of dojo/query to handle the selector. - selector: "", - - // TODO: in 2.0 remove support for multiple targetNodeIds. selector gives the same effect. - // So, change targetNodeIds to a targetNodeId: "", remove bindDomNode()/unBindDomNode(), etc. - -/*===== - // currentTarget: [readonly] DOMNode - // For context menus, set to the current node that the Menu is being displayed for. - // Useful so that the menu actions can be tailored according to the node - currentTarget: null, -=====*/ - - // contextMenuForWindow: [const] Boolean - // If true, right clicking anywhere on the window will cause this context menu to open. - // If false, must specify targetNodeIds. - contextMenuForWindow: false, - - // leftClickToOpen: [const] Boolean - // If true, menu will open on left click instead of right click, similar to a file menu. - leftClickToOpen: false, - - // refocus: Boolean - // When this menu closes, re-focus the element which had focus before it was opened. - refocus: true, - - postCreate: function(){ - if(this.contextMenuForWindow){ - this.bindDomNode(this.ownerDocumentBody); - }else{ - // TODO: should have _setTargetNodeIds() method to handle initialization and a possible - // later set('targetNodeIds', ...) call. There's also a problem that targetNodeIds[] - // gets stale after calls to bindDomNode()/unBindDomNode() as it still is just the original list (see #9610) - array.forEach(this.targetNodeIds, this.bindDomNode, this); - } - this.inherited(arguments); - }, - - // thanks burstlib! - _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){ - // summary: - // Returns the window reference of the passed iframe - // tags: - // private - return winUtils.get(this._iframeContentDocument(iframe_el)) || - // Moz. TODO: is this available when defaultView isn't? - this._iframeContentDocument(iframe_el)['__parent__'] || - (iframe_el.name && win.doc.frames[iframe_el.name]) || null; // Window - }, - - _iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){ - // summary: - // Returns a reference to the document object inside iframe_el - // tags: - // protected - return iframe_el.contentDocument // W3 - || (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE - || (iframe_el.name && win.doc.frames[iframe_el.name] && win.doc.frames[iframe_el.name].document) - || null; // HTMLDocument - }, - - bindDomNode: function(/*String|DomNode*/ node){ - // summary: - // Attach menu to given node - node = dom.byId(node, this.ownerDocument); - - var cn; // Connect node - - // Support context menus on iframes. Rather than binding to the iframe itself we need - // to bind to the <body> node inside the iframe. - if(node.tagName.toLowerCase() == "iframe"){ - var iframe = node, - window = this._iframeContentWindow(iframe); - cn = win.body(window.document); - }else{ - // To capture these events at the top level, attach to <html>, not <body>. - // Otherwise right-click context menu just doesn't work. - cn = (node == win.body(this.ownerDocument) ? this.ownerDocument.documentElement : node); - } - - - // "binding" is the object to track our connection to the node (ie, the parameter to bindDomNode()) - var binding = { - node: node, - iframe: iframe - }; - - // Save info about binding in _bindings[], and make node itself record index(+1) into - // _bindings[] array. Prefix w/_dijitMenu to avoid setting an attribute that may - // start with a number, which fails on FF/safari. - domAttr.set(node, "_dijitMenu" + this.id, this._bindings.push(binding)); - - // Setup the connections to monitor click etc., unless we are connecting to an iframe which hasn't finished - // loading yet, in which case we need to wait for the onload event first, and then connect - // On linux Shift-F10 produces the oncontextmenu event, but on Windows it doesn't, so - // we need to monitor keyboard events in addition to the oncontextmenu event. - var doConnects = lang.hitch(this, function(cn){ - var selector = this.selector, - delegatedEvent = selector ? - function(eventType){ return on.selector(selector, eventType); } : - function(eventType){ return eventType; }, - self = this; - return [ - // TODO: when leftClickToOpen is true then shouldn't space/enter key trigger the menu, - // rather than shift-F10? - on(cn, delegatedEvent(this.leftClickToOpen ? "click" : "contextmenu"), function(evt){ - // Schedule context menu to be opened unless it's already been scheduled from onkeydown handler - event.stop(evt); - self._scheduleOpen(this, iframe, {x: evt.pageX, y: evt.pageY}); - }), - on(cn, delegatedEvent("keydown"), function(evt){ - if(evt.shiftKey && evt.keyCode == keys.F10){ - event.stop(evt); - self._scheduleOpen(this, iframe); // no coords - open near target node - } - }) - ]; - }); - binding.connects = cn ? doConnects(cn) : []; - - if(iframe){ - // Setup handler to [re]bind to the iframe when the contents are initially loaded, - // and every time the contents change. - // Need to do this b/c we are actually binding to the iframe's <body> node. - // Note: can't use connect.connect(), see #9609. - - binding.onloadHandler = lang.hitch(this, function(){ - // want to remove old connections, but IE throws exceptions when trying to - // access the <body> node because it's already gone, or at least in a state of limbo - - var window = this._iframeContentWindow(iframe); - cn = win.body(window.document) - binding.connects = doConnects(cn); - }); - if(iframe.addEventListener){ - iframe.addEventListener("load", binding.onloadHandler, false); - }else{ - iframe.attachEvent("onload", binding.onloadHandler); - } - } - }, - - unBindDomNode: function(/*String|DomNode*/ nodeName){ - // summary: - // Detach menu from given node - - var node; - try{ - node = dom.byId(nodeName, this.ownerDocument); - }catch(e){ - // On IE the dom.byId() call will get an exception if the attach point was - // the <body> node of an <iframe> that has since been reloaded (and thus the - // <body> node is in a limbo state of destruction. - return; - } - - // node["_dijitMenu" + this.id] contains index(+1) into my _bindings[] array - var attrName = "_dijitMenu" + this.id; - if(node && domAttr.has(node, attrName)){ - var bid = domAttr.get(node, attrName)-1, b = this._bindings[bid], h; - while((h = b.connects.pop())){ - h.remove(); - } - - // Remove listener for iframe onload events - var iframe = b.iframe; - if(iframe){ - if(iframe.removeEventListener){ - iframe.removeEventListener("load", b.onloadHandler, false); - }else{ - iframe.detachEvent("onload", b.onloadHandler); - } - } - - domAttr.remove(node, attrName); - delete this._bindings[bid]; - } - }, - - _scheduleOpen: function(/*DomNode?*/ target, /*DomNode?*/ iframe, /*Object?*/ coords){ - // summary: - // Set timer to display myself. Using a timer rather than displaying immediately solves - // two problems: - // - // 1. IE: without the delay, focus work in "open" causes the system - // context menu to appear in spite of stopEvent. - // - // 2. Avoid double-shows on linux, where shift-F10 generates an oncontextmenu event - // even after a event.stop(e). (Shift-F10 on windows doesn't generate the - // oncontextmenu event.) - - if(!this._openTimer){ - this._openTimer = this.defer(function(){ - delete this._openTimer; - this._openMyself({ - target: target, - iframe: iframe, - coords: coords - }); - }, 1); - } - }, - - _openMyself: function(args){ - // summary: - // Internal function for opening myself when the user does a right-click or something similar. - // args: - // This is an Object containing: - // - // - target: The node that is being clicked - // - iframe: If an `<iframe>` is being clicked, iframe points to that iframe - // - coords: Put menu at specified x/y position in viewport, or if iframe is - // specified, then relative to iframe. - // - // _openMyself() formerly took the event object, and since various code references - // evt.target (after connecting to _openMyself()), using an Object for parameters - // (so that old code still works). - - var target = args.target, - iframe = args.iframe, - coords = args.coords; - - // To be used by MenuItem event handlers to tell which node the menu was opened on - this.currentTarget = target; - - // Get coordinates to open menu, either at specified (mouse) position or (if triggered via keyboard) - // then near the node the menu is assigned to. - if(coords){ - if(iframe){ - // Specified coordinates are on <body> node of an <iframe>, convert to match main document - var ifc = domGeometry.position(iframe, true), - window = this._iframeContentWindow(iframe), - scroll = domGeometry.docScroll(window.document); - - var cs = domStyle.getComputedStyle(iframe), - tp = domStyle.toPixelValue, - left = (has("ie") && has("quirks") ? 0 : tp(iframe, cs.paddingLeft)) + (has("ie") && has("quirks") ? tp(iframe, cs.borderLeftWidth) : 0), - top = (has("ie") && has("quirks") ? 0 : tp(iframe, cs.paddingTop)) + (has("ie") && has("quirks") ? tp(iframe, cs.borderTopWidth) : 0); - - coords.x += ifc.x + left - scroll.x; - coords.y += ifc.y + top - scroll.y; - } - }else{ - coords = domGeometry.position(target, true); - coords.x += 10; - coords.y += 10; - } - - var self=this; - var prevFocusNode = this._focusManager.get("prevNode"); - var curFocusNode = this._focusManager.get("curNode"); - var savedFocusNode = !curFocusNode || (dom.isDescendant(curFocusNode, this.domNode)) ? prevFocusNode : curFocusNode; - - function closeAndRestoreFocus(){ - // user has clicked on a menu or popup - if(self.refocus && savedFocusNode){ - savedFocusNode.focus(); - } - pm.close(self); - } - pm.open({ - popup: this, - x: coords.x, - y: coords.y, - onExecute: closeAndRestoreFocus, - onCancel: closeAndRestoreFocus, - orient: this.isLeftToRight() ? 'L' : 'R' - }); - this.focus(); - - this._onBlur = function(){ - this.inherited('_onBlur', arguments); - // Usually the parent closes the child widget but if this is a context - // menu then there is no parent - pm.close(this); - // don't try to restore focus; user has clicked another part of the screen - // and set focus there - }; - }, - - destroy: function(){ - array.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this); - this.inherited(arguments); - } -}); - -}); diff --git a/lib/dijit/MenuBar.js.uncompressed.js b/lib/dijit/MenuBar.js.uncompressed.js deleted file mode 100644 index b71c1ceb1..000000000 --- a/lib/dijit/MenuBar.js.uncompressed.js +++ /dev/null @@ -1,92 +0,0 @@ -require({cache:{ -'url:dijit/templates/MenuBar.html':"<div class=\"dijitMenuBar dijitMenuPassive\" data-dojo-attach-point=\"containerNode\" role=\"menubar\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress: _onKeyPress\"></div>\n"}}); -define("dijit/MenuBar", [ - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/keys", // keys.DOWN_ARROW - "./_MenuBase", - "dojo/text!./templates/MenuBar.html" -], function(declare, event, keys, _MenuBase, template){ - -// module: -// dijit/MenuBar - -return declare("dijit.MenuBar", _MenuBase, { - // summary: - // A menu bar, listing menu choices horizontally, like the "File" menu in most desktop applications - - templateString: template, - - baseClass: "dijitMenuBar", - - // _isMenuBar: [protected] Boolean - // This is a MenuBar widget, not a (vertical) Menu widget. - _isMenuBar: true, - - postCreate: function(){ - this.inherited(arguments); - var l = this.isLeftToRight(); - this.connectKeyNavHandlers( - l ? [keys.LEFT_ARROW] : [keys.RIGHT_ARROW], - l ? [keys.RIGHT_ARROW] : [keys.LEFT_ARROW] - ); - - // parameter to dijit.popup.open() about where to put popup (relative to this.domNode) - this._orient = ["below"]; - }, - - _moveToPopup: function(/*Event*/ evt){ - // summary: - // This handles the down arrow key, opening a submenu if one exists. - // Unlike _MenuBase._moveToPopup(), will never move to the next item in the MenuBar. - // tags: - // private - - if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){ - this.onItemClick(this.focusedChild, evt); - } - }, - - focusChild: function(item){ - // overload focusChild so that whenever the focus is moved to a new item, - // check the previous focused whether it has its popup open, if so, after - // focusing the new item, open its submenu immediately - var prev_item = this.focusedChild, - showpopup = prev_item && prev_item.popup && prev_item.popup.isShowingNow; - this.inherited(arguments); - if(showpopup && item.popup && !item.disabled){ - this._openPopup(true); // TODO: on down arrow, _openPopup() is called here and in onItemClick() - } - }, - - _onKeyPress: function(/*Event*/ evt){ - // summary: - // Handle keyboard based menu navigation. - // tags: - // protected - - if(evt.ctrlKey || evt.altKey){ return; } - - switch(evt.charOrCode){ - case keys.DOWN_ARROW: - this._moveToPopup(evt); - event.stop(evt); - } - }, - - onItemClick: function(/*dijit/_WidgetBase*/ item, /*Event*/ evt){ - // summary: - // Handle clicks on an item. Also called by _moveToPopup() due to a down-arrow key on the item. - // Cancels a dropdown if already open and click is either mouse or space/enter. - // Don't close dropdown due to down arrow. - // tags: - // private - if(item.popup && item.popup.isShowingNow && (evt.type !== "keypress" || evt.keyCode !== keys.DOWN_ARROW)){ - item.popup.onCancel(); - }else{ - this.inherited(arguments); - } - } -}); - -}); diff --git a/lib/dijit/MenuBarItem.js.uncompressed.js b/lib/dijit/MenuBarItem.js.uncompressed.js deleted file mode 100644 index 74294b06c..000000000 --- a/lib/dijit/MenuBarItem.js.uncompressed.js +++ /dev/null @@ -1,28 +0,0 @@ -require({cache:{ -'url:dijit/templates/MenuBarItem.html':"<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" data-dojo-attach-point=\"focusNode\"\n\t \trole=\"menuitem\" tabIndex=\"-1\">\n\t<span data-dojo-attach-point=\"containerNode\"></span>\n</div>\n"}}); -define("dijit/MenuBarItem", [ - "dojo/_base/declare", // declare - "./MenuItem", - "dojo/text!./templates/MenuBarItem.html" -], function(declare, MenuItem, template){ - - // module: - // dijit/MenuBarItem - - var _MenuBarItemMixin = declare("dijit._MenuBarItemMixin", null, { - templateString: template, - - // Map widget attributes to DOMNode attributes. - _setIconClassAttr: null // cancel MenuItem setter because we don't have a place for an icon - }); - - var MenuBarItem = declare("dijit.MenuBarItem", [MenuItem, _MenuBarItemMixin], { - // summary: - // Item in a MenuBar that's clickable, and doesn't spawn a submenu when pressed (or hovered) - - }); - MenuBarItem._MenuBarItemMixin = _MenuBarItemMixin; // dojox.mobile is accessing this - - - return MenuBarItem; -}); diff --git a/lib/dijit/MenuItem.js.uncompressed.js b/lib/dijit/MenuItem.js.uncompressed.js deleted file mode 100644 index 3d5ff3908..000000000 --- a/lib/dijit/MenuItem.js.uncompressed.js +++ /dev/null @@ -1,187 +0,0 @@ -require({cache:{ -'url:dijit/templates/MenuItem.html':"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div data-dojo-attach-point=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\"/>\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n"}}); -define("dijit/MenuItem", [ - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "dojo/dom-attr", // domAttr.set - "dojo/dom-class", // domClass.toggle - "dojo/_base/kernel", // kernel.deprecated - "dojo/sniff", // has("ie") - "./_Widget", - "./_TemplatedMixin", - "./_Contained", - "./_CssStateMixin", - "dojo/text!./templates/MenuItem.html" -], function(declare, dom, domAttr, domClass, kernel, has, - _Widget, _TemplatedMixin, _Contained, _CssStateMixin, template){ - - // module: - // dijit/MenuItem - - return declare("dijit.MenuItem", - [_Widget, _TemplatedMixin, _Contained, _CssStateMixin], - { - // summary: - // A line item in a Menu Widget - - // Make 3 columns - // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu - templateString: template, - - baseClass: "dijitMenuItem", - - // label: String - // Menu text - label: "", - _setLabelAttr: function(val){ - this.containerNode.innerHTML = val; - this._set("label", val); - if(this.textDir === "auto"){ - this.applyTextDir(this.focusNode, this.label); - } - }, - - // iconClass: String - // Class to apply to DOMNode to make it display an icon. - iconClass: "dijitNoIcon", - _setIconClassAttr: { node: "iconNode", type: "class" }, - - // accelKey: String - // Text for the accelerator (shortcut) key combination. - // Note that although Menu can display accelerator keys there - // is no infrastructure to actually catch and execute these - // accelerators. - accelKey: "", - - // disabled: Boolean - // If true, the menu item is disabled. - // If false, the menu item is enabled. - disabled: false, - - _fillContent: function(/*DomNode*/ source){ - // If button label is specified as srcNodeRef.innerHTML rather than - // this.params.label, handle it here. - if(source && !("label" in this.params)){ - this.set('label', source.innerHTML); - } - }, - - buildRendering: function(){ - this.inherited(arguments); - var label = this.id+"_text"; - domAttr.set(this.containerNode, "id", label); - if(this.accelKeyNode){ - domAttr.set(this.accelKeyNode, "id", this.id + "_accel"); - label += " " + this.id + "_accel"; - } - this.domNode.setAttribute("aria-labelledby", label); - dom.setSelectable(this.domNode, false); - }, - - onClick: function(/*Event*/){ - // summary: - // User defined function to handle clicks - // tags: - // callback - }, - - focus: function(){ - // summary: - // Focus on this MenuItem - try{ - if(has("ie") == 8){ - // needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275) - this.containerNode.focus(); - } - this.focusNode.focus(); - }catch(e){ - // this throws on IE (at least) in some scenarios - } - }, - - _onFocus: function(){ - // summary: - // This is called by the focus manager when focus - // goes to this MenuItem or a child menu. - // tags: - // protected - this._setSelected(true); - this.getParent()._onItemFocus(this); - - this.inherited(arguments); - }, - - _setSelected: function(selected){ - // summary: - // Indicate that this node is the currently selected one - // tags: - // private - - /*** - * TODO: remove this method and calls to it, when _onBlur() is working for MenuItem. - * Currently _onBlur() gets called when focus is moved from the MenuItem to a child menu. - * That's not supposed to happen, but the problem is: - * In order to allow dijit.popup's getTopPopup() to work,a sub menu's popupParent - * points to the parent Menu, bypassing the parent MenuItem... thus the - * MenuItem is not in the chain of active widgets and gets a premature call to - * _onBlur() - */ - - domClass.toggle(this.domNode, "dijitMenuItemSelected", selected); - }, - - setLabel: function(/*String*/ content){ - // summary: - // Deprecated. Use set('label', ...) instead. - // tags: - // deprecated - kernel.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0"); - this.set("label", content); - }, - - setDisabled: function(/*Boolean*/ disabled){ - // summary: - // Deprecated. Use set('disabled', bool) instead. - // tags: - // deprecated - kernel.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.", "", "2.0"); - this.set('disabled', disabled); - }, - _setDisabledAttr: function(/*Boolean*/ value){ - // summary: - // Hook for attr('disabled', ...) to work. - // Enable or disable this menu item. - - this.focusNode.setAttribute('aria-disabled', value ? 'true' : 'false'); - this._set("disabled", value); - }, - _setAccelKeyAttr: function(/*String*/ value){ - // summary: - // Hook for attr('accelKey', ...) to work. - // Set accelKey on this menu item. - - this.accelKeyNode.style.display=value?"":"none"; - this.accelKeyNode.innerHTML=value; - //have to use colSpan to make it work in IE - domAttr.set(this.containerNode,'colSpan',value?"1":"2"); - - this._set("accelKey", value); - }, - _setTextDirAttr: function(/*String*/ textDir){ - // summary: - // Setter for textDir. - // description: - // Users shouldn't call this function; they should be calling - // set('textDir', value) - // tags: - // private - - // only if new textDir is different from the old one - // and on widgets creation. - if(!this._created || this.textDir != textDir){ - this._set("textDir", textDir); - this.applyTextDir(this.focusNode, this.label); - } - } - }); -}); diff --git a/lib/dijit/MenuSeparator.js.uncompressed.js b/lib/dijit/MenuSeparator.js.uncompressed.js deleted file mode 100644 index 8e7bf8405..000000000 --- a/lib/dijit/MenuSeparator.js.uncompressed.js +++ /dev/null @@ -1,35 +0,0 @@ -require({cache:{ -'url:dijit/templates/MenuSeparator.html':"<tr class=\"dijitMenuSeparator\">\n\t<td class=\"dijitMenuSeparatorIconCell\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n\t<td colspan=\"3\" class=\"dijitMenuSeparatorLabelCell\">\n\t\t<div class=\"dijitMenuSeparatorTop dijitMenuSeparatorLabel\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>"}}); -define("dijit/MenuSeparator", [ - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "./_WidgetBase", - "./_TemplatedMixin", - "./_Contained", - "dojo/text!./templates/MenuSeparator.html" -], function(declare, dom, _WidgetBase, _TemplatedMixin, _Contained, template){ - - // module: - // dijit/MenuSeparator - - return declare("dijit.MenuSeparator", [_WidgetBase, _TemplatedMixin, _Contained], { - // summary: - // A line between two menu items - - templateString: template, - - buildRendering: function(){ - this.inherited(arguments); - dom.setSelectable(this.domNode, false); - }, - - isFocusable: function(){ - // summary: - // Override to always return false - // tags: - // protected - - return false; // Boolean - } - }); -}); diff --git a/lib/dijit/PopupMenuBarItem.js.uncompressed.js b/lib/dijit/PopupMenuBarItem.js.uncompressed.js deleted file mode 100644 index 1e097ffcd..000000000 --- a/lib/dijit/PopupMenuBarItem.js.uncompressed.js +++ /dev/null @@ -1,16 +0,0 @@ -define("dijit/PopupMenuBarItem", [ - "dojo/_base/declare", // declare - "./PopupMenuItem", - "./MenuBarItem" -], function(declare, PopupMenuItem, MenuBarItem){ - - // module: - // dijit/PopupMenuBarItem - - var _MenuBarItemMixin = MenuBarItem._MenuBarItemMixin; - - return declare("dijit.PopupMenuBarItem", [PopupMenuItem, _MenuBarItemMixin], { - // summary: - // Item in a MenuBar like "File" or "Edit", that spawns a submenu when pressed (or hovered) - }); -}); diff --git a/lib/dijit/PopupMenuItem.js.uncompressed.js b/lib/dijit/PopupMenuItem.js.uncompressed.js deleted file mode 100644 index d8250152d..000000000 --- a/lib/dijit/PopupMenuItem.js.uncompressed.js +++ /dev/null @@ -1,73 +0,0 @@ -define("dijit/PopupMenuItem", [ - "dojo/_base/declare", // declare - "dojo/dom-style", // domStyle.set - "dojo/query", // query - "./registry", // registry.byNode - "./MenuItem", - "./hccss" -], function(declare, domStyle, query, registry, MenuItem){ - - // module: - // dijit/PopupMenuItem - - return declare("dijit.PopupMenuItem", MenuItem, { - // summary: - // An item in a Menu that spawn a drop down (usually a drop down menu) - - _fillContent: function(){ - // summary: - // When Menu is declared in markup, this code gets the menu label and - // the popup widget from the srcNodeRef. - // description: - // srcNodeRefinnerHTML contains both the menu item text and a popup widget - // The first part holds the menu item text and the second part is the popup - // example: - // | <div data-dojo-type="dijit/PopupMenuItem"> - // | <span>pick me</span> - // | <popup> ... </popup> - // | </div> - // tags: - // protected - - if(this.srcNodeRef){ - var nodes = query("*", this.srcNodeRef); - this.inherited(arguments, [nodes[0]]); - - // save pointer to srcNode so we can grab the drop down widget after it's instantiated - this.dropDownContainer = this.srcNodeRef; - } - }, - - startup: function(){ - if(this._started){ return; } - this.inherited(arguments); - - // we didn't copy the dropdown widget from the this.srcNodeRef, so it's in no-man's - // land now. move it to win.doc.body. - if(!this.popup){ - var node = query("[widgetId]", this.dropDownContainer)[0]; - this.popup = registry.byNode(node); - } - this.ownerDocumentBody.appendChild(this.popup.domNode); - this.popup.startup(); - - this.popup.domNode.style.display="none"; - if(this.arrowWrapper){ - domStyle.set(this.arrowWrapper, "visibility", ""); - } - this.focusNode.setAttribute("aria-haspopup", "true"); - }, - - destroyDescendants: function(/*Boolean*/ preserveDom){ - if(this.popup){ - // Destroy the popup, unless it's already been destroyed. This can happen because - // the popup is a direct child of <body> even though it's logically my child. - if(!this.popup._destroyed){ - this.popup.destroyRecursive(preserveDom); - } - delete this.popup; - } - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/ProgressBar.js.uncompressed.js b/lib/dijit/ProgressBar.js.uncompressed.js deleted file mode 100644 index 567e17fcb..000000000 --- a/lib/dijit/ProgressBar.js.uncompressed.js +++ /dev/null @@ -1,171 +0,0 @@ -require({cache:{ -'url:dijit/templates/ProgressBar.html':"<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div data-dojo-attach-point=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\" role=\"presentation\"></div\n\t\t><span style=\"visibility:hidden\"> </span\n\t></div\n\t><div data-dojo-attach-point=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img data-dojo-attach-point=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"}}); -define("dijit/ProgressBar", [ - "require", // require.toUrl - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.toggle - "dojo/_base/lang", // lang.mixin - "dojo/number", // number.format - "./_Widget", - "./_TemplatedMixin", - "dojo/text!./templates/ProgressBar.html" -], function(require, declare, domClass, lang, number, _Widget, _TemplatedMixin, template){ - -// module: -// dijit/ProgressBar - - -return declare("dijit.ProgressBar", [_Widget, _TemplatedMixin], { - // summary: - // A progress indication widget, showing the amount completed - // (often the percentage completed) of a task. - // - // example: - // | <div data-dojo-type="ProgressBar" - // | places="0" - // | value="..." maximum="..."> - // | </div> - - // progress: [const] String (Percentage or Number) - // Number or percentage indicating amount of task completed. - // Deprecated. Use "value" instead. - progress: "0", - - // value: String (Percentage or Number) - // Number or percentage indicating amount of task completed. - // With "%": percentage value, 0% <= progress <= 100%, or - // without "%": absolute value, 0 <= progress <= maximum. - // Infinity means that the progress bar is indeterminate. - value: "", - - // maximum: [const] Float - // Max sample number - maximum: 100, - - // places: [const] Number - // Number of places to show in values; 0 by default - places: 0, - - // indeterminate: [const] Boolean - // If false: show progress value (number or percentage). - // If true: show that a process is underway but that the amount completed is unknown. - // Deprecated. Use "value" instead. - indeterminate: false, - - // label: String? - // Label on progress bar. Defaults to percentage for determinate progress bar and - // blank for indeterminate progress bar. - label:"", - - // name: String - // this is the field name (for a form) if set. This needs to be set if you want to use - // this widget in a dijit/form/Form widget (such as dijit/Dialog) - name: '', - - templateString: template, - - // _indeterminateHighContrastImagePath: [private] URL - // URL to image to use for indeterminate progress bar when display is in high contrast mode - _indeterminateHighContrastImagePath: - require.toUrl("./themes/a11y/indeterminate_progress.gif"), - - postMixInProperties: function(){ - this.inherited(arguments); - - // Back-compat for when constructor specifies indeterminate or progress, rather than value. Remove for 2.0. - if(!(this.params && "value" in this.params)){ - this.value = this.indeterminate ? Infinity : this.progress; - } - }, - - buildRendering: function(){ - this.inherited(arguments); - this.indeterminateHighContrastImage.setAttribute("src", - this._indeterminateHighContrastImagePath.toString()); - this.update(); - }, - - update: function(/*Object?*/attributes){ - // summary: - // Internal method to change attributes of ProgressBar, similar to set(hash). Users should call - // set("value", ...) rather than calling this method directly. - // attributes: - // May provide progress and/or maximum properties on this parameter; - // see attribute specs for details. - // example: - // | myProgressBar.update({'indeterminate': true}); - // | myProgressBar.update({'progress': 80}); - // | myProgressBar.update({'indeterminate': true, label:"Loading ..." }) - // tags: - // private - - // TODO: deprecate this method and use set() instead - - lang.mixin(this, attributes || {}); - var tip = this.internalProgress, ap = this.domNode; - var percent = 1; - if(this.indeterminate){ - ap.removeAttribute("aria-valuenow"); - }else{ - if(String(this.progress).indexOf("%") != -1){ - percent = Math.min(parseFloat(this.progress)/100, 1); - this.progress = percent * this.maximum; - }else{ - this.progress = Math.min(this.progress, this.maximum); - percent = this.maximum ? this.progress / this.maximum : 0; - } - ap.setAttribute("aria-valuenow", this.progress); - } - - // Even indeterminate ProgressBars should have these attributes - ap.setAttribute("aria-describedby", this.labelNode.id); - ap.setAttribute("aria-valuemin", 0); - ap.setAttribute("aria-valuemax", this.maximum); - - this.labelNode.innerHTML = this.report(percent); - - domClass.toggle(this.domNode, "dijitProgressBarIndeterminate", this.indeterminate); - tip.style.width = (percent * 100) + "%"; - this.onChange(); - }, - - _setValueAttr: function(v){ - this._set("value", v); - if(v == Infinity){ - this.update({indeterminate:true}); - }else{ - this.update({indeterminate:false, progress:v}); - } - }, - - _setLabelAttr: function(label){ - this._set("label", label); - this.update(); - }, - - _setIndeterminateAttr: function(indeterminate){ - // Deprecated, use set("value", ...) instead - this.indeterminate = indeterminate; - this.update(); - }, - - report: function(/*float*/percent){ - // summary: - // Generates message to show inside progress bar (normally indicating amount of task completed). - // May be overridden. - // tags: - // extension - - return this.label ? this.label : - (this.indeterminate ? " " : number.format(percent, { type: "percent", places: this.places, locale: this.lang })); - }, - - onChange: function(){ - // summary: - // Callback fired when progress updates. - // tags: - // extension - } -}); - -}); diff --git a/lib/dijit/TitlePane.js.uncompressed.js b/lib/dijit/TitlePane.js.uncompressed.js deleted file mode 100644 index c78cd4c99..000000000 --- a/lib/dijit/TitlePane.js.uncompressed.js +++ /dev/null @@ -1,268 +0,0 @@ -require({cache:{ -'url:dijit/templates/TitlePane.html':"<div>\n\t<div data-dojo-attach-event=\"onclick:_onTitleClick, onkeydown:_onTitleKey\"\n\t\t\tclass=\"dijitTitlePaneTitle\" data-dojo-attach-point=\"titleBarNode\" id=\"${id}_titleBarNode\">\n\t\t<div class=\"dijitTitlePaneTitleFocus\" data-dojo-attach-point=\"focusNode\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"arrowNode\" class=\"dijitArrowNode\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span\n\t\t\t><span data-dojo-attach-point=\"titleNode\" class=\"dijitTitlePaneTextNode\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" data-dojo-attach-point=\"hideNode\" role=\"presentation\">\n\t\t<div class=\"dijitReset\" data-dojo-attach-point=\"wipeNode\" role=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" data-dojo-attach-point=\"containerNode\" role=\"region\" id=\"${id}_pane\" aria-labelledby=\"${id}_titleBarNode\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"}}); -define("dijit/TitlePane", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "dojo/dom-attr", // domAttr.set or get domAttr.remove - "dojo/dom-class", // domClass.replace - "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.getMarginBox - "dojo/_base/event", // event.stop - "dojo/fx", // fxUtils.wipeIn fxUtils.wipeOut - "dojo/_base/kernel", // kernel.deprecated - "dojo/keys", // keys.DOWN_ARROW keys.ENTER - "./_CssStateMixin", - "./_TemplatedMixin", - "./layout/ContentPane", - "dojo/text!./templates/TitlePane.html", - "./_base/manager" // defaultDuration -], function(array, declare, dom, domAttr, domClass, domGeometry, event, fxUtils, kernel, keys, - _CssStateMixin, _TemplatedMixin, ContentPane, template, manager){ - -// module: -// dijit/TitlePane - - -return declare("dijit.TitlePane", [ContentPane, _TemplatedMixin, _CssStateMixin], { - // summary: - // A pane with a title on top, that can be expanded or collapsed. - // - // description: - // An accessible container with a title Heading, and a content - // section that slides open and closed. TitlePane is an extension to - // `dijit/layout/ContentPane`, providing all the useful content-control aspects from it. - // - // example: - // | // load a TitlePane from remote file: - // | var foo = new dijit.TitlePane({ href: "foobar.html", title:"Title" }); - // | foo.startup(); - // - // example: - // | <!-- markup href example: --> - // | <div data-dojo-type="dijit/TitlePane" data-dojo-props="href: 'foobar.html', title: 'Title'"></div> - // - // example: - // | <!-- markup with inline data --> - // | <div data-dojo-type="dijit/TitlePane" title="Title"> - // | <p>I am content</p> - // | </div> - - // title: String - // Title of the pane - title: "", - _setTitleAttr: { node: "titleNode", type: "innerHTML" }, // override default where title becomes a hover tooltip - - // open: Boolean - // Whether pane is opened or closed. - open: true, - - // toggleable: Boolean - // Whether pane can be opened or closed by clicking the title bar. - toggleable: true, - - // tabIndex: String - // Tabindex setting for the title (so users can tab to the title then - // use space/enter to open/close the title pane) - tabIndex: "0", - - // duration: Integer - // Time in milliseconds to fade in/fade out - duration: manager.defaultDuration, - - // baseClass: [protected] String - // The root className to be placed on this widget's domNode. - baseClass: "dijitTitlePane", - - templateString: template, - - // doLayout: [protected] Boolean - // Don't change this parameter from the default value. - // This ContentPane parameter doesn't make sense for TitlePane, since TitlePane - // is never a child of a layout container, nor should TitlePane try to control - // the size of an inner widget. - doLayout: false, - - // Tooltip is defined in _WidgetBase but we need to handle the mapping to DOM here - _setTooltipAttr: {node: "focusNode", type: "attribute", attribute: "title"}, // focusNode spans the entire width, titleNode doesn't - - buildRendering: function(){ - this.inherited(arguments); - dom.setSelectable(this.titleNode, false); - }, - - postCreate: function(){ - this.inherited(arguments); - - // Hover and focus effect on title bar, except for non-toggleable TitlePanes - // This should really be controlled from _setToggleableAttr() but _CssStateMixin - // doesn't provide a way to disconnect a previous _trackMouseState() call - if(this.toggleable){ - this._trackMouseState(this.titleBarNode, "dijitTitlePaneTitle"); - } - - // setup open/close animations - var hideNode = this.hideNode, wipeNode = this.wipeNode; - this._wipeIn = fxUtils.wipeIn({ - node: wipeNode, - duration: this.duration, - beforeBegin: function(){ - hideNode.style.display=""; - } - }); - this._wipeOut = fxUtils.wipeOut({ - node: wipeNode, - duration: this.duration, - onEnd: function(){ - hideNode.style.display="none"; - } - }); - }, - - _setOpenAttr: function(/*Boolean*/ open, /*Boolean*/ animate){ - // summary: - // Hook to make set("open", boolean) control the open/closed state of the pane. - // open: Boolean - // True if you want to open the pane, false if you want to close it. - - array.forEach([this._wipeIn, this._wipeOut], function(animation){ - if(animation && animation.status() == "playing"){ - animation.stop(); - } - }); - - if(animate){ - var anim = this[open ? "_wipeIn" : "_wipeOut"]; - anim.play(); - }else{ - this.hideNode.style.display = this.wipeNode.style.display = open ? "" : "none"; - } - - // load content (if this is the first time we are opening the TitlePane - // and content is specified as an href, or href was set when hidden) - if(this._started){ - if(open){ - this._onShow(); - }else{ - this.onHide(); - } - } - - this.containerNode.setAttribute("aria-hidden", open ? "false" : "true"); - this.focusNode.setAttribute("aria-pressed", open ? "true" : "false"); - - this._set("open", open); - - this._setCss(); - }, - - _setToggleableAttr: function(/*Boolean*/ canToggle){ - // summary: - // Hook to make set("toggleable", boolean) work. - // canToggle: Boolean - // True to allow user to open/close pane by clicking title bar. - - this.focusNode.setAttribute("role", canToggle ? "button" : "heading"); - if(canToggle){ - this.focusNode.setAttribute("aria-controls", this.id+"_pane"); - this.focusNode.setAttribute("tabIndex", this.tabIndex); - this.focusNode.setAttribute("aria-pressed", this.open); - }else{ - domAttr.remove(this.focusNode, "aria-controls"); - domAttr.remove(this.focusNode, "tabIndex"); - domAttr.remove(this.focusNode, "aria-pressed"); - } - - this._set("toggleable", canToggle); - - this._setCss(); - }, - - _setContentAttr: function(/*String|DomNode|Nodelist*/ content){ - // summary: - // Hook to make set("content", ...) work. - // Typically called when an href is loaded. Our job is to make the animation smooth. - - if(!this.open || !this._wipeOut || this._wipeOut.status() == "playing"){ - // we are currently *closing* the pane (or the pane is closed), so just let that continue - this.inherited(arguments); - }else{ - if(this._wipeIn && this._wipeIn.status() == "playing"){ - this._wipeIn.stop(); - } - - // freeze container at current height so that adding new content doesn't make it jump - domGeometry.setMarginBox(this.wipeNode, { h: domGeometry.getMarginBox(this.wipeNode).h }); - - // add the new content (erasing the old content, if any) - this.inherited(arguments); - - // call _wipeIn.play() to animate from current height to new height - if(this._wipeIn){ - this._wipeIn.play(); - }else{ - this.hideNode.style.display = ""; - } - } - }, - - toggle: function(){ - // summary: - // Switches between opened and closed state - // tags: - // private - - this._setOpenAttr(!this.open, true); - }, - - _setCss: function(){ - // summary: - // Set the open/close css state for the TitlePane - // tags: - // private - - var node = this.titleBarNode || this.focusNode; - var oldCls = this._titleBarClass; - this._titleBarClass = "dijit" + (this.toggleable ? "" : "Fixed") + (this.open ? "Open" : "Closed"); - domClass.replace(node, this._titleBarClass, oldCls || ""); - - this.arrowNodeInner.innerHTML = this.open ? "-" : "+"; - }, - - _onTitleKey: function(/*Event*/ e){ - // summary: - // Handler for when user hits a key - // tags: - // private - - if(e.keyCode == keys.ENTER || e.keyCode == keys.SPACE){ - if(this.toggleable){ - this.toggle(); - event.stop(e); - } - }else if(e.keyCode == keys.DOWN_ARROW && this.open){ - this.containerNode.focus(); - e.preventDefault(); - } - }, - - _onTitleClick: function(){ - // summary: - // Handler when user clicks the title bar - // tags: - // private - if(this.toggleable){ - this.toggle(); - } - }, - - setTitle: function(/*String*/ title){ - // summary: - // Deprecated. Use set('title', ...) instead. - // tags: - // deprecated - kernel.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.", "", "2.0"); - this.set("title", title); - } -}); - -}); diff --git a/lib/dijit/Toolbar.js.uncompressed.js b/lib/dijit/Toolbar.js.uncompressed.js deleted file mode 100644 index 47e051bb4..000000000 --- a/lib/dijit/Toolbar.js.uncompressed.js +++ /dev/null @@ -1,43 +0,0 @@ -define("dijit/Toolbar", [ - "require", - "dojo/_base/declare", // declare - "dojo/has", - "dojo/keys", // keys.LEFT_ARROW keys.RIGHT_ARROW - "dojo/ready", - "./_Widget", - "./_KeyNavContainer", - "./_TemplatedMixin" -], function(require, declare, has, keys, ready, _Widget, _KeyNavContainer, _TemplatedMixin){ - - // module: - // dijit/Toolbar - - - // Back compat w/1.6, remove for 2.0 - if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/ToolbarSeparator"]; - require(requires); // use indirection so modules not rolled into a build - }); - } - - return declare("dijit.Toolbar", [_Widget, _TemplatedMixin, _KeyNavContainer], { - // summary: - // A Toolbar widget, used to hold things like `dijit.Editor` buttons - - templateString: - '<div class="dijit" role="toolbar" tabIndex="${tabIndex}" data-dojo-attach-point="containerNode">' + - '</div>', - - baseClass: "dijitToolbar", - - postCreate: function(){ - this.inherited(arguments); - - this.connectKeyNavHandlers( - this.isLeftToRight() ? [keys.LEFT_ARROW] : [keys.RIGHT_ARROW], - this.isLeftToRight() ? [keys.RIGHT_ARROW] : [keys.LEFT_ARROW] - ); - } - }); -}); diff --git a/lib/dijit/ToolbarSeparator.js.uncompressed.js b/lib/dijit/ToolbarSeparator.js.uncompressed.js deleted file mode 100644 index e1b97d851..000000000 --- a/lib/dijit/ToolbarSeparator.js.uncompressed.js +++ /dev/null @@ -1,31 +0,0 @@ -define("dijit/ToolbarSeparator", [ - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "./_Widget", - "./_TemplatedMixin" -], function(declare, dom, _Widget, _TemplatedMixin){ - - // module: - // dijit/ToolbarSeparator - - - return declare("dijit.ToolbarSeparator", [_Widget, _TemplatedMixin], { - // summary: - // A spacer between two `dijit.Toolbar` items - - templateString: '<div class="dijitToolbarSeparator dijitInline" role="presentation"></div>', - - buildRendering: function(){ - this.inherited(arguments); - dom.setSelectable(this.domNode, false); - }, - - isFocusable: function(){ - // summary: - // This widget isn't focusable, so pass along that fact. - // tags: - // protected - return false; - } - }); -}); diff --git a/lib/dijit/Tooltip.js.uncompressed.js b/lib/dijit/Tooltip.js.uncompressed.js deleted file mode 100644 index 3a181b360..000000000 --- a/lib/dijit/Tooltip.js.uncompressed.js +++ /dev/null @@ -1,542 +0,0 @@ -require({cache:{ -'url:dijit/templates/Tooltip.html':"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" data-dojo-attach-point=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" data-dojo-attach-point=\"connectorNode\"></div\n></div>\n"}}); -define("dijit/Tooltip", [ - "dojo/_base/array", // array.forEach array.indexOf array.map - "dojo/_base/declare", // declare - "dojo/_base/fx", // fx.fadeIn fx.fadeOut - "dojo/dom", // dom.byId - "dojo/dom-class", // domClass.add - "dojo/dom-geometry", // domGeometry.position - "dojo/dom-style", // domStyle.set, domStyle.get - "dojo/_base/lang", // lang.hitch lang.isArrayLike - "dojo/mouse", - "dojo/on", - "dojo/sniff", // has("ie") - "./_base/manager", // manager.defaultDuration - "./place", - "./_Widget", - "./_TemplatedMixin", - "./BackgroundIframe", - "dojo/text!./templates/Tooltip.html", - "./main" // sets dijit.showTooltip etc. for back-compat -], function(array, declare, fx, dom, domClass, domGeometry, domStyle, lang, mouse, on, has, - manager, place, _Widget, _TemplatedMixin, BackgroundIframe, template, dijit){ - - // module: - // dijit/Tooltip - - - // TODO: Tooltip should really share more positioning code with TooltipDialog, like: - // - the orient() method - // - the connector positioning code in show() - // - the dijitTooltip[Dialog] class - // - // The problem is that Tooltip's implementation supplies it's own <iframe> and interacts directly - // with dijit/place, rather than going through dijit/popup like TooltipDialog and other popups (ex: Menu). - - var MasterTooltip = declare("dijit._MasterTooltip", [_Widget, _TemplatedMixin], { - // summary: - // Internal widget that holds the actual tooltip markup, - // which occurs once per page. - // Called by Tooltip widgets which are just containers to hold - // the markup - // tags: - // protected - - // duration: Integer - // Milliseconds to fade in/fade out - duration: manager.defaultDuration, - - templateString: template, - - postCreate: function(){ - this.ownerDocumentBody.appendChild(this.domNode); - - this.bgIframe = new BackgroundIframe(this.domNode); - - // Setup fade-in and fade-out functions. - this.fadeIn = fx.fadeIn({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, "_onShow") }); - this.fadeOut = fx.fadeOut({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, "_onHide") }); - }, - - show: function(innerHTML, aroundNode, position, rtl, textDir){ - // summary: - // Display tooltip w/specified contents to right of specified node - // (To left if there's no space on the right, or if rtl == true) - // innerHTML: String - // Contents of the tooltip - // aroundNode: DomNode|dijit/place.__Rectangle - // Specifies that tooltip should be next to this node / area - // position: String[]? - // List of positions to try to position tooltip (ex: ["right", "above"]) - // rtl: Boolean? - // Corresponds to `WidgetBase.dir` attribute, where false means "ltr" and true - // means "rtl"; specifies GUI direction, not text direction. - // textDir: String? - // Corresponds to `WidgetBase.textdir` attribute; specifies direction of text. - - - if(this.aroundNode && this.aroundNode === aroundNode && this.containerNode.innerHTML == innerHTML){ - return; - } - - if(this.fadeOut.status() == "playing"){ - // previous tooltip is being hidden; wait until the hide completes then show new one - this._onDeck=arguments; - return; - } - this.containerNode.innerHTML=innerHTML; - - if(textDir){ - this.set("textDir", textDir); - } - - this.containerNode.align = rtl? "right" : "left"; //fix the text alignment - - var pos = place.around(this.domNode, aroundNode, - position && position.length ? position : Tooltip.defaultPosition, !rtl, lang.hitch(this, "orient")); - - // Position the tooltip connector for middle alignment. - // This could not have been done in orient() since the tooltip wasn't positioned at that time. - var aroundNodeCoords = pos.aroundNodePos; - if(pos.corner.charAt(0) == 'M' && pos.aroundCorner.charAt(0) == 'M'){ - this.connectorNode.style.top = aroundNodeCoords.y + ((aroundNodeCoords.h - this.connectorNode.offsetHeight) >> 1) - pos.y + "px"; - this.connectorNode.style.left = ""; - }else if(pos.corner.charAt(1) == 'M' && pos.aroundCorner.charAt(1) == 'M'){ - this.connectorNode.style.left = aroundNodeCoords.x + ((aroundNodeCoords.w - this.connectorNode.offsetWidth) >> 1) - pos.x + "px"; - }else{ - // Not *-centered, but just above/below/after/before - this.connectorNode.style.left = ""; - this.connectorNode.style.top = ""; - } - - // show it - domStyle.set(this.domNode, "opacity", 0); - this.fadeIn.play(); - this.isShowingNow = true; - this.aroundNode = aroundNode; - }, - - orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ tooltipCorner, /*Object*/ spaceAvailable, /*Object*/ aroundNodeCoords){ - // summary: - // Private function to set CSS for tooltip node based on which position it's in. - // This is called by the dijit popup code. It will also reduce the tooltip's - // width to whatever width is available - // tags: - // protected - - this.connectorNode.style.top = ""; //reset to default - - var heightAvailable = spaceAvailable.h, - widthAvailable = spaceAvailable.w; - - node.className = "dijitTooltip " + - { - "MR-ML": "dijitTooltipRight", - "ML-MR": "dijitTooltipLeft", - "TM-BM": "dijitTooltipAbove", - "BM-TM": "dijitTooltipBelow", - "BL-TL": "dijitTooltipBelow dijitTooltipABLeft", - "TL-BL": "dijitTooltipAbove dijitTooltipABLeft", - "BR-TR": "dijitTooltipBelow dijitTooltipABRight", - "TR-BR": "dijitTooltipAbove dijitTooltipABRight", - "BR-BL": "dijitTooltipRight", - "BL-BR": "dijitTooltipLeft" - }[aroundCorner + "-" + tooltipCorner]; - - // reset width; it may have been set by orient() on a previous tooltip show() - this.domNode.style.width = "auto"; - - // Reduce tooltip's width to the amount of width available, so that it doesn't overflow screen. - // Note that sometimes widthAvailable is negative, but we guard against setting style.width to a - // negative number since that causes an exception on IE. - var size = domGeometry.position(this.domNode); - if(has("ie") == 9){ - // workaround strange IE9 bug where setting width to offsetWidth causes words to wrap - size.w += 2; - } - - var width = Math.min((Math.max(widthAvailable,1)), size.w); - - domGeometry.setMarginBox(this.domNode, {w: width}); - - // Reposition the tooltip connector. - if(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){ - var bb = domGeometry.position(node); - var tooltipConnectorHeight = this.connectorNode.offsetHeight; - if(bb.h > heightAvailable){ - // The tooltip starts at the top of the page and will extend past the aroundNode - var aroundNodePlacement = heightAvailable - ((aroundNodeCoords.h + tooltipConnectorHeight) >> 1); - this.connectorNode.style.top = aroundNodePlacement + "px"; - this.connectorNode.style.bottom = ""; - }else{ - // Align center of connector with center of aroundNode, except don't let bottom - // of connector extend below bottom of tooltip content, or top of connector - // extend past top of tooltip content - this.connectorNode.style.bottom = Math.min( - Math.max(aroundNodeCoords.h/2 - tooltipConnectorHeight/2, 0), - bb.h - tooltipConnectorHeight) + "px"; - this.connectorNode.style.top = ""; - } - }else{ - // reset the tooltip back to the defaults - this.connectorNode.style.top = ""; - this.connectorNode.style.bottom = ""; - } - - return Math.max(0, size.w - widthAvailable); - }, - - _onShow: function(){ - // summary: - // Called at end of fade-in operation - // tags: - // protected - if(has("ie")){ - // the arrow won't show up on a node w/an opacity filter - this.domNode.style.filter=""; - } - }, - - hide: function(aroundNode){ - // summary: - // Hide the tooltip - - if(this._onDeck && this._onDeck[1] == aroundNode){ - // this hide request is for a show() that hasn't even started yet; - // just cancel the pending show() - this._onDeck=null; - }else if(this.aroundNode === aroundNode){ - // this hide request is for the currently displayed tooltip - this.fadeIn.stop(); - this.isShowingNow = false; - this.aroundNode = null; - this.fadeOut.play(); - }else{ - // just ignore the call, it's for a tooltip that has already been erased - } - }, - - _onHide: function(){ - // summary: - // Called at end of fade-out operation - // tags: - // protected - - this.domNode.style.cssText=""; // to position offscreen again - this.containerNode.innerHTML=""; - if(this._onDeck){ - // a show request has been queued up; do it now - this.show.apply(this, this._onDeck); - this._onDeck=null; - } - }, - - _setAutoTextDir: function(/*Object*/node){ - // summary: - // Resolve "auto" text direction for children nodes - // tags: - // private - - this.applyTextDir(node, has("ie") ? node.outerText : node.textContent); - array.forEach(node.children, function(child){this._setAutoTextDir(child); }, this); - }, - - _setTextDirAttr: function(/*String*/ textDir){ - // summary: - // Setter for textDir. - // description: - // Users shouldn't call this function; they should be calling - // set('textDir', value) - // tags: - // private - - this._set("textDir", textDir); - - if (textDir == "auto"){ - this._setAutoTextDir(this.containerNode); - }else{ - this.containerNode.dir = this.textDir; - } - } - }); - - dijit.showTooltip = function(innerHTML, aroundNode, position, rtl, textDir){ - // summary: - // Static method to display tooltip w/specified contents in specified position. - // See description of dijit/Tooltip.defaultPosition for details on position parameter. - // If position is not specified then dijit/Tooltip.defaultPosition is used. - // innerHTML: String - // Contents of the tooltip - // aroundNode: place.__Rectangle - // Specifies that tooltip should be next to this node / area - // position: String[]? - // List of positions to try to position tooltip (ex: ["right", "above"]) - // rtl: Boolean? - // Corresponds to `WidgetBase.dir` attribute, where false means "ltr" and true - // means "rtl"; specifies GUI direction, not text direction. - // textDir: String? - // Corresponds to `WidgetBase.textdir` attribute; specifies direction of text. - - // After/before don't work, but for back-compat convert them to the working after-centered, before-centered. - // Possibly remove this in 2.0. Alternately, get before/after to work. - if(position){ - position = array.map(position, function(val){ - return {after: "after-centered", before: "before-centered"}[val] || val; - }); - } - - if(!Tooltip._masterTT){ dijit._masterTT = Tooltip._masterTT = new MasterTooltip(); } - return Tooltip._masterTT.show(innerHTML, aroundNode, position, rtl, textDir); - }; - - dijit.hideTooltip = function(aroundNode){ - // summary: - // Static method to hide the tooltip displayed via showTooltip() - return Tooltip._masterTT && Tooltip._masterTT.hide(aroundNode); - }; - - var Tooltip = declare("dijit.Tooltip", _Widget, { - // summary: - // Pops up a tooltip (a help message) when you hover over a node. - // Also provides static show() and hide() methods that can be used without instantiating a dijit/Tooltip. - - // label: String - // Text to display in the tooltip. - // Specified as innerHTML when creating the widget from markup. - label: "", - - // showDelay: Integer - // Number of milliseconds to wait after hovering over/focusing on the object, before - // the tooltip is displayed. - showDelay: 400, - - // connectId: String|String[]|DomNode|DomNode[] - // Id of domNode(s) to attach the tooltip to. - // When user hovers over specified dom node(s), the tooltip will appear. - connectId: [], - - // position: String[] - // See description of `dijit/Tooltip.defaultPosition` for details on position parameter. - position: [], - - // selector: String? - // CSS expression to apply this Tooltip to descendants of connectIds, rather than to - // the nodes specified by connectIds themselves. Useful for applying a Tooltip to - // a range of rows in a table, tree, etc. Use in conjunction with getContent() parameter. - // Ex: connectId: myTable, selector: "tr", getContent: function(node){ return ...; } - // - // The application must require() an appropriate level of dojo/query to handle the selector. - selector: "", - - // TODO: in 2.0 remove support for multiple connectIds. selector gives the same effect. - // So, change connectId to a "", remove addTarget()/removeTarget(), etc. - - _setConnectIdAttr: function(/*String|String[]}DomNode|DomNode[]*/ newId){ - // summary: - // Connect to specified node(s) - - // Remove connections to old nodes (if there are any) - array.forEach(this._connections || [], function(nested){ - array.forEach(nested, function(handle){ handle.remove(); }); - }, this); - - // Make array of id's to connect to, excluding entries for nodes that don't exist yet, see startup() - this._connectIds = array.filter(lang.isArrayLike(newId) ? newId : (newId ? [newId] : []), - function(id){ return dom.byId(id, this.ownerDocument); }, this); - - // Make connections - this._connections = array.map(this._connectIds, function(id){ - var node = dom.byId(id, this.ownerDocument), - selector = this.selector, - delegatedEvent = selector ? - function(eventType){ return on.selector(selector, eventType); } : - function(eventType){ return eventType; }, - self = this; - return [ - on(node, delegatedEvent(mouse.enter), function(){ - self._onHover(this); - }), - on(node, delegatedEvent("focusin"), function(){ - self._onHover(this); - }), - on(node, delegatedEvent(mouse.leave), lang.hitch(self, "_onUnHover")), - on(node, delegatedEvent("focusout"), lang.hitch(self, "_onUnHover")) - ]; - }, this); - - this._set("connectId", newId); - }, - - addTarget: function(/*OomNode|String*/ node){ - // summary: - // Attach tooltip to specified node if it's not already connected - - // TODO: remove in 2.0 and just use set("connectId", ...) interface - - var id = node.id || node; - if(array.indexOf(this._connectIds, id) == -1){ - this.set("connectId", this._connectIds.concat(id)); - } - }, - - removeTarget: function(/*DomNode|String*/ node){ - // summary: - // Detach tooltip from specified node - - // TODO: remove in 2.0 and just use set("connectId", ...) interface - - var id = node.id || node, // map from DOMNode back to plain id string - idx = array.indexOf(this._connectIds, id); - if(idx >= 0){ - // remove id (modifies original this._connectIds but that's OK in this case) - this._connectIds.splice(idx, 1); - this.set("connectId", this._connectIds); - } - }, - - buildRendering: function(){ - this.inherited(arguments); - domClass.add(this.domNode,"dijitTooltipData"); - }, - - startup: function(){ - this.inherited(arguments); - - // If this tooltip was created in a template, or for some other reason the specified connectId[s] - // didn't exist during the widget's initialization, then connect now. - var ids = this.connectId; - array.forEach(lang.isArrayLike(ids) ? ids : [ids], this.addTarget, this); - }, - - getContent: function(/*DomNode*/ node){ - // summary: - // User overridable function that return the text to display in the tooltip. - // tags: - // extension - return this.label || this.domNode.innerHTML; - }, - - _onHover: function(/*DomNode*/ target){ - // summary: - // Despite the name of this method, it actually handles both hover and focus - // events on the target node, setting a timer to show the tooltip. - // tags: - // private - if(!this._showTimer){ - this._showTimer = this.defer(function(){ this.open(target); }, this.showDelay); - } - }, - - _onUnHover: function(){ - // summary: - // Despite the name of this method, it actually handles both mouseleave and blur - // events on the target node, hiding the tooltip. - // tags: - // private - - if(this._showTimer){ - this._showTimer.remove(); - delete this._showTimer; - } - this.close(); - }, - - open: function(/*DomNode*/ target){ - // summary: - // Display the tooltip; usually not called directly. - // tags: - // private - - if(this._showTimer){ - this._showTimer.remove(); - delete this._showTimer; - } - - var content = this.getContent(target); - if(!content){ - return; - } - Tooltip.show(content, target, this.position, !this.isLeftToRight(), this.textDir); - - this._connectNode = target; // _connectNode means "tooltip currently displayed for this node" - this.onShow(target, this.position); - }, - - close: function(){ - // summary: - // Hide the tooltip or cancel timer for show of tooltip - // tags: - // private - - if(this._connectNode){ - // if tooltip is currently shown - Tooltip.hide(this._connectNode); - delete this._connectNode; - this.onHide(); - } - if(this._showTimer){ - // if tooltip is scheduled to be shown (after a brief delay) - this._showTimer.remove(); - delete this._showTimer; - } - }, - - onShow: function(/*===== target, position =====*/){ - // summary: - // Called when the tooltip is shown - // tags: - // callback - }, - - onHide: function(){ - // summary: - // Called when the tooltip is hidden - // tags: - // callback - }, - - destroy: function(){ - this.close(); - - // Remove connections manually since they aren't registered to be removed by _WidgetBase - array.forEach(this._connections || [], function(nested){ - array.forEach(nested, function(handle){ handle.remove(); }); - }, this); - - this.inherited(arguments); - } - }); - - Tooltip._MasterTooltip = MasterTooltip; // for monkey patching - Tooltip.show = dijit.showTooltip; // export function through module return value - Tooltip.hide = dijit.hideTooltip; // export function through module return value - - Tooltip.defaultPosition = ["after-centered", "before-centered"]; - - /*===== - lang.mixin(Tooltip, { - // defaultPosition: String[] - // This variable controls the position of tooltips, if the position is not specified to - // the Tooltip widget or *TextBox widget itself. It's an array of strings with the values - // possible for `dijit/place.around()`. The recommended values are: - // - // - before-centered: centers tooltip to the left of the anchor node/widget, or to the right - // in the case of RTL scripts like Hebrew and Arabic - // - after-centered: centers tooltip to the right of the anchor node/widget, or to the left - // in the case of RTL scripts like Hebrew and Arabic - // - above-centered: tooltip is centered above anchor node - // - below-centered: tooltip is centered above anchor node - // - // The list is positions is tried, in order, until a position is found where the tooltip fits - // within the viewport. - // - // Be careful setting this parameter. A value of "above-centered" may work fine until the user scrolls - // the screen so that there's no room above the target node. Nodes with drop downs, like - // DropDownButton or FilteringSelect, are especially problematic, in that you need to be sure - // that the drop down and tooltip don't overlap, even when the viewport is scrolled so that there - // is only room below (or above) the target node, but not both. - }); - =====*/ - return Tooltip; -}); diff --git a/lib/dijit/TooltipDialog.js.uncompressed.js b/lib/dijit/TooltipDialog.js.uncompressed.js deleted file mode 100644 index c11e38e9d..000000000 --- a/lib/dijit/TooltipDialog.js.uncompressed.js +++ /dev/null @@ -1,174 +0,0 @@ -require({cache:{ -'url:dijit/templates/TooltipDialog.html':"<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" data-dojo-attach-point=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\" data-dojo-attach-point=\"connectorNode\"></div>\n</div>\n"}}); -define("dijit/TooltipDialog", [ - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.replace - "dojo/_base/event", // event.stop - "dojo/keys", // keys - "dojo/_base/lang", // lang.hitch - "./focus", - "./layout/ContentPane", - "./_DialogMixin", - "./form/_FormMixin", - "./_TemplatedMixin", - "dojo/text!./templates/TooltipDialog.html", - "./main" // exports methods to dijit global -], function(declare, domClass, event, keys, lang, - focus, ContentPane, _DialogMixin, _FormMixin, _TemplatedMixin, template, dijit){ - - // module: - // dijit/TooltipDialog - - - return declare("dijit.TooltipDialog", - [ContentPane, _TemplatedMixin, _FormMixin, _DialogMixin], { - // summary: - // Pops up a dialog that appears like a Tooltip - - // title: String - // Description of tooltip dialog (required for a11y) - title: "", - - // doLayout: [protected] Boolean - // Don't change this parameter from the default value. - // This ContentPane parameter doesn't make sense for TooltipDialog, since TooltipDialog - // is never a child of a layout container, nor can you specify the size of - // TooltipDialog in order to control the size of an inner widget. - doLayout: false, - - // autofocus: Boolean - // A Toggle to modify the default focus behavior of a Dialog, which - // is to focus on the first dialog element after opening the dialog. - // False will disable autofocusing. Default: true. - autofocus: true, - - // baseClass: [protected] String - // The root className to use for the various states of this widget - baseClass: "dijitTooltipDialog", - - // _firstFocusItem: [private readonly] DomNode - // The pointer to the first focusable node in the dialog. - // Set by `dijit/_DialogMixin._getFocusItems()`. - _firstFocusItem: null, - - // _lastFocusItem: [private readonly] DomNode - // The pointer to which node has focus prior to our dialog. - // Set by `dijit/_DialogMixin._getFocusItems()`. - _lastFocusItem: null, - - templateString: template, - - _setTitleAttr: function(/*String*/ title){ - this.containerNode.title = title; - this._set("title", title); - }, - - postCreate: function(){ - this.inherited(arguments); - this.connect(this.containerNode, "onkeypress", "_onKey"); - }, - - orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ tooltipCorner){ - // summary: - // Configure widget to be displayed in given position relative to the button. - // This is called from the dijit.popup code, and should not be called - // directly. - // tags: - // protected - - // Note: intentionally not using dijitTooltip class since that sets position:absolute, which - // confuses dijit/popup trying to get the size of the tooltip. - var newC = { - "MR-ML": "dijitTooltipRight", - "ML-MR": "dijitTooltipLeft", - "TM-BM": "dijitTooltipAbove", - "BM-TM": "dijitTooltipBelow", - "BL-TL": "dijitTooltipBelow dijitTooltipABLeft", - "TL-BL": "dijitTooltipAbove dijitTooltipABLeft", - "BR-TR": "dijitTooltipBelow dijitTooltipABRight", - "TR-BR": "dijitTooltipAbove dijitTooltipABRight", - "BR-BL": "dijitTooltipRight", - "BL-BR": "dijitTooltipLeft" - }[aroundCorner + "-" + tooltipCorner]; - - domClass.replace(this.domNode, newC, this._currentOrientClass || ""); - this._currentOrientClass = newC; - - // Tooltip.orient() has code to reposition connector for when Tooltip is before/after anchor. - // Not putting here to avoid code bloat, and since TooltipDialogs are generally above/below. - // Should combine code from Tooltip and TooltipDialog. - }, - - focus: function(){ - // summary: - // Focus on first field - this._getFocusItems(this.containerNode); - focus.focus(this._firstFocusItem); - }, - - onOpen: function(/*Object*/ pos){ - // summary: - // Called when dialog is displayed. - // This is called from the dijit.popup code, and should not be called directly. - // tags: - // protected - - this.orient(this.domNode,pos.aroundCorner, pos.corner); - - // Position the tooltip connector for middle alignment. - // This could not have been done in orient() since the tooltip wasn't positioned at that time. - var aroundNodeCoords = pos.aroundNodePos; - if(pos.corner.charAt(0) == 'M' && pos.aroundCorner.charAt(0) == 'M'){ - this.connectorNode.style.top = aroundNodeCoords.y + ((aroundNodeCoords.h - this.connectorNode.offsetHeight) >> 1) - pos.y + "px"; - this.connectorNode.style.left = ""; - }else if(pos.corner.charAt(1) == 'M' && pos.aroundCorner.charAt(1) == 'M'){ - this.connectorNode.style.left = aroundNodeCoords.x + ((aroundNodeCoords.w - this.connectorNode.offsetWidth) >> 1) - pos.x + "px"; - } - - this._onShow(); // lazy load trigger (TODO: shouldn't we load before positioning?) - }, - - onClose: function(){ - // summary: - // Called when dialog is hidden. - // This is called from the dijit.popup code, and should not be called directly. - // tags: - // protected - this.onHide(); - }, - - _onKey: function(/*Event*/ evt){ - // summary: - // Handler for keyboard events - // description: - // Keep keyboard focus in dialog; close dialog on escape key - // tags: - // private - - var node = evt.target; - if(evt.charOrCode === keys.TAB){ - this._getFocusItems(this.containerNode); - } - var singleFocusItem = (this._firstFocusItem == this._lastFocusItem); - if(evt.charOrCode == keys.ESCAPE){ - // Use defer to avoid crash on IE, see #10396. - this.defer("onCancel"); - event.stop(evt); - }else if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === keys.TAB){ - if(!singleFocusItem){ - focus.focus(this._lastFocusItem); // send focus to last item in dialog - } - event.stop(evt); - }else if(node == this._lastFocusItem && evt.charOrCode === keys.TAB && !evt.shiftKey){ - if(!singleFocusItem){ - focus.focus(this._firstFocusItem); // send focus to first item in dialog - } - event.stop(evt); - }else if(evt.charOrCode === keys.TAB){ - // we want the browser's default tab handling to move focus - // but we don't want the tab to propagate upwards - evt.stopPropagation(); - } - } - }); -}); diff --git a/lib/dijit/Tree.js.uncompressed.js b/lib/dijit/Tree.js.uncompressed.js deleted file mode 100644 index c1eeaf143..000000000 --- a/lib/dijit/Tree.js.uncompressed.js +++ /dev/null @@ -1,1910 +0,0 @@ -require({cache:{ -'url:dijit/templates/TreeNode.html':"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow dijitInline\" role=\"presentation\"\n\t\t><div data-dojo-attach-point=\"indentNode\" class=\"dijitInline\"></div\n\t\t><img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span data-dojo-attach-point=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span data-dojo-attach-point=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\"></span>\n\t\t</span\n\t></div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n", -'url:dijit/templates/Tree.html':"<div class=\"dijitTree dijitTreeContainer\" role=\"tree\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" data-dojo-attach-point=\"indentDetector\"></div>\n</div>\n"}}); -define("dijit/Tree", [ - "dojo/_base/array", // array.filter array.forEach array.map - "dojo/_base/connect", // connect.isCopyKey() - "dojo/cookie", // cookie - "dojo/_base/declare", // declare - "dojo/Deferred", // Deferred - "dojo/DeferredList", // DeferredList - "dojo/dom", // dom.isDescendant - "dojo/dom-class", // domClass.add domClass.remove domClass.replace domClass.toggle - "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.position - "dojo/dom-style",// domStyle.set - "dojo/_base/event", // event.stop - "dojo/errors/create", // createError - "dojo/fx", // fxUtils.wipeIn fxUtils.wipeOut - "dojo/_base/kernel", // kernel.deprecated - "dojo/keys", // arrows etc. - "dojo/_base/lang", // lang.getObject lang.mixin lang.hitch - "dojo/on", // on(), on.selector() - "dojo/topic", - "dojo/touch", - "dojo/when", - "./focus", - "./registry", // registry.byNode(), registry.getEnclosingWidget() - "./_base/manager", // manager.defaultDuration - "./_Widget", - "./_TemplatedMixin", - "./_Container", - "./_Contained", - "./_CssStateMixin", - "dojo/text!./templates/TreeNode.html", - "dojo/text!./templates/Tree.html", - "./tree/TreeStoreModel", - "./tree/ForestStoreModel", - "./tree/_dndSelector" -], function(array, connect, cookie, declare, Deferred, DeferredList, - dom, domClass, domGeometry, domStyle, event, createError, fxUtils, kernel, keys, lang, on, topic, touch, when, - focus, registry, manager, _Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin, - treeNodeTemplate, treeTemplate, TreeStoreModel, ForestStoreModel, _dndSelector){ - -// module: -// dijit/Tree - -// Back-compat shim -Deferred = declare(Deferred, { - addCallback: function(callback){ this.then(callback); }, - addErrback: function(errback){ this.then(null, errback); } -}); - -var TreeNode = declare( - "dijit._TreeNode", - [_Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin], -{ - // summary: - // Single node within a tree. This class is used internally - // by Tree and should not be accessed directly. - // tags: - // private - - // item: [const] Item - // the dojo.data entry this tree represents - item: null, - - // isTreeNode: [protected] Boolean - // Indicates that this is a TreeNode. Used by `dijit.Tree` only, - // should not be accessed directly. - isTreeNode: true, - - // label: String - // Text of this tree node - label: "", - _setLabelAttr: {node: "labelNode", type: "innerText"}, - - // isExpandable: [private] Boolean - // This node has children, so show the expando node (+ sign) - isExpandable: null, - - // isExpanded: [readonly] Boolean - // This node is currently expanded (ie, opened) - isExpanded: false, - - // state: [private] String - // Dynamic loading-related stuff. - // When an empty folder node appears, it is "UNCHECKED" first, - // then after dojo.data query it becomes "LOADING" and, finally "LOADED" - state: "UNCHECKED", - - templateString: treeNodeTemplate, - - baseClass: "dijitTreeNode", - - // For hover effect for tree node, and focus effect for label - cssStateNodes: { - rowNode: "dijitTreeRow" - }, - - // Tooltip is defined in _WidgetBase but we need to handle the mapping to DOM here - _setTooltipAttr: {node: "rowNode", type: "attribute", attribute: "title"}, - - buildRendering: function(){ - this.inherited(arguments); - - // set expand icon for leaf - this._setExpando(); - - // set icon and label class based on item - this._updateItemClasses(this.item); - - if(this.isExpandable){ - this.labelNode.setAttribute("aria-expanded", this.isExpanded); - } - - //aria-selected should be false on all selectable elements. - this.setSelected(false); - }, - - _setIndentAttr: function(indent){ - // summary: - // Tell this node how many levels it should be indented - // description: - // 0 for top level nodes, 1 for their children, 2 for their - // grandchildren, etc. - - // Math.max() is to prevent negative padding on hidden root node (when indent == -1) - var pixels = (Math.max(indent, 0) * this.tree._nodePixelIndent) + "px"; - - domStyle.set(this.domNode, "backgroundPosition", pixels + " 0px"); // TODOC: what is this for??? - domStyle.set(this.indentNode, this.isLeftToRight() ? "paddingLeft" : "paddingRight", pixels); - - array.forEach(this.getChildren(), function(child){ - child.set("indent", indent+1); - }); - - this._set("indent", indent); - }, - - markProcessing: function(){ - // summary: - // Visually denote that tree is loading data, etc. - // tags: - // private - this.state = "LOADING"; - this._setExpando(true); - }, - - unmarkProcessing: function(){ - // summary: - // Clear markup from markProcessing() call - // tags: - // private - this._setExpando(false); - }, - - _updateItemClasses: function(item){ - // summary: - // Set appropriate CSS classes for icon and label dom node - // (used to allow for item updates to change respective CSS) - // tags: - // private - var tree = this.tree, model = tree.model; - if(tree._v10Compat && item === model.root){ - // For back-compat with 1.0, need to use null to specify root item (TODO: remove in 2.0) - item = null; - } - this._applyClassAndStyle(item, "icon", "Icon"); - this._applyClassAndStyle(item, "label", "Label"); - this._applyClassAndStyle(item, "row", "Row"); - - this.tree._startPaint(true); // signifies paint started and finished (synchronously) - }, - - _applyClassAndStyle: function(item, lower, upper){ - // summary: - // Set the appropriate CSS classes and styles for labels, icons and rows. - // - // item: - // The data item. - // - // lower: - // The lower case attribute to use, e.g. 'icon', 'label' or 'row'. - // - // upper: - // The upper case attribute to use, e.g. 'Icon', 'Label' or 'Row'. - // - // tags: - // private - - var clsName = "_" + lower + "Class"; - var nodeName = lower + "Node"; - var oldCls = this[clsName]; - - this[clsName] = this.tree["get" + upper + "Class"](item, this.isExpanded); - domClass.replace(this[nodeName], this[clsName] || "", oldCls || ""); - - domStyle.set(this[nodeName], this.tree["get" + upper + "Style"](item, this.isExpanded) || {}); - }, - - _updateLayout: function(){ - // summary: - // Set appropriate CSS classes for this.domNode - // tags: - // private - var parent = this.getParent(); - if(!parent || !parent.rowNode || parent.rowNode.style.display == "none"){ - /* if we are hiding the root node then make every first level child look like a root node */ - domClass.add(this.domNode, "dijitTreeIsRoot"); - }else{ - domClass.toggle(this.domNode, "dijitTreeIsLast", !this.getNextSibling()); - } - }, - - _setExpando: function(/*Boolean*/ processing){ - // summary: - // Set the right image for the expando node - // tags: - // private - - var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened", - "dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"], - _a11yStates = ["*","-","+","*"], - idx = processing ? 0 : (this.isExpandable ? (this.isExpanded ? 1 : 2) : 3); - - // apply the appropriate class to the expando node - domClass.replace(this.expandoNode, styles[idx], styles); - - // provide a non-image based indicator for images-off mode - this.expandoNodeText.innerHTML = _a11yStates[idx]; - - }, - - expand: function(){ - // summary: - // Show my children - // returns: - // Deferred that fires when expansion is complete - - // If there's already an expand in progress or we are already expanded, just return - if(this._expandDeferred){ - return this._expandDeferred; // dojo/_base/Deferred - } - - // cancel in progress collapse operation - if(this._collapseDeferred){ - this._collapseDeferred.cancel(); - delete this._collapseDeferred; - } - - // All the state information for when a node is expanded, maybe this should be - // set when the animation completes instead - this.isExpanded = true; - this.labelNode.setAttribute("aria-expanded", "true"); - if(this.tree.showRoot || this !== this.tree.rootNode){ - this.containerNode.setAttribute("role", "group"); - } - domClass.add(this.contentNode,'dijitTreeContentExpanded'); - this._setExpando(); - this._updateItemClasses(this.item); - - if(this == this.tree.rootNode && this.tree.showRoot){ - this.tree.domNode.setAttribute("aria-expanded", "true"); - } - - var def, - wipeIn = fxUtils.wipeIn({ - node: this.containerNode, - duration: manager.defaultDuration, - onEnd: function(){ - def.resolve(true); - } - }); - - // Deferred that fires when expand is complete - def = (this._expandDeferred = new Deferred(function(){ - // Canceller - wipeIn.stop(); - })); - - wipeIn.play(); - - return def; // dojo/_base/Deferred - }, - - collapse: function(){ - // summary: - // Collapse this node (if it's expanded) - - if(this._collapseDeferred){ - // Node is already collapsed, or there's a collapse in progress, just return that Deferred - return this._collapseDeferred; - } - - // cancel in progress expand operation - if(this._expandDeferred){ - this._expandDeferred.cancel(); - delete this._expandDeferred; - } - - this.isExpanded = false; - this.labelNode.setAttribute("aria-expanded", "false"); - if(this == this.tree.rootNode && this.tree.showRoot){ - this.tree.domNode.setAttribute("aria-expanded", "false"); - } - domClass.remove(this.contentNode,'dijitTreeContentExpanded'); - this._setExpando(); - this._updateItemClasses(this.item); - - var def, - wipeOut = fxUtils.wipeOut({ - node: this.containerNode, - duration: manager.defaultDuration, - onEnd: function(){ - def.resolve(true); - } - }); - - // Deferred that fires when expand is complete - def = (this._collapseDeferred = new Deferred(function(){ - // Canceller - wipeOut.stop(); - })); - - wipeOut.play(); - - return def; // dojo/_base/Deferred - }, - - // indent: Integer - // Levels from this node to the root node - indent: 0, - - setChildItems: function(/* Object[] */ items){ - // summary: - // Sets the child items of this node, removing/adding nodes - // from current children to match specified items[] array. - // Also, if this.persist == true, expands any children that were previously - // opened. - // returns: - // Deferred object that fires after all previously opened children - // have been expanded again (or fires instantly if there are no such children). - - var tree = this.tree, - model = tree.model, - defs = []; // list of deferreds that need to fire before I am complete - - - // Orphan all my existing children. - // If items contains some of the same items as before then we will reattach them. - // Don't call this.removeChild() because that will collapse the tree etc. - var oldChildren = this.getChildren(); - array.forEach(oldChildren, function(child){ - _Container.prototype.removeChild.call(this, child); - }, this); - - // All the old children of this TreeNode are subject for destruction if - // 1) they aren't listed in the new children array (items) - // 2) they aren't immediately adopted by another node (DnD) - this.defer(function(){ - array.forEach(oldChildren, function(node){ - if(!node._destroyed && !node.getParent()){ - // If node is in selection then remove it. - tree.dndController.removeTreeNode(node); - - // Deregister mapping from item id --> this node - var id = model.getIdentity(node.item), - ary = tree._itemNodesMap[id]; - if(ary.length == 1){ - delete tree._itemNodesMap[id]; - }else{ - var index = array.indexOf(ary, node); - if(index != -1){ - ary.splice(index, 1); - } - } - - // And finally we can destroy the node - node.destroyRecursive(); - } - }); - }); - - this.state = "LOADED"; - - if(items && items.length > 0){ - this.isExpandable = true; - - // Create _TreeNode widget for each specified tree node, unless one already - // exists and isn't being used (presumably it's from a DnD move and was recently - // released - array.forEach(items, function(item){ // MARKER: REUSE NODE - var id = model.getIdentity(item), - existingNodes = tree._itemNodesMap[id], - node; - if(existingNodes){ - for(var i=0;i<existingNodes.length;i++){ - if(existingNodes[i] && !existingNodes[i].getParent()){ - node = existingNodes[i]; - node.set('indent', this.indent+1); - break; - } - } - } - if(!node){ - node = this.tree._createTreeNode({ - item: item, - tree: tree, - isExpandable: model.mayHaveChildren(item), - label: tree.getLabel(item), - tooltip: tree.getTooltip(item), - ownerDocument: tree.ownerDocument, - dir: tree.dir, - lang: tree.lang, - textDir: tree.textDir, - indent: this.indent + 1 - }); - if(existingNodes){ - existingNodes.push(node); - }else{ - tree._itemNodesMap[id] = [node]; - } - } - this.addChild(node); - - // If node was previously opened then open it again now (this may trigger - // more data store accesses, recursively) - if(this.tree.autoExpand || this.tree._state(node)){ - defs.push(tree._expandNode(node)); - } - }, this); - - // note that updateLayout() needs to be called on each child after - // _all_ the children exist - array.forEach(this.getChildren(), function(child){ - child._updateLayout(); - }); - }else{ - this.isExpandable=false; - } - - if(this._setExpando){ - // change expando to/from dot or + icon, as appropriate - this._setExpando(false); - } - - // Set leaf icon or folder icon, as appropriate - this._updateItemClasses(this.item); - - // On initial tree show, make the selected TreeNode as either the root node of the tree, - // or the first child, if the root node is hidden - if(this == tree.rootNode){ - var fc = this.tree.showRoot ? this : this.getChildren()[0]; - if(fc){ - fc.setFocusable(true); - tree.lastFocused = fc; - }else{ - // fallback: no nodes in tree so focus on Tree <div> itself - tree.domNode.setAttribute("tabIndex", "0"); - } - } - - var def = new DeferredList(defs); - this.tree._startPaint(def); // to reset TreeNode widths after an item is added/removed from the Tree - return def; // dojo/_base/Deferred - }, - - getTreePath: function(){ - var node = this; - var path = []; - while(node && node !== this.tree.rootNode){ - path.unshift(node.item); - node = node.getParent(); - } - path.unshift(this.tree.rootNode.item); - - return path; - }, - - getIdentity: function(){ - return this.tree.model.getIdentity(this.item); - }, - - removeChild: function(/* treeNode */ node){ - this.inherited(arguments); - - var children = this.getChildren(); - if(children.length == 0){ - this.isExpandable = false; - this.collapse(); - } - - array.forEach(children, function(child){ - child._updateLayout(); - }); - }, - - makeExpandable: function(){ - // summary: - // if this node wasn't already showing the expando node, - // turn it into one and call _setExpando() - - // TODO: hmm this isn't called from anywhere, maybe should remove it for 2.0 - - this.isExpandable = true; - this._setExpando(false); - }, - - setSelected: function(/*Boolean*/ selected){ - // summary: - // A Tree has a (single) currently selected node. - // Mark that this node is/isn't that currently selected node. - // description: - // In particular, setting a node as selected involves setting tabIndex - // so that when user tabs to the tree, focus will go to that node (only). - this.labelNode.setAttribute("aria-selected", selected ? "true" : "false"); - domClass.toggle(this.rowNode, "dijitTreeRowSelected", selected); - }, - - setFocusable: function(/*Boolean*/ selected){ - // summary: - // A Tree has a (single) node that's focusable. - // Mark that this node is/isn't that currently focsuable node. - // description: - // In particular, setting a node as selected involves setting tabIndex - // so that when user tabs to the tree, focus will go to that node (only). - - this.labelNode.setAttribute("tabIndex", selected ? "0" : "-1"); - }, - - - _setTextDirAttr: function(textDir){ - if(textDir &&((this.textDir != textDir) || !this._created)){ - this._set("textDir", textDir); - this.applyTextDir(this.labelNode, this.labelNode.innerText || this.labelNode.textContent || ""); - array.forEach(this.getChildren(), function(childNode){ - childNode.set("textDir", textDir); - }, this); - } - } -}); - -var Tree = declare("dijit.Tree", [_Widget, _TemplatedMixin], { - // summary: - // This widget displays hierarchical data from a store. - - // store: [deprecated] String|dojo/data/Store - // Deprecated. Use "model" parameter instead. - // The store to get data to display in the tree. - store: null, - - // model: dijit/tree/model - // Interface to read tree data, get notifications of changes to tree data, - // and for handling drop operations (i.e drag and drop onto the tree) - model: null, - - // query: [deprecated] anything - // Deprecated. User should specify query to the model directly instead. - // Specifies datastore query to return the root item or top items for the tree. - query: null, - - // label: [deprecated] String - // Deprecated. Use dijit/tree/ForestStoreModel directly instead. - // Used in conjunction with query parameter. - // If a query is specified (rather than a root node id), and a label is also specified, - // then a fake root node is created and displayed, with this label. - label: "", - - // showRoot: [const] Boolean - // Should the root node be displayed, or hidden? - showRoot: true, - - // childrenAttr: [deprecated] String[] - // Deprecated. This information should be specified in the model. - // One ore more attributes that holds children of a tree node - childrenAttr: ["children"], - - // paths: String[][] or Item[][] - // Full paths from rootNode to selected nodes expressed as array of items or array of ids. - // Since setting the paths may be asynchronous (because of waiting on dojo.data), set("paths", ...) - // returns a Deferred to indicate when the set is complete. - paths: [], - - // path: String[] or Item[] - // Backward compatible singular variant of paths. - path: [], - - // selectedItems: [readonly] Item[] - // The currently selected items in this tree. - // This property can only be set (via set('selectedItems', ...)) when that item is already - // visible in the tree. (I.e. the tree has already been expanded to show that node.) - // Should generally use `paths` attribute to set the selected items instead. - selectedItems: null, - - // selectedItem: [readonly] Item - // Backward compatible singular variant of selectedItems. - selectedItem: null, - - // openOnClick: Boolean - // If true, clicking a folder node's label will open it, rather than calling onClick() - openOnClick: false, - - // openOnDblClick: Boolean - // If true, double-clicking a folder node's label will open it, rather than calling onDblClick() - openOnDblClick: false, - - templateString: treeTemplate, - - // persist: Boolean - // Enables/disables use of cookies for state saving. - persist: true, - - // autoExpand: Boolean - // Fully expand the tree on load. Overrides `persist`. - autoExpand: false, - - // dndController: [protected] Function|String - // Class to use as as the dnd controller. Specifying this class enables DnD. - // Generally you should specify this as dijit/tree/dndSource. - // Setting of dijit/tree/_dndSelector handles selection only (no actual DnD). - dndController: _dndSelector, - - // parameters to pull off of the tree and pass on to the dndController as its params - dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance", "dragThreshold", "betweenThreshold"], - - //declare the above items so they can be pulled from the tree's markup - - // onDndDrop: [protected] Function - // Parameter to dndController, see `dijit/tree/dndSource.onDndDrop()`. - // Generally this doesn't need to be set. - onDndDrop: null, - - itemCreator: null, - /*===== - itemCreator: function(nodes, target, source){ - // summary: - // Returns objects passed to `Tree.model.newItem()` based on DnD nodes - // dropped onto the tree. Developer must override this method to enable - // dropping from external sources onto this Tree, unless the Tree.model's items - // happen to look like {id: 123, name: "Apple" } with no other attributes. - // - // For each node in nodes[], which came from source, create a hash of name/value - // pairs to be passed to Tree.model.newItem(). Returns array of those hashes. - // nodes: DomNode[] - // The DOMNodes dragged from the source container - // target: DomNode - // The target TreeNode.rowNode - // source: dojo/dnd/Source - // The source container the nodes were dragged from, perhaps another Tree or a plain dojo/dnd/Source - // returns: Object[] - // Array of name/value hashes for each new item to be added to the Tree, like: - // | [ - // | { id: 123, label: "apple", foo: "bar" }, - // | { id: 456, label: "pear", zaz: "bam" } - // | ] - // tags: - // extension - return [{}]; - }, - =====*/ - - // onDndCancel: [protected] Function - // Parameter to dndController, see `dijit/tree/dndSource.onDndCancel()`. - // Generally this doesn't need to be set. - onDndCancel: null, - -/*===== - checkAcceptance: function(source, nodes){ - // summary: - // Checks if the Tree itself can accept nodes from this source - // source: dijit/tree/dndSource - // The source which provides items - // nodes: DOMNode[] - // Array of DOM nodes corresponding to nodes being dropped, dijitTreeRow nodes if - // source is a dijit/Tree. - // tags: - // extension - return true; // Boolean - }, -=====*/ - checkAcceptance: null, - -/*===== - checkItemAcceptance: function(target, source, position){ - // summary: - // Stub function to be overridden if one wants to check for the ability to drop at the node/item level - // description: - // In the base case, this is called to check if target can become a child of source. - // When betweenThreshold is set, position="before" or "after" means that we - // are asking if the source node can be dropped before/after the target node. - // target: DOMNode - // The dijitTreeRoot DOM node inside of the TreeNode that we are dropping on to - // Use registry.getEnclosingWidget(target) to get the TreeNode. - // source: dijit/tree/dndSource - // The (set of) nodes we are dropping - // position: String - // "over", "before", or "after" - // tags: - // extension - return true; // Boolean - }, -=====*/ - checkItemAcceptance: null, - - // dragThreshold: Integer - // Number of pixels mouse moves before it's considered the start of a drag operation - dragThreshold: 5, - - // betweenThreshold: Integer - // Set to a positive value to allow drag and drop "between" nodes. - // - // If during DnD mouse is over a (target) node but less than betweenThreshold - // pixels from the bottom edge, dropping the the dragged node will make it - // the next sibling of the target node, rather than the child. - // - // Similarly, if mouse is over a target node but less that betweenThreshold - // pixels from the top edge, dropping the dragged node will make it - // the target node's previous sibling rather than the target node's child. - betweenThreshold: 0, - - // _nodePixelIndent: Integer - // Number of pixels to indent tree nodes (relative to parent node). - // Default is 19 but can be overridden by setting CSS class dijitTreeIndent - // and calling resize() or startup() on tree after it's in the DOM. - _nodePixelIndent: 19, - - _publish: function(/*String*/ topicName, /*Object*/ message){ - // summary: - // Publish a message for this widget/topic - topic.publish(this.id, lang.mixin({tree: this, event: topicName}, message || {})); // publish - }, - - postMixInProperties: function(){ - this.tree = this; - - if(this.autoExpand){ - // There's little point in saving opened/closed state of nodes for a Tree - // that initially opens all it's nodes. - this.persist = false; - } - - this._itemNodesMap = {}; - - if(!this.cookieName && this.id){ - this.cookieName = this.id + "SaveStateCookie"; - } - - // Deferred that fires when all the children have loaded. - this.expandChildrenDeferred = new Deferred(); - - // Deferred that fires when all pending operations complete. - this.pendingCommandsDeferred = this.expandChildrenDeferred; - - this.inherited(arguments); - }, - - postCreate: function(){ - this._initState(); - - // Catch events on TreeNodes - var self = this; - this.own( - on(this.domNode, on.selector(".dijitTreeNode", touch.enter), function(evt){ - self._onNodeMouseEnter(registry.byNode(this), evt); - }), - on(this.domNode, on.selector(".dijitTreeNode", touch.leave), function(evt){ - self._onNodeMouseLeave(registry.byNode(this), evt); - }), - on(this.domNode, on.selector(".dijitTreeNode", "click"), function(evt){ - self._onClick(registry.byNode(this), evt); - }), - on(this.domNode, on.selector(".dijitTreeNode", "dblclick"), function(evt){ - self._onDblClick(registry.byNode(this), evt); - }), - on(this.domNode, on.selector(".dijitTreeNode", "keypress"), function(evt){ - self._onKeyPress(registry.byNode(this), evt); - }), - on(this.domNode, on.selector(".dijitTreeNode", "keydown"), function(evt){ - self._onKeyDown(registry.byNode(this), evt); - }), - on(this.domNode, on.selector(".dijitTreeRow", "focusin"), function(evt){ - self._onNodeFocus(registry.getEnclosingWidget(this), evt); - }) - ); - - // Create glue between store and Tree, if not specified directly by user - if(!this.model){ - this._store2model(); - } - - // monitor changes to items - this.connect(this.model, "onChange", "_onItemChange"); - this.connect(this.model, "onChildrenChange", "_onItemChildrenChange"); - this.connect(this.model, "onDelete", "_onItemDelete"); - - this.inherited(arguments); - - if(this.dndController){ - if(lang.isString(this.dndController)){ - this.dndController = lang.getObject(this.dndController); - } - var params={}; - for(var i=0; i<this.dndParams.length;i++){ - if(this[this.dndParams[i]]){ - params[this.dndParams[i]] = this[this.dndParams[i]]; - } - } - this.dndController = new this.dndController(this, params); - } - - this._load(); - - // If no path was specified to the constructor, use path saved in cookie - if(!this.params.path && !this.params.paths && this.persist){ - this.set("paths", this.dndController._getSavedPaths()); - } - - // onLoadDeferred should fire when all commands that are part of initialization have completed. - // It will include all the set("paths", ...) commands that happen during initialization. - this.onLoadDeferred = this.pendingCommandsDeferred; - - this.onLoadDeferred.then(lang.hitch(this, "onLoad")); - }, - - _store2model: function(){ - // summary: - // User specified a store&query rather than model, so create model from store/query - this._v10Compat = true; - kernel.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query"); - - var modelParams = { - id: this.id + "_ForestStoreModel", - store: this.store, - query: this.query, - childrenAttrs: this.childrenAttr - }; - - // Only override the model's mayHaveChildren() method if the user has specified an override - if(this.params.mayHaveChildren){ - modelParams.mayHaveChildren = lang.hitch(this, "mayHaveChildren"); - } - - if(this.params.getItemChildren){ - modelParams.getChildren = lang.hitch(this, function(item, onComplete, onError){ - this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError); - }); - } - this.model = new ForestStoreModel(modelParams); - - // For backwards compatibility, the visibility of the root node is controlled by - // whether or not the user has specified a label - this.showRoot = Boolean(this.label); - }, - - onLoad: function(){ - // summary: - // Called when tree finishes loading and expanding. - // description: - // If persist == true the loading may encompass many levels of fetches - // from the data store, each asynchronous. Waits for all to finish. - // tags: - // callback - }, - - _load: function(){ - // summary: - // Initial load of the tree. - // Load root node (possibly hidden) and it's children. - this.model.getRoot( - lang.hitch(this, function(item){ - var rn = (this.rootNode = this.tree._createTreeNode({ - item: item, - tree: this, - isExpandable: true, - label: this.label || this.getLabel(item), - textDir: this.textDir, - indent: this.showRoot ? 0 : -1 - })); - - if(!this.showRoot){ - rn.rowNode.style.display="none"; - // if root is not visible, move tree role to the invisible - // root node's containerNode, see #12135 - this.domNode.setAttribute("role", "presentation"); - this.domNode.removeAttribute("aria-expanded"); - this.domNode.removeAttribute("aria-multiselectable"); - - rn.labelNode.setAttribute("role", "presentation"); - rn.containerNode.setAttribute("role", "tree"); - rn.containerNode.setAttribute("aria-expanded","true"); - rn.containerNode.setAttribute("aria-multiselectable", !this.dndController.singular); - }else{ - this.domNode.setAttribute("aria-multiselectable", !this.dndController.singular); - } - - this.domNode.appendChild(rn.domNode); - var identity = this.model.getIdentity(item); - if(this._itemNodesMap[identity]){ - this._itemNodesMap[identity].push(rn); - }else{ - this._itemNodesMap[identity] = [rn]; - } - - rn._updateLayout(); // sets "dijitTreeIsRoot" CSS classname - - // Load top level children, and if persist==true, all nodes that were previously opened - this._expandNode(rn).then(lang.hitch(this, function(){ - // Then, select the nodes that were selected last time, or - // the ones specified by params.paths[]. - - this.expandChildrenDeferred.resolve(true); - })); - }), - lang.hitch(this, function(err){ - console.error(this, ": error loading root: ", err); - }) - ); - }, - - getNodesByItem: function(/*Item or id*/ item){ - // summary: - // Returns all tree nodes that refer to an item - // returns: - // Array of tree nodes that refer to passed item - - if(!item){ return []; } - var identity = lang.isString(item) ? item : this.model.getIdentity(item); - // return a copy so widget don't get messed up by changes to returned array - return [].concat(this._itemNodesMap[identity]); - }, - - _setSelectedItemAttr: function(/*Item or id*/ item){ - this.set('selectedItems', [item]); - }, - - _setSelectedItemsAttr: function(/*Items or ids*/ items){ - // summary: - // Select tree nodes related to passed items. - // WARNING: if model use multi-parented items or desired tree node isn't already loaded - // behavior is undefined. Use set('paths', ...) instead. - var tree = this; - return this.pendingCommandsDeferred = this.pendingCommandsDeferred.then( lang.hitch(this, function(){ - var identities = array.map(items, function(item){ - return (!item || lang.isString(item)) ? item : tree.model.getIdentity(item); - }); - var nodes = []; - array.forEach(identities, function(id){ - nodes = nodes.concat(tree._itemNodesMap[id] || []); - }); - this.set('selectedNodes', nodes); - })); - }, - - _setPathAttr: function(/*Item[]|String[]*/ path){ - // summary: - // Singular variant of _setPathsAttr - if(path.length){ - return this.set("paths", [path]); - }else{ - // Empty list is interpreted as "select nothing" - return this.set("paths", []); - } - }, - - _setPathsAttr: function(/*Item[][]|String[][]*/ paths){ - // summary: - // Select the tree nodes identified by passed paths. - // paths: - // Array of arrays of items or item id's - // returns: - // Deferred to indicate when the set is complete - - var tree = this; - - // Let any previous set("path", ...) commands complete before this one starts. - return this.pendingCommandsDeferred = this.pendingCommandsDeferred.then(function(){ - // We may need to wait for some nodes to expand, so setting - // each path will involve a Deferred. We bring those deferreds - // together with a DeferredList. - return new DeferredList(array.map(paths, function(path){ - var d = new Deferred(); - - // normalize path to use identity - path = array.map(path, function(item){ - return lang.isString(item) ? item : tree.model.getIdentity(item); - }); - - if(path.length){ - // Wait for the tree to load, if it hasn't already. - selectPath(path, [tree.rootNode], d); - }else{ - d.reject(new Tree.PathError("Empty path")); - } - return d; - })); - }).then(setNodes); - - function selectPath(path, nodes, def){ - // Traverse path; the next path component should be among "nodes". - var nextPath = path.shift(); - var nextNode = array.filter(nodes, function(node){ - return node.getIdentity() == nextPath; - })[0]; - if(!!nextNode){ - if(path.length){ - tree._expandNode(nextNode).then(function(){ selectPath(path, nextNode.getChildren(), def); }); - }else{ - // Successfully reached the end of this path - def.resolve(nextNode); - } - }else{ - def.reject(new Tree.PathError("Could not expand path at " + nextPath)); - } - } - - function setNodes(newNodes){ - // After all expansion is finished, set the selection to - // the set of nodes successfully found. - tree.set("selectedNodes", array.map( - array.filter(newNodes,function(x){return x[0];}), - function(x){return x[1];})); - } - }, - - _setSelectedNodeAttr: function(node){ - this.set('selectedNodes', [node]); - }, - _setSelectedNodesAttr: function(nodes){ - // summary: - // Marks the specified TreeNodes as selected. - // nodes: TreeNode[] - // TreeNodes to mark. - this.dndController.setSelection(nodes); - }, - - - expandAll: function(){ - // summary: - // Expand all nodes in the tree - // returns: - // Deferred that fires when all nodes have expanded - - var _this = this; - - function expand(node){ - var def = new dojo.Deferred(); - - // Expand the node - _this._expandNode(node).then(function(){ - // When node has expanded, call expand() recursively on each non-leaf child - var childBranches = array.filter(node.getChildren() || [], function(node){ - return node.isExpandable; - }), - defs = array.map(childBranches, expand); - - // And when all those recursive calls finish, signal that I'm finished - new dojo.DeferredList(defs).then(function(){ - def.resolve(true); - }); - }); - - return def; - } - - return expand(this.rootNode); - }, - - collapseAll: function(){ - // summary: - // Collapse all nodes in the tree - // returns: - // Deferred that fires when all nodes have collapsed - - var _this = this; - - function collapse(node){ - var def = new dojo.Deferred(); - def.label = "collapseAllDeferred"; - - // Collapse children first - var childBranches = array.filter(node.getChildren() || [], function(node){ - return node.isExpandable; - }), - defs = array.map(childBranches, collapse); - - // And when all those recursive calls finish, collapse myself, unless I'm the invisible root node, - // in which case collapseAll() is finished - new dojo.DeferredList(defs).then(function(){ - if(!node.isExpanded || (node == _this.rootNode && !_this.showRoot)){ - def.resolve(true); - }else{ - _this._collapseNode(node).then(function(){ - // When node has collapsed, signal that call is finished - def.resolve(true); - }); - } - }); - - - return def; - } - - return collapse(this.rootNode); - }, - - ////////////// Data store related functions ////////////////////// - // These just get passed to the model; they are here for back-compat - - mayHaveChildren: function(/*dojo/data/Item*/ /*===== item =====*/){ - // summary: - // Deprecated. This should be specified on the model itself. - // - // Overridable function to tell if an item has or may have children. - // Controls whether or not +/- expando icon is shown. - // (For efficiency reasons we may not want to check if an element actually - // has children until user clicks the expando node) - // tags: - // deprecated - }, - - getItemChildren: function(/*===== parentItem, onComplete =====*/){ - // summary: - // Deprecated. This should be specified on the model itself. - // - // Overridable function that return array of child items of given parent item, - // or if parentItem==null then return top items in tree - // tags: - // deprecated - }, - - /////////////////////////////////////////////////////// - // Functions for converting an item to a TreeNode - getLabel: function(/*dojo/data/Item*/ item){ - // summary: - // Overridable function to get the label for a tree node (given the item) - // tags: - // extension - return this.model.getLabel(item); // String - }, - - getIconClass: function(/*dojo/data/Item*/ item, /*Boolean*/ opened){ - // summary: - // Overridable function to return CSS class name to display icon - // tags: - // extension - return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf" - }, - - getLabelClass: function(/*===== item, opened =====*/){ - // summary: - // Overridable function to return CSS class name to display label - // item: dojo/data/Item - // opened: Boolean - // returns: String - // CSS class name - // tags: - // extension - }, - - getRowClass: function(/*===== item, opened =====*/){ - // summary: - // Overridable function to return CSS class name to display row - // item: dojo/data/Item - // opened: Boolean - // returns: String - // CSS class name - // tags: - // extension - }, - - getIconStyle: function(/*===== item, opened =====*/){ - // summary: - // Overridable function to return CSS styles to display icon - // item: dojo/data/Item - // opened: Boolean - // returns: Object - // Object suitable for input to dojo.style() like {backgroundImage: "url(...)"} - // tags: - // extension - }, - - getLabelStyle: function(/*===== item, opened =====*/){ - // summary: - // Overridable function to return CSS styles to display label - // item: dojo/data/Item - // opened: Boolean - // returns: - // Object suitable for input to dojo.style() like {color: "red", background: "green"} - // tags: - // extension - }, - - getRowStyle: function(/*===== item, opened =====*/){ - // summary: - // Overridable function to return CSS styles to display row - // item: dojo/data/Item - // opened: Boolean - // returns: - // Object suitable for input to dojo.style() like {background-color: "#bbb"} - // tags: - // extension - }, - - getTooltip: function(/*dojo/data/Item*/ /*===== item =====*/){ - // summary: - // Overridable function to get the tooltip for a tree node (given the item) - // tags: - // extension - return ""; // String - }, - - /////////// Keyboard and Mouse handlers //////////////////// - - _onKeyPress: function(/*TreeNode*/ treeNode, /*Event*/ e){ - // summary: - // Handles keystrokes for printable keys, doing search navigation - - if(e.charCode <= 32){ - // Avoid duplicate events on firefox (this is an arrow key that will be handled by keydown handler) - return; - } - - if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){ - var c = String.fromCharCode(e.charCode); - this._onLetterKeyNav( { node: treeNode, key: c.toLowerCase() } ); - event.stop(e); - } - }, - - _onKeyDown: function(/*TreeNode*/ treeNode, /*Event*/ e){ - // summary: - // Handles arrow, space, and enter keys - - var key = e.keyCode; - - var map = this._keyHandlerMap; - if(!map){ - // Setup table mapping keys to events. - // On WebKit based browsers, the combination ctrl-enter does not get passed through. To allow accessible - // multi-select on those browsers, the space key is also used for selection. - // Therefore, also allow space key for keyboard "click" operation. - map = {}; - map[keys.ENTER] = map[keys.SPACE] = map[" "] = "_onEnterKey"; - map[this.isLeftToRight() ? keys.LEFT_ARROW : keys.RIGHT_ARROW] = "_onLeftArrow"; - map[this.isLeftToRight() ? keys.RIGHT_ARROW : keys.LEFT_ARROW] = "_onRightArrow"; - map[keys.UP_ARROW] = "_onUpArrow"; - map[keys.DOWN_ARROW] = "_onDownArrow"; - map[keys.HOME] = "_onHomeKey"; - map[keys.END] = "_onEndKey"; - this._keyHandlerMap = map; - } - - if(this._keyHandlerMap[key]){ - // clear record of recent printables (being saved for multi-char letter navigation), - // because "a", down-arrow, "b" shouldn't search for "ab" - if(this._curSearch){ - this._curSearch.timer.remove(); - delete this._curSearch; - } - - this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item, evt: e } ); - event.stop(e); - } - }, - - _onEnterKey: function(/*Object*/ message){ - this._publish("execute", { item: message.item, node: message.node } ); - this.dndController.userSelect(message.node, connect.isCopyKey( message.evt ), message.evt.shiftKey); - this.onClick(message.item, message.node, message.evt); - }, - - _onDownArrow: function(/*Object*/ message){ - // summary: - // down arrow pressed; get next visible node, set focus there - var node = this._getNextNode(message.node); - if(node && node.isTreeNode){ - this.focusNode(node); - } - }, - - _onUpArrow: function(/*Object*/ message){ - // summary: - // Up arrow pressed; move to previous visible node - - var node = message.node; - - // if younger siblings - var previousSibling = node.getPreviousSibling(); - if(previousSibling){ - node = previousSibling; - // if the previous node is expanded, dive in deep - while(node.isExpandable && node.isExpanded && node.hasChildren()){ - // move to the last child - var children = node.getChildren(); - node = children[children.length-1]; - } - }else{ - // if this is the first child, return the parent - // unless the parent is the root of a tree with a hidden root - var parent = node.getParent(); - if(!(!this.showRoot && parent === this.rootNode)){ - node = parent; - } - } - - if(node && node.isTreeNode){ - this.focusNode(node); - } - }, - - _onRightArrow: function(/*Object*/ message){ - // summary: - // Right arrow pressed; go to child node - var node = message.node; - - // if not expanded, expand, else move to 1st child - if(node.isExpandable && !node.isExpanded){ - this._expandNode(node); - }else if(node.hasChildren()){ - node = node.getChildren()[0]; - if(node && node.isTreeNode){ - this.focusNode(node); - } - } - }, - - _onLeftArrow: function(/*Object*/ message){ - // summary: - // Left arrow pressed. - // If not collapsed, collapse, else move to parent. - - var node = message.node; - - if(node.isExpandable && node.isExpanded){ - this._collapseNode(node); - }else{ - var parent = node.getParent(); - if(parent && parent.isTreeNode && !(!this.showRoot && parent === this.rootNode)){ - this.focusNode(parent); - } - } - }, - - _onHomeKey: function(){ - // summary: - // Home key pressed; get first visible node, and set focus there - var node = this._getRootOrFirstNode(); - if(node){ - this.focusNode(node); - } - }, - - _onEndKey: function(){ - // summary: - // End key pressed; go to last visible node. - - var node = this.rootNode; - while(node.isExpanded){ - var c = node.getChildren(); - node = c[c.length - 1]; - } - - if(node && node.isTreeNode){ - this.focusNode(node); - } - }, - - // multiCharSearchDuration: Number - // If multiple characters are typed where each keystroke happens within - // multiCharSearchDuration of the previous keystroke, - // search for nodes matching all the keystrokes. - // - // For example, typing "ab" will search for entries starting with - // "ab" unless the delay between "a" and "b" is greater than multiCharSearchDuration. - multiCharSearchDuration: 250, - - _onLetterKeyNav: function(message){ - // summary: - // Called when user presses a prinatable key; search for node starting with recently typed letters. - // message: Object - // Like { node: TreeNode, key: 'a' } where key is the key the user pressed. - - // Branch depending on whether this key starts a new search, or modifies an existing search - var cs = this._curSearch; - if(cs){ - // We are continuing a search. Ex: user has pressed 'a', and now has pressed - // 'b', so we want to search for nodes starting w/"ab". - cs.pattern = cs.pattern + message.key; - cs.timer.remove(); - }else{ - // We are starting a new search - cs = this._curSearch = { - pattern: message.key, - startNode: message.node - }; - } - - // set/reset timer to forget recent keystrokes - cs.timer = this.defer(function(){ - delete this._curSearch; - }, this.multiCharSearchDuration); - - // Navigate to TreeNode matching keystrokes [entered so far]. - var node = cs.startNode; - do{ - node = this._getNextNode(node); - //check for last node, jump to first node if necessary - if(!node){ - node = this._getRootOrFirstNode(); - } - }while(node !== cs.startNode && (node.label.toLowerCase().substr(0, cs.pattern.length) != cs.pattern)); - if(node && node.isTreeNode){ - // no need to set focus if back where we started - if(node !== cs.startNode){ - this.focusNode(node); - } - } - }, - - isExpandoNode: function(node, widget){ - // summary: - // check whether a dom node is the expandoNode for a particular TreeNode widget - return dom.isDescendant(node, widget.expandoNode) || dom.isDescendant(node, widget.expandoNodeText); - }, - - _onClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){ - // summary: - // Translates click events into commands for the controller to process - - var domElement = e.target, - isExpandoClick = this.isExpandoNode(domElement, nodeWidget); - - if( (this.openOnClick && nodeWidget.isExpandable) || isExpandoClick ){ - // expando node was clicked, or label of a folder node was clicked; open it - if(nodeWidget.isExpandable){ - this._onExpandoClick({node:nodeWidget}); - } - }else{ - this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e } ); - this.onClick(nodeWidget.item, nodeWidget, e); - this.focusNode(nodeWidget); - } - event.stop(e); - }, - _onDblClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){ - // summary: - // Translates double-click events into commands for the controller to process - - var domElement = e.target, - isExpandoClick = (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText); - - if( (this.openOnDblClick && nodeWidget.isExpandable) ||isExpandoClick ){ - // expando node was clicked, or label of a folder node was clicked; open it - if(nodeWidget.isExpandable){ - this._onExpandoClick({node:nodeWidget}); - } - }else{ - this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e } ); - this.onDblClick(nodeWidget.item, nodeWidget, e); - this.focusNode(nodeWidget); - } - event.stop(e); - }, - - _onExpandoClick: function(/*Object*/ message){ - // summary: - // User clicked the +/- icon; expand or collapse my children. - var node = message.node; - - // If we are collapsing, we might be hiding the currently focused node. - // Also, clicking the expando node might have erased focus from the current node. - // For simplicity's sake just focus on the node with the expando. - this.focusNode(node); - - if(node.isExpanded){ - this._collapseNode(node); - }else{ - this._expandNode(node); - } - }, - - onClick: function(/*===== item, node, evt =====*/){ - // summary: - // Callback when a tree node is clicked - // item: Object - // Object from the dojo/store corresponding to this TreeNode - // node: TreeNode - // The TreeNode itself - // evt: Event - // The event - // tags: - // callback - }, - onDblClick: function(/*===== item, node, evt =====*/){ - // summary: - // Callback when a tree node is double-clicked - // item: Object - // Object from the dojo/store corresponding to this TreeNode - // node: TreeNode - // The TreeNode itself - // evt: Event - // The event - // tags: - // callback - }, - onOpen: function(/*===== item, node =====*/){ - // summary: - // Callback when a node is opened - // item: dojo/data/Item - // node: TreeNode - // tags: - // callback - }, - onClose: function(/*===== item, node =====*/){ - // summary: - // Callback when a node is closed - // item: Object - // Object from the dojo/store corresponding to this TreeNode - // node: TreeNode - // The TreeNode itself - // tags: - // callback - }, - - _getNextNode: function(node){ - // summary: - // Get next visible node - - if(node.isExpandable && node.isExpanded && node.hasChildren()){ - // if this is an expanded node, get the first child - return node.getChildren()[0]; // TreeNode - }else{ - // find a parent node with a sibling - while(node && node.isTreeNode){ - var returnNode = node.getNextSibling(); - if(returnNode){ - return returnNode; // TreeNode - } - node = node.getParent(); - } - return null; - } - }, - - _getRootOrFirstNode: function(){ - // summary: - // Get first visible node - return this.showRoot ? this.rootNode : this.rootNode.getChildren()[0]; - }, - - _collapseNode: function(/*TreeNode*/ node){ - // summary: - // Called when the user has requested to collapse the node - // returns: - // Deferred that fires when the node is closed - - if(node._expandNodeDeferred){ - delete node._expandNodeDeferred; - } - - if(node.state == "LOADING"){ - // ignore clicks while we are in the process of loading data - return; - } - - if(node.isExpanded){ - var ret = node.collapse(); - - this.onClose(node.item, node); - this._state(node, false); - - this._startPaint(ret); // after this finishes, need to reset widths of TreeNodes - - return ret; - } - }, - - _expandNode: function(/*TreeNode*/ node){ - // summary: - // Called when the user has requested to expand the node - // returns: - // Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants - // that were previously opened too - - // Signal that this call is complete - var def = new Deferred(); - - if(node._expandNodeDeferred){ - // there's already an expand in progress, or completed, so just return - return node._expandNodeDeferred; // dojo/_base/Deferred - } - - var model = this.model, - item = node.item, - _this = this; - - // Load data if it's not already loaded - if(!node._loadDeferred){ - // need to load all the children before expanding - node.markProcessing(); - - // Setup deferred to signal when the load and expand are finished. - // Save that deferred in this._expandDeferred as a flag that operation is in progress. - node._loadDeferred = new Deferred(); - - // Get the children - model.getChildren( - item, - function(items){ - node.unmarkProcessing(); - - // Display the children and also start expanding any children that were previously expanded - // (if this.persist == true). The returned Deferred will fire when those expansions finish. - node.setChildItems(items).then(function(){ - node._loadDeferred.resolve(items); - }); - }, - function(err){ - console.error(_this, ": error loading " + node.label + " children: ", err); - node._loadDeferred.reject(err); - } - ); - } - - // Expand the node after data has loaded - node._loadDeferred.then(lang.hitch(this, function(){ - node.expand().then(function(){ - def.resolve(true); // signal that this _expandNode() call is complete - }); - - // seems like these should be inside of then(), but left here for back-compat about - // when this.isOpen flag gets set (ie, at the beginning of the animation) - this.onOpen(node.item, node); - this._state(node, true); - })); - - this._startPaint(def); // after this finishes, need to reset widths of TreeNodes - - return def; // dojo/_base/Deferred - }, - - ////////////////// Miscellaneous functions //////////////// - - focusNode: function(/* _tree.Node */ node){ - // summary: - // Focus on the specified node (which must be visible) - // tags: - // protected - - // set focus so that the label will be voiced using screen readers - focus.focus(node.labelNode); - }, - - _onNodeFocus: function(/*dijit/_WidgetBase*/ node){ - // summary: - // Called when a TreeNode gets focus, either by user clicking - // it, or programatically by arrow key handling code. - // description: - // It marks that the current node is the selected one, and the previously - // selected node no longer is. - - if(node && node != this.lastFocused){ - if(this.lastFocused && !this.lastFocused._destroyed){ - // mark that the previously focsable node is no longer focusable - this.lastFocused.setFocusable(false); - } - - // mark that the new node is the currently selected one - node.setFocusable(true); - this.lastFocused = node; - } - }, - - _onNodeMouseEnter: function(/*dijit/_WidgetBase*/ /*===== node =====*/){ - // summary: - // Called when mouse is over a node (onmouseenter event), - // this is monitored by the DND code - }, - - _onNodeMouseLeave: function(/*dijit/_WidgetBase*/ /*===== node =====*/){ - // summary: - // Called when mouse leaves a node (onmouseleave event), - // this is monitored by the DND code - }, - - //////////////// Events from the model ////////////////////////// - - _onItemChange: function(/*Item*/ item){ - // summary: - // Processes notification of a change to an item's scalar values like label - var model = this.model, - identity = model.getIdentity(item), - nodes = this._itemNodesMap[identity]; - - if(nodes){ - var label = this.getLabel(item), - tooltip = this.getTooltip(item); - array.forEach(nodes, function(node){ - node.set({ - item: item, // theoretically could be new JS Object representing same item - label: label, - tooltip: tooltip - }); - node._updateItemClasses(item); - }); - } - }, - - _onItemChildrenChange: function(/*dojo/data/Item*/ parent, /*dojo/data/Item[]*/ newChildrenList){ - // summary: - // Processes notification of a change to an item's children - var model = this.model, - identity = model.getIdentity(parent), - parentNodes = this._itemNodesMap[identity]; - - if(parentNodes){ - array.forEach(parentNodes,function(parentNode){ - parentNode.setChildItems(newChildrenList); - }); - } - }, - - _onItemDelete: function(/*Item*/ item){ - // summary: - // Processes notification of a deletion of an item. - // Not called from new dojo.store interface but there's cleanup code in setChildItems() instead. - - var model = this.model, - identity = model.getIdentity(item), - nodes = this._itemNodesMap[identity]; - - if(nodes){ - array.forEach(nodes,function(node){ - // Remove node from set of selected nodes (if it's selected) - this.dndController.removeTreeNode(node); - - var parent = node.getParent(); - if(parent){ - // if node has not already been orphaned from a _onSetItem(parent, "children", ..) call... - parent.removeChild(node); - } - node.destroyRecursive(); - }, this); - delete this._itemNodesMap[identity]; - } - }, - - /////////////// Miscellaneous funcs - - _initState: function(){ - // summary: - // Load in which nodes should be opened automatically - this._openedNodes = {}; - if(this.persist && this.cookieName){ - var oreo = cookie(this.cookieName); - if(oreo){ - array.forEach(oreo.split(','), function(item){ - this._openedNodes[item] = true; - }, this); - } - } - }, - _state: function(node, expanded){ - // summary: - // Query or set expanded state for an node - if(!this.persist){ - return false; - } - var path = array.map(node.getTreePath(), function(item){ - return this.model.getIdentity(item); - }, this).join("/"); - if(arguments.length === 1){ - return this._openedNodes[path]; - }else{ - if(expanded){ - this._openedNodes[path] = true; - }else{ - delete this._openedNodes[path]; - } - if(this.persist && this.cookieName){ - var ary = []; - for(var id in this._openedNodes){ - ary.push(id); - } - cookie(this.cookieName, ary.join(","), {expires:365}); - } - } - }, - - destroy: function(){ - if(this._curSearch){ - this._curSearch.timer.remove(); - delete this._curSearch; - } - if(this.rootNode){ - this.rootNode.destroyRecursive(); - } - if(this.dndController && !lang.isString(this.dndController)){ - this.dndController.destroy(); - } - this.rootNode = null; - this.inherited(arguments); - }, - - destroyRecursive: function(){ - // A tree is treated as a leaf, not as a node with children (like a grid), - // but defining destroyRecursive for back-compat. - this.destroy(); - }, - - resize: function(changeSize){ - if(changeSize){ - domGeometry.setMarginBox(this.domNode, changeSize); - } - - // The main JS sizing involved w/tree is the indentation, which is specified - // in CSS and read in through this dummy indentDetector node (tree must be - // visible and attached to the DOM to read this). - // If the Tree is hidden domGeometry.position(this.tree.indentDetector).w will return 0, in which case just - // keep the default value. - this._nodePixelIndent = domGeometry.position(this.tree.indentDetector).w || this._nodePixelIndent; - - // resize() may be called before this.rootNode is created, so wait until it's available - this.expandChildrenDeferred.then(lang.hitch(this, function(){ - // If tree has already loaded, then reset indent for all the nodes - this.rootNode.set('indent', this.showRoot ? 0 : -1); - - // Also, adjust widths of all rows to match width of Tree - this._adjustWidths(); - })); - }, - - _outstandingPaintOperations: 0, - _startPaint: function(/*Promise|Boolean*/ p){ - // summary: - // Called at the start of an operation that will change what's displayed. - // p: - // Promise that tells when the operation will complete. Alternately, if it's just a Boolean, it signifies - // that the operation was synchronous, and already completed. - - this._outstandingPaintOperations++; - if(this._adjustWidthsTimer){ - this._adjustWidthsTimer.remove(); - delete this._adjustWidthsTimer; - } - - var oc = lang.hitch(this, function(){ - this._outstandingPaintOperations--; - - if(this._outstandingPaintOperations <= 0 && !this._adjustWidthsTimer && this._started){ - // Use defer() to avoid a width adjustment when another operation will immediately follow, - // such as a sequence of opening a node, then it's children, then it's grandchildren, etc. - this._adjustWidthsTimer = this.defer("_adjustWidths"); - } - }); - when(p, oc, oc); - }, - - _adjustWidths: function(){ - // summary: - // Get width of widest TreeNode, or the width of the Tree itself, whichever is greater, - // and then set all TreeNodes to that width, so that selection/hover highlighting - // extends to the edge of the Tree (#13141) - - if(this._adjustWidthsTimer){ - this._adjustWidthsTimer.remove(); - delete this._adjustWidthsTimer; - } - - var maxWidth = 0, - nodes = []; - function collect(/*TreeNode*/ parent){ - var node = parent.rowNode; - node.style.width = "auto"; // erase setting from previous run - maxWidth = Math.max(maxWidth, node.clientWidth); - nodes.push(node); - if(parent.isExpanded){ - array.forEach(parent.getChildren(), collect); - } - } - collect(this.rootNode); - maxWidth = Math.max(maxWidth, domGeometry.getContentBox(this.domNode).w); // do after node.style.width="auto" - array.forEach(nodes, function(node){ - node.style.width = maxWidth + "px"; // assumes no horizontal padding, border, or margin on rowNode - }); - }, - - _createTreeNode: function(/*Object*/ args){ - // summary: - // creates a TreeNode - // description: - // Developers can override this method to define their own TreeNode class; - // However it will probably be removed in a future release in favor of a way - // of just specifying a widget for the label, rather than one that contains - // the children too. - return new TreeNode(args); - }, - - _setTextDirAttr: function(textDir){ - if(textDir && this.textDir!= textDir){ - this._set("textDir",textDir); - this.rootNode.set("textDir", textDir); - } - } -}); - -Tree.PathError = createError("TreePathError"); -Tree._TreeNode = TreeNode; // for monkey patching or creating subclasses of TreeNode - -return Tree; -}); diff --git a/lib/dijit/Viewport.js.uncompressed.js b/lib/dijit/Viewport.js.uncompressed.js deleted file mode 100644 index 8de455af2..000000000 --- a/lib/dijit/Viewport.js.uncompressed.js +++ /dev/null @@ -1,50 +0,0 @@ -define("dijit/Viewport", [ - "dojo/Evented", - "dojo/on", - "dojo/ready", - "dojo/sniff", - "dojo/_base/window", // global - "dojo/window" // getBox() -], function(Evented, on, ready, has, win, winUtils){ - - // module: - // dijit/Viewport - - /*===== - return { - // summary: - // Utility singleton to watch for viewport resizes, avoiding duplicate notifications - // which can lead to infinite loops. - // description: - // Usage: Viewport.on("resize", myCallback). - // - // myCallback() is called without arguments in case it's _WidgetBase.resize(), - // which would interpret the argument as the size to make the widget. - }; - =====*/ - - var Viewport = new Evented(); - - ready(200, function(){ - var oldBox = winUtils.getBox(); - Viewport._rlh = on(win.global, "resize", function(){ - var newBox = winUtils.getBox(); - if(oldBox.h == newBox.h && oldBox.w == newBox.w){ return; } - oldBox = newBox; - Viewport.emit("resize"); - }); - - // Also catch zoom changes on IE8, since they don't naturally generate resize events - if(has("ie") == 8){ - var deviceXDPI = screen.deviceXDPI; - setInterval(function(){ - if(screen.deviceXDPI != deviceXDPI){ - deviceXDPI = screen.deviceXDPI; - Viewport.emit("resize"); - } - }, 500); - } - }); - - return Viewport; -}); diff --git a/lib/dijit/WidgetSet.js.uncompressed.js b/lib/dijit/WidgetSet.js.uncompressed.js deleted file mode 100644 index 455db6a3e..000000000 --- a/lib/dijit/WidgetSet.js.uncompressed.js +++ /dev/null @@ -1,247 +0,0 @@ -define("dijit/WidgetSet", [ - "dojo/_base/array", // array.forEach array.map - "dojo/_base/declare", // declare - "dojo/_base/kernel", // kernel.global - "./registry" // to add functions to dijit.registry -], function(array, declare, kernel, registry){ - - // module: - // dijit/WidgetSet - - var WidgetSet = declare("dijit.WidgetSet", null, { - // summary: - // A set of widgets indexed by id. - // Deprecated, will be removed in 2.0. - // - // example: - // Create a small list of widgets: - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | var ws = new WidgetSet(); - // | ws.add(registry.byId("one")); - // | ws.add(registry.byId("two")); - // | // destroy both: - // | ws.forEach(function(w){ w.destroy(); }); - // | }); - - constructor: function(){ - this._hash = {}; - this.length = 0; - }, - - add: function(/*dijit/_WidgetBase*/ widget){ - // summary: - // Add a widget to this list. If a duplicate ID is detected, a error is thrown. - // - // widget: dijit/_WidgetBase - // Any dijit/_WidgetBase subclass. - if(this._hash[widget.id]){ - throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered"); - } - this._hash[widget.id] = widget; - this.length++; - }, - - remove: function(/*String*/ id){ - // summary: - // Remove a widget from this WidgetSet. Does not destroy the widget; simply - // removes the reference. - if(this._hash[id]){ - delete this._hash[id]; - this.length--; - } - }, - - forEach: function(/*Function*/ func, /* Object? */thisObj){ - // summary: - // Call specified function for each widget in this set. - // - // func: - // A callback function to run for each item. Is passed the widget, the index - // in the iteration, and the full hash, similar to `array.forEach`. - // - // thisObj: - // An optional scope parameter - // - // example: - // Using the default `dijit.registry` instance: - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | registry.forEach(function(widget){ - // | console.log(widget.declaredClass); - // | }); - // | }); - // - // returns: - // Returns self, in order to allow for further chaining. - - thisObj = thisObj || kernel.global; - var i = 0, id; - for(id in this._hash){ - func.call(thisObj, this._hash[id], i++, this._hash); - } - return this; // dijit/WidgetSet - }, - - filter: function(/*Function*/ filter, /* Object? */thisObj){ - // summary: - // Filter down this WidgetSet to a smaller new WidgetSet - // Works the same as `array.filter` and `NodeList.filter` - // - // filter: - // Callback function to test truthiness. Is passed the widget - // reference and the pseudo-index in the object. - // - // thisObj: Object? - // Option scope to use for the filter function. - // - // example: - // Arbitrary: select the odd widgets in this list - // | - // | - // | - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | registry.filter(function(w, i){ - // | return i % 2 == 0; - // | }).forEach(function(w){ /* odd ones */ }); - // | }); - - thisObj = thisObj || kernel.global; - var res = new WidgetSet(), i = 0, id; - for(id in this._hash){ - var w = this._hash[id]; - if(filter.call(thisObj, w, i++, this._hash)){ - res.add(w); - } - } - return res; // dijit/WidgetSet - }, - - byId: function(/*String*/ id){ - // summary: - // Find a widget in this list by it's id. - // example: - // Test if an id is in a particular WidgetSet - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | var ws = new WidgetSet(); - // | ws.add(registry.byId("bar")); - // | var t = ws.byId("bar") // returns a widget - // | var x = ws.byId("foo"); // returns undefined - // | }); - - return this._hash[id]; // dijit/_WidgetBase - }, - - byClass: function(/*String*/ cls){ - // summary: - // Reduce this widgetset to a new WidgetSet of a particular `declaredClass` - // - // cls: String - // The Class to scan for. Full dot-notated string. - // - // example: - // Find all `dijit.TitlePane`s in a page: - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); }); - // | }); - - var res = new WidgetSet(), id, widget; - for(id in this._hash){ - widget = this._hash[id]; - if(widget.declaredClass == cls){ - res.add(widget); - } - } - return res; // dijit/WidgetSet - }, - - toArray: function(){ - // summary: - // Convert this WidgetSet into a true Array - // - // example: - // Work with the widget .domNodes in a real Array - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | array.map(registry.toArray(), function(w){ return w.domNode; }); - // | }); - - - var ar = []; - for(var id in this._hash){ - ar.push(this._hash[id]); - } - return ar; // dijit/_WidgetBase[] - }, - - map: function(/* Function */func, /* Object? */thisObj){ - // summary: - // Create a new Array from this WidgetSet, following the same rules as `array.map` - // example: - // | require(["dijit/WidgetSet", "dijit/registry"], - // | function(WidgetSet, registry){ - // | var nodes = registry.map(function(w){ return w.domNode; }); - // | }); - // - // returns: - // A new array of the returned values. - return array.map(this.toArray(), func, thisObj); // Array - }, - - every: function(func, thisObj){ - // summary: - // A synthetic clone of `array.every` acting explicitly on this WidgetSet - // - // func: Function - // A callback function run for every widget in this list. Exits loop - // when the first false return is encountered. - // - // thisObj: Object? - // Optional scope parameter to use for the callback - - thisObj = thisObj || kernel.global; - var x = 0, i; - for(i in this._hash){ - if(!func.call(thisObj, this._hash[i], x++, this._hash)){ - return false; // Boolean - } - } - return true; // Boolean - }, - - some: function(func, thisObj){ - // summary: - // A synthetic clone of `array.some` acting explicitly on this WidgetSet - // - // func: Function - // A callback function run for every widget in this list. Exits loop - // when the first true return is encountered. - // - // thisObj: Object? - // Optional scope parameter to use for the callback - - thisObj = thisObj || kernel.global; - var x = 0, i; - for(i in this._hash){ - if(func.call(thisObj, this._hash[i], x++, this._hash)){ - return true; // Boolean - } - } - return false; // Boolean - } - - }); - - // Add in 1.x compatibility methods to dijit/registry. - // These functions won't show up in the API doc but since they are deprecated anyway, - // that's probably for the best. - array.forEach(["forEach", "filter", "byClass", "map", "every", "some"], function(func){ - registry[func] = WidgetSet.prototype[func]; - }); - - - return WidgetSet; -}); diff --git a/lib/dijit/_BidiSupport.js.uncompressed.js b/lib/dijit/_BidiSupport.js.uncompressed.js deleted file mode 100644 index 4a43c1f06..000000000 --- a/lib/dijit/_BidiSupport.js.uncompressed.js +++ /dev/null @@ -1,113 +0,0 @@ -define("dijit/_BidiSupport", ["./_WidgetBase"], function(_WidgetBase){ - - // module: - // dijit/_BidiSupport - - /*===== - return function(){ - // summary: - // Module that deals with BIDI, special with the auto - // direction if needed without changing the GUI direction. - // Including this module will extend _WidgetBase with BIDI related methods. - // description: - // There's a special need for displaying BIDI text in rtl direction - // in ltr GUI, sometimes needed auto support. - // In creation of widget, if it's want to activate this class, - // the widget should define the "textDir". - }; - =====*/ - - _WidgetBase.extend({ - - getTextDir: function(/*String*/ text){ - // summary: - // Gets the right direction of text. - // description: - // If textDir is ltr or rtl returns the value. - // If it's auto, calls to another function that responsible - // for checking the value, and defining the direction. - // tags: - // protected. - return this.textDir == "auto" ? this._checkContextual(text) : this.textDir; - }, - - _checkContextual: function(text){ - // summary: - // Finds the first strong (directional) character, return ltr if isLatin - // or rtl if isBidiChar. - // tags: - // private. - - // look for strong (directional) characters - var fdc = /[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(text); - // if found return the direction that defined by the character, else return widgets dir as defult. - return fdc ? ( fdc[0] <= 'z' ? "ltr" : "rtl" ) : this.dir ? this.dir : this.isLeftToRight() ? "ltr" : "rtl"; - }, - - applyTextDir: function(/*Object*/ element, /*String*/ text){ - // summary: - // Set element.dir according to this.textDir - // element: - // The text element to be set. Should have dir property. - // text: - // Used in case this.textDir is "auto", for calculating the right transformation - // description: - // If textDir is ltr or rtl returns the value. - // If it's auto, calls to another function that responsible - // for checking the value, and defining the direction. - // tags: - // protected. - - var textDir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir; - // update only when there's a difference - if(element.dir != textDir){ - element.dir = textDir; - } - }, - enforceTextDirWithUcc: function(option, text){ - // summary: - // Wraps by UCC (Unicode control characters) option's text according to this.textDir - // option: - // The element (`<option>`) we wrapping the text for. - // text: - // The text to be wrapped. - // description: - // There's a dir problem with some HTML elements. For some elements (e.g. `<option>`, `<select>`) - // defining the dir in different direction then the GUI orientation, won't display correctly. - // FF 3.6 will change the alignment of the text in option - this doesn't follow the bidi standards (static text - // should be aligned following GUI direction). IE8 and Opera11.10 completely ignore dir setting for `<option>`. - // Therefore the only solution is to use UCC (Unicode control characters) to display the text in correct orientation. - // This function saves the original text value for later restoration if needed, for example if the textDir will change etc. - if(this.textDir){ - option.originalText = text; - var dir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir; - return (dir == "ltr" ? bidi_const.LRE : bidi_const.RLE ) + text + bidi_const.PDF; - } - return text; - }, - restoreOriginalText: function(origObj){ - // summary: - // Restores the text of origObj, if needed, after enforceTextDirWithUcc, e.g. set("textDir", textDir). - // origObj: - // The element (`<option>`) to restore. - // description: - // Sets the text of origObj to origObj.originalText, which is the original text, without the UCCs. - // The function than removes the originalText from origObj! - if(origObj.originalText){ - origObj.text = origObj.originalText; - delete origObj.originalText; - } - return origObj; - } - }); - - // UCC - constants that will be used by bidi support. - var bidi_const = { - LRM : '\u200E', - LRE : '\u202A', - PDF : '\u202C', - RLM : '\u200f', - RLE : '\u202B' - }; - return _WidgetBase; -}); diff --git a/lib/dijit/_Calendar.js.uncompressed.js b/lib/dijit/_Calendar.js.uncompressed.js deleted file mode 100644 index e1c1bb38c..000000000 --- a/lib/dijit/_Calendar.js.uncompressed.js +++ /dev/null @@ -1,22 +0,0 @@ -define("dijit/_Calendar", [ - "dojo/_base/kernel", // kernel.deprecated - "./Calendar", - "./main" // for exporting dijit.Calendar -], function(kernel, Calendar, dijit){ - - // module: - // dijit/_Calendar - - /*===== - return { - // summary: - // Deprecated widget, used dijit/Calendar instead. Will be removed in 2.0. - }; - =====*/ - - kernel.deprecated("dijit._Calendar is deprecated", "dijit._Calendar moved to dijit.Calendar", 2.0); - - // dijit._Calendar had an underscore all this time merely because it did - // not satisfy dijit's a11y policy. - dijit._Calendar = Calendar; -}); diff --git a/lib/dijit/_Contained.js.uncompressed.js b/lib/dijit/_Contained.js.uncompressed.js deleted file mode 100644 index 280a368db..000000000 --- a/lib/dijit/_Contained.js.uncompressed.js +++ /dev/null @@ -1,60 +0,0 @@ -define("dijit/_Contained", [ - "dojo/_base/declare", // declare - "./registry" // registry.getEnclosingWidget(), registry.byNode() -], function(declare, registry){ - - // module: - // dijit/_Contained - - return declare("dijit._Contained", null, { - // summary: - // Mixin for widgets that are children of a container widget - // - // example: - // | // make a basic custom widget that knows about it's parents - // | declare("my.customClass",[dijit._Widget,dijit._Contained],{}); - - _getSibling: function(/*String*/ which){ - // summary: - // Returns next or previous sibling - // which: - // Either "next" or "previous" - // tags: - // private - var node = this.domNode; - do{ - node = node[which+"Sibling"]; - }while(node && node.nodeType != 1); - return node && registry.byNode(node); // dijit/_WidgetBase - }, - - getPreviousSibling: function(){ - // summary: - // Returns null if this is the first child of the parent, - // otherwise returns the next element sibling to the "left". - - return this._getSibling("previous"); // dijit/_WidgetBase - }, - - getNextSibling: function(){ - // summary: - // Returns null if this is the last child of the parent, - // otherwise returns the next element sibling to the "right". - - return this._getSibling("next"); // dijit/_WidgetBase - }, - - getIndexInParent: function(){ - // summary: - // Returns the index of this widget within its container parent. - // It returns -1 if the parent does not exist, or if the parent - // is not a dijit._Container - - var p = this.getParent(); - if(!p || !p.getIndexOfChild){ - return -1; // int - } - return p.getIndexOfChild(this); // int - } - }); -}); diff --git a/lib/dijit/_Container.js.uncompressed.js b/lib/dijit/_Container.js.uncompressed.js deleted file mode 100644 index 8d2524001..000000000 --- a/lib/dijit/_Container.js.uncompressed.js +++ /dev/null @@ -1,94 +0,0 @@ -define("dijit/_Container", [ - "dojo/_base/array", // array.forEach array.indexOf - "dojo/_base/declare", // declare - "dojo/dom-construct" // domConstruct.place -], function(array, declare, domConstruct){ - - // module: - // dijit/_Container - - return declare("dijit._Container", null, { - // summary: - // Mixin for widgets that contain HTML and/or a set of widget children. - - buildRendering: function(){ - this.inherited(arguments); - if(!this.containerNode){ - // all widgets with descendants must set containerNode - this.containerNode = this.domNode; - } - }, - - addChild: function(/*dijit/_WidgetBase*/ widget, /*int?*/ insertIndex){ - // summary: - // Makes the given widget a child of this widget. - // description: - // Inserts specified child widget's dom node as a child of this widget's - // container node, and possibly does other processing (such as layout). - // - // Functionality is undefined if this widget contains anything besides - // a list of child widgets (ie, if it contains arbitrary non-widget HTML). - - var refNode = this.containerNode; - if(insertIndex && typeof insertIndex == "number"){ - var children = this.getChildren(); - if(children && children.length >= insertIndex){ - refNode = children[insertIndex-1].domNode; - insertIndex = "after"; - } - } - domConstruct.place(widget.domNode, refNode, insertIndex); - - // If I've been started but the child widget hasn't been started, - // start it now. Make sure to do this after widget has been - // inserted into the DOM tree, so it can see that it's being controlled by me, - // so it doesn't try to size itself. - if(this._started && !widget._started){ - widget.startup(); - } - }, - - removeChild: function(/*Widget|int*/ widget){ - // summary: - // Removes the passed widget instance from this widget but does - // not destroy it. You can also pass in an integer indicating - // the index within the container to remove (ie, removeChild(5) removes the sixth widget). - - if(typeof widget == "number"){ - widget = this.getChildren()[widget]; - } - - if(widget){ - var node = widget.domNode; - if(node && node.parentNode){ - node.parentNode.removeChild(node); // detach but don't destroy - } - } - }, - - hasChildren: function(){ - // summary: - // Returns true if widget has child widgets, i.e. if this.containerNode contains widgets. - return this.getChildren().length > 0; // Boolean - }, - - _getSiblingOfChild: function(/*dijit/_WidgetBase*/ child, /*int*/ dir){ - // summary: - // Get the next or previous widget sibling of child - // dir: - // if 1, get the next sibling - // if -1, get the previous sibling - // tags: - // private - var children = this.getChildren(), - idx = array.indexOf(this.getChildren(), child); // int - return children[idx + dir]; - }, - - getIndexOfChild: function(/*dijit/_WidgetBase*/ child){ - // summary: - // Gets the index of the child in this container or -1 if not found - return array.indexOf(this.getChildren(), child); // int - } - }); -}); diff --git a/lib/dijit/_CssStateMixin.js.uncompressed.js b/lib/dijit/_CssStateMixin.js.uncompressed.js deleted file mode 100644 index 6453c3603..000000000 --- a/lib/dijit/_CssStateMixin.js.uncompressed.js +++ /dev/null @@ -1,324 +0,0 @@ -define("dijit/_CssStateMixin", [ - "dojo/_base/array", // array.forEach array.map - "dojo/_base/declare", // declare - "dojo/dom", // dom.isDescendant() - "dojo/dom-class", // domClass.toggle - "dojo/has", - "dojo/_base/lang", // lang.hitch - "dojo/on", - "dojo/ready", - "dojo/_base/window", // win.body - "./registry" -], function(array, declare, dom, domClass, has, lang, on, ready, win, registry){ - -// module: -// dijit/_CssStateMixin - -var CssStateMixin = declare("dijit._CssStateMixin", [], { - // summary: - // Mixin for widgets to set CSS classes on the widget DOM nodes depending on hover/mouse press/focus - // state changes, and also higher-level state changes such becoming disabled or selected. - // - // description: - // By mixing this class into your widget, and setting the this.baseClass attribute, it will automatically - // maintain CSS classes on the widget root node (this.domNode) depending on hover, - // active, focus, etc. state. Ex: with a baseClass of dijitButton, it will apply the classes - // dijitButtonHovered and dijitButtonActive, as the user moves the mouse over the widget and clicks it. - // - // It also sets CSS like dijitButtonDisabled based on widget semantic state. - // - // By setting the cssStateNodes attribute, a widget can also track events on subnodes (like buttons - // within the widget). - - // cssStateNodes: [protected] Object - // List of sub-nodes within the widget that need CSS classes applied on mouse hover/press and focus - // - // Each entry in the hash is a an attachpoint names (like "upArrowButton") mapped to a CSS class names - // (like "dijitUpArrowButton"). Example: - // | { - // | "upArrowButton": "dijitUpArrowButton", - // | "downArrowButton": "dijitDownArrowButton" - // | } - // The above will set the CSS class dijitUpArrowButton to the this.upArrowButton DOMNode when it - // is hovered, etc. - cssStateNodes: {}, - - // hovering: [readonly] Boolean - // True if cursor is over this widget - hovering: false, - - // active: [readonly] Boolean - // True if mouse was pressed while over this widget, and hasn't been released yet - active: false, - - _applyAttributes: function(){ - // This code would typically be in postCreate(), but putting in _applyAttributes() for - // performance: so the class changes happen before DOM is inserted into the document. - // Change back to postCreate() in 2.0. See #11635. - - this.inherited(arguments); - - // Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node - array.forEach(["disabled", "readOnly", "checked", "selected", "focused", "state", "hovering", "active", "_opened"], function(attr){ - this.watch(attr, lang.hitch(this, "_setStateClass")); - }, this); - - // Track hover and active mouse events on widget root node, plus possibly on subnodes - for(var ap in this.cssStateNodes){ - this._trackMouseState(this[ap], this.cssStateNodes[ap]); - } - this._trackMouseState(this.domNode, this.baseClass); - - // Set state initially; there's probably no hover/active/focus state but widget might be - // disabled/readonly/checked/selected so we want to set CSS classes for those conditions. - this._setStateClass(); - }, - - _cssMouseEvent: function(/*Event*/ event){ - // summary: - // Handler for CSS event on this.domNode. Sets hovering and active properties depending on mouse state, - // which triggers _setStateClass() to set appropriate CSS classes for this.domNode. - - if(!this.disabled){ - switch(event.type){ - case "mouseover": - this._set("hovering", true); - this._set("active", this._mouseDown); - break; - case "mouseout": - this._set("hovering", false); - this._set("active", false); - break; - case "mousedown": - case "touchstart": - this._set("active", true); - break; - case "mouseup": - case "touchend": - this._set("active", false); - break; - } - } - }, - - _setStateClass: function(){ - // summary: - // Update the visual state of the widget by setting the css classes on this.domNode - // (or this.stateNode if defined) by combining this.baseClass with - // various suffixes that represent the current widget state(s). - // - // description: - // In the case where a widget has multiple - // states, it sets the class based on all possible - // combinations. For example, an invalid form widget that is being hovered - // will be "dijitInput dijitInputInvalid dijitInputHover dijitInputInvalidHover". - // - // The widget may have one or more of the following states, determined - // by this.state, this.checked, this.valid, and this.selected: - // - // - Error - ValidationTextBox sets this.state to "Error" if the current input value is invalid - // - Incomplete - ValidationTextBox sets this.state to "Incomplete" if the current input value is not finished yet - // - Checked - ex: a checkmark or a ToggleButton in a checked state, will have this.checked==true - // - Selected - ex: currently selected tab will have this.selected==true - // - // In addition, it may have one or more of the following states, - // based on this.disabled and flags set in _onMouse (this.active, this.hovering) and from focus manager (this.focused): - // - // - Disabled - if the widget is disabled - // - Active - if the mouse (or space/enter key?) is being pressed down - // - Focused - if the widget has focus - // - Hover - if the mouse is over the widget - - // Compute new set of classes - var newStateClasses = this.baseClass.split(" "); - - function multiply(modifier){ - newStateClasses = newStateClasses.concat(array.map(newStateClasses, function(c){ return c+modifier; }), "dijit"+modifier); - } - - if(!this.isLeftToRight()){ - // For RTL mode we need to set an addition class like dijitTextBoxRtl. - multiply("Rtl"); - } - - var checkedState = this.checked == "mixed" ? "Mixed" : (this.checked ? "Checked" : ""); - if(this.checked){ - multiply(checkedState); - } - if(this.state){ - multiply(this.state); - } - if(this.selected){ - multiply("Selected"); - } - if(this._opened){ - multiply("Opened"); - } - - if(this.disabled){ - multiply("Disabled"); - }else if(this.readOnly){ - multiply("ReadOnly"); - }else{ - if(this.active){ - multiply("Active"); - }else if(this.hovering){ - multiply("Hover"); - } - } - - if(this.focused){ - multiply("Focused"); - } - - // Remove old state classes and add new ones. - // For performance concerns we only write into domNode.className once. - var tn = this.stateNode || this.domNode, - classHash = {}; // set of all classes (state and otherwise) for node - - array.forEach(tn.className.split(" "), function(c){ classHash[c] = true; }); - - if("_stateClasses" in this){ - array.forEach(this._stateClasses, function(c){ delete classHash[c]; }); - } - - array.forEach(newStateClasses, function(c){ classHash[c] = true; }); - - var newClasses = []; - for(var c in classHash){ - newClasses.push(c); - } - tn.className = newClasses.join(" "); - - this._stateClasses = newStateClasses; - }, - - _subnodeCssMouseEvent: function(node, clazz, evt){ - // summary: - // Handler for hover/active mouse event on widget's subnode - if(this.disabled || this.readOnly){ - return; - } - function hover(isHovering){ - domClass.toggle(node, clazz+"Hover", isHovering); - } - function active(isActive){ - domClass.toggle(node, clazz+"Active", isActive); - } - function focused(isFocused){ - domClass.toggle(node, clazz+"Focused", isFocused); - } - switch(evt.type){ - case "mouseover": - hover(true); - break; - case "mouseout": - hover(false); - active(false); - break; - case "mousedown": - case "touchstart": - active(true); - break; - case "mouseup": - case "touchend": - active(false); - break; - case "focus": - case "focusin": - focused(true); - break; - case "blur": - case "focusout": - focused(false); - break; - } - }, - - _trackMouseState: function(/*DomNode*/ node, /*String*/ clazz){ - // summary: - // Track mouse/focus events on specified node and set CSS class on that node to indicate - // current state. Usually not called directly, but via cssStateNodes attribute. - // description: - // Given class=foo, will set the following CSS class on the node - // - // - fooActive: if the user is currently pressing down the mouse button while over the node - // - fooHover: if the user is hovering the mouse over the node, but not pressing down a button - // - fooFocus: if the node is focused - // - // Note that it won't set any classes if the widget is disabled. - // node: DomNode - // Should be a sub-node of the widget, not the top node (this.domNode), since the top node - // is handled specially and automatically just by mixing in this class. - // clazz: String - // CSS class name (ex: dijitSliderUpArrow) - - // Flag for listener code below to call this._cssMouseEvent() or this._subnodeCssMouseEvent() - // when node is hovered/active - node._cssState = clazz; - } -}); - -ready(function(){ - // Document level listener to catch hover etc. events on widget root nodes and subnodes. - // Note that when the mouse is moved quickly, a single onmouseenter event could signal that multiple widgets - // have been hovered or unhovered (try test_Accordion.html) - function handler(evt){ - // Poor man's event propagation. Don't propagate event to ancestors of evt.relatedTarget, - // to avoid processing mouseout events moving from a widget's domNode to a descendant node; - // such events shouldn't be interpreted as a mouseleave on the widget. - if(!dom.isDescendant(evt.relatedTarget, evt.target)){ - for(var node = evt.target; node && node != evt.relatedTarget; node = node.parentNode){ - // Process any nodes with _cssState property. They are generally widget root nodes, - // but could also be sub-nodes within a widget - if(node._cssState){ - var widget = registry.getEnclosingWidget(node); - if(widget){ - if(node == widget.domNode){ - // event on the widget's root node - widget._cssMouseEvent(evt); - }else{ - // event on widget's sub-node - widget._subnodeCssMouseEvent(node, node._cssState, evt); - } - } - } - } - } - } - function ieHandler(evt){ - evt.target = evt.srcElement; - handler(evt); - } - - // Use addEventListener() (and attachEvent() on IE) to catch the relevant events even if other handlers - // (on individual nodes) call evt.stopPropagation() or event.stopEvent(). - // Currently typematic.js is doing that, not sure why. - // Don't monitor mouseover/mouseout on mobile because iOS generates "phantom" mouseover/mouseout events when - // drag-scrolling, at the point in the viewport where the drag originated. Test the Tree in api viewer. - var body = win.body(), - types = (has("touch") ? [] : ["mouseover", "mouseout"]).concat(["mousedown", "touchstart", "mouseup", "touchend"]); - array.forEach(types, function(type){ - if(body.addEventListener){ - body.addEventListener(type, handler, true); // W3C - }else{ - body.attachEvent("on"+type, ieHandler); // IE - } - }); - - // Track focus events on widget sub-nodes that have been registered via _trackMouseState(). - // However, don't track focus events on the widget root nodes, because focus is tracked via the - // focus manager (and it's not really tracking focus, but rather tracking that focus is on one of the widget's - // nodes or a subwidget's node or a popup node, etc.) - // Remove for 2.0 (if focus CSS needed, just use :focus pseudo-selector). - on(body, "focusin, focusout", function(evt){ - var node = evt.target; - if(node._cssState && !node.getAttribute("widgetId")){ - var widget = registry.getEnclosingWidget(node); - widget._subnodeCssMouseEvent(node, node._cssState, evt); - } - }); -}); - -return CssStateMixin; -}); diff --git a/lib/dijit/_DialogMixin.js.uncompressed.js b/lib/dijit/_DialogMixin.js.uncompressed.js deleted file mode 100644 index a5a0dabd8..000000000 --- a/lib/dijit/_DialogMixin.js.uncompressed.js +++ /dev/null @@ -1,70 +0,0 @@ -define("dijit/_DialogMixin", [ - "dojo/_base/declare", // declare - "./a11y" // _getTabNavigable -], function(declare, a11y){ - - // module: - // dijit/_DialogMixin - - return declare("dijit._DialogMixin", null, { - // summary: - // This provides functions useful to Dialog and TooltipDialog - - execute: function(/*Object*/ /*===== formContents =====*/){ - // summary: - // Callback when the user hits the submit button. - // Override this method to handle Dialog execution. - // description: - // After the user has pressed the submit button, the Dialog - // first calls onExecute() to notify the container to hide the - // dialog and restore focus to wherever it used to be. - // - // *Then* this method is called. - // type: - // callback - }, - - onCancel: function(){ - // summary: - // Called when user has pressed the Dialog's cancel button, to notify container. - // description: - // Developer shouldn't override or connect to this method; - // it's a private communication device between the TooltipDialog - // and the thing that opened it (ex: `dijit/form/DropDownButton`) - // type: - // protected - }, - - onExecute: function(){ - // summary: - // Called when user has pressed the dialog's OK button, to notify container. - // description: - // Developer shouldn't override or connect to this method; - // it's a private communication device between the TooltipDialog - // and the thing that opened it (ex: `dijit/form/DropDownButton`) - // type: - // protected - }, - - _onSubmit: function(){ - // summary: - // Callback when user hits submit button - // type: - // protected - this.onExecute(); // notify container that we are about to execute - this.execute(this.get('value')); - }, - - _getFocusItems: function(){ - // summary: - // Finds focusable items in dialog, - // and sets this._firstFocusItem and this._lastFocusItem - // tags: - // protected - - var elems = a11y._getTabNavigable(this.containerNode); - this._firstFocusItem = elems.lowest || elems.first || this.closeButtonNode || this.domNode; - this._lastFocusItem = elems.last || elems.highest || this._firstFocusItem; - } - }); -}); diff --git a/lib/dijit/_FocusMixin.js.uncompressed.js b/lib/dijit/_FocusMixin.js.uncompressed.js deleted file mode 100644 index 31c92c139..000000000 --- a/lib/dijit/_FocusMixin.js.uncompressed.js +++ /dev/null @@ -1,66 +0,0 @@ -define("dijit/_FocusMixin", [ - "./focus", - "./_WidgetBase", - "dojo/_base/declare", // declare - "dojo/_base/lang" // lang.extend -], function(focus, _WidgetBase, declare, lang){ - - // module: - // dijit/_FocusMixin - - // We don't know where _FocusMixin will occur in the inheritance chain, but we need the _onFocus()/_onBlur() below - // to be last in the inheritance chain, so mixin to _WidgetBase. - lang.extend(_WidgetBase, { - // focused: [readonly] Boolean - // This widget or a widget it contains has focus, or is "active" because - // it was recently clicked. - focused: false, - - onFocus: function(){ - // summary: - // Called when the widget becomes "active" because - // it or a widget inside of it either has focus, or has recently - // been clicked. - // tags: - // callback - }, - - onBlur: function(){ - // summary: - // Called when the widget stops being "active" because - // focus moved to something outside of it, or the user - // clicked somewhere outside of it, or the widget was - // hidden. - // tags: - // callback - }, - - _onFocus: function(){ - // summary: - // This is where widgets do processing for when they are active, - // such as changing CSS classes. See onFocus() for more details. - // tags: - // protected - this.onFocus(); - }, - - _onBlur: function(){ - // summary: - // This is where widgets do processing for when they stop being active, - // such as changing CSS classes. See onBlur() for more details. - // tags: - // protected - this.onBlur(); - } - }); - - return declare("dijit._FocusMixin", null, { - // summary: - // Mixin to widget to provide _onFocus() and _onBlur() methods that - // fire when a widget or its descendants get/lose focus - - // flag that I want _onFocus()/_onBlur() notifications from focus manager - _focusManager: focus - }); - -}); diff --git a/lib/dijit/_HasDropDown.js.uncompressed.js b/lib/dijit/_HasDropDown.js.uncompressed.js deleted file mode 100644 index 6cc6b8731..000000000 --- a/lib/dijit/_HasDropDown.js.uncompressed.js +++ /dev/null @@ -1,509 +0,0 @@ -define("dijit/_HasDropDown", [ - "dojo/_base/declare", // declare - "dojo/_base/Deferred", - "dojo/_base/event", // event.stop - "dojo/dom", // dom.isDescendant - "dojo/dom-attr", // domAttr.set - "dojo/dom-class", // domClass.add domClass.contains domClass.remove - "dojo/dom-geometry", // domGeometry.marginBox domGeometry.position - "dojo/dom-style", // domStyle.set - "dojo/has", // has("touch") - "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE - "dojo/_base/lang", // lang.hitch lang.isFunction - "dojo/on", - "dojo/window", // winUtils.getBox - "./registry", // registry.byNode() - "./focus", - "./popup", - "./_FocusMixin" -], function(declare, Deferred, event,dom, domAttr, domClass, domGeometry, domStyle, has, keys, lang, on, - winUtils, registry, focus, popup, _FocusMixin){ - - - // module: - // dijit/_HasDropDown - - return declare("dijit._HasDropDown", _FocusMixin, { - // summary: - // Mixin for widgets that need drop down ability. - - // _buttonNode: [protected] DomNode - // The button/icon/node to click to display the drop down. - // Can be set via a data-dojo-attach-point assignment. - // If missing, then either focusNode or domNode (if focusNode is also missing) will be used. - _buttonNode: null, - - // _arrowWrapperNode: [protected] DomNode - // Will set CSS class dijitUpArrow, dijitDownArrow, dijitRightArrow etc. on this node depending - // on where the drop down is set to be positioned. - // Can be set via a data-dojo-attach-point assignment. - // If missing, then _buttonNode will be used. - _arrowWrapperNode: null, - - // _popupStateNode: [protected] DomNode - // The node to set the popupActive class on. - // Can be set via a data-dojo-attach-point assignment. - // If missing, then focusNode or _buttonNode (if focusNode is missing) will be used. - _popupStateNode: null, - - // _aroundNode: [protected] DomNode - // The node to display the popup around. - // Can be set via a data-dojo-attach-point assignment. - // If missing, then domNode will be used. - _aroundNode: null, - - // dropDown: [protected] Widget - // The widget to display as a popup. This widget *must* be - // defined before the startup function is called. - dropDown: null, - - // autoWidth: [protected] Boolean - // Set to true to make the drop down at least as wide as this - // widget. Set to false if the drop down should just be its - // default width - autoWidth: true, - - // forceWidth: [protected] Boolean - // Set to true to make the drop down exactly as wide as this - // widget. Overrides autoWidth. - forceWidth: false, - - // maxHeight: [protected] Integer - // The max height for our dropdown. - // Any dropdown taller than this will have scrollbars. - // Set to 0 for no max height, or -1 to limit height to available space in viewport - maxHeight: 0, - - // dropDownPosition: [const] String[] - // This variable controls the position of the drop down. - // It's an array of strings with the following values: - // - // - before: places drop down to the left of the target node/widget, or to the right in - // the case of RTL scripts like Hebrew and Arabic - // - after: places drop down to the right of the target node/widget, or to the left in - // the case of RTL scripts like Hebrew and Arabic - // - above: drop down goes above target node - // - below: drop down goes below target node - // - // The list is positions is tried, in order, until a position is found where the drop down fits - // within the viewport. - // - dropDownPosition: ["below","above"], - - // _stopClickEvents: Boolean - // When set to false, the click events will not be stopped, in - // case you want to use them in your subclass - _stopClickEvents: true, - - _onDropDownMouseDown: function(/*Event*/ e){ - // summary: - // Callback when the user mousedown's on the arrow icon - if(this.disabled || this.readOnly){ return; } - - // Prevent default to stop things like text selection, but don't stop propagation, so that: - // 1. TimeTextBox etc. can focus the <input> on mousedown - // 2. dropDownButtonActive class applied by _CssStateMixin (on button depress) - // 3. user defined onMouseDown handler fires - e.preventDefault(); - - this._docHandler = this.connect(this.ownerDocument, "mouseup", "_onDropDownMouseUp"); - - this.toggleDropDown(); - }, - - _onDropDownMouseUp: function(/*Event?*/ e){ - // summary: - // Callback when the user lifts their mouse after mouse down on the arrow icon. - // If the drop down is a simple menu and the mouse is over the menu, we execute it, otherwise, we focus our - // drop down widget. If the event is missing, then we are not - // a mouseup event. - // - // This is useful for the common mouse movement pattern - // with native browser `<select>` nodes: - // - // 1. mouse down on the select node (probably on the arrow) - // 2. move mouse to a menu item while holding down the mouse button - // 3. mouse up. this selects the menu item as though the user had clicked it. - if(e && this._docHandler){ - this.disconnect(this._docHandler); - } - var dropDown = this.dropDown, overMenu = false; - - if(e && this._opened){ - // This code deals with the corner-case when the drop down covers the original widget, - // because it's so large. In that case mouse-up shouldn't select a value from the menu. - // Find out if our target is somewhere in our dropdown widget, - // but not over our _buttonNode (the clickable node) - var c = domGeometry.position(this._buttonNode, true); - if(!(e.pageX >= c.x && e.pageX <= c.x + c.w) || - !(e.pageY >= c.y && e.pageY <= c.y + c.h)){ - var t = e.target; - while(t && !overMenu){ - if(domClass.contains(t, "dijitPopup")){ - overMenu = true; - }else{ - t = t.parentNode; - } - } - if(overMenu){ - t = e.target; - if(dropDown.onItemClick){ - var menuItem; - while(t && !(menuItem = registry.byNode(t))){ - t = t.parentNode; - } - if(menuItem && menuItem.onClick && menuItem.getParent){ - menuItem.getParent().onItemClick(menuItem, e); - } - } - return; - } - } - } - if(this._opened){ - if(dropDown.focus && dropDown.autoFocus !== false){ - // Focus the dropdown widget - do it on a delay so that we - // don't steal back focus from the dropdown. - this._focusDropDownTimer = this.defer(function(){ - dropDown.focus(); - delete this._focusDropDownTimer; - }); - } - }else{ - // The drop down arrow icon probably can't receive focus, but widget itself should get focus. - // defer() needed to make it work on IE (test DateTextBox) - this.defer("focus"); - } - - if(has("touch")){ - this._justGotMouseUp = true; - this.defer(function(){ - this._justGotMouseUp = false; - }); - } - }, - - _onDropDownClick: function(/*Event*/ e){ - if(has("touch") && !this._justGotMouseUp){ - // If there was no preceding mousedown/mouseup (like on android), then simulate them to - // toggle the drop down. - // - // The if(has("touch") is necessary since IE and desktop safari get spurious onclick events - // when there are nested tables (specifically, clicking on a table that holds a dijit/form/Select, - // but not on the Select itself, causes an onclick event on the Select) - this._onDropDownMouseDown(e); - this._onDropDownMouseUp(e); - } - - // The drop down was already opened on mousedown/keydown; just need to call stopEvent(). - if(this._stopClickEvents){ - event.stop(e); - } - }, - - buildRendering: function(){ - this.inherited(arguments); - - this._buttonNode = this._buttonNode || this.focusNode || this.domNode; - this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode; - - // Add a class to the "dijitDownArrowButton" type class to _buttonNode so theme can set direction of arrow - // based on where drop down will normally appear - var defaultPos = { - "after" : this.isLeftToRight() ? "Right" : "Left", - "before" : this.isLeftToRight() ? "Left" : "Right", - "above" : "Up", - "below" : "Down", - "left" : "Left", - "right" : "Right" - }[this.dropDownPosition[0]] || this.dropDownPosition[0] || "Down"; - domClass.add(this._arrowWrapperNode || this._buttonNode, "dijit" + defaultPos + "ArrowButton"); - }, - - postCreate: function(){ - // summary: - // set up nodes and connect our mouse and keyboard events - - this.inherited(arguments); - - var keyboardEventNode = this.focusNode || this.domNode; - this.own( - on(this._buttonNode, "mousedown", lang.hitch(this, "_onDropDownMouseDown")), - on(this._buttonNode, "click", lang.hitch(this, "_onDropDownClick")), - on(keyboardEventNode, "keydown", lang.hitch(this, "_onKey")), - on(keyboardEventNode, "keyup", lang.hitch(this, "_onKeyUp")) - ); - }, - - destroy: function(){ - if(this.dropDown){ - // Destroy the drop down, unless it's already been destroyed. This can happen because - // the drop down is a direct child of <body> even though it's logically my child. - if(!this.dropDown._destroyed){ - this.dropDown.destroyRecursive(); - } - delete this.dropDown; - } - this.inherited(arguments); - }, - - _onKey: function(/*Event*/ e){ - // summary: - // Callback when the user presses a key while focused on the button node - - if(this.disabled || this.readOnly){ return; } - var d = this.dropDown, target = e.target; - if(d && this._opened && d.handleKey){ - if(d.handleKey(e) === false){ - /* false return code means that the drop down handled the key */ - event.stop(e); - return; - } - } - if(d && this._opened && e.keyCode == keys.ESCAPE){ - this.closeDropDown(); - event.stop(e); - }else if(!this._opened && - (e.keyCode == keys.DOWN_ARROW || - ( (e.keyCode == keys.ENTER || e.keyCode == keys.SPACE) && - //ignore enter and space if the event is for a text input - ((target.tagName || "").toLowerCase() !== 'input' || - (target.type && target.type.toLowerCase() !== 'text'))))){ - // Toggle the drop down, but wait until keyup so that the drop down doesn't - // get a stray keyup event, or in the case of key-repeat (because user held - // down key for too long), stray keydown events - this._toggleOnKeyUp = true; - event.stop(e); - } - }, - - _onKeyUp: function(){ - if(this._toggleOnKeyUp){ - delete this._toggleOnKeyUp; - this.toggleDropDown(); - var d = this.dropDown; // drop down may not exist until toggleDropDown() call - if(d && d.focus){ - this.defer(lang.hitch(d, "focus"), 1); - } - } - }, - - _onBlur: function(){ - // summary: - // Called magically when focus has shifted away from this widget and it's dropdown - - // Don't focus on button if the user has explicitly focused on something else (happens - // when user clicks another control causing the current popup to close).. - // But if focus is inside of the drop down then reset focus to me, because IE doesn't like - // it when you display:none a node with focus. - var focusMe = focus.curNode && this.dropDown && dom.isDescendant(focus.curNode, this.dropDown.domNode); - - this.closeDropDown(focusMe); - - this.inherited(arguments); - }, - - isLoaded: function(){ - // summary: - // Returns true if the dropdown exists and it's data is loaded. This can - // be overridden in order to force a call to loadDropDown(). - // tags: - // protected - - return true; - }, - - loadDropDown: function(/*Function*/ loadCallback){ - // summary: - // Creates the drop down if it doesn't exist, loads the data - // if there's an href and it hasn't been loaded yet, and then calls - // the given callback. - // tags: - // protected - - // TODO: for 2.0, change API to return a Deferred, instead of calling loadCallback? - loadCallback(); - }, - - loadAndOpenDropDown: function(){ - // summary: - // Creates the drop down if it doesn't exist, loads the data - // if there's an href and it hasn't been loaded yet, and - // then opens the drop down. This is basically a callback when the - // user presses the down arrow button to open the drop down. - // returns: Deferred - // Deferred for the drop down widget that - // fires when drop down is created and loaded - // tags: - // protected - var d = new Deferred(), - afterLoad = lang.hitch(this, function(){ - this.openDropDown(); - d.resolve(this.dropDown); - }); - if(!this.isLoaded()){ - this.loadDropDown(afterLoad); - }else{ - afterLoad(); - } - return d; - }, - - toggleDropDown: function(){ - // summary: - // Callback when the user presses the down arrow button or presses - // the down arrow key to open/close the drop down. - // Toggle the drop-down widget; if it is up, close it, if not, open it - // tags: - // protected - - if(this.disabled || this.readOnly){ return; } - if(!this._opened){ - this.loadAndOpenDropDown(); - }else{ - this.closeDropDown(); - } - }, - - openDropDown: function(){ - // summary: - // Opens the dropdown for this widget. To be called only when this.dropDown - // has been created and is ready to display (ie, it's data is loaded). - // returns: - // return value of dijit/popup.open() - // tags: - // protected - - var dropDown = this.dropDown, - ddNode = dropDown.domNode, - aroundNode = this._aroundNode || this.domNode, - self = this; - - // Prepare our popup's height and honor maxHeight if it exists. - - // TODO: isn't maxHeight dependent on the return value from dijit/popup.open(), - // ie, dependent on how much space is available (BK) - - if(!this._preparedNode){ - this._preparedNode = true; - // Check if we have explicitly set width and height on the dropdown widget dom node - if(ddNode.style.width){ - this._explicitDDWidth = true; - } - if(ddNode.style.height){ - this._explicitDDHeight = true; - } - } - - // Code for resizing dropdown (height limitation, or increasing width to match my width) - if(this.maxHeight || this.forceWidth || this.autoWidth){ - var myStyle = { - display: "", - visibility: "hidden" - }; - if(!this._explicitDDWidth){ - myStyle.width = ""; - } - if(!this._explicitDDHeight){ - myStyle.height = ""; - } - domStyle.set(ddNode, myStyle); - - // Figure out maximum height allowed (if there is a height restriction) - var maxHeight = this.maxHeight; - if(maxHeight == -1){ - // limit height to space available in viewport either above or below my domNode - // (whichever side has more room) - var viewport = winUtils.getBox(this.ownerDocument), - position = domGeometry.position(aroundNode, false); - maxHeight = Math.floor(Math.max(position.y, viewport.h - (position.y + position.h))); - } - - // Attach dropDown to DOM and make make visibility:hidden rather than display:none - // so we call startup() and also get the size - popup.moveOffScreen(dropDown); - - if(dropDown.startup && !dropDown._started){ - dropDown.startup(); // this has to be done after being added to the DOM - } - // Get size of drop down, and determine if vertical scroll bar needed. If no scroll bar needed, - // use overflow:visible rather than overflow:hidden so off-by-one errors don't hide drop down border. - var mb = domGeometry.getMarginSize(ddNode); - var overHeight = (maxHeight && mb.h > maxHeight); - domStyle.set(ddNode, { - overflowX: "visible", - overflowY: overHeight ? "auto" : "visible" - }); - if(overHeight){ - mb.h = maxHeight; - if("w" in mb){ - mb.w += 16; // room for vertical scrollbar - } - }else{ - delete mb.h; - } - - // Adjust dropdown width to match or be larger than my width - if(this.forceWidth){ - mb.w = aroundNode.offsetWidth; - }else if(this.autoWidth){ - mb.w = Math.max(mb.w, aroundNode.offsetWidth); - }else{ - delete mb.w; - } - - // And finally, resize the dropdown to calculated height and width - if(lang.isFunction(dropDown.resize)){ - dropDown.resize(mb); - }else{ - domGeometry.setMarginBox(ddNode, mb); - } - } - - var retVal = popup.open({ - parent: this, - popup: dropDown, - around: aroundNode, - orient: this.dropDownPosition, - onExecute: function(){ - self.closeDropDown(true); - }, - onCancel: function(){ - self.closeDropDown(true); - }, - onClose: function(){ - domAttr.set(self._popupStateNode, "popupActive", false); - domClass.remove(self._popupStateNode, "dijitHasDropDownOpen"); - self._set("_opened", false); // use set() because _CssStateMixin is watching - } - }); - domAttr.set(this._popupStateNode, "popupActive", "true"); - domClass.add(this._popupStateNode, "dijitHasDropDownOpen"); - this._set("_opened", true); // use set() because _CssStateMixin is watching - this.domNode.setAttribute("aria-expanded", "true"); - - return retVal; - }, - - closeDropDown: function(/*Boolean*/ focus){ - // summary: - // Closes the drop down on this widget - // focus: - // If true, refocuses the button widget - // tags: - // protected - - if(this._focusDropDownTimer){ - this._focusDropDownTimer.remove(); - delete this._focusDropDownTimer; - } - if(this._opened){ - this.domNode.setAttribute("aria-expanded", "false"); - if(focus){ this.focus(); } - popup.close(this.dropDown); - this._opened = false; - } - } - - }); -}); diff --git a/lib/dijit/_KeyNavContainer.js.uncompressed.js b/lib/dijit/_KeyNavContainer.js.uncompressed.js deleted file mode 100644 index 9fa80c18d..000000000 --- a/lib/dijit/_KeyNavContainer.js.uncompressed.js +++ /dev/null @@ -1,257 +0,0 @@ -define("dijit/_KeyNavContainer", [ - "dojo/_base/kernel", // kernel.deprecated - "./_Container", - "./_FocusMixin", - "dojo/_base/array", // array.forEach - "dojo/keys", // keys.END keys.HOME - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/dom-attr", // domAttr.set - "dojo/_base/lang" // lang.hitch -], function(kernel, _Container, _FocusMixin, array, keys, declare, event, domAttr, lang){ - - - // module: - // dijit/_KeyNavContainer - - return declare("dijit._KeyNavContainer", [_FocusMixin, _Container], { - // summary: - // A _Container with keyboard navigation of its children. - // description: - // To use this mixin, call connectKeyNavHandlers() in - // postCreate(). - // It provides normalized keyboard and focusing code for Container - // widgets. - -/*===== - // focusedChild: [protected] Widget - // The currently focused child widget, or null if there isn't one - focusedChild: null, -=====*/ - - // tabIndex: String - // Tab index of the container; same as HTML tabIndex attribute. - // Note then when user tabs into the container, focus is immediately - // moved to the first item in the container. - tabIndex: "0", - - connectKeyNavHandlers: function(/*keys[]*/ prevKeyCodes, /*keys[]*/ nextKeyCodes){ - // summary: - // Call in postCreate() to attach the keyboard handlers - // to the container. - // preKeyCodes: keys[] - // Key codes for navigating to the previous child. - // nextKeyCodes: keys[] - // Key codes for navigating to the next child. - // tags: - // protected - - // TODO: call this automatically from my own postCreate() - - var keyCodes = (this._keyNavCodes = {}); - var prev = lang.hitch(this, "focusPrev"); - var next = lang.hitch(this, "focusNext"); - array.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev; }); - array.forEach(nextKeyCodes, function(code){ keyCodes[code] = next; }); - keyCodes[keys.HOME] = lang.hitch(this, "focusFirstChild"); - keyCodes[keys.END] = lang.hitch(this, "focusLastChild"); - this.connect(this.domNode, "onkeypress", "_onContainerKeypress"); - this.connect(this.domNode, "onfocus", "_onContainerFocus"); - }, - - startupKeyNavChildren: function(){ - kernel.deprecated("startupKeyNavChildren() call no longer needed", "", "2.0"); - }, - - startup: function(){ - this.inherited(arguments); - array.forEach(this.getChildren(), lang.hitch(this, "_startupChild")); - }, - - addChild: function(/*dijit/_WidgetBase*/ widget, /*int?*/ insertIndex){ - this.inherited(arguments); - this._startupChild(widget); - }, - - focus: function(){ - // summary: - // Default focus() implementation: focus the first child. - this.focusFirstChild(); - }, - - focusFirstChild: function(){ - // summary: - // Focus the first focusable child in the container. - // tags: - // protected - this.focusChild(this._getFirstFocusableChild()); - }, - - focusLastChild: function(){ - // summary: - // Focus the last focusable child in the container. - // tags: - // protected - this.focusChild(this._getLastFocusableChild()); - }, - - focusNext: function(){ - // summary: - // Focus the next widget - // tags: - // protected - this.focusChild(this._getNextFocusableChild(this.focusedChild, 1)); - }, - - focusPrev: function(){ - // summary: - // Focus the last focusable node in the previous widget - // (ex: go to the ComboButton icon section rather than button section) - // tags: - // protected - this.focusChild(this._getNextFocusableChild(this.focusedChild, -1), true); - }, - - focusChild: function(/*dijit/_WidgetBase*/ widget, /*Boolean*/ last){ - // summary: - // Focus specified child widget. - // widget: - // Reference to container's child widget - // last: - // If true and if widget has multiple focusable nodes, focus the - // last one instead of the first one - // tags: - // protected - - if(!widget){ return; } - - if(this.focusedChild && widget !== this.focusedChild){ - this._onChildBlur(this.focusedChild); // used by _MenuBase - } - widget.set("tabIndex", this.tabIndex); // for IE focus outline to appear, must set tabIndex before focs - widget.focus(last ? "end" : "start"); - this._set("focusedChild", widget); - }, - - _startupChild: function(/*dijit/_WidgetBase*/ widget){ - // summary: - // Setup for each child widget - // description: - // Sets tabIndex=-1 on each child, so that the tab key will - // leave the container rather than visiting each child. - // tags: - // private - - widget.set("tabIndex", "-1"); - - this.connect(widget, "_onFocus", function(){ - // Set valid tabIndex so tabbing away from widget goes to right place, see #10272 - widget.set("tabIndex", this.tabIndex); - }); - this.connect(widget, "_onBlur", function(){ - widget.set("tabIndex", "-1"); - }); - }, - - _onContainerFocus: function(evt){ - // summary: - // Handler for when the container gets focus - // description: - // Initially the container itself has a tabIndex, but when it gets - // focus, switch focus to first child... - // tags: - // private - - // Note that we can't use _onFocus() because switching focus from the - // _onFocus() handler confuses the focus.js code - // (because it causes _onFocusNode() to be called recursively) - // Also, _onFocus() would fire when focus went directly to a child widget due to mouse click. - - // Ignore spurious focus events: - // 1. focus on a child widget bubbles on FF - // 2. on IE, clicking the scrollbar of a select dropdown moves focus from the focused child item to me - if(evt.target !== this.domNode || this.focusedChild){ return; } - - this.focusFirstChild(); - - // and then set the container's tabIndex to -1, - // (don't remove as that breaks Safari 4) - // so that tab or shift-tab will go to the fields after/before - // the container, rather than the container itself - domAttr.set(this.domNode, "tabIndex", "-1"); - }, - - _onBlur: function(evt){ - // When focus is moved away the container, and its descendant (popup) widgets, - // then restore the container's tabIndex so that user can tab to it again. - // Note that using _onBlur() so that this doesn't happen when focus is shifted - // to one of my child widgets (typically a popup) - if(this.tabIndex){ - domAttr.set(this.domNode, "tabIndex", this.tabIndex); - } - this.focusedChild = null; - this.inherited(arguments); - }, - - _onContainerKeypress: function(evt){ - // summary: - // When a key is pressed, if it's an arrow key etc. then - // it's handled here. - // tags: - // private - if(evt.ctrlKey || evt.altKey){ return; } - var func = this._keyNavCodes[evt.charOrCode]; - if(func){ - func(); - event.stop(evt); - } - }, - - _onChildBlur: function(/*dijit/_WidgetBase*/ /*===== widget =====*/){ - // summary: - // Called when focus leaves a child widget to go - // to a sibling widget. - // Used by MenuBase.js (TODO: move code there) - // tags: - // protected - }, - - _getFirstFocusableChild: function(){ - // summary: - // Returns first child that can be focused - return this._getNextFocusableChild(null, 1); // dijit/_WidgetBase - }, - - _getLastFocusableChild: function(){ - // summary: - // Returns last child that can be focused - return this._getNextFocusableChild(null, -1); // dijit/_WidgetBase - }, - - _getNextFocusableChild: function(child, dir){ - // summary: - // Returns the next or previous focusable child, compared - // to "child" - // child: Widget - // The current widget - // dir: Integer - // - 1 = after - // - -1 = before - if(child){ - child = this._getSiblingOfChild(child, dir); - } - var children = this.getChildren(); - for(var i=0; i < children.length; i++){ - if(!child){ - child = children[(dir>0) ? 0 : (children.length-1)]; - } - if(child.isFocusable()){ - return child; // dijit/_WidgetBase - } - child = this._getSiblingOfChild(child, dir); - } - // no focusable child found - return null; // dijit/_WidgetBase - } - }); -}); diff --git a/lib/dijit/_MenuBase.js.uncompressed.js b/lib/dijit/_MenuBase.js.uncompressed.js deleted file mode 100644 index 4a0719e6a..000000000 --- a/lib/dijit/_MenuBase.js.uncompressed.js +++ /dev/null @@ -1,429 +0,0 @@ -define("dijit/_MenuBase", [ - "dojo/_base/array", // array.indexOf - "dojo/_base/declare", // declare - "dojo/dom", // dom.isDescendant domClass.replace - "dojo/dom-attr", - "dojo/dom-class", // domClass.replace - "dojo/_base/lang", // lang.hitch - "dojo/mouse", // mouse.enter, mouse.leave - "dojo/on", - "dojo/window", - "./a11yclick", - "./popup", - "./registry", - "./_Widget", - "./_KeyNavContainer", - "./_TemplatedMixin" -], function(array, declare, dom, domAttr, domClass, lang, mouse, on, winUtils, - a11yclick, pm, registry, _Widget, _KeyNavContainer, _TemplatedMixin){ - - -// module: -// dijit/_MenuBase - -return declare("dijit._MenuBase", - [_Widget, _TemplatedMixin, _KeyNavContainer], -{ - // summary: - // Base class for Menu and MenuBar - - // parentMenu: [readonly] Widget - // pointer to menu that displayed me - parentMenu: null, - - // popupDelay: Integer - // number of milliseconds before hovering (without clicking) causes the popup to automatically open. - popupDelay: 500, - - // autoFocus: Boolean - // A toggle to control whether or not a Menu gets focused when opened as a drop down from a MenuBar - // or DropDownButton/ComboButton. Note though that it always get focused when opened via the keyboard. - autoFocus: false, - - childSelector: function(/*DOMNode*/ node){ - // summary: - // Selector (passed to on.selector()) used to identify MenuItem child widgets, but exclude inert children - // like MenuSeparator. If subclass overrides to a string (ex: "> *"), the subclass must require dojo/query. - // tags: - // protected - - var widget = registry.byNode(node); - return node.parentNode == this.containerNode && widget && widget.focus; - }, - - postCreate: function(){ - var self = this, - matches = typeof this.childSelector == "string" ? this.childSelector : lang.hitch(this, "childSelector"); - this.own( - on(this.containerNode, on.selector(matches, mouse.enter), function(){ - self.onItemHover(registry.byNode(this)); - }), - on(this.containerNode, on.selector(matches, mouse.leave), function(){ - self.onItemUnhover(registry.byNode(this)); - }), - on(this.containerNode, on.selector(matches, a11yclick), function(evt){ - self.onItemClick(registry.byNode(this), evt); - evt.stopPropagation(); - evt.preventDefault(); - }) - ); - this.inherited(arguments); - }, - - onExecute: function(){ - // summary: - // Attach point for notification about when a menu item has been executed. - // This is an internal mechanism used for Menus to signal to their parent to - // close them, because they are about to execute the onClick handler. In - // general developers should not attach to or override this method. - // tags: - // protected - }, - - onCancel: function(/*Boolean*/ /*===== closeAll =====*/){ - // summary: - // Attach point for notification about when the user cancels the current menu - // This is an internal mechanism used for Menus to signal to their parent to - // close them. In general developers should not attach to or override this method. - // tags: - // protected - }, - - _moveToPopup: function(/*Event*/ evt){ - // summary: - // This handles the right arrow key (left arrow key on RTL systems), - // which will either open a submenu, or move to the next item in the - // ancestor MenuBar - // tags: - // private - - if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){ - this.onItemClick(this.focusedChild, evt); - }else{ - var topMenu = this._getTopMenu(); - if(topMenu && topMenu._isMenuBar){ - topMenu.focusNext(); - } - } - }, - - _onPopupHover: function(/*Event*/ /*===== evt =====*/){ - // summary: - // This handler is called when the mouse moves over the popup. - // tags: - // private - - // if the mouse hovers over a menu popup that is in pending-close state, - // then stop the close operation. - // This can't be done in onItemHover since some popup targets don't have MenuItems (e.g. ColorPicker) - if(this.currentPopup && this.currentPopup._pendingClose_timer){ - var parentMenu = this.currentPopup.parentMenu; - // highlight the parent menu item pointing to this popup - if(parentMenu.focusedChild){ - parentMenu.focusedChild._setSelected(false); - } - parentMenu.focusedChild = this.currentPopup.from_item; - parentMenu.focusedChild._setSelected(true); - // cancel the pending close - this._stopPendingCloseTimer(this.currentPopup); - } - }, - - onItemHover: function(/*MenuItem*/ item){ - // summary: - // Called when cursor is over a MenuItem. - // tags: - // protected - - // Don't do anything unless user has "activated" the menu by: - // 1) clicking it - // 2) opening it from a parent menu (which automatically focuses it) - if(this.isActive){ - this.focusChild(item); - if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){ - this.hover_timer = this.defer("_openPopup", this.popupDelay); - } - } - // if the user is mixing mouse and keyboard navigation, - // then the menu may not be active but a menu item has focus, - // but it's not the item that the mouse just hovered over. - // To avoid both keyboard and mouse selections, use the latest. - if(this.focusedChild){ - this.focusChild(item); - } - this._hoveredChild = item; - - item._set("hovering", true); - }, - - _onChildBlur: function(item){ - // summary: - // Called when a child MenuItem becomes inactive because focus - // has been removed from the MenuItem *and* it's descendant menus. - // tags: - // private - this._stopPopupTimer(); - item._setSelected(false); - // Close all popups that are open and descendants of this menu - var itemPopup = item.popup; - if(itemPopup){ - this._stopPendingCloseTimer(itemPopup); - itemPopup._pendingClose_timer = this.defer(function(){ - itemPopup._pendingClose_timer = null; - if(itemPopup.parentMenu){ - itemPopup.parentMenu.currentPopup = null; - } - pm.close(itemPopup); // this calls onClose - }, this.popupDelay); - } - }, - - onItemUnhover: function(/*MenuItem*/ item){ - // summary: - // Callback fires when mouse exits a MenuItem - // tags: - // protected - - if(this.isActive){ - this._stopPopupTimer(); - } - if(this._hoveredChild == item){ this._hoveredChild = null; } - - item._set("hovering", false); - }, - - _stopPopupTimer: function(){ - // summary: - // Cancels the popup timer because the user has stop hovering - // on the MenuItem, etc. - // tags: - // private - if(this.hover_timer){ - this.hover_timer = this.hover_timer.remove(); - } - }, - - _stopPendingCloseTimer: function(/*dijit/_WidgetBase*/ popup){ - // summary: - // Cancels the pending-close timer because the close has been preempted - // tags: - // private - if(popup._pendingClose_timer){ - popup._pendingClose_timer = popup._pendingClose_timer.remove(); - } - }, - - _stopFocusTimer: function(){ - // summary: - // Cancels the pending-focus timer because the menu was closed before focus occured - // tags: - // private - if(this._focus_timer){ - this._focus_timer = this._focus_timer.remove(); - } - }, - - _getTopMenu: function(){ - // summary: - // Returns the top menu in this chain of Menus - // tags: - // private - for(var top=this; top.parentMenu; top=top.parentMenu); - return top; - }, - - onItemClick: function(/*dijit/_WidgetBase*/ item, /*Event*/ evt){ - // summary: - // Handle clicks on an item. - // tags: - // private - - // this can't be done in _onFocus since the _onFocus events occurs asynchronously - if(typeof this.isShowingNow == 'undefined'){ // non-popup menu - this._markActive(); - } - - this.focusChild(item); - - if(item.disabled){ return false; } - - if(item.popup){ - this._openPopup(evt.type == "keypress"); - }else{ - // before calling user defined handler, close hierarchy of menus - // and restore focus to place it was when menu was opened - this.onExecute(); - - // user defined handler for click - item._onClick ? item._onClick(evt) : item.onClick(evt); - } - }, - - _openPopup: function(/*Boolean*/ focus){ - // summary: - // Open the popup to the side of/underneath the current menu item, and optionally focus first item - // tags: - // protected - - this._stopPopupTimer(); - var from_item = this.focusedChild; - if(!from_item){ return; } // the focused child lost focus since the timer was started - var popup = from_item.popup; - if(!popup.isShowingNow){ - if(this.currentPopup){ - this._stopPendingCloseTimer(this.currentPopup); - pm.close(this.currentPopup); - } - popup.parentMenu = this; - popup.from_item = from_item; // helps finding the parent item that should be focused for this popup - var self = this; - pm.open({ - parent: this, - popup: popup, - around: from_item.domNode, - orient: this._orient || ["after", "before"], - onCancel: function(){ // called when the child menu is canceled - // set isActive=false (_closeChild vs _cleanUp) so that subsequent hovering will NOT open child menus - // which seems aligned with the UX of most applications (e.g. notepad, wordpad, paint shop pro) - self.focusChild(from_item); // put focus back on my node - self._cleanUp(); // close the submenu (be sure this is done _after_ focus is moved) - from_item._setSelected(true); // oops, _cleanUp() deselected the item - self.focusedChild = from_item; // and unset focusedChild - }, - onExecute: lang.hitch(this, "_cleanUp") - }); - - this.currentPopup = popup; - // detect mouseovers to handle lazy mouse movements that temporarily focus other menu items - popup.connect(popup.domNode, "onmouseenter", lang.hitch(self, "_onPopupHover")); // cleaned up when the popped-up widget is destroyed on close - } - - if(focus && popup.focus){ - // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar), then focus the popup. - // If the cursor happens to collide with the popup, it will generate an onmouseover event - // even though the mouse wasn't moved. Use defer() to call popup.focus so that - // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742) - popup._focus_timer = this.defer(lang.hitch(popup, function(){ - this._focus_timer = null; - this.focus(); - })); - } - }, - - _markActive: function(){ - // summary: - // Mark this menu's state as active. - // Called when this Menu gets focus from: - // - // 1. clicking it (mouse or via space/arrow key) - // 2. being opened by a parent menu. - // - // This is not called just from mouse hover. - // Focusing a menu via TAB does NOT automatically set isActive - // since TAB is a navigation operation and not a selection one. - // For Windows apps, pressing the ALT key focuses the menubar - // menus (similar to TAB navigation) but the menu is not active - // (ie no dropdown) until an item is clicked. - this.isActive = true; - domClass.replace(this.domNode, "dijitMenuActive", "dijitMenuPassive"); - }, - - onOpen: function(/*Event*/ /*===== e =====*/){ - // summary: - // Callback when this menu is opened. - // This is called by the popup manager as notification that the menu - // was opened. - // tags: - // private - - this.isShowingNow = true; - this._markActive(); - }, - - _markInactive: function(){ - // summary: - // Mark this menu's state as inactive. - this.isActive = false; // don't do this in _onBlur since the state is pending-close until we get here - domClass.replace(this.domNode, "dijitMenuPassive", "dijitMenuActive"); - }, - - onClose: function(){ - // summary: - // Callback when this menu is closed. - // This is called by the popup manager as notification that the menu - // was closed. - // tags: - // private - - this._stopFocusTimer(); - this._markInactive(); - this.isShowingNow = false; - this.parentMenu = null; - }, - - _closeChild: function(){ - // summary: - // Called when submenu is clicked or focus is lost. Close hierarchy of menus. - // tags: - // private - this._stopPopupTimer(); - - if(this.currentPopup){ - // If focus is on a descendant MenuItem then move focus to me, - // because IE doesn't like it when you display:none a node with focus, - // and also so keyboard users don't lose control. - // Likely, immediately after a user defined onClick handler will move focus somewhere - // else, like a Dialog. - if(array.indexOf(this._focusManager.activeStack, this.id) >= 0){ - domAttr.set(this.focusedChild.focusNode, "tabIndex", this.tabIndex); - this.focusedChild.focusNode.focus(); - } - // Close all popups that are open and descendants of this menu - pm.close(this.currentPopup); - this.currentPopup = null; - } - - if(this.focusedChild){ // unhighlight the focused item - this.focusedChild._setSelected(false); - this.onItemUnhover(this.focusedChild); - this.focusedChild = null; - } - }, - - _onItemFocus: function(/*MenuItem*/ item){ - // summary: - // Called when child of this Menu gets focus from: - // - // 1. clicking it - // 2. tabbing into it - // 3. being opened by a parent menu. - // - // This is not called just from mouse hover. - if(this._hoveredChild && this._hoveredChild != item){ - this.onItemUnhover(this._hoveredChild); // any previous mouse movement is trumped by focus selection - } - }, - - _onBlur: function(){ - // summary: - // Called when focus is moved away from this Menu and it's submenus. - // tags: - // protected - this._cleanUp(); - this.inherited(arguments); - }, - - _cleanUp: function(){ - // summary: - // Called when the user is done with this menu. Closes hierarchy of menus. - // tags: - // private - - this._closeChild(); // don't call this.onClose since that's incorrect for MenuBar's that never close - if(typeof this.isShowingNow == 'undefined'){ // non-popup menu doesn't call onClose - this._markInactive(); - } - } -}); - -}); diff --git a/lib/dijit/_OnDijitClickMixin.js.uncompressed.js b/lib/dijit/_OnDijitClickMixin.js.uncompressed.js deleted file mode 100644 index 5d2a9d5a2..000000000 --- a/lib/dijit/_OnDijitClickMixin.js.uncompressed.js +++ /dev/null @@ -1,50 +0,0 @@ -define("dijit/_OnDijitClickMixin", [ - "dojo/on", - "dojo/_base/array", // array.forEach - "dojo/keys", // keys.ENTER keys.SPACE - "dojo/_base/declare", // declare - "dojo/has", // has("dom-addeventlistener") - "dojo/_base/unload", // unload.addOnWindowUnload - "dojo/_base/window", // win.doc.addEventListener win.doc.attachEvent win.doc.detachEvent - "./a11yclick" -], function(on, array, keys, declare, has, unload, win, a11yclick){ - - // module: - // dijit/_OnDijitClickMixin - - var ret = declare("dijit._OnDijitClickMixin", null, { - connect: function( - /*Object|null*/ obj, - /*String|Function*/ event, - /*String|Function*/ method){ - // summary: - // Connects specified obj/event to specified method of this object - // and registers for disconnect() on widget destroy. - // description: - // Provide widget-specific analog to connect.connect, except with the - // implicit use of this widget as the target object. - // This version of connect also provides a special "ondijitclick" - // event which triggers on a click or space or enter keyup. - // Events connected with `this.connect` are disconnected upon - // destruction. - // returns: - // A handle that can be passed to `disconnect` in order to disconnect before - // the widget is destroyed. - // example: - // | var btn = new Button(); - // | // when foo.bar() is called, call the listener we're going to - // | // provide in the scope of btn - // | btn.connect(foo, "bar", function(){ - // | console.debug(this.toString()); - // | }); - // tags: - // protected - - return this.inherited(arguments, [obj, event == "ondijitclick" ? a11yclick : event, method]); - } - }); - - ret.a11yclick = a11yclick; // back compat - - return ret; -}); diff --git a/lib/dijit/_PaletteMixin.js.uncompressed.js b/lib/dijit/_PaletteMixin.js.uncompressed.js deleted file mode 100644 index 3665f8f21..000000000 --- a/lib/dijit/_PaletteMixin.js.uncompressed.js +++ /dev/null @@ -1,340 +0,0 @@ -define("dijit/_PaletteMixin", [ - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-construct", // domConstruct.create domConstruct.place - "dojo/_base/event", // event.stop - "dojo/keys", // keys - "dojo/_base/lang", // lang.getObject - "./_CssStateMixin", - "./focus", - "./typematic" -], function(declare, domAttr, domClass, domConstruct, event, keys, lang, _CssStateMixin, focus, typematic){ - -// module: -// dijit/_PaletteMixin - -return declare("dijit._PaletteMixin", [_CssStateMixin], { - // summary: - // A keyboard accessible palette, for picking a color/emoticon/etc. - // description: - // A mixin for a grid showing various entities, so the user can pick a certain entity. - - // defaultTimeout: Number - // Number of milliseconds before a held key or button becomes typematic - defaultTimeout: 500, - - // timeoutChangeRate: Number - // Fraction of time used to change the typematic timer between events - // 1.0 means that each typematic event fires at defaultTimeout intervals - // Less than 1.0 means that each typematic event fires at an increasing faster rate - timeoutChangeRate: 0.90, - - // value: String - // Currently selected color/emoticon/etc. - value: "", - - // _selectedCell: [private] Integer - // Index of the currently selected cell. Initially, none selected - _selectedCell: -1, - -/*===== - // _currentFocus: [private] DomNode - // The currently focused cell (if the palette itself has focus), or otherwise - // the cell to be focused when the palette itself gets focus. - // Different from value, which represents the selected (i.e. clicked) cell. - _currentFocus: null, -=====*/ - -/*===== - // _xDim: [protected] Integer - // This is the number of cells horizontally across. - _xDim: null, -=====*/ - -/*===== - // _yDim: [protected] Integer - // This is the number of cells vertically down. - _yDim: null, -=====*/ - - // tabIndex: String - // Widget tab index. - tabIndex: "0", - - // cellClass: [protected] String - // CSS class applied to each cell in the palette - cellClass: "dijitPaletteCell", - - // dyeClass: [protected] Constructor - // Constructor for Object created for each cell of the palette. - // dyeClass should implements dijit.Dye interface - dyeClass: null, - - // summary: String - // Localized summary for the palette table - summary: '', - _setSummaryAttr: "paletteTableNode", - - _dyeFactory: function(value /*===== , row, col, title =====*/){ - // summary: - // Return instance of dijit.Dye for specified cell of palette - // tags: - // extension - - // Remove string support for 2.0 - var dyeClassObj = typeof this.dyeClass == "string" ? lang.getObject(this.dyeClass) : this.dyeClass; - return new dyeClassObj(value); - }, - - _preparePalette: function(choices, titles) { - // summary: - // Subclass must call _preparePalette() from postCreate(), passing in the tooltip - // for each cell - // choices: String[][] - // id's for each cell of the palette, used to create Dye JS object for each cell - // titles: String[] - // Localized tooltip for each cell - - this._cells = []; - var url = this._blankGif; - - this.connect(this.gridNode, "ondijitclick", "_onCellClick"); - - for(var row=0; row < choices.length; row++){ - var rowNode = domConstruct.create("tr", {tabIndex: "-1"}, this.gridNode); - for(var col=0; col < choices[row].length; col++){ - var value = choices[row][col]; - if(value){ - var cellObject = this._dyeFactory(value, row, col, titles[value]); - - var cellNode = domConstruct.create("td", { - "class": this.cellClass, - tabIndex: "-1", - title: titles[value], - role: "gridcell" - }, rowNode); - - // prepare cell inner structure - cellObject.fillCell(cellNode, url); - - cellNode.idx = this._cells.length; - - // save cell info into _cells - this._cells.push({node:cellNode, dye:cellObject}); - } - } - } - this._xDim = choices[0].length; - this._yDim = choices.length; - - // Now set all events - // The palette itself is navigated to with the tab key on the keyboard - // Keyboard navigation within the Palette is with the arrow keys - // Spacebar selects the cell. - // For the up key the index is changed by negative the x dimension. - - var keyIncrementMap = { - UP_ARROW: -this._xDim, - // The down key the index is increase by the x dimension. - DOWN_ARROW: this._xDim, - // Right and left move the index by 1. - RIGHT_ARROW: this.isLeftToRight() ? 1 : -1, - LEFT_ARROW: this.isLeftToRight() ? -1 : 1 - }; - for(var key in keyIncrementMap){ - this.own( - typematic.addKeyListener( - this.domNode, - {charOrCode:keys[key], ctrlKey:false, altKey:false, shiftKey:false}, - this, - function(){ - var increment = keyIncrementMap[key]; - return function(count){ this._navigateByKey(increment, count); }; - }(), - this.timeoutChangeRate, - this.defaultTimeout - ) - ); - } - }, - - postCreate: function(){ - this.inherited(arguments); - - // Set initial navigable node. - this._setCurrent(this._cells[0].node); - }, - - focus: function(){ - // summary: - // Focus this widget. Puts focus on the most recently focused cell. - - // The cell already has tabIndex set, just need to set CSS and focus it - focus.focus(this._currentFocus); - }, - - _onCellClick: function(/*Event*/ evt){ - // summary: - // Handler for click, enter key & space key. Selects the cell. - // evt: - // The event. - // tags: - // private - - var target = evt.target; - - // Find TD associated with click event. For ColorPalette user likely clicked IMG inside of TD - while(target.tagName != "TD"){ - if(!target.parentNode || target == this.gridNode){ // probably can never happen, but just in case - return; - } - target = target.parentNode; - } - - var value = this._getDye(target).getValue(); - - // First focus the clicked cell, and then send onChange() notification. - // onChange() (via _setValueAttr) must be after the focus call, because - // it may trigger a refocus to somewhere else (like the Editor content area), and that - // second focus should win. - this._setCurrent(target); - focus.focus(target); - this._setValueAttr(value, true); - - event.stop(evt); - }, - - _setCurrent: function(/*DomNode*/ node){ - // summary: - // Sets which node is the focused cell. - // description: - // At any point in time there's exactly one - // cell with tabIndex != -1. If focus is inside the palette then - // focus is on that cell. - // - // After calling this method, arrow key handlers and mouse click handlers - // should focus the cell in a setTimeout(). - // tags: - // protected - if("_currentFocus" in this){ - // Remove tabIndex on old cell - domAttr.set(this._currentFocus, "tabIndex", "-1"); - } - - // Set tabIndex of new cell - this._currentFocus = node; - if(node){ - domAttr.set(node, "tabIndex", this.tabIndex); - } - }, - - _setValueAttr: function(value, priorityChange){ - // summary: - // This selects a cell. It triggers the onChange event. - // value: String - // Value of the cell to select - // tags: - // protected - // priorityChange: Boolean? - // Optional parameter used to tell the select whether or not to fire - // onChange event. - - // clear old selected cell - if(this._selectedCell >= 0){ - domClass.remove(this._cells[this._selectedCell].node, this.cellClass + "Selected"); - } - this._selectedCell = -1; - - // search for cell matching specified value - if(value){ - for(var i = 0; i < this._cells.length; i++){ - if(value == this._cells[i].dye.getValue()){ - this._selectedCell = i; - domClass.add(this._cells[i].node, this.cellClass + "Selected"); - break; - } - } - } - - // record new value, or null if no matching cell - this._set("value", this._selectedCell >= 0 ? value : null); - - if(priorityChange || priorityChange === undefined){ - this.onChange(value); - } - }, - - onChange: function(/*===== value =====*/){ - // summary: - // Callback when a cell is selected. - // value: String - // Value corresponding to cell. - }, - - _navigateByKey: function(increment, typeCount){ - // summary: - // This is the callback for typematic. - // It changes the focus and the highlighed cell. - // increment: - // How much the key is navigated. - // typeCount: - // How many times typematic has fired. - // tags: - // private - - // typecount == -1 means the key is released. - if(typeCount == -1){ return; } - - var newFocusIndex = this._currentFocus.idx + increment; - if(newFocusIndex < this._cells.length && newFocusIndex > -1){ - var focusNode = this._cells[newFocusIndex].node; - this._setCurrent(focusNode); - - // Actually focus the node, for the benefit of screen readers. - // Use defer because IE doesn't like changing focus inside of an event handler - this.defer(lang.hitch(focus, "focus", focusNode)); - } - }, - - _getDye: function(/*DomNode*/ cell){ - // summary: - // Get JS object for given cell DOMNode - - return this._cells[cell.idx].dye; - } -}); - -/*===== -declare("dijit.Dye", - null, - { - // summary: - // Interface for the JS Object associated with a palette cell (i.e. DOMNode) - - constructor: function(alias, row, col){ - // summary: - // Initialize according to value or alias like "white" - // alias: String - }, - - getValue: function(){ - // summary: - // Return "value" of cell; meaning of "value" varies by subclass. - // description: - // For example color hex value, emoticon ascii value etc, entity hex value. - }, - - fillCell: function(cell, blankGif){ - // summary: - // Add cell DOMNode inner structure - // cell: DomNode - // The surrounding cell - // blankGif: String - // URL for blank cell image - } - } -); -=====*/ - -}); diff --git a/lib/dijit/_Templated.js.uncompressed.js b/lib/dijit/_Templated.js.uncompressed.js deleted file mode 100644 index c4c9a7ad2..000000000 --- a/lib/dijit/_Templated.js.uncompressed.js +++ /dev/null @@ -1,64 +0,0 @@ -define("dijit/_Templated", [ - "./_WidgetBase", - "./_TemplatedMixin", - "./_WidgetsInTemplateMixin", - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.extend lang.isArray - "dojo/_base/kernel" // kernel.deprecated -], function(_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, array, declare, lang, kernel){ - - // module: - // dijit/_Templated - - // These arguments can be specified for widgets which are used in templates. - // Since any widget can be specified as sub widgets in template, mix it - // into the base widget class. (This is a hack, but it's effective.) - // Remove for 2.0. Also, hide from API doc parser. - lang.extend(_WidgetBase, /*===== {} || =====*/ { - waiRole: "", - waiState:"" - }); - - return declare("dijit._Templated", [_TemplatedMixin, _WidgetsInTemplateMixin], { - // summary: - // Deprecated mixin for widgets that are instantiated from a template. - // Widgets should use _TemplatedMixin plus if necessary _WidgetsInTemplateMixin instead. - - // widgetsInTemplate: [protected] Boolean - // Should we parse the template to find widgets that might be - // declared in markup inside it? False by default. - widgetsInTemplate: false, - - constructor: function(){ - kernel.deprecated(this.declaredClass + ": dijit._Templated deprecated, use dijit._TemplatedMixin and if necessary dijit._WidgetsInTemplateMixin", "", "2.0"); - }, - - _attachTemplateNodes: function(rootNode, getAttrFunc){ - - this.inherited(arguments); - - // Do deprecated waiRole and waiState - var nodes = lang.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*")); - var x = lang.isArray(rootNode) ? 0 : -1; - for(; x<nodes.length; x++){ - var baseNode = (x == -1) ? rootNode : nodes[x]; - - // waiRole, waiState - var role = getAttrFunc(baseNode, "waiRole"); - if(role){ - baseNode.setAttribute("role", role); - } - var values = getAttrFunc(baseNode, "waiState"); - if(values){ - array.forEach(values.split(/\s*,\s*/), function(stateValue){ - if(stateValue.indexOf('-') != -1){ - var pair = stateValue.split('-'); - baseNode.setAttribute("aria-"+pair[0], pair[1]); - } - }); - } - } - } - }); -}); diff --git a/lib/dijit/_TemplatedMixin.js.uncompressed.js b/lib/dijit/_TemplatedMixin.js.uncompressed.js deleted file mode 100644 index 7473b92b9..000000000 --- a/lib/dijit/_TemplatedMixin.js.uncompressed.js +++ /dev/null @@ -1,309 +0,0 @@ -define("dijit/_TemplatedMixin", [ - "dojo/_base/lang", // lang.getObject - "dojo/touch", - "./_WidgetBase", - "dojo/string", // string.substitute string.trim - "dojo/cache", // dojo.cache - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.destroy, domConstruct.toDom - "dojo/sniff", // has("ie") - "dojo/_base/unload" // unload.addOnWindowUnload -], function(lang, touch, _WidgetBase, string, cache, array, declare, domConstruct, has, unload) { - - // module: - // dijit/_TemplatedMixin - - var _TemplatedMixin = declare("dijit._TemplatedMixin", null, { - // summary: - // Mixin for widgets that are instantiated from a template - - // templateString: [protected] String - // A string that represents the widget template. - // Use in conjunction with dojo.cache() to load from a file. - templateString: null, - - // templatePath: [protected deprecated] String - // Path to template (HTML file) for this widget relative to dojo.baseUrl. - // Deprecated: use templateString with require([... "dojo/text!..."], ...) instead - templatePath: null, - - // skipNodeCache: [protected] Boolean - // If using a cached widget template nodes poses issues for a - // particular widget class, it can set this property to ensure - // that its template is always re-built from a string - _skipNodeCache: false, - - // _earlyTemplatedStartup: Boolean - // A fallback to preserve the 1.0 - 1.3 behavior of children in - // templates having their startup called before the parent widget - // fires postCreate. Defaults to 'false', causing child widgets to - // have their .startup() called immediately before a parent widget - // .startup(), but always after the parent .postCreate(). Set to - // 'true' to re-enable to previous, arguably broken, behavior. - _earlyTemplatedStartup: false, - -/*===== - // _attachPoints: [private] String[] - // List of widget attribute names associated with data-dojo-attach-point=... in the - // template, ex: ["containerNode", "labelNode"] - _attachPoints: [], - - // _attachEvents: [private] Handle[] - // List of connections associated with data-dojo-attach-event=... in the - // template - _attachEvents: [], - =====*/ - - constructor: function(/*===== params, srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree. - - this._attachPoints = []; - this._attachEvents = []; - }, - - _stringRepl: function(tmpl){ - // summary: - // Does substitution of ${foo} type properties in template string - // tags: - // private - var className = this.declaredClass, _this = this; - // Cache contains a string because we need to do property replacement - // do the property replacement - return string.substitute(tmpl, this, function(value, key){ - if(key.charAt(0) == '!'){ value = lang.getObject(key.substr(1), false, _this); } - if(typeof value == "undefined"){ throw new Error(className+" template:"+key); } // a debugging aide - if(value == null){ return ""; } - - // Substitution keys beginning with ! will skip the transform step, - // in case a user wishes to insert unescaped markup, e.g. ${!foo} - return key.charAt(0) == "!" ? value : - // Safer substitution, see heading "Attribute values" in - // http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2 - value.toString().replace(/"/g,"""); //TODO: add &? use encodeXML method? - }, this); - }, - - buildRendering: function(){ - // summary: - // Construct the UI for this widget from a template, setting this.domNode. - // tags: - // protected - - if(!this.templateString){ - this.templateString = cache(this.templatePath, {sanitize: true}); - } - - // Lookup cached version of template, and download to cache if it - // isn't there already. Returns either a DomNode or a string, depending on - // whether or not the template contains ${foo} replacement parameters. - var cached = _TemplatedMixin.getCachedTemplate(this.templateString, this._skipNodeCache, this.ownerDocument); - - var node; - if(lang.isString(cached)){ - node = domConstruct.toDom(this._stringRepl(cached), this.ownerDocument); - if(node.nodeType != 1){ - // Flag common problems such as templates with multiple top level nodes (nodeType == 11) - throw new Error("Invalid template: " + cached); - } - }else{ - // if it's a node, all we have to do is clone it - node = cached.cloneNode(true); - } - - this.domNode = node; - - // Call down to _Widget.buildRendering() to get base classes assigned - // TODO: change the baseClass assignment to _setBaseClassAttr - this.inherited(arguments); - - // recurse through the node, looking for, and attaching to, our - // attachment points and events, which should be defined on the template node. - this._attachTemplateNodes(node, function(n,p){ return n.getAttribute(p); }); - - this._beforeFillContent(); // hook for _WidgetsInTemplateMixin - - this._fillContent(this.srcNodeRef); - }, - - _beforeFillContent: function(){ - }, - - _fillContent: function(/*DomNode*/ source){ - // summary: - // Relocate source contents to templated container node. - // this.containerNode must be able to receive children, or exceptions will be thrown. - // tags: - // protected - var dest = this.containerNode; - if(source && dest){ - while(source.hasChildNodes()){ - dest.appendChild(source.firstChild); - } - } - }, - - _attachTemplateNodes: function(rootNode, getAttrFunc){ - // summary: - // Iterate through the template and attach functions and nodes accordingly. - // Alternately, if rootNode is an array of widgets, then will process data-dojo-attach-point - // etc. for those widgets. - // description: - // Map widget properties and functions to the handlers specified in - // the dom node and it's descendants. This function iterates over all - // nodes and looks for these properties: - // - // - dojoAttachPoint/data-dojo-attach-point - // - dojoAttachEvent/data-dojo-attach-event - // rootNode: DomNode|Widget[] - // the node to search for properties. All children will be searched. - // getAttrFunc: Function - // a function which will be used to obtain property for a given - // DomNode/Widget - // tags: - // private - - var nodes = lang.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*")); - var x = lang.isArray(rootNode) ? 0 : -1; - for(; x < 0 || nodes[x]; x++){ // don't access nodes.length on IE, see #14346 - var baseNode = (x == -1) ? rootNode : nodes[x]; - if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){ - continue; - } - // Process data-dojo-attach-point - var attachPoint = getAttrFunc(baseNode, "dojoAttachPoint") || getAttrFunc(baseNode, "data-dojo-attach-point"); - if(attachPoint){ - var point, points = attachPoint.split(/\s*,\s*/); - while((point = points.shift())){ - if(lang.isArray(this[point])){ - this[point].push(baseNode); - }else{ - this[point]=baseNode; - } - this._attachPoints.push(point); - } - } - - // Process data-dojo-attach-event - var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent") || getAttrFunc(baseNode, "data-dojo-attach-event"); - if(attachEvent){ - // NOTE: we want to support attributes that have the form - // "domEvent: nativeEvent; ..." - var event, events = attachEvent.split(/\s*,\s*/); - var trim = lang.trim; - while((event = events.shift())){ - if(event){ - var thisFunc = null; - if(event.indexOf(":") != -1){ - // oh, if only JS had tuple assignment - var funcNameArr = event.split(":"); - event = trim(funcNameArr[0]); - thisFunc = trim(funcNameArr[1]); - }else{ - event = trim(event); - } - if(!thisFunc){ - thisFunc = event; - } - // Map "press", "move" and "release" to keys.touch, keys.move, keys.release - this._attachEvents.push(this.connect(baseNode, touch[event] || event, thisFunc)); - } - } - } - } - }, - - destroyRendering: function(){ - // Delete all attach points to prevent IE6 memory leaks. - array.forEach(this._attachPoints, function(point){ - delete this[point]; - }, this); - this._attachPoints = []; - - // And same for event handlers - array.forEach(this._attachEvents, this.disconnect, this); - this._attachEvents = []; - - this.inherited(arguments); - } - }); - - // key is templateString; object is either string or DOM tree - _TemplatedMixin._templateCache = {}; - - _TemplatedMixin.getCachedTemplate = function(templateString, alwaysUseString, doc){ - // summary: - // Static method to get a template based on the templatePath or - // templateString key - // templateString: String - // The template - // alwaysUseString: Boolean - // Don't cache the DOM tree for this template, even if it doesn't have any variables - // doc: Document? - // The target document. Defaults to document global if unspecified. - // returns: Mixed - // Either string (if there are ${} variables that need to be replaced) or just - // a DOM tree (if the node can be cloned directly) - - // is it already cached? - var tmplts = _TemplatedMixin._templateCache; - var key = templateString; - var cached = tmplts[key]; - if(cached){ - try{ - // if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the - // current document, then use the current cached value - if(!cached.ownerDocument || cached.ownerDocument == (doc || document)){ - // string or node of the same document - return cached; - } - }catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded - domConstruct.destroy(cached); - } - - templateString = string.trim(templateString); - - if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){ - // there are variables in the template so all we can do is cache the string - return (tmplts[key] = templateString); //String - }else{ - // there are no variables in the template so we can cache the DOM tree - var node = domConstruct.toDom(templateString, doc); - if(node.nodeType != 1){ - throw new Error("Invalid template: " + templateString); - } - return (tmplts[key] = node); //Node - } - }; - - if(has("ie")){ - unload.addOnWindowUnload(function(){ - var cache = _TemplatedMixin._templateCache; - for(var key in cache){ - var value = cache[key]; - if(typeof value == "object"){ // value is either a string or a DOM node template - domConstruct.destroy(value); - } - delete cache[key]; - } - }); - } - - // These arguments can be specified for widgets which are used in templates. - // Since any widget can be specified as sub widgets in template, mix it - // into the base widget class. (This is a hack, but it's effective.). - // Remove for 2.0. Also, hide from API doc parser. - lang.extend(_WidgetBase, /*===== {} || =====*/ { - dojoAttachEvent: "", - dojoAttachPoint: "" - }); - - return _TemplatedMixin; -}); diff --git a/lib/dijit/_TimePicker.js.uncompressed.js b/lib/dijit/_TimePicker.js.uncompressed.js deleted file mode 100644 index 76f348664..000000000 --- a/lib/dijit/_TimePicker.js.uncompressed.js +++ /dev/null @@ -1,525 +0,0 @@ -require({cache:{ -'url:dijit/templates/TimePicker.html':"<div id=\"widget_${id}\" class=\"dijitMenu\"\n ><div data-dojo-attach-point=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\"> </div\n\t\t><div class=\"dijitArrowButtonChar\">▲</div></div\n ><div data-dojo-attach-point=\"timeMenu,focusNode\" data-dojo-attach-event=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n ><div data-dojo-attach-point=\"downArrow\" class=\"dijitButtonNode dijitDownArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\"> </div\n\t\t><div class=\"dijitArrowButtonChar\">▼</div></div\n></div>\n"}}); -define("dijit/_TimePicker", [ - "dojo/_base/array", // array.forEach - "dojo/date", // date.compare - "dojo/date/locale", // locale.format - "dojo/date/stamp", // stamp.fromISOString stamp.toISOString - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.contains domClass.toggle - "dojo/dom-construct", // domConstruct.create - "dojo/_base/event", // event.stop - "dojo/_base/kernel", // deprecated - "dojo/keys", // keys - "dojo/_base/lang", // lang.mixin - "dojo/sniff", // has(...) - "dojo/query", // query - "dojo/mouse", // mouse.wheel - "./typematic", - "./_Widget", - "./_TemplatedMixin", - "./form/_FormValueWidget", - "dojo/text!./templates/TimePicker.html" -], function(array, ddate, locale, stamp, declare, domClass, domConstruct, event, kernel, keys, lang, has, query, mouse, - typematic, _Widget, _TemplatedMixin, _FormValueWidget, template){ - - // module: - // dijit/_TimePicker - - - var TimePicker = declare("dijit._TimePicker", [_Widget, _TemplatedMixin], { - // summary: - // A graphical time picker. - // This widget is used internally by other widgets and is not available - // as a standalone widget due to lack of accessibility support. - - templateString: template, - - // baseClass: [protected] String - // The root className to use for the various states of this widget - baseClass: "dijitTimePicker", - - // clickableIncrement: String - // ISO-8601 string representing the amount by which - // every clickable element in the time picker increases. - // Set in local time, without a time zone. - // Example: `T00:15:00` creates 15 minute increments - // Must divide dijit/_TimePicker.visibleIncrement evenly - clickableIncrement: "T00:15:00", - - // visibleIncrement: String - // ISO-8601 string representing the amount by which - // every element with a visible time in the time picker increases. - // Set in local time, without a time zone. - // Example: `T01:00:00` creates text in every 1 hour increment - visibleIncrement: "T01:00:00", - - // visibleRange: String - // ISO-8601 string representing the range of this TimePicker. - // The TimePicker will only display times in this range. - // Example: `T05:00:00` displays 5 hours of options - visibleRange: "T05:00:00", - - // value: String - // Date to display. - // Defaults to current time and date. - // Can be a Date object or an ISO-8601 string. - // If you specify the GMT time zone (`-01:00`), - // the time will be converted to the local time in the local time zone. - // Otherwise, the time is considered to be in the local time zone. - // If you specify the date and isDate is true, the date is used. - // Example: if your local time zone is `GMT -05:00`, - // `T10:00:00` becomes `T10:00:00-05:00` (considered to be local time), - // `T10:00:00-01:00` becomes `T06:00:00-05:00` (4 hour difference), - // `T10:00:00Z` becomes `T05:00:00-05:00` (5 hour difference between Zulu and local time) - // `yyyy-mm-ddThh:mm:ss` is the format to set the date and time - // Example: `2007-06-01T09:00:00` - value: new Date(), - - _visibleIncrement:2, - _clickableIncrement:1, - _totalIncrements:10, - - // constraints: TimePicker.__Constraints - // Specifies valid range of times (start time, end time) - constraints:{}, - -/*===== - serialize: function(val, options){ - // summary: - // User overridable function used to convert the attr('value') result to a String - // val: Date - // The current value - // options: Object? - // tags: - // protected - }, -=====*/ - serialize: stamp.toISOString, - -/*===== - // filterString: string - // The string to filter by - filterString: "", -=====*/ - - setValue: function(/*Date*/ value){ - // summary: - // Deprecated. Used set('value') instead. - // tags: - // deprecated - kernel.deprecated("dijit._TimePicker:setValue() is deprecated. Use set('value', ...) instead.", "", "2.0"); - this.set('value', value); - }, - - _setValueAttr: function(/*Date*/ date){ - // summary: - // Hook so set('value', ...) works. - // description: - // Set the value of the TimePicker. - // Redraws the TimePicker around the new date. - // tags: - // protected - this._set("value", date); - this._showText(); - }, - - _setFilterStringAttr: function(val){ - // summary: - // Called by TimeTextBox to filter the values shown in my list - this._set("filterString", val); - this._showText(); - }, - - isDisabledDate: function(/*===== dateObject, locale =====*/){ - // summary: - // May be overridden to disable certain dates in the TimePicker e.g. `isDisabledDate=locale.isWeekend` - // dateObject: Date - // locale: String? - // type: - // extension - return false; // Boolean - }, - - _getFilteredNodes: function(/*number*/ start, /*number*/ maxNum, /*Boolean*/ before, /*DOMnode*/ lastNode){ - // summary: - // Returns an array of nodes with the filter applied. At most maxNum nodes - // will be returned - but fewer may be returned as well. If the - // before parameter is set to true, then it will return the elements - // before the given index - // tags: - // private - var - nodes = [], - lastValue = lastNode ? lastNode.date : this._refDate, - n, - i = start, - max = this._maxIncrement + Math.abs(i), - chk = before ? -1 : 1, - dec = before ? 1 : 0, - inc = 1 - dec; - do{ - i -= dec; - n = this._createOption(i); - if(n){ - if((before && n.date > lastValue) || (!before && n.date < lastValue)){ - break; // don't wrap - } - nodes[before ? "unshift" : "push"](n); - lastValue = n.date; - } - i += inc; - }while(nodes.length < maxNum && (i*chk) < max); - return nodes; - }, - - _showText: function(){ - // summary: - // Displays the relevant choices in the drop down list - // tags: - // private - var fromIso = stamp.fromISOString; - this.timeMenu.innerHTML = ""; - this._clickableIncrementDate=fromIso(this.clickableIncrement); - this._visibleIncrementDate=fromIso(this.visibleIncrement); - this._visibleRangeDate=fromIso(this.visibleRange); - // get the value of the increments and the range in seconds (since 00:00:00) to find out how many divs to create - var - sinceMidnight = function(/*Date*/ date){ - return date.getHours() * 60 * 60 + date.getMinutes() * 60 + date.getSeconds(); - }, - clickableIncrementSeconds = sinceMidnight(this._clickableIncrementDate), - visibleIncrementSeconds = sinceMidnight(this._visibleIncrementDate), - visibleRangeSeconds = sinceMidnight(this._visibleRangeDate), - // round reference date to previous visible increment - time = (this.value || this.currentFocus).getTime(); - - this._refDate = new Date(time - time % (clickableIncrementSeconds*1000)); - this._refDate.setFullYear(1970,0,1); // match parse defaults - - // assume clickable increment is the smallest unit - this._clickableIncrement = 1; - // divide the visible range by the clickable increment to get the number of divs to create - // example: 10:00:00/00:15:00 -> display 40 divs - this._totalIncrements = visibleRangeSeconds / clickableIncrementSeconds; - // divide the visible increments by the clickable increments to get how often to display the time inline - // example: 01:00:00/00:15:00 -> display the time every 4 divs - this._visibleIncrement = visibleIncrementSeconds / clickableIncrementSeconds; - // divide the number of seconds in a day by the clickable increment in seconds to get the - // absolute max number of increments. - this._maxIncrement = (60 * 60 * 24) / clickableIncrementSeconds; - - var - // Find the nodes we should display based on our filter. - // Limit to 10 nodes displayed as a half-hearted attempt to stop drop down from overlapping <input>. - count = Math.min(this._totalIncrements, 10), - after = this._getFilteredNodes(0, (count >> 1) + 1, false), - moreAfter = [], - estBeforeLength = count - after.length, - before = this._getFilteredNodes(0, estBeforeLength, true, after[0]); - if(before.length < estBeforeLength && after.length > 0){ - moreAfter = this._getFilteredNodes(after[after.length-1].idx + 1, estBeforeLength - before.length, false, after[after.length-1]); - } - array.forEach(before.concat(after, moreAfter), function(n){ this.timeMenu.appendChild(n); }, this); - // never show empty due to a bad filter - if(!before.length && !after.length && !moreAfter.length && this.filterString){ - this.filterString = ''; - this._showText(); - } - }, - - constructor: function(/*===== params, srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree - - this.constraints = {}; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls - }, - - _setConstraintsAttr: function(/* Object */ constraints){ - // brings in visibleRange, increments, etc. - lang.mixin(this, constraints); - - // locale needs the lang in the constraints as locale - if(!constraints.locale){ - constraints.locale = this.lang; - } - }, - - postCreate: function(){ - // assign typematic mouse listeners to the arrow buttons - this.connect(this.timeMenu, mouse.wheel, "_mouseWheeled"); - this.own( - typematic.addMouseListener(this.upArrow, this, "_onArrowUp", 33, 250), - typematic.addMouseListener(this.downArrow, this, "_onArrowDown", 33, 250) - ); - - this.inherited(arguments); - }, - - _buttonMouse: function(/*Event*/ e){ - // summary: - // Handler for hover (and unhover) on up/down arrows - // tags: - // private - - // in non-IE browser the "mouseenter" event will become "mouseover", - // but in IE it's still "mouseenter" - domClass.toggle(e.currentTarget, e.currentTarget == this.upArrow ? "dijitUpArrowHover" : "dijitDownArrowHover", - e.type == "mouseenter" || e.type == "mouseover"); - }, - - _createOption: function(/*Number*/ index){ - // summary: - // Creates a clickable time option - // tags: - // private - var date = new Date(this._refDate); - var incrementDate = this._clickableIncrementDate; - date.setTime(date.getTime() - + incrementDate.getHours() * index * 3600000 - + incrementDate.getMinutes() * index * 60000 - + incrementDate.getSeconds() * index * 1000); - if(this.constraints.selector == "time"){ - date.setFullYear(1970,0,1); // make sure each time is for the same date - } - var dateString = locale.format(date, this.constraints); - if(this.filterString && dateString.toLowerCase().indexOf(this.filterString) !== 0){ - // Doesn't match the filter - return null - return null; - } - - var div = this.ownerDocument.createElement("div"); - div.className = this.baseClass+"Item"; - div.date = date; - div.idx = index; - domConstruct.create('div',{ - "class": this.baseClass + "ItemInner", - innerHTML: dateString - }, div); - - if(index%this._visibleIncrement<1 && index%this._visibleIncrement>-1){ - domClass.add(div, this.baseClass+"Marker"); - }else if(!(index%this._clickableIncrement)){ - domClass.add(div, this.baseClass+"Tick"); - } - - if(this.isDisabledDate(date)){ - // set disabled - domClass.add(div, this.baseClass+"ItemDisabled"); - } - if(this.value && !ddate.compare(this.value, date, this.constraints.selector)){ - div.selected = true; - domClass.add(div, this.baseClass+"ItemSelected"); - if(domClass.contains(div, this.baseClass+"Marker")){ - domClass.add(div, this.baseClass+"MarkerSelected"); - }else{ - domClass.add(div, this.baseClass+"TickSelected"); - } - - // Initially highlight the current value. User can change highlight by up/down arrow keys - // or mouse movement. - this._highlightOption(div, true); - } - return div; - }, - - _onOptionSelected: function(/*Object*/ tgt){ - // summary: - // Called when user clicks an option in the drop down list - // tags: - // private - var tdate = tgt.target.date || tgt.target.parentNode.date; - if(!tdate || this.isDisabledDate(tdate)){ return; } - this._highlighted_option = null; - this.set('value', tdate); - this.onChange(tdate); - }, - - onChange: function(/*Date*/ /*===== time =====*/){ - // summary: - // Notification that a time was selected. It may be the same as the previous value. - // tags: - // public - }, - - _highlightOption: function(/*node*/ node, /*Boolean*/ highlight){ - // summary: - // Turns on/off highlight effect on a node based on mouse out/over event - // tags: - // private - if(!node){return;} - if(highlight){ - if(this._highlighted_option){ - this._highlightOption(this._highlighted_option, false); - } - this._highlighted_option = node; - }else if(this._highlighted_option !== node){ - return; - }else{ - this._highlighted_option = null; - } - domClass.toggle(node, this.baseClass+"ItemHover", highlight); - if(domClass.contains(node, this.baseClass+"Marker")){ - domClass.toggle(node, this.baseClass+"MarkerHover", highlight); - }else{ - domClass.toggle(node, this.baseClass+"TickHover", highlight); - } - }, - - onmouseover: function(/*Event*/ e){ - // summary: - // Handler for onmouseover event - // tags: - // private - this._keyboardSelected = null; - var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode; - // if we aren't targeting an item, then we return - if(!domClass.contains(tgr, this.baseClass+"Item")){return;} - this._highlightOption(tgr, true); - }, - - onmouseout: function(/*Event*/ e){ - // summary: - // Handler for onmouseout event - // tags: - // private - this._keyboardSelected = null; - var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode; - this._highlightOption(tgr, false); - }, - - _mouseWheeled: function(/*Event*/ e){ - // summary: - // Handle the mouse wheel events - // tags: - // private - this._keyboardSelected = null; - event.stop(e); - // we're not _measuring_ the scroll amount, just direction - this[(e.wheelDelta>0 ? "_onArrowUp" : "_onArrowDown")](); // yes, we're making a new dom node every time you mousewheel, or click - }, - - _onArrowUp: function(count){ - // summary: - // Handler for up arrow key. - // description: - // Removes the bottom time and add one to the top - // tags: - // private - if(count === -1){ - domClass.remove(this.upArrow, "dijitUpArrowActive"); - return; - }else if(count === 0){ - domClass.add(this.upArrow, "dijitUpArrowActive"); - - } // typematic end - if(!this.timeMenu.childNodes.length){ return; } - var index = this.timeMenu.childNodes[0].idx; - var divs = this._getFilteredNodes(index, 1, true, this.timeMenu.childNodes[0]); - if(divs.length){ - this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1]); - this.timeMenu.insertBefore(divs[0], this.timeMenu.childNodes[0]); - } - }, - - _onArrowDown: function(count){ - // summary: - // Handler for up arrow key. - // description: - // Remove the top time and add one to the bottom - // tags: - // private - if(count === -1){ - domClass.remove(this.downArrow, "dijitDownArrowActive"); - return; - }else if(count === 0){ - domClass.add(this.downArrow, "dijitDownArrowActive"); - } // typematic end - if(!this.timeMenu.childNodes.length){ return; } - var index = this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1].idx + 1; - var divs = this._getFilteredNodes(index, 1, false, this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1]); - if(divs.length){ - this.timeMenu.removeChild(this.timeMenu.childNodes[0]); - this.timeMenu.appendChild(divs[0]); - } - }, - - handleKey: function(/*Event*/ e){ - // summary: - // Called from `dijit/form/_DateTimeTextBox` to pass a keypress event - // from the `dijit/form/TimeTextBox` to be handled in this widget - // tags: - // protected - if(e.keyCode == keys.DOWN_ARROW || e.keyCode == keys.UP_ARROW){ - event.stop(e); - // Figure out which option to highlight now and then highlight it - if(this._highlighted_option && !this._highlighted_option.parentNode){ - this._highlighted_option = null; - } - var timeMenu = this.timeMenu, - tgt = this._highlighted_option || query("." + this.baseClass + "ItemSelected", timeMenu)[0]; - if(!tgt){ - tgt = timeMenu.childNodes[0]; - }else if(timeMenu.childNodes.length){ - if(e.keyCode == keys.DOWN_ARROW && !tgt.nextSibling){ - this._onArrowDown(); - }else if(e.keyCode == keys.UP_ARROW && !tgt.previousSibling){ - this._onArrowUp(); - } - if(e.keyCode == keys.DOWN_ARROW){ - tgt = tgt.nextSibling; - }else{ - tgt = tgt.previousSibling; - } - } - this._highlightOption(tgt, true); - this._keyboardSelected = tgt; - return false; - }else if(e.keyCode == keys.ENTER || e.keyCode === keys.TAB){ - // mouse hover followed by TAB is NO selection - if(!this._keyboardSelected && e.keyCode === keys.TAB){ - return true; // true means don't call stopEvent() - } - - // Accept the currently-highlighted option as the value - if(this._highlighted_option){ - this._onOptionSelected({target: this._highlighted_option}); - } - - // Call stopEvent() for ENTER key so that form doesn't submit, - // but not for TAB, so that TAB does switch focus - return e.keyCode === keys.TAB; - } - return undefined; - } - }); - - /*===== - TimePicker.__Constraints = declare(locale.__FormatOptions, { - // clickableIncrement: String - // See `dijit/_TimePicker.clickableIncrement` - clickableIncrement: "T00:15:00", - - // visibleIncrement: String - // See `dijit/_TimePicker.visibleIncrement` - visibleIncrement: "T01:00:00", - - // visibleRange: String - // See `dijit/_TimePicker.visibleRange` - visibleRange: "T05:00:00" - }); - =====*/ - - return TimePicker; -}); diff --git a/lib/dijit/_Widget.js.uncompressed.js b/lib/dijit/_Widget.js.uncompressed.js deleted file mode 100644 index 8a87b9f95..000000000 --- a/lib/dijit/_Widget.js.uncompressed.js +++ /dev/null @@ -1,363 +0,0 @@ -define("dijit/_Widget", [ - "dojo/aspect", // aspect.around - "dojo/_base/config", // config.isDebug - "dojo/_base/connect", // connect.connect - "dojo/_base/declare", // declare - "dojo/has", - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.hitch - "dojo/query", - "dojo/ready", - "./registry", // registry.byNode - "./_WidgetBase", - "./_OnDijitClickMixin", - "./_FocusMixin", - "dojo/uacss", // browser sniffing (included for back-compat; subclasses may be using) - "./hccss" // high contrast mode sniffing (included to set CSS classes on <body>, module ret value unused) -], function(aspect, config, connect, declare, has, kernel, lang, query, ready, - registry, _WidgetBase, _OnDijitClickMixin, _FocusMixin){ - - -// module: -// dijit/_Widget - - -function connectToDomNode(){ - // summary: - // If user connects to a widget method === this function, then they will - // instead actually be connecting the equivalent event on this.domNode -} - -// Trap dojo.connect() calls to connectToDomNode methods, and redirect to _Widget.on() -function aroundAdvice(originalConnect){ - return function(obj, event, scope, method){ - if(obj && typeof event == "string" && obj[event] == connectToDomNode){ - return obj.on(event.substring(2).toLowerCase(), lang.hitch(scope, method)); - } - return originalConnect.apply(connect, arguments); - }; -} -aspect.around(connect, "connect", aroundAdvice); -if(kernel.connect){ - aspect.around(kernel, "connect", aroundAdvice); -} - -var _Widget = declare("dijit._Widget", [_WidgetBase, _OnDijitClickMixin, _FocusMixin], { - // summary: - // Old base class for widgets. New widgets should extend `dijit/_WidgetBase` instead - // description: - // Old Base class for Dijit widgets. - // - // Extends _WidgetBase, adding support for: - // - // - declaratively/programatically specifying widget initialization parameters like - // onMouseMove="foo" that call foo when this.domNode gets a mousemove event - // - ondijitclick: - // Support new data-dojo-attach-event="ondijitclick: ..." that is triggered by a mouse click or a SPACE/ENTER keypress - // - focus related functions: - // In particular, the onFocus()/onBlur() callbacks. Driven internally by - // dijit/_base/focus.js. - // - deprecated methods - // - onShow(), onHide(), onClose() - // - // Also, by loading code in dijit/_base, turns on: - // - // - browser sniffing (putting browser class like `dj_ie` on `<html>` node) - // - high contrast mode sniffing (add `dijit_a11y` class to `<body>` if machine is in high contrast mode) - - - ////////////////// DEFERRED CONNECTS /////////////////// - - onClick: connectToDomNode, - /*===== - onClick: function(event){ - // summary: - // Connect to this function to receive notifications of mouse click events. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onDblClick: connectToDomNode, - /*===== - onDblClick: function(event){ - // summary: - // Connect to this function to receive notifications of mouse double click events. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onKeyDown: connectToDomNode, - /*===== - onKeyDown: function(event){ - // summary: - // Connect to this function to receive notifications of keys being pressed down. - // event: - // key Event - // tags: - // callback - }, - =====*/ - onKeyPress: connectToDomNode, - /*===== - onKeyPress: function(event){ - // summary: - // Connect to this function to receive notifications of printable keys being typed. - // event: - // key Event - // tags: - // callback - }, - =====*/ - onKeyUp: connectToDomNode, - /*===== - onKeyUp: function(event){ - // summary: - // Connect to this function to receive notifications of keys being released. - // event: - // key Event - // tags: - // callback - }, - =====*/ - onMouseDown: connectToDomNode, - /*===== - onMouseDown: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse button is pressed down. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onMouseMove: connectToDomNode, - /*===== - onMouseMove: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onMouseOut: connectToDomNode, - /*===== - onMouseOut: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onMouseOver: connectToDomNode, - /*===== - onMouseOver: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onMouseLeave: connectToDomNode, - /*===== - onMouseLeave: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse moves off of this widget. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onMouseEnter: connectToDomNode, - /*===== - onMouseEnter: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse moves onto this widget. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onMouseUp: connectToDomNode, - /*===== - onMouseUp: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse button is released. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - - constructor: function(params /*===== ,srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified: - // - // - use srcNodeRef.innerHTML as my contents - // - if this is a behavioral widget then apply behavior to that srcNodeRef - // - otherwise, replace srcNodeRef with my generated DOM tree - - // extract parameters like onMouseMove that should connect directly to this.domNode - this._toConnect = {}; - for(var name in params){ - if(this[name] === connectToDomNode){ - this._toConnect[name.replace(/^on/, "").toLowerCase()] = params[name]; - delete params[name]; - } - } - }, - - postCreate: function(){ - this.inherited(arguments); - - // perform connection from this.domNode to user specified handlers (ex: onMouseMove) - for(var name in this._toConnect){ - this.on(name, this._toConnect[name]); - } - delete this._toConnect; - }, - - on: function(/*String|Function*/ type, /*Function*/ func){ - if(this[this._onMap(type)] === connectToDomNode){ - // Use connect.connect() rather than on() to get handling for "onmouseenter" on non-IE, - // normalization of onkeypress/onkeydown to behave like firefox, etc. - // Also, need to specify context as "this" rather than the default context of the DOMNode - // Remove in 2.0. - return connect.connect(this.domNode, type.toLowerCase(), this, func); - } - return this.inherited(arguments); - }, - - _setFocusedAttr: function(val){ - // Remove this method in 2.0 (or sooner), just here to set _focused == focused, for back compat - // (but since it's a private variable we aren't required to keep supporting it). - this._focused = val; - this._set("focused", val); - }, - - ////////////////// DEPRECATED METHODS /////////////////// - - setAttribute: function(/*String*/ attr, /*anything*/ value){ - // summary: - // Deprecated. Use set() instead. - // tags: - // deprecated - kernel.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.", "", "2.0"); - this.set(attr, value); - }, - - attr: function(/*String|Object*/name, /*Object?*/value){ - // summary: - // Set or get properties on a widget instance. - // name: - // The property to get or set. If an object is passed here and not - // a string, its keys are used as names of attributes to be set - // and the value of the object as values to set in the widget. - // value: - // Optional. If provided, attr() operates as a setter. If omitted, - // the current value of the named property is returned. - // description: - // This method is deprecated, use get() or set() directly. - - // Print deprecation warning but only once per calling function - if(config.isDebug){ - var alreadyCalledHash = arguments.callee._ach || (arguments.callee._ach = {}), - caller = (arguments.callee.caller || "unknown caller").toString(); - if(!alreadyCalledHash[caller]){ - kernel.deprecated(this.declaredClass + "::attr() is deprecated. Use get() or set() instead, called from " + - caller, "", "2.0"); - alreadyCalledHash[caller] = true; - } - } - - var args = arguments.length; - if(args >= 2 || typeof name === "object"){ // setter - return this.set.apply(this, arguments); - }else{ // getter - return this.get(name); - } - }, - - getDescendants: function(){ - // summary: - // Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode. - // This method should generally be avoided as it returns widgets declared in templates, which are - // supposed to be internal/hidden, but it's left here for back-compat reasons. - - kernel.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.", "", "2.0"); - return this.containerNode ? query('[widgetId]', this.containerNode).map(registry.byNode) : []; // dijit/_WidgetBase[] - }, - - ////////////////// MISCELLANEOUS METHODS /////////////////// - - _onShow: function(){ - // summary: - // Internal method called when this widget is made visible. - // See `onShow` for details. - this.onShow(); - }, - - onShow: function(){ - // summary: - // Called when this widget becomes the selected pane in a - // `dijit/layout/TabContainer`, `dijit/layout/StackContainer`, - // `dijit/layout/AccordionContainer`, etc. - // - // Also called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`. - // tags: - // callback - }, - - onHide: function(){ - // summary: - // Called when another widget becomes the selected pane in a - // `dijit/layout/TabContainer`, `dijit/layout/StackContainer`, - // `dijit/layout/AccordionContainer`, etc. - // - // Also called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`. - // tags: - // callback - }, - - onClose: function(){ - // summary: - // Called when this widget is being displayed as a popup (ex: a Calendar popped - // up from a DateTextBox), and it is hidden. - // This is called from the dijit.popup code, and should not be called directly. - // - // Also used as a parameter for children of `dijit/layout/StackContainer` or subclasses. - // Callback if a user tries to close the child. Child will be closed if this function returns true. - // tags: - // extension - - return true; // Boolean - } -}); - -// For back-compat, remove in 2.0. -if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/_base"]; - require(requires); // use indirection so modules not rolled into a build - }); -} -return _Widget; -}); diff --git a/lib/dijit/_WidgetBase.js.uncompressed.js b/lib/dijit/_WidgetBase.js.uncompressed.js deleted file mode 100644 index fc39d26b7..000000000 --- a/lib/dijit/_WidgetBase.js.uncompressed.js +++ /dev/null @@ -1,1137 +0,0 @@ -define("dijit/_WidgetBase", [ - "require", // require.toUrl - "dojo/_base/array", // array.forEach array.map - "dojo/aspect", - "dojo/_base/config", // config.blankGif - "dojo/_base/connect", // connect.connect - "dojo/_base/declare", // declare - "dojo/dom", // dom.byId - "dojo/dom-attr", // domAttr.set domAttr.remove - "dojo/dom-class", // domClass.add domClass.replace - "dojo/dom-construct", // domConstruct.destroy domConstruct.place - "dojo/dom-geometry", // isBodyLtr - "dojo/dom-style", // domStyle.set, domStyle.get - "dojo/has", - "dojo/_base/kernel", - "dojo/_base/lang", // mixin(), isArray(), etc. - "dojo/on", - "dojo/ready", - "dojo/Stateful", // Stateful - "dojo/topic", - "dojo/_base/window", // win.doc, win.body() - "./Destroyable", - "./registry" // registry.getUniqueId(), registry.findWidgets() -], function(require, array, aspect, config, connect, declare, - dom, domAttr, domClass, domConstruct, domGeometry, domStyle, has, kernel, - lang, on, ready, Stateful, topic, win, Destroyable, registry){ - -// module: -// dijit/_WidgetBase - -// Flag to make dijit load modules the app didn't explicitly request, for backwards compatibility -has.add("dijit-legacy-requires", !kernel.isAsync); - -// For back-compat, remove in 2.0. -if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/_base/manager"]; - require(requires); // use indirection so modules not rolled into a build - }); -} - -// Nested hash listing attributes for each tag, all strings in lowercase. -// ex: {"div": {"style": true, "tabindex" true}, "form": { ... -var tagAttrs = {}; -function getAttrs(obj){ - var ret = {}; - for(var attr in obj){ - ret[attr.toLowerCase()] = true; - } - return ret; -} - -function nonEmptyAttrToDom(attr){ - // summary: - // Returns a setter function that copies the attribute to this.domNode, - // or removes the attribute from this.domNode, depending on whether the - // value is defined or not. - return function(val){ - domAttr[val ? "set" : "remove"](this.domNode, attr, val); - this._set(attr, val); - }; -} - -return declare("dijit._WidgetBase", [Stateful, Destroyable], { - // summary: - // Future base class for all Dijit widgets. - // description: - // Future base class for all Dijit widgets. - // _Widget extends this class adding support for various features needed by desktop. - // - // Provides stubs for widget lifecycle methods for subclasses to extend, like postMixInProperties(), buildRendering(), - // postCreate(), startup(), and destroy(), and also public API methods like set(), get(), and watch(). - // - // Widgets can provide custom setters/getters for widget attributes, which are called automatically by set(name, value). - // For an attribute XXX, define methods _setXXXAttr() and/or _getXXXAttr(). - // - // _setXXXAttr can also be a string/hash/array mapping from a widget attribute XXX to the widget's DOMNodes: - // - // - DOM node attribute - // | _setFocusAttr: {node: "focusNode", type: "attribute"} - // | _setFocusAttr: "focusNode" (shorthand) - // | _setFocusAttr: "" (shorthand, maps to this.domNode) - // Maps this.focus to this.focusNode.focus, or (last example) this.domNode.focus - // - // - DOM node innerHTML - // | _setTitleAttr: { node: "titleNode", type: "innerHTML" } - // Maps this.title to this.titleNode.innerHTML - // - // - DOM node innerText - // | _setTitleAttr: { node: "titleNode", type: "innerText" } - // Maps this.title to this.titleNode.innerText - // - // - DOM node CSS class - // | _setMyClassAttr: { node: "domNode", type: "class" } - // Maps this.myClass to this.domNode.className - // - // If the value of _setXXXAttr is an array, then each element in the array matches one of the - // formats of the above list. - // - // If the custom setter is null, no action is performed other than saving the new value - // in the widget (in this). - // - // If no custom setter is defined for an attribute, then it will be copied - // to this.focusNode (if the widget defines a focusNode), or this.domNode otherwise. - // That's only done though for attributes that match DOMNode attributes (title, - // alt, aria-labelledby, etc.) - - // id: [const] String - // A unique, opaque ID string that can be assigned by users or by the - // system. If the developer passes an ID which is known not to be - // unique, the specified ID is ignored and the system-generated ID is - // used instead. - id: "", - _setIdAttr: "domNode", // to copy to this.domNode even for auto-generated id's - - // lang: [const] String - // Rarely used. Overrides the default Dojo locale used to render this widget, - // as defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute. - // Value must be among the list of locales specified during by the Dojo bootstrap, - // formatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us). - lang: "", - // set on domNode even when there's a focus node. but don't set lang="", since that's invalid. - _setLangAttr: nonEmptyAttrToDom("lang"), - - // dir: [const] String - // Bi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir) - // attribute. Either left-to-right "ltr" or right-to-left "rtl". If undefined, widgets renders in page's - // default direction. - dir: "", - // set on domNode even when there's a focus node. but don't set dir="", since that's invalid. - _setDirAttr: nonEmptyAttrToDom("dir"), // to set on domNode even when there's a focus node - - // textDir: String - // Bi-directional support, the main variable which is responsible for the direction of the text. - // The text direction can be different than the GUI direction by using this parameter in creation - // of a widget. - // - // Allowed values: - // - // 1. "ltr" - // 2. "rtl" - // 3. "auto" - contextual the direction of a text defined by first strong letter. - // - // By default is as the page direction. - textDir: "", - - // class: String - // HTML class attribute - "class": "", - _setClassAttr: { node: "domNode", type: "class" }, - - // style: String||Object - // HTML style attributes as cssText string or name/value hash - style: "", - - // title: String - // HTML title attribute. - // - // For form widgets this specifies a tooltip to display when hovering over - // the widget (just like the native HTML title attribute). - // - // For TitlePane or for when this widget is a child of a TabContainer, AccordionContainer, - // etc., it's used to specify the tab label, accordion pane title, etc. - title: "", - - // tooltip: String - // When this widget's title attribute is used to for a tab label, accordion pane title, etc., - // this specifies the tooltip to appear when the mouse is hovered over that text. - tooltip: "", - - // baseClass: [protected] String - // Root CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate - // widget state. - baseClass: "", - - // srcNodeRef: [readonly] DomNode - // pointer to original DOM node - srcNodeRef: null, - - // domNode: [readonly] DomNode - // This is our visible representation of the widget! Other DOM - // Nodes may by assigned to other properties, usually through the - // template system's data-dojo-attach-point syntax, but the domNode - // property is the canonical "top level" node in widget UI. - domNode: null, - - // containerNode: [readonly] DomNode - // Designates where children of the source DOM node will be placed. - // "Children" in this case refers to both DOM nodes and widgets. - // For example, for myWidget: - // - // | <div data-dojo-type=myWidget> - // | <b> here's a plain DOM node - // | <span data-dojo-type=subWidget>and a widget</span> - // | <i> and another plain DOM node </i> - // | </div> - // - // containerNode would point to: - // - // | <b> here's a plain DOM node - // | <span data-dojo-type=subWidget>and a widget</span> - // | <i> and another plain DOM node </i> - // - // In templated widgets, "containerNode" is set via a - // data-dojo-attach-point assignment. - // - // containerNode must be defined for any widget that accepts innerHTML - // (like ContentPane or BorderContainer or even Button), and conversely - // is null for widgets that don't, like TextBox. - containerNode: null, - - // ownerDocument: [const] Document? - // The document this widget belongs to. If not specified to constructor, will default to - // srcNodeRef.ownerDocument, or if no sourceRef specified, then to dojo/_base/window::doc - ownerDocument: null, - _setOwnerDocumentAttr: function(val){ - // this setter is merely to avoid automatically trying to set this.domNode.ownerDocument - this._set("ownerDocument", val); - }, - -/*===== - // _started: [readonly] Boolean - // startup() has completed. - _started: false, -=====*/ - - // attributeMap: [protected] Object - // Deprecated. Instead of attributeMap, widget should have a _setXXXAttr attribute - // for each XXX attribute to be mapped to the DOM. - // - // attributeMap sets up a "binding" between attributes (aka properties) - // of the widget and the widget's DOM. - // Changes to widget attributes listed in attributeMap will be - // reflected into the DOM. - // - // For example, calling set('title', 'hello') - // on a TitlePane will automatically cause the TitlePane's DOM to update - // with the new title. - // - // attributeMap is a hash where the key is an attribute of the widget, - // and the value reflects a binding to a: - // - // - DOM node attribute - // | focus: {node: "focusNode", type: "attribute"} - // Maps this.focus to this.focusNode.focus - // - // - DOM node innerHTML - // | title: { node: "titleNode", type: "innerHTML" } - // Maps this.title to this.titleNode.innerHTML - // - // - DOM node innerText - // | title: { node: "titleNode", type: "innerText" } - // Maps this.title to this.titleNode.innerText - // - // - DOM node CSS class - // | myClass: { node: "domNode", type: "class" } - // Maps this.myClass to this.domNode.className - // - // If the value is an array, then each element in the array matches one of the - // formats of the above list. - // - // There are also some shorthands for backwards compatibility: - // - // - string --> { node: string, type: "attribute" }, for example: - // - // | "focusNode" ---> { node: "focusNode", type: "attribute" } - // - // - "" --> { node: "domNode", type: "attribute" } - attributeMap: {}, - - // _blankGif: [protected] String - // Path to a blank 1x1 image. - // Used by `<img>` nodes in templates that really get their image via CSS background-image. - _blankGif: config.blankGif || require.toUrl("dojo/resources/blank.gif"), - - //////////// INITIALIZATION METHODS /////////////////////////////////////// - - /*===== - constructor: function(params, srcNodeRef){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified: - // - // - use srcNodeRef.innerHTML as my contents - // - if this is a behavioral widget then apply behavior to that srcNodeRef - // - otherwise, replace srcNodeRef with my generated DOM tree - }, - =====*/ - - postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){ - // summary: - // Kicks off widget instantiation. See create() for details. - // tags: - // private - this.create(params, srcNodeRef); - }, - - create: function(params, srcNodeRef){ - // summary: - // Kick off the life-cycle of a widget - // description: - // Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate, - // etc.), some of which of you'll want to override. See http://dojotoolkit.org/reference-guide/dijit/_WidgetBase.html - // for a discussion of the widget creation lifecycle. - // - // Of course, adventurous developers could override create entirely, but this should - // only be done as a last resort. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified: - // - // - use srcNodeRef.innerHTML as my contents - // - if this is a behavioral widget then apply behavior to that srcNodeRef - // - otherwise, replace srcNodeRef with my generated DOM tree - // tags: - // private - - // store pointer to original DOM tree - this.srcNodeRef = dom.byId(srcNodeRef); - - // No longer used, remove for 2.0. - this._connects = []; - this._supportingWidgets = []; - - // this is here for back-compat, remove in 2.0 (but check NodeList-instantiate.html test) - if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; } - - // mix in our passed parameters - if(params){ - this.params = params; - lang.mixin(this, params); - } - this.postMixInProperties(); - - // Generate an id for the widget if one wasn't specified, or it was specified as id: undefined. - // Do this before buildRendering() because it might expect the id to be there. - if(!this.id){ - this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_")); - if(this.params){ - // if params contains {id: undefined}, prevent _applyAttributes() from processing it - delete this.params.id; - } - } - - // The document and <body> node this widget is associated with - this.ownerDocument = this.ownerDocument || (this.srcNodeRef ? this.srcNodeRef.ownerDocument : win.doc); - this.ownerDocumentBody = win.body(this.ownerDocument); - - registry.add(this); - - this.buildRendering(); - - var deleteSrcNodeRef; - - if(this.domNode){ - // Copy attributes listed in attributeMap into the [newly created] DOM for the widget. - // Also calls custom setters for all attributes with custom setters. - this._applyAttributes(); - - // If srcNodeRef was specified, then swap out original srcNode for this widget's DOM tree. - // For 2.0, move this after postCreate(). postCreate() shouldn't depend on the - // widget being attached to the DOM since it isn't when a widget is created programmatically like - // new MyWidget({}). See #11635. - var source = this.srcNodeRef; - if(source && source.parentNode && this.domNode !== source){ - source.parentNode.replaceChild(this.domNode, source); - deleteSrcNodeRef = true; - } - - // Note: for 2.0 may want to rename widgetId to dojo._scopeName + "_widgetId", - // assuming that dojo._scopeName even exists in 2.0 - this.domNode.setAttribute("widgetId", this.id); - } - this.postCreate(); - - // If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC. - // I think for back-compatibility it isn't deleting srcNodeRef until after postCreate() has run. - if(deleteSrcNodeRef){ - delete this.srcNodeRef; - } - - this._created = true; - }, - - _applyAttributes: function(){ - // summary: - // Step during widget creation to copy widget attributes to the - // DOM according to attributeMap and _setXXXAttr objects, and also to call - // custom _setXXXAttr() methods. - // - // Skips over blank/false attribute values, unless they were explicitly specified - // as parameters to the widget, since those are the default anyway, - // and setting tabIndex="" is different than not setting tabIndex at all. - // - // For backwards-compatibility reasons attributeMap overrides _setXXXAttr when - // _setXXXAttr is a hash/string/array, but _setXXXAttr as a functions override attributeMap. - // tags: - // private - - // Get list of attributes where this.set(name, value) will do something beyond - // setting this[name] = value. Specifically, attributes that have: - // - associated _setXXXAttr() method/hash/string/array - // - entries in attributeMap (remove this for 2.0); - var ctor = this.constructor, - list = ctor._setterAttrs; - if(!list){ - list = (ctor._setterAttrs = []); - for(var attr in this.attributeMap){ - list.push(attr); - } - - var proto = ctor.prototype; - for(var fxName in proto){ - if(fxName in this.attributeMap){ continue; } - var setterName = "_set" + fxName.replace(/^[a-z]|-[a-zA-Z]/g, function(c){ return c.charAt(c.length-1).toUpperCase(); }) + "Attr"; - if(setterName in proto){ - list.push(fxName); - } - } - } - - // Call this.set() for each property that was either specified as parameter to constructor, - // or is in the list found above. For correlated properties like value and displayedValue, the one - // specified as a parameter should take precedence. - // Particularly important for new DateTextBox({displayedValue: ...}) since DateTextBox's default value is - // NaN and thus is not ignored like a default value of "". - - // Step 1: Save the current values of the widget properties that were specified as parameters to the constructor. - // Generally this.foo == this.params.foo, except if postMixInProperties() changed the value of this.foo. - var params = {}; - for(var key in this.params || {}){ - params[key] = this[key]; - } - - // Step 2: Call set() for each property that wasn't passed as a parameter to the constructor - array.forEach(list, function(attr){ - if(attr in params){ - // skip this one, do it below - }else if(this[attr]){ - this.set(attr, this[attr]); - } - }, this); - - // Step 3: Call set() for each property that was specified as parameter to constructor. - // Use params hash created above to ignore side effects from step #2 above. - for(key in params){ - this.set(key, params[key]); - } - }, - - postMixInProperties: function(){ - // summary: - // Called after the parameters to the widget have been read-in, - // but before the widget template is instantiated. Especially - // useful to set properties that are referenced in the widget - // template. - // tags: - // protected - }, - - buildRendering: function(){ - // summary: - // Construct the UI for this widget, setting this.domNode. - // Most widgets will mixin `dijit._TemplatedMixin`, which implements this method. - // tags: - // protected - - if(!this.domNode){ - // Create root node if it wasn't created by _Templated - this.domNode = this.srcNodeRef || this.ownerDocument.createElement("div"); - } - - // baseClass is a single class name or occasionally a space-separated list of names. - // Add those classes to the DOMNode. If RTL mode then also add with Rtl suffix. - // TODO: make baseClass custom setter - if(this.baseClass){ - var classes = this.baseClass.split(" "); - if(!this.isLeftToRight()){ - classes = classes.concat( array.map(classes, function(name){ return name+"Rtl"; })); - } - domClass.add(this.domNode, classes); - } - }, - - postCreate: function(){ - // summary: - // Processing after the DOM fragment is created - // description: - // Called after the DOM fragment has been created, but not necessarily - // added to the document. Do not include any operations which rely on - // node dimensions or placement. - // tags: - // protected - }, - - startup: function(){ - // summary: - // Processing after the DOM fragment is added to the document - // description: - // Called after a widget and its children have been created and added to the page, - // and all related widgets have finished their create() cycle, up through postCreate(). - // This is useful for composite widgets that need to control or layout sub-widgets. - // Many layout widgets can use this as a wiring phase. - if(this._started){ return; } - this._started = true; - array.forEach(this.getChildren(), function(obj){ - if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){ - obj.startup(); - obj._started = true; - } - }); - }, - - //////////// DESTROY FUNCTIONS //////////////////////////////// - - destroyRecursive: function(/*Boolean?*/ preserveDom){ - // summary: - // Destroy this widget and its descendants - // description: - // This is the generic "destructor" function that all widget users - // should call to cleanly discard with a widget. Once a widget is - // destroyed, it is removed from the manager object. - // preserveDom: - // If true, this method will leave the original DOM structure - // alone of descendant Widgets. Note: This will NOT work with - // dijit._Templated widgets. - - this._beingDestroyed = true; - this.destroyDescendants(preserveDom); - this.destroy(preserveDom); - }, - - destroy: function(/*Boolean*/ preserveDom){ - // summary: - // Destroy this widget, but not its descendants. - // This method will, however, destroy internal widgets such as those used within a template. - // preserveDom: Boolean - // If true, this method will leave the original DOM structure alone. - // Note: This will not yet work with _Templated widgets - - this._beingDestroyed = true; - this.uninitialize(); - - function destroy(w){ - if(w.destroyRecursive){ - w.destroyRecursive(preserveDom); - }else if(w.destroy){ - w.destroy(preserveDom); - } - } - - // Back-compat, remove for 2.0 - array.forEach(this._connects, lang.hitch(this, "disconnect")); - array.forEach(this._supportingWidgets, destroy); - - // Destroy supporting widgets, but not child widgets under this.containerNode (for 2.0, destroy child widgets - // here too). if() statement is to guard against exception if destroy() called multiple times (see #15815). - if(this.domNode){ - array.forEach(registry.findWidgets(this.domNode, this.containerNode), destroy); - } - - this.destroyRendering(preserveDom); - registry.remove(this.id); - this._destroyed = true; - }, - - destroyRendering: function(/*Boolean?*/ preserveDom){ - // summary: - // Destroys the DOM nodes associated with this widget - // preserveDom: - // If true, this method will leave the original DOM structure alone - // during tear-down. Note: this will not work with _Templated - // widgets yet. - // tags: - // protected - - if(this.bgIframe){ - this.bgIframe.destroy(preserveDom); - delete this.bgIframe; - } - - if(this.domNode){ - if(preserveDom){ - domAttr.remove(this.domNode, "widgetId"); - }else{ - domConstruct.destroy(this.domNode); - } - delete this.domNode; - } - - if(this.srcNodeRef){ - if(!preserveDom){ - domConstruct.destroy(this.srcNodeRef); - } - delete this.srcNodeRef; - } - }, - - destroyDescendants: function(/*Boolean?*/ preserveDom){ - // summary: - // Recursively destroy the children of this widget and their - // descendants. - // preserveDom: - // If true, the preserveDom attribute is passed to all descendant - // widget's .destroy() method. Not for use with _Templated - // widgets. - - // get all direct descendants and destroy them recursively - array.forEach(this.getChildren(), function(widget){ - if(widget.destroyRecursive){ - widget.destroyRecursive(preserveDom); - } - }); - }, - - uninitialize: function(){ - // summary: - // Deprecated. Override destroy() instead to implement custom widget tear-down - // behavior. - // tags: - // protected - return false; - }, - - ////////////////// GET/SET, CUSTOM SETTERS, ETC. /////////////////// - - _setStyleAttr: function(/*String||Object*/ value){ - // summary: - // Sets the style attribute of the widget according to value, - // which is either a hash like {height: "5px", width: "3px"} - // or a plain string - // description: - // Determines which node to set the style on based on style setting - // in attributeMap. - // tags: - // protected - - var mapNode = this.domNode; - - // Note: technically we should revert any style setting made in a previous call - // to his method, but that's difficult to keep track of. - - if(lang.isObject(value)){ - domStyle.set(mapNode, value); - }else{ - if(mapNode.style.cssText){ - mapNode.style.cssText += "; " + value; - }else{ - mapNode.style.cssText = value; - } - } - - this._set("style", value); - }, - - _attrToDom: function(/*String*/ attr, /*String*/ value, /*Object?*/ commands){ - // summary: - // Reflect a widget attribute (title, tabIndex, duration etc.) to - // the widget DOM, as specified by commands parameter. - // If commands isn't specified then it's looked up from attributeMap. - // Note some attributes like "type" - // cannot be processed this way as they are not mutable. - // attr: - // Name of member variable (ex: "focusNode" maps to this.focusNode) pointing - // to DOMNode inside the widget, or alternately pointing to a subwidget - // tags: - // private - - commands = arguments.length >= 3 ? commands : this.attributeMap[attr]; - - array.forEach(lang.isArray(commands) ? commands : [commands], function(command){ - - // Get target node and what we are doing to that node - var mapNode = this[command.node || command || "domNode"]; // DOM node - var type = command.type || "attribute"; // class, innerHTML, innerText, or attribute - - switch(type){ - case "attribute": - if(lang.isFunction(value)){ // functions execute in the context of the widget - value = lang.hitch(this, value); - } - - // Get the name of the DOM node attribute; usually it's the same - // as the name of the attribute in the widget (attr), but can be overridden. - // Also maps handler names to lowercase, like onSubmit --> onsubmit - var attrName = command.attribute ? command.attribute : - (/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr); - - if(mapNode.tagName){ - // Normal case, mapping to a DOMNode. Note that modern browsers will have a mapNode.set() - // method, but for consistency we still call domAttr - domAttr.set(mapNode, attrName, value); - }else{ - // mapping to a sub-widget - mapNode.set(attrName, value); - } - break; - case "innerText": - mapNode.innerHTML = ""; - mapNode.appendChild(this.ownerDocument.createTextNode(value)); - break; - case "innerHTML": - mapNode.innerHTML = value; - break; - case "class": - domClass.replace(mapNode, value, this[attr]); - break; - } - }, this); - }, - - get: function(name){ - // summary: - // Get a property from a widget. - // name: - // The property to get. - // description: - // Get a named property from a widget. The property may - // potentially be retrieved via a getter method. If no getter is defined, this - // just retrieves the object's property. - // - // For example, if the widget has properties `foo` and `bar` - // and a method named `_getFooAttr()`, calling: - // `myWidget.get("foo")` would be equivalent to calling - // `widget._getFooAttr()` and `myWidget.get("bar")` - // would be equivalent to the expression - // `widget.bar2` - var names = this._getAttrNames(name); - return this[names.g] ? this[names.g]() : this[name]; - }, - - set: function(name, value){ - // summary: - // Set a property on a widget - // name: - // The property to set. - // value: - // The value to set in the property. - // description: - // Sets named properties on a widget which may potentially be handled by a - // setter in the widget. - // - // For example, if the widget has properties `foo` and `bar` - // and a method named `_setFooAttr()`, calling - // `myWidget.set("foo", "Howdy!")` would be equivalent to calling - // `widget._setFooAttr("Howdy!")` and `myWidget.set("bar", 3)` - // would be equivalent to the statement `widget.bar = 3;` - // - // set() may also be called with a hash of name/value pairs, ex: - // - // | myWidget.set({ - // | foo: "Howdy", - // | bar: 3 - // | }); - // - // This is equivalent to calling `set(foo, "Howdy")` and `set(bar, 3)` - - if(typeof name === "object"){ - for(var x in name){ - this.set(x, name[x]); - } - return this; - } - var names = this._getAttrNames(name), - setter = this[names.s]; - if(lang.isFunction(setter)){ - // use the explicit setter - var result = setter.apply(this, Array.prototype.slice.call(arguments, 1)); - }else{ - // Mapping from widget attribute to DOMNode/subwidget attribute/value/etc. - // Map according to: - // 1. attributeMap setting, if one exists (TODO: attributeMap deprecated, remove in 2.0) - // 2. _setFooAttr: {...} type attribute in the widget (if one exists) - // 3. apply to focusNode or domNode if standard attribute name, excluding funcs like onClick. - // Checks if an attribute is a "standard attribute" by whether the DOMNode JS object has a similar - // attribute name (ex: accept-charset attribute matches jsObject.acceptCharset). - // Note also that Tree.focusNode() is a function not a DOMNode, so test for that. - var defaultNode = this.focusNode && !lang.isFunction(this.focusNode) ? "focusNode" : "domNode", - tag = this[defaultNode].tagName, - attrsForTag = tagAttrs[tag] || (tagAttrs[tag] = getAttrs(this[defaultNode])), - map = name in this.attributeMap ? this.attributeMap[name] : - names.s in this ? this[names.s] : - ((names.l in attrsForTag && typeof value != "function") || - /^aria-|^data-|^role$/.test(name)) ? defaultNode : null; - if(map != null){ - this._attrToDom(name, value, map); - } - this._set(name, value); - } - return result || this; - }, - - _attrPairNames: {}, // shared between all widgets - _getAttrNames: function(name){ - // summary: - // Helper function for get() and set(). - // Caches attribute name values so we don't do the string ops every time. - // tags: - // private - - var apn = this._attrPairNames; - if(apn[name]){ return apn[name]; } - var uc = name.replace(/^[a-z]|-[a-zA-Z]/g, function(c){ return c.charAt(c.length-1).toUpperCase(); }); - return (apn[name] = { - n: name+"Node", - s: "_set"+uc+"Attr", // converts dashes to camel case, ex: accept-charset --> _setAcceptCharsetAttr - g: "_get"+uc+"Attr", - l: uc.toLowerCase() // lowercase name w/out dashes, ex: acceptcharset - }); - }, - - _set: function(/*String*/ name, /*anything*/ value){ - // summary: - // Helper function to set new value for specified attribute, and call handlers - // registered with watch() if the value has changed. - var oldValue = this[name]; - this[name] = value; - if(this._created && value !== oldValue){ - if(this._watchCallbacks){ - this._watchCallbacks(name, oldValue, value); - } - this.emit("attrmodified-" + name, { - detail: { - prevValue: oldValue, - newValue: value - } - }); - } - }, - - emit: function(/*String*/ type, /*Object?*/ eventObj, /*Array?*/ callbackArgs){ - // summary: - // Used by widgets to signal that a synthetic event occurred, ex: - // | myWidget.emit("attrmodified-selectedChildWidget", {}). - // - // Emits an event on this.domNode named type.toLowerCase(), based on eventObj. - // Also calls onType() method, if present, and returns value from that method. - // By default passes eventObj to callback, but will pass callbackArgs instead, if specified. - // Modifies eventObj by adding missing parameters (bubbles, cancelable, widget). - // tags: - // protected - - // Specify fallback values for bubbles, cancelable in case they are not set in eventObj. - // Also set pointer to widget, although since we can't add a pointer to the widget for native events - // (see #14729), maybe we shouldn't do it here? - eventObj = eventObj || {}; - if(eventObj.bubbles === undefined){ eventObj.bubbles = true; } - if(eventObj.cancelable === undefined){ eventObj.cancelable = true; } - if(!eventObj.detail){ eventObj.detail = {}; } - eventObj.detail.widget = this; - - var ret, callback = this["on"+type]; - if(callback){ - ret = callback.apply(this, callbackArgs ? callbackArgs : [eventObj]); - } - - // Emit event, but avoid spurious emit()'s as parent sets properties on child during startup/destroy - if(this._started && !this._beingDestroyed){ - on.emit(this.domNode, type.toLowerCase(), eventObj); - } - - return ret; - }, - - on: function(/*String|Function*/ type, /*Function*/ func){ - // summary: - // Call specified function when event occurs, ex: myWidget.on("click", function(){ ... }). - // type: - // Name of event (ex: "click") or extension event like touch.press. - // description: - // Call specified function when event `type` occurs, ex: `myWidget.on("click", function(){ ... })`. - // Note that the function is not run in any particular scope, so if (for example) you want it to run in the - // widget's scope you must do `myWidget.on("click", lang.hitch(myWidget, func))`. - - // For backwards compatibility, if there's an onType() method in the widget then connect to that. - // Remove in 2.0. - var widgetMethod = this._onMap(type); - if(widgetMethod){ - return aspect.after(this, widgetMethod, func, true); - } - - // Otherwise, just listen for the event on this.domNode. - return this.own(on(this.domNode, type, func))[0]; - }, - - _onMap: function(/*String|Function*/ type){ - // summary: - // Maps on() type parameter (ex: "mousemove") to method name (ex: "onMouseMove"). - // If type is a synthetic event like touch.press then returns undefined. - var ctor = this.constructor, map = ctor._onMap; - if(!map){ - map = (ctor._onMap = {}); - for(var attr in ctor.prototype){ - if(/^on/.test(attr)){ - map[attr.replace(/^on/, "").toLowerCase()] = attr; - } - } - } - return map[typeof type == "string" && type.toLowerCase()]; // String - }, - - toString: function(){ - // summary: - // Returns a string that represents the widget - // description: - // When a widget is cast to a string, this method will be used to generate the - // output. Currently, it does not implement any sort of reversible - // serialization. - return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String - }, - - getChildren: function(){ - // summary: - // Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode. - // Does not return nested widgets, nor widgets that are part of this widget's template. - return this.containerNode ? registry.findWidgets(this.containerNode) : []; // dijit/_WidgetBase[] - }, - - getParent: function(){ - // summary: - // Returns the parent widget of this widget - return registry.getEnclosingWidget(this.domNode.parentNode); - }, - - connect: function( - /*Object|null*/ obj, - /*String|Function*/ event, - /*String|Function*/ method){ - // summary: - // Deprecated, will be removed in 2.0, use this.own(on(...)) or this.own(aspect.after(...)) instead. - // - // Connects specified obj/event to specified method of this object - // and registers for disconnect() on widget destroy. - // - // Provide widget-specific analog to dojo.connect, except with the - // implicit use of this widget as the target object. - // Events connected with `this.connect` are disconnected upon - // destruction. - // returns: - // A handle that can be passed to `disconnect` in order to disconnect before - // the widget is destroyed. - // example: - // | var btn = new Button(); - // | // when foo.bar() is called, call the listener we're going to - // | // provide in the scope of btn - // | btn.connect(foo, "bar", function(){ - // | console.debug(this.toString()); - // | }); - // tags: - // protected - - return this.own(connect.connect(obj, event, this, method))[0]; // handle - }, - - disconnect: function(handle){ - // summary: - // Deprecated, will be removed in 2.0, use handle.remove() instead. - // - // Disconnects handle created by `connect`. - // tags: - // protected - - handle.remove(); - }, - - subscribe: function(t, method){ - // summary: - // Deprecated, will be removed in 2.0, use this.own(topic.subscribe()) instead. - // - // Subscribes to the specified topic and calls the specified method - // of this object and registers for unsubscribe() on widget destroy. - // - // Provide widget-specific analog to dojo.subscribe, except with the - // implicit use of this widget as the target object. - // t: String - // The topic - // method: Function - // The callback - // example: - // | var btn = new Button(); - // | // when /my/topic is published, this button changes its label to - // | // be the parameter of the topic. - // | btn.subscribe("/my/topic", function(v){ - // | this.set("label", v); - // | }); - // tags: - // protected - return this.own(topic.subscribe(t, lang.hitch(this, method)))[0]; // handle - }, - - unsubscribe: function(/*Object*/ handle){ - // summary: - // Deprecated, will be removed in 2.0, use handle.remove() instead. - // - // Unsubscribes handle created by this.subscribe. - // Also removes handle from this widget's list of subscriptions - // tags: - // protected - - handle.remove(); - }, - - isLeftToRight: function(){ - // summary: - // Return this widget's explicit or implicit orientation (true for LTR, false for RTL) - // tags: - // protected - return this.dir ? (this.dir == "ltr") : domGeometry.isBodyLtr(this.ownerDocument); //Boolean - }, - - isFocusable: function(){ - // summary: - // Return true if this widget can currently be focused - // and false if not - return this.focus && (domStyle.get(this.domNode, "display") != "none"); - }, - - placeAt: function(/* String|DomNode|_Widget */ reference, /* String|Int? */ position){ - // summary: - // Place this widget somewhere in the DOM based - // on standard domConstruct.place() conventions. - // description: - // A convenience function provided in all _Widgets, providing a simple - // shorthand mechanism to put an existing (or newly created) Widget - // somewhere in the dom, and allow chaining. - // reference: - // Widget, DOMNode, or id of widget or DOMNode - // position: - // If reference is a widget (or id of widget), and that widget has an ".addChild" method, - // it will be called passing this widget instance into that method, supplying the optional - // position index passed. In this case position (if specified) should be an integer. - // - // If reference is a DOMNode (or id matching a DOMNode but not a widget), - // the position argument can be a numeric index or a string - // "first", "last", "before", or "after", same as dojo/dom-construct::place(). - // returns: dijit/_WidgetBase - // Provides a useful return of the newly created dijit._Widget instance so you - // can "chain" this function by instantiating, placing, then saving the return value - // to a variable. - // example: - // | // create a Button with no srcNodeRef, and place it in the body: - // | var button = new Button({ label:"click" }).placeAt(win.body()); - // | // now, 'button' is still the widget reference to the newly created button - // | button.on("click", function(e){ console.log('click'); })); - // example: - // | // create a button out of a node with id="src" and append it to id="wrapper": - // | var button = new Button({},"src").placeAt("wrapper"); - // example: - // | // place a new button as the first element of some div - // | var button = new Button({ label:"click" }).placeAt("wrapper","first"); - // example: - // | // create a contentpane and add it to a TabContainer - // | var tc = dijit.byId("myTabs"); - // | new ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc) - - var refWidget = !reference.tagName && registry.byId(reference); - if(refWidget && refWidget.addChild && (!position || typeof position === "number")){ - // Adding this to refWidget and can use refWidget.addChild() to handle everything. - refWidget.addChild(this, position); - }else{ - // "reference" is a plain DOMNode, or we can't use refWidget.addChild(). Use domConstruct.place() and - // target refWidget.containerNode for nested placement (position==number, "first", "last", "only"), and - // refWidget.domNode otherwise ("after"/"before"/"replace"). (But not supported officially, see #14946.) - var ref = refWidget ? - (refWidget.containerNode && !/after|before|replace/.test(position||"") ? - refWidget.containerNode : refWidget.domNode) : dom.byId(reference, this.ownerDocument); - domConstruct.place(this.domNode, ref, position); - - // Start this iff it has a parent widget that's already started. - if(!this._started && (this.getParent() || {})._started){ - this.startup(); - } - } - return this; - }, - - getTextDir: function(/*String*/ text,/*String*/ originalDir){ - // summary: - // Return direction of the text. - // The function overridden in the _BidiSupport module, - // its main purpose is to calculate the direction of the - // text, if was defined by the programmer through textDir. - // tags: - // protected. - return originalDir; - }, - - applyTextDir: function(/*===== element, text =====*/){ - // summary: - // The function overridden in the _BidiSupport module, - // originally used for setting element.dir according to this.textDir. - // In this case does nothing. - // element: DOMNode - // text: String - // tags: - // protected. - }, - - defer: function(fcn, delay){ - // summary: - // Wrapper to setTimeout to avoid deferred functions executing - // after the originating widget has been destroyed. - // Returns an object handle with a remove method (that returns null) (replaces clearTimeout). - // fcn: function reference - // delay: Optional number (defaults to 0) - // tags: - // protected. - var timer = setTimeout(lang.hitch(this, - function(){ - timer = null; - if(!this._destroyed){ - lang.hitch(this, fcn)(); - } - }), - delay || 0 - ); - return { - remove: function(){ - if(timer){ - clearTimeout(timer); - timer = null; - } - return null; // so this works well: handle = handle.remove(); - } - }; - } -}); - -}); diff --git a/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js b/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js deleted file mode 100644 index 9108931d5..000000000 --- a/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js +++ /dev/null @@ -1,65 +0,0 @@ -define("dijit/_WidgetsInTemplateMixin", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/parser" // parser.parse -], function(array, declare, parser){ - - // module: - // dijit/_WidgetsInTemplateMixin - - return declare("dijit._WidgetsInTemplateMixin", null, { - // summary: - // Mixin to supplement _TemplatedMixin when template contains widgets - - // _earlyTemplatedStartup: Boolean - // A fallback to preserve the 1.0 - 1.3 behavior of children in - // templates having their startup called before the parent widget - // fires postCreate. Defaults to 'false', causing child widgets to - // have their .startup() called immediately before a parent widget - // .startup(), but always after the parent .postCreate(). Set to - // 'true' to re-enable to previous, arguably broken, behavior. - _earlyTemplatedStartup: false, - - // widgetsInTemplate: [protected] Boolean - // Should we parse the template to find widgets that might be - // declared in markup inside it? (Remove for 2.0 and assume true) - widgetsInTemplate: true, - - _beforeFillContent: function(){ - if(this.widgetsInTemplate){ - // Before copying over content, instantiate widgets in template - var node = this.domNode; - - var cw = (this._startupWidgets = parser.parse(node, { - noStart: !this._earlyTemplatedStartup, - template: true, - inherited: {dir: this.dir, lang: this.lang, textDir: this.textDir}, - propsThis: this, // so data-dojo-props of widgets in the template can reference "this" to refer to me - scope: "dojo" // even in multi-version mode templates use dojoType/data-dojo-type - })); - - if(!cw.isFulfilled()){ - throw new Error(this.declaredClass + ": parser returned unfilled promise (probably waiting for module auto-load), " + - "unsupported by _WidgetsInTemplateMixin. Must pre-load all supporting widgets before instantiation."); - } - - // _WidgetBase::destroy() will destroy any supporting widgets under this.domNode. - // If we wanted to, we could call this.own() on anything in this._startupWidgets that was moved outside - // of this.domNode (like Dialog, which is moved to <body>). - - this._attachTemplateNodes(cw, function(n,p){ - return n[p]; - }); - } - }, - - startup: function(){ - array.forEach(this._startupWidgets, function(w){ - if(w && !w._started && w.startup){ - w.startup(); - } - }); - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/_base.js.uncompressed.js b/lib/dijit/_base.js.uncompressed.js deleted file mode 100644 index 77ead5ffb..000000000 --- a/lib/dijit/_base.js.uncompressed.js +++ /dev/null @@ -1,27 +0,0 @@ -define("dijit/_base", [ - "./main", - "./a11y", // used to be in dijit/_base/manager - "./WidgetSet", // used to be in dijit/_base/manager - "./_base/focus", - "./_base/manager", - "./_base/place", - "./_base/popup", - "./_base/scroll", - "./_base/sniff", - "./_base/typematic", - "./_base/wai", - "./_base/window" -], function(dijit){ - - // module: - // dijit/_base - - /*===== - return { - // summary: - // Includes all the modules in dijit/_base - }; - =====*/ - - return dijit._base; -}); diff --git a/lib/dijit/_base/focus.js.uncompressed.js b/lib/dijit/_base/focus.js.uncompressed.js deleted file mode 100644 index 5d1e94ea6..000000000 --- a/lib/dijit/_base/focus.js.uncompressed.js +++ /dev/null @@ -1,323 +0,0 @@ -define("dijit/_base/focus", [ - "dojo/_base/array", // array.forEach - "dojo/dom", // dom.isDescendant - "dojo/_base/lang", // lang.isArray - "dojo/topic", // publish - "dojo/_base/window", // win.doc win.doc.selection win.global win.global.getSelection win.withGlobal - "../focus", - "../main" // for exporting symbols to dijit -], function(array, dom, lang, topic, win, focus, dijit){ - - // module: - // dijit/_base/focus - - var exports = { - // summary: - // Deprecated module to monitor currently focused node and stack of currently focused widgets. - // New code should access dijit/focus directly. - - // _curFocus: DomNode - // Currently focused item on screen - _curFocus: null, - - // _prevFocus: DomNode - // Previously focused item on screen - _prevFocus: null, - - isCollapsed: function(){ - // summary: - // Returns true if there is no text selected - return dijit.getBookmark().isCollapsed; - }, - - getBookmark: function(){ - // summary: - // Retrieves a bookmark that can be used with moveToBookmark to return to the same range - var bm, rg, tg, sel = win.doc.selection, cf = focus.curNode; - - if(win.global.getSelection){ - //W3C Range API for selections. - sel = win.global.getSelection(); - if(sel){ - if(sel.isCollapsed){ - tg = cf? cf.tagName : ""; - if(tg){ - //Create a fake rangelike item to restore selections. - tg = tg.toLowerCase(); - if(tg == "textarea" || - (tg == "input" && (!cf.type || cf.type.toLowerCase() == "text"))){ - sel = { - start: cf.selectionStart, - end: cf.selectionEnd, - node: cf, - pRange: true - }; - return {isCollapsed: (sel.end <= sel.start), mark: sel}; //Object. - } - } - bm = {isCollapsed:true}; - if(sel.rangeCount){ - bm.mark = sel.getRangeAt(0).cloneRange(); - } - }else{ - rg = sel.getRangeAt(0); - bm = {isCollapsed: false, mark: rg.cloneRange()}; - } - } - }else if(sel){ - // If the current focus was a input of some sort and no selection, don't bother saving - // a native bookmark. This is because it causes issues with dialog/page selection restore. - // So, we need to create psuedo bookmarks to work with. - tg = cf ? cf.tagName : ""; - tg = tg.toLowerCase(); - if(cf && tg && (tg == "button" || tg == "textarea" || tg == "input")){ - if(sel.type && sel.type.toLowerCase() == "none"){ - return { - isCollapsed: true, - mark: null - } - }else{ - rg = sel.createRange(); - return { - isCollapsed: rg.text && rg.text.length?false:true, - mark: { - range: rg, - pRange: true - } - }; - } - } - bm = {}; - - //'IE' way for selections. - try{ - // createRange() throws exception when dojo in iframe - //and nothing selected, see #9632 - rg = sel.createRange(); - bm.isCollapsed = !(sel.type == 'Text' ? rg.htmlText.length : rg.length); - }catch(e){ - bm.isCollapsed = true; - return bm; - } - if(sel.type.toUpperCase() == 'CONTROL'){ - if(rg.length){ - bm.mark=[]; - var i=0,len=rg.length; - while(i<len){ - bm.mark.push(rg.item(i++)); - } - }else{ - bm.isCollapsed = true; - bm.mark = null; - } - }else{ - bm.mark = rg.getBookmark(); - } - }else{ - console.warn("No idea how to store the current selection for this browser!"); - } - return bm; // Object - }, - - moveToBookmark: function(/*Object*/ bookmark){ - // summary: - // Moves current selection to a bookmark - // bookmark: - // This should be a returned object from dijit.getBookmark() - - var _doc = win.doc, - mark = bookmark.mark; - if(mark){ - if(win.global.getSelection){ - //W3C Rangi API (FF, WebKit, Opera, etc) - var sel = win.global.getSelection(); - if(sel && sel.removeAllRanges){ - if(mark.pRange){ - var n = mark.node; - n.selectionStart = mark.start; - n.selectionEnd = mark.end; - }else{ - sel.removeAllRanges(); - sel.addRange(mark); - } - }else{ - console.warn("No idea how to restore selection for this browser!"); - } - }else if(_doc.selection && mark){ - //'IE' way. - var rg; - if(mark.pRange){ - rg = mark.range; - }else if(lang.isArray(mark)){ - rg = _doc.body.createControlRange(); - //rg.addElement does not have call/apply method, so can not call it directly - //rg is not available in "range.addElement(item)", so can't use that either - array.forEach(mark, function(n){ - rg.addElement(n); - }); - }else{ - rg = _doc.body.createTextRange(); - rg.moveToBookmark(mark); - } - rg.select(); - } - } - }, - - getFocus: function(/*Widget?*/ menu, /*Window?*/ openedForWindow){ - // summary: - // Called as getFocus(), this returns an Object showing the current focus - // and selected text. - // - // Called as getFocus(widget), where widget is a (widget representing) a button - // that was just pressed, it returns where focus was before that button - // was pressed. (Pressing the button may have either shifted focus to the button, - // or removed focus altogether.) In this case the selected text is not returned, - // since it can't be accurately determined. - // - // menu: dijit/_WidgetBase|{domNode: DomNode} structure - // The button that was just pressed. If focus has disappeared or moved - // to this button, returns the previous focus. In this case the bookmark - // information is already lost, and null is returned. - // - // openedForWindow: - // iframe in which menu was opened - // - // returns: - // A handle to restore focus/selection, to be passed to `dijit.focus` - var node = !focus.curNode || (menu && dom.isDescendant(focus.curNode, menu.domNode)) ? dijit._prevFocus : focus.curNode; - return { - node: node, - bookmark: node && (node == focus.curNode) && win.withGlobal(openedForWindow || win.global, dijit.getBookmark), - openedForWindow: openedForWindow - }; // Object - }, - - // _activeStack: dijit/_WidgetBase[] - // List of currently active widgets (focused widget and it's ancestors) - _activeStack: [], - - registerIframe: function(/*DomNode*/ iframe){ - // summary: - // Registers listeners on the specified iframe so that any click - // or focus event on that iframe (or anything in it) is reported - // as a focus/click event on the `<iframe>` itself. - // description: - // Currently only used by editor. - // returns: - // Handle to pass to unregisterIframe() - return focus.registerIframe(iframe); - }, - - unregisterIframe: function(/*Object*/ handle){ - // summary: - // Unregisters listeners on the specified iframe created by registerIframe. - // After calling be sure to delete or null out the handle itself. - // handle: - // Handle returned by registerIframe() - - handle && handle.remove(); - }, - - registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){ - // summary: - // Registers listeners on the specified window (either the main - // window or an iframe's window) to detect when the user has clicked somewhere - // or focused somewhere. - // description: - // Users should call registerIframe() instead of this method. - // targetWindow: - // If specified this is the window associated with the iframe, - // i.e. iframe.contentWindow. - // effectiveNode: - // If specified, report any focus events inside targetWindow as - // an event on effectiveNode, rather than on evt.target. - // returns: - // Handle to pass to unregisterWin() - - return focus.registerWin(targetWindow, effectiveNode); - }, - - unregisterWin: function(/*Handle*/ handle){ - // summary: - // Unregisters listeners on the specified window (either the main - // window or an iframe's window) according to handle returned from registerWin(). - // After calling be sure to delete or null out the handle itself. - - handle && handle.remove(); - } - }; - - // Override focus singleton's focus function so that dijit.focus() - // has backwards compatible behavior of restoring selection (although - // probably no one is using that). - focus.focus = function(/*Object|DomNode */ handle){ - // summary: - // Sets the focused node and the selection according to argument. - // To set focus to an iframe's content, pass in the iframe itself. - // handle: - // object returned by get(), or a DomNode - - if(!handle){ return; } - - var node = "node" in handle ? handle.node : handle, // because handle is either DomNode or a composite object - bookmark = handle.bookmark, - openedForWindow = handle.openedForWindow, - collapsed = bookmark ? bookmark.isCollapsed : false; - - // Set the focus - // Note that for iframe's we need to use the <iframe> to follow the parentNode chain, - // but we need to set focus to iframe.contentWindow - if(node){ - var focusNode = (node.tagName.toLowerCase() == "iframe") ? node.contentWindow : node; - if(focusNode && focusNode.focus){ - try{ - // Gecko throws sometimes if setting focus is impossible, - // node not displayed or something like that - focusNode.focus(); - }catch(e){/*quiet*/} - } - focus._onFocusNode(node); - } - - // set the selection - // do not need to restore if current selection is not empty - // (use keyboard to select a menu item) or if previous selection was collapsed - // as it may cause focus shift (Esp in IE). - if(bookmark && win.withGlobal(openedForWindow || win.global, dijit.isCollapsed) && !collapsed){ - if(openedForWindow){ - openedForWindow.focus(); - } - try{ - win.withGlobal(openedForWindow || win.global, dijit.moveToBookmark, null, [bookmark]); - }catch(e2){ - /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */ - } - } - }; - - // For back compatibility, monitor changes to focused node and active widget stack, - // publishing events and copying changes from focus manager variables into dijit (top level) variables - focus.watch("curNode", function(name, oldVal, newVal){ - dijit._curFocus = newVal; - dijit._prevFocus = oldVal; - if(newVal){ - topic.publish("focusNode", newVal); // publish - } - }); - focus.watch("activeStack", function(name, oldVal, newVal){ - dijit._activeStack = newVal; - }); - - focus.on("widget-blur", function(widget, by){ - topic.publish("widgetBlur", widget, by); // publish - }); - focus.on("widget-focus", function(widget, by){ - topic.publish("widgetFocus", widget, by); // publish - }); - - lang.mixin(dijit, exports); - - /*===== return exports; =====*/ - return dijit; // for back compat :-( -}); diff --git a/lib/dijit/_base/manager.js.uncompressed.js b/lib/dijit/_base/manager.js.uncompressed.js deleted file mode 100644 index b4e2729ae..000000000 --- a/lib/dijit/_base/manager.js.uncompressed.js +++ /dev/null @@ -1,35 +0,0 @@ -define("dijit/_base/manager", [ - "dojo/_base/array", - "dojo/_base/config", // defaultDuration - "dojo/_base/lang", - "../registry", - "../main" // for setting exports to dijit namespace -], function(array, config, lang, registry, dijit){ - - // module: - // dijit/_base/manager - - var exports = { - // summary: - // Deprecated. Shim to methods on registry, plus a few other declarations. - // New code should access dijit/registry directly when possible. - }; - - array.forEach(["byId", "getUniqueId", "findWidgets", "_destroyAll", "byNode", "getEnclosingWidget"], function(name){ - exports[name] = registry[name]; - }); - - lang.mixin(exports, { - // defaultDuration: Integer - // The default fx.animation speed (in ms) to use for all Dijit - // transitional fx.animations, unless otherwise specified - // on a per-instance basis. Defaults to 200, overrided by - // `djConfig.defaultDuration` - defaultDuration: config["defaultDuration"] || 200 - }); - - lang.mixin(dijit, exports); - - /*===== return exports; =====*/ - return dijit; // for back compat :-( -}); diff --git a/lib/dijit/_base/place.js.uncompressed.js b/lib/dijit/_base/place.js.uncompressed.js deleted file mode 100644 index c71cabcd3..000000000 --- a/lib/dijit/_base/place.js.uncompressed.js +++ /dev/null @@ -1,131 +0,0 @@ -define("dijit/_base/place", [ - "dojo/_base/array", // array.forEach - "dojo/_base/lang", // lang.isArray, lang.mixin - "dojo/window", // windowUtils.getBox - "../place", - "../main" // export to dijit namespace -], function(array, lang, windowUtils, place, dijit){ - - // module: - // dijit/_base/place - - - var exports = { - // summary: - // Deprecated back compatibility module, new code should use dijit/place directly instead of using this module. - }; - - exports.getViewport = function(){ - // summary: - // Deprecated method to return the dimensions and scroll position of the viewable area of a browser window. - // New code should use windowUtils.getBox() - - return windowUtils.getBox(); - }; - - exports.placeOnScreen = place.at; - - exports.placeOnScreenAroundElement = function(node, aroundNode, aroundCorners, layoutNode){ - // summary: - // Like dijit.placeOnScreenAroundNode(), except it accepts an arbitrary object - // for the "around" argument and finds a proper processor to place a node. - // Deprecated, new code should use dijit/place.around() instead. - - // Convert old style {"BL": "TL", "BR": "TR"} type argument - // to style needed by dijit.place code: - // [ - // {aroundCorner: "BL", corner: "TL" }, - // {aroundCorner: "BR", corner: "TR" } - // ] - var positions; - if(lang.isArray(aroundCorners)){ - positions = aroundCorners; - }else{ - positions = []; - for(var key in aroundCorners){ - positions.push({aroundCorner: key, corner: aroundCorners[key]}); - } - } - - return place.around(node, aroundNode, positions, true, layoutNode); - }; - - exports.placeOnScreenAroundNode = exports.placeOnScreenAroundElement; - /*===== - exports.placeOnScreenAroundNode = function(node, aroundNode, aroundCorners, layoutNode){ - // summary: - // Position node adjacent or kitty-corner to aroundNode - // such that it's fully visible in viewport. - // Deprecated, new code should use dijit/place.around() instead. - }; - =====*/ - - exports.placeOnScreenAroundRectangle = exports.placeOnScreenAroundElement; - /*===== - exports.placeOnScreenAroundRectangle = function(node, aroundRect, aroundCorners, layoutNode){ - // summary: - // Like dijit.placeOnScreenAroundNode(), except that the "around" - // parameter is an arbitrary rectangle on the screen (x, y, width, height) - // instead of a dom node. - // Deprecated, new code should use dijit/place.around() instead. - }; - =====*/ - - exports.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){ - // summary: - // Deprecated method, unneeded when using dijit/place directly. - // Transforms the passed array of preferred positions into a format suitable for - // passing as the aroundCorners argument to dijit/place.placeOnScreenAroundElement. - // position: String[] - // This variable controls the position of the drop down. - // It's an array of strings with the following values: - // - // - before: places drop down to the left of the target node/widget, or to the right in - // the case of RTL scripts like Hebrew and Arabic - // - after: places drop down to the right of the target node/widget, or to the left in - // the case of RTL scripts like Hebrew and Arabic - // - above: drop down goes above target node - // - below: drop down goes below target node - // - // The list is positions is tried, in order, until a position is found where the drop down fits - // within the viewport. - // leftToRight: Boolean - // Whether the popup will be displaying in leftToRight mode. - - var align = {}; - array.forEach(position, function(pos){ - var ltr = leftToRight; - switch(pos){ - case "after": - align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR"; - break; - case "before": - align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL"; - break; - case "below-alt": - ltr = !ltr; - // fall through - case "below": - // first try to align left borders, next try to align right borders (or reverse for RTL mode) - align[ltr ? "BL" : "BR"] = ltr ? "TL" : "TR"; - align[ltr ? "BR" : "BL"] = ltr ? "TR" : "TL"; - break; - case "above-alt": - ltr = !ltr; - // fall through - case "above": - default: - // first try to align left borders, next try to align right borders (or reverse for RTL mode) - align[ltr ? "TL" : "TR"] = ltr ? "BL" : "BR"; - align[ltr ? "TR" : "TL"] = ltr ? "BR" : "BL"; - break; - } - }); - return align; - }; - - lang.mixin(dijit, exports); - - /*===== return exports; =====*/ - return dijit; // for back compat :-( -}); diff --git a/lib/dijit/_base/popup.js.uncompressed.js b/lib/dijit/_base/popup.js.uncompressed.js deleted file mode 100644 index cc582e66e..000000000 --- a/lib/dijit/_base/popup.js.uncompressed.js +++ /dev/null @@ -1,58 +0,0 @@ -define("dijit/_base/popup", [ - "dojo/dom-class", // domClass.contains - "dojo/_base/window", - "../popup", - "../BackgroundIframe" // just loading for back-compat, in case client code is referencing it -], function(domClass, win, popup){ - -// module: -// dijit/_base/popup - -/*===== -return { - // summary: - // Deprecated. Old module for popups, new code should use dijit/popup directly. -}; -=====*/ - - -// Hack support for old API passing in node instead of a widget (to various methods) -var origCreateWrapper = popup._createWrapper; -popup._createWrapper = function(widget){ - if(!widget.declaredClass){ - // make fake widget to pass to new API - widget = { - _popupWrapper: (widget.parentNode && domClass.contains(widget.parentNode, "dijitPopup")) ? - widget.parentNode : null, - domNode: widget, - destroy: function(){}, - ownerDocument: widget.ownerDocument, - ownerDocumentBody: win.body(widget.ownerDocument) - }; - } - return origCreateWrapper.call(this, widget); -}; - -// Support old format of orient parameter -var origOpen = popup.open; -popup.open = function(/*__OpenArgs*/ args){ - // Convert old hash structure (ex: {"BL": "TL", ...}) of orient to format compatible w/new popup.open() API. - // Don't do conversion for: - // - null parameter (that means to use the default positioning) - // - "R" or "L" strings used to indicate positioning for context menus (when there is no around node) - // - new format, ex: ["below", "above"] - // - return value from deprecated dijit.getPopupAroundAlignment() method, - // ex: ["below", "above"] - if(args.orient && typeof args.orient != "string" && !("length" in args.orient)){ - var ary = []; - for(var key in args.orient){ - ary.push({aroundCorner: key, corner: args.orient[key]}); - } - args.orient = ary; - } - - return origOpen.call(this, args); -}; - -return popup; -}); diff --git a/lib/dijit/_base/scroll.js.uncompressed.js b/lib/dijit/_base/scroll.js.uncompressed.js deleted file mode 100644 index 41f8962e4..000000000 --- a/lib/dijit/_base/scroll.js.uncompressed.js +++ /dev/null @@ -1,22 +0,0 @@ -define("dijit/_base/scroll", [ - "dojo/window", // windowUtils.scrollIntoView - "../main" // export symbol to dijit -], function(windowUtils, dijit){ - // module: - // dijit/_base/scroll - - /*===== - return { - // summary: - // Back compatibility module, new code should use windowUtils directly instead of using this module. - }; - =====*/ - - dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ - // summary: - // Scroll the passed node into view, if it is not already. - // Deprecated, use `windowUtils.scrollIntoView` instead. - - windowUtils.scrollIntoView(node, pos); - }; -}); diff --git a/lib/dijit/_base/sniff.js.uncompressed.js b/lib/dijit/_base/sniff.js.uncompressed.js deleted file mode 100644 index ada374aa5..000000000 --- a/lib/dijit/_base/sniff.js.uncompressed.js +++ /dev/null @@ -1,12 +0,0 @@ -define("dijit/_base/sniff", [ "dojo/uacss" ], function(){ - - // module: - // dijit/_base/sniff - - /*===== - return { - // summary: - // Deprecated, back compatibility module, new code should require dojo/uacss directly instead of this module. - }; - =====*/ -}); diff --git a/lib/dijit/_base/typematic.js.uncompressed.js b/lib/dijit/_base/typematic.js.uncompressed.js deleted file mode 100644 index 71132a6ca..000000000 --- a/lib/dijit/_base/typematic.js.uncompressed.js +++ /dev/null @@ -1,10 +0,0 @@ -define("dijit/_base/typematic", ["../typematic"], function(){ - - /*===== - return { - // summary: - // Deprecated, for back-compat, just loads top level module - }; - =====*/ - -}); diff --git a/lib/dijit/_base/wai.js.uncompressed.js b/lib/dijit/_base/wai.js.uncompressed.js deleted file mode 100644 index b71b21698..000000000 --- a/lib/dijit/_base/wai.js.uncompressed.js +++ /dev/null @@ -1,109 +0,0 @@ -define("dijit/_base/wai", [ - "dojo/dom-attr", // domAttr.attr - "dojo/_base/lang", // lang.mixin - "../main", // export symbols to dijit - "../hccss" // not using this module directly, but loading it sets CSS flag on <html> -], function(domAttr, lang, dijit){ - - // module: - // dijit/_base/wai - - var exports = { - // summary: - // Deprecated methods for setting/getting wai roles and states. - // New code should call setAttribute()/getAttribute() directly. - // - // Also loads hccss to apply dj_a11y class to root node if machine is in high-contrast mode. - - hasWaiRole: function(/*Element*/ elem, /*String?*/ role){ - // summary: - // Determines if an element has a particular role. - // returns: - // True if elem has the specific role attribute and false if not. - // For backwards compatibility if role parameter not provided, - // returns true if has a role - var waiRole = this.getWaiRole(elem); - return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0); - }, - - getWaiRole: function(/*Element*/ elem){ - // summary: - // Gets the role for an element (which should be a wai role). - // returns: - // The role of elem or an empty string if elem - // does not have a role. - return lang.trim((domAttr.get(elem, "role") || "").replace("wairole:","")); - }, - - setWaiRole: function(/*Element*/ elem, /*String*/ role){ - // summary: - // Sets the role on an element. - // description: - // Replace existing role attribute with new role. - - domAttr.set(elem, "role", role); - }, - - removeWaiRole: function(/*Element*/ elem, /*String*/ role){ - // summary: - // Removes the specified role from an element. - // Removes role attribute if no specific role provided (for backwards compat.) - - var roleValue = domAttr.get(elem, "role"); - if(!roleValue){ return; } - if(role){ - var t = lang.trim((" " + roleValue + " ").replace(" " + role + " ", " ")); - domAttr.set(elem, "role", t); - }else{ - elem.removeAttribute("role"); - } - }, - - hasWaiState: function(/*Element*/ elem, /*String*/ state){ - // summary: - // Determines if an element has a given state. - // description: - // Checks for an attribute called "aria-"+state. - // returns: - // true if elem has a value for the given state and - // false if it does not. - - return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state); - }, - - getWaiState: function(/*Element*/ elem, /*String*/ state){ - // summary: - // Gets the value of a state on an element. - // description: - // Checks for an attribute called "aria-"+state. - // returns: - // The value of the requested state on elem - // or an empty string if elem has no value for state. - - return elem.getAttribute("aria-"+state) || ""; - }, - - setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){ - // summary: - // Sets a state on an element. - // description: - // Sets an attribute called "aria-"+state. - - elem.setAttribute("aria-"+state, value); - }, - - removeWaiState: function(/*Element*/ elem, /*String*/ state){ - // summary: - // Removes a state from an element. - // description: - // Sets an attribute called "aria-"+state. - - elem.removeAttribute("aria-"+state); - } - }; - - lang.mixin(dijit, exports); - - /*===== return exports; =====*/ - return dijit; // for back compat :-( -}); diff --git a/lib/dijit/_base/window.js.uncompressed.js b/lib/dijit/_base/window.js.uncompressed.js deleted file mode 100644 index 1b4c187ef..000000000 --- a/lib/dijit/_base/window.js.uncompressed.js +++ /dev/null @@ -1,18 +0,0 @@ -define("dijit/_base/window", [ - "dojo/window", // windowUtils.get - "../main" // export symbol to dijit -], function(windowUtils, dijit){ - // module: - // dijit/_base/window - - /*===== - return { - // summary: - // Back compatibility module, new code should use windowUtils directly instead of using this module. - }; - =====*/ - - dijit.getDocumentWindow = function(doc){ - return windowUtils.get(doc); - }; -}); diff --git a/lib/dijit/_editor/RichText.js.uncompressed.js b/lib/dijit/_editor/RichText.js.uncompressed.js deleted file mode 100644 index 5fd3e0962..000000000 --- a/lib/dijit/_editor/RichText.js.uncompressed.js +++ /dev/null @@ -1,2874 +0,0 @@ -define("dijit/_editor/RichText", [ - "dojo/_base/array", // array.forEach array.indexOf array.some - "dojo/_base/config", // config - "dojo/_base/declare", // declare - "dojo/_base/Deferred", // Deferred - "dojo/dom", // dom.byId - "dojo/dom-attr", // domAttr.set or get - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-construct", // domConstruct.create domConstruct.destroy domConstruct.place - "dojo/dom-geometry", // domGeometry.position - "dojo/dom-style", // domStyle.getComputedStyle domStyle.set - "dojo/_base/event", // event.stop - "dojo/_base/kernel", // kernel.deprecated - "dojo/keys", // keys.BACKSPACE keys.TAB - "dojo/_base/lang", // lang.clone lang.hitch lang.isArray lang.isFunction lang.isString lang.trim - "dojo/on", // on() - "dojo/query", // query - "dojo/ready", // ready - "dojo/sniff", // has("ie") has("mozilla") has("opera") has("safari") has("webkit") - "dojo/topic", // topic.publish() (publish) - "dojo/_base/unload", // unload - "dojo/_base/url", // url - "dojo/_base/window", // win.global - "../_Widget", - "../_CssStateMixin", - "./selection", - "./range", - "./html", - "../focus", - "../main" // dijit._scopeName -], function(array, config, declare, Deferred, dom, domAttr, domClass, domConstruct, domGeometry, domStyle, - event, kernel, keys, lang, on, query, ready, has, topic, unload, _Url, win, - _Widget, _CssStateMixin, selectionapi, rangeapi, htmlapi, focus, dijit){ - -// module: -// dijit/_editor/RichText -// summary: -// dijit/_editor/RichText is the core of dijit/Editor, which provides basic -// WYSIWYG editing features. - -// if you want to allow for rich text saving with back/forward actions, you must add a text area to your page with -// the id==dijit._scopeName + "._editor.RichText.value" (typically "dijit/_editor/RichText.value). For example, -// something like this will work: -// -// <textarea id="dijit._editor.RichText.value" style="display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;"></textarea> -// - -var RichText = declare("dijit._editor.RichText", [_Widget, _CssStateMixin], { - // summary: - // dijit/_editor/RichText is the core of dijit.Editor, which provides basic - // WYSIWYG editing features. - // - // description: - // dijit/_editor/RichText is the core of dijit.Editor, which provides basic - // WYSIWYG editing features. It also encapsulates the differences - // of different js engines for various browsers. Do not use this widget - // with an HTML <TEXTAREA> tag, since the browser unescapes XML escape characters, - // like <. This can have unexpected behavior and lead to security issues - // such as scripting attacks. - // - // tags: - // private - - constructor: function(params /*===== , srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Initial settings for any of the widget attributes, except readonly attributes. - // srcNodeRef: DOMNode - // The widget replaces the specified DOMNode. - - // contentPreFilters: Function(String)[] - // Pre content filter function register array. - // these filters will be executed before the actual - // editing area gets the html content. - this.contentPreFilters = []; - - // contentPostFilters: Function(String)[] - // post content filter function register array. - // These will be used on the resulting html - // from contentDomPostFilters. The resulting - // content is the final html (returned by getValue()). - this.contentPostFilters = []; - - // contentDomPreFilters: Function(DomNode)[] - // Pre content dom filter function register array. - // These filters are applied after the result from - // contentPreFilters are set to the editing area. - this.contentDomPreFilters = []; - - // contentDomPostFilters: Function(DomNode)[] - // Post content dom filter function register array. - // These filters are executed on the editing area dom. - // The result from these will be passed to contentPostFilters. - this.contentDomPostFilters = []; - - // editingAreaStyleSheets: dojo._URL[] - // array to store all the stylesheets applied to the editing area - this.editingAreaStyleSheets = []; - - // Make a copy of this.events before we start writing into it, otherwise we - // will modify the prototype which leads to bad things on pages w/multiple editors - this.events = [].concat(this.events); - - this._keyHandlers = {}; - - if(params && lang.isString(params.value)){ - this.value = params.value; - } - - this.onLoadDeferred = new Deferred(); - }, - - baseClass: "dijitEditor", - - // inheritWidth: Boolean - // whether to inherit the parent's width or simply use 100% - inheritWidth: false, - - // focusOnLoad: [deprecated] Boolean - // Focus into this widget when the page is loaded - focusOnLoad: false, - - // name: String? - // Specifies the name of a (hidden) `<textarea>` node on the page that's used to save - // the editor content on page leave. Used to restore editor contents after navigating - // to a new page and then hitting the back button. - name: "", - - // styleSheets: [const] String - // semicolon (";") separated list of css files for the editing area - styleSheets: "", - - // height: String - // Set height to fix the editor at a specific height, with scrolling. - // By default, this is 300px. If you want to have the editor always - // resizes to accommodate the content, use AlwaysShowToolbar plugin - // and set height="". If this editor is used within a layout widget, - // set height="100%". - height: "300px", - - // minHeight: String - // The minimum height that the editor should have. - minHeight: "1em", - - // isClosed: [private] Boolean - isClosed: true, - - // isLoaded: [private] Boolean - isLoaded: false, - - // _SEPARATOR: [private] String - // Used to concat contents from multiple editors into a single string, - // so they can be saved into a single `<textarea>` node. See "name" attribute. - _SEPARATOR: "@@**%%__RICHTEXTBOUNDRY__%%**@@", - - // _NAME_CONTENT_SEP: [private] String - // USed to separate name from content. Just a colon isn't safe. - _NAME_CONTENT_SEP: "@@**%%:%%**@@", - - // onLoadDeferred: [readonly] dojo.Deferred - // Deferred which is fired when the editor finishes loading. - // Call myEditor.onLoadDeferred.then(callback) it to be informed - // when the rich-text area initialization is finalized. - onLoadDeferred: null, - - // isTabIndent: Boolean - // Make tab key and shift-tab indent and outdent rather than navigating. - // Caution: sing this makes web pages inaccessible to users unable to use a mouse. - isTabIndent: false, - - // disableSpellCheck: [const] Boolean - // When true, disables the browser's native spell checking, if supported. - // Works only in Firefox. - disableSpellCheck: false, - - postCreate: function(){ - if("textarea" === this.domNode.tagName.toLowerCase()){ - console.warn("RichText should not be used with the TEXTAREA tag. See dijit._editor.RichText docs."); - } - - // Push in the builtin filters now, making them the first executed, but not over-riding anything - // users passed in. See: #6062 - this.contentPreFilters = [lang.hitch(this, "_preFixUrlAttributes")].concat(this.contentPreFilters); - if(has("mozilla")){ - this.contentPreFilters = [this._normalizeFontStyle].concat(this.contentPreFilters); - this.contentPostFilters = [this._removeMozBogus].concat(this.contentPostFilters); - } - if(has("webkit")){ - // Try to clean up WebKit bogus artifacts. The inserted classes - // made by WebKit sometimes messes things up. - this.contentPreFilters = [this._removeWebkitBogus].concat(this.contentPreFilters); - this.contentPostFilters = [this._removeWebkitBogus].concat(this.contentPostFilters); - } - if(has("ie")){ - // IE generates <strong> and <em> but we want to normalize to <b> and <i> - this.contentPostFilters = [this._normalizeFontStyle].concat(this.contentPostFilters); - this.contentDomPostFilters = [lang.hitch(this, this._stripBreakerNodes)].concat(this.contentDomPostFilters); - } - this.inherited(arguments); - - topic.publish(dijit._scopeName + "._editor.RichText::init", this); - this.open(); - this.setupDefaultShortcuts(); - }, - - setupDefaultShortcuts: function(){ - // summary: - // Add some default key handlers - // description: - // Overwrite this to setup your own handlers. The default - // implementation does not use Editor commands, but directly - // executes the builtin commands within the underlying browser - // support. - // tags: - // protected - var exec = lang.hitch(this, function(cmd, arg){ - return function(){ - return !this.execCommand(cmd,arg); - }; - }); - - var ctrlKeyHandlers = { - b: exec("bold"), - i: exec("italic"), - u: exec("underline"), - a: exec("selectall"), - s: function(){ this.save(true); }, - m: function(){ this.isTabIndent = !this.isTabIndent; }, - - "1": exec("formatblock", "h1"), - "2": exec("formatblock", "h2"), - "3": exec("formatblock", "h3"), - "4": exec("formatblock", "h4"), - - "\\": exec("insertunorderedlist") - }; - - if(!has("ie")){ - ctrlKeyHandlers.Z = exec("redo"); //FIXME: undo? - } - - var key; - for(key in ctrlKeyHandlers){ - this.addKeyHandler(key, true, false, ctrlKeyHandlers[key]); - } - }, - - // events: [private] String[] - // events which should be connected to the underlying editing area - events: ["onKeyPress", "onKeyDown", "onKeyUp"], // onClick handled specially - - // captureEvents: [deprecated] String[] - // Events which should be connected to the underlying editing - // area, events in this array will be addListener with - // capture=true. - // TODO: looking at the code I don't see any distinction between events and captureEvents, - // so get rid of this for 2.0 if not sooner - captureEvents: [], - - _editorCommandsLocalized: false, - _localizeEditorCommands: function(){ - // summary: - // When IE is running in a non-English locale, the API actually changes, - // so that we have to say (for example) danraku instead of p (for paragraph). - // Handle that here. - // tags: - // private - if(RichText._editorCommandsLocalized){ - // Use the already generate cache of mappings. - this._local2NativeFormatNames = RichText._local2NativeFormatNames; - this._native2LocalFormatNames = RichText._native2LocalFormatNames; - return; - } - RichText._editorCommandsLocalized = true; - RichText._local2NativeFormatNames = {}; - RichText._native2LocalFormatNames = {}; - this._local2NativeFormatNames = RichText._local2NativeFormatNames; - this._native2LocalFormatNames = RichText._native2LocalFormatNames; - //in IE, names for blockformat is locale dependent, so we cache the values here - - //put p after div, so if IE returns Normal, we show it as paragraph - //We can distinguish p and div if IE returns Normal, however, in order to detect that, - //we have to call this.document.selection.createRange().parentElement() or such, which - //could slow things down. Leave it as it is for now - var formats = ['div', 'p', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'address']; - var localhtml = "", format, i=0; - while((format=formats[i++])){ - //append a <br> after each element to separate the elements more reliably - if(format.charAt(1) !== 'l'){ - localhtml += "<"+format+"><span>content</span></"+format+"><br/>"; - }else{ - localhtml += "<"+format+"><li>content</li></"+format+"><br/>"; - } - } - // queryCommandValue returns empty if we hide editNode, so move it out of screen temporary - // Also, IE9 does weird stuff unless we do it inside the editor iframe. - var style = { position: "absolute", top: "0px", zIndex: 10, opacity: 0.01 }; - var div = domConstruct.create('div', {style: style, innerHTML: localhtml}); - this.ownerDocumentBody.appendChild(div); - - // IE9 has a timing issue with doing this right after setting - // the inner HTML, so put a delay in. - var inject = lang.hitch(this, function(){ - var node = div.firstChild; - while(node){ - try{ - this._sCall("selectElement", [node.firstChild]); - var nativename = node.tagName.toLowerCase(); - this._local2NativeFormatNames[nativename] = document.queryCommandValue("formatblock"); - this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename; - node = node.nextSibling.nextSibling; - //console.log("Mapped: ", nativename, " to: ", this._local2NativeFormatNames[nativename]); - }catch(e){ /*Sqelch the occasional IE9 error */ } - } - domConstruct.destroy(div); - }); - this.defer(inject); - }, - - open: function(/*DomNode?*/ element){ - // summary: - // Transforms the node referenced in this.domNode into a rich text editing - // node. - // description: - // Sets up the editing area asynchronously. This will result in - // the creation and replacement with an iframe. - // tags: - // private - - if(!this.onLoadDeferred || this.onLoadDeferred.fired >= 0){ - this.onLoadDeferred = new Deferred(); - } - - if(!this.isClosed){ this.close(); } - topic.publish(dijit._scopeName + "._editor.RichText::open", this); - - if(arguments.length === 1 && element.nodeName){ // else unchanged - this.domNode = element; - } - - var dn = this.domNode; - - // "html" will hold the innerHTML of the srcNodeRef and will be used to - // initialize the editor. - var html; - - if(lang.isString(this.value)){ - // Allow setting the editor content programmatically instead of - // relying on the initial content being contained within the target - // domNode. - html = this.value; - delete this.value; - dn.innerHTML = ""; - }else if(dn.nodeName && dn.nodeName.toLowerCase() == "textarea"){ - // if we were created from a textarea, then we need to create a - // new editing harness node. - var ta = (this.textarea = dn); - this.name = ta.name; - html = ta.value; - dn = this.domNode = this.ownerDocument.createElement("div"); - dn.setAttribute('widgetId', this.id); - ta.removeAttribute('widgetId'); - dn.cssText = ta.cssText; - dn.className += " " + ta.className; - domConstruct.place(dn, ta, "before"); - var tmpFunc = lang.hitch(this, function(){ - //some browsers refuse to submit display=none textarea, so - //move the textarea off screen instead - domStyle.set(ta, { - display: "block", - position: "absolute", - top: "-1000px" - }); - - if(has("ie")){ //nasty IE bug: abnormal formatting if overflow is not hidden - var s = ta.style; - this.__overflow = s.overflow; - s.overflow = "hidden"; - } - }); - if(has("ie")){ - this.defer(tmpFunc, 10); - }else{ - tmpFunc(); - } - - if(ta.form){ - var resetValue = ta.value; - this.reset = function(){ - var current = this.getValue(); - if(current !== resetValue){ - this.replaceValue(resetValue); - } - }; - on(ta.form, "submit", lang.hitch(this, function(){ - // Copy value to the <textarea> so it gets submitted along with form. - // FIXME: should we be calling close() here instead? - domAttr.set(ta, 'disabled', this.disabled); // don't submit the value if disabled - ta.value = this.getValue(); - })); - } - }else{ - html = htmlapi.getChildrenHtml(dn); - dn.innerHTML = ""; - } - - this.value = html; - - // If we're a list item we have to put in a blank line to force the - // bullet to nicely align at the top of text - if(dn.nodeName && dn.nodeName === "LI"){ - dn.innerHTML = " <br>"; - } - - // Construct the editor div structure. - this.header = dn.ownerDocument.createElement("div"); - dn.appendChild(this.header); - this.editingArea = dn.ownerDocument.createElement("div"); - dn.appendChild(this.editingArea); - this.footer = dn.ownerDocument.createElement("div"); - dn.appendChild(this.footer); - - if(!this.name){ - this.name = this.id + "_AUTOGEN"; - } - - // User has pressed back/forward button so we lost the text in the editor, but it's saved - // in a hidden <textarea> (which contains the data for all the editors on this page), - // so get editor value from there - if(this.name !== "" && (!config["useXDomain"] || config["allowXdRichTextSave"])){ - var saveTextarea = dom.byId(dijit._scopeName + "._editor.RichText.value"); - if(saveTextarea && saveTextarea.value !== ""){ - var datas = saveTextarea.value.split(this._SEPARATOR), i=0, dat; - while((dat=datas[i++])){ - var data = dat.split(this._NAME_CONTENT_SEP); - if(data[0] === this.name){ - html = data[1]; - datas = datas.splice(i, 1); - saveTextarea.value = datas.join(this._SEPARATOR); - break; - } - } - } - - if(!RichText._globalSaveHandler){ - RichText._globalSaveHandler = {}; - unload.addOnUnload(function(){ - var id; - for(id in RichText._globalSaveHandler){ - var f = RichText._globalSaveHandler[id]; - if(lang.isFunction(f)){ - f(); - } - } - }); - } - RichText._globalSaveHandler[this.id] = lang.hitch(this, "_saveContent"); - } - - this.isClosed = false; - - var ifr = (this.editorObject = this.iframe = this.ownerDocument.createElement('iframe')); - ifr.id = this.id+"_iframe"; - ifr.style.border = "none"; - ifr.style.width = "100%"; - if(this._layoutMode){ - // iframe should be 100% height, thus getting it's height from surrounding - // <div> (which has the correct height set by Editor) - ifr.style.height = "100%"; - }else{ - if(has("ie") >= 7){ - if(this.height){ - ifr.style.height = this.height; - } - if(this.minHeight){ - ifr.style.minHeight = this.minHeight; - } - }else{ - ifr.style.height = this.height ? this.height : this.minHeight; - } - } - ifr.frameBorder = 0; - ifr._loadFunc = lang.hitch( this, function(w){ - this.window = w; - this.document = this.window.document; - - if(has("ie")){ - this._localizeEditorCommands(); - } - - // Do final setup and set initial contents of editor - this.onLoad(html); - }); - - // Set the iframe's initial (blank) content. - var src = this._getIframeDocTxt(), - s = "javascript: '" + src.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + "'"; - ifr.setAttribute('src', s); - this.editingArea.appendChild(ifr); - - if(has("safari") <= 4){ - src = ifr.getAttribute("src"); - if(!src || src.indexOf("javascript") === -1){ - // Safari 4 and earlier sometimes act oddly - // So we have to set it again. - this.defer(function(){ ifr.setAttribute('src', s); }); - } - } - - // TODO: this is a guess at the default line-height, kinda works - if(dn.nodeName === "LI"){ - dn.lastChild.style.marginTop = "-1.2em"; - } - - domClass.add(this.domNode, this.baseClass); - }, - - //static cache variables shared among all instance of this class - _local2NativeFormatNames: {}, - _native2LocalFormatNames: {}, - - _getIframeDocTxt: function(){ - // summary: - // Generates the boilerplate text of the document inside the iframe (ie, `<html><head>...</head><body/></html>`). - // Editor content (if not blank) should be added afterwards. - // tags: - // private - var _cs = domStyle.getComputedStyle(this.domNode); - - // The contents inside of <body>. The real contents are set later via a call to setValue(). - var html = ""; - var setBodyId = true; - if(has("ie") || has("webkit") || (!this.height && !has("mozilla"))){ - // In auto-expand mode, need a wrapper div for AlwaysShowToolbar plugin to correctly - // expand/contract the editor as the content changes. - html = "<div id='dijitEditorBody'></div>"; - setBodyId = false; - }else if(has("mozilla")){ - // workaround bug where can't select then delete text (until user types something - // into the editor)... and/or issue where typing doesn't erase selected text - this._cursorToStart = true; - html = " "; // - } - - var font = [ _cs.fontWeight, _cs.fontSize, _cs.fontFamily ].join(" "); - - // line height is tricky - applying a units value will mess things up. - // if we can't get a non-units value, bail out. - var lineHeight = _cs.lineHeight; - if(lineHeight.indexOf("px") >= 0){ - lineHeight = parseFloat(lineHeight)/parseFloat(_cs.fontSize); - // console.debug(lineHeight); - }else if(lineHeight.indexOf("em")>=0){ - lineHeight = parseFloat(lineHeight); - }else{ - // If we can't get a non-units value, just default - // it to the CSS spec default of 'normal'. Seems to - // work better, esp on IE, than '1.0' - lineHeight = "normal"; - } - var userStyle = ""; - var self = this; - this.style.replace(/(^|;)\s*(line-|font-?)[^;]+/ig, function(match){ - match = match.replace(/^;/ig,"") + ';'; - var s = match.split(":")[0]; - if(s){ - s = lang.trim(s); - s = s.toLowerCase(); - var i; - var sC = ""; - for(i = 0; i < s.length; i++){ - var c = s.charAt(i); - switch(c){ - case "-": - i++; - c = s.charAt(i).toUpperCase(); - default: - sC += c; - } - } - domStyle.set(self.domNode, sC, ""); - } - userStyle += match + ';'; - }); - - - // need to find any associated label element and update iframe document title - var label=query('label[for="'+this.id+'"]'); - - return [ - this.isLeftToRight() ? "<html>\n<head>\n" : "<html dir='rtl'>\n<head>\n", - (has("mozilla") && label.length ? "<title>" + label[0].innerHTML + "</title>\n" : ""), - "<meta http-equiv='Content-Type' content='text/html'>\n", - "<style>\n", - "\tbody,html {\n", - "\t\tbackground:transparent;\n", - "\t\tpadding: 1px 0 0 0;\n", - "\t\tmargin: -1px 0 0 0;\n", // remove extraneous vertical scrollbar on safari and firefox - - // Set the html/body sizing. Webkit always needs this, other browsers - // only set it when height is defined (not auto-expanding), otherwise - // scrollers do not appear. - ((has("webkit"))?"\t\twidth: 100%;\n":""), - ((has("webkit"))?"\t\theight: 100%;\n":""), - "\t}\n", - - // TODO: left positioning will cause contents to disappear out of view - // if it gets too wide for the visible area - "\tbody{\n", - "\t\ttop:0px;\n", - "\t\tleft:0px;\n", - "\t\tright:0px;\n", - "\t\tfont:", font, ";\n", - ((this.height||has("opera")) ? "" : "\t\tposition: fixed;\n"), - // FIXME: IE 6 won't understand min-height? - "\t\tmin-height:", this.minHeight, ";\n", - "\t\tline-height:", lineHeight,";\n", - "\t}\n", - "\tp{ margin: 1em 0; }\n", - - // Determine how scrollers should be applied. In autoexpand mode (height = "") no scrollers on y at all. - // But in fixed height mode we want both x/y scrollers. Also, if it's using wrapping div and in auto-expand - // (Mainly IE) we need to kill the y scroller on body and html. - (!setBodyId && !this.height ? "\tbody,html {overflow-y: hidden;}\n" : ""), - "\t#dijitEditorBody{overflow-x: auto; overflow-y:" + (this.height ? "auto;" : "hidden;") + " outline: 0px;}\n", - "\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n", - // Can't set min-height in IE9, it puts layout on li, which puts move/resize handles. - (!has("ie") ? "\tli{ min-height:1.2em; }\n" : ""), - "</style>\n", - this._applyEditingAreaStyleSheets(),"\n", - "</head>\n<body ", - (setBodyId?"id='dijitEditorBody' ":""), - - // Onload handler fills in real editor content. - // On IE9, sometimes onload is called twice, and the first time frameElement is null (test_FullScreen.html) - "onload='frameElement && frameElement._loadFunc(window,document)' ", - "style='"+userStyle+"'>", html, "</body>\n</html>" - ].join(""); // String - }, - - _applyEditingAreaStyleSheets: function(){ - // summary: - // apply the specified css files in styleSheets - // tags: - // private - var files = []; - if(this.styleSheets){ - files = this.styleSheets.split(';'); - this.styleSheets = ''; - } - - //empty this.editingAreaStyleSheets here, as it will be filled in addStyleSheet - files = files.concat(this.editingAreaStyleSheets); - this.editingAreaStyleSheets = []; - - var text='', i=0, url; - while((url=files[i++])){ - var abstring = (new _Url(win.global.location, url)).toString(); - this.editingAreaStyleSheets.push(abstring); - text += '<link rel="stylesheet" type="text/css" href="'+abstring+'"/>'; - } - return text; - }, - - addStyleSheet: function(/*dojo/_base/url*/ uri){ - // summary: - // add an external stylesheet for the editing area - // uri: - // Url of the external css file - var url=uri.toString(); - - //if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe - if(url.charAt(0) === '.' || (url.charAt(0) !== '/' && !uri.host)){ - url = (new _Url(win.global.location, url)).toString(); - } - - if(array.indexOf(this.editingAreaStyleSheets, url) > -1){ -// console.debug("dijit/_editor/RichText.addStyleSheet(): Style sheet "+url+" is already applied"); - return; - } - - this.editingAreaStyleSheets.push(url); - this.onLoadDeferred.then(lang.hitch(this, function(){ - if(this.document.createStyleSheet){ //IE - this.document.createStyleSheet(url); - }else{ //other browser - var head = this.document.getElementsByTagName("head")[0]; - var stylesheet = this.document.createElement("link"); - stylesheet.rel="stylesheet"; - stylesheet.type="text/css"; - stylesheet.href=url; - head.appendChild(stylesheet); - } - })); - }, - - removeStyleSheet: function(/*dojo/_base/url*/ uri){ - // summary: - // remove an external stylesheet for the editing area - var url=uri.toString(); - //if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe - if(url.charAt(0) === '.' || (url.charAt(0) !== '/' && !uri.host)){ - url = (new _Url(win.global.location, url)).toString(); - } - var index = array.indexOf(this.editingAreaStyleSheets, url); - if(index === -1){ -// console.debug("dijit/_editor/RichText.removeStyleSheet(): Style sheet "+url+" has not been applied"); - return; - } - delete this.editingAreaStyleSheets[index]; - query('link:[href="'+url+'"]', this.window.document).orphan(); - }, - - // disabled: Boolean - // The editor is disabled; the text cannot be changed. - disabled: false, - - _mozSettingProps: {'styleWithCSS':false}, - _setDisabledAttr: function(/*Boolean*/ value){ - value = !!value; - this._set("disabled", value); - if(!this.isLoaded){ return; } // this method requires init to be complete - if(has("ie") || has("webkit") || has("opera")){ - var preventIEfocus = has("ie") && (this.isLoaded || !this.focusOnLoad); - if(preventIEfocus){ this.editNode.unselectable = "on"; } - this.editNode.contentEditable = !value; - if(preventIEfocus){ - this.defer(function(){ - if(this.editNode){ // guard in case widget destroyed before timeout - this.editNode.unselectable = "off"; - } - }); - } - }else{ //moz - try{ - this.document.designMode=(value?'off':'on'); - }catch(e){ return; } // ! _disabledOK - if(!value && this._mozSettingProps){ - var ps = this._mozSettingProps; - var n; - for(n in ps){ - if(ps.hasOwnProperty(n)){ - try{ - this.document.execCommand(n,false,ps[n]); - }catch(e2){} - } - } - } -// this.document.execCommand('contentReadOnly', false, value); -// if(value){ -// this.blur(); //to remove the blinking caret -// } - } - this._disabledOK = true; - }, - -/* Event handlers - *****************/ - - onLoad: function(/*String*/ html){ - // summary: - // Handler after the iframe finishes loading. - // html: String - // Editor contents should be set to this value - // tags: - // protected - - // TODO: rename this to _onLoad, make empty public onLoad() method, deprecate/make protected onLoadDeferred handler? - - if(!this.window.__registeredWindow){ - this.window.__registeredWindow = true; - this._iframeRegHandle = focus.registerIframe(this.iframe); - } - if(!has("ie") && !has("webkit") && (this.height || has("mozilla"))){ - this.editNode=this.document.body; - }else{ - // there's a wrapper div around the content, see _getIframeDocTxt(). - this.editNode=this.document.body.firstChild; - var _this = this; - if(has("ie")){ // #4996 IE wants to focus the BODY tag - this.tabStop = domConstruct.create('div', { tabIndex: -1 }, this.editingArea); - this.iframe.onfocus = function(){ _this.editNode.setActive(); }; - } - } - this.focusNode = this.editNode; // for InlineEditBox - - - var events = this.events.concat(this.captureEvents); - var ap = this.iframe ? this.document : this.editNode; - array.forEach(events, function(item){ - this.connect(ap, item.toLowerCase(), item); - }, this); - - this.connect(ap, "onmouseup", "onClick"); // mouseup in the margin does not generate an onclick event - - if(has("ie")){ // IE contentEditable - this.connect(this.document, "onmousedown", "_onIEMouseDown"); // #4996 fix focus - - // give the node Layout on IE - // TODO: this may no longer be needed, since we've reverted IE to using an iframe, - // not contentEditable. Removing it would also probably remove the need for creating - // the extra <div> in _getIframeDocTxt() - this.editNode.style.zoom = 1.0; - }else{ - this.connect(this.document, "onmousedown", function(){ - // Clear the moveToStart focus, as mouse - // down will set cursor point. Required to properly - // work with selection/position driven plugins and clicks in - // the window. refs: #10678 - delete this._cursorToStart; - }); - } - - if(has("webkit")){ - //WebKit sometimes doesn't fire right on selections, so the toolbar - //doesn't update right. Therefore, help it out a bit with an additional - //listener. A mouse up will typically indicate a display change, so fire this - //and get the toolbar to adapt. Reference: #9532 - this._webkitListener = this.connect(this.document, "onmouseup", "onDisplayChanged"); - this.connect(this.document, "onmousedown", function(e){ - var t = e.target; - if(t && (t === this.document.body || t === this.document)){ - // Since WebKit uses the inner DIV, we need to check and set position. - // See: #12024 as to why the change was made. - this.defer("placeCursorAtEnd"); - } - }); - } - - if(has("ie")){ - // Try to make sure 'hidden' elements aren't visible in edit mode (like browsers other than IE - // do). See #9103 - try{ - this.document.execCommand('RespectVisibilityInDesign', true, null); - }catch(e){/* squelch */} - } - - this.isLoaded = true; - - this.set('disabled', this.disabled); // initialize content to editable (or not) - - // Note that setValue() call will only work after isLoaded is set to true (above) - - // Set up a function to allow delaying the setValue until a callback is fired - // This ensures extensions like dijit.Editor have a way to hold the value set - // until plugins load (and do things like register filters). - var setContent = lang.hitch(this, function(){ - this.setValue(html); - if(this.onLoadDeferred){ - this.onLoadDeferred.resolve(true); - } - this.onDisplayChanged(); - if(this.focusOnLoad){ - // after the document loads, then set focus after updateInterval expires so that - // onNormalizedDisplayChanged has run to avoid input caret issues - ready(lang.hitch(this, "defer", "focus", this.updateInterval)); - } - // Save off the initial content now - this.value = this.getValue(true); - }); - if(this.setValueDeferred){ - this.setValueDeferred.then(setContent); - }else{ - setContent(); - } - }, - - onKeyDown: function(/* Event */ e){ - // summary: - // Handler for onkeydown event - // tags: - // protected - - // we need this event at the moment to get the events from control keys - // such as the backspace. It might be possible to add this to Dojo, so that - // keyPress events can be emulated by the keyDown and keyUp detection. - - if(e.keyCode === keys.TAB && this.isTabIndent ){ - event.stop(e); //prevent tab from moving focus out of editor - - // FIXME: this is a poor-man's indent/outdent. It would be - // better if it added 4 " " chars in an undoable way. - // Unfortunately pasteHTML does not prove to be undoable - if(this.queryCommandEnabled((e.shiftKey ? "outdent" : "indent"))){ - this.execCommand((e.shiftKey ? "outdent" : "indent")); - } - } - if(has("ie")){ - if(e.keyCode == keys.TAB && !this.isTabIndent){ - if(e.shiftKey && !e.ctrlKey && !e.altKey){ - // focus the BODY so the browser will tab away from it instead - this.iframe.focus(); - }else if(!e.shiftKey && !e.ctrlKey && !e.altKey){ - // focus the BODY so the browser will tab away from it instead - this.tabStop.focus(); - } - }else if(e.keyCode === keys.BACKSPACE && this.document.selection.type === "Control"){ - // IE has a bug where if a non-text object is selected in the editor, - // hitting backspace would act as if the browser's back button was - // clicked instead of deleting the object. see #1069 - event.stop(e); - this.execCommand("delete"); - }else if((65 <= e.keyCode && e.keyCode <= 90) || - (e.keyCode>=37 && e.keyCode<=40) // FIXME: get this from connect() instead! - ){ //arrow keys - e.charCode = e.keyCode; - this.onKeyPress(e); - } - } - if(has("ff")){ - if(e.keyCode === keys.PAGE_UP || e.keyCode === keys.PAGE_DOWN ){ - if(this.editNode.clientHeight >= this.editNode.scrollHeight){ - // Stop the event to prevent firefox from trapping the cursor when there is no scroll bar. - e.preventDefault(); - } - } - } - return true; - }, - - onKeyUp: function(/*===== e =====*/){ - // summary: - // Handler for onkeyup event - // tags: - // callback - }, - - setDisabled: function(/*Boolean*/ disabled){ - // summary: - // Deprecated, use set('disabled', ...) instead. - // tags: - // deprecated - kernel.deprecated('dijit.Editor::setDisabled is deprecated','use dijit.Editor::attr("disabled",boolean) instead', 2.0); - this.set('disabled',disabled); - }, - _setValueAttr: function(/*String*/ value){ - // summary: - // Registers that attr("value", foo) should call setValue(foo) - this.setValue(value); - }, - _setDisableSpellCheckAttr: function(/*Boolean*/ disabled){ - if(this.document){ - domAttr.set(this.document.body, "spellcheck", !disabled); - }else{ - // try again after the editor is finished loading - this.onLoadDeferred.then(lang.hitch(this, function(){ - domAttr.set(this.document.body, "spellcheck", !disabled); - })); - } - this._set("disableSpellCheck", disabled); - }, - - onKeyPress: function(e){ - // summary: - // Handle the various key events - // tags: - // protected - - var c = (e.keyChar && e.keyChar.toLowerCase()) || e.keyCode, - handlers = this._keyHandlers[c], - args = arguments; - - if(handlers && !e.altKey){ - array.some(handlers, function(h){ - // treat meta- same as ctrl-, for benefit of mac users - if(!(h.shift ^ e.shiftKey) && !(h.ctrl ^ (e.ctrlKey||e.metaKey))){ - if(!h.handler.apply(this, args)){ - e.preventDefault(); - } - return true; - } - }, this); - } - - // function call after the character has been inserted - if(!this._onKeyHitch){ - this._onKeyHitch = lang.hitch(this, "onKeyPressed"); - } - this.defer("_onKeyHitch", 1); - return true; - }, - - addKeyHandler: function(/*String*/ key, /*Boolean*/ ctrl, /*Boolean*/ shift, /*Function*/ handler){ - // summary: - // Add a handler for a keyboard shortcut - // description: - // The key argument should be in lowercase if it is a letter character - // tags: - // protected - if(!lang.isArray(this._keyHandlers[key])){ - this._keyHandlers[key] = []; - } - //TODO: would be nice to make this a hash instead of an array for quick lookups - this._keyHandlers[key].push({ - shift: shift || false, - ctrl: ctrl || false, - handler: handler - }); - }, - - onKeyPressed: function(){ - // summary: - // Handler for after the user has pressed a key, and the display has been updated. - // (Runs on a timer so that it runs after the display is updated) - // tags: - // private - this.onDisplayChanged(/*e*/); // can't pass in e - }, - - onClick: function(/*Event*/ e){ - // summary: - // Handler for when the user clicks. - // tags: - // private - - // console.info('onClick',this._tryDesignModeOn); - this.onDisplayChanged(e); - }, - - _onIEMouseDown: function(){ - // summary: - // IE only to prevent 2 clicks to focus - // tags: - // protected - - if(!this.focused && !this.disabled){ - this.focus(); - } - }, - - _onBlur: function(e){ - // summary: - // Called from focus manager when focus has moved away from this editor - // tags: - // protected - - // console.info('_onBlur') - - this.inherited(arguments); - - var newValue = this.getValue(true); - if(newValue !== this.value){ - this.onChange(newValue); - } - this._set("value", newValue); - }, - - _onFocus: function(/*Event*/ e){ - // summary: - // Called from focus manager when focus has moved into this editor - // tags: - // protected - - // console.info('_onFocus') - if(!this.disabled){ - if(!this._disabledOK){ - this.set('disabled', false); - } - this.inherited(arguments); - } - }, - - // TODO: remove in 2.0 - blur: function(){ - // summary: - // Remove focus from this instance. - // tags: - // deprecated - if(!has("ie") && this.window.document.documentElement && this.window.document.documentElement.focus){ - this.window.document.documentElement.focus(); - }else if(this.ownerDocumentBody.focus){ - this.ownerDocumentBody.focus(); - } - }, - - focus: function(){ - // summary: - // Move focus to this editor - if(!this.isLoaded){ - this.focusOnLoad = true; - return; - } - if(this._cursorToStart){ - delete this._cursorToStart; - if(this.editNode.childNodes){ - this.placeCursorAtStart(); // this calls focus() so return - return; - } - } - if(!has("ie")){ - focus.focus(this.iframe); - }else if(this.editNode && this.editNode.focus){ - // editNode may be hidden in display:none div, lets just punt in this case - //this.editNode.focus(); -> causes IE to scroll always (strict and quirks mode) to the top the Iframe - // if we fire the event manually and let the browser handle the focusing, the latest - // cursor position is focused like in FF - this.iframe.fireEvent('onfocus', document.createEventObject()); // createEventObject only in IE - // }else{ - // TODO: should we throw here? - // console.debug("Have no idea how to focus into the editor!"); - } - }, - - // _lastUpdate: 0, - updateInterval: 200, - _updateTimer: null, - onDisplayChanged: function(/*Event*/ /*===== e =====*/){ - // summary: - // This event will be fired every time the display context - // changes and the result needs to be reflected in the UI. - // description: - // If you don't want to have update too often, - // onNormalizedDisplayChanged should be used instead - // tags: - // private - - // var _t=new Date(); - if(this._updateTimer){ - this._updateTimer.remove(); - } - this._updateTimer = this.defer("onNormalizedDisplayChanged", this.updateInterval); - - // Technically this should trigger a call to watch("value", ...) registered handlers, - // but getValue() is too slow to call on every keystroke so we don't. - }, - onNormalizedDisplayChanged: function(){ - // summary: - // This event is fired every updateInterval ms or more - // description: - // If something needs to happen immediately after a - // user change, please use onDisplayChanged instead. - // tags: - // private - delete this._updateTimer; - }, - onChange: function(/*===== newContent =====*/){ - // summary: - // This is fired if and only if the editor loses focus and - // the content is changed. - }, - _normalizeCommand: function(/*String*/ cmd, /*Anything?*/argument){ - // summary: - // Used as the advice function to map our - // normalized set of commands to those supported by the target - // browser. - // tags: - // private - - var command = cmd.toLowerCase(); - if(command === "formatblock"){ - if(has("safari") && argument === undefined){ command = "heading"; } - }else if(command === "hilitecolor" && !has("mozilla")){ - command = "backcolor"; - } - - return command; - }, - - _qcaCache: {}, - queryCommandAvailable: function(/*String*/ command){ - // summary: - // Tests whether a command is supported by the host. Clients - // SHOULD check whether a command is supported before attempting - // to use it, behaviour for unsupported commands is undefined. - // command: - // The command to test for - // tags: - // private - - // memoizing version. See _queryCommandAvailable for computing version - var ca = this._qcaCache[command]; - if(ca !== undefined){ return ca; } - return (this._qcaCache[command] = this._queryCommandAvailable(command)); - }, - - _queryCommandAvailable: function(/*String*/ command){ - // summary: - // See queryCommandAvailable(). - // tags: - // private - - var ie = 1; - var mozilla = 1 << 1; - var webkit = 1 << 2; - var opera = 1 << 3; - - function isSupportedBy(browsers){ - return { - ie: Boolean(browsers & ie), - mozilla: Boolean(browsers & mozilla), - webkit: Boolean(browsers & webkit), - opera: Boolean(browsers & opera) - }; - } - - var supportedBy = null; - - switch(command.toLowerCase()){ - case "bold": case "italic": case "underline": - case "subscript": case "superscript": - case "fontname": case "fontsize": - case "forecolor": case "hilitecolor": - case "justifycenter": case "justifyfull": case "justifyleft": - case "justifyright": case "delete": case "selectall": case "toggledir": - supportedBy = isSupportedBy(mozilla | ie | webkit | opera); - break; - - case "createlink": case "unlink": case "removeformat": - case "inserthorizontalrule": case "insertimage": - case "insertorderedlist": case "insertunorderedlist": - case "indent": case "outdent": case "formatblock": - case "inserthtml": case "undo": case "redo": case "strikethrough": case "tabindent": - supportedBy = isSupportedBy(mozilla | ie | opera | webkit); - break; - - case "blockdirltr": case "blockdirrtl": - case "dirltr": case "dirrtl": - case "inlinedirltr": case "inlinedirrtl": - supportedBy = isSupportedBy(ie); - break; - case "cut": case "copy": case "paste": - supportedBy = isSupportedBy( ie | mozilla | webkit | opera); - break; - - case "inserttable": - supportedBy = isSupportedBy(mozilla | ie); - break; - - case "insertcell": case "insertcol": case "insertrow": - case "deletecells": case "deletecols": case "deleterows": - case "mergecells": case "splitcell": - supportedBy = isSupportedBy(ie | mozilla); - break; - - default: return false; - } - - return (has("ie") && supportedBy.ie) || - (has("mozilla") && supportedBy.mozilla) || - (has("webkit") && supportedBy.webkit) || - (has("opera") && supportedBy.opera); // Boolean return true if the command is supported, false otherwise - }, - - execCommand: function(/*String*/ command, argument){ - // summary: - // Executes a command in the Rich Text area - // command: - // The command to execute - // argument: - // An optional argument to the command - // tags: - // protected - var returnValue; - - //focus() is required for IE to work - //In addition, focus() makes sure after the execution of - //the command, the editor receives the focus as expected - this.focus(); - - command = this._normalizeCommand(command, argument); - - if(argument !== undefined){ - if(command === "heading"){ - throw new Error("unimplemented"); - }else if((command === "formatblock") && has("ie")){ - argument = '<'+argument+'>'; - } - } - - //Check to see if we have any over-rides for commands, they will be functions on this - //widget of the form _commandImpl. If we don't, fall through to the basic native - //exec command of the browser. - var implFunc = "_" + command + "Impl"; - if(this[implFunc]){ - returnValue = this[implFunc](argument); - }else{ - argument = arguments.length > 1 ? argument : null; - if(argument || command !== "createlink"){ - returnValue = this.document.execCommand(command, false, argument); - } - } - - this.onDisplayChanged(); - return returnValue; - }, - - queryCommandEnabled: function(/*String*/ command){ - // summary: - // Check whether a command is enabled or not. - // command: - // The command to execute - // tags: - // protected - if(this.disabled || !this._disabledOK){ return false; } - - command = this._normalizeCommand(command); - - //Check to see if we have any over-rides for commands, they will be functions on this - //widget of the form _commandEnabledImpl. If we don't, fall through to the basic native - //command of the browser. - var implFunc = "_" + command + "EnabledImpl"; - - if(this[implFunc]){ - return this[implFunc](command); - }else{ - return this._browserQueryCommandEnabled(command); - } - }, - - queryCommandState: function(command){ - // summary: - // Check the state of a given command and returns true or false. - // tags: - // protected - - if(this.disabled || !this._disabledOK){ return false; } - command = this._normalizeCommand(command); - try{ - return this.document.queryCommandState(command); - }catch(e){ - //Squelch, occurs if editor is hidden on FF 3 (and maybe others.) - return false; - } - }, - - queryCommandValue: function(command){ - // summary: - // Check the value of a given command. This matters most for - // custom selections and complex values like font value setting. - // tags: - // protected - - if(this.disabled || !this._disabledOK){ return false; } - var r; - command = this._normalizeCommand(command); - if(has("ie") && command === "formatblock"){ - r = this._native2LocalFormatNames[this.document.queryCommandValue(command)]; - }else if(has("mozilla") && command === "hilitecolor"){ - var oldValue; - try{ - oldValue = this.document.queryCommandValue("styleWithCSS"); - }catch(e){ - oldValue = false; - } - this.document.execCommand("styleWithCSS", false, true); - r = this.document.queryCommandValue(command); - this.document.execCommand("styleWithCSS", false, oldValue); - }else{ - r = this.document.queryCommandValue(command); - } - return r; - }, - - // Misc. - - _sCall: function(name, args){ - // summary: - // Run the named method of dijit/_editor/selection over the - // current editor instance's window, with the passed args. - // tags: - // private - return win.withGlobal(this.window, name, selectionapi, args); - }, - - // FIXME: this is a TON of code duplication. Why? - - placeCursorAtStart: function(){ - // summary: - // Place the cursor at the start of the editing area. - // tags: - // private - - this.focus(); - - //see comments in placeCursorAtEnd - var isvalid=false; - if(has("mozilla")){ - // TODO: Is this branch even necessary? - var first=this.editNode.firstChild; - while(first){ - if(first.nodeType === 3){ - if(first.nodeValue.replace(/^\s+|\s+$/g, "").length>0){ - isvalid=true; - this._sCall("selectElement", [ first ]); - break; - } - }else if(first.nodeType === 1){ - isvalid=true; - var tg = first.tagName ? first.tagName.toLowerCase() : ""; - // Collapse before childless tags. - if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){ - this._sCall("selectElement", [ first ]); - }else{ - // Collapse inside tags with children. - this._sCall("selectElementChildren", [ first ]); - } - break; - } - first = first.nextSibling; - } - }else{ - isvalid=true; - this._sCall("selectElementChildren", [ this.editNode ]); - } - if(isvalid){ - this._sCall("collapse", [ true ]); - } - }, - - placeCursorAtEnd: function(){ - // summary: - // Place the cursor at the end of the editing area. - // tags: - // private - - this.focus(); - - //In mozilla, if last child is not a text node, we have to use - // selectElementChildren on this.editNode.lastChild otherwise the - // cursor would be placed at the end of the closing tag of - //this.editNode.lastChild - var isvalid=false; - if(has("mozilla")){ - var last=this.editNode.lastChild; - while(last){ - if(last.nodeType === 3){ - if(last.nodeValue.replace(/^\s+|\s+$/g, "").length>0){ - isvalid=true; - this._sCall("selectElement", [ last ]); - break; - } - }else if(last.nodeType === 1){ - isvalid=true; - this._sCall("selectElement", [ last.lastChild || last]); - break; - } - last = last.previousSibling; - } - }else{ - isvalid=true; - this._sCall("selectElementChildren", [ this.editNode ]); - } - if(isvalid){ - this._sCall("collapse", [ false ]); - } - }, - - getValue: function(/*Boolean?*/ nonDestructive){ - // summary: - // Return the current content of the editing area (post filters - // are applied). Users should call get('value') instead. - // nonDestructive: - // defaults to false. Should the post-filtering be run over a copy - // of the live DOM? Most users should pass "true" here unless they - // *really* know that none of the installed filters are going to - // mess up the editing session. - // tags: - // private - if(this.textarea){ - if(this.isClosed || !this.isLoaded){ - return this.textarea.value; - } - } - - return this._postFilterContent(null, nonDestructive); - }, - _getValueAttr: function(){ - // summary: - // Hook to make attr("value") work - return this.getValue(true); - }, - - setValue: function(/*String*/ html){ - // summary: - // This function sets the content. No undo history is preserved. - // Users should use set('value', ...) instead. - // tags: - // deprecated - - // TODO: remove this and getValue() for 2.0, and move code to _setValueAttr() - - if(!this.isLoaded){ - // try again after the editor is finished loading - this.onLoadDeferred.then(lang.hitch(this, function(){ - this.setValue(html); - })); - return; - } - this._cursorToStart = true; - if(this.textarea && (this.isClosed || !this.isLoaded)){ - this.textarea.value=html; - }else{ - html = this._preFilterContent(html); - var node = this.isClosed ? this.domNode : this.editNode; - if(html && has("mozilla") && html.toLowerCase() === "<p></p>"){ - html = "<p> </p>"; // - } - - // Use to avoid webkit problems where editor is disabled until the user clicks it - if(!html && has("webkit")){ - html = " "; // - } - node.innerHTML = html; - this._preDomFilterContent(node); - } - - this.onDisplayChanged(); - this._set("value", this.getValue(true)); - }, - - replaceValue: function(/*String*/ html){ - // summary: - // This function set the content while trying to maintain the undo stack - // (now only works fine with Moz, this is identical to setValue in all - // other browsers) - // tags: - // protected - - if(this.isClosed){ - this.setValue(html); - }else if(this.window && this.window.getSelection && !has("mozilla")){ // Safari - // look ma! it's a totally f'd browser! - this.setValue(html); - }else if(this.window && this.window.getSelection){ // Moz - html = this._preFilterContent(html); - this.execCommand("selectall"); - if(!html){ - this._cursorToStart = true; - html = " "; // - } - this.execCommand("inserthtml", html); - this._preDomFilterContent(this.editNode); - }else if(this.document && this.document.selection){//IE - //In IE, when the first element is not a text node, say - //an <a> tag, when replacing the content of the editing - //area, the <a> tag will be around all the content - //so for now, use setValue for IE too - this.setValue(html); - } - - this._set("value", this.getValue(true)); - }, - - _preFilterContent: function(/*String*/ html){ - // summary: - // Filter the input before setting the content of the editing - // area. DOM pre-filtering may happen after this - // string-based filtering takes place but as of 1.2, this is not - // guaranteed for operations such as the inserthtml command. - // tags: - // private - - var ec = html; - array.forEach(this.contentPreFilters, function(ef){ if(ef){ ec = ef(ec); } }); - return ec; - }, - _preDomFilterContent: function(/*DomNode*/ dom){ - // summary: - // filter the input's live DOM. All filter operations should be - // considered to be "live" and operating on the DOM that the user - // will be interacting with in their editing session. - // tags: - // private - dom = dom || this.editNode; - array.forEach(this.contentDomPreFilters, function(ef){ - if(ef && lang.isFunction(ef)){ - ef(dom); - } - }, this); - }, - - _postFilterContent: function( - /*DomNode|DomNode[]|String?*/ dom, - /*Boolean?*/ nonDestructive){ - // summary: - // filter the output after getting the content of the editing area - // - // description: - // post-filtering allows plug-ins and users to specify any number - // of transforms over the editor's content, enabling many common - // use-cases such as transforming absolute to relative URLs (and - // vice-versa), ensuring conformance with a particular DTD, etc. - // The filters are registered in the contentDomPostFilters and - // contentPostFilters arrays. Each item in the - // contentDomPostFilters array is a function which takes a DOM - // Node or array of nodes as its only argument and returns the - // same. It is then passed down the chain for further filtering. - // The contentPostFilters array behaves the same way, except each - // member operates on strings. Together, the DOM and string-based - // filtering allow the full range of post-processing that should - // be necessaray to enable even the most agressive of post-editing - // conversions to take place. - // - // If nonDestructive is set to "true", the nodes are cloned before - // filtering proceeds to avoid potentially destructive transforms - // to the content which may still needed to be edited further. - // Once DOM filtering has taken place, the serialized version of - // the DOM which is passed is run through each of the - // contentPostFilters functions. - // - // dom: - // a node, set of nodes, which to filter using each of the current - // members of the contentDomPostFilters and contentPostFilters arrays. - // - // nonDestructive: - // defaults to "false". If true, ensures that filtering happens on - // a clone of the passed-in content and not the actual node - // itself. - // - // tags: - // private - - var ec; - if(!lang.isString(dom)){ - dom = dom || this.editNode; - if(this.contentDomPostFilters.length){ - if(nonDestructive){ - dom = lang.clone(dom); - } - array.forEach(this.contentDomPostFilters, function(ef){ - dom = ef(dom); - }); - } - ec = htmlapi.getChildrenHtml(dom); - }else{ - ec = dom; - } - - if(!lang.trim(ec.replace(/^\xA0\xA0*/, '').replace(/\xA0\xA0*$/, '')).length){ - ec = ""; - } - - // if(has("ie")){ - // //removing appended <P> </P> for IE - // ec = ec.replace(/(?:<p> </p>[\n\r]*)+$/i,""); - // } - array.forEach(this.contentPostFilters, function(ef){ - ec = ef(ec); - }); - - return ec; - }, - - _saveContent: function(){ - // summary: - // Saves the content in an onunload event if the editor has not been closed - // tags: - // private - - var saveTextarea = dom.byId(dijit._scopeName + "._editor.RichText.value"); - if(saveTextarea){ - if(saveTextarea.value){ - saveTextarea.value += this._SEPARATOR; - } - saveTextarea.value += this.name + this._NAME_CONTENT_SEP + this.getValue(true); - } - }, - - - escapeXml: function(/*String*/ str, /*Boolean*/ noSingleQuotes){ - // summary: - // Adds escape sequences for special characters in XML. - // Optionally skips escapes for single quotes - // tags: - // private - - str = str.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """); - if(!noSingleQuotes){ - str = str.replace(/'/gm, "'"); - } - return str; // string - }, - - getNodeHtml: function(/* DomNode */ node){ - // summary: - // Deprecated. Use dijit/_editor/html::_getNodeHtml() instead. - // tags: - // deprecated - kernel.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit/_editor/html::getNodeHtml instead', 2); - return htmlapi.getNodeHtml(node); // String - }, - - getNodeChildrenHtml: function(/* DomNode */ dom){ - // summary: - // Deprecated. Use dijit/_editor/html::getChildrenHtml() instead. - // tags: - // deprecated - kernel.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit/_editor/html::getChildrenHtml instead', 2); - return htmlapi.getChildrenHtml(dom); - }, - - close: function(/*Boolean?*/ save){ - // summary: - // Kills the editor and optionally writes back the modified contents to the - // element from which it originated. - // save: - // Whether or not to save the changes. If false, the changes are discarded. - // tags: - // private - - if(this.isClosed){ return; } - - if(!arguments.length){ save = true; } - if(save){ - this._set("value", this.getValue(true)); - } - - // line height is squashed for iframes - // FIXME: why was this here? if(this.iframe){ this.domNode.style.lineHeight = null; } - - if(this.interval){ clearInterval(this.interval); } - - if(this._webkitListener){ - //Cleaup of WebKit fix: #9532 - this.disconnect(this._webkitListener); - delete this._webkitListener; - } - - // Guard against memory leaks on IE (see #9268) - if(has("ie")){ - this.iframe.onfocus = null; - } - this.iframe._loadFunc = null; - - if(this._iframeRegHandle){ - this._iframeRegHandle.remove(); - delete this._iframeRegHandle; - } - - if(this.textarea){ - var s = this.textarea.style; - s.position = ""; - s.left = s.top = ""; - if(has("ie")){ - s.overflow = this.__overflow; - this.__overflow = null; - } - this.textarea.value = this.value; - domConstruct.destroy(this.domNode); - this.domNode = this.textarea; - }else{ - // Note that this destroys the iframe - this.domNode.innerHTML = this.value; - } - delete this.iframe; - - domClass.remove(this.domNode, this.baseClass); - this.isClosed = true; - this.isLoaded = false; - - delete this.editNode; - delete this.focusNode; - - if(this.window && this.window._frameElement){ - this.window._frameElement = null; - } - - this.window = null; - this.document = null; - this.editingArea = null; - this.editorObject = null; - }, - - destroy: function(){ - if(!this.isClosed){ this.close(false); } - if(this._updateTimer){ - this._updateTimer.remove(); - } - this.inherited(arguments); - if(RichText._globalSaveHandler){ - delete RichText._globalSaveHandler[this.id]; - } - }, - - _removeMozBogus: function(/* String */ html){ - // summary: - // Post filter to remove unwanted HTML attributes generated by mozilla - // tags: - // private - return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, '').replace(/_moz_resizing="(true|false)"/gi,''); // String - }, - _removeWebkitBogus: function(/* String */ html){ - // summary: - // Post filter to remove unwanted HTML attributes generated by webkit - // tags: - // private - html = html.replace(/\sclass="webkit-block-placeholder"/gi, ''); - html = html.replace(/\sclass="apple-style-span"/gi, ''); - // For some reason copy/paste sometime adds extra meta tags for charset on - // webkit (chrome) on mac.They need to be removed. See: #12007" - html = html.replace(/<meta charset=\"utf-8\" \/>/gi, ''); - return html; // String - }, - _normalizeFontStyle: function(/* String */ html){ - // summary: - // Convert 'strong' and 'em' to 'b' and 'i'. - // description: - // Moz can not handle strong/em tags correctly, so to help - // mozilla and also to normalize output, convert them to 'b' and 'i'. - // - // Note the IE generates 'strong' and 'em' rather than 'b' and 'i' - // tags: - // private - return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2') - .replace(/<(\/)?em([ \>])/gi, '<$1i$2' ); // String - }, - - _preFixUrlAttributes: function(/* String */ html){ - // summary: - // Pre-filter to do fixing to href attributes on `<a>` and `<img>` tags - // tags: - // private - return html.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi, - '$1$4$2$3$5$2 _djrealurl=$2$3$5$2') - .replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi, - '$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String - }, - - /***************************************************************************** - The following functions implement HTML manipulation commands for various - browser/contentEditable implementations. The goal of them is to enforce - standard behaviors of them. - ******************************************************************************/ - - /*** queryCommandEnabled implementations ***/ - - _browserQueryCommandEnabled: function(command){ - // summary: - // Implementation to call to the native queryCommandEnabled of the browser. - // command: - // The command to check. - // tags: - // protected - if(!command) { return false; } - var elem = has("ie") ? this.document.selection.createRange() : this.document; - try{ - return elem.queryCommandEnabled(command); - }catch(e){ - return false; - } - }, - - _createlinkEnabledImpl: function(/*===== argument =====*/){ - // summary: - // This function implements the test for if the create link - // command should be enabled or not. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var enabled = true; - if(has("opera")){ - var sel = this.window.getSelection(); - if(sel.isCollapsed){ - enabled = true; - }else{ - enabled = this.document.queryCommandEnabled("createlink"); - } - }else{ - enabled = this._browserQueryCommandEnabled("createlink"); - } - return enabled; - }, - - _unlinkEnabledImpl: function(/*===== argument =====*/){ - // summary: - // This function implements the test for if the unlink - // command should be enabled or not. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var enabled = true; - if(has("mozilla") || has("webkit")){ - enabled = this._sCall("hasAncestorElement", ["a"]); - }else{ - enabled = this._browserQueryCommandEnabled("unlink"); - } - return enabled; - }, - - _inserttableEnabledImpl: function(/*===== argument =====*/){ - // summary: - // This function implements the test for if the inserttable - // command should be enabled or not. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var enabled = true; - if(has("mozilla") || has("webkit")){ - enabled = true; - }else{ - enabled = this._browserQueryCommandEnabled("inserttable"); - } - return enabled; - }, - - _cutEnabledImpl: function(/*===== argument =====*/){ - // summary: - // This function implements the test for if the cut - // command should be enabled or not. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var enabled = true; - if(has("webkit")){ - // WebKit deems clipboard activity as a security threat and natively would return false - var sel = this.window.getSelection(); - if(sel){ sel = sel.toString(); } - enabled = !!sel; - }else{ - enabled = this._browserQueryCommandEnabled("cut"); - } - return enabled; - }, - - _copyEnabledImpl: function(/*===== argument =====*/){ - // summary: - // This function implements the test for if the copy - // command should be enabled or not. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var enabled = true; - if(has("webkit")){ - // WebKit deems clipboard activity as a security threat and natively would return false - var sel = this.window.getSelection(); - if(sel){ sel = sel.toString(); } - enabled = !!sel; - }else{ - enabled = this._browserQueryCommandEnabled("copy"); - } - return enabled; - }, - - _pasteEnabledImpl: function(/*===== argument =====*/){ - // summary:c - // This function implements the test for if the paste - // command should be enabled or not. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var enabled = true; - if(has("webkit")){ - return true; - }else{ - enabled = this._browserQueryCommandEnabled("paste"); - } - return enabled; - }, - - /*** execCommand implementations ***/ - - _inserthorizontalruleImpl: function(argument){ - // summary: - // This function implements the insertion of HTML 'HR' tags. - // into a point on the page. IE doesn't to it right, so - // we have to use an alternate form - // argument: - // arguments to the exec command, if any. - // tags: - // protected - if(has("ie")){ - return this._inserthtmlImpl("<hr>"); - } - return this.document.execCommand("inserthorizontalrule", false, argument); - }, - - _unlinkImpl: function(argument){ - // summary: - // This function implements the unlink of an 'a' tag. - // argument: - // arguments to the exec command, if any. - // tags: - // protected - if((this.queryCommandEnabled("unlink")) && (has("mozilla") || has("webkit"))){ - var a = this._sCall("getAncestorElement", [ "a" ]); - this._sCall("selectElement", [ a ]); - return this.document.execCommand("unlink", false, null); - } - return this.document.execCommand("unlink", false, argument); - }, - - _hilitecolorImpl: function(argument){ - // summary: - // This function implements the hilitecolor command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var returnValue; - var isApplied = this._handleTextColorOrProperties("hilitecolor", argument); - if(!isApplied){ - if(has("mozilla")){ - // mozilla doesn't support hilitecolor properly when useCSS is - // set to false (bugzilla #279330) - this.document.execCommand("styleWithCSS", false, true); - console.log("Executing color command."); - returnValue = this.document.execCommand("hilitecolor", false, argument); - this.document.execCommand("styleWithCSS", false, false); - }else{ - returnValue = this.document.execCommand("hilitecolor", false, argument); - } - } - return returnValue; - }, - - _backcolorImpl: function(argument){ - // summary: - // This function implements the backcolor command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - if(has("ie")){ - // Tested under IE 6 XP2, no problem here, comment out - // IE weirdly collapses ranges when we exec these commands, so prevent it - // var tr = this.document.selection.createRange(); - argument = argument ? argument : null; - } - var isApplied = this._handleTextColorOrProperties("backcolor", argument); - if(!isApplied){ - isApplied = this.document.execCommand("backcolor", false, argument); - } - return isApplied; - }, - - _forecolorImpl: function(argument){ - // summary: - // This function implements the forecolor command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - if(has("ie")){ - // Tested under IE 6 XP2, no problem here, comment out - // IE weirdly collapses ranges when we exec these commands, so prevent it - // var tr = this.document.selection.createRange(); - argument = argument? argument : null; - } - var isApplied = false; - isApplied = this._handleTextColorOrProperties("forecolor", argument); - if(!isApplied){ - isApplied = this.document.execCommand("forecolor", false, argument); - } - return isApplied; - }, - - _inserthtmlImpl: function(argument){ - // summary: - // This function implements the insertion of HTML content into - // a point on the page. - // argument: - // The content to insert, if any. - // tags: - // protected - argument = this._preFilterContent(argument); - var rv = true; - if(has("ie")){ - var insertRange = this.document.selection.createRange(); - if(this.document.selection.type.toUpperCase() === 'CONTROL'){ - var n=insertRange.item(0); - while(insertRange.length){ - insertRange.remove(insertRange.item(0)); - } - n.outerHTML=argument; - }else{ - insertRange.pasteHTML(argument); - } - insertRange.select(); - //insertRange.collapse(true); - }else if(has("mozilla") && !argument.length){ - //mozilla can not inserthtml an empty html to delete current selection - //so we delete the selection instead in this case - this._sCall("remove"); // FIXME - }else{ - rv = this.document.execCommand("inserthtml", false, argument); - } - return rv; - }, - - _boldImpl: function(argument){ - // summary: - // This function implements an over-ride of the bold command. - // argument: - // Not used, operates by selection. - // tags: - // protected - var applied = false; - if(has("ie")){ - this._adaptIESelection(); - applied = this._adaptIEFormatAreaAndExec("bold"); - } - if(!applied){ - applied = this.document.execCommand("bold", false, argument); - } - return applied; - }, - - _italicImpl: function(argument){ - // summary: - // This function implements an over-ride of the italic command. - // argument: - // Not used, operates by selection. - // tags: - // protected - var applied = false; - if(has("ie")){ - this._adaptIESelection(); - applied = this._adaptIEFormatAreaAndExec("italic"); - } - if(!applied){ - applied = this.document.execCommand("italic", false, argument); - } - return applied; - }, - - _underlineImpl: function(argument){ - // summary: - // This function implements an over-ride of the underline command. - // argument: - // Not used, operates by selection. - // tags: - // protected - var applied = false; - if(has("ie")){ - this._adaptIESelection(); - applied = this._adaptIEFormatAreaAndExec("underline"); - } - if(!applied){ - applied = this.document.execCommand("underline", false, argument); - } - return applied; - }, - - _strikethroughImpl: function(argument){ - // summary: - // This function implements an over-ride of the strikethrough command. - // argument: - // Not used, operates by selection. - // tags: - // protected - var applied = false; - if(has("ie")){ - this._adaptIESelection(); - applied = this._adaptIEFormatAreaAndExec("strikethrough"); - } - if(!applied){ - applied = this.document.execCommand("strikethrough", false, argument); - } - return applied; - }, - - _superscriptImpl: function(argument){ - // summary: - // This function implements an over-ride of the superscript command. - // argument: - // Not used, operates by selection. - // tags: - // protected - var applied = false; - if(has("ie")){ - this._adaptIESelection(); - applied = this._adaptIEFormatAreaAndExec("superscript"); - } - if(!applied){ - applied = this.document.execCommand("superscript", false, argument); - } - return applied; - }, - - _subscriptImpl: function(argument){ - // summary: - // This function implements an over-ride of the superscript command. - // argument: - // Not used, operates by selection. - // tags: - // protected - var applied = false; - if(has("ie")){ - this._adaptIESelection(); - applied = this._adaptIEFormatAreaAndExec("subscript"); - - } - if(!applied){ - applied = this.document.execCommand("subscript", false, argument); - } - return applied; - }, - - _fontnameImpl: function(argument){ - // summary: - // This function implements the fontname command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var isApplied; - if(has("ie")){ - isApplied = this._handleTextColorOrProperties("fontname", argument); - } - if(!isApplied){ - isApplied = this.document.execCommand("fontname", false, argument); - } - return isApplied; - }, - - _fontsizeImpl: function(argument){ - // summary: - // This function implements the fontsize command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var isApplied; - if(has("ie")){ - isApplied = this._handleTextColorOrProperties("fontsize", argument); - } - if(!isApplied){ - isApplied = this.document.execCommand("fontsize", false, argument); - } - return isApplied; - }, - - _insertorderedlistImpl: function(argument){ - // summary: - // This function implements the insertorderedlist command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var applied = false; - if(has("ie")){ - applied = this._adaptIEList("insertorderedlist", argument); - } - if(!applied){ - applied = this.document.execCommand("insertorderedlist", false, argument); - } - return applied; - }, - - _insertunorderedlistImpl: function(argument){ - // summary: - // This function implements the insertunorderedlist command - // argument: - // arguments to the exec command, if any. - // tags: - // protected - var applied = false; - if(has("ie")){ - applied = this._adaptIEList("insertunorderedlist", argument); - } - if(!applied){ - applied = this.document.execCommand("insertunorderedlist", false, argument); - } - return applied; - }, - - getHeaderHeight: function(){ - // summary: - // A function for obtaining the height of the header node - return this._getNodeChildrenHeight(this.header); // Number - }, - - getFooterHeight: function(){ - // summary: - // A function for obtaining the height of the footer node - return this._getNodeChildrenHeight(this.footer); // Number - }, - - _getNodeChildrenHeight: function(node){ - // summary: - // An internal function for computing the cumulative height of all child nodes of 'node' - // node: - // The node to process the children of; - var h = 0; - if(node && node.childNodes){ - // IE didn't compute it right when position was obtained on the node directly is some cases, - // so we have to walk over all the children manually. - var i; - for(i = 0; i < node.childNodes.length; i++){ - var size = domGeometry.position(node.childNodes[i]); - h += size.h; - } - } - return h; // Number - }, - - _isNodeEmpty: function(node, startOffset){ - // summary: - // Function to test if a node is devoid of real content. - // node: - // The node to check. - // tags: - // private. - if(node.nodeType === 1/*element*/){ - if(node.childNodes.length > 0){ - return this._isNodeEmpty(node.childNodes[0], startOffset); - } - return true; - }else if(node.nodeType === 3/*text*/){ - return (node.nodeValue.substring(startOffset) === ""); - } - return false; - }, - - _removeStartingRangeFromRange: function(node, range){ - // summary: - // Function to adjust selection range by removing the current - // start node. - // node: - // The node to remove from the starting range. - // range: - // The range to adapt. - // tags: - // private - if(node.nextSibling){ - range.setStart(node.nextSibling,0); - }else{ - var parent = node.parentNode; - while(parent && parent.nextSibling == null){ - //move up the tree until we find a parent that has another node, that node will be the next node - parent = parent.parentNode; - } - if(parent){ - range.setStart(parent.nextSibling,0); - } - } - return range; - }, - - _adaptIESelection: function(){ - // summary: - // Function to adapt the IE range by removing leading 'newlines' - // Needed to fix issue with bold/italics/underline not working if - // range included leading 'newlines'. - // In IE, if a user starts a selection at the very end of a line, - // then the native browser commands will fail to execute correctly. - // To work around the issue, we can remove all empty nodes from - // the start of the range selection. - var selection = rangeapi.getSelection(this.window); - if(selection && selection.rangeCount && !selection.isCollapsed){ - var range = selection.getRangeAt(0); - var firstNode = range.startContainer; - var startOffset = range.startOffset; - - while(firstNode.nodeType === 3/*text*/ && startOffset >= firstNode.length && firstNode.nextSibling){ - //traverse the text nodes until we get to the one that is actually highlighted - startOffset = startOffset - firstNode.length; - firstNode = firstNode.nextSibling; - } - - //Remove the starting ranges until the range does not start with an empty node. - var lastNode=null; - while(this._isNodeEmpty(firstNode, startOffset) && firstNode !== lastNode){ - lastNode =firstNode; //this will break the loop in case we can't find the next sibling - range = this._removeStartingRangeFromRange(firstNode, range); //move the start container to the next node in the range - firstNode = range.startContainer; - startOffset = 0; //start at the beginning of the new starting range - } - selection.removeAllRanges();// this will work as long as users cannot select multiple ranges. I have not been able to do that in the editor. - selection.addRange(range); - } - }, - - _adaptIEFormatAreaAndExec: function(command){ - // summary: - // Function to handle IE's quirkiness regarding how it handles - // format commands on a word. This involves a lit of node splitting - // and format cloning. - // command: - // The format command, needed to check if the desired - // command is true or not. - var selection = rangeapi.getSelection(this.window); - var doc = this.document; - var rs, ret, range, txt, startNode, endNode, breaker, sNode; - if(command && selection && selection.isCollapsed){ - var isApplied = this.queryCommandValue(command); - if(isApplied){ - - // We have to split backwards until we hit the format - var nNames = this._tagNamesForCommand(command); - range = selection.getRangeAt(0); - var fs = range.startContainer; - if(fs.nodeType === 3){ - var offset = range.endOffset; - if(fs.length < offset){ - //We are not looking from the right node, try to locate the correct one - ret = this._adjustNodeAndOffset(rs, offset); - fs = ret.node; - offset = ret.offset; - } - } - var topNode; - while(fs && fs !== this.editNode){ - // We have to walk back and see if this is still a format or not. - // Hm, how do I do this? - var tName = fs.tagName? fs.tagName.toLowerCase() : ""; - if(array.indexOf(nNames, tName) > -1){ - topNode = fs; - break; - } - fs = fs.parentNode; - } - - // Okay, we have a stopping place, time to split things apart. - if(topNode){ - // Okay, we know how far we have to split backwards, so we have to split now. - rs = range.startContainer; - var newblock = doc.createElement(topNode.tagName); - domConstruct.place(newblock, topNode, "after"); - if(rs && rs.nodeType === 3){ - // Text node, we have to split it. - var nodeToMove, tNode; - var endOffset = range.endOffset; - if(rs.length < endOffset){ - //We are not splitting the right node, try to locate the correct one - ret = this._adjustNodeAndOffset(rs, endOffset); - rs = ret.node; - endOffset = ret.offset; - } - - txt = rs.nodeValue; - startNode = doc.createTextNode(txt.substring(0, endOffset)); - var endText = txt.substring(endOffset, txt.length); - if(endText){ - endNode = doc.createTextNode(endText); - } - // Place the split, then remove original nodes. - domConstruct.place(startNode, rs, "before"); - if(endNode){ - breaker = doc.createElement("span"); - breaker.className = "ieFormatBreakerSpan"; - domConstruct.place(breaker, rs, "after"); - domConstruct.place(endNode, breaker, "after"); - endNode = breaker; - } - domConstruct.destroy(rs); - - // Okay, we split the text. Now we need to see if we're - // parented to the block element we're splitting and if - // not, we have to split all the way up. Ugh. - var parentC = startNode.parentNode; - var tagList = []; - var tagData; - while(parentC !== topNode){ - var tg = parentC.tagName; - tagData = {tagName: tg}; - tagList.push(tagData); - - var newTg = doc.createElement(tg); - // Clone over any 'style' data. - if(parentC.style){ - if(newTg.style){ - if(parentC.style.cssText){ - newTg.style.cssText = parentC.style.cssText; - tagData.cssText = parentC.style.cssText; - } - } - } - // If font also need to clone over any font data. - if(parentC.tagName === "FONT"){ - if(parentC.color){ - newTg.color = parentC.color; - tagData.color = parentC.color; - } - if(parentC.face){ - newTg.face = parentC.face; - tagData.face = parentC.face; - } - if(parentC.size){ // this check was necessary on IE - newTg.size = parentC.size; - tagData.size = parentC.size; - } - } - if(parentC.className){ - newTg.className = parentC.className; - tagData.className = parentC.className; - } - - // Now move end node and every sibling - // after it over into the new tag. - if(endNode){ - nodeToMove = endNode; - while(nodeToMove){ - tNode = nodeToMove.nextSibling; - newTg.appendChild(nodeToMove); - nodeToMove = tNode; - } - } - if(newTg.tagName == parentC.tagName){ - breaker = doc.createElement("span"); - breaker.className = "ieFormatBreakerSpan"; - domConstruct.place(breaker, parentC, "after"); - domConstruct.place(newTg, breaker, "after"); - }else{ - domConstruct.place(newTg, parentC, "after"); - } - startNode = parentC; - endNode = newTg; - parentC = parentC.parentNode; - } - - // Lastly, move the split out all the split tags - // to the new block as they should now be split properly. - if(endNode){ - nodeToMove = endNode; - if(nodeToMove.nodeType === 1 || (nodeToMove.nodeType === 3 && nodeToMove.nodeValue)){ - // Non-blank text and non-text nodes need to clear out that blank space - // before moving the contents. - newblock.innerHTML = ""; - } - while(nodeToMove){ - tNode = nodeToMove.nextSibling; - newblock.appendChild(nodeToMove); - nodeToMove = tNode; - } - } - - // We had intermediate tags, we have to now recreate them inbetween the split - // and restore what styles, classnames, etc, we can. - var newrange; - if(tagList.length){ - tagData = tagList.pop(); - var newContTag = doc.createElement(tagData.tagName); - if(tagData.cssText && newContTag.style){ - newContTag.style.cssText = tagData.cssText; - } - if(tagData.className){ - newContTag.className = tagData.className; - } - if(tagData.tagName === "FONT"){ - if(tagData.color){ - newContTag.color = tagData.color; - } - if(tagData.face){ - newContTag.face = tagData.face; - } - if(tagData.size){ - newContTag.size = tagData.size; - } - } - domConstruct.place(newContTag, newblock, "before"); - while(tagList.length){ - tagData = tagList.pop(); - var newTgNode = doc.createElement(tagData.tagName); - if(tagData.cssText && newTgNode.style){ - newTgNode.style.cssText = tagData.cssText; - } - if(tagData.className){ - newTgNode.className = tagData.className; - } - if(tagData.tagName === "FONT"){ - if(tagData.color){ - newTgNode.color = tagData.color; - } - if(tagData.face){ - newTgNode.face = tagData.face; - } - if(tagData.size){ - newTgNode.size = tagData.size; - } - } - newContTag.appendChild(newTgNode); - newContTag = newTgNode; - } - - // Okay, everything is theoretically split apart and removed from the content - // so insert the dummy text to select, select it, then - // clear to position cursor. - sNode = doc.createTextNode("."); - breaker.appendChild(sNode); - newContTag.appendChild(sNode); - newrange = rangeapi.create(this.window); - newrange.setStart(sNode, 0); - newrange.setEnd(sNode, sNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - this._sCall("collapse", [false]); - sNode.parentNode.innerHTML = ""; - }else{ - // No extra tags, so we have to insert a breaker point and rely - // on filters to remove it later. - breaker = doc.createElement("span"); - breaker.className="ieFormatBreakerSpan"; - sNode = doc.createTextNode("."); - breaker.appendChild(sNode); - domConstruct.place(breaker, newblock, "before"); - newrange = rangeapi.create(this.window); - newrange.setStart(sNode, 0); - newrange.setEnd(sNode, sNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - this._sCall("collapse", [false]); - sNode.parentNode.innerHTML = ""; - } - if(!newblock.firstChild){ - // Empty, we don't need it. Split was at end or similar - // So, remove it. - domConstruct.destroy(newblock); - } - return true; - } - } - return false; - }else{ - range = selection.getRangeAt(0); - rs = range.startContainer; - if(rs && rs.nodeType === 3){ - // Text node, we have to split it. - var offset = range.startOffset; - if(rs.length < offset){ - //We are not splitting the right node, try to locate the correct one - ret = this._adjustNodeAndOffset(rs, offset); - rs = ret.node; - offset = ret.offset; - } - txt = rs.nodeValue; - startNode = doc.createTextNode(txt.substring(0, offset)); - var endText = txt.substring(offset); - if(endText !== ""){ - endNode = doc.createTextNode(txt.substring(offset)); - } - // Create a space, we'll select and bold it, so - // the whole word doesn't get bolded - breaker = doc.createElement("span"); - sNode = doc.createTextNode("."); - breaker.appendChild(sNode); - if(startNode.length){ - domConstruct.place(startNode, rs, "after"); - }else{ - startNode = rs; - } - domConstruct.place(breaker, startNode, "after"); - if(endNode){ - domConstruct.place(endNode, breaker, "after"); - } - domConstruct.destroy(rs); - var newrange = rangeapi.create(this.window); - newrange.setStart(sNode, 0); - newrange.setEnd(sNode, sNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - doc.execCommand(command); - domConstruct.place(breaker.firstChild, breaker, "before"); - domConstruct.destroy(breaker); - newrange.setStart(sNode, 0); - newrange.setEnd(sNode, sNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - this._sCall("collapse", [false]); - sNode.parentNode.innerHTML = ""; - return true; - } - } - }else{ - return false; - } - }, - - _adaptIEList: function(command /*===== , argument =====*/){ - // summary: - // This function handles normalizing the IE list behavior as - // much as possible. - // command: - // The list command to execute. - // argument: - // Any additional argument. - // tags: - // private - var selection = rangeapi.getSelection(this.window); - if(selection.isCollapsed){ - // In the case of no selection, lets commonize the behavior and - // make sure that it indents if needed. - if(selection.rangeCount && !this.queryCommandValue(command)){ - var range = selection.getRangeAt(0); - var sc = range.startContainer; - if(sc && sc.nodeType == 3){ - // text node. Lets see if there is a node before it that isn't - // some sort of breaker. - if(!range.startOffset){ - // We're at the beginning of a text area. It may have been br split - // Who knows? In any event, we must create the list manually - // or IE may shove too much into the list element. It seems to - // grab content before the text node too if it's br split. - // Why can't IE work like everyone else? - - // Create a space, we'll select and bold it, so - // the whole word doesn't get bolded - var lType = "ul"; - if(command === "insertorderedlist"){ - lType = "ol"; - } - var list = this.document.createElement(lType); - var li = domConstruct.create("li", null, list); - domConstruct.place(list, sc, "before"); - // Move in the text node as part of the li. - li.appendChild(sc); - // We need a br after it or the enter key handler - // sometimes throws errors. - domConstruct.create("br", null, list, "after"); - // Okay, now lets move our cursor to the beginning. - var newrange = rangeapi.create(this.window); - newrange.setStart(sc, 0); - newrange.setEnd(sc, sc.length); - selection.removeAllRanges(); - selection.addRange(newrange); - this._sCall("collapse", [true]); - return true; - } - } - } - } - return false; - }, - - _handleTextColorOrProperties: function(command, argument){ - // summary: - // This function handles appplying text color as best it is - // able to do so when the selection is collapsed, making the - // behavior cross-browser consistent. It also handles the name - // and size for IE. - // command: - // The command. - // argument: - // Any additional arguments. - // tags: - // private - var selection = rangeapi.getSelection(this.window); - var doc = this.document; - var rs, ret, range, txt, startNode, endNode, breaker, sNode; - argument = argument || null; - if(command && selection && selection.isCollapsed){ - if(selection.rangeCount){ - range = selection.getRangeAt(0); - rs = range.startContainer; - if(rs && rs.nodeType === 3){ - // Text node, we have to split it. - var offset = range.startOffset; - if(rs.length < offset){ - //We are not splitting the right node, try to locate the correct one - ret = this._adjustNodeAndOffset(rs, offset); - rs = ret.node; - offset = ret.offset; - } - txt = rs.nodeValue; - startNode = doc.createTextNode(txt.substring(0, offset)); - var endText = txt.substring(offset); - if(endText !== ""){ - endNode = doc.createTextNode(txt.substring(offset)); - } - // Create a space, we'll select and bold it, so - // the whole word doesn't get bolded - breaker = doc.createElement("span"); - sNode = doc.createTextNode("."); - breaker.appendChild(sNode); - // Create a junk node to avoid it trying to style the breaker. - // This will get destroyed later. - var extraSpan = doc.createElement("span"); - breaker.appendChild(extraSpan); - if(startNode.length){ - domConstruct.place(startNode, rs, "after"); - }else{ - startNode = rs; - } - domConstruct.place(breaker, startNode, "after"); - if(endNode){ - domConstruct.place(endNode, breaker, "after"); - } - domConstruct.destroy(rs); - var newrange = rangeapi.create(this.window); - newrange.setStart(sNode, 0); - newrange.setEnd(sNode, sNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - if(has("webkit")){ - // WebKit is frustrating with positioning the cursor. - // It stinks to have a selected space, but there really - // isn't much choice here. - var style = "color"; - if(command === "hilitecolor" || command === "backcolor"){ - style = "backgroundColor"; - } - domStyle.set(breaker, style, argument); - this._sCall("remove", []); - domConstruct.destroy(extraSpan); - breaker.innerHTML = " "; // - this._sCall("selectElement", [breaker]); - this.focus(); - }else{ - this.execCommand(command, argument); - domConstruct.place(breaker.firstChild, breaker, "before"); - domConstruct.destroy(breaker); - newrange.setStart(sNode, 0); - newrange.setEnd(sNode, sNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - this._sCall("collapse", [false]); - sNode.parentNode.removeChild(sNode); - } - return true; - } - } - } - return false; - }, - - _adjustNodeAndOffset: function(/*DomNode*/node, /*Int*/offset){ - // summary: - // In the case there are multiple text nodes in a row the offset may not be within the node. - // If the offset is larger than the node length, it will attempt to find - // the next text sibling until it locates the text node in which the offset refers to - // node: - // The node to check. - // offset: - // The position to find within the text node - // tags: - // private. - while(node.length < offset && node.nextSibling && node.nextSibling.nodeType === 3){ - //Adjust the offset and node in the case of multiple text nodes in a row - offset = offset - node.length; - node = node.nextSibling; - } - return {"node": node, "offset": offset}; - }, - - _tagNamesForCommand: function(command){ - // summary: - // Function to return the tab names that are associated - // with a particular style. - // command: String - // The command to return tags for. - // tags: - // private - if(command === "bold"){ - return ["b", "strong"]; - }else if(command === "italic"){ - return ["i","em"]; - }else if(command === "strikethrough"){ - return ["s", "strike"]; - }else if(command === "superscript"){ - return ["sup"]; - }else if(command === "subscript"){ - return ["sub"]; - }else if(command === "underline"){ - return ["u"]; - } - return []; - }, - - _stripBreakerNodes: function(/*DOMNode*/ node){ - // summary: - // Function for stripping out the breaker spans inserted by the formatting command. - // Registered as a filter for IE, handles the breaker spans needed to fix up - // How bold/italic/etc, work when selection is collapsed (single cursor). - if(!this.isLoaded){ return; } // this method requires init to be complete - query(".ieFormatBreakerSpan", node).forEach(function(b){ - while(b.firstChild){ - domConstruct.place(b.firstChild, b, "before"); - } - domConstruct.destroy(b); - }); - return node; - } -}); - -return RichText; - -}); diff --git a/lib/dijit/_editor/_Plugin.js.uncompressed.js b/lib/dijit/_editor/_Plugin.js.uncompressed.js deleted file mode 100644 index 18d8d4e25..000000000 --- a/lib/dijit/_editor/_Plugin.js.uncompressed.js +++ /dev/null @@ -1,302 +0,0 @@ -define("dijit/_editor/_Plugin", [ - "dojo/_base/connect", // connect.connect - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.mixin, lang.hitch - "../form/Button" -], function(connect, declare, lang, Button){ - -// module: -// dijit/_editor/_Plugin -// summary: -// Base class for a "plugin" to the editor, which is usually -// a single button on the Toolbar and some associated code - - -var _Plugin = declare("dijit._editor._Plugin", null, { - // summary: - // Base class for a "plugin" to the editor, which is usually - // a single button on the Toolbar and some associated code - - constructor: function(args){ - // summary: - // Create the plugin. - // args: Object? - // Initial settings for any of the attributes. - - this.params = args || {}; - lang.mixin(this, this.params); - this._connects=[]; - this._attrPairNames = {}; - }, - - // editor: [const] dijit.Editor - // Points to the parent editor - editor: null, - - // iconClassPrefix: [const] String - // The CSS class name for the button node is formed from `iconClassPrefix` and `command` - iconClassPrefix: "dijitEditorIcon", - - // button: dijit/_WidgetBase? - // Pointer to `dijit/form/Button` or other widget (ex: `dijit/form/FilteringSelect`) - // that is added to the toolbar to control this plugin. - // If not specified, will be created on initialization according to `buttonClass` - button: null, - - // command: String - // String like "insertUnorderedList", "outdent", "justifyCenter", etc. that represents an editor command. - // Passed to editor.execCommand() if `useDefaultCommand` is true. - command: "", - - // useDefaultCommand: Boolean - // If true, this plugin executes by calling Editor.execCommand() with the argument specified in `command`. - useDefaultCommand: true, - - // buttonClass: Widget Class - // Class of widget (ex: dijit.form.Button or dijit/form/FilteringSelect) - // that is added to the toolbar to control this plugin. - // This is used to instantiate the button, unless `button` itself is specified directly. - buttonClass: Button, - - // disabled: Boolean - // Flag to indicate if this plugin has been disabled and should do nothing - // helps control button state, among other things. Set via the setter api. - disabled: false, - - getLabel: function(/*String*/key){ - // summary: - // Returns the label to use for the button - // tags: - // private - return this.editor.commands[key]; // String - }, - - _initButton: function(){ - // summary: - // Initialize the button or other widget that will control this plugin. - // This code only works for plugins controlling built-in commands in the editor. - // tags: - // protected extension - if(this.command.length){ - var label = this.getLabel(this.command), - editor = this.editor, - className = this.iconClassPrefix+" "+this.iconClassPrefix + this.command.charAt(0).toUpperCase() + this.command.substr(1); - if(!this.button){ - var props = lang.mixin({ - label: label, - ownerDocument: editor.ownerDocument, - dir: editor.dir, - lang: editor.lang, - showLabel: false, - iconClass: className, - dropDown: this.dropDown, - tabIndex: "-1" - }, this.params || {}); - this.button = new this.buttonClass(props); - } - } - if(this.get("disabled") && this.button){ - this.button.set("disabled", this.get("disabled")); - } - }, - - destroy: function(){ - // summary: - // Destroy this plugin - - var h; - while(h = this._connects.pop()){ h.remove(); } - if(this.dropDown){ - this.dropDown.destroyRecursive(); - } - }, - - connect: function(o, f, tf){ - // summary: - // Make a connect.connect() that is automatically disconnected when this plugin is destroyed. - // Similar to `dijit/_Widget.connect()`. - // tags: - // protected - this._connects.push(connect.connect(o, f, this, tf)); - }, - - updateState: function(){ - // summary: - // Change state of the plugin to respond to events in the editor. - // description: - // This is called on meaningful events in the editor, such as change of selection - // or caret position (but not simple typing of alphanumeric keys). It gives the - // plugin a chance to update the CSS of its button. - // - // For example, the "bold" plugin will highlight/unhighlight the bold button depending on whether the - // characters next to the caret are bold or not. - // - // Only makes sense when `useDefaultCommand` is true, as it calls Editor.queryCommandEnabled(`command`). - var e = this.editor, - c = this.command, - checked, enabled; - if(!e || !e.isLoaded || !c.length){ return; } - var disabled = this.get("disabled"); - if(this.button){ - try{ - enabled = !disabled && e.queryCommandEnabled(c); - if(this.enabled !== enabled){ - this.enabled = enabled; - this.button.set('disabled', !enabled); - } - if(enabled){ - if(typeof this.button.checked == 'boolean'){ - checked = e.queryCommandState(c); - if(this.checked !== checked){ - this.checked = checked; - this.button.set('checked', e.queryCommandState(c)); - } - } - } - }catch(e){ - console.log(e); // FIXME: we shouldn't have debug statements in our code. Log as an error? - } - } - }, - - setEditor: function(/*dijit/Editor*/ editor){ - // summary: - // Tell the plugin which Editor it is associated with. - - // TODO: refactor code to just pass editor to constructor. - - // FIXME: detach from previous editor!! - this.editor = editor; - - // FIXME: prevent creating this if we don't need to (i.e., editor can't handle our command) - this._initButton(); - - // Processing for buttons that execute by calling editor.execCommand() - if(this.button && this.useDefaultCommand){ - if(this.editor.queryCommandAvailable(this.command)){ - this.connect(this.button, "onClick", - lang.hitch(this.editor, "execCommand", this.command, this.commandArg) - ); - }else{ - // hide button because editor doesn't support command (due to browser limitations) - this.button.domNode.style.display = "none"; - } - } - - this.connect(this.editor, "onNormalizedDisplayChanged", "updateState"); - }, - - setToolbar: function(/*dijit/Toolbar*/ toolbar){ - // summary: - // Tell the plugin to add it's controller widget (often a button) - // to the toolbar. Does nothing if there is no controller widget. - - // TODO: refactor code to just pass toolbar to constructor. - - if(this.button){ - toolbar.addChild(this.button); - } - // console.debug("adding", this.button, "to:", toolbar); - }, - - set: function(/* attribute */ name, /* anything */ value){ - // summary: - // Set a property on a plugin - // name: - // The property to set. - // value: - // The value to set in the property. - // description: - // Sets named properties on a plugin which may potentially be handled by a - // setter in the plugin. - // For example, if the plugin has a properties "foo" - // and "bar" and a method named "_setFooAttr", calling: - // | plugin.set("foo", "Howdy!"); - // would be equivalent to writing: - // | plugin._setFooAttr("Howdy!"); - // and: - // | plugin.set("bar", 3); - // would be equivalent to writing: - // | plugin.bar = 3; - // - // set() may also be called with a hash of name/value pairs, ex: - // | plugin.set({ - // | foo: "Howdy", - // | bar: 3 - // | }) - // This is equivalent to calling set(foo, "Howdy") and set(bar, 3) - if(typeof name === "object"){ - for(var x in name){ - this.set(x, name[x]); - } - return this; - } - var names = this._getAttrNames(name); - if(this[names.s]){ - // use the explicit setter - var result = this[names.s].apply(this, Array.prototype.slice.call(arguments, 1)); - }else{ - this._set(name, value); - } - return result || this; - }, - - get: function(name){ - // summary: - // Get a property from a plugin. - // name: - // The property to get. - // description: - // Get a named property from a plugin. The property may - // potentially be retrieved via a getter method. If no getter is defined, this - // just retrieves the object's property. - // For example, if the plugin has a properties "foo" - // and "bar" and a method named "_getFooAttr", calling: - // | plugin.get("foo"); - // would be equivalent to writing: - // | plugin._getFooAttr(); - // and: - // | plugin.get("bar"); - // would be equivalent to writing: - // | plugin.bar; - var names = this._getAttrNames(name); - return this[names.g] ? this[names.g]() : this[name]; - }, - - _setDisabledAttr: function(disabled){ - // summary: - // Function to set the plugin state and call updateState to make sure the - // button is updated appropriately. - this.disabled = disabled; - this.updateState(); - }, - - _getAttrNames: function(name){ - // summary: - // Helper function for get() and set(). - // Caches attribute name values so we don't do the string ops every time. - // tags: - // private - - var apn = this._attrPairNames; - if(apn[name]){ return apn[name]; } - var uc = name.charAt(0).toUpperCase() + name.substr(1); - return (apn[name] = { - s: "_set"+uc+"Attr", - g: "_get"+uc+"Attr" - }); - }, - - _set: function(/*String*/ name, /*anything*/ value){ - // summary: - // Helper function to set new value for specified attribute - this[name] = value; - } -}); - -// Hash mapping plugin name to factory, used for registering plugins -_Plugin.registry = {}; - -return _Plugin; - -}); diff --git a/lib/dijit/_editor/html.js.uncompressed.js b/lib/dijit/_editor/html.js.uncompressed.js deleted file mode 100644 index 76d591a30..000000000 --- a/lib/dijit/_editor/html.js.uncompressed.js +++ /dev/null @@ -1,223 +0,0 @@ -define("dijit/_editor/html", [ - "dojo/_base/array", - "dojo/_base/lang", // lang.setObject - "dojo/sniff" // has("ie") -], function(array, lang, has){ - -// module: -// dijit/_editor/html -// summary: -// HTML serialization utility functions used by editor - -var exports = {}; -lang.setObject("dijit._editor.html", exports); - -var escape = exports.escapeXml = function(/*String*/ str, /*Boolean?*/ noSingleQuotes){ - // summary: - // Adds escape sequences for special characters in XML: `&<>"'`. - // Optionally skips escapes for single quotes. - str = str.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """); - if(!noSingleQuotes){ - str = str.replace(/'/gm, "'"); - } - return str; // string -}; - - -exports.getNodeHtml = function(/*DomNode*/ node){ - // summary: - // Return string representing HTML for node and it's children - var output = []; - exports.getNodeHtmlHelper(node, output); - return output.join(""); -}; - -exports.getNodeHtmlHelper = function(/*DomNode*/ node, /*String[]*/ output){ - // summary: - // Pushes array of strings into output[] which represent HTML for node and it's children - switch(node.nodeType){ - case 1: // element node - var lName = node.nodeName.toLowerCase(); - if(!lName || lName.charAt(0) == "/"){ - // IE does some strange things with malformed HTML input, like - // treating a close tag </span> without an open tag <span>, as - // a new tag with tagName of /span. Corrupts output HTML, remove - // them. Other browsers don't prefix tags that way, so will - // never show up. - return ""; - } - output.push('<', lName); - - // store the list of attributes and sort it to have the - // attributes appear in the dictionary order - var attrarray = [], attrhash = {}; - var attr; - if(has("dom-attributes-explicit") || has("dom-attributes-specified-flag")){ - // IE8+ and all other browsers. - var i = 0; - while((attr = node.attributes[i++])){ - // ignore all attributes starting with _dj which are - // internal temporary attributes used by the editor - var n = attr.name; - if(n.substr(0,3) !== '_dj' && - (!has("dom-attributes-specified-flag") || attr.specified) && - !(n in attrhash)){ // workaround repeated attributes bug in IE8 (LinkDialog test) - var v = attr.value; - if(n == 'src' || n == 'href'){ - if(node.getAttribute('_djrealurl')){ - v = node.getAttribute('_djrealurl'); - } - } - if(has("ie") === 8 && n === "style"){ - v = v.replace("HEIGHT:", "height:").replace("WIDTH:", "width:"); - } - attrarray.push([n,v]); - attrhash[n] = v; - } - } - }else{ - // IE6-7 code path - var clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false); - var s = clone.outerHTML; - // Split up and manage the attrs via regexp - // similar to prettyPrint attr logic. - var rgxp_attrsMatch = /[\w-]+=("[^"]*"|'[^']*'|\S*)/gi - var attrSplit = s.match(rgxp_attrsMatch); - s = s.substr(0, s.indexOf('>')); - array.forEach(attrSplit, function(attr){ - if(attr){ - var idx = attr.indexOf("="); - if(idx > 0){ - var key = attr.substring(0,idx); - if(key.substr(0,3) != '_dj'){ - if(key == 'src' || key == 'href'){ - if(node.getAttribute('_djrealurl')){ - attrarray.push([key,node.getAttribute('_djrealurl')]); - return; - } - } - var val, match; - switch(key){ - case 'style': - val = node.style.cssText.toLowerCase(); - break; - case 'class': - val = node.className; - break; - case 'width': - if(lName === "img"){ - // This somehow gets lost on IE for IMG tags and the like - // and we have to find it in outerHTML, known IE oddity. - match=/width=(\S+)/i.exec(s); - if(match){ - val = match[1]; - } - break; - } - case 'height': - if(lName === "img"){ - // This somehow gets lost on IE for IMG tags and the like - // and we have to find it in outerHTML, known IE oddity. - match=/height=(\S+)/i.exec(s); - if(match){ - val = match[1]; - } - break; - } - default: - val = node.getAttribute(key); - } - if(val != null){ - attrarray.push([key, val.toString()]); - } - } - } - } - }, this); - } - attrarray.sort(function(a,b){ - return a[0] < b[0] ? -1 : (a[0] == b[0] ? 0 : 1); - }); - var j = 0; - while((attr = attrarray[j++])){ - output.push(' ', attr[0], '="', - (typeof attr[1] === "string" ? escape(attr[1], true) : attr[1]), '"'); - } - switch(lName){ - case 'br': - case 'hr': - case 'img': - case 'input': - case 'base': - case 'meta': - case 'area': - case 'basefont': - // These should all be singly closed - output.push(' />'); - break; - case 'script': - // Browsers handle script tags differently in how you get content, - // but innerHTML always seems to work, so insert its content that way - // Yes, it's bad to allow script tags in the editor code, but some people - // seem to want to do it, so we need to at least return them right. - // other plugins/filters can strip them. - output.push('>', node.innerHTML, '</', lName, '>'); - break; - default: - output.push('>'); - if(node.hasChildNodes()){ - exports.getChildrenHtmlHelper(node, output); - } - output.push('</', lName, '>'); - } - break; - case 4: // cdata - case 3: // text - // FIXME: - output.push(escape(node.nodeValue, true)); - break; - case 8: // comment - // FIXME: - output.push('<!--', escape(node.nodeValue, true), '-->'); - break; - default: - output.push("<!-- Element not recognized - Type: ", node.nodeType, " Name: ", node.nodeName, "-->"); - } -}; - -exports.getChildrenHtml = function(/*DomNode*/ node){ - // summary: - // Returns the html content of a DomNode's children - var output = []; - exports.getChildrenHtmlHelper(node, output); - return output.join(""); -}; - -exports.getChildrenHtmlHelper = function(/*DomNode*/ dom, /*String[]*/ output){ - // summary: - // Pushes the html content of a DomNode's children into out[] - - if(!dom){ return; } - var nodes = dom["childNodes"] || dom; - - // IE issue. - // If we have an actual node we can check parent relationships on for IE, - // We should check, as IE sometimes builds invalid DOMS. If no parent, we can't check - // And should just process it and hope for the best. - var checkParent = !has("ie") || nodes !== dom; - - var node, i = 0; - while((node = nodes[i++])){ - // IE is broken. DOMs are supposed to be a tree. But in the case of malformed HTML, IE generates a graph - // meaning one node ends up with multiple references (multiple parents). This is totally wrong and invalid, but - // such is what it is. We have to keep track and check for this because otherwise the source output HTML will have dups. - // No other browser generates a graph. Leave it to IE to break a fundamental DOM rule. So, we check the parent if we can - // If we can't, nothing more we can do other than walk it. - if(!checkParent || node.parentNode == dom){ - exports.getNodeHtmlHelper(node, output); - } - } -}; - -return exports; -}); diff --git a/lib/dijit/_editor/nls/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/FontChoice.js.uncompressed.js deleted file mode 100644 index 07d0f0723..000000000 --- a/lib/dijit/_editor/nls/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,62 +0,0 @@ -define("dijit/_editor/nls/FontChoice", { root: -//begin v1.x content -({ - fontSize: "Size", - fontName: "Font", - formatBlock: "Format", - - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - - noFormat: "None", - p: "Paragraph", - h1: "Heading", - h2: "Subheading", - h3: "Sub-subheading", - pre: "Pre-formatted", - - 1: "xx-small", - 2: "x-small", - 3: "small", - 4: "medium", - 5: "large", - 6: "x-large", - 7: "xx-large" -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js deleted file mode 100644 index 543f87a8e..000000000 --- a/lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,48 +0,0 @@ -define("dijit/_editor/nls/LinkDialog", { root: -//begin v1.x content -({ - createLinkTitle: "Link Properties", - insertImageTitle: "Image Properties", - url: "URL:", - text: "Description:", - target: "Target:", - set: "Set", - currentWindow: "Current Window", - parentWindow: "Parent Window", - topWindow: "Topmost Window", - newWindow: "New Window" -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js deleted file mode 100644 index ea2818c92..000000000 --- a/lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/ar/FontChoice", ({ - fontSize: "الحجم", - fontName: "طاقم طباعة", - formatBlock: "النسق", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "أحادي المسافة", - cursive: "كتابة بحروف متصلة", - fantasy: "خيالي", - noFormat: "لا شيء", - p: "فقرة", - h1: "عنوان", - h2: "عنوان فرعي", - h3: "فرعي-عنوان فرعي", - pre: "منسق بصفة مسبقة", - 1: "صغير جدا جدا", - 2: "صغير جدا", - 3: "صغير", - 4: "متوسط", - 5: "كبير", - 6: "كبير جدا", - 7: "كبير جدا جدا" -}) -); diff --git a/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js deleted file mode 100644 index 157b55d04..000000000 --- a/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/ar/LinkDialog", ({ - createLinkTitle: "خصائص الوصلة", - insertImageTitle: "خصائص الصورة", - url: "عنوان URL:", - text: "الوصف:", - target: "الهدف:", - set: "تحديد", - currentWindow: "النافذة الحالية", - parentWindow: "النافذة الرئيسية", - topWindow: "النافذة العلوية", - newWindow: "نافذة جديدة" -}) -); diff --git a/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js deleted file mode 100644 index cb8d8dfbd..000000000 --- a/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/ar/commands", ({ - 'bold': 'عري~ض', - 'copy': 'نسخ', - 'cut': 'قص', - 'delete': 'حذف', - 'indent': 'ازاحة للداخل', - 'insertHorizontalRule': 'مسطرة أفقية', - 'insertOrderedList': 'كشف مرقم', - 'insertUnorderedList': 'كشف نقطي', - 'italic': '~مائل', - 'justifyCenter': 'محاذاة في الوسط', - 'justifyFull': 'ضبط', - 'justifyLeft': 'محاذاة الى اليسار', - 'justifyRight': 'محاذاة الى اليمين', - 'outdent': 'ازاحة للخارج', - 'paste': 'لصق', - 'redo': 'اعادة', - 'removeFormat': 'ازالة النسق', - 'selectAll': 'اختيار كل', - 'strikethrough': 'تشطيب', - 'subscript': 'رمز سفلي', - 'superscript': 'رمز علوي', - 'underline': '~تسطير', - 'undo': 'تراجع', - 'unlink': 'ازالة وصلة', - 'createLink': 'تكوين وصلة', - 'toggleDir': 'تبديل الاتجاه', - 'insertImage': 'ادراج صورة', - 'insertTable': 'ادراج/تحرير جدول', - 'toggleTableBorder': 'تبديل حدود الجدول', - 'deleteTable': 'حذف جدول', - 'tableProp': 'خصائص الجدول', - 'htmlToggle': 'مصدر HTML', - 'foreColor': 'لون الواجهة الأمامية', - 'hiliteColor': 'لون الخلفية', - 'plainFormatBlock': 'نمط الفقرة', - 'formatBlock': 'نمط الفقرة', - 'fontSize': 'حجم طاقم الطباعة', - 'fontName': 'اسم طاقم الطباعة', - 'tabIndent': 'ازاحة علامة الجدولة للداخل', - "fullScreen": "تبديل الشاشة الكاملة", - "viewSource": "مشاهدة مصدر HTML", - "print": "طباعة", - "newPage": "صفحة جديدة", - /* Error messages */ - 'systemShortcut': 'يكون التصرف "${0}" متاحا فقط ببرنامج الاستعراض الخاص بك باستخدام المسار المختصر للوحة المفاتيح. استخدم ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js deleted file mode 100644 index 19c4deefa..000000000 --- a/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/az/FontChoice", ({ - "1" : "xx-kiçik", - "2" : "x-kiçik", - "formatBlock" : "Format", - "3" : "kiçik", - "4" : "orta", - "5" : "böyük", - "6" : "çox-böyük", - "7" : "ən böyük", - "fantasy" : "fantaziya", - "serif" : "serif", - "p" : "Abzas", - "pre" : "Əvvəldən düzəldilmiş", - "sans-serif" : "sans-serif", - "fontName" : "Şrift", - "h1" : "Başlıq", - "h2" : "Alt Başlıq", - "h3" : "Alt Alt Başlıq", - "monospace" : "Tək aralıqlı", - "fontSize" : "Ölçü", - "cursive" : "Əl yazısı", - "noFormat" : "Heç biri" -}) -); diff --git a/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js deleted file mode 100644 index 66d46ad1c..000000000 --- a/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/az/LinkDialog", ({ - "text" : "Yazı:", - "insertImageTitle" : "Şəkil başlığı əlavə et", - "set" : "Yönəlt", - "newWindow" : "Yeni pəncərə", - "topWindow" : "Üst pəncərə", - "target" : "Hədəf:", - "createLinkTitle" : "Köprü başlığı yarat", - "parentWindow" : "Ana pəncərə", - "currentWindow" : "Hazırki pəncərə", - "url" : "URL:" -}) -); diff --git a/lib/dijit/_editor/nls/az/commands.js.uncompressed.js b/lib/dijit/_editor/nls/az/commands.js.uncompressed.js deleted file mode 100644 index 2aba5f318..000000000 --- a/lib/dijit/_editor/nls/az/commands.js.uncompressed.js +++ /dev/null @@ -1,50 +0,0 @@ -define( -"dijit/_editor/nls/az/commands", ({ - "removeFormat" : "Formatı Sil", - "copy" :"Köçür", - "paste" :"Yapışdır", - "selectAll" :"Hamısını seç", - "insertOrderedList" :"Nömrəli siyahı", - "insertTable" :"Cədvəl əlavə et", - "print" :"Yazdır", - "underline" :"Altıxətli", - "foreColor" :"Ön plan rəngi", - "htmlToggle" :"HTML kodu", - "formatBlock" :"Abzas stili", - "newPage" :"Yeni səhifə", - "insertHorizontalRule" :"Üfüqi qayda", - "delete" :"Sil", - "insertUnorderedList" :"İşarələnmiş siyahı", - "tableProp" :"Cədvəl xüsusiyyətləri", - "insertImage" :"Şəkil əlavə et", - "superscript" :"Üst işarə", - "subscript" :"Alt işarə", - "createLink" :"Körpü yarat", - "undo" :"Geriyə al", - "fullScreen" :"Tam ekran aç", - "italic" :"İtalik", - "fontName" :"Yazı tipi", - "justifyLeft" :"Sol tərəfə Doğrult", - "unlink" :"Körpünü sil", - "toggleTableBorder" :"Cədvəl kənarlarını göstər/Gizlət", - "viewSource" :"HTML qaynaq kodunu göstər", - "fontSize" :"Yazı tipi böyüklüğü", - "systemShortcut" :"\"${0}\" prosesi yalnız printerinizdə klaviatura qısayolu ilə istifadə oluna bilər. Bundan istifadə edin", - "indent" :"Girinti", - "redo" :"Yenilə", - "strikethrough" :"Üstündən xətt çəkilmiş", - "justifyFull" :"Doğrult", - "justifyCenter" :"Ortaya doğrult", - "hiliteColor" :"Arxa plan rəngi", - "deleteTable" :"Cədvəli sil", - "outdent" :"Çıxıntı", - "cut" :"Kəs", - "plainFormatBlock" :"Abzas stili", - "toggleDir" :"İstiqaməti dəyişdir", - "bold" :"Qalın", - "tabIndent" :"Qulp girintisi", - "justifyRight" :"Sağa doğrult", - "appleKey" : "⌘${0}", - "ctrlKey" : "ctrl+${0}" -}) -); diff --git a/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js deleted file mode 100644 index 46237c108..000000000 --- a/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/ca/FontChoice", ({ - fontSize: "Mida", - fontName: "Tipus de lletra", - formatBlock: "Format", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monoespai", - cursive: "Cursiva", - fantasy: "Fantasia", - noFormat: "Cap", - p: "Paràgraf", - h1: "Títol", - h2: "Subtítol", - h3: "Subsubtítol", - pre: "Format previ", - 1: "xx-petit", - 2: "x-petit", - 3: "petit", - 4: "mitjà", - 5: "gran", - 6: "x-gran", - 7: "xx-gran" -}) -); diff --git a/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js deleted file mode 100644 index 8726255f9..000000000 --- a/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/ca/LinkDialog", ({ - createLinkTitle: "Propietats de l\'enllaç", - insertImageTitle: "Propietats de la imatge", - url: "URL:", - text: "Descripció:", - target: "Destinació:", - set: "Defineix", - currentWindow: "Finestra actual", - parentWindow: "Finestra pare", - topWindow: "Finestra superior", - newWindow: "Finestra nova" -}) -); diff --git a/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js deleted file mode 100644 index 601b0dddd..000000000 --- a/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/ca/commands", ({ - 'bold': 'Negreta', - 'copy': 'Copia', - 'cut': 'Retalla', - 'delete': 'Suprimeix', - 'indent': 'Sagnat', - 'insertHorizontalRule': 'Regla horitzontal', - 'insertOrderedList': 'Llista numerada', - 'insertUnorderedList': 'Llista de vinyetes', - 'italic': 'Cursiva', - 'justifyCenter': 'Centra', - 'justifyFull': 'Justifica', - 'justifyLeft': 'Alinea a l\'esquerra', - 'justifyRight': 'Alinea a la dreta', - 'outdent': 'Sagna a l\'esquerra', - 'paste': 'Enganxa', - 'redo': 'Refés', - 'removeFormat': 'Elimina el format', - 'selectAll': 'Selecciona-ho tot', - 'strikethrough': 'Ratllat', - 'subscript': 'Subíndex', - 'superscript': 'Superíndex', - 'underline': 'Subratllat', - 'undo': 'Desfés', - 'unlink': 'Elimina l\'enllaç', - 'createLink': 'Crea un enllaç', - 'toggleDir': 'Inverteix la direcció', - 'insertImage': 'Insereix imatge', - 'insertTable': 'Insereix/edita la taula', - 'toggleTableBorder': 'Inverteix els contorns de taula', - 'deleteTable': 'Suprimeix la taula', - 'tableProp': 'Propietat de taula', - 'htmlToggle': 'Font HTML', - 'foreColor': 'Color de primer pla', - 'hiliteColor': 'Color de fons', - 'plainFormatBlock': 'Estil de paràgraf', - 'formatBlock': 'Estil de paràgraf', - 'fontSize': 'Cos de la lletra', - 'fontName': 'Nom del tipus de lletra', - 'tabIndent': 'Sagnat', - "fullScreen": "Commuta pantalla completa", - "viewSource": "Visualitza font HTML", - "print": "Imprimeix", - "newPage": "Pàgina nova", - /* Error messages */ - 'systemShortcut': 'L\'acció "${0}" és l\'única disponible al navegador utilitzant una drecera del teclat. Utilitzeu ${1}.', - 'ctrlKey':'control+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/commands.js.uncompressed.js b/lib/dijit/_editor/nls/commands.js.uncompressed.js deleted file mode 100644 index 344b5ec23..000000000 --- a/lib/dijit/_editor/nls/commands.js.uncompressed.js +++ /dev/null @@ -1,85 +0,0 @@ -define("dijit/_editor/nls/commands", { root: -//begin v1.x content -({ - 'bold': 'Bold', - 'copy': 'Copy', - 'cut': 'Cut', - 'delete': 'Delete', - 'indent': 'Indent', - 'insertHorizontalRule': 'Horizontal Rule', - 'insertOrderedList': 'Numbered List', - 'insertUnorderedList': 'Bullet List', - 'italic': 'Italic', - 'justifyCenter': 'Align Center', - 'justifyFull': 'Justify', - 'justifyLeft': 'Align Left', - 'justifyRight': 'Align Right', - 'outdent': 'Outdent', - 'paste': 'Paste', - 'redo': 'Redo', - 'removeFormat': 'Remove Format', - 'selectAll': 'Select All', - 'strikethrough': 'Strikethrough', - 'subscript': 'Subscript', - 'superscript': 'Superscript', - 'underline': 'Underline', - 'undo': 'Undo', - 'unlink': 'Remove Link', - 'createLink': 'Create Link', - 'toggleDir': 'Toggle Direction', - 'insertImage': 'Insert Image', - 'insertTable': 'Insert/Edit Table', - 'toggleTableBorder': 'Toggle Table Border', - 'deleteTable': 'Delete Table', - 'tableProp': 'Table Property', - 'htmlToggle': 'HTML Source', - 'foreColor': 'Foreground Color', - 'hiliteColor': 'Background Color', - 'plainFormatBlock': 'Paragraph Style', - 'formatBlock': 'Paragraph Style', - 'fontSize': 'Font Size', - 'fontName': 'Font Name', - 'tabIndent': 'Tab Indent', - "fullScreen": "Toggle Full Screen", - "viewSource": "View HTML Source", - "print": "Print", - "newPage": "New Page", - /* Error messages */ - 'systemShortcut': 'The "${0}" action is only available in your browser using a keyboard shortcut. Use ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js deleted file mode 100644 index 42fbbaee2..000000000 --- a/lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/cs/FontChoice", ({ - fontSize: "Velikost", - fontName: "Písmo", - formatBlock: "Formát", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Žádný", - p: "Odstavec", - h1: "Nadpis", - h2: "Podnadpis", - h3: "Podnadpis 2", - pre: "Předformátované", - 1: "extra malé", - 2: "velmi malé", - 3: "malé", - 4: "střední", - 5: "velké", - 6: "velmi velké", - 7: "extra velké" -}) -); diff --git a/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js deleted file mode 100644 index d437975be..000000000 --- a/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/cs/LinkDialog", ({ - createLinkTitle: "Vlastnosti odkazu", - insertImageTitle: "Vlastnosti obrázku", - url: "Adresa URL:", - text: "Popis:", - target: "Cíl:", - set: "Nastavit", - currentWindow: "Aktuální okno", - parentWindow: "Nadřízené okno", - topWindow: "Okno nejvyšší úrovně", - newWindow: "Nové okno" -}) -); diff --git a/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js b/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js deleted file mode 100644 index d69aca728..000000000 --- a/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/cs/commands", ({ - 'bold': 'Tučné', - 'copy': 'Kopírovat', - 'cut': 'Vyjmout', - 'delete': 'Odstranit', - 'indent': 'Odsadit', - 'insertHorizontalRule': 'Vodorovná čára', - 'insertOrderedList': 'Číslovaný seznam', - 'insertUnorderedList': 'Seznam s odrážkami', - 'italic': 'Kurzíva', - 'justifyCenter': 'Zarovnat na střed', - 'justifyFull': 'Do bloku', - 'justifyLeft': 'Zarovnat vlevo', - 'justifyRight': 'Zarovnat vpravo', - 'outdent': 'Předsadit', - 'paste': 'Vložit', - 'redo': 'Opakovat', - 'removeFormat': 'Odebrat formát', - 'selectAll': 'Vybrat vše', - 'strikethrough': 'Přeškrtnutí', - 'subscript': 'Dolní index', - 'superscript': 'Horní index', - 'underline': 'Podtržení', - 'undo': 'Zpět', - 'unlink': 'Odebrat odkaz', - 'createLink': 'Vytvořit odkaz', - 'toggleDir': 'Přepnout směr', - 'insertImage': 'Vložit obrázek', - 'insertTable': 'Vložit/upravit tabulku', - 'toggleTableBorder': 'Přepnout ohraničení tabulky', - 'deleteTable': 'Odstranit tabulku', - 'tableProp': 'Vlastnost tabulky', - 'htmlToggle': 'Zdroj HTML', - 'foreColor': 'Barva popředí', - 'hiliteColor': 'Barva pozadí', - 'plainFormatBlock': 'Styl odstavce', - 'formatBlock': 'Styl odstavce', - 'fontSize': 'Velikost písma', - 'fontName': 'Název písma', - 'tabIndent': 'Odsazení tabulátoru', - "fullScreen": "Přepnout celou obrazovku", - "viewSource": "Zobrazit zdroj HTML", - "print": "Tisk", - "newPage": "Nová stránka", - /* Error messages */ - 'systemShortcut': 'Akce "${0}" je v prohlížeči dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesovou zkratku ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js deleted file mode 100644 index a5f959b0b..000000000 --- a/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/da/FontChoice", ({ - fontSize: "Størrelse", - fontName: "Skrifttype", - formatBlock: "Format", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "kursiv", - fantasy: "fantasy", - noFormat: "Ingen", - p: "Afsnit", - h1: "Overskrift", - h2: "Underoverskrift", - h3: "Underunderoverskrift", - pre: "Forudformateret", - 1: "xx-small", - 2: "x-small", - 3: "small", - 4: "medium", - 5: "large", - 6: "x-large", - 7: "xx-large" -}) -); diff --git a/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js deleted file mode 100644 index 1712160e4..000000000 --- a/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/da/LinkDialog", ({ - createLinkTitle: "Linkegenskaber", - insertImageTitle: "Billedegenskaber", - url: "URL:", - text: "Beskrivelse:", - target: "Mål:", - set: "Definér", - currentWindow: "Aktuelt vindue", - parentWindow: "Overordnet vindue", - topWindow: "Øverste vindue", - newWindow: "Nyt vindue" -}) -); diff --git a/lib/dijit/_editor/nls/da/commands.js.uncompressed.js b/lib/dijit/_editor/nls/da/commands.js.uncompressed.js deleted file mode 100644 index 25987432c..000000000 --- a/lib/dijit/_editor/nls/da/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/da/commands", ({ - 'bold': 'Fed', - 'copy': 'Kopiér', - 'cut': 'Klip', - 'delete': 'Slet', - 'indent': 'Indrykning', - 'insertHorizontalRule': 'Vandret linje', - 'insertOrderedList': 'Nummereret liste', - 'insertUnorderedList': 'Punktliste', - 'italic': 'Kursiv', - 'justifyCenter': 'Centreret', - 'justifyFull': 'Lige margener', - 'justifyLeft': 'Venstrejusteret', - 'justifyRight': 'Højrejusteret', - 'outdent': 'Udrykning', - 'paste': 'Sæt ind', - 'redo': 'Annullér Fortryd', - 'removeFormat': 'Fjern format', - 'selectAll': 'Markér alle', - 'strikethrough': 'Gennemstreget', - 'subscript': 'Sænket skrift', - 'superscript': 'Hævet skrift', - 'underline': 'Understreget', - 'undo': 'Fortryd', - 'unlink': 'Fjern link', - 'createLink': 'Opret link', - 'toggleDir': 'Skift retning', - 'insertImage': 'Indsæt billede', - 'insertTable': 'Indsæt/redigér tabel', - 'toggleTableBorder': 'Skift tabelramme', - 'deleteTable': 'Slet tabel', - 'tableProp': 'Tabelegenskab', - 'htmlToggle': 'HTML-kilde', - 'foreColor': 'Forgrundsfarve', - 'hiliteColor': 'Baggrundsfarve', - 'plainFormatBlock': 'Afsnitstypografi', - 'formatBlock': 'Afsnitstypografi', - 'fontSize': 'Skriftstørrelse', - 'fontName': 'Skriftnavn', - 'tabIndent': 'Tabulatorindrykning', - "fullScreen": "Fuld skærm til/fra", - "viewSource": "Vis HTML-kilde", - "print": "Udskriv", - "newPage": "Ny side", - /* Error messages */ - 'systemShortcut': 'Funktionen "${0}" kan kun bruges i din browser med en tastaturgenvej. Brug ${1}.', - 'ctrlKey':'Ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js deleted file mode 100644 index ea54a023c..000000000 --- a/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/de/FontChoice", ({ - fontSize: "Größe", - fontName: "Schriftart", - formatBlock: "Format", - serif: "Serife", - "sans-serif": "Serifenlos", - monospace: "Monospaceschrift", - cursive: "Kursiv", - fantasy: "Fantasie", - noFormat: "Keine Angabe", - p: "Absatz", - h1: "Überschrift", - h2: "Unterüberschrift", - h3: "Unterunterüberschrift", - pre: "Vorformatiert", - 1: "XXS", - 2: "XS", - 3: "S", - 4: "M", - 5: "L", - 6: "XL", - 7: "XXL" -}) -); diff --git a/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js deleted file mode 100644 index ca28bfd2b..000000000 --- a/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/de/LinkDialog", ({ - createLinkTitle: "Linkeigenschaften", - insertImageTitle: "Grafikeigenschaften", - url: "URL:", - text: "Beschreibung:", - target: "Ziel:", - set: "Festlegen", - currentWindow: "Aktuelles Fenster", - parentWindow: "Übergeordnetes Fenster", - topWindow: "Aktives Fenster", - newWindow: "Neues Fenster" -}) -); diff --git a/lib/dijit/_editor/nls/de/commands.js.uncompressed.js b/lib/dijit/_editor/nls/de/commands.js.uncompressed.js deleted file mode 100644 index 20917fe44..000000000 --- a/lib/dijit/_editor/nls/de/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/de/commands", ({ - 'bold': 'Fett', - 'copy': 'Kopieren', - 'cut': 'Ausschneiden', - 'delete': 'Löschen', - 'indent': 'Einrücken', - 'insertHorizontalRule': 'Horizontaler Strich', - 'insertOrderedList': 'Nummerierung', - 'insertUnorderedList': 'Aufzählungszeichen', - 'italic': 'Kursiv', - 'justifyCenter': 'Zentriert', - 'justifyFull': 'Blocksatz', - 'justifyLeft': 'Linksbündig', - 'justifyRight': 'Rechtsbündig', - 'outdent': 'Ausrücken', - 'paste': 'Einfügen', - 'redo': 'Wiederholen', - 'removeFormat': 'Formatierung entfernen', - 'selectAll': 'Alles auswählen', - 'strikethrough': 'Durchgestrichen', - 'subscript': 'Tiefgestellt', - 'superscript': 'Hochgestellt', - 'underline': 'Unterstrichen', - 'undo': 'Rückgängig', - 'unlink': 'Link entfernen', - 'createLink': 'Link erstellen', - 'toggleDir': 'Richtung wechseln', - 'insertImage': 'Grafik einfügen', - 'insertTable': 'Tabelle einfügen/bearbeiten', - 'toggleTableBorder': 'Tabellenumrandung ein-/ausschalten', - 'deleteTable': 'Tabelle löschen', - 'tableProp': 'Tabelleneigenschaft', - 'htmlToggle': 'HTML-Quelltext', - 'foreColor': 'Vordergrundfarbe', - 'hiliteColor': 'Hintergrundfarbe', - 'plainFormatBlock': 'Absatzstil', - 'formatBlock': 'Absatzstil', - 'fontSize': 'Schriftgröße', - 'fontName': 'Schriftartname', - 'tabIndent': 'Registerkarteneinrückung', - "fullScreen": "Gesamtanzeige", - "viewSource": "HTML-Quelle", - "print": "Drucken", - "newPage": "Neue Seite", - /* Error messages */ - 'systemShortcut': 'Die Aktion "${0}" ist im Browser nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.', - 'ctrlKey':'Strg+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js deleted file mode 100644 index 8c315b872..000000000 --- a/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/el/FontChoice", ({ - fontSize: "Μέγεθος", - fontName: "Γραμματοσειρά", - formatBlock: "Μορφή", - serif: "με πατούρες (serif)", - "sans-serif": "χωρίς πατούρες (sans-serif)", - monospace: "σταθερού πλάτους", - cursive: "πλάγιοι", - fantasy: "φαντασίας", - noFormat: "Χωρίς", - p: "Παράγραφος", - h1: "Επικεφαλίδα", - h2: "Δευτερεύουσα επικεφαλίδα", - h3: "Δευτερεύουσα επικεφαλίδα τρίτου επιπέδου", - pre: "Προ-μορφοποιημένο", - 1: "xx-μικρά", - 2: "x-μικρά", - 3: "μικρά", - 4: "μεσαία", - 5: "μεγάλα", - 6: "x-μεγάλα", - 7: "xx-μεγάλα" -}) -); diff --git a/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js deleted file mode 100644 index 69011f49a..000000000 --- a/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/el/LinkDialog", ({ - createLinkTitle: "Ιδιότητες σύνδεσης", - insertImageTitle: "Ιδιότητες εικόνας", - url: "Διεύθυνση URL:", - text: "Περιγραφή:", - target: "Προορισμός:", - set: "Ορισμός", - currentWindow: "Τρέχον παράθυρο", - parentWindow: "Γονικό παράθυρο", - topWindow: "Παράθυρο σε πρώτο πλάνο", - newWindow: "Νέο παράθυρο" -}) -); diff --git a/lib/dijit/_editor/nls/el/commands.js.uncompressed.js b/lib/dijit/_editor/nls/el/commands.js.uncompressed.js deleted file mode 100644 index bb12160be..000000000 --- a/lib/dijit/_editor/nls/el/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/el/commands", ({ - 'bold': 'Έντονα', - 'copy': 'Αντιγραφή', - 'cut': 'Αποκοπή', - 'delete': 'Διαγραφή', - 'indent': 'Εσοχή', - 'insertHorizontalRule': 'Οριζόντια γραμμή', - 'insertOrderedList': 'Αριθμημένη λίστα', - 'insertUnorderedList': 'Λίστα με κουκίδες', - 'italic': 'Πλάγια', - 'justifyCenter': 'Στοίχιση στο κέντρο', - 'justifyFull': 'Πλήρης στοίχιση', - 'justifyLeft': 'Στοίχιση αριστερά', - 'justifyRight': 'Στοίχιση δεξιά', - 'outdent': 'Μείωση περιθωρίου', - 'paste': 'Επικόλληση', - 'redo': 'Ακύρωση αναίρεσης', - 'removeFormat': 'Αφαίρεση μορφοποίησης', - 'selectAll': 'Επιλογή όλων', - 'strikethrough': 'Διαγράμμιση', - 'subscript': 'Δείκτης', - 'superscript': 'Εκθέτης', - 'underline': 'Υπογράμμιση', - 'undo': 'Αναίρεση', - 'unlink': 'Αφαίρεση σύνδεσης', - 'createLink': 'Δημιουργία σύνδεσης', - 'toggleDir': 'Εναλλαγή κατεύθυνσης', - 'insertImage': 'Εισαγωγή εικόνας', - 'insertTable': 'Εισαγωγή/Τροποποίηση πίνακα', - 'toggleTableBorder': 'Εναλλαγή εμφάνισης περιγράμματος πίνακα', - 'deleteTable': 'Διαγραφή πίνακα', - 'tableProp': 'Ιδιότητα πίνακα', - 'htmlToggle': 'Πρωτογενής κώδικας HTML', - 'foreColor': 'Χρώμα προσκηνίου', - 'hiliteColor': 'Χρώμα φόντου', - 'plainFormatBlock': 'Στυλ παραγράφου', - 'formatBlock': 'Στυλ παραγράφου', - 'fontSize': 'Μέγεθος γραμματοσειράς', - 'fontName': 'Όνομα γραμματοσειράς', - 'tabIndent': 'Εσοχή με το πλήκτρο Tab', - "fullScreen": "Εναλλαγή κατάστασης πλήρους οθόνης", - "viewSource": "Προβολή προέλευσης HTML", - "print": "Εκτύπωση", - "newPage": "Νέα σελίδα", - /* Error messages */ - 'systemShortcut': 'Σε αυτό το πρόγραμμα πλοήγησης, η ενέργεια "${0}" είναι διαθέσιμη μόνο με τη χρήση μιας συντόμευσης πληκτρολογίου. Χρησιμοποιήστε τη συντόμευση ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js deleted file mode 100644 index ed8e6ff23..000000000 --- a/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/es/FontChoice", ({ - fontSize: "Tamaño", - fontName: "Font", - formatBlock: "Formato", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "espacio sencillo", - cursive: "cursiva", - fantasy: "fantasía", - noFormat: "Ninguno", - p: "Párrafo", - h1: "Cabecera", - h2: "Subcabecera", - h3: "Sub-subcabecera", - pre: "Preformateado", - 1: "xx-pequeño", - 2: "x-pequeño", - 3: "pequeño", - 4: "medio", - 5: "grande", - 6: "x-grande", - 7: "xx-grande" -}) -); diff --git a/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js deleted file mode 100644 index de34f6770..000000000 --- a/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/es/LinkDialog", ({ - createLinkTitle: "Propiedades del enlace", - insertImageTitle: "Propiedades de la imagen", - url: "URL:", - text: "Descripción:", - target: "Destino:", - set: "Establecer", - currentWindow: "Ventana actual", - parentWindow: "Ventana padre", - topWindow: "Ventana superior", - newWindow: "Nueva ventana" -}) -); diff --git a/lib/dijit/_editor/nls/es/commands.js.uncompressed.js b/lib/dijit/_editor/nls/es/commands.js.uncompressed.js deleted file mode 100644 index 72e1b322a..000000000 --- a/lib/dijit/_editor/nls/es/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/es/commands", ({ - 'bold': 'Negrita', - 'copy': 'Copiar', - 'cut': 'Cortar', - 'delete': 'Suprimir', - 'indent': 'Sangría', - 'insertHorizontalRule': 'Regla horizontal', - 'insertOrderedList': 'Lista numerada', - 'insertUnorderedList': 'Lista con viñetas', - 'italic': 'Cursiva', - 'justifyCenter': 'Alinear centro', - 'justifyFull': 'Justificar', - 'justifyLeft': 'Alinear izquierda', - 'justifyRight': 'Alinear derecha', - 'outdent': 'Anular sangría', - 'paste': 'Pegar', - 'redo': 'Rehacer', - 'removeFormat': 'Eliminar formato', - 'selectAll': 'Seleccionar todo', - 'strikethrough': 'Tachado', - 'subscript': 'Subíndice', - 'superscript': 'Superíndice', - 'underline': 'Subrayado', - 'undo': 'Deshacer', - 'unlink': 'Eliminar enlace', - 'createLink': 'Crear enlace', - 'toggleDir': 'Conmutar dirección', - 'insertImage': 'Insertar imagen', - 'insertTable': 'Insertar/Editar tabla', - 'toggleTableBorder': 'Conmutar borde de tabla', - 'deleteTable': 'Suprimir tabla', - 'tableProp': 'Propiedad de tabla', - 'htmlToggle': 'Fuente HTML', - 'foreColor': 'Color de primer plano', - 'hiliteColor': 'Color de segundo plano', - 'plainFormatBlock': 'Estilo de párrafo', - 'formatBlock': 'Estilo de párrafo', - 'fontSize': 'Tamaño de font', - 'fontName': 'Nombre de font', - 'tabIndent': 'Sangría de tabulador', - "fullScreen": "Conmutar pantalla completa", - "viewSource": "Ver fuente HTML", - "print": "Imprimir", - "newPage": "Nueva página", - /* Error messages */ - 'systemShortcut': 'La acción "${0}" sólo está disponible en su navegador mediante un atajo de teclado. Utilice ${1}.', - 'ctrlKey':'control+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js deleted file mode 100644 index 30fa99971..000000000 --- a/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/fi/FontChoice", ({ - fontSize: "Koko", - fontName: "Fontti", - formatBlock: "Muotoile", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Ei mitään", - p: "Kappale", - h1: "Otsikko", - h2: "Alatason otsikko", - h3: "Alimman tason otsikko", - pre: "Esimuotoiltu", - 1: "xx-small", - 2: "x-small", - 3: "small", - 4: "medium", - 5: "large", - 6: "x-large", - 7: "xx-large" -}) -); diff --git a/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js deleted file mode 100644 index ad6cfceca..000000000 --- a/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/fi/LinkDialog", ({ - createLinkTitle: "Linkin ominaisuudet", - insertImageTitle: "Kuvan ominaisuudet", - url: "URL-osoite:", - text: "Kuvaus:", - target: "Kohde:", - set: "Aseta", - currentWindow: "Nykyinen ikkuna", - parentWindow: "Pääikkuna", - topWindow: "Päällimmäinen ikkuna", - newWindow: "Uusi ikkuna" -}) -); diff --git a/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js b/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js deleted file mode 100644 index 0eb730864..000000000 --- a/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/fi/commands", ({ - 'bold': 'Lihavointi', - 'copy': 'Kopioi', - 'cut': 'Leikkaa', - 'delete': 'Poista', - 'indent': 'Sisennä', - 'insertHorizontalRule': 'Vaakasuuntainen viiva', - 'insertOrderedList': 'Numeroitu luettelo', - 'insertUnorderedList': 'Numeroimaton luettelo', - 'italic': 'Kursivointi', - 'justifyCenter': 'Tasaus keskelle', - 'justifyFull': 'Tasaus', - 'justifyLeft': 'Tasaus vasemmalle', - 'justifyRight': 'Tasaus oikealle', - 'outdent': 'Ulonna', - 'paste': 'Liitä', - 'redo': 'Tee uudelleen', - 'removeFormat': 'Poista muotoilu', - 'selectAll': 'Valitse kaikki', - 'strikethrough': 'Yliviivaus', - 'subscript': 'Alennettu', - 'superscript': 'Korotettu', - 'underline': 'Alleviivaus', - 'undo': 'Kumoa', - 'unlink': 'Poista linkki', - 'createLink': 'Luo linkki', - 'toggleDir': 'Vaihda suuntaa', - 'insertImage': 'Lisää kuva', - 'insertTable': 'Lisää taulukko/muokkaa taulukkoa', - 'toggleTableBorder': 'Ota taulukon kehys käyttöön/poista kehys käytöstä', - 'deleteTable': 'Poista taulukko', - 'tableProp': 'Taulukon ominaisuudet', - 'htmlToggle': 'HTML-lähde', - 'foreColor': 'Edustaväri', - 'hiliteColor': 'Taustaväri', - 'plainFormatBlock': 'Kappaletyyli', - 'formatBlock': 'Kappaletyyli', - 'fontSize': 'Fonttikoko', - 'fontName': 'Fontin nimi', - 'tabIndent': 'Sarkainsisennys', - "fullScreen": "Vaihda koko näyttö", - "viewSource": "Näytä HTML-lähde", - "print": "Tulosta", - "newPage": "Uusi sivu", - /* Error messages */ - 'systemShortcut': 'Toiminto "${0}" on käytettävissä selaimessa vain näppäimistön pikatoiminnolla. Käytä seuraavaa: ${1}.', - 'ctrlKey':'Ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js deleted file mode 100644 index 8fba25433..000000000 --- a/lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/fr/FontChoice", ({ - fontSize: "Taille", - fontName: "Police", - formatBlock: "Mise en forme", - serif: "serif", - "sans-serif": "sans serif", - monospace: "espacement fixe", - cursive: "cursive", - fantasy: "fantaisie", - noFormat: "Néant", - p: "Paragraphe", - h1: "En-tête", - h2: "Sous-en-tête", - h3: "Sous-sous-en-tête", - pre: "Pré-mise en forme", - 1: "très très petite", - 2: "très petite", - 3: "petite", - 4: "moyenne", - 5: "grande", - 6: "très grande", - 7: "très très grande" -}) -); diff --git a/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js deleted file mode 100644 index 46ee185ad..000000000 --- a/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/fr/LinkDialog", ({ - createLinkTitle: "Propriétés du lien", - insertImageTitle: "Propriétés de l'image", - url: "URL :", - text: "Description :", - target: "Cible :", - set: "Définir", - currentWindow: "Fenêtre actuelle", - parentWindow: "Fenêtre parent", - topWindow: "Fenêtre supérieure", - newWindow: "Nouvelle fenêtre" -}) -); diff --git a/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js b/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js deleted file mode 100644 index 27b6a4031..000000000 --- a/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/fr/commands", ({ - 'bold': 'Gras', - 'copy': 'Copier', - 'cut': 'Couper', - 'delete': 'Supprimer', - 'indent': 'Retrait', - 'insertHorizontalRule': 'Règle horizontale', - 'insertOrderedList': 'Liste numérotée', - 'insertUnorderedList': 'Liste à puces', - 'italic': 'Italique', - 'justifyCenter': 'Aligner au centre', - 'justifyFull': 'Justifier', - 'justifyLeft': 'Aligner à gauche', - 'justifyRight': 'Aligner à droite', - 'outdent': 'Retrait négatif', - 'paste': 'Coller', - 'redo': 'Rétablir', - 'removeFormat': 'Supprimer la mise en forme', - 'selectAll': 'Sélectionner tout', - 'strikethrough': 'Barrer', - 'subscript': 'Indice', - 'superscript': 'Exposant', - 'underline': 'Souligner', - 'undo': 'Annuler', - 'unlink': 'Supprimer le lien', - 'createLink': 'Créer un lien', - 'toggleDir': 'Changer de sens', - 'insertImage': 'Insérer une image', - 'insertTable': 'Insérer/Modifier un tableau', - 'toggleTableBorder': 'Afficher/Masquer la bordure du tableau', - 'deleteTable': 'Supprimer le tableau', - 'tableProp': 'Propriété du tableau', - 'htmlToggle': 'Source HTML', - 'foreColor': 'Couleur d\'avant-plan', - 'hiliteColor': 'Couleur d\'arrière-plan', - 'plainFormatBlock': 'Style de paragraphe', - 'formatBlock': 'Style de paragraphe', - 'fontSize': 'Taille de police', - 'fontName': 'Nom de police', - 'tabIndent': 'Retrait de tabulation', - "fullScreen": "Basculer en plein écran", - "viewSource": "Afficher la source HTML", - "print": "Imprimer", - "newPage": "Nouvelle page", - /* Error messages */ - 'systemShortcut': 'L\'action "${0}" est disponible dans votre navigateur uniquement, par le biais d\'un raccourci-clavier. Utilisez ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js deleted file mode 100644 index c8bee2c34..000000000 --- a/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/he/FontChoice", ({ - fontSize: "גודל", - fontName: "גופן", - formatBlock: "עיצוב", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "ללא ", - p: "פיסקה", - h1: "כותרת", - h2: "תת-כותרת", - h3: "תת-תת-כותרת", - pre: "מעוצב מראש", - 1: "קטן ביות", - 2: "קטן מאוד", - 3: "קטן", - 4: "בינוני", - 5: "גדול", - 6: "גדול מאוד", - 7: "גדול ביותר" -}) -); diff --git a/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js deleted file mode 100644 index 5a5de943c..000000000 --- a/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/he/LinkDialog", ({ - createLinkTitle: "תכונות קישור", - insertImageTitle: "תכונות תמונה", - url: "URL:", - text: "תיאור:", - target: "יעד:", - set: "הגדרה", - currentWindow: "חלון נוכחי", - parentWindow: "חלון אב", - topWindow: "חלון עליון", - newWindow: "חלון חדש" -}) -); diff --git a/lib/dijit/_editor/nls/he/commands.js.uncompressed.js b/lib/dijit/_editor/nls/he/commands.js.uncompressed.js deleted file mode 100644 index cf719d478..000000000 --- a/lib/dijit/_editor/nls/he/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/he/commands", ({ - 'bold': 'מודגש', - 'copy': 'עותק', - 'cut': 'גזירה', - 'delete': 'מחיקה', - 'indent': 'הגדלת כניסה', - 'insertHorizontalRule': 'קו אופקי', - 'insertOrderedList': 'רשימה ממוספרת', - 'insertUnorderedList': 'רשימה עם תבליטים', - 'italic': 'נטוי', - 'justifyCenter': 'יישור למרכז', - 'justifyFull': 'יישור דו-צדדי', - 'justifyLeft': 'יישור לשמאל', - 'justifyRight': 'יישור לימין', - 'outdent': 'הקטנת כניסה', - 'paste': 'הדבקה', - 'redo': 'שחזור פעולה', - 'removeFormat': 'סילוק עיצוב', - 'selectAll': 'בחירת הכל', - 'strikethrough': 'קו חוצה', - 'subscript': 'כתב תחתי', - 'superscript': 'כתב עילי', - 'underline': 'קו תחתי', - 'undo': 'ביטול פעולה', - 'unlink': 'סילוק הקישור', - 'createLink': 'יצירת קישור', - 'toggleDir': 'מיתוג כיוון', - 'insertImage': 'הוספת תמונה', - 'insertTable': 'הוספת/עריכת טבלה', - 'toggleTableBorder': 'מיתוג גבול טבלה', - 'deleteTable': 'מחיקת טבלה', - 'tableProp': 'תכונת טבלה', - 'htmlToggle': 'מקור HTML', - 'foreColor': 'צבע חזית', - 'hiliteColor': 'צבע רקע', - 'plainFormatBlock': 'סגנון פיסקה', - 'formatBlock': 'סגנון פיסקה', - 'fontSize': 'גופן יחסי', - 'fontName': 'שם גופן', - 'tabIndent': 'כניסת טאב', - "fullScreen": "מיתוג מסך מלא", - "viewSource": "הצגת מקור HTML", - "print": "הדפסה", - "newPage": "דף חדש", - /* Error messages */ - 'systemShortcut': 'הפעולה "${0}" זמינה בדפדפן רק באמצעות קיצור דרך במקלדת. השתמשו בקיצור ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js deleted file mode 100644 index 82e9bad43..000000000 --- a/lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/hr/FontChoice", ({ - fontSize: "Veličina", - fontName: "Font", - formatBlock: "Oblikovanje", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "jednaki razmak", - cursive: "rukopisni", - fantasy: "fantastika", - noFormat: "Nijedan", - p: "Odlomak", - h1: "Naslov", - h2: "Podnaslov", - h3: "Pod-podnaslov", - pre: "Prethodno formatirano", - 1: "vrlo vrlo malo", - 2: "vrlo malo", - 3: "malo", - 4: "srednje", - 5: "veliko", - 6: "vrlo veliko", - 7: "vrlo vrlo veliko" -}) -); diff --git a/lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js deleted file mode 100644 index 43869cceb..000000000 --- a/lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/hr/LinkDialog", ({ - createLinkTitle: "Svojstva veze", - insertImageTitle: "Svojstva slike", - url: "URL:", - text: "Opis:", - target: "Cilj:", - set: "Postavi", - currentWindow: "Aktivni prozor", - parentWindow: "Nadređeni prozor", - topWindow: "Najviši prozor", - newWindow: "Novi prozor" -}) -); diff --git a/lib/dijit/_editor/nls/hr/commands.js.uncompressed.js b/lib/dijit/_editor/nls/hr/commands.js.uncompressed.js deleted file mode 100644 index d61bf4899..000000000 --- a/lib/dijit/_editor/nls/hr/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/hr/commands", ({ - 'bold': 'Podebljaj', - 'copy': 'Kopiraj', - 'cut': 'Izreži', - 'delete': 'Izbriši', - 'indent': 'Uvuci', - 'insertHorizontalRule': 'Vodoravno ravnalo', - 'insertOrderedList': 'Numerirani popis', - 'insertUnorderedList': 'Popis s grafičkim oznakama', - 'italic': 'Kurziv', - 'justifyCenter': 'Centriraj', - 'justifyFull': 'Poravnaj', - 'justifyLeft': 'Poravnaj lijevo', - 'justifyRight': 'Poravnaj desno', - 'outdent': 'Izvuci', - 'paste': 'Zalijepi', - 'redo': 'Ponovno napravi', - 'removeFormat': 'Ukloni oblikovanje', - 'selectAll': 'Izaberi sve', - 'strikethrough': 'Precrtaj', - 'subscript': 'Indeks', - 'superscript': 'Superskript', - 'underline': 'Podcrtaj', - 'undo': 'Poništi', - 'unlink': 'Ukloni vezu', - 'createLink': 'Kreiraj vezu', - 'toggleDir': 'Prebaci smjer', - 'insertImage': 'Umetni sliku', - 'insertTable': 'Umetni/Uredi tablicu', - 'toggleTableBorder': 'Prebaci rub tablice', - 'deleteTable': 'Izbriši tablicu', - 'tableProp': 'Svojstvo tablice', - 'htmlToggle': 'HTML izvor', - 'foreColor': 'Boja prednjeg plana', - 'hiliteColor': 'Boja pozadine', - 'plainFormatBlock': 'Stil odlomka', - 'formatBlock': 'Stil odlomka', - 'fontSize': 'Veličina fonta', - 'fontName': 'Ime fonta', - 'tabIndent': 'Tabulator uvlačenja', - "fullScreen": "Prebaci na potpun ekran", - "viewSource": "Pogledaj HTML izvor", - "print": "Ispis", - "newPage": "Nova stranica", - /* Error messages */ - 'systemShortcut': '"${0}" akcija je dostupna jedino u vašem pregledniku upotrebom prečice tipkovnice. Koristite ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js deleted file mode 100644 index 2868348ed..000000000 --- a/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/hu/FontChoice", ({ - fontSize: "Méret", - fontName: "Betűtípus", - formatBlock: "Formátum", - serif: "talpas", - "sans-serif": "talpatlan", - monospace: "rögzített szélességű", - cursive: "kurzív", - fantasy: "fantázia", - noFormat: "Nincs", - p: "Bekezdés", - h1: "Címsor", - h2: "Alcím", - h3: "Al-alcím", - pre: "Előformázott", - 1: "xx-kicsi", - 2: "x-kicsi", - 3: "kicsi", - 4: "közepes", - 5: "nagy", - 6: "x-nagy", - 7: "xx-nagy" -}) -); diff --git a/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js deleted file mode 100644 index 6558a2b42..000000000 --- a/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/hu/LinkDialog", ({ - createLinkTitle: "Hivatkozás tulajdonságai", - insertImageTitle: "Kép tulajdonságai", - url: "URL:", - text: "Leírás:", - target: "Cél:", - set: "Beállítás", - currentWindow: "Aktuális ablak", - parentWindow: "Szülő ablak", - topWindow: "Legfelső szintű ablak", - newWindow: "Új ablak" -}) -); diff --git a/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js b/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js deleted file mode 100644 index 10b86ea90..000000000 --- a/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/hu/commands", ({ - 'bold': 'Félkövér', - 'copy': 'Másolás', - 'cut': 'Kivágás', - 'delete': 'Törlés', - 'indent': 'Behúzás', - 'insertHorizontalRule': 'Vízszintes vonalzó', - 'insertOrderedList': 'Számozott lista', - 'insertUnorderedList': 'Felsorolásjeles lista', - 'italic': 'Dőlt', - 'justifyCenter': 'Középre igazítás', - 'justifyFull': 'Sorkizárás', - 'justifyLeft': 'Balra igazítás', - 'justifyRight': 'Jobbra igazítás', - 'outdent': 'Negatív behúzás', - 'paste': 'Beillesztés', - 'redo': 'Újra', - 'removeFormat': 'Formázás eltávolítása', - 'selectAll': 'Összes kijelölése', - 'strikethrough': 'Áthúzott', - 'subscript': 'Alsó index', - 'superscript': 'Felső index', - 'underline': 'Aláhúzott', - 'undo': 'Visszavonás', - 'unlink': 'Hivatkozás eltávolítása', - 'createLink': 'Hivatkozás létrehozása', - 'toggleDir': 'Irány váltókapcsoló', - 'insertImage': 'Kép beszúrása', - 'insertTable': 'Táblázat beszúrása/szerkesztése', - 'toggleTableBorder': 'Táblázatszegély ki-/bekapcsolása', - 'deleteTable': 'Táblázat törlése', - 'tableProp': 'Táblázat tulajdonságai', - 'htmlToggle': 'HTML forrás', - 'foreColor': 'Előtérszín', - 'hiliteColor': 'Háttérszín', - 'plainFormatBlock': 'Bekezdés stílusa', - 'formatBlock': 'Bekezdés stílusa', - 'fontSize': 'Betűméret', - 'fontName': 'Betűtípus', - 'tabIndent': 'Tab behúzás', - "fullScreen": "Váltás teljes képernyőre", - "viewSource": "HTML forrás megjelenítése", - "print": "Nyomtatás", - "newPage": "Új oldal", - /* Error messages */ - 'systemShortcut': 'A(z) "${0}" művelet a böngészőben csak billentyűparancs használatával érhető el. Használja a következőt: ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js deleted file mode 100644 index 1d181d3b3..000000000 --- a/lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/it/FontChoice", ({ - fontSize: "Dimensione", - fontName: "Carattere", - formatBlock: "Formato", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "spaziatura fissa", - cursive: "corsivo", - fantasy: "fantasy", - noFormat: "Nessuna", - p: "Paragrafo", - h1: "Intestazione", - h2: "Sottointestazione", - h3: "Sottointestazione secondaria", - pre: "Preformattato", - 1: "piccolissimo", - 2: "molto piccolo", - 3: "piccolo", - 4: "medio", - 5: "grande", - 6: "molto grande", - 7: "grandissimo" -}) -); diff --git a/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js deleted file mode 100644 index e59b36583..000000000 --- a/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/it/LinkDialog", ({ - createLinkTitle: "Proprietà collegamento", - insertImageTitle: "Proprietà immagine", - url: "URL:", - text: "Descrizione:", - target: "Destinazione:", - set: "Imposta", - currentWindow: "Finestra corrente", - parentWindow: "Finestra padre", - topWindow: "Finestra superiore", - newWindow: "Nuova finestra" -}) -); diff --git a/lib/dijit/_editor/nls/it/commands.js.uncompressed.js b/lib/dijit/_editor/nls/it/commands.js.uncompressed.js deleted file mode 100644 index 5b1b53a4b..000000000 --- a/lib/dijit/_editor/nls/it/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/it/commands", ({ - 'bold': 'Grassetto', - 'copy': 'Copia', - 'cut': 'Taglia', - 'delete': 'Annulla', - 'indent': 'Rientra', - 'insertHorizontalRule': 'Righello orizzontale', - 'insertOrderedList': 'Elenco numerato', - 'insertUnorderedList': 'Elenco a punti', - 'italic': 'Corsivo', - 'justifyCenter': 'Allinea al centro', - 'justifyFull': 'Giustifica', - 'justifyLeft': 'Allinea a sinistra', - 'justifyRight': 'Allinea a destra', - 'outdent': 'Annulla rientro', - 'paste': 'Incolla', - 'redo': 'Ripeti', - 'removeFormat': 'Rimuovi formato', - 'selectAll': 'Seleziona tutto', - 'strikethrough': 'Barrato', - 'subscript': 'Pedice', - 'superscript': 'Apice', - 'underline': 'Sottolinea', - 'undo': 'Annulla', - 'unlink': 'Rimuovi collegamento', - 'createLink': 'Crea collegamento', - 'toggleDir': 'Attiva/Disattiva direzione', - 'insertImage': 'Inserisci immagine', - 'insertTable': 'Inserisci/Modifica tabella', - 'toggleTableBorder': 'Attiva/Disattiva bordo tabella', - 'deleteTable': 'Elimina tabella', - 'tableProp': 'Proprietà tabella', - 'htmlToggle': 'Origine HTML', - 'foreColor': 'Colore in primo piano', - 'hiliteColor': 'Colore di sfondo', - 'plainFormatBlock': 'Stile paragrafo', - 'formatBlock': 'Stile paragrafo', - 'fontSize': 'Dimensione tipo di carattere', - 'fontName': 'Nome tipo di carattere', - 'tabIndent': 'Rientro tabulazione', - "fullScreen": "Attiva/Disattiva schermo intero", - "viewSource": "Visualizza origine HTML", - "print": "Stampa", - "newPage": "Nuova pagina", - /* Error messages */ - 'systemShortcut': 'Azione "${0}" disponibile nel browser solo utilizzando una scelta rapida da tastiera. Utilizzare ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js deleted file mode 100644 index 51232f1a5..000000000 --- a/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/ja/FontChoice", ({ - fontSize: "サイズ", - fontName: "フォント", - formatBlock: "フォーマット", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "なし", - p: "段落", - h1: "見出し", - h2: "副見出し", - h3: "副見出しの副見出し", - pre: "事前フォーマット済み", - 1: "超極小", - 2: "極小", - 3: "小", - 4: "標準", - 5: "大", - 6: "特大", - 7: "超特大" -}) -); diff --git a/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js deleted file mode 100644 index 6f4e06567..000000000 --- a/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/ja/LinkDialog", ({ - createLinkTitle: "リンク・プロパティー", - insertImageTitle: "イメージ・プロパティー", - url: "URL:", - text: "説明:", - target: "ターゲット: ", - set: "設定", - currentWindow: "現在のウィンドウ", - parentWindow: "親ウィンドウ", - topWindow: "最上位ウィンドウ", - newWindow: "新規ウィンドウ" -}) -); diff --git a/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js deleted file mode 100644 index 8c41419c5..000000000 --- a/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/ja/commands", ({ - 'bold': '太字', - 'copy': 'コピー', - 'cut': '切り取り', - 'delete': '削除', - 'indent': 'インデント', - 'insertHorizontalRule': '水平罫線', - 'insertOrderedList': '番号付きリスト', - 'insertUnorderedList': '黒丸付きリスト', - 'italic': 'イタリック', - 'justifyCenter': '中央揃え', - 'justifyFull': '両端揃え', - 'justifyLeft': '左揃え', - 'justifyRight': '右揃え', - 'outdent': 'アウトデント', - 'paste': '貼り付け', - 'redo': 'やり直し', - 'removeFormat': '形式の削除', - 'selectAll': 'すべて選択', - 'strikethrough': '取り消し線', - 'subscript': '下付き文字', - 'superscript': '上付き文字', - 'underline': '下線', - 'undo': '元に戻す', - 'unlink': 'リンクの削除', - 'createLink': 'リンクの作成', - 'toggleDir': '方向の切り替え', - 'insertImage': 'イメージの挿入', - 'insertTable': 'テーブルの挿入/編集', - 'toggleTableBorder': 'テーブルボーダーの切り替え', - 'deleteTable': 'テーブルの削除', - 'tableProp': 'テーブルプロパティ', - 'htmlToggle': 'HTML ソース', - 'foreColor': '前景色', - 'hiliteColor': '背景色', - 'plainFormatBlock': '段落スタイル', - 'formatBlock': '段落スタイル', - 'fontSize': 'フォントサイズ', - 'fontName': 'フォント名', - 'tabIndent': 'タブインデント', - "fullScreen": "全画面表示に切り替え", - "viewSource": "HTML ソースの表示", - "print": "印刷", - "newPage": "新しいページ", - /* Error messages */ - 'systemShortcut': '"${0}" アクションを使用できるのは、ブラウザーでキーボードショートカットを使用する場合のみです。 ${1} を使用してください。', - 'ctrlKey':'Ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js deleted file mode 100644 index e7a52c87a..000000000 --- a/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/kk/FontChoice", ({ - fontSize: "Өлшемі", - fontName: "Қаріп", - formatBlock: "Пішім", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "көлбеу", - fantasy: "fantasy", - noFormat: "Ешбір", - p: "Еже", - h1: "Тақырып", - h2: "Ішкі тақырып", - h3: "Ішкі-ішкі тақырып", - pre: "Алдын ала пішімделген", - 1: "xx-кіші", - 2: "x-кіші", - 3: "кіші", - 4: "орташа", - 5: "үлкен", - 6: "x-үлкен", - 7: "xx-үлкен" -}) -); diff --git a/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js deleted file mode 100644 index 1a78a3295..000000000 --- a/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/kk/LinkDialog", ({ - createLinkTitle: "Сілтеме сипаттары", - insertImageTitle: "Сурет сипаттары", - url: "URL:", - text: "Сипаттама:", - target: "Мақсат:", - set: "Орнату", - currentWindow: "Ағымдағы терезе", - parentWindow: "Басты терезе", - topWindow: "Ең жоғарғы терезе", - newWindow: "Жаңа терезе" -}) -); diff --git a/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js b/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js deleted file mode 100644 index ea78dd296..000000000 --- a/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/kk/commands", ({ - 'bold': 'Қалың', - 'copy': 'Көшіру', - 'cut': 'Қиып алу', - 'delete': 'Жою', - 'indent': 'Шегіндіру', - 'insertHorizontalRule': 'Көлденең сызғыш', - 'insertOrderedList': 'Нөмірленген тізім', - 'insertUnorderedList': 'Таңбалауыш тізім', - 'italic': 'Көлбеу', - 'justifyCenter': 'Ортасы бойынша туралау', - 'justifyFull': 'Туралау', - 'justifyLeft': 'Сол жақ бойынша туралау', - 'justifyRight': 'Оң жақ бойынша туралау', - 'outdent': 'Солға ығысу', - 'paste': 'Қою', - 'redo': 'Қайтару', - 'removeFormat': 'Пішімді алып тастау', - 'selectAll': 'Барлығын таңдау', - 'strikethrough': 'Сызылған', - 'subscript': 'Жоласты', - 'superscript': 'Жолүсті', - 'underline': 'Асты сызылған', - 'undo': 'Болдырмау', - 'unlink': 'Сілтемені алып тастау', - 'createLink': 'Сілтеме жасау', - 'toggleDir': 'Бағытты қосу', - 'insertImage': 'Суретті кірістіру', - 'insertTable': 'Кестені кірістіру/өңдеу', - 'toggleTableBorder': 'Кесте жиегін қосу', - 'deleteTable': 'Кестені жою', - 'tableProp': 'Кесте сипаты', - 'htmlToggle': 'HTML көзі', - 'foreColor': 'Алды түсі', - 'hiliteColor': 'Өң түсі', - 'plainFormatBlock': 'Еже мәнері', - 'formatBlock': 'Еже мәнері', - 'fontSize': 'Қаріп өлшемі', - 'fontName': 'Қаріп атауы', - 'tabIndent': 'Қойынды шегінісі', - "fullScreen": "Толық экранды қосу", - "viewSource": "HTML көзін қарау", - "print": "Басып шығару", - "newPage": "Жаңа бет", - /* Error messages */ - 'systemShortcut': '"${0}" әрекеті шолғышта тек пернелер тіркесімі арқылы қол жетімді. ${1} пайдаланыңыз.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js deleted file mode 100644 index ae20a2c66..000000000 --- a/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/ko/FontChoice", ({ - fontSize: "크기", - fontName: "글꼴", - formatBlock: "서식", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "없음", - p: "단락", - h1: "제목", - h2: "부제목", - h3: "하위 부제목", - pre: "서식이 지정됨", - 1: "가장 작게", - 2: "조금 작게", - 3: "작게", - 4: "중간", - 5: "크게", - 6: "조금 크게", - 7: "가장 크게" -}) -); diff --git a/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js deleted file mode 100644 index 02d50173f..000000000 --- a/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/ko/LinkDialog", ({ - createLinkTitle: "링크 특성", - insertImageTitle: "이미지 특성", - url: "URL:", - text: "설명:", - target: "대상", - set: "설정", - currentWindow: "현재 창", - parentWindow: "상위 창", - topWindow: "최상위 창", - newWindow: "새 창" -}) -); diff --git a/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js deleted file mode 100644 index 893da2609..000000000 --- a/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/ko/commands", ({ - 'bold': '굵게', - 'copy': '복사', - 'cut': '잘라내기', - 'delete': '삭제', - 'indent': '들여쓰기', - 'insertHorizontalRule': '가로 줄', - 'insertOrderedList': '번호 목록', - 'insertUnorderedList': '글머리표 목록', - 'italic': '기울임꼴', - 'justifyCenter': '가운데 맞춤', - 'justifyFull': '양쪽 맞춤', - 'justifyLeft': '왼쪽 맞춤', - 'justifyRight': '오른쪽 맞춤', - 'outdent': '내어쓰기', - 'paste': '붙여넣기', - 'redo': '다시 실행', - 'removeFormat': '형식 제거', - 'selectAll': '모두 선택', - 'strikethrough': '취소선', - 'subscript': '아래첨자', - 'superscript': '위첨자', - 'underline': '밑줄', - 'undo': '실행 취소', - 'unlink': '링크 제거', - 'createLink': '링크 작성', - 'toggleDir': '방향 토글', - 'insertImage': '이미지 삽입', - 'insertTable': '테이블 삽입/편집', - 'toggleTableBorder': '테이블 외곽선 토글', - 'deleteTable': '테이블 삭제', - 'tableProp': '테이블 특성', - 'htmlToggle': 'HTML 소스', - 'foreColor': '전경색', - 'hiliteColor': '배경색', - 'plainFormatBlock': '단락 양식', - 'formatBlock': '단락 양식', - 'fontSize': '글꼴 크기', - 'fontName': '글꼴 이름', - 'tabIndent': '탭 들여쓰기', - "fullScreen": "전체 화면 토글", - "viewSource": "HTML 소스 보기", - "print": "인쇄", - "newPage": "새 페이지", - /* Error messages */ - 'systemShortcut': '"${0}" 조치는 브라우저에서 키보드 단축키를 통해서만 사용 가능합니다. ${1}을(를) 사용하십시오.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js deleted file mode 100644 index edcbd6707..000000000 --- a/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/nb/FontChoice", ({ - fontSize: "Størrelse", - fontName: "Skrift", - formatBlock: "Format", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "kursiv", - fantasy: "fantasi", - noFormat: "Ingen", - p: "Avsnitt", - h1: "Overskrift", - h2: "Undertittel", - h3: "Under-undertittel", - pre: "Forhåndsformatert", - 1: "xx-liten", - 2: "x-liten", - 3: "liten", - 4: "middels", - 5: "stor", - 6: "x-stor", - 7: "xx-stor" -}) -); diff --git a/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js deleted file mode 100644 index 02595e10f..000000000 --- a/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/nb/LinkDialog", ({ - createLinkTitle: "Koblingsegenskaper", - insertImageTitle: "Bildeegenskaper", - url: "URL:", - text: "Beskrivelse:", - target: "Mål:", - set: "Definer", - currentWindow: "Gjeldende vindu", - parentWindow: "Overordnet vindu", - topWindow: "Øverste vindu", - newWindow: "Nytt vindu" -}) -); diff --git a/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js b/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js deleted file mode 100644 index 4ffc6c151..000000000 --- a/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/nb/commands", ({ - 'bold': 'Fet', - 'copy': 'Kopier', - 'cut': 'Klipp ut', - 'delete': 'Slett', - 'indent': 'Innrykk', - 'insertHorizontalRule': 'Vannrett strek', - 'insertOrderedList': 'Nummerert liste', - 'insertUnorderedList': 'Punktliste', - 'italic': 'Kursiv', - 'justifyCenter': 'Midtstill', - 'justifyFull': 'Juster', - 'justifyLeft': 'Venstrejuster', - 'justifyRight': 'Høyrejuster', - 'outdent': 'Fjern innrykk', - 'paste': 'Lim inn', - 'redo': 'Gjør om', - 'removeFormat': 'Fjern format', - 'selectAll': 'Velg alle', - 'strikethrough': 'Gjennomstreking', - 'subscript': 'Senket skrift', - 'superscript': 'Hevet skrift', - 'underline': 'Understreking', - 'undo': 'Angre', - 'unlink': 'Fjern kobling', - 'createLink': 'Opprett kobling', - 'toggleDir': 'Bytt retning', - 'insertImage': 'Sett inn bilde', - 'insertTable': 'Sett inn/rediger tabell', - 'toggleTableBorder': 'Bytt tabellkant', - 'deleteTable': 'Slett tabell', - 'tableProp': 'Tabellegenskap', - 'htmlToggle': 'HTML-kilde', - 'foreColor': 'Forgrunnsfarge', - 'hiliteColor': 'Bakgrunnsfarge', - 'plainFormatBlock': 'Avsnittsstil', - 'formatBlock': 'Avsnittsstil', - 'fontSize': 'Skriftstørrelse', - 'fontName': 'Skriftnavn', - 'tabIndent': 'Tabulatorinnrykk', - "fullScreen": "Slå på/av full skjerm", - "viewSource": "Vis HTML-kilde", - "print": "Skriv ut", - "newPage": "Ny side", - /* Error messages */ - 'systemShortcut': 'Handlingen "${0}" er bare tilgjengelig i nettleseren ved hjelp av en tastatursnarvei. Bruk ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js deleted file mode 100644 index 05657e5d0..000000000 --- a/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/nl/FontChoice", ({ - fontSize: "Grootte", - fontName: "Lettertype", - formatBlock: "Opmaak", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursief", - fantasy: "fantasy", - noFormat: "Geen", - p: "Alinea", - h1: "Kop", - h2: "Subkop", - h3: "Sub-subkop", - pre: "Vooraf opgemaakt", - 1: "xx-klein", - 2: "x-klein", - 3: "klein", - 4: "gemiddeld", - 5: "groot", - 6: "x-groot", - 7: "xx-groot" -}) -); diff --git a/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js deleted file mode 100644 index 63cbfd8a8..000000000 --- a/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/nl/LinkDialog", ({ - createLinkTitle: "Linkeigenschappen", - insertImageTitle: "Afbeeldingseigenschappen", - url: "URL:", - text: "Beschrijving:", - target: "Doel:", - set: "Instellen", - currentWindow: "Huidig venster", - parentWindow: "Hoofdvenster", - topWindow: "Bovenste venster", - newWindow: "Nieuw venster" -}) -); diff --git a/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js b/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js deleted file mode 100644 index 588289fad..000000000 --- a/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/nl/commands", ({ - 'bold': 'Vet', - 'copy': 'Kopiëren', - 'cut': 'Knippen', - 'delete': 'Wissen', - 'indent': 'Inspringen', - 'insertHorizontalRule': 'Horizontale liniaal', - 'insertOrderedList': 'Genummerde lijst', - 'insertUnorderedList': 'Lijst met opsommingstekens', - 'italic': 'Cursief', - 'justifyCenter': 'Centreren', - 'justifyFull': 'Uitvullen', - 'justifyLeft': 'Links uitlijnen', - 'justifyRight': 'Rechts uitlijnen', - 'outdent': 'Uitspringen', - 'paste': 'Plakken', - 'redo': 'Opnieuw', - 'removeFormat': 'Opmaak verwijderen', - 'selectAll': 'Alles selecteren', - 'strikethrough': 'Doorhalen', - 'subscript': 'Subscript', - 'superscript': 'Superscript', - 'underline': 'Onderstrepen', - 'undo': 'Ongedaan maken', - 'unlink': 'Link verwijderen', - 'createLink': 'Link maken', - 'toggleDir': 'Schrijfrichting wijzigen', - 'insertImage': 'Afbeelding invoegen', - 'insertTable': 'Tabel invoegen/bewerken', - 'toggleTableBorder': 'Tabelkader wijzigen', - 'deleteTable': 'Tabel wissen', - 'tableProp': 'Tabeleigenschap', - 'htmlToggle': 'HTML-bron', - 'foreColor': 'Voorgrondkleur', - 'hiliteColor': 'Achtergrondkleur', - 'plainFormatBlock': 'Alineastijl', - 'formatBlock': 'Alineastijl', - 'fontSize': 'Lettergrootte', - 'fontName': 'Lettertype', - 'tabIndent': 'Inspringen', - "fullScreen": "Volledig scherm in-/uitschakelen", - "viewSource": "HTML-bron bekijken", - "print": "Afdrukken", - "newPage": "Nieuwe pagina", - /* Error messages */ - 'systemShortcut': 'De actie "${0}" is alleen beschikbaar in uw browser via een sneltoetscombinatie. Gebruik ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js deleted file mode 100644 index d19712073..000000000 --- a/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/pl/FontChoice", ({ - fontSize: "Rozmiar", - fontName: "Czcionka", - formatBlock: "Format", - serif: "szeryfowa", - "sans-serif": "bezszeryfowa", - monospace: "czcionka o stałej szerokości", - cursive: "kursywa", - fantasy: "fantazyjna", - noFormat: "Brak", - p: "Akapit", - h1: "Nagłówek", - h2: "Nagłówek 2-go poziomu", - h3: "Nagłówek 3-go poziomu", - pre: "Wstępnie sformatowane", - 1: "najmniejsza", - 2: "mniejsza", - 3: "mała", - 4: "średnia", - 5: "duże", - 6: "większa", - 7: "największa" -}) -); diff --git a/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js deleted file mode 100644 index 5ff35a305..000000000 --- a/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/pl/LinkDialog", ({ - createLinkTitle: "Właściwości odsyłacza", - insertImageTitle: "Właściwości obrazu", - url: "Adres URL:", - text: "Opis:", - target: "Docelowe:", - set: "Ustaw", - currentWindow: "Bieżące okno", - parentWindow: "Okno macierzyste", - topWindow: "Okno najwyższego poziomu", - newWindow: "Nowe okno" -}) -); diff --git a/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js b/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js deleted file mode 100644 index e84a7aa60..000000000 --- a/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/pl/commands", ({ - 'bold': 'Pogrubienie', - 'copy': 'Kopiuj', - 'cut': 'Wytnij', - 'delete': 'Usuń', - 'indent': 'Wcięcie', - 'insertHorizontalRule': 'Linijka pozioma', - 'insertOrderedList': 'Lista numerowana', - 'insertUnorderedList': 'Lista wypunktowana', - 'italic': 'Kursywa', - 'justifyCenter': 'Wyśrodkowanie', - 'justifyFull': 'Wyrównaj do lewej i prawej', - 'justifyLeft': 'Wyrównanie do lewej', - 'justifyRight': 'Wyrównanie do prawej', - 'outdent': 'Usuwanie wcięcia', - 'paste': 'Wklej', - 'redo': 'Ponów', - 'removeFormat': 'Usuń formatowanie', - 'selectAll': 'Zaznacz wszystko', - 'strikethrough': 'Przekreślenie', - 'subscript': 'Indeks dolny', - 'superscript': 'Indeks górny', - 'underline': 'Podkreślenie', - 'undo': 'Cofnij', - 'unlink': 'Usuń odsyłacz', - 'createLink': 'Utwórz odsyłacz', - 'toggleDir': 'Przełącz kierunek', - 'insertImage': 'Wstaw obraz', - 'insertTable': 'Wstaw/edytuj tabelę', - 'toggleTableBorder': 'Przełącz ramkę tabeli', - 'deleteTable': 'Usuń tabelę', - 'tableProp': 'Właściwość tabeli', - 'htmlToggle': 'Źródło HTML', - 'foreColor': 'Kolor pierwszego planu', - 'hiliteColor': 'Kolor tła', - 'plainFormatBlock': 'Styl akapitu', - 'formatBlock': 'Styl akapitu', - 'fontSize': 'Rozmiar czcionki', - 'fontName': 'Nazwa czcionki', - 'tabIndent': 'Wcięcie o tabulator', - "fullScreen": "Przełącz pełny ekran", - "viewSource": "Wyświetl kod źródłowy HTML", - "print": "Drukuj", - "newPage": "Nowa strona", - /* Error messages */ - 'systemShortcut': 'Działanie ${0} jest dostępne w tej przeglądarce wyłącznie przy użyciu skrótu klawiaturowego. Należy użyć klawiszy ${1}.', - 'ctrlKey':'Ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js deleted file mode 100644 index b06f43f23..000000000 --- a/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/pt-pt/FontChoice", ({ - fontSize: "Tamanho", - fontName: "Tipo de letra", - formatBlock: "Formato", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Nenhum", - p: "Parágrafo", - h1: "Título", - h2: "Sub-título", - h3: "Sub-subtítulo", - pre: "Pré-formatado", - 1: "xxs", - 2: "xs", - 3: "small", - 4: "medium", - 5: "large", - 6: "xl", - 7: "xxl" -}) -); diff --git a/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js deleted file mode 100644 index ff0409226..000000000 --- a/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/pt-pt/LinkDialog", ({ - createLinkTitle: "Propriedades da ligação", - insertImageTitle: "Propriedades da imagem", - url: "URL:", - text: "Descrição:", - target: "Destino:", - set: "Definir", - currentWindow: "Janela actual", - parentWindow: "Janela ascendente", - topWindow: "Janela superior", - newWindow: "Nova janela" -}) -); diff --git a/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js b/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js deleted file mode 100644 index 18cc55828..000000000 --- a/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js +++ /dev/null @@ -1,49 +0,0 @@ -define( -"dijit/_editor/nls/pt-pt/commands", ({ - 'bold': 'Negrito', - 'copy': 'Copiar', - 'cut': 'Cortar', - 'delete': 'Eliminar', - 'indent': 'Indentar', - 'insertHorizontalRule': 'Régua horizontal', - 'insertOrderedList': 'Lista numerada', - 'insertUnorderedList': 'Lista marcada', - 'italic': 'Itálico', - 'justifyCenter': 'Alinhar ao centro', - 'justifyFull': 'Justificar', - 'justifyLeft': 'Alinhar à esquerda', - 'justifyRight': 'Alinhar à direita', - 'outdent': 'Recuar', - 'paste': 'Colar', - 'redo': 'Repetir', - 'removeFormat': 'Remover formato', - 'selectAll': 'Seleccionar tudo', - 'strikethrough': 'Rasurado', - 'subscript': 'Inferior à linha', - 'superscript': 'Superior à linha', - 'underline': 'Sublinhado', - 'undo': 'Anular', - 'unlink': 'Remover ligação', - 'createLink': 'Criar ligação', - 'toggleDir': 'Alternar direcção', - 'insertImage': 'Inserir imagem', - 'insertTable': 'Inserir/Editar tabela', - 'toggleTableBorder': 'Alternar contorno da tabela', - 'deleteTable': 'Eliminar tabela', - 'tableProp': 'Propriedades da tabela', - 'htmlToggle': 'Código-fonte de HTML', - 'foreColor': 'Cor de primeiro plano', - 'hiliteColor': 'Cor de segundo plano', - 'plainFormatBlock': 'Estilo de parágrafo', - 'formatBlock': 'Estilo de parágrafo', - 'fontSize': 'Tamanho do tipo de letra', - 'fontName': 'Nome do tipo de letra', - 'tabIndent': 'Indentar com a tecla Tab', - "fullScreen": "Alternar ecrã completo", - "viewSource": "Ver origem HTML", - "print": "Imprimir", - "newPage": "Nova página", - /* Error messages */ - 'systemShortcut': 'A acção "${0}" apenas está disponível no navegador utilizando um atalho de teclado. Utilize ${1}.' -}) -); diff --git a/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js deleted file mode 100644 index a5e4cfca6..000000000 --- a/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/pt/FontChoice", ({ - fontSize: "Tamanho", - fontName: "Fonte", - formatBlock: "Formatar", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "espaço simples", - cursive: "cursiva", - fantasy: "fantasy", - noFormat: "Nenhum", - p: "Parágrafo", - h1: "Título", - h2: "Subtítulo", - h3: "Sub-subtítulo", - pre: "Pré-formatado", - 1: "extra-extra-pequeno", - 2: "extra-pequeno", - 3: "pequena", - 4: "médio", - 5: "grande", - 6: "extra-grande", - 7: "extra-extra-grande" -}) -); diff --git a/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js deleted file mode 100644 index d9b29633c..000000000 --- a/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/pt/LinkDialog", ({ - createLinkTitle: "Propriedades de Link", - insertImageTitle: "Propriedades de Imagem", - url: "URL:", - text: "Descrição:", - target: "Destino:", - set: "Configurar", - currentWindow: "Janela Atual", - parentWindow: "Janela Pai", - topWindow: "Primeira Janela", - newWindow: "Nova Janela" -}) -); diff --git a/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js b/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js deleted file mode 100644 index 55b380684..000000000 --- a/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/pt/commands", ({ - 'bold': 'Negrito', - 'copy': 'Copiar', - 'cut': 'Recortar', - 'delete': 'Excluir', - 'indent': 'Recuar', - 'insertHorizontalRule': 'Régua Horizontal', - 'insertOrderedList': 'Lista Numerada', - 'insertUnorderedList': 'Lista com Marcadores', - 'italic': 'Itálico', - 'justifyCenter': 'Alinhar pelo Centro', - 'justifyFull': 'Justificar', - 'justifyLeft': 'Alinhar à Esquerda', - 'justifyRight': 'Alinhar à Direita', - 'outdent': 'Não chanfrado', - 'paste': 'Colar', - 'redo': 'Refazer', - 'removeFormat': 'Remover Formato', - 'selectAll': 'Selecionar Tudo', - 'strikethrough': 'Tachado', - 'subscript': 'Subscrito', - 'superscript': 'Sobrescrito', - 'underline': 'Sublinhado', - 'undo': 'Desfazer', - 'unlink': 'Remover Link', - 'createLink': 'Criar Link', - 'toggleDir': 'Comutar Direção', - 'insertImage': 'Inserir imagem', - 'insertTable': 'Inserir/Editar Tabela', - 'toggleTableBorder': 'Alternar Moldura da Tabela', - 'deleteTable': 'Excluir Tabela', - 'tableProp': 'Propriedade da Tabela', - 'htmlToggle': 'Origem HTML', - 'foreColor': 'Cor do Primeiro Plano', - 'hiliteColor': 'Cor do Segundo Plano', - 'plainFormatBlock': 'Estilo de Parágrafo', - 'formatBlock': 'Estilo de Parágrafo', - 'fontSize': 'Tamanho da Fonte', - 'fontName': 'Nome da Fonte', - 'tabIndent': 'Recuo de Guia', - "fullScreen": "Comutar Tela Cheia", - "viewSource": "Visualizar Origem HTML", - "print": "Imprimir", - "newPage": "Nova Página", - /* Error messages */ - 'systemShortcut': 'A ação "${0}" está disponível em seu navegador apenas usando um atalho de teclado. Use ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js deleted file mode 100644 index 9dd383953..000000000 --- a/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/ro/FontChoice", ({ - fontSize: "Mărime", - fontName: "Font", - formatBlock: "Format", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Nimic", - p: "Paragraf", - h1: "Titlu", - h2: "Subtitlu", - h3: "Sub-subtitlu", - pre: "Preformatat", - 1: "xxs (xx-small)", - 2: "xs (x-small)", - 3: "s (small)", - 4: "m (medium)", - 5: "l (large)", - 6: "xl (x-large)", - 7: "xxl (xx-large)" -}) -); diff --git a/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js deleted file mode 100644 index 9be4db081..000000000 --- a/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/ro/LinkDialog", ({ - createLinkTitle: "Proprietăţi legătură", - insertImageTitle: "Proprietăţi imagine", - url: "URL:", - text: "Descriere:", - target: "Destinaţie:", - set: "Setare", - currentWindow: "Fereastra curentă", - parentWindow: "Fereastra părinte", - topWindow: "Fereastra cea mai de sus", - newWindow: "Fereastra nouă" -}) -); diff --git a/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js deleted file mode 100644 index 565e2c3ec..000000000 --- a/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/ro/commands", ({ - 'bold': 'Aldin', - 'copy': 'Copiere', - 'cut': 'Tăiere', - 'delete': 'Ştergere', - 'indent': 'Micşorare indent', - 'insertHorizontalRule': 'Linie delimitatoare', - 'insertOrderedList': 'Listă numerotată', - 'insertUnorderedList': 'Listă cu marcator', - 'italic': 'Cursiv', - 'justifyCenter': 'Aliniere centru', - 'justifyFull': 'Aliniere stânga-dreapta', - 'justifyLeft': 'Aliniere stânga', - 'justifyRight': 'Aliniere dreapta', - 'outdent': 'Mărire indent', - 'paste': 'Lipire', - 'redo': 'Refacere acţiune', - 'removeFormat': 'Înlăturare format', - 'selectAll': 'Selectează tot', - 'strikethrough': 'Tăiere text cu o linie', - 'subscript': 'Scriere indice inferior', - 'superscript': 'Scriere indice superior', - 'underline': 'Subliniere', - 'undo': 'Anulare acţiune', - 'unlink': 'Înlăturare legătură', - 'createLink': 'Creare legătură', - 'toggleDir': 'Comutare direcţie', - 'insertImage': 'Inserare imagine', - 'insertTable': 'Inserare/Editare tabelă', - 'toggleTableBorder': 'Comutare bordură tabelă', - 'deleteTable': 'Ştergere tabelă', - 'tableProp': 'Proprietate tabelă', - 'htmlToggle': 'Sursă HTML', - 'foreColor': 'Culoare de prim-plan', - 'hiliteColor': 'Culoare de fundal', - 'plainFormatBlock': 'Stil paragraf', - 'formatBlock': 'Stil paragraf', - 'fontSize': 'Dimensiune font', - 'fontName': 'Nume font', - 'tabIndent': 'Indentare Tab', - "fullScreen": "Comutare ecran complet", - "viewSource": "Vizualizara sursă HTML", - "print": "Tipărire", - "newPage": "Pagină nouă", - /* Error messages */ - 'systemShortcut': 'Acţiunea "${0}" este disponibilă în browser doar utilizând o comandă rapidă de la tastatură. Utilizaţi ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js deleted file mode 100644 index 34b0396ba..000000000 --- a/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/ru/FontChoice", ({ - fontSize: "Размер", - fontName: "Шрифт", - formatBlock: "Формат", - serif: "с засечками", - "sans-serif": "без засечек", - monospace: "непропорциональный", - cursive: "курсив", - fantasy: "артистический", - noFormat: "Нет", - p: "Абзац", - h1: "Заголовок", - h2: "Подзаголовок", - h3: "Вложенный подзаголовок", - pre: "Заранее отформатированный", - 1: "самый маленький", - 2: "очень маленький", - 3: "маленький", - 4: "средний", - 5: "большой", - 6: "очень большой", - 7: "самый большой" -}) -); diff --git a/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js deleted file mode 100644 index 19b5f75f8..000000000 --- a/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/ru/LinkDialog", ({ - createLinkTitle: "Свойства ссылки", - insertImageTitle: "Свойства изображения", - url: "URL:", - text: "Описание:", - target: "Целевой объект:", - set: "Задать", - currentWindow: "Текущее окно", - parentWindow: "Родительское окно", - topWindow: "Верхнее окно", - newWindow: "Новое окно" -}) -); diff --git a/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js deleted file mode 100644 index 8bfe3568e..000000000 --- a/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/ru/commands", ({ - 'bold': 'Полужирный', - 'copy': 'Копировать', - 'cut': 'Вырезать', - 'delete': 'Удалить', - 'indent': 'Отступ', - 'insertHorizontalRule': 'Горизонтальная линейка', - 'insertOrderedList': 'Нумерованный список', - 'insertUnorderedList': 'Список с маркерами', - 'italic': 'Курсив', - 'justifyCenter': 'По центру', - 'justifyFull': 'По ширине', - 'justifyLeft': 'По левому краю', - 'justifyRight': 'По правому краю', - 'outdent': 'Втяжка', - 'paste': 'Вставить', - 'redo': 'Повторить', - 'removeFormat': 'Удалить формат', - 'selectAll': 'Выбрать все', - 'strikethrough': 'Перечеркивание', - 'subscript': 'Нижний индекс', - 'superscript': 'Верхний индекс', - 'underline': 'Подчеркивание', - 'undo': 'Отменить', - 'unlink': 'Удалить ссылку', - 'createLink': 'Создать ссылку', - 'toggleDir': 'Изменить направление', - 'insertImage': 'Вставить изображение', - 'insertTable': 'Вставить/изменить таблицу', - 'toggleTableBorder': 'Переключить рамку таблицы', - 'deleteTable': 'Удалить таблицу', - 'tableProp': 'Свойства таблицы', - 'htmlToggle': 'Код HTML', - 'foreColor': 'Цвет текста', - 'hiliteColor': 'Цвет фона', - 'plainFormatBlock': 'Стиль абзаца', - 'formatBlock': 'Стиль абзаца', - 'fontSize': 'Размер шрифта', - 'fontName': 'Название шрифта', - 'tabIndent': 'Табуляция', - "fullScreen": "Переключить полноэкранный режим", - "viewSource": "Показать исходный код HTML", - "print": "Печать", - "newPage": "Создать страницу", - /* Error messages */ - 'systemShortcut': 'Действие "${0}" можно выполнить в браузере только путем нажатия клавиш ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js deleted file mode 100644 index fbc1d786c..000000000 --- a/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/sk/FontChoice", ({ - fontSize: "Veľkosť", - fontName: "Písmo", - formatBlock: "Formát", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Žiadny", - p: "Odsek", - h1: "Hlavička", - h2: "Podhlavička", - h3: "Pod-podhlavička", - pre: "Predformátované", - 1: "xx-small", - 2: "x-small", - 3: "small", - 4: "medium", - 5: "large", - 6: "x-large", - 7: "xx-large" -}) -); diff --git a/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js deleted file mode 100644 index 68b9ce3ac..000000000 --- a/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/sk/LinkDialog", ({ - createLinkTitle: "Vlastnosti prepojenia", - insertImageTitle: "Vlastnosti obrázka", - url: "Adresa URL:", - text: "Opis:", - target: "Cieľ:", - set: "Nastaviť", - currentWindow: "Aktuálne okno", - parentWindow: "Rodičovské okno", - topWindow: "Najvyššie okno", - newWindow: "Nové okno" -}) -); diff --git a/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js b/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js deleted file mode 100644 index bb8632e75..000000000 --- a/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/sk/commands", ({ - 'bold': 'Tučné', - 'copy': 'Kopírovať', - 'cut': 'Vystrihnúť', - 'delete': 'Vymazať', - 'indent': 'Odsadiť', - 'insertHorizontalRule': 'Vodorovná čiara', - 'insertOrderedList': 'Číslovaný zoznam', - 'insertUnorderedList': 'Zoznam s odrážkami', - 'italic': 'Kurzíva', - 'justifyCenter': 'Zarovnať na stred', - 'justifyFull': 'Zarovnať k okrajom', - 'justifyLeft': 'Zarovnať vľavo', - 'justifyRight': 'Zarovnať vpravo', - 'outdent': 'Zmenšiť odsadenie', - 'paste': 'Prilepiť', - 'redo': 'Znova', - 'removeFormat': 'Odstrániť formátovanie', - 'selectAll': 'Vybrať všetko', - 'strikethrough': 'Prečiarknuť', - 'subscript': 'Dolný index', - 'superscript': 'Horný index', - 'underline': 'Podčiarknuť', - 'undo': 'Späť', - 'unlink': 'Odstrániť prepojenie', - 'createLink': 'Vytvoriť prepojenie', - 'toggleDir': 'Prepnúť smer', - 'insertImage': 'Vložiť obrázok', - 'insertTable': 'Vložiť/upraviť tabuľku', - 'toggleTableBorder': 'Prepnúť ohraničenie tabuľky', - 'deleteTable': 'Odstrániť tabuľku', - 'tableProp': 'Vlastnosť tabuľky', - 'htmlToggle': 'Zdrojový kód HTML', - 'foreColor': 'Farba popredia', - 'hiliteColor': 'Farba pozadia', - 'plainFormatBlock': 'Štýl odseku', - 'formatBlock': 'Štýl odseku', - 'fontSize': 'Veľkosť písma', - 'fontName': 'Názov písma', - 'tabIndent': 'Odsadenie tabulátora', - "fullScreen": "Prepnúť na celú obrazovku", - "viewSource": "Zobraziť zdrojový kód HTML", - "print": "Vytlačiť", - "newPage": "Nová stránka", - /* Error messages */ - 'systemShortcut': 'Akcia "${0}" je vo vašom prehliadači dostupná iba prostredníctvom klávesovej skratky. Stlačte ${1}.', - 'ctrlKey':'Ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js deleted file mode 100644 index 3d9e927b1..000000000 --- a/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/sl/FontChoice", ({ - fontSize: "Velikost", - fontName: "Pisava", - formatBlock: "Oblika", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Brez", - p: "Odstavek", - h1: "Naslovni slog", - h2: "Podnaslovni slog", - h3: "Pod-podnaslovni slog", - pre: "Vnaprej oblikovan", - 1: "xx-majhno", - 2: "x-majhno", - 3: "majhno", - 4: "srednje", - 5: "veliko", - 6: "x-veliko", - 7: "xx-veliko" -}) -); diff --git a/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js deleted file mode 100644 index c7f1c7252..000000000 --- a/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/sl/LinkDialog", ({ - createLinkTitle: "Lastnosti povezave", - insertImageTitle: "Lastnosti slike", - url: "URL:", - text: "Opis:", - target: "Cilj:", - set: "Nastavi", - currentWindow: "Trenutno okno", - parentWindow: "Nadrejeno okno", - topWindow: "Okno na vrhu", - newWindow: "Novo okno" -}) -); diff --git a/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js b/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js deleted file mode 100644 index b03f5af33..000000000 --- a/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js +++ /dev/null @@ -1,49 +0,0 @@ -define( -"dijit/_editor/nls/sl/commands", ({ - 'bold': 'Krepko', - 'copy': 'Prekopiraj', - 'cut': 'Izreži', - 'delete': 'Izbriši', - 'indent': 'Zamik', - 'insertHorizontalRule': 'Vodoravno ravnilo', - 'insertOrderedList': 'Oštevilčen seznam', - 'insertUnorderedList': 'Naštevni seznam', - 'italic': 'Ležeče', - 'justifyCenter': 'Poravnaj na sredino', - 'justifyFull': 'Poravnaj obojestransko', - 'justifyLeft': 'Poravnaj levo', - 'justifyRight': 'Poravnaj desno', - 'outdent': 'Primakni', - 'paste': 'Prilepi', - 'redo': 'Znova uveljavi', - 'removeFormat': 'Odstrani oblikovanje', - 'selectAll': 'Izberi vse', - 'strikethrough': 'Prečrtano', - 'subscript': 'Podpisano', - 'superscript': 'Nadpisano', - 'underline': 'Podčrtano', - 'undo': 'Razveljavi', - 'unlink': 'Odstrani povezavo', - 'createLink': 'Ustvari povezavo', - 'toggleDir': 'Preklopi smer', - 'insertImage': 'Vstavi sliko', - 'insertTable': 'Vstavi/uredi tabelo', - 'toggleTableBorder': 'Preklopi na obrobo tabele', - 'deleteTable': 'Izbriši tabelo', - 'tableProp': 'Lastnost tabele', - 'htmlToggle': 'Izvor HTML', - 'foreColor': 'Barva ospredja', - 'hiliteColor': 'Barva ozadja', - 'plainFormatBlock': 'Slog odstavka', - 'formatBlock': 'Slog odstavka', - 'fontSize': 'Velikost pisave', - 'fontName': 'Ime pisave', - 'tabIndent': 'Zamik tabulatorja', - "fullScreen": "Preklopi na celozaslonski način", - "viewSource": "Prikaži izvorno kodo HTML", - "print": "Natisni", - "newPage": "Nova stran", - /* Error messages */ - 'systemShortcut': 'Dejanje "${0}" lahko v vašem brskalniku uporabite samo z bližnjico na tipkovnici. Uporabite ${1}.' -}) -); diff --git a/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js deleted file mode 100644 index ba2ec83f2..000000000 --- a/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/sv/FontChoice", ({ - fontSize: "Storlek ", - fontName: "Teckensnitt", - formatBlock: "Format", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "Inget", - p: "Stycke", - h1: "Rubrik 1", - h2: "Rubrik 2", - h3: "Rubrik 3", - pre: "Förformaterad", - 1: "XXS", - 2: "XS", - 3: "S", - 4: "M", - 5: "L", - 6: "XL", - 7: "XXL" -}) -); diff --git a/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js deleted file mode 100644 index dca1fc0f6..000000000 --- a/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/sv/LinkDialog", ({ - createLinkTitle: "Länkegenskaper", - insertImageTitle: "Bildegenskaper", - url: "URL-adress:", - text: "Beskrivning:", - target: "Mål:", - set: "Använd", - currentWindow: "Aktuellt fönster", - parentWindow: "Överordnat fönster", - topWindow: "Översta fönstret", - newWindow: "Nytt fönster" -}) -); diff --git a/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js b/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js deleted file mode 100644 index 5950b0196..000000000 --- a/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/sv/commands", ({ - 'bold': 'Halvfet', - 'copy': 'Kopiera ', - 'cut': 'Klipp ut ', - 'delete': 'Ta bort ', - 'indent': 'Indrag', - 'insertHorizontalRule': 'Horisontell linje', - 'insertOrderedList': 'Numrerad lista', - 'insertUnorderedList': 'Punktlista', - 'italic': 'Kursiv', - 'justifyCenter': 'Justera centrerat', - 'justifyFull': 'Justera', - 'justifyLeft': 'Justera till vänster', - 'justifyRight': 'Justera till höger', - 'outdent': 'Utdrag', - 'paste': 'Klistra in', - 'redo': 'Gör om', - 'removeFormat': 'Ta bort format', - 'selectAll': 'Markera allt', - 'strikethrough': 'Genomstrykning', - 'subscript': 'Nedsänkt', - 'superscript': 'Upphöjt', - 'underline': 'Understrykning', - 'undo': 'Ångra', - 'unlink': 'Ta bort länk', - 'createLink': 'Skapa länk', - 'toggleDir': 'Växla riktning', - 'insertImage': 'Infoga bild', - 'insertTable': 'Infoga/redigera tabell', - 'toggleTableBorder': 'Växla tabellkantlinjer', - 'deleteTable': 'Ta bort tabell', - 'tableProp': 'Tabellegenskap', - 'htmlToggle': 'HTML-källa', - 'foreColor': 'Förgrundsfärg', - 'hiliteColor': 'Bakgrundsfärg', - 'plainFormatBlock': 'Styckeformat', - 'formatBlock': 'Styckeformat', - 'fontSize': 'Teckenstorlek', - 'fontName': 'Teckensnitt', - 'tabIndent': 'Indrag tabb', - "fullScreen": "Växla fullskärm", - "viewSource": "Visa HTML-kod", - "print": "Skriv ut", - "newPage": "Ny sida", - /* Error messages */ - 'systemShortcut': 'Åtgärden ${0} är endast tillgänglig i webbläsaren via ett tangentbordskommando. Använd ${1}.', - 'ctrlKey':'Ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js deleted file mode 100644 index 715e2e617..000000000 --- a/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/th/FontChoice", ({ - fontSize: "ขนาด", - fontName: "ฟอนต์", - formatBlock: "รูปแบบ", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "monospace", - cursive: "cursive", - fantasy: "fantasy", - noFormat: "ไม่มี", - p: "ย่อหน้า", - h1: "ส่วนหัว", - h2: "ส่วนหัวย่อย", - h3: "ส่วนย่อยของส่วนหัวย่อย", - pre: "การกำหนดรูปแบบล่วงหน้า", - 1: "xx-small", - 2: "x-small", - 3: "small", - 4: "medium", - 5: "large", - 6: "x-large", - 7: "xx-large" -}) -); diff --git a/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js deleted file mode 100644 index 8df6810f4..000000000 --- a/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/th/LinkDialog", ({ - createLinkTitle: "คุณสมบัติลิงก์", - insertImageTitle: "คุณสมบัติรูปภาพ", - url: "URL:", - text: "คำอธิบาย:", - target: "เป้าหมาย:", - set: "เซ็ต", - currentWindow: "หน้าต่างปัจจุบัน", - parentWindow: "หน้าต่างหลัก", - topWindow: "หน้าต่างบนสุด", - newWindow: "หน้าต่างใหม่" -}) -); diff --git a/lib/dijit/_editor/nls/th/commands.js.uncompressed.js b/lib/dijit/_editor/nls/th/commands.js.uncompressed.js deleted file mode 100644 index dced848cd..000000000 --- a/lib/dijit/_editor/nls/th/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/th/commands", ({ - 'bold': 'ตัวหนา', - 'copy': 'คัดลอก', - 'cut': 'ตัด', - 'delete': 'ลบ', - 'indent': 'เพิ่มการเยื้อง', - 'insertHorizontalRule': 'ไม้บรรทัดแนวนอน', - 'insertOrderedList': 'ลำดับเลข', - 'insertUnorderedList': 'หัวข้อย่อย', - 'italic': 'ตัวเอียง', - 'justifyCenter': 'จัดแนวกึ่งกลาง', - 'justifyFull': 'ชิดขอบ', - 'justifyLeft': 'จัดชิดซ้าย', - 'justifyRight': 'จัดชิดขวา', - 'outdent': 'ลดการเยื้อง', - 'paste': 'วาง', - 'redo': 'ทำซ้ำ', - 'removeFormat': 'ลบรูปแบบออก', - 'selectAll': 'เลือกทั้งหมด', - 'strikethrough': 'ขีดทับ', - 'subscript': 'ตัวห้อย', - 'superscript': 'ตัวยก', - 'underline': 'ขีดเส้นใต้', - 'undo': 'เลิกทำ', - 'unlink': 'ลบลิงก์ออก', - 'createLink': 'สร้างลิงก์', - 'toggleDir': 'สลับทิศทาง', - 'insertImage': 'แทรกรูปภาพ', - 'insertTable': 'แทรก/แก้ไขตาราง', - 'toggleTableBorder': 'สลับเส้นขอบตาราง', - 'deleteTable': 'ลบตาราง', - 'tableProp': 'คุณสมบัติตาราง', - 'htmlToggle': 'ซอร์ส HTML', - 'foreColor': 'สีพื้นหน้า', - 'hiliteColor': 'สีพื้นหลัง', - 'plainFormatBlock': 'ลักษณะย่อหน้า', - 'formatBlock': 'ลักษณะย่อหน้า', - 'fontSize': 'ขนาดฟอนต์', - 'fontName': 'ชื่อฟอนต์', - 'tabIndent': 'เยื้องแท็บ', - "fullScreen": "สลับจอภาพแบบเต็ม", - "viewSource": "ดูซอร์ส HTML", - "print": "พิมพ์", - "newPage": "หน้าใหม่", - /* Error messages */ - 'systemShortcut': 'การดำเนินการ"${0}" ใช้งานได้เฉพาะกับเบราว์เซอร์ของคุณโดยใช้แป้นพิมพ์ลัด ใช้ ${1}', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js deleted file mode 100644 index 456d3c236..000000000 --- a/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/tr/FontChoice", ({ - fontSize: "Boyut", - fontName: "Yazı Tipi", - formatBlock: "Biçim", - serif: "serif", - "sans-serif": "sans-serif", - monospace: "tek aralıklı", - cursive: "el yazısı", - fantasy: "fantazi", - noFormat: "Yok", - p: "Paragraf", - h1: "Başlık", - h2: "Alt Başlık", - h3: "Alt Alt Başlık", - pre: "Önceden Biçimlendirilmiş", - 1: "xx-küçük", - 2: "x-küçük", - 3: "küçük", - 4: "orta", - 5: "büyük", - 6: "x-büyük", - 7: "xx-büyük" -}) -); diff --git a/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js deleted file mode 100644 index bef0e704f..000000000 --- a/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/tr/LinkDialog", ({ - createLinkTitle: "Bağlantı Özellikleri", - insertImageTitle: "Resim Özellikleri", - url: "URL:", - text: "Açıklama:", - target: "Hedef:", - set: "Ayarla", - currentWindow: "Geçerli Pencere", - parentWindow: "Üst Pencere", - topWindow: "En Üst Pencere", - newWindow: "Yeni Pencere" -}) -); diff --git a/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js b/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js deleted file mode 100644 index a93e67ccd..000000000 --- a/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/tr/commands", ({ - 'bold': 'Kalın', - 'copy': 'Kopyala', - 'cut': 'Kes', - 'delete': 'Sil', - 'indent': 'Girinti', - 'insertHorizontalRule': 'Yatay Kural', - 'insertOrderedList': 'Numaralı Liste', - 'insertUnorderedList': 'Madde İşaretli Liste', - 'italic': 'İtalik', - 'justifyCenter': 'Ortaya Hizala', - 'justifyFull': 'Yasla', - 'justifyLeft': 'Sola Hizala', - 'justifyRight': 'Sağa Hizala', - 'outdent': 'Çıkıntı', - 'paste': 'Yapıştır', - 'redo': 'Yinele', - 'removeFormat': 'Biçimi Kaldır', - 'selectAll': 'Tümünü Seç', - 'strikethrough': 'Üstü Çizili', - 'subscript': 'Alt Simge', - 'superscript': 'Üst Simge', - 'underline': 'Altı Çizili', - 'undo': 'Geri Al', - 'unlink': 'Bağlantıyı Kaldır', - 'createLink': 'Bağlantı Oluştur', - 'toggleDir': 'Yönü Değiştir', - 'insertImage': 'Resim Ekle', - 'insertTable': 'Tablo Ekle/Düzenle', - 'toggleTableBorder': 'Tablo Kenarlığını Göster/Gizle', - 'deleteTable': 'Tabloyu Sil', - 'tableProp': 'Tablo Özelliği', - 'htmlToggle': 'HTML Kaynağı', - 'foreColor': 'Ön Plan Rengi', - 'hiliteColor': 'Arka Plan Rengi', - 'plainFormatBlock': 'Paragraf Stili', - 'formatBlock': 'Paragraf Stili', - 'fontSize': 'Yazı Tipi Boyutu', - 'fontName': 'Yazı Tipi Adı', - 'tabIndent': 'Sekme Girintisi', - "fullScreen": "Tam Ekranı Aç/Kapat", - "viewSource": "HTML Kaynağını Görüntüle", - "print": "Yazdır", - "newPage": "Yeni Sayfa", - /* Error messages */ - 'systemShortcut': '"${0}" işlemi yalnızca tarayıcınızda bir klavye kısayoluyla birlikte kullanılabilir. Şunu kullanın: ${1}.', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js deleted file mode 100644 index 9fce29893..000000000 --- a/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/zh-tw/FontChoice", ({ - fontSize: "大小", - fontName: "字型", - formatBlock: "格式", - serif: "新細明體", - "sans-serif": "新細明體", - monospace: "等寬", - cursive: "Cursive", - fantasy: "Fantasy", - noFormat: "無", - p: "段落", - h1: "標題", - h2: "子標題", - h3: "次子標題", - pre: "預先格式化", - 1: "最小", - 2: "較小", - 3: "小", - 4: "中", - 5: "大", - 6: "較大", - 7: "最大" -}) -); diff --git a/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js deleted file mode 100644 index a51049592..000000000 --- a/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/zh-tw/LinkDialog", ({ - createLinkTitle: "鏈結內容", - insertImageTitle: "影像內容", - url: "URL:", - text: "說明:", - target: "目標:", - set: "設定", - currentWindow: "現行視窗", - parentWindow: "上層視窗", - topWindow: "最上面的視窗", - newWindow: "新視窗" -}) -); diff --git a/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js deleted file mode 100644 index a694fd174..000000000 --- a/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/zh-tw/commands", ({ - 'bold': '粗體', - 'copy': '複製', - 'cut': '剪下', - 'delete': '刪除', - 'indent': '縮排', - 'insertHorizontalRule': '水平尺規', - 'insertOrderedList': '編號清單', - 'insertUnorderedList': '項目符號清單', - 'italic': '斜體', - 'justifyCenter': '置中對齊', - 'justifyFull': '對齊', - 'justifyLeft': '靠左對齊', - 'justifyRight': '靠右對齊', - 'outdent': '凸排', - 'paste': '貼上', - 'redo': '重做', - 'removeFormat': '移除格式', - 'selectAll': '全選', - 'strikethrough': '刪除線', - 'subscript': '下標', - 'superscript': '上標', - 'underline': '底線', - 'undo': '復原', - 'unlink': '移除鏈結', - 'createLink': '建立鏈結', - 'toggleDir': '切換方向', - 'insertImage': '插入影像', - 'insertTable': '插入/編輯表格', - 'toggleTableBorder': '切換表格邊框', - 'deleteTable': '刪除表格', - 'tableProp': '表格內容', - 'htmlToggle': 'HTML 原始檔', - 'foreColor': '前景顏色', - 'hiliteColor': '背景顏色', - 'plainFormatBlock': '段落樣式', - 'formatBlock': '段落樣式', - 'fontSize': '字型大小', - 'fontName': '字型名稱', - 'tabIndent': '標籤縮排', - "fullScreen": "切換全螢幕", - "viewSource": "檢視 HTML 原始檔", - "print": "列印", - "newPage": "新頁面", - /* Error messages */ - 'systemShortcut': '"${0}" 動作在您的瀏覽器中,只能使用鍵盤快速鍵。請使用 ${1}。', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js deleted file mode 100644 index dd8bd834b..000000000 --- a/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define( -"dijit/_editor/nls/zh/FontChoice", ({ - fontSize: "大小", - fontName: "字体", - formatBlock: "格式", - serif: "有衬线", - "sans-serif": "无衬线", - monospace: "等宽字体", - cursive: "草书", - fantasy: "虚线", - noFormat: "无", - p: "段落", - h1: "标题", - h2: "副标题", - h3: "二级子标题", - pre: "预设有格式的", - 1: "XX 小号", - 2: "X 小号", - 3: "小号", - 4: "中号", - 5: "大号", - 6: "X 大号", - 7: "XX 大号" -}) -); diff --git a/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js deleted file mode 100644 index a954c9be8..000000000 --- a/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,14 +0,0 @@ -define( -"dijit/_editor/nls/zh/LinkDialog", ({ - createLinkTitle: "链接属性", - insertImageTitle: "图像属性", - url: "URL:", - text: "说明:", - target: "目标:", - set: "集", - currentWindow: "当前窗口", - parentWindow: "父窗口", - topWindow: "最顶层窗口", - newWindow: "新建窗口" -}) -); diff --git a/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js b/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js deleted file mode 100644 index d1a567a53..000000000 --- a/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define( -"dijit/_editor/nls/zh/commands", ({ - 'bold': '粗体', - 'copy': '复制', - 'cut': '剪切', - 'delete': '删除', - 'indent': '缩进', - 'insertHorizontalRule': '水平线', - 'insertOrderedList': '编号列表', - 'insertUnorderedList': '符号列表', - 'italic': '斜体', - 'justifyCenter': '居中', - 'justifyFull': '调整', - 'justifyLeft': '左对齐', - 'justifyRight': '右对齐', - 'outdent': '凸出', - 'paste': '粘贴', - 'redo': '重做', - 'removeFormat': '除去格式', - 'selectAll': '全选', - 'strikethrough': '删除线', - 'subscript': '下标', - 'superscript': '上标', - 'underline': '下划线', - 'undo': '撤销', - 'unlink': '除去链接', - 'createLink': '创建链接', - 'toggleDir': '切换方向', - 'insertImage': '插入图像', - 'insertTable': '插入/编辑表', - 'toggleTableBorder': '切换表格边框', - 'deleteTable': '删除表格', - 'tableProp': '表格属性', - 'htmlToggle': 'HTML 源', - 'foreColor': '前景颜色', - 'hiliteColor': '背景颜色', - 'plainFormatBlock': '段落样式', - 'formatBlock': '段落样式', - 'fontSize': '字体大小', - 'fontName': '字体名称', - 'tabIndent': '跳格缩进', - "fullScreen": "切换全屏幕", - "viewSource": "查看 HTML 源", - "print": "打印", - "newPage": "新建页面", - /* Error messages */ - 'systemShortcut': '只能在浏览器中通过键盘快捷方式执行“${0}”操作。使用 ${1}。', - 'ctrlKey':'ctrl+${0}', - 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh -}) -); diff --git a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js deleted file mode 100644 index 1f2b7a4e2..000000000 --- a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js +++ /dev/null @@ -1,191 +0,0 @@ -define("dijit/_editor/plugins/AlwaysShowToolbar", [ - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-construct", // domConstruct.place - "dojo/dom-geometry", - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("ie") has("opera") - "dojo/_base/window", // win.body - "../_Plugin" -], function(declare, domClass, domConstruct, domGeometry, lang, has, win, _Plugin){ - -// module: -// dijit/_editor/plugins/AlwaysShowToolbar - -return declare("dijit._editor.plugins.AlwaysShowToolbar", _Plugin, { - // summary: - // This plugin is required for Editors in auto-expand mode. - // It handles the auto-expansion as the user adds/deletes text, - // and keeps the editor's toolbar visible even when the top of the editor - // has scrolled off the top of the viewport (usually when editing a long - // document). - // description: - // Specify this in extraPlugins (or plugins) parameter and also set - // height to "". - // example: - // | <script type="dojo/require"> - // | AlwaysShowToolbar: "dijit/_editor/plugins/AlwaysShowToolbar" - // | </script> - // | <div data-dojo-type="dijit/Editor" height="" - // | data-dojo-props="extraPlugins: [AlwaysShowToolbar]"> - - // _handleScroll: Boolean - // Enables/disables the handler for scroll events - _handleScroll: true, - - setEditor: function(e){ - // Overrides _Plugin.setEditor(). - if(!e.iframe){ - console.log('Port AlwaysShowToolbar plugin to work with Editor without iframe'); - return; - } - - this.editor = e; - - e.onLoadDeferred.then(lang.hitch(this, this.enable)); - }, - - enable: function(d){ - // summary: - // Enable plugin. Called when Editor has finished initializing. - // tags: - // private - - this._updateHeight(); - this.connect(window, 'onscroll', "globalOnScrollHandler"); - this.connect(this.editor, 'onNormalizedDisplayChanged', "_updateHeight"); - return d; - }, - - _updateHeight: function(){ - // summary: - // Updates the height of the editor area to fit the contents. - var e = this.editor; - if(!e.isLoaded){ return; } - if(e.height){ return; } - - var height = domGeometry.getMarginSize(e.editNode).h; - if(has("opera")){ - height = e.editNode.scrollHeight; - } - // console.debug('height',height); - // alert(this.editNode); - - //height maybe zero in some cases even though the content is not empty, - //we try the height of body instead - if(!height){ - height = domGeometry.getMarginSize(e.document.body).h; - } - - if(height == 0){ - console.debug("Can not figure out the height of the editing area!"); - return; //prevent setting height to 0 - } - if(has("ie") <= 7 && this.editor.minHeight){ - var min = parseInt(this.editor.minHeight); - if(height < min){ height = min; } - } - if(height != this._lastHeight){ - this._lastHeight = height; - // this.editorObject.style.height = this._lastHeight + "px"; - domGeometry.setMarginBox(e.iframe, { h: this._lastHeight }); - } - }, - - // _lastHeight: Integer - // Height in px of the editor at the last time we did sizing - _lastHeight: 0, - - globalOnScrollHandler: function(){ - // summary: - // Handler for scroll events that bubbled up to `<html>` - // tags: - // private - - var isIE6 = has("ie") < 7; - if(!this._handleScroll){ return; } - var tdn = this.editor.header; - if(!this._scrollSetUp){ - this._scrollSetUp = true; - this._scrollThreshold = domGeometry.position(tdn, true).y; -// var db = win.body; -// console.log("threshold:", this._scrollThreshold); - //what's this for?? comment out for now -// if((isIE6)&&(db)&&(domStyle.set or get TODO(db, "backgroundIimage")=="none")){ -// db.style.backgroundImage = "url(" + dojo.uri.moduleUri("dijit", "templates/blank.gif") + ")"; -// db.style.backgroundAttachment = "fixed"; -// } - } - - var scrollPos = domGeometry.docScroll(this.editor.ownerDocument).y; - var s = tdn.style; - - if(scrollPos > this._scrollThreshold && scrollPos < this._scrollThreshold+this._lastHeight){ - // dojo.debug(scrollPos); - if(!this._fixEnabled){ - var tdnbox = domGeometry.getMarginSize(tdn); - this.editor.iframe.style.marginTop = tdnbox.h+"px"; - - if(isIE6){ - s.left = domGeometry.position(tdn).x; - if(tdn.previousSibling){ - this._IEOriginalPos = ['after',tdn.previousSibling]; - }else if(tdn.nextSibling){ - this._IEOriginalPos = ['before',tdn.nextSibling]; - }else{ - this._IEOriginalPos = ['last',tdn.parentNode]; - } - this.editor.ownerDocumentBody.appendChild(tdn); - domClass.add(tdn,'dijitIEFixedToolbar'); - }else{ - s.position = "fixed"; - s.top = "0px"; - } - - domGeometry.setMarginBox(tdn, { w: tdnbox.w }); - s.zIndex = 2000; - this._fixEnabled = true; - } - // if we're showing the floating toolbar, make sure that if - // we've scrolled past the bottom of the editor that we hide - // the toolbar for this instance of the editor. - - // TODO: when we get multiple editor toolbar support working - // correctly, ensure that we check this against the scroll - // position of the bottom-most editor instance. - var eHeight = (this.height) ? parseInt(this.editor.height) : this.editor._lastHeight; - s.display = (scrollPos > this._scrollThreshold+eHeight) ? "none" : ""; - }else if(this._fixEnabled){ - this.editor.iframe.style.marginTop = ''; - s.position = ""; - s.top = ""; - s.zIndex = ""; - s.display = ""; - if(isIE6){ - s.left = ""; - domClass.remove(tdn,'dijitIEFixedToolbar'); - if(this._IEOriginalPos){ - domConstruct.place(tdn, this._IEOriginalPos[1], this._IEOriginalPos[0]); - this._IEOriginalPos = null; - }else{ - domConstruct.place(tdn, this.editor.iframe, 'before'); - } - } - s.width = ""; - this._fixEnabled = false; - } - }, - - destroy: function(){ - // Overrides _Plugin.destroy(). TODO: call this.inherited() rather than repeating code. - this._IEOriginalPos = null; - this._handleScroll = false; - this.inherited(arguments); - - if(has("ie") < 7){ - domClass.remove(this.editor.header, 'dijitIEFixedToolbar'); - } - } -}); - -}); diff --git a/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js b/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js deleted file mode 100644 index e5c7b7466..000000000 --- a/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js +++ /dev/null @@ -1,622 +0,0 @@ -define("dijit/_editor/plugins/EnterKeyHandling", [ - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.destroy domConstruct.place - "dojo/_base/event", // event.stop - "dojo/keys", // keys.ENTER - "dojo/_base/lang", - "dojo/sniff", // has("ie") has("mozilla") has("webkit") - "dojo/_base/window", // win.withGlobal - "dojo/window", // winUtils.scrollIntoView - "../_Plugin", - "../RichText", - "../range", - "../../_base/focus" -], function(declare, domConstruct, event, keys, lang, has, win, winUtils, _Plugin, RichText, rangeapi, baseFocus){ - -// module: -// dijit/_editor/plugins/EnterKeyHandling - -return declare("dijit._editor.plugins.EnterKeyHandling", _Plugin, { - // summary: - // This plugin tries to make all browsers behave consistently with regard to - // how ENTER behaves in the editor window. It traps the ENTER key and alters - // the way DOM is constructed in certain cases to try to commonize the generated - // DOM and behaviors across browsers. - // - // description: - // This plugin has three modes: - // - // - blockNodeForEnter=BR - // - blockNodeForEnter=DIV - // - blockNodeForEnter=P - // - // In blockNodeForEnter=P, the ENTER key starts a new - // paragraph, and shift-ENTER starts a new line in the current paragraph. - // For example, the input: - // - // | first paragraph <shift-ENTER> - // | second line of first paragraph <ENTER> - // | second paragraph - // - // will generate: - // - // | <p> - // | first paragraph - // | <br/> - // | second line of first paragraph - // | </p> - // | <p> - // | second paragraph - // | </p> - // - // In BR and DIV mode, the ENTER key conceptually goes to a new line in the - // current paragraph, and users conceptually create a new paragraph by pressing ENTER twice. - // For example, if the user enters text into an editor like this: - // - // | one <ENTER> - // | two <ENTER> - // | three <ENTER> - // | <ENTER> - // | four <ENTER> - // | five <ENTER> - // | six <ENTER> - // - // It will appear on the screen as two 'paragraphs' of three lines each. Markupwise, this generates: - // - // BR: - // | one<br/> - // | two<br/> - // | three<br/> - // | <br/> - // | four<br/> - // | five<br/> - // | six<br/> - // - // DIV: - // | <div>one</div> - // | <div>two</div> - // | <div>three</div> - // | <div> </div> - // | <div>four</div> - // | <div>five</div> - // | <div>six</div> - - // blockNodeForEnter: String - // This property decides the behavior of Enter key. It can be either P, - // DIV, BR, or empty (which means disable this feature). Anything else - // will trigger errors. The default is 'BR' - // - // See class description for more details. - blockNodeForEnter: 'BR', - - constructor: function(args){ - if(args){ - if("blockNodeForEnter" in args){ - args.blockNodeForEnter = args.blockNodeForEnter.toUpperCase(); - } - lang.mixin(this,args); - } - }, - - setEditor: function(editor){ - // Overrides _Plugin.setEditor(). - if(this.editor === editor){ return; } - this.editor = editor; - if(this.blockNodeForEnter == 'BR'){ - // While Moz has a mode tht mostly works, it's still a little different, - // So, try to just have a common mode and be consistent. Which means - // we need to enable customUndo, if not already enabled. - this.editor.customUndo = true; - editor.onLoadDeferred.then(lang.hitch(this,function(d){ - this.connect(editor.document, "onkeypress", function(e){ - if(e.charOrCode == keys.ENTER){ - // Just do it manually. The handleEnterKey has a shift mode that - // Always acts like <br>, so just use it. - var ne = lang.mixin({},e); - ne.shiftKey = true; - if(!this.handleEnterKey(ne)){ - event.stop(e); - } - } - }); - if(has("ie") >= 9){ - this.connect(editor.document, "onpaste", function(e){ - setTimeout(dojo.hitch(this, function(){ - // Use the old range/selection code to kick IE 9 into updating - // its range by moving it back, then forward, one 'character'. - var r = this.editor.document.selection.createRange(); - r.move('character',-1); - r.select(); - r.move('character',1); - r.select(); - }),0); - }); - } - return d; - })); - }else if(this.blockNodeForEnter){ - // add enter key handler - // FIXME: need to port to the new event code!! - var h = lang.hitch(this,this.handleEnterKey); - editor.addKeyHandler(13, 0, 0, h); //enter - editor.addKeyHandler(13, 0, 1, h); //shift+enter - this.connect(this.editor,'onKeyPressed','onKeyPressed'); - } - }, - onKeyPressed: function(){ - // summary: - // Handler for keypress events. - // tags: - // private - if(this._checkListLater){ - if(win.withGlobal(this.editor.window, 'isCollapsed', baseFocus)){ - var liparent = this.editor._sCall('getAncestorElement', ['LI']); - if(!liparent){ - // circulate the undo detection code by calling RichText::execCommand directly - RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter); - // set the innerHTML of the new block node - var block = this.editor._sCall('getAncestorElement', [this.blockNodeForEnter]); - if(block){ - block.innerHTML=this.bogusHtmlContent; - if(has("ie") <= 9){ - // move to the start by moving backwards one char - var r = this.editor.document.selection.createRange(); - r.move('character',-1); - r.select(); - } - }else{ - console.error('onKeyPressed: Cannot find the new block node'); // FIXME - } - }else{ - if(has("mozilla")){ - if(liparent.parentNode.parentNode.nodeName == 'LI'){ - liparent=liparent.parentNode.parentNode; - } - } - var fc=liparent.firstChild; - if(fc && fc.nodeType == 1 && (fc.nodeName == 'UL' || fc.nodeName == 'OL')){ - liparent.insertBefore(fc.ownerDocument.createTextNode('\xA0'),fc); - var newrange = rangeapi.create(this.editor.window); - newrange.setStart(liparent.firstChild,0); - var selection = rangeapi.getSelection(this.editor.window, true); - selection.removeAllRanges(); - selection.addRange(newrange); - } - } - } - this._checkListLater = false; - } - if(this._pressedEnterInBlock){ - // the new created is the original current P, so we have previousSibling below - if(this._pressedEnterInBlock.previousSibling){ - this.removeTrailingBr(this._pressedEnterInBlock.previousSibling); - } - delete this._pressedEnterInBlock; - } - }, - - // bogusHtmlContent: [private] String - // HTML to stick into a new empty block - bogusHtmlContent: ' ', // - - // blockNodes: [private] Regex - // Regex for testing if a given tag is a block level (display:block) tag - blockNodes: /^(?:P|H1|H2|H3|H4|H5|H6|LI)$/, - - handleEnterKey: function(e){ - // summary: - // Handler for enter key events when blockNodeForEnter is DIV or P. - // description: - // Manually handle enter key event to make the behavior consistent across - // all supported browsers. See class description for details. - // tags: - // private - - var selection, range, newrange, startNode, endNode, brNode, doc=this.editor.document,br,rs,txt; - if(e.shiftKey){ // shift+enter always generates <br> - var parent = this.editor._sCall('getParentElement', []); - var header = rangeapi.getAncestor(parent,this.blockNodes); - if(header){ - if(header.tagName == 'LI'){ - return true; // let browser handle - } - selection = rangeapi.getSelection(this.editor.window); - range = selection.getRangeAt(0); - if(!range.collapsed){ - range.deleteContents(); - selection = rangeapi.getSelection(this.editor.window); - range = selection.getRangeAt(0); - } - if(rangeapi.atBeginningOfContainer(header, range.startContainer, range.startOffset)){ - br=doc.createElement('br'); - newrange = rangeapi.create(this.editor.window); - header.insertBefore(br,header.firstChild); - newrange.setStartAfter(br); - selection.removeAllRanges(); - selection.addRange(newrange); - }else if(rangeapi.atEndOfContainer(header, range.startContainer, range.startOffset)){ - newrange = rangeapi.create(this.editor.window); - br=doc.createElement('br'); - header.appendChild(br); - header.appendChild(doc.createTextNode('\xA0')); - newrange.setStart(header.lastChild,0); - selection.removeAllRanges(); - selection.addRange(newrange); - }else{ - rs = range.startContainer; - if(rs && rs.nodeType == 3){ - // Text node, we have to split it. - txt = rs.nodeValue; - startNode = doc.createTextNode(txt.substring(0, range.startOffset)); - endNode = doc.createTextNode(txt.substring(range.startOffset)); - brNode = doc.createElement("br"); - - if(endNode.nodeValue == "" && has("webkit")){ - endNode = doc.createTextNode('\xA0') - } - domConstruct.place(startNode, rs, "after"); - domConstruct.place(brNode, startNode, "after"); - domConstruct.place(endNode, brNode, "after"); - domConstruct.destroy(rs); - newrange = rangeapi.create(this.editor.window); - newrange.setStart(endNode,0); - selection.removeAllRanges(); - selection.addRange(newrange); - return false; - } - return true; // let browser handle - } - }else{ - selection = rangeapi.getSelection(this.editor.window); - if(selection.rangeCount){ - range = selection.getRangeAt(0); - if(range && range.startContainer){ - if(!range.collapsed){ - range.deleteContents(); - selection = rangeapi.getSelection(this.editor.window); - range = selection.getRangeAt(0); - } - rs = range.startContainer; - if(rs && rs.nodeType == 3){ - // Text node, we have to split it. - var endEmpty = false; - - var offset = range.startOffset; - if(rs.length < offset){ - //We are not splitting the right node, try to locate the correct one - ret = this._adjustNodeAndOffset(rs, offset); - rs = ret.node; - offset = ret.offset; - } - txt = rs.nodeValue; - - startNode = doc.createTextNode(txt.substring(0, offset)); - endNode = doc.createTextNode(txt.substring(offset)); - brNode = doc.createElement("br"); - - if(!endNode.length){ - endNode = doc.createTextNode('\xA0'); - endEmpty = true; - } - - if(startNode.length){ - domConstruct.place(startNode, rs, "after"); - }else{ - startNode = rs; - } - domConstruct.place(brNode, startNode, "after"); - domConstruct.place(endNode, brNode, "after"); - domConstruct.destroy(rs); - newrange = rangeapi.create(this.editor.window); - newrange.setStart(endNode,0); - newrange.setEnd(endNode, endNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - if(endEmpty && !has("webkit")){ - this.editor._sCall("remove", []); - }else{ - this.editor._sCall("collapse", [true]); - } - }else{ - var targetNode; - if(range.startOffset >= 0){ - targetNode = rs.childNodes[range.startOffset]; - } - var brNode = doc.createElement("br"); - var endNode = doc.createTextNode('\xA0'); - if(!targetNode){ - rs.appendChild(brNode); - rs.appendChild(endNode); - }else{ - domConstruct.place(brNode, targetNode, "before"); - domConstruct.place(endNode, brNode, "after"); - } - newrange = rangeapi.create(this.editor.window); - newrange.setStart(endNode,0); - newrange.setEnd(endNode, endNode.length); - selection.removeAllRanges(); - selection.addRange(newrange); - this.editor._sCall("collapse", [true]); - } - } - }else{ - // don't change this: do not call this.execCommand, as that may have other logic in subclass - RichText.prototype.execCommand.call(this.editor, 'inserthtml', '<br>'); - } - } - return false; - } - var _letBrowserHandle = true; - - // first remove selection - selection = rangeapi.getSelection(this.editor.window); - range = selection.getRangeAt(0); - if(!range.collapsed){ - range.deleteContents(); - selection = rangeapi.getSelection(this.editor.window); - range = selection.getRangeAt(0); - } - - var block = rangeapi.getBlockAncestor(range.endContainer, null, this.editor.editNode); - var blockNode = block.blockNode; - - // if this is under a LI or the parent of the blockNode is LI, just let browser to handle it - if((this._checkListLater = (blockNode && (blockNode.nodeName == 'LI' || blockNode.parentNode.nodeName == 'LI')))){ - if(has("mozilla")){ - // press enter in middle of P may leave a trailing <br/>, let's remove it later - this._pressedEnterInBlock = blockNode; - } - // if this li only contains spaces, set the content to empty so the browser will outdent this item - if(/^(\s| | |\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s| | |\xA0)<\/span>)?(<br>)?$/.test(blockNode.innerHTML)){ - // empty LI node - blockNode.innerHTML = ''; - if(has("webkit")){ // WebKit tosses the range when innerHTML is reset - newrange = rangeapi.create(this.editor.window); - newrange.setStart(blockNode, 0); - selection.removeAllRanges(); - selection.addRange(newrange); - } - this._checkListLater = false; // nothing to check since the browser handles outdent - } - return true; - } - - // text node directly under body, let's wrap them in a node - if(!block.blockNode || block.blockNode===this.editor.editNode){ - try{ - RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter); - }catch(e2){ /*squelch FF3 exception bug when editor content is a single BR*/ } - // get the newly created block node - // FIXME - block = {blockNode: this.editor._sCall('getAncestorElement', [this.blockNodeForEnter]), - blockContainer: this.editor.editNode}; - if(block.blockNode){ - if(block.blockNode != this.editor.editNode && - (!(block.blockNode.textContent || block.blockNode.innerHTML).replace(/^\s+|\s+$/g, "").length)){ - this.removeTrailingBr(block.blockNode); - return false; - } - }else{ // we shouldn't be here if formatblock worked - block.blockNode = this.editor.editNode; - } - selection = rangeapi.getSelection(this.editor.window); - range = selection.getRangeAt(0); - } - - var newblock = doc.createElement(this.blockNodeForEnter); - newblock.innerHTML=this.bogusHtmlContent; - this.removeTrailingBr(block.blockNode); - var endOffset = range.endOffset; - var node = range.endContainer; - if(node.length < endOffset){ - //We are not checking the right node, try to locate the correct one - var ret = this._adjustNodeAndOffset(node, endOffset); - node = ret.node; - endOffset = ret.offset; - } - if(rangeapi.atEndOfContainer(block.blockNode, node, endOffset)){ - if(block.blockNode === block.blockContainer){ - block.blockNode.appendChild(newblock); - }else{ - domConstruct.place(newblock, block.blockNode, "after"); - } - _letBrowserHandle = false; - // lets move caret to the newly created block - newrange = rangeapi.create(this.editor.window); - newrange.setStart(newblock, 0); - selection.removeAllRanges(); - selection.addRange(newrange); - if(this.editor.height){ - winUtils.scrollIntoView(newblock); - } - }else if(rangeapi.atBeginningOfContainer(block.blockNode, - range.startContainer, range.startOffset)){ - domConstruct.place(newblock, block.blockNode, block.blockNode === block.blockContainer ? "first" : "before"); - if(newblock.nextSibling && this.editor.height){ - // position input caret - mostly WebKit needs this - newrange = rangeapi.create(this.editor.window); - newrange.setStart(newblock.nextSibling, 0); - selection.removeAllRanges(); - selection.addRange(newrange); - // browser does not scroll the caret position into view, do it manually - winUtils.scrollIntoView(newblock.nextSibling); - } - _letBrowserHandle = false; - }else{ //press enter in the middle of P/DIV/Whatever/ - if(block.blockNode === block.blockContainer){ - block.blockNode.appendChild(newblock); - }else{ - domConstruct.place(newblock, block.blockNode, "after"); - } - _letBrowserHandle = false; - - // Clone any block level styles. - if(block.blockNode.style){ - if(newblock.style){ - if(block.blockNode.style.cssText){ - newblock.style.cssText = block.blockNode.style.cssText; - } - } - } - - // Okay, we probably have to split. - rs = range.startContainer; - var firstNodeMoved; - if(rs && rs.nodeType == 3){ - // Text node, we have to split it. - var nodeToMove, tNode; - endOffset = range.endOffset; - if(rs.length < endOffset){ - //We are not splitting the right node, try to locate the correct one - ret = this._adjustNodeAndOffset(rs, endOffset); - rs = ret.node; - endOffset = ret.offset; - } - - txt = rs.nodeValue; - startNode = doc.createTextNode(txt.substring(0, endOffset)); - endNode = doc.createTextNode(txt.substring(endOffset, txt.length)); - - // Place the split, then remove original nodes. - domConstruct.place(startNode, rs, "before"); - domConstruct.place(endNode, rs, "after"); - domConstruct.destroy(rs); - - // Okay, we split the text. Now we need to see if we're - // parented to the block element we're splitting and if - // not, we have to split all the way up. Ugh. - var parentC = startNode.parentNode; - while(parentC !== block.blockNode){ - var tg = parentC.tagName; - var newTg = doc.createElement(tg); - // Clone over any 'style' data. - if(parentC.style){ - if(newTg.style){ - if(parentC.style.cssText){ - newTg.style.cssText = parentC.style.cssText; - } - } - } - // If font also need to clone over any font data. - if(parentC.tagName === "FONT"){ - if(parentC.color){ - newTg.color = parentC.color; - } - if(parentC.face){ - newTg.face = parentC.face; - } - if(parentC.size){ // this check was necessary on IE - newTg.size = parentC.size; - } - } - - nodeToMove = endNode; - while(nodeToMove){ - tNode = nodeToMove.nextSibling; - newTg.appendChild(nodeToMove); - nodeToMove = tNode; - } - domConstruct.place(newTg, parentC, "after"); - startNode = parentC; - endNode = newTg; - parentC = parentC.parentNode; - } - - // Lastly, move the split out tags to the new block. - // as they should now be split properly. - nodeToMove = endNode; - if(nodeToMove.nodeType == 1 || (nodeToMove.nodeType == 3 && nodeToMove.nodeValue)){ - // Non-blank text and non-text nodes need to clear out that blank space - // before moving the contents. - newblock.innerHTML = ""; - } - firstNodeMoved = nodeToMove; - while(nodeToMove){ - tNode = nodeToMove.nextSibling; - newblock.appendChild(nodeToMove); - nodeToMove = tNode; - } - } - - //lets move caret to the newly created block - newrange = rangeapi.create(this.editor.window); - var nodeForCursor; - var innerMostFirstNodeMoved = firstNodeMoved; - if(this.blockNodeForEnter !== 'BR'){ - while(innerMostFirstNodeMoved){ - nodeForCursor = innerMostFirstNodeMoved; - tNode = innerMostFirstNodeMoved.firstChild; - innerMostFirstNodeMoved = tNode; - } - if(nodeForCursor && nodeForCursor.parentNode){ - newblock = nodeForCursor.parentNode; - newrange.setStart(newblock, 0); - selection.removeAllRanges(); - selection.addRange(newrange); - if(this.editor.height){ - winUtils.scrollIntoView(newblock); - } - if(has("mozilla")){ - // press enter in middle of P may leave a trailing <br/>, let's remove it later - this._pressedEnterInBlock = block.blockNode; - } - }else{ - _letBrowserHandle = true; - } - }else{ - newrange.setStart(newblock, 0); - selection.removeAllRanges(); - selection.addRange(newrange); - if(this.editor.height){ - winUtils.scrollIntoView(newblock); - } - if(has("mozilla")){ - // press enter in middle of P may leave a trailing <br/>, let's remove it later - this._pressedEnterInBlock = block.blockNode; - } - } - } - return _letBrowserHandle; - }, - - _adjustNodeAndOffset: function(/*DomNode*/node, /*Int*/offset){ - // summary: - // In the case there are multiple text nodes in a row the offset may not be within the node. If the offset is larger than the node length, it will attempt to find - // the next text sibling until it locates the text node in which the offset refers to - // node: - // The node to check. - // offset: - // The position to find within the text node - // tags: - // private. - while(node.length < offset && node.nextSibling && node.nextSibling.nodeType==3){ - //Adjust the offset and node in the case of multiple text nodes in a row - offset = offset - node.length; - node = node.nextSibling; - } - return {"node": node, "offset": offset}; - }, - - removeTrailingBr: function(container){ - // summary: - // If last child of container is a `<br>`, then remove it. - // tags: - // private - var para = /P|DIV|LI/i.test(container.tagName) ? - container : this.editor._sCall("getParentOfType", [container,['P','DIV','LI']]); - - if(!para){ return; } - if(para.lastChild){ - if((para.childNodes.length > 1 && para.lastChild.nodeType == 3 && /^[\s\xAD]*$/.test(para.lastChild.nodeValue)) || - para.lastChild.tagName=='BR'){ - - domConstruct.destroy(para.lastChild); - } - } - if(!para.childNodes.length){ - para.innerHTML=this.bogusHtmlContent; - } - } -}); - -}); diff --git a/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js b/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js deleted file mode 100644 index 713717351..000000000 --- a/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js +++ /dev/null @@ -1,583 +0,0 @@ -define("dijit/_editor/plugins/FontChoice", [ - "dojo/_base/array", // array.indexOf array.map - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.place - "dojo/i18n", // i18n.getLocalization - "dojo/_base/lang", // lang.delegate lang.hitch lang.isString - "dojo/store/Memory", // MemoryStore - "../../registry", // registry.getUniqueId - "../../_Widget", - "../../_TemplatedMixin", - "../../_WidgetsInTemplateMixin", - "../../form/FilteringSelect", - "../_Plugin", - "../range", - "dojo/i18n!../nls/FontChoice" -], function(array, declare, domConstruct, i18n, lang, MemoryStore, - registry, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, FilteringSelect, _Plugin, rangeapi){ - - -// module: -// dijit/_editor/plugins/FontChoice - - -var _FontDropDown = declare("dijit._editor.plugins._FontDropDown", - [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], { - // summary: - // Base class for widgets that contains a label (like "Font:") - // and a FilteringSelect drop down to pick a value. - // Used as Toolbar entry. - - // label: [public] String - // The label to apply to this particular FontDropDown. - label: "", - - // plainText: [public] boolean - // Flag to indicate that the returned label should be plain text - // instead of an example. - plainText: false, - - // templateString: [public] String - // The template used to construct the labeled dropdown. - templateString: - "<span style='white-space: nowrap' class='dijit dijitReset dijitInline'>" + - "<label class='dijitLeft dijitInline' for='${selectId}'>${label}</label>" + - "<input data-dojo-type='dijit.form.FilteringSelect' required='false' " + - "data-dojo-props='labelType:\"html\", labelAttr:\"label\", searchAttr:\"name\"' " + - "tabIndex='-1' id='${selectId}' data-dojo-attach-point='select' value=''/>" + - "</span>", - - postMixInProperties: function(){ - // summary: - // Over-ride to set specific properties. - this.inherited(arguments); - - this.strings = i18n.getLocalization("dijit._editor", "FontChoice"); - - // Set some substitution variables used in the template - this.label = this.strings[this.command]; - - // _WidgetBase sets the id after postMixInProperties(), but we need it now. - // Alternative is to have a buildRendering() method and move this.selectId setting there, - // or alternately get rid of selectId variable and just access ${id} in template? - this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_")); - - this.selectId = this.id + "_select"; // used in template - - this.inherited(arguments); - }, - - postCreate: function(){ - // summary: - // Over-ride for the default postCreate action - // This establishes the filtering selects and the like. - - // Initialize the list of items in the drop down by creating data store with items like: - // {value: 1, name: "xx-small", label: "<font size=1>xx-small</font-size>" } - this.select.set("store", new MemoryStore({ - idProperty: "value", - data: array.map(this.values, function(value){ - var name = this.strings[value] || value; - return { - label: this.getLabel(value, name), - name: name, - value: value - }; - }, this) - })); - - this.select.set("value", "", false); - this.disabled = this.select.get("disabled"); - }, - - _setValueAttr: function(value, priorityChange){ - // summary: - // Over-ride for the default action of setting the - // widget value, maps the input to known values - // value: Object|String - // The value to set in the select. - // priorityChange: - // Optional parameter used to tell the select whether or not to fire - // onChange event. - - // if the value is not a permitted value, just set empty string to prevent showing the warning icon - priorityChange = priorityChange !== false; - this.select.set('value', array.indexOf(this.values,value) < 0 ? "" : value, priorityChange); - if(!priorityChange){ - // Clear the last state in case of updateState calls. Ref: #10466 - this.select._lastValueReported=null; - } - }, - - _getValueAttr: function(){ - // summary: - // Allow retrieving the value from the composite select on - // call to button.get("value"); - return this.select.get('value'); - }, - - focus: function(){ - // summary: - // Over-ride for focus control of this widget. Delegates focus down to the - // filtering select. - this.select.focus(); - }, - - _setDisabledAttr: function(value){ - // summary: - // Over-ride for the button's 'disabled' attribute so that it can be - // disabled programmatically. - - // Save off ths disabled state so the get retrieves it correctly - //without needing to have a function proxy it. - this.disabled = value; - this.select.set("disabled", value); - } -}); - - -var _FontNameDropDown = declare("dijit._editor.plugins._FontNameDropDown", _FontDropDown, { - // summary: - // Dropdown to select a font; goes in editor toolbar. - - // generic: [const] Boolean - // Use generic (web standard) font names - generic: false, - - // command: [public] String - // The editor 'command' implemented by this plugin. - command: "fontName", - - postMixInProperties: function(){ - // summary: - // Over-ride for the default posr mixin control - if(!this.values){ - this.values = this.generic ? - ["serif", "sans-serif", "monospace", "cursive", "fantasy"] : // CSS font-family generics - ["Arial", "Times New Roman", "Comic Sans MS", "Courier New"]; - } - this.inherited(arguments); - }, - - getLabel: function(value, name){ - // summary: - // Function used to generate the labels of the format dropdown - // will return a formatted, or plain label based on the value - // of the plainText option. - // value: String - // The 'insert value' associated with a name - // name: String - // The text name of the value - if(this.plainText){ - return name; - }else{ - return "<div style='font-family: "+value+"'>" + name + "</div>"; - } - }, - - _setValueAttr: function(value, priorityChange){ - // summary: - // Over-ride for the default action of setting the - // widget value, maps the input to known values - - priorityChange = priorityChange !== false; - if(this.generic){ - var map = { - "Arial": "sans-serif", - "Helvetica": "sans-serif", - "Myriad": "sans-serif", - "Times": "serif", - "Times New Roman": "serif", - "Comic Sans MS": "cursive", - "Apple Chancery": "cursive", - "Courier": "monospace", - "Courier New": "monospace", - "Papyrus": "fantasy", - "Estrangelo Edessa": "cursive", // Windows 7 - "Gabriola": "fantasy" // Windows 7 - }; - value = map[value] || value; - } - this.inherited(arguments, [value, priorityChange]); - } -}); - -var _FontSizeDropDown = declare("dijit._editor.plugins._FontSizeDropDown", _FontDropDown, { - // summary: - // Dropdown to select a font size; goes in editor toolbar. - - // command: [public] String - // The editor 'command' implemented by this plugin. - command: "fontSize", - - // values: [public] Number[] - // The HTML font size values supported by this plugin - values: [1,2,3,4,5,6,7], // sizes according to the old HTML FONT SIZE - - getLabel: function(value, name){ - // summary: - // Function used to generate the labels of the format dropdown - // will return a formatted, or plain label based on the value - // of the plainText option. - // We're stuck using the deprecated FONT tag to correspond - // with the size measurements used by the editor - // value: String - // The 'insert value' associated with a name - // name: String - // The text name of the value - if(this.plainText){ - return name; - }else{ - return "<font size=" + value + "'>" + name + "</font>"; - } - }, - - _setValueAttr: function(value, priorityChange){ - // summary: - // Over-ride for the default action of setting the - // widget value, maps the input to known values - priorityChange = priorityChange !== false; - if(value.indexOf && value.indexOf("px") != -1){ - var pixels = parseInt(value, 10); - value = {10:1, 13:2, 16:3, 18:4, 24:5, 32:6, 48:7}[pixels] || value; - } - - this.inherited(arguments, [value, priorityChange]); - } -}); - - -var _FormatBlockDropDown = declare("dijit._editor.plugins._FormatBlockDropDown", _FontDropDown, { - // summary: - // Dropdown to select a format (like paragraph or heading); goes in editor toolbar. - - // command: [public] String - // The editor 'command' implemented by this plugin. - command: "formatBlock", - - // values: [public] Array - // The HTML format tags supported by this plugin - values: ["noFormat", "p", "h1", "h2", "h3", "pre"], - - postCreate: function(){ - // Init and set the default value to no formatting. Update state will adjust it - // as needed. - this.inherited(arguments); - this.set("value", "noFormat", false); - }, - - getLabel: function(value, name){ - // summary: - // Function used to generate the labels of the format dropdown - // will return a formatted, or plain label based on the value - // of the plainText option. - // value: String - // The 'insert value' associated with a name - // name: String - // The text name of the value - if(this.plainText || value == "noFormat"){ - return name; - }else{ - return "<" + value + ">" + name + "</" + value + ">"; - } - }, - - _execCommand: function(editor, command, choice){ - // summary: - // Over-ride for default exec-command label. - // Allows us to treat 'none' as special. - if(choice === "noFormat"){ - var start; - var end; - var sel = rangeapi.getSelection(editor.window); - if(sel && sel.rangeCount > 0){ - var range = sel.getRangeAt(0); - var node, tag; - if(range){ - start = range.startContainer; - end = range.endContainer; - - // find containing nodes of start/end. - while(start && start !== editor.editNode && - start !== editor.document.body && - start.nodeType !== 1){ - start = start.parentNode; - } - - while(end && end !== editor.editNode && - end !== editor.document.body && - end.nodeType !== 1){ - end = end.parentNode; - } - - var processChildren = lang.hitch(this, function(node, ary){ - if(node.childNodes && node.childNodes.length){ - var i; - for(i = 0; i < node.childNodes.length; i++){ - var c = node.childNodes[i]; - if(c.nodeType == 1){ - if(editor._sCall("inSelection", [c])){ - var tag = c.tagName? c.tagName.toLowerCase(): ""; - if(array.indexOf(this.values, tag) !== -1){ - ary.push(c); - } - processChildren(c, ary); - } - } - } - } - }); - - var unformatNodes = lang.hitch(this, function(nodes){ - // summary: - // Internal function to clear format nodes. - // nodes: - // The array of nodes to strip formatting from. - if(nodes && nodes.length){ - editor.beginEditing(); - while(nodes.length){ - this._removeFormat(editor, nodes.pop()); - } - editor.endEditing(); - } - }); - - var clearNodes = []; - if(start == end){ - //Contained within the same block, may be collapsed, but who cares, see if we - // have a block element to remove. - var block; - node = start; - while(node && node !== editor.editNode && node !== editor.document.body){ - if(node.nodeType == 1){ - tag = node.tagName? node.tagName.toLowerCase(): ""; - if(array.indexOf(this.values, tag) !== -1){ - block = node; - break; - } - } - node = node.parentNode; - } - - //Also look for all child nodes in the selection that may need to be - //cleared of formatting - processChildren(start, clearNodes); - if(block){ clearNodes = [block].concat(clearNodes); } - unformatNodes(clearNodes); - }else{ - // Probably a multi select, so we have to process it. Whee. - node = start; - while(editor._sCall("inSelection", [node])){ - if(node.nodeType == 1){ - tag = node.tagName? node.tagName.toLowerCase(): ""; - if(array.indexOf(this.values, tag) !== -1){ - clearNodes.push(node); - } - processChildren(node,clearNodes); - } - node = node.nextSibling; - } - unformatNodes(clearNodes); - } - editor.onDisplayChanged(); - } - } - }else{ - editor.execCommand(command, choice); - } - }, - - _removeFormat: function(editor, node){ - // summary: - // function to remove the block format node. - // node: - // The block format node to remove (and leave the contents behind) - if(editor.customUndo){ - // So of course IE doesn't work right with paste-overs. - // We have to do this manually, which is okay since IE already uses - // customUndo and we turned it on for WebKit. WebKit pasted funny, - // so couldn't use the execCommand approach - while(node.firstChild){ - domConstruct.place(node.firstChild, node, "before"); - } - node.parentNode.removeChild(node); - }else{ - // Everyone else works fine this way, a paste-over and is native - // undo friendly. - editor._sCall("selectElementChildren", [node]) - var html = editor._sCall("getSelectedHtml", []) - editor._sCall("selectElement", [node]) - editor.execCommand("inserthtml", html||""); - } - } -}); - -// TODO: for 2.0, split into FontChoice plugin into three separate classes, -// one for each command (and change registry below) -var FontChoice = declare("dijit._editor.plugins.FontChoice", _Plugin,{ - // summary: - // This plugin provides three drop downs for setting style in the editor - // (font, font size, and format block), as controlled by command. - // - // description: - // The commands provided by this plugin are: - // - // - fontName: Provides a drop down to select from a list of font names - // - fontSize: Provides a drop down to select from a list of font sizes - // - formatBlock: Provides a drop down to select from a list of block styles - // which can easily be added to an editor by including one or more of the above commands - // in the `plugins` attribute as follows: - // - // | plugins="['fontName','fontSize',...]" - // - // It is possible to override the default dropdown list by providing an Array for the `custom` property when - // instantiating this plugin, e.g. - // - // | plugins="[{name:'dijit._editor.plugins.FontChoice', command:'fontName', values:['Verdana','Myriad','Garamond']},...]" - // - // Alternatively, for `fontName` only, `generic:true` may be specified to provide a dropdown with - // [CSS generic font families](http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families). - // - // Note that the editor is often unable to properly handle font styling information defined outside - // the context of the current editor instance, such as pre-populated HTML. - - // useDefaultCommand: [protected] Boolean - // Override _Plugin.useDefaultCommand... - // processing is handled by this plugin, not by dijit/Editor. - useDefaultCommand: false, - - _initButton: function(){ - // summary: - // Overrides _Plugin._initButton(), to initialize the FilteringSelect+label in toolbar, - // rather than a simple button. - // tags: - // protected - - // Create the widget to go into the toolbar (the so-called "button") - var clazz = { - fontName: _FontNameDropDown, - fontSize: _FontSizeDropDown, - formatBlock: _FormatBlockDropDown - }[this.command], - params = this.params; - - // For back-compat reasons support setting custom values via "custom" parameter - // rather than "values" parameter. Remove in 2.0. - if(this.params.custom){ - params.values = this.params.custom; - } - - var editor = this.editor; - this.button = new clazz(lang.delegate({dir: editor.dir, lang: editor.lang}, params)); - - // Reflect changes to the drop down in the editor - this.connect(this.button.select, "onChange", function(choice){ - // User invoked change, since all internal updates set priorityChange to false and will - // not trigger an onChange event. - this.editor.focus(); - - if(this.command == "fontName" && choice.indexOf(" ") != -1){ choice = "'" + choice + "'"; } - - // Invoke, the editor already normalizes commands called through its - // execCommand. - if(this.button._execCommand){ - this.button._execCommand(this.editor, this.command, choice); - }else{ - this.editor.execCommand(this.command, choice); - } - }); - }, - - updateState: function(){ - // summary: - // Overrides _Plugin.updateState(). This controls updating the menu - // options to the right values on state changes in the document (that trigger a - // test of the actions.) - // It set value of drop down in toolbar to reflect font/font size/format block - // of text at current caret position. - // tags: - // protected - var _e = this.editor; - var _c = this.command; - if(!_e || !_e.isLoaded || !_c.length){ return; } - - if(this.button){ - var disabled = this.get("disabled"); - this.button.set("disabled", disabled); - if(disabled){ return; } - var value; - try{ - value = _e.queryCommandValue(_c) || ""; - }catch(e){ - //Firefox may throw error above if the editor is just loaded, ignore it - value = ""; - } - - // strip off single quotes, if any - var quoted = lang.isString(value) && value.match(/'([^']*)'/); - if(quoted){ value = quoted[1]; } - - if(_c === "formatBlock"){ - if(!value || value == "p"){ - // Some browsers (WebKit) doesn't actually get the tag info right. - // and IE returns paragraph when in a DIV!, so incorrect a lot, - // so we have double-check it. - value = null; - var elem; - // Try to find the current element where the caret is. - var sel = rangeapi.getSelection(this.editor.window); - if(sel && sel.rangeCount > 0){ - var range = sel.getRangeAt(0); - if(range){ - elem = range.endContainer; - } - } - - // Okay, now see if we can find one of the formatting types we're in. - while(elem && elem !== _e.editNode && elem !== _e.document){ - var tg = elem.tagName?elem.tagName.toLowerCase():""; - if(tg && array.indexOf(this.button.values, tg) > -1){ - value = tg; - break; - } - elem = elem.parentNode; - } - if(!value){ - // Still no value, so lets select 'none'. - value = "noFormat"; - } - }else{ - // Check that the block format is one allowed, if not, - // null it so that it gets set to empty. - if(array.indexOf(this.button.values, value) < 0){ - value = "noFormat"; - } - } - } - if(value !== this.button.get("value")){ - // Set the value, but denote it is not a priority change, so no - // onchange fires. - this.button.set('value', value, false); - } - } - } -}); - -// Register these plugins -array.forEach(["fontName", "fontSize", "formatBlock"], function(name){ - _Plugin.registry[name] = function(args){ - return new FontChoice({ - command: name, - plainText: args.plainText - }); - }; -}); - -// Make all classes available through AMD, and return main class -FontChoice._FontDropDown = _FontDropDown; -FontChoice._FontNameDropDown = _FontNameDropDown; -FontChoice._FontSizeDropDown = _FontSizeDropDown; -FontChoice._FormatBlockDropDown = _FormatBlockDropDown; -return FontChoice; - -}); diff --git a/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js b/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js deleted file mode 100644 index 68f27954b..000000000 --- a/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js +++ /dev/null @@ -1,450 +0,0 @@ -define("dijit/_editor/plugins/FullScreen", [ - "dojo/aspect", - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-geometry", - "dojo/dom-style", - "dojo/_base/event", // event.stop - "dojo/i18n", // i18n.getLocalization - "dojo/keys", // keys.F11 keys.TAB - "dojo/_base/lang", // lang.hitch - "dojo/on", // on() - "dojo/sniff", // has("ie"), has("quirks") - "dojo/_base/window", // win.body - "dojo/window", // winUtils.getBox winUtils.scrollIntoView - "../../focus", // focus.focus(), focus.curNode - "../_Plugin", - "../../form/ToggleButton", - "../../registry", // registry.getEnclosingWidget() - "dojo/i18n!../nls/commands" -], function(aspect, declare, domClass, domGeometry, domStyle, event, i18n, keys, lang, on, has, win, winUtils, - focus, _Plugin, ToggleButton, registry){ - - -// module: -// dijit/_editor/plugins/FullScreen - - -var FullScreen = declare("dijit._editor.plugins.FullScreen",_Plugin,{ - // summary: - // This plugin provides FullScreen capability to the editor. When - // toggled on, it will render the editor into the full window and - // overlay everything. It also binds to the hotkey: CTRL-SHIFT-F11 - // for toggling fullscreen mode. - - // zIndex: [public] Number - // zIndex value used for overlaying the full page. - // default is 500. - zIndex: 500, - - // _origState: [private] Object - // The original view state of the editor. - _origState: null, - - // _origiFrameState: [private] Object - // The original view state of the iframe of the editor. - _origiFrameState: null, - - // _resizeHandle: [private] Object - // Connection point used for handling resize when window resizes. - _resizeHandle: null, - - // isFullscreen: [const] boolean - // Read-Only variable used to denote of the editor is in fullscreen mode or not. - isFullscreen: false, - - toggle: function(){ - // summary: - // Function to allow programmatic toggling of the view. - this.button.set("checked", !this.button.get("checked")); - }, - - _initButton: function(){ - // summary: - // Over-ride for creation of the resize button. - var strings = i18n.getLocalization("dijit._editor", "commands"), - editor = this.editor; - this.button = new ToggleButton({ - label: strings["fullScreen"], - ownerDocument: editor.ownerDocument, - dir: editor.dir, - lang: editor.lang, - showLabel: false, - iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "FullScreen", - tabIndex: "-1", - onChange: lang.hitch(this, "_setFullScreen") - }); - }, - - setEditor: function(editor){ - // summary: - // Over-ride for the setting of the editor. - // editor: Object - // The editor to configure for this plugin to use. - this.editor = editor; - this._initButton(); - - this.editor.addKeyHandler(keys.F11, true, true, lang.hitch(this, function(e){ - // Enable the CTRL-SHIFT-F11 hotkey for fullscreen mode. - this.toggle(); - event.stop(e); - setTimeout(lang.hitch(this, function(){this.editor.focus();}), 250); - return true; - })); - this.connect(this.editor.domNode, "onkeydown", "_containFocus"); - }, - - _containFocus: function(e){ - // summary: - // When in Full Screen mode, it's good to try and retain focus in the editor - // so this function is intended to try and constrain the TAB key. - // e: Event - // The key event. - // tags: - // private - if(this.isFullscreen){ - var ed = this.editor; - if(!ed.isTabIndent && - ed._fullscreen_oldOnKeyDown && - e.keyCode === keys.TAB){ - // If we're in fullscreen mode, we want to take over how tab moves focus a bit. - // to keep it within the editor since it's hiding the rest of the page. - // IE hates changing focus IN the event handler, so need to put calls - // in a timeout. Gotta love IE. - // Also need to check for alternate view nodes if present and active. - var f = focus.curNode; - var avn = this._getAltViewNode(); - if(f == ed.iframe || - (avn && f === avn)){ - setTimeout(lang.hitch(this, function(){ - ed.toolbar.focus(); - }), 10); - }else{ - if(avn && domStyle.get(ed.iframe, "display") === "none"){ - setTimeout(lang.hitch(this, function(){ - focus.focus(avn); - }), 10); - }else{ - setTimeout(lang.hitch(this, function(){ - ed.focus(); - }), 10); - } - } - event.stop(e); - }else if(ed._fullscreen_oldOnKeyDown){ - // Only call up when it's a different function. Traps corner case event issue - // on IE which caused stack overflow on handler cleanup. - ed._fullscreen_oldOnKeyDown(e); - } - } - }, - - _resizeEditor: function(){ - // summary: - // Function to handle resizing the editor as the viewport - // resizes (window scaled) - // tags: - // private - var vp = winUtils.getBox(this.editor.ownerDocument); - domGeometry.setMarginBox(this.editor.domNode, { - w: vp.w, - h: vp.h - }); - - //Adjust the internal heights too, as they can be a bit off. - var hHeight = this.editor.getHeaderHeight(); - var fHeight = this.editor.getFooterHeight(); - var extents = domGeometry.getPadBorderExtents(this.editor.domNode); - var fcpExtents = domGeometry.getPadBorderExtents(this.editor.iframe.parentNode); - var fcmExtents = domGeometry.getMarginExtents(this.editor.iframe.parentNode); - - var cHeight = vp.h - (hHeight + extents.h + fHeight); - domGeometry.setMarginBox(this.editor.iframe.parentNode, { - h: cHeight, - w: vp.w - }); - domGeometry.setMarginBox(this.editor.iframe, { - h: cHeight - (fcpExtents.h + fcmExtents.h) - }); - }, - - _getAltViewNode: function(){ - // summary: - // This function is intended as a hook point for setting an - // alternate view node for when in full screen mode and the - // editable iframe is hidden. - // tags: - // protected. - }, - - _setFullScreen: function(full){ - // summary: - // Function to handle toggling between full screen and - // regular view. - // tags: - // private - - //Alias this for shorter code. - var ed = this.editor; - var body = ed.ownerDocumentBody; - var editorParent = ed.domNode.parentNode; - - var vp = winUtils.getBox(ed.ownerDocument); - - this.isFullscreen = full; - - if(full){ - //Parent classes can royally screw up this plugin, so we - //have to set everything to position static. - while(editorParent && editorParent !== body){ - domClass.add(editorParent, "dijitForceStatic"); - editorParent = editorParent.parentNode; - } - - // Save off the resize function. We want to kill its behavior. - this._editorResizeHolder = this.editor.resize; - ed.resize = function(){} ; - - // Try to constrain focus control. - ed._fullscreen_oldOnKeyDown = ed.onKeyDown; - ed.onKeyDown = lang.hitch(this, this._containFocus); - - this._origState = {}; - this._origiFrameState = {}; - - // Store the basic editor state we have to restore later. - // Not using domStyle.get here, had problems, didn't - // give me stuff like 100%, gave me pixel calculated values. - // Need the exact original values. - var domNode = ed.domNode, - rawStyle = domNode && domNode.style || {}; - this._origState = { - width: rawStyle.width || "", - height: rawStyle.height || "", - top: domStyle.get(domNode, "top") || "", - left: domStyle.get(domNode, "left") || "", - position: domStyle.get(domNode, "position") || "static", - marginBox: domGeometry.getMarginBox(ed.domNode) - }; - - // Store the iframe state we have to restore later. - // Not using domStyle.get here, had problems, didn't - // give me stuff like 100%, gave me pixel calculated values. - // Need the exact original values. - var iframe = ed.iframe, - iframeStyle = iframe && iframe.style || {}; - - var bc = domStyle.get(ed.iframe, "backgroundColor"); - this._origiFrameState = { - backgroundColor: bc || "transparent", - width: iframeStyle.width || "auto", - height: iframeStyle.height || "auto", - zIndex: iframeStyle.zIndex || "" - }; - - // Okay, size everything. - domStyle.set(ed.domNode, { - position: "absolute", - top: "0px", - left: "0px", - zIndex: this.zIndex, - width: vp.w + "px", - height: vp.h + "px" - }); - - domStyle.set(ed.iframe, { - height: "100%", - width: "100%", - zIndex: this.zIndex, - backgroundColor: bc !== "transparent" && - bc !== "rgba(0, 0, 0, 0)"?bc:"white" - }); - - domStyle.set(ed.iframe.parentNode, { - height: "95%", - width: "100%" - }); - - // Store the overflow state we have to restore later. - // IE had issues, so have to check that it's defined. Ugh. - if(body.style && body.style.overflow){ - this._oldOverflow = domStyle.get(body, "overflow"); - }else{ - this._oldOverflow = ""; - } - - if(has("ie") && !has("quirks")){ - // IE will put scrollbars in anyway, html (parent of body) - // also controls them in standards mode, so we have to - // remove them, argh. - if(body.parentNode && - body.parentNode.style && - body.parentNode.style.overflow){ - this._oldBodyParentOverflow = body.parentNode.style.overflow; - }else{ - try{ - this._oldBodyParentOverflow = domStyle.get(body.parentNode, "overflow"); - }catch(e){ - this._oldBodyParentOverflow = "scroll"; - } - } - domStyle.set(body.parentNode, "overflow", "hidden"); - } - domStyle.set(body, "overflow", "hidden"); - - var resizer = function(){ - // function to handle resize events. - // Will check current VP and only resize if - // different. - var vp = winUtils.getBox(ed.ownerDocument); - if("_prevW" in this && "_prevH" in this){ - // No actual size change, ignore. - if(vp.w === this._prevW && vp.h === this._prevH){ - return; - } - }else{ - this._prevW = vp.w; - this._prevH = vp.h; - } - if(this._resizer){ - clearTimeout(this._resizer); - delete this._resizer; - } - // Timeout it to help avoid spamming resize on IE. - // Works for all browsers. - this._resizer = setTimeout(lang.hitch(this, function(){ - delete this._resizer; - this._resizeEditor(); - }), 10); - }; - this._resizeHandle = on(window, "resize", lang.hitch(this, resizer)); - - // Also monitor for direct calls to resize and adapt editor. - this._resizeHandle2 = aspect.after(ed, "onResize", lang.hitch(this, function(){ - if(this._resizer){ - clearTimeout(this._resizer); - delete this._resizer; - } - this._resizer = setTimeout(lang.hitch(this, function(){ - delete this._resizer; - this._resizeEditor(); - }), 10); - })); - - // Call it once to work around IE glitchiness. Safe for other browsers too. - this._resizeEditor(); - var dn = this.editor.toolbar.domNode; - setTimeout(function(){winUtils.scrollIntoView(dn);}, 250); - }else{ - if(this._resizeHandle){ - // Cleanup resizing listeners - this._resizeHandle.remove(); - this._resizeHandle = null; - } - if(this._resizeHandle2){ - // Cleanup resizing listeners - this._resizeHandle2.remove(); - this._resizeHandle2 = null; - } - if(this._rst){ - clearTimeout(this._rst); - this._rst = null; - } - - //Remove all position static class assigns. - while(editorParent && editorParent !== body){ - domClass.remove(editorParent, "dijitForceStatic"); - editorParent = editorParent.parentNode; - } - - // Restore resize function - if(this._editorResizeHolder){ - this.editor.resize = this._editorResizeHolder; - } - - if(!this._origState && !this._origiFrameState){ - // If we actually didn't toggle, then don't do anything. - return; - } - if(ed._fullscreen_oldOnKeyDown){ - ed.onKeyDown = ed._fullscreen_oldOnKeyDown; - delete ed._fullscreen_oldOnKeyDown; - } - - // Add a timeout to make sure we don't have a resize firing in the - // background at the time of minimize. - var self = this; - setTimeout(function(){ - // Restore all the editor state. - var mb = self._origState.marginBox; - var oh = self._origState.height; - if(has("ie") && !has("quirks")){ - body.parentNode.style.overflow = self._oldBodyParentOverflow; - delete self._oldBodyParentOverflow; - } - domStyle.set(body, "overflow", self._oldOverflow); - delete self._oldOverflow; - - domStyle.set(ed.domNode, self._origState); - domStyle.set(ed.iframe.parentNode, { - height: "", - width: "" - }); - domStyle.set(ed.iframe, self._origiFrameState); - delete self._origState; - delete self._origiFrameState; - // In case it is contained in a layout and the layout changed size, - // go ahead and call resize. - var pWidget = registry.getEnclosingWidget(ed.domNode.parentNode); - if(pWidget && pWidget.resize){ - pWidget.resize(); - }else{ - if(!oh || oh.indexOf("%") < 0){ - // Resize if the original size wasn't set - // or wasn't in percent. Timeout is to avoid - // an IE crash in unit testing. - setTimeout(lang.hitch(this, function(){ed.resize({h: mb.h});}), 0); - } - } - winUtils.scrollIntoView(self.editor.toolbar.domNode); - }, 100); - } - }, - - updateState: function(){ - // summary: - // Over-ride for button state control for disabled to work. - this.button.set("disabled", this.get("disabled")); - }, - - destroy: function(){ - // summary: - // Over-ride to ensure the resize handle gets cleaned up. - if(this._resizeHandle){ - // Cleanup resizing listeners - this._resizeHandle.remove(); - this._resizeHandle = null; - } - if(this._resizeHandle2){ - // Cleanup resizing listeners - this._resizeHandle2.remove(); - this._resizeHandle2 = null; - } - if(this._resizer){ - clearTimeout(this._resizer); - this._resizer = null; - } - this.inherited(arguments); - } -}); - -// Register this plugin. -// For back-compat accept "fullscreen" (all lowercase) too, remove in 2.0 -_Plugin.registry["fullScreen"] = _Plugin.registry["fullscreen"] = function(args){ - return new FullScreen({ - zIndex: ("zIndex" in args)?args.zIndex:500 - }); -}; - -return FullScreen; -}); diff --git a/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js deleted file mode 100644 index 5ed6ce3da..000000000 --- a/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js +++ /dev/null @@ -1,609 +0,0 @@ -define("dijit/_editor/plugins/LinkDialog", [ - "require", - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.get - "dojo/keys", // keys.ENTER - "dojo/_base/lang", // lang.delegate lang.hitch lang.trim - "dojo/sniff", // has("ie") - "dojo/_base/query", // query - "dojo/string", // string.substitute - "../../_Widget", - "../_Plugin", - "../../form/DropDownButton", - "../range" -], function(require, declare, domAttr, keys, lang, has, query, string, - _Widget, _Plugin, DropDownButton, rangeapi){ - - -// module: -// dijit/_editor/plugins/LinkDialog -// summary: -// Editor plugins: LinkDialog (for inserting links) and ImgLinkDialog (for inserting images) - - -var LinkDialog = declare("dijit._editor.plugins.LinkDialog", _Plugin, { - // summary: - // This plugin provides the basis for an 'anchor' (link) dialog and an extension of it - // provides the image link dialog. - // description: - // The command provided by this plugin is: - // - // - createLink - - // Override _Plugin.buttonClass. This plugin is controlled by a DropDownButton - // (which triggers a TooltipDialog). - buttonClass: DropDownButton, - - // Override _Plugin.useDefaultCommand... processing is handled by this plugin, not by dijit/Editor. - useDefaultCommand: false, - - // urlRegExp: [protected] String - // Used for validating input as correct URL. While file:// urls are not terribly - // useful, they are technically valid. - urlRegExp: "((https?|ftps?|file)\\://|\./|\.\./|/|)(/[a-zA-Z]{1,1}:/|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)*(?:[a-zA-Z](?:[-\\da-zA-Z]{0,80}[\\da-zA-Z])?)\\.?)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]|(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])|0[xX]0*[\\da-fA-F]{1,8}|([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}|([\\da-fA-F]{1,4}\\:){6}((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])))(\\:\\d+)?(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]{0,}(?:\\?[^?#\\s/]*)?(?:#.*)?)?)?", - - // emailRegExp: [protected] String - // Used for validating input as correct email address. Taken from dojox.validate - emailRegExp: "<?(mailto\\:)([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+" /*username*/ + "@" + - "((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)+(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)\\.?)|localhost|^[^-][a-zA-Z0-9_-]*>?", // host. - - // htmlTemplate: [protected] String - // String used for templating the HTML to insert at the desired point. - htmlTemplate: "<a href=\"${urlInput}\" _djrealurl=\"${urlInput}\"" + - " target=\"${targetSelect}\"" + - ">${textInput}</a>", - - // tag: [protected] String - // Tag used for the link type. - tag: "a", - - // _hostRxp [private] RegExp - // Regular expression used to validate url fragments (ip address, hostname, etc) - _hostRxp: /^((([^\[:]+):)?([^@]+)@)?(\[([^\]]+)\]|([^\[:]*))(:([0-9]+))?$/, - - // _userAtRxp [private] RegExp - // Regular expression used to validate e-mail address fragment. - _userAtRxp: /^([!#-'*+\-\/-9=?A-Z^-~]+[.])*[!#-'*+\-\/-9=?A-Z^-~]+@/i, - - // linkDialogTemplate: [protected] String - // Template for contents of TooltipDialog to pick URL - linkDialogTemplate: [ - "<table role='presentation'><tr><td>", - "<label for='${id}_urlInput'>${url}</label>", - "</td><td>", - "<input data-dojo-type='dijit.form.ValidationTextBox' required='true' " + - "id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>", - "</td></tr><tr><td>", - "<label for='${id}_textInput'>${text}</label>", - "</td><td>", - "<input data-dojo-type='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' " + - "name='textInput' data-dojo-props='intermediateChanges:true'/>", - "</td></tr><tr><td>", - "<label for='${id}_targetSelect'>${target}</label>", - "</td><td>", - "<select id='${id}_targetSelect' name='targetSelect' data-dojo-type='dijit.form.Select'>", - "<option selected='selected' value='_self'>${currentWindow}</option>", - "<option value='_blank'>${newWindow}</option>", - "<option value='_top'>${topWindow}</option>", - "<option value='_parent'>${parentWindow}</option>", - "</select>", - "</td></tr><tr><td colspan='2'>", - "<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>", - "<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>", - "</td></tr></table>" - ].join(""), - - _initButton: function(){ - this.inherited(arguments); - - // Setup to lazy create TooltipDialog first time the button is clicked - this.button.loadDropDown = lang.hitch(this, "_loadDropDown"); - - this._connectTagEvents(); - }, - _loadDropDown: function(callback){ - // Called the first time the button is pressed. Initialize TooltipDialog. - require([ - "dojo/i18n", // i18n.getLocalization - "../../TooltipDialog", - "../../registry", // registry.byId, registry.getUniqueId - "../../form/Button", // used by template - "../../form/Select", // used by template - "../../form/ValidationTextBox", // used by template - "dojo/i18n!../../nls/common", - "dojo/i18n!../nls/LinkDialog" - ], lang.hitch(this, function(i18n, TooltipDialog, registry){ - var _this = this; - this.tag = this.command == 'insertImage' ? 'img' : 'a'; - var messages = lang.delegate(i18n.getLocalization("dijit", "common", this.lang), - i18n.getLocalization("dijit._editor", "LinkDialog", this.lang)); - var dropDown = (this.dropDown = this.button.dropDown = new TooltipDialog({ - title: messages[this.command + "Title"], - ownerDocument: this.editor.ownerDocument, - dir: this.editor.dir, - execute: lang.hitch(this, "setValue"), - onOpen: function(){ - _this._onOpenDialog(); - TooltipDialog.prototype.onOpen.apply(this, arguments); - }, - onCancel: function(){ - setTimeout(lang.hitch(_this, "_onCloseDialog"),0); - } - })); - messages.urlRegExp = this.urlRegExp; - messages.id = registry.getUniqueId(this.editor.id); - this._uniqueId = messages.id; - this._setContent(dropDown.title + - "<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>" + - string.substitute(this.linkDialogTemplate, messages)); - dropDown.startup(); - this._urlInput = registry.byId(this._uniqueId + "_urlInput"); - this._textInput = registry.byId(this._uniqueId + "_textInput"); - this._setButton = registry.byId(this._uniqueId + "_setButton"); - this.connect(registry.byId(this._uniqueId + "_cancelButton"), "onClick", function(){ - this.dropDown.onCancel(); - }); - if(this._urlInput){ - this.connect(this._urlInput, "onChange", "_checkAndFixInput"); - } - if(this._textInput){ - this.connect(this._textInput, "onChange", "_checkAndFixInput"); - } - - // Build up the dual check for http/https/file:, and mailto formats. - this._urlRegExp = new RegExp("^" + this.urlRegExp + "$", "i"); - this._emailRegExp = new RegExp("^" + this.emailRegExp + "$", "i"); - this._urlInput.isValid = lang.hitch(this, function(){ - // Function over-ride of isValid to test if the input matches a url or a mailto style link. - var value = this._urlInput.get("value"); - return this._urlRegExp.test(value) || this._emailRegExp.test(value); - }); - - // Listen for enter and execute if valid. - this.connect(dropDown.domNode, "onkeypress", function(e){ - if(e && e.charOrCode == keys.ENTER && - !e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey){ - if(!this._setButton.get("disabled")){ - dropDown.onExecute(); - dropDown.execute(dropDown.get('value')); - } - } - }); - - callback(); - })); - }, - - _checkAndFixInput: function(){ - // summary: - // A function to listen for onChange events and test the input contents - // for valid information, such as valid urls with http/https/ftp and if - // not present, try and guess if the input url is relative or not, and if - // not, append http:// to it. Also validates other fields as determined by - // the internal _isValid function. - var self = this; - var url = this._urlInput.get("value"); - var fixupUrl = function(url){ - var appendHttp = false; - var appendMailto = false; - if(url && url.length > 1){ - url = lang.trim(url); - if(url.indexOf("mailto:") !== 0){ - if(url.indexOf("/") > 0){ - if(url.indexOf("://") === -1){ - // Check that it doesn't start with /, ./, or ../, which would - // imply 'target server relativeness' - if(url.charAt(0) !== '/' && url.indexOf("./") && url.indexOf("../") !== 0){ - if(self._hostRxp.test(url)){ - appendHttp = true; - } - } - } - }else if(self._userAtRxp.test(url)){ - // If it looks like a foo@, append a mailto. - appendMailto = true; - } - } - } - if(appendHttp){ - self._urlInput.set("value", "http://" + url); - } - if(appendMailto){ - self._urlInput.set("value", "mailto:" + url); - } - self._setButton.set("disabled", !self._isValid()); - }; - if(this._delayedCheck){ - clearTimeout(this._delayedCheck); - this._delayedCheck = null; - } - this._delayedCheck = setTimeout(function(){ - fixupUrl(url); - }, 250); - }, - - _connectTagEvents: function(){ - // summary: - // Over-ridable function that connects tag specific events. - this.editor.onLoadDeferred.then(lang.hitch(this, function(){ - this.connect(this.editor.editNode, "ondblclick", this._onDblClick); - })); - }, - - _isValid: function(){ - // summary: - // Internal function to allow validating of the inputs - // for a link to determine if set should be disabled or not - // tags: - // protected - return this._urlInput.isValid() && this._textInput.isValid(); - }, - - _setContent: function(staticPanel){ - // summary: - // Helper for _initButton above. Not sure why it's a separate method. - this.dropDown.set({ - parserScope: "dojo", // make parser search for dojoType/data-dojo-type even if page is multi-version - content: staticPanel - }); - }, - - _checkValues: function(args){ - // summary: - // Function to check the values in args and 'fix' them up as needed. - // args: Object - // Content being set. - // tags: - // protected - if(args && args.urlInput){ - args.urlInput = args.urlInput.replace(/"/g, """); - } - return args; - }, - - setValue: function(args){ - // summary: - // Callback from the dialog when user presses "set" button. - // tags: - // private - - // TODO: prevent closing popup if the text is empty - this._onCloseDialog(); - if(has("ie") < 9){ //see #4151 - var sel = rangeapi.getSelection(this.editor.window); - var range = sel.getRangeAt(0); - var a = range.endContainer; - if(a.nodeType === 3){ - // Text node, may be the link contents, so check parent. - // This plugin doesn't really support nested HTML elements - // in the link, it assumes all link content is text. - a = a.parentNode; - } - if(a && (a.nodeName && a.nodeName.toLowerCase() !== this.tag)){ - // Still nothing, one last thing to try on IE, as it might be 'img' - // and thus considered a control. - a = this.editor._sCall("getSelectedElement", [this.tag]); - } - if(a && (a.nodeName && a.nodeName.toLowerCase() === this.tag)){ - // Okay, we do have a match. IE, for some reason, sometimes pastes before - // instead of removing the targeted paste-over element, so we unlink the - // old one first. If we do not the <a> tag remains, but it has no content, - // so isn't readily visible (but is wrong for the action). - if(this.editor.queryCommandEnabled("unlink")){ - // Select all the link children, then unlink. The following insert will - // then replace the selected text. - this.editor._sCall("selectElementChildren", [a]); - this.editor.execCommand("unlink"); - } - } - } - // make sure values are properly escaped, etc. - args = this._checkValues(args); - this.editor.execCommand('inserthtml', - string.substitute(this.htmlTemplate, args)); - - // IE sometimes leaves a blank link, so we need to fix it up. - // Go ahead and do this for everyone just to avoid blank links - // in the page. - query("a", this.editor.document).forEach(function(a){ - if(!a.innerHTML && !domAttr.has(a, "name")){ - // Remove empty anchors that do not have "name" set. - // Empty ones with a name set could be a hidden hash - // anchor. - a.parentNode.removeChild(a); - } - }, this); - }, - - _onCloseDialog: function(){ - // summary: - // Handler for close event on the dialog - this.editor.focus(); - }, - - _getCurrentValues: function(a){ - // summary: - // Over-ride for getting the values to set in the dropdown. - // a: - // The anchor/link to process for data for the dropdown. - // tags: - // protected - var url, text, target; - if(a && a.tagName.toLowerCase() === this.tag){ - url = a.getAttribute('_djrealurl') || a.getAttribute('href'); - target = a.getAttribute('target') || "_self"; - text = a.textContent || a.innerText; - this.editor._sCall("selectElement", [a, true]); - }else{ - text = this.editor._sCall("getSelectedText"); - } - return {urlInput: url || '', textInput: text || '', targetSelect: target || ''}; //Object; - }, - - _onOpenDialog: function(){ - // summary: - // Handler for when the dialog is opened. - // If the caret is currently in a URL then populate the URL's info into the dialog. - var a,b,fc; - if(has("ie")){ - // IE, even IE10, is difficult to select the element in, using the range unified - // API seems to work reasonably well. - var sel = rangeapi.getSelection(this.editor.window); - if(sel.rangeCount){ - var range = sel.getRangeAt(0); - a = range.endContainer; - if(a.nodeType === 3){ - // Text node, may be the link contents, so check parent. - // This plugin doesn't really support nested HTML elements - // in the link, it assumes all link content is text. - a = a.parentNode; - } - if(a && (a.nodeName && a.nodeName.toLowerCase() !== this.tag)){ - // Still nothing, one last thing to try on IE, as it might be 'img' - // and thus considered a control. - a = this.editor._sCall("getSelectedElement", [this.tag]); - } - if(!a || (a.nodeName && a.nodeName.toLowerCase() !== this.tag)){ - // Try another lookup, IE's selection is just terrible. - b = this.editor._sCall("getAncestorElement", [this.tag]); - if(b && (b.nodeName && b.nodeName.toLowerCase() == this.tag)){ - // Looks like we found an A tag, use it and make sure just it is - // selected. - a = b; - this.editor._sCall("selectElement", [a]); - }else if (range.startContainer === range.endContainer){ - // STILL nothing. Trying one more thing. Lets look at the first child. - // It might be an anchor tag in a div by itself or the like. If it is, - // we'll use it otherwise we give up. The selection is not easily - // determinable to be on an existing anchor tag. - fc = range.startContainer.firstChild; - if(fc && (fc.nodeName && fc.nodeName.toLowerCase() == this.tag)){ - a = fc; - this.editor._sCall("selectElement", [a]); - } - } - } - } - }else{ - a = this.editor._sCall("getAncestorElement", [this.tag]); - } - this.dropDown.reset(); - this._setButton.set("disabled", true); - this.dropDown.set("value", this._getCurrentValues(a)); - }, - - _onDblClick: function(e){ - // summary: - // Function to define a behavior on double clicks on the element - // type this dialog edits to select it and pop up the editor - // dialog. - // e: Object - // The double-click event. - // tags: - // protected. - if(e && e.target){ - var t = e.target; - var tg = t.tagName ? t.tagName.toLowerCase() : ""; - if(tg === this.tag && domAttr.get(t,"href")){ - var editor = this.editor; - - this.editor._sCall("selectElement", [t]); - editor.onDisplayChanged(); - - // Call onNormalizedDisplayChange() now, rather than on timer. - // On IE, when focus goes to the first <input> in the TooltipDialog, the editor loses it's selection. - // Later if onNormalizedDisplayChange() gets called via the timer it will disable the LinkDialog button - // (actually, all the toolbar buttons), at which point clicking the <input> will close the dialog, - // since (for unknown reasons) focus.js ignores disabled controls. - if(editor._updateTimer){ - editor._updateTimer.remove(); - delete editor._updateTimer; - } - editor.onNormalizedDisplayChanged(); - - var button = this.button; - setTimeout(function(){ - // Focus shift outside the event handler. - // IE doesn't like focus changes in event handles. - button.set("disabled", false); - button.loadAndOpenDropDown().then(function(){ - if(button.dropDown.focus){ - button.dropDown.focus(); - } - }); - }, 10); - } - } - } -}); - -var ImgLinkDialog = declare("dijit._editor.plugins.ImgLinkDialog", [LinkDialog], { - // summary: - // This plugin extends LinkDialog and adds in a plugin for handling image links. - // provides the image link dialog. - // description: - // The command provided by this plugin is: - // - // - insertImage - - // linkDialogTemplate: [protected] String - // Over-ride for template since img dialog doesn't need target that anchor tags may. - linkDialogTemplate: [ - "<table role='presentation'><tr><td>", - "<label for='${id}_urlInput'>${url}</label>", - "</td><td>", - "<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' " + - "required='true' id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>", - "</td></tr><tr><td>", - "<label for='${id}_textInput'>${text}</label>", - "</td><td>", - "<input data-dojo-type='dijit.form.ValidationTextBox' required='false' id='${id}_textInput' " + - "name='textInput' data-dojo-props='intermediateChanges:true'/>", - "</td></tr><tr><td>", - "</td><td>", - "</td></tr><tr><td colspan='2'>", - "<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>", - "<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>", - "</td></tr></table>" - ].join(""), - - // htmlTemplate: [protected] String - // String used for templating the `<img>` HTML to insert at the desired point. - htmlTemplate: "<img src=\"${urlInput}\" _djrealurl=\"${urlInput}\" alt=\"${textInput}\" />", - - // tag: [protected] String - // Tag used for the link type (img). - tag: "img", - - _getCurrentValues: function(img){ - // summary: - // Over-ride for getting the values to set in the dropdown. - // a: - // The anchor/link to process for data for the dropdown. - // tags: - // protected - var url, text; - if(img && img.tagName.toLowerCase() === this.tag){ - url = img.getAttribute('_djrealurl') || img.getAttribute('src'); - text = img.getAttribute('alt'); - this.editor._sCall("selectElement", [img, true]); - }else{ - text = this.editor._sCall("getSelectedText", []); - } - return {urlInput: url || '', textInput: text || ''}; //Object - }, - - _isValid: function(){ - // summary: - // Over-ride for images. You can have alt text of blank, it is valid. - // tags: - // protected - return this._urlInput.isValid(); - }, - - _connectTagEvents: function(){ - // summary: - // Over-ridable function that connects tag specific events. - this.inherited(arguments); - this.editor.onLoadDeferred.then(lang.hitch(this, function(){ - // Use onmousedown instead of onclick. Seems that IE eats the first onclick - // to wrap it in a selector box, then the second one acts as onclick. See #10420 - this.connect(this.editor.editNode, "onmousedown", this._selectTag); - })); - }, - - _selectTag: function(e){ - // summary: - // A simple event handler that lets me select an image if it is clicked on. - // makes it easier to select images in a standard way across browsers. Otherwise - // selecting an image for edit becomes difficult. - // e: Event - // The mousedown event. - // tags: - // private - if(e && e.target){ - var t = e.target; - var tg = t.tagName? t.tagName.toLowerCase() : ""; - if(tg === this.tag){ - this.editor._sCall("selectElement", [t]); - } - } - }, - - _checkValues: function(args){ - // summary: - // Function to check the values in args and 'fix' them up as needed - // (special characters in the url or alt text) - // args: Object - // Content being set. - // tags: - // protected - if(args && args.urlInput){ - args.urlInput = args.urlInput.replace(/"/g, """); - } - if(args && args.textInput){ - args.textInput = args.textInput.replace(/"/g, """); - } - return args; - }, - - _onDblClick: function(e){ - // summary: - // Function to define a behavior on double clicks on the element - // type this dialog edits to select it and pop up the editor - // dialog. - // e: Object - // The double-click event. - // tags: - // protected. - if(e && e.target){ - var t = e.target; - var tg = t.tagName ? t.tagName.toLowerCase() : ""; - if(tg === this.tag && domAttr.get(t,"src")){ - var editor = this.editor; - - this.editor._sCall("selectElement", [t]); - editor.onDisplayChanged(); - - // Call onNormalizedDisplayChange() now, rather than on timer. - // On IE, when focus goes to the first <input> in the TooltipDialog, the editor loses it's selection. - // Later if onNormalizedDisplayChange() gets called via the timer it will disable the LinkDialog button - // (actually, all the toolbar buttons), at which point clicking the <input> will close the dialog, - // since (for unknown reasons) focus.js ignores disabled controls. - if(editor._updateTimer){ - editor._updateTimer.remove(); - delete editor._updateTimer; - } - editor.onNormalizedDisplayChanged(); - - var button = this.button; - setTimeout(function(){ - // Focus shift outside the event handler. - // IE doesn't like focus changes in event handles. - button.set("disabled", false); - button.loadAndOpenDropDown().then(function(){ - if(button.dropDown.focus){ - button.dropDown.focus(); - } - }); - }, 10); - } - } - } -}); - -// Register these plugins -_Plugin.registry["createLink"] = function(){ - return new LinkDialog({command: "createLink"}); -}; -_Plugin.registry["insertImage"] = function(){ - return new ImgLinkDialog({command: "insertImage"}); -}; - - -// Export both LinkDialog and ImgLinkDialog -// TODO for 2.0: either return both classes in a hash, or split this file into two separate files. -// Then the documentation for the module can be applied to the hash, and will show up in the API doc. -LinkDialog.ImgLinkDialog = ImgLinkDialog; -return LinkDialog; -}); diff --git a/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js b/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js deleted file mode 100644 index 72b6f686a..000000000 --- a/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js +++ /dev/null @@ -1,77 +0,0 @@ -define("dijit/_editor/plugins/NewPage", [ - "dojo/_base/declare", // declare - "dojo/i18n", // i18n.getLocalization - "dojo/_base/lang", // lang.hitch - "../_Plugin", - "../../form/Button", - "dojo/i18n!../nls/commands" -], function(declare, i18n, lang, _Plugin, Button){ - -// module: -// dijit/_editor/plugins/NewPage - - -var NewPage = declare("dijit._editor.plugins.NewPage",_Plugin,{ - // summary: - // This plugin provides a simple 'new page' capability. In other - // words, set content to some default user defined string. - - // content: [public] String - // The default content to insert into the editor as the new page. - // The default is the `<br>` tag, a single blank line. - content: "<br>", - - _initButton: function(){ - // summary: - // Over-ride for creation of the Print button. - var strings = i18n.getLocalization("dijit._editor", "commands"), - editor = this.editor; - this.button = new Button({ - label: strings["newPage"], - ownerDocument: editor.ownerDocument, - dir: editor.dir, - lang: editor.lang, - showLabel: false, - iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "NewPage", - tabIndex: "-1", - onClick: lang.hitch(this, "_newPage") - }); - }, - - setEditor: function(/*dijit/Editor*/ editor){ - // summary: - // Tell the plugin which Editor it is associated with. - // editor: Object - // The editor object to attach the newPage capability to. - this.editor = editor; - this._initButton(); - }, - - updateState: function(){ - // summary: - // Over-ride for button state control for disabled to work. - this.button.set("disabled", this.get("disabled")); - }, - - _newPage: function(){ - // summary: - // Function to set the content to blank. - // tags: - // private - this.editor.beginEditing(); - this.editor.set("value", this.content); - this.editor.endEditing(); - this.editor.focus(); - } -}); - -// Register this plugin. -// For back-compat accept "newpage" (all lowercase) too, remove in 2.0 -_Plugin.registry["newPage"] = _Plugin.registry["newpage"] = function(args){ - return new NewPage({ - content: ("content" in args)?args.content:"<br>" - }); -}; - -return NewPage; -}); diff --git a/lib/dijit/_editor/plugins/Print.js.uncompressed.js b/lib/dijit/_editor/plugins/Print.js.uncompressed.js deleted file mode 100644 index 933633d24..000000000 --- a/lib/dijit/_editor/plugins/Print.js.uncompressed.js +++ /dev/null @@ -1,123 +0,0 @@ -define("dijit/_editor/plugins/Print", [ - "dojo/_base/declare", // declare - "dojo/i18n", // i18n.getLocalization - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("chrome") has("opera") - "../../focus", // focus.focus() - "../_Plugin", - "../../form/Button", - "dojo/i18n!../nls/commands" -], function(declare, i18n, lang, has, focus, _Plugin, Button){ - -// module: -// dijit/_editor/plugins/Print - - -var Print = declare("dijit._editor.plugins.Print",_Plugin,{ - // summary: - // This plugin provides Print capability to the editor. When - // clicked, the document in the editor frame will be printed. - - _initButton: function(){ - // summary: - // Over-ride for creation of the Print button. - var strings = i18n.getLocalization("dijit._editor", "commands"), - editor = this.editor; - this.button = new Button({ - label: strings["print"], - ownerDocument: editor.ownerDocument, - dir: editor.dir, - lang: editor.lang, - showLabel: false, - iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "Print", - tabIndex: "-1", - onClick: lang.hitch(this, "_print") - }); - }, - - setEditor: function(/*dijit/Editor*/ editor){ - // summary: - // Tell the plugin which Editor it is associated with. - // editor: Object - // The editor object to attach the print capability to. - this.editor = editor; - this._initButton(); - - // Set up a check that we have a print function - // and disable button if we do not. - this.editor.onLoadDeferred.then( - lang.hitch(this, function(){ - if(!this.editor.iframe.contentWindow["print"]){ - this.button.set("disabled", true); - } - }) - ); - }, - - updateState: function(){ - // summary: - // Over-ride for button state control for disabled to work. - var disabled = this.get("disabled"); - if(!this.editor.iframe.contentWindow["print"]){ - disabled = true; - } - this.button.set("disabled", disabled); - }, - - _print: function(){ - // summary: - // Function to trigger printing of the editor document - // tags: - // private - var edFrame = this.editor.iframe; - if(edFrame.contentWindow["print"]){ - // IE requires the frame to be focused for - // print to work, but since this is okay for all - // no special casing. - if(!has("opera") && !has("chrome")){ - focus.focus(edFrame); - edFrame.contentWindow.print(); - }else{ - // Neither Opera nor Chrome 3 et you print single frames. - // So, open a new 'window', print it, and close it. - // Also, can't use size 0x0, have to use 1x1 - var edDoc = this.editor.document; - var content = this.editor.get("value"); - content = "<html><head><meta http-equiv='Content-Type' " + - "content='text/html; charset='UTF-8'></head><body>" + - content + "</body></html>"; - var win = window.open("javascript: ''", - "", - "status=0,menubar=0,location=0,toolbar=0," + - "width=1,height=1,resizable=0,scrollbars=0"); - win.document.open(); - win.document.write(content); - win.document.close(); - - var styleNodes = edDoc.getElementsByTagName("style"); - if(styleNodes){ - // Clone over any editor view styles, since we can't print the iframe - // directly. - var i; - for(i = 0; i < styleNodes.length; i++){ - var style = styleNodes[i].innerHTML; - var sNode = win.document.createElement("style"); - sNode.appendChild(win.document.createTextNode(style)); - win.document.getElementsByTagName("head")[0].appendChild(sNode); - } - } - win.print(); - win.close(); - } - } - } -}); - -// Register this plugin. -_Plugin.registry["print"] = function(){ - return new Print({command: "print"}); -}; - - -return Print; -}); diff --git a/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js b/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js deleted file mode 100644 index 3cd0a136b..000000000 --- a/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js +++ /dev/null @@ -1,60 +0,0 @@ -define("dijit/_editor/plugins/TabIndent", [ - "dojo/_base/declare", // declare - "dojo/_base/kernel", // kernel.experimental - "../_Plugin", - "../../form/ToggleButton" -], function(declare, kernel, _Plugin, ToggleButton){ - - // module: - // dijit/_editor/plugins/TabIndent - - kernel.experimental("dijit._editor.plugins.TabIndent"); - - - var TabIndent = declare("dijit._editor.plugins.TabIndent", _Plugin, { - // summary: - // This plugin is used to allow the use of the tab and shift-tab keys - // to indent/outdent list items. This overrides the default behavior - // of moving focus from/to the toolbar - - // Override _Plugin.useDefaultCommand... processing is handled by this plugin, not by dijit/Editor. - useDefaultCommand: false, - - // Override _Plugin.buttonClass to use a ToggleButton for this plugin rather than a vanilla Button - buttonClass: ToggleButton, - - command: "tabIndent", - - _initButton: function(){ - // Override _Plugin._initButton() to setup listener on button click - this.inherited(arguments); - - var e = this.editor; - this.connect(this.button, "onChange", function(val){ - e.set("isTabIndent", val); - }); - - // Set initial checked state of button based on Editor.isTabIndent - this.updateState(); - }, - - updateState: function(){ - // Overrides _Plugin.updateState(). - // Ctrl-m in the editor will switch tabIndent mode on/off, so we need to react to that. - var disabled = this.get("disabled"); - this.button.set("disabled", disabled); - if(disabled){ - return; - } - this.button.set('checked', this.editor.isTabIndent, false); - } - }); - - // Register this plugin. - _Plugin.registry["tabIndent"] = function(){ - return new TabIndent({command: "tabIndent"}); - }; - - - return TabIndent; -}); diff --git a/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js b/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js deleted file mode 100644 index b8da7c4a6..000000000 --- a/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js +++ /dev/null @@ -1,115 +0,0 @@ -define("dijit/_editor/plugins/TextColor", [ - "require", - "dojo/colors", // colors.fromRgb - "dojo/_base/declare", // declare - "dojo/_base/lang", - "../_Plugin", - "../../form/DropDownButton" -], function(require, colors, declare, lang, _Plugin, DropDownButton){ - -// module: -// dijit/_editor/plugins/TextColor - - -var TextColor = declare("dijit._editor.plugins.TextColor", _Plugin, { - // summary: - // This plugin provides dropdown color pickers for setting text color and background color - // description: - // The commands provided by this plugin are: - // - // - foreColor - sets the text color - // - hiliteColor - sets the background color - - // Override _Plugin.buttonClass to use DropDownButton (with ColorPalette) to control this plugin - buttonClass: DropDownButton, - - // useDefaultCommand: Boolean - // False as we do not use the default editor command/click behavior. - useDefaultCommand: false, - - _initButton: function(){ - this.inherited(arguments); - - // Setup to lazy load ColorPalette first time the button is clicked - var self = this; - this.button.loadDropDown = function(callback){ - require(["../../ColorPalette"], lang.hitch(this, function(ColorPalette){ - this.dropDown = new ColorPalette({ - dir: self.editor.dir, - ownerDocument: self.editor.ownerDocument, - value: self.value, - onChange: function(color){ - self.editor.execCommand(self.command, color); - } - }); - callback(); - })); - }; - }, - - updateState: function(){ - // summary: - // Overrides _Plugin.updateState(). This updates the ColorPalette - // to show the color of the currently selected text. - // tags: - // protected - - var _e = this.editor; - var _c = this.command; - if(!_e || !_e.isLoaded || !_c.length){ - return; - } - - if(this.button){ - var disabled = this.get("disabled"); - this.button.set("disabled", disabled); - if(disabled){ return; } - - var value; - try{ - value = _e.queryCommandValue(_c)|| ""; - }catch(e){ - //Firefox may throw error above if the editor is just loaded, ignore it - value = ""; - } - } - - if(value == ""){ - value = "#000000"; - } - if(value == "transparent"){ - value = "#ffffff"; - } - - if(typeof value == "string"){ - //if RGB value, convert to hex value - if(value.indexOf("rgb")> -1){ - value = colors.fromRgb(value).toHex(); - } - }else{ //it's an integer(IE returns an MS access #) - value =((value & 0x0000ff)<< 16)|(value & 0x00ff00)|((value & 0xff0000)>>> 16); - value = value.toString(16); - value = "#000000".slice(0, 7 - value.length)+ value; - - } - - this.value = value; - - var dropDown = this.button.dropDown; - if(dropDown && value !== dropDown.get('value')){ - dropDown.set('value', value, false); - } - } -}); - -// Register this plugin. -_Plugin.registry["foreColor"] = function(){ - return new TextColor({command: "foreColor"}); -}; -_Plugin.registry["hiliteColor"] = function(){ - return new TextColor({command: "hiliteColor"}); -}; - - -return TextColor; -}); diff --git a/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js b/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js deleted file mode 100644 index 7b36a21d9..000000000 --- a/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js +++ /dev/null @@ -1,69 +0,0 @@ -define("dijit/_editor/plugins/ToggleDir", [ - "dojo/_base/declare", // declare - "dojo/dom-style", // domStyle.getComputedStyle - "dojo/_base/kernel", // kernel.experimental - "dojo/_base/lang", // lang.hitch - "../_Plugin", - "../../form/ToggleButton" -], function(declare, domStyle, kernel, lang, _Plugin, ToggleButton){ - - // module: - // dijit/_editor/plugins/ToggleDir - - kernel.experimental("dijit._editor.plugins.ToggleDir"); - - var ToggleDir = declare("dijit._editor.plugins.ToggleDir", _Plugin, { - // summary: - // This plugin is used to toggle direction of the edited document, - // independent of what direction the whole page is. - - // Override _Plugin.useDefaultCommand: processing is done in this plugin - // rather than by sending commands to the Editor - useDefaultCommand: false, - - command: "toggleDir", - - // Override _Plugin.buttonClass to use a ToggleButton for this plugin rather than a vanilla Button - buttonClass: ToggleButton, - - _initButton: function(){ - // Override _Plugin._initButton() to setup handler for button click events. - this.inherited(arguments); - this.editor.onLoadDeferred.then(lang.hitch(this, function(){ - var editDoc = this.editor.editorObject.contentWindow.document.documentElement; - //IE direction has to toggle on the body, not document itself. - //If you toggle just the document, things get very strange in the - //view. But, the nice thing is this works for all supported browsers. - editDoc = editDoc.getElementsByTagName("body")[0]; - var isLtr = domStyle.getComputedStyle(editDoc).direction == "ltr"; - this.button.set("checked", !isLtr); - this.connect(this.button, "onChange", "_setRtl"); - })); - }, - - updateState: function(){ - // summary: - // Over-ride for button state control for disabled to work. - this.button.set("disabled", this.get("disabled")); - }, - - _setRtl: function(rtl){ - // summary: - // Handler for button click events, to switch the text direction of the editor - var dir = "ltr"; - if(rtl){ - dir = "rtl"; - } - var editDoc = this.editor.editorObject.contentWindow.document.documentElement; - editDoc = editDoc.getElementsByTagName("body")[0]; - editDoc.dir/*html node*/ = dir; - } - }); - - // Register this plugin. - _Plugin.registry["toggleDir"] = function(){ - return new ToggleDir({command: "toggleDir"}); - }; - - return ToggleDir; -}); diff --git a/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js b/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js deleted file mode 100644 index e70e05c22..000000000 --- a/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js +++ /dev/null @@ -1,577 +0,0 @@ -define("dijit/_editor/plugins/ViewSource", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/dom-construct", // domConstruct.create domConstruct.place - "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.position - "dojo/dom-style", // domStyle.set - "dojo/_base/event", // event.stop - "dojo/i18n", // i18n.getLocalization - "dojo/keys", // keys.F12 - "dojo/_base/lang", // lang.hitch - "dojo/on", // on() - "dojo/sniff", // has("ie") has("webkit") - "dojo/_base/window", // win.body win.global - "dojo/window", // winUtils.getBox - "../../focus", // focus.focus() - "../_Plugin", - "../../form/ToggleButton", - "../..", // dijit._scopeName - "../../registry", // registry.getEnclosingWidget() - "dojo/aspect", // Aspect commands for adice - "dojo/i18n!../nls/commands" -], function(array, declare, domAttr, domConstruct, domGeometry, domStyle, event, i18n, keys, lang, on, has, win, - winUtils, focus, _Plugin, ToggleButton, dijit, registry, aspect){ - -// module: -// dijit/_editor/plugins/ViewSource - - -var ViewSource = declare("dijit._editor.plugins.ViewSource",_Plugin, { - // summary: - // This plugin provides a simple view source capability. When view - // source mode is enabled, it disables all other buttons/plugins on the RTE. - // It also binds to the hotkey: CTRL-SHIFT-F11 for toggling ViewSource mode. - - // stripScripts: [public] Boolean - // Boolean flag used to indicate if script tags should be stripped from the document. - // Defaults to true. - stripScripts: true, - - // stripComments: [public] Boolean - // Boolean flag used to indicate if comment tags should be stripped from the document. - // Defaults to true. - stripComments: true, - - // stripComments: [public] Boolean - // Boolean flag used to indicate if iframe tags should be stripped from the document. - // Defaults to true. - stripIFrames: true, - - // readOnly: [const] Boolean - // Boolean flag used to indicate if the source view should be readonly or not. - // Cannot be changed after initialization of the plugin. - // Defaults to false. - readOnly: false, - - // _fsPlugin: [private] Object - // Reference to a registered fullscreen plugin so that viewSource knows - // how to scale. - _fsPlugin: null, - - toggle: function(){ - // summary: - // Function to allow programmatic toggling of the view. - - // For Webkit, we have to focus a very particular way. - // when swapping views, otherwise focus doesn't shift right - // but can't focus this way all the time, only for VS changes. - // If we did it all the time, buttons like bold, italic, etc - // break. - if(has("webkit")){this._vsFocused = true;} - this.button.set("checked", !this.button.get("checked")); - - }, - - _initButton: function(){ - // summary: - // Over-ride for creation of the resize button. - var strings = i18n.getLocalization("dijit._editor", "commands"), - editor = this.editor; - this.button = new ToggleButton({ - label: strings["viewSource"], - ownerDocument: editor.ownerDocument, - dir: editor.dir, - lang: editor.lang, - showLabel: false, - iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "ViewSource", - tabIndex: "-1", - onChange: lang.hitch(this, "_showSource") - }); - - // IE 7 has a horrible bug with zoom, so we have to create this node - // to cross-check later. Sigh. - if(has("ie") == 7){ - this._ieFixNode = domConstruct.create("div", { - style: { - opacity: "0", - zIndex: "-1000", - position: "absolute", - top: "-1000px" - } - }, editor.ownerDocumentBody); - } - // Make sure readonly mode doesn't make the wrong cursor appear over the button. - this.button.set("readOnly", false); - }, - - - setEditor: function(/*dijit/Editor*/ editor){ - // summary: - // Tell the plugin which Editor it is associated with. - // editor: Object - // The editor object to attach the print capability to. - this.editor = editor; - this._initButton(); - - this.editor.addKeyHandler(keys.F12, true, true, lang.hitch(this, function(e){ - // Move the focus before switching - // It'll focus back. Hiding a focused - // node causes issues. - this.button.focus(); - this.toggle(); - event.stop(e); - - // Call the focus shift outside of the handler. - setTimeout(lang.hitch(this, function(){ - // We over-ride focus, so we just need to call. - this.editor.focus(); - }), 100); - })); - }, - - _showSource: function(source){ - // summary: - // Function to toggle between the source and RTE views. - // source: boolean - // Boolean value indicating if it should be in source mode or not. - // tags: - // private - var ed = this.editor; - var edPlugins = ed._plugins; - var html; - this._sourceShown = source; - var self = this; - try{ - if(!this.sourceArea){ - this._createSourceView(); - } - if(source){ - // Update the QueryCommandEnabled function to disable everything but - // the source view mode. Have to over-ride a function, then kick all - // plugins to check their state. - ed._sourceQueryCommandEnabled = ed.queryCommandEnabled; - ed.queryCommandEnabled = function(cmd){ - return cmd.toLowerCase() === "viewsource"; - }; - this.editor.onDisplayChanged(); - html = ed.get("value"); - html = this._filter(html); - ed.set("value", html); - array.forEach(edPlugins, function(p){ - // Turn off any plugins not controlled by queryCommandenabled. - if(p && !(p instanceof ViewSource) && p.isInstanceOf(_Plugin)){ - p.set("disabled", true) - } - }); - - // We actually do need to trap this plugin and adjust how we - // display the textarea. - if(this._fsPlugin){ - this._fsPlugin._getAltViewNode = function(){ - return self.sourceArea; - }; - } - - this.sourceArea.value = html; - - // Since neither iframe nor textarea have margin, border, or padding, - // just set sizes equal - this.sourceArea.style.height = ed.iframe.style.height; - this.sourceArea.style.width = ed.iframe.style.width; - domStyle.set(ed.iframe, "display", "none"); - domStyle.set(this.sourceArea, { - display: "block" - }); - - var resizer = function(){ - // function to handle resize events. - // Will check current VP and only resize if - // different. - var vp = winUtils.getBox(ed.ownerDocument); - - if("_prevW" in this && "_prevH" in this){ - // No actual size change, ignore. - if(vp.w === this._prevW && vp.h === this._prevH){ - return; - }else{ - this._prevW = vp.w; - this._prevH = vp.h; - } - }else{ - this._prevW = vp.w; - this._prevH = vp.h; - } - if(this._resizer){ - clearTimeout(this._resizer); - delete this._resizer; - } - // Timeout it to help avoid spamming resize on IE. - // Works for all browsers. - this._resizer = setTimeout(lang.hitch(this, function(){ - delete this._resizer; - this._resize(); - }), 10); - }; - this._resizeHandle = on(window, "resize", lang.hitch(this, resizer)); - - //Call this on a delay once to deal with IE glitchiness on initial size. - setTimeout(lang.hitch(this, this._resize), 100); - - //Trigger a check for command enablement/disablement. - this.editor.onNormalizedDisplayChanged(); - - this.editor.__oldGetValue = this.editor.getValue; - this.editor.getValue = lang.hitch(this, function(){ - var txt = this.sourceArea.value; - txt = this._filter(txt); - return txt; - }); - - this._setListener = aspect.after(this.editor, "setValue", lang.hitch(this, function(htmlTxt){ - htmlTxt = htmlTxt || ""; - htmlTxt = this._filter(htmlTxt); - this.sourceArea.value = htmlTxt; - }), true); - }else{ - // First check that we were in source view before doing anything. - // corner case for being called with a value of false and we hadn't - // actually been in source display mode. - if(!ed._sourceQueryCommandEnabled){ - return; - } - - // Remove the set listener. - this._setListener.remove(); - delete this._setListener; - - this._resizeHandle.remove(); - delete this._resizeHandle; - - if(this.editor.__oldGetValue){ - this.editor.getValue = this.editor.__oldGetValue; - delete this.editor.__oldGetValue; - } - - // Restore all the plugin buttons state. - ed.queryCommandEnabled = ed._sourceQueryCommandEnabled; - if(!this._readOnly){ - html = this.sourceArea.value; - html = this._filter(html); - ed.beginEditing(); - ed.set("value", html); - ed.endEditing(); - } - - array.forEach(edPlugins, function(p){ - // Turn back on any plugins we turned off. - if(p && p.isInstanceOf(_Plugin)){ - p.set("disabled", false); - } - }); - - domStyle.set(this.sourceArea, "display", "none"); - domStyle.set(ed.iframe, "display", "block"); - delete ed._sourceQueryCommandEnabled; - - //Trigger a check for command enablement/disablement. - this.editor.onDisplayChanged(); - } - // Call a delayed resize to wait for some things to display in header/footer. - setTimeout(lang.hitch(this, function(){ - // Make resize calls. - var parent = ed.domNode.parentNode; - if(parent){ - var container = registry.getEnclosingWidget(parent); - if(container && container.resize){ - container.resize(); - } - } - ed.resize(); - }), 300); - }catch(e){ - console.log(e); - } - }, - - updateState: function(){ - // summary: - // Over-ride for button state control for disabled to work. - this.button.set("disabled", this.get("disabled")); - }, - - _resize: function(){ - // summary: - // Internal function to resize the source view - // tags: - // private - var ed = this.editor; - var tbH = ed.getHeaderHeight(); - var fH = ed.getFooterHeight(); - var eb = domGeometry.position(ed.domNode); - - // Styles are now applied to the internal source container, so we have - // to subtract them off. - var containerPadding = domGeometry.getPadBorderExtents(ed.iframe.parentNode); - var containerMargin = domGeometry.getMarginExtents(ed.iframe.parentNode); - - var extents = domGeometry.getPadBorderExtents(ed.domNode); - var edb = { - w: eb.w - extents.w, - h: eb.h - (tbH + extents.h + fH) - }; - - // Fullscreen gets odd, so we need to check for the FS plugin and - // adapt. - if(this._fsPlugin && this._fsPlugin.isFullscreen){ - //Okay, probably in FS, adjust. - var vp = winUtils.getBox(ed.ownerDocument); - edb.w = (vp.w - extents.w); - edb.h = (vp.h - (tbH + extents.h + fH)); - } - - if(has("ie")){ - // IE is always off by 2px, so we have to adjust here - // Note that IE ZOOM is broken here. I can't get - //it to scale right. - edb.h -= 2; - } - - // IE has a horrible zoom bug. So, we have to try and account for - // it and fix up the scaling. - if(this._ieFixNode){ - var _ie7zoom = -this._ieFixNode.offsetTop / 1000; - edb.w = Math.floor((edb.w + 0.9) / _ie7zoom); - edb.h = Math.floor((edb.h + 0.9) / _ie7zoom); - } - - domGeometry.setMarginBox(this.sourceArea, { - w: edb.w - (containerPadding.w + containerMargin.w), - h: edb.h - (containerPadding.h + containerMargin.h) - }); - - // Scale the parent container too in this case. - domGeometry.setMarginBox(ed.iframe.parentNode, { - h: edb.h - }); - }, - - _createSourceView: function(){ - // summary: - // Internal function for creating the source view area. - // tags: - // private - var ed = this.editor; - var edPlugins = ed._plugins; - this.sourceArea = domConstruct.create("textarea"); - if(this.readOnly){ - domAttr.set(this.sourceArea, "readOnly", true); - this._readOnly = true; - } - domStyle.set(this.sourceArea, { - padding: "0px", - margin: "0px", - borderWidth: "0px", - borderStyle: "none" - }); - domConstruct.place(this.sourceArea, ed.iframe, "before"); - - if(has("ie") && ed.iframe.parentNode.lastChild !== ed.iframe){ - // There's some weirdo div in IE used for focus control - // But is messed up scaling the textarea if we don't config - // it some so it doesn't have a varying height. - domStyle.set(ed.iframe.parentNode.lastChild,{ - width: "0px", - height: "0px", - padding: "0px", - margin: "0px", - borderWidth: "0px", - borderStyle: "none" - }); - } - - // We also need to take over editor focus a bit here, so that focus calls to - // focus the editor will focus to the right node when VS is active. - ed._viewsource_oldFocus = ed.focus; - var self = this; - ed.focus = function(){ - if(self._sourceShown){ - self.setSourceAreaCaret(); - }else{ - try{ - if(this._vsFocused){ - delete this._vsFocused; - // Must focus edit node in this case (webkit only) or - // focus doesn't shift right, but in normal - // cases we focus with the regular function. - focus.focus(ed.editNode); - }else{ - ed._viewsource_oldFocus(); - } - }catch(e){ - console.log(e); - } - } - }; - - var i, p; - for(i = 0; i < edPlugins.length; i++){ - // We actually do need to trap this plugin and adjust how we - // display the textarea. - p = edPlugins[i]; - if(p && (p.declaredClass === "dijit._editor.plugins.FullScreen" || - p.declaredClass === (dijit._scopeName + - "._editor.plugins.FullScreen"))){ - this._fsPlugin = p; - break; - } - } - if(this._fsPlugin){ - // Found, we need to over-ride the alt-view node function - // on FullScreen with our own, chain up to parent call when appropriate. - this._fsPlugin._viewsource_getAltViewNode = this._fsPlugin._getAltViewNode; - this._fsPlugin._getAltViewNode = function(){ - return self._sourceShown?self.sourceArea:this._viewsource_getAltViewNode(); - }; - } - - // Listen to the source area for key events as well, as we need to be able to hotkey toggle - // it from there too. - this.connect(this.sourceArea, "onkeydown", lang.hitch(this, function(e){ - if(this._sourceShown && e.keyCode == keys.F12 && e.ctrlKey && e.shiftKey){ - this.button.focus(); - this.button.set("checked", false); - setTimeout(lang.hitch(this, function(){ed.focus();}), 100); - event.stop(e); - } - })); - }, - - _stripScripts: function(html){ - // summary: - // Strips out script tags from the HTML used in editor. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - // Look for closed and unclosed (malformed) script attacks. - html = html.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig, ""); - html = html.replace(/<\s*script\b([^<>]|\s)*>?/ig, ""); - html = html.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig, ""); - } - return html; - }, - - _stripComments: function(html){ - // summary: - // Strips out comments from the HTML used in editor. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - html = html.replace(/<!--(.|\s){1,}?-->/g, ""); - } - return html; - }, - - _stripIFrames: function(html){ - // summary: - // Strips out iframe tags from the content, to avoid iframe script - // style injection attacks. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - html = html.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig, ""); - } - return html; - }, - - _filter: function(html){ - // summary: - // Internal function to perform some filtering on the HTML. - // html: String - // The HTML to filter - // tags: - // private - if(html){ - if(this.stripScripts){ - html = this._stripScripts(html); - } - if(this.stripComments){ - html = this._stripComments(html); - } - if(this.stripIFrames){ - html = this._stripIFrames(html); - } - } - return html; - }, - - setSourceAreaCaret: function(){ - // summary: - // Internal function to set the caret in the sourceArea - // to 0x0 - var global = win.global; - var elem = this.sourceArea; - focus.focus(elem); - if(this._sourceShown && !this.readOnly){ - if(has("ie")){ - if(this.sourceArea.createTextRange){ - var range = elem.createTextRange(); - range.collapse(true); - range.moveStart("character", -99999); // move to 0 - range.moveStart("character", 0); // delta from 0 is the correct position - range.moveEnd("character", 0); - range.select(); - } - }else if(global.getSelection){ - if(elem.setSelectionRange){ - elem.setSelectionRange(0,0); - } - } - } - }, - - destroy: function(){ - // summary: - // Over-ride to remove the node used to correct for IE's - // zoom bug. - if(this._ieFixNode){ - domConstruct.destroy(this._ieFixNode); - } - if(this._resizer){ - clearTimeout(this._resizer); - delete this._resizer; - } - if(this._resizeHandle){ - this._resizeHandle.remove(); - delete this._resizeHandle; - } - if(this._setListener){ - this._setListener.remove(); - delete this._setListener; - } - this.inherited(arguments); - } -}); - -// Register this plugin. -// For back-compat accept "viewsource" (all lowercase) too, remove in 2.0 -_Plugin.registry["viewSource"] = _Plugin.registry["viewsource"] = function(args){ - return new ViewSource({ - readOnly: ("readOnly" in args)?args.readOnly:false, - stripComments: ("stripComments" in args)?args.stripComments:true, - stripScripts: ("stripScripts" in args)?args.stripScripts:true, - stripIFrames: ("stripIFrames" in args)?args.stripIFrames:true - }); -}; - - - - -return ViewSource; -}); diff --git a/lib/dijit/_editor/range.js.uncompressed.js b/lib/dijit/_editor/range.js.uncompressed.js deleted file mode 100644 index b1f55e1ce..000000000 --- a/lib/dijit/_editor/range.js.uncompressed.js +++ /dev/null @@ -1,559 +0,0 @@ -define("dijit/_editor/range", [ - "dojo/_base/array", // array.every - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.isArray - "dojo/_base/window", // win.doc TODO: remove in 2.0 - "../main" // for exporting symbols to dijit, TODO: remove in 2.0 -], function(array, declare, lang, win, dijit){ - -// module: -// dijit/_editor/range -// summary: -// W3C range API - - -dijit.range={}; - -dijit.range.getIndex = function(/*DomNode*/node, /*DomNode*/parent){ -// dojo.profile.start("dijit.range.getIndex"); - var ret = [], retR = []; - var onode = node; - - var pnode, n; - while(node != parent){ - var i = 0; - pnode = node.parentNode; - while((n = pnode.childNodes[i++])){ - if(n === node){ - --i; - break; - } - } - //if(i>=pnode.childNodes.length){ - //dojo.debug("Error finding index of a node in dijit/range.getIndex()"); - //} - ret.unshift(i); - retR.unshift(i - pnode.childNodes.length); - node = pnode; - } - - //normalized() can not be called so often to prevent - //invalidating selection/range, so we have to detect - //here that any text nodes in a row - if(ret.length > 0 && onode.nodeType == 3){ - n = onode.previousSibling; - while(n && n.nodeType == 3){ - ret[ret.length - 1]--; - n = n.previousSibling; - } - n = onode.nextSibling; - while(n && n.nodeType == 3){ - retR[retR.length - 1]++; - n = n.nextSibling; - } - } -// dojo.profile.end("dijit/range.getIndex()"); - return {o: ret, r:retR}; -}; - -dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){ - if(!lang.isArray(index) || index.length == 0){ - return parent; - } - var node = parent; -// if(!node)debugger - array.every(index, function(i){ - if(i >= 0 && i < node.childNodes.length){ - node = node.childNodes[i]; - }else{ - node = null; - //console.debug('Error: can not find node with index',index,'under parent node',parent ); - return false; //terminate array.every - } - return true; //carry on the every loop - }); - - return node; -}; - -dijit.range.getCommonAncestor = function(n1, n2, root){ - root = root || n1.ownerDocument.body; - var getAncestors = function(n){ - var as = []; - while(n){ - as.unshift(n); - if(n !== root){ - n = n.parentNode; - }else{ - break; - } - } - return as; - }; - var n1as = getAncestors(n1); - var n2as = getAncestors(n2); - - var m = Math.min(n1as.length, n2as.length); - var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default) - for(var i = 1; i < m; i++){ - if(n1as[i] === n2as[i]){ - com = n1as[i] - }else{ - break; - } - } - return com; -}; - -dijit.range.getAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){ - root = root || node.ownerDocument.body; - while(node && node !== root){ - var name = node.nodeName.toUpperCase(); - if(regex.test(name)){ - return node; - } - - node = node.parentNode; - } - return null; -}; - -dijit.range.BlockTagNames = /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/; -dijit.range.getBlockAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){ - root = root || node.ownerDocument.body; - regex = regex || dijit.range.BlockTagNames; - var block = null, blockContainer; - while(node && node !== root){ - var name = node.nodeName.toUpperCase(); - if(!block && regex.test(name)){ - block = node; - } - if(!blockContainer && (/^(?:BODY|TD|TH|CAPTION)$/).test(name)){ - blockContainer = node; - } - - node = node.parentNode; - } - return {blockNode:block, blockContainer:blockContainer || node.ownerDocument.body}; -}; - -dijit.range.atBeginningOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){ - var atBeginning = false; - var offsetAtBeginning = (offset == 0); - if(!offsetAtBeginning && node.nodeType == 3){ //if this is a text node, check whether the left part is all space - if(/^[\s\xA0]+$/.test(node.nodeValue.substr(0, offset))){ - offsetAtBeginning = true; - } - } - if(offsetAtBeginning){ - var cnode = node; - atBeginning = true; - while(cnode && cnode !== container){ - if(cnode.previousSibling){ - atBeginning = false; - break; - } - cnode = cnode.parentNode; - } - } - return atBeginning; -}; - -dijit.range.atEndOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){ - var atEnd = false; - var offsetAtEnd = (offset == (node.length || node.childNodes.length)); - if(!offsetAtEnd && node.nodeType == 3){ //if this is a text node, check whether the right part is all space - if(/^[\s\xA0]+$/.test(node.nodeValue.substr(offset))){ - offsetAtEnd = true; - } - } - if(offsetAtEnd){ - var cnode = node; - atEnd = true; - while(cnode && cnode !== container){ - if(cnode.nextSibling){ - atEnd = false; - break; - } - cnode = cnode.parentNode; - } - } - return atEnd; -}; - -dijit.range.adjacentNoneTextNode = function(startnode, next){ - var node = startnode; - var len = (0 - startnode.length) || 0; - var prop = next ? 'nextSibling' : 'previousSibling'; - while(node){ - if(node.nodeType != 3){ - break; - } - len += node.length; - node = node[prop]; - } - return [node,len]; -}; - -dijit.range.create = function(/*Window?*/ win){ // TODO: for 2.0, replace optional window param w/mandatory window or document param - win = win || window; - if(win.getSelection){ - return win.document.createRange(); - }else{//IE - return new dijit.range.W3CRange(); - } -}; - -dijit.range.getSelection = function(/*Window*/ window, /*Boolean?*/ ignoreUpdate){ - if(window.getSelection){ - return window.getSelection(); - }else{//IE - var s = new dijit.range.ie.selection(window); - if(!ignoreUpdate){ - s._getCurrentSelection(); - } - return s; - } -}; - -// TODO: convert to has() test? But remember IE9 issues with quirks vs. standards in main frame vs. iframe. -if(!window.getSelection){ - dijit.range.ie = { - cachedSelection: {}, - selection: function(window){ - this._ranges = []; - this.addRange = function(r, /*boolean*/ internal){ - this._ranges.push(r); - if(!internal){ - r._select(); - } - this.rangeCount = this._ranges.length; - }; - this.removeAllRanges = function(){ - //don't detach, the range may be used later -// for(var i=0;i<this._ranges.length;i++){ -// this._ranges[i].detach(); -// } - this._ranges = []; - this.rangeCount = 0; - }; - var _initCurrentRange = function(){ - var r = window.document.selection.createRange(); - var type = window.document.selection.type.toUpperCase(); - if(type == "CONTROL"){ - //TODO: multiple range selection(?) - return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r)); - }else{ - return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r)); - } - }; - this.getRangeAt = function(i){ - return this._ranges[i]; - }; - this._getCurrentSelection = function(){ - this.removeAllRanges(); - var r = _initCurrentRange(); - if(r){ - this.addRange(r, true); - this.isCollapsed = r.collapsed; - }else{ - this.isCollapsed = true; - } - }; - }, - decomposeControlRange: function(range){ - var firstnode = range.item(0), lastnode = range.item(range.length - 1); - var startContainer = firstnode.parentNode, endContainer = lastnode.parentNode; - var startOffset = dijit.range.getIndex(firstnode, startContainer).o[0]; - var endOffset = dijit.range.getIndex(lastnode, endContainer).o[0] + 1; - return [startContainer, startOffset,endContainer, endOffset]; - }, - getEndPoint: function(range, end){ - var atmrange = range.duplicate(); - atmrange.collapse(!end); - var cmpstr = 'EndTo' + (end ? 'End' : 'Start'); - var parentNode = atmrange.parentElement(); - - var startnode, startOffset, lastNode; - if(parentNode.childNodes.length > 0){ - array.every(parentNode.childNodes, function(node, i){ - var calOffset; - if(node.nodeType != 3){ - atmrange.moveToElementText(node); - - if(atmrange.compareEndPoints(cmpstr, range) > 0){ - //startnode = node.previousSibling; - if(lastNode && lastNode.nodeType == 3){ - //where shall we put the start? in the text node or after? - startnode = lastNode; - calOffset = true; - }else{ - startnode = parentNode; - startOffset = i; - return false; - } - }else{ - if(i == parentNode.childNodes.length - 1){ - startnode = parentNode; - startOffset = parentNode.childNodes.length; - return false; - } - } - }else{ - if(i == parentNode.childNodes.length - 1){//at the end of this node - startnode = node; - calOffset = true; - } - } - // try{ - if(calOffset && startnode){ - var prevnode = dijit.range.adjacentNoneTextNode(startnode)[0]; - if(prevnode){ - startnode = prevnode.nextSibling; - }else{ - startnode = parentNode.firstChild; //firstChild must be a text node - } - var prevnodeobj = dijit.range.adjacentNoneTextNode(startnode); - prevnode = prevnodeobj[0]; - var lenoffset = prevnodeobj[1]; - if(prevnode){ - atmrange.moveToElementText(prevnode); - atmrange.collapse(false); - }else{ - atmrange.moveToElementText(parentNode); - } - atmrange.setEndPoint(cmpstr, range); - startOffset = atmrange.text.length - lenoffset; - - return false; - } - // }catch(e){ debugger } - lastNode = node; - return true; - }); - }else{ - startnode = parentNode; - startOffset = 0; - } - - //if at the end of startnode and we are dealing with start container, then - //move the startnode to nextSibling if it is a text node - //TODO: do this for end container? - if(!end && startnode.nodeType == 1 && startOffset == startnode.childNodes.length){ - var nextnode = startnode.nextSibling; - if(nextnode && nextnode.nodeType == 3){ - startnode = nextnode; - startOffset = 0; - } - } - return [startnode, startOffset]; - }, - setEndPoint: function(range, container, offset){ - //text node - var atmrange = range.duplicate(), node, len; - if(container.nodeType != 3){ //normal node - if(offset > 0){ - node = container.childNodes[offset - 1]; - if(node){ - if(node.nodeType == 3){ - container = node; - offset = node.length; - //pass through - }else{ - if(node.nextSibling && node.nextSibling.nodeType == 3){ - container = node.nextSibling; - offset = 0; - //pass through - }else{ - atmrange.moveToElementText(node.nextSibling ? node : container); - var parent = node.parentNode; - var tempNode = parent.insertBefore(node.ownerDocument.createTextNode(' '), node.nextSibling); - atmrange.collapse(false); - parent.removeChild(tempNode); - } - } - } - }else{ - atmrange.moveToElementText(container); - atmrange.collapse(true); - } - } - if(container.nodeType == 3){ - var prevnodeobj = dijit.range.adjacentNoneTextNode(container); - var prevnode = prevnodeobj[0]; - len = prevnodeobj[1]; - if(prevnode){ - atmrange.moveToElementText(prevnode); - atmrange.collapse(false); - //if contentEditable is not inherit, the above collapse won't make the end point - //in the correctly position: it always has a -1 offset, so compensate it - if(prevnode.contentEditable != 'inherit'){ - len++; - } - }else{ - atmrange.moveToElementText(container.parentNode); - atmrange.collapse(true); - - // Correct internal cursor position - // http://bugs.dojotoolkit.org/ticket/15578 - atmrange.move('character', 1); - atmrange.move('character', -1); - } - - offset += len; - if(offset > 0){ - if(atmrange.move('character', offset) != offset){ - console.error('Error when moving!'); - } - } - } - - return atmrange; - }, - decomposeTextRange: function(range){ - var tmpary = dijit.range.ie.getEndPoint(range); - var startContainer = tmpary[0], startOffset = tmpary[1]; - var endContainer = tmpary[0], endOffset = tmpary[1]; - - if(range.htmlText.length){ - if(range.htmlText == range.text){ //in the same text node - endOffset = startOffset + range.text.length; - }else{ - tmpary = dijit.range.ie.getEndPoint(range, true); - endContainer = tmpary[0],endOffset = tmpary[1]; -// if(startContainer.tagName == "BODY"){ -// startContainer = startContainer.firstChild; -// } - } - } - return [startContainer, startOffset, endContainer, endOffset]; - }, - setRange: function(range, startContainer, startOffset, endContainer, endOffset, collapsed){ - var start = dijit.range.ie.setEndPoint(range, startContainer, startOffset); - - range.setEndPoint('StartToStart', start); - if(!collapsed){ - var end = dijit.range.ie.setEndPoint(range, endContainer, endOffset); - } - range.setEndPoint('EndToEnd', end || start); - - return range; - } - }; - -declare("dijit.range.W3CRange",null, { - constructor: function(){ - if(arguments.length>0){ - this.setStart(arguments[0][0],arguments[0][1]); - this.setEnd(arguments[0][2],arguments[0][3]); - }else{ - this.commonAncestorContainer = null; - this.startContainer = null; - this.startOffset = 0; - this.endContainer = null; - this.endOffset = 0; - this.collapsed = true; - } - }, - _updateInternal: function(){ - if(this.startContainer !== this.endContainer){ - this.commonAncestorContainer = dijit.range.getCommonAncestor(this.startContainer, this.endContainer); - }else{ - this.commonAncestorContainer = this.startContainer; - } - this.collapsed = (this.startContainer === this.endContainer) && (this.startOffset == this.endOffset); - }, - setStart: function(node, offset){ - offset=parseInt(offset); - if(this.startContainer === node && this.startOffset == offset){ - return; - } - delete this._cachedBookmark; - - this.startContainer = node; - this.startOffset = offset; - if(!this.endContainer){ - this.setEnd(node, offset); - }else{ - this._updateInternal(); - } - }, - setEnd: function(node, offset){ - offset=parseInt(offset); - if(this.endContainer === node && this.endOffset == offset){ - return; - } - delete this._cachedBookmark; - - this.endContainer = node; - this.endOffset = offset; - if(!this.startContainer){ - this.setStart(node, offset); - }else{ - this._updateInternal(); - } - }, - setStartAfter: function(node, offset){ - this._setPoint('setStart', node, offset, 1); - }, - setStartBefore: function(node, offset){ - this._setPoint('setStart', node, offset, 0); - }, - setEndAfter: function(node, offset){ - this._setPoint('setEnd', node, offset, 1); - }, - setEndBefore: function(node, offset){ - this._setPoint('setEnd', node, offset, 0); - }, - _setPoint: function(what, node, offset, ext){ - var index = dijit.range.getIndex(node, node.parentNode).o; - this[what](node.parentNode, index.pop()+ext); - }, - _getIERange: function(){ - var r = (this._body || this.endContainer.ownerDocument.body).createTextRange(); - dijit.range.ie.setRange(r, this.startContainer, this.startOffset, this.endContainer, this.endOffset, this.collapsed); - return r; - }, - getBookmark: function(){ - this._getIERange(); - return this._cachedBookmark; - }, - _select: function(){ - var r = this._getIERange(); - r.select(); - }, - deleteContents: function(){ - var s = this.startContainer, r = this._getIERange(); - if(s.nodeType === 3 && !this.startOffset){ - //if the range starts at the beginning of a - //text node, move it to before the textnode - //to make sure the range is still valid - //after deleteContents() finishes - this.setStartBefore(s); - } - r.pasteHTML(''); - this.endContainer = this.startContainer; - this.endOffset = this.startOffset; - this.collapsed = true; - }, - cloneRange: function(){ - var r = new dijit.range.W3CRange([this.startContainer,this.startOffset, - this.endContainer,this.endOffset]); - r._body = this._body; - return r; - }, - detach: function(){ - this._body = null; - this.commonAncestorContainer = null; - this.startContainer = null; - this.startOffset = 0; - this.endContainer = null; - this.endOffset = 0; - this.collapsed = true; -} -}); -} //if(!window.getSelection) - - -return dijit.range; -}); diff --git a/lib/dijit/_editor/selection.js.uncompressed.js b/lib/dijit/_editor/selection.js.uncompressed.js deleted file mode 100644 index 272ac7787..000000000 --- a/lib/dijit/_editor/selection.js.uncompressed.js +++ /dev/null @@ -1,383 +0,0 @@ -define("dijit/_editor/selection", [ - "dojo/dom", // dom.byId - "dojo/_base/lang", - "dojo/sniff", // has("ie") has("opera") - "dojo/_base/window", // win.body win.doc win.doc.createElement win.doc.selection win.doc.selection.createRange win.doc.selection.type.toLowerCase win.global win.global.getSelection - "../main" // for exporting symbols to dijit._editor.selection (TODO: remove in 2.0) -], function(dom, lang, has, win, dijit){ - -// module: -// dijit/_editor/selection -// summary: -// Text selection API - -// FIXME: -// all of these methods branch internally for IE. This is probably -// sub-optimal in terms of runtime performance. We should investigate the -// size difference for differentiating at definition time. - -var selection = { - getType: function(){ - // summary: - // Get the selection type (like win.doc.select.type in IE). - if(win.doc.getSelection){ - // W3C path - var stype = "text"; - - // Check if the actual selection is a CONTROL (IMG, TABLE, HR, etc...). - var oSel; - try{ - oSel = win.global.getSelection(); - }catch(e){ /*squelch*/ } - - if(oSel && oSel.rangeCount == 1){ - var oRange = oSel.getRangeAt(0); - if( (oRange.startContainer == oRange.endContainer) && - ((oRange.endOffset - oRange.startOffset) == 1) && - (oRange.startContainer.nodeType != 3 /* text node*/) - ){ - stype = "control"; - } - } - return stype; //String - }else{ - // IE6-8 - return win.doc.selection.type.toLowerCase(); - } - }, - - getSelectedText: function(){ - // summary: - // Return the text (no html tags) included in the current selection or null if no text is selected - if(win.doc.getSelection){ - // W3C path - var selection = win.global.getSelection(); - return selection ? selection.toString() : ""; //String - }else{ - // IE6-8 - if(dijit._editor.selection.getType() == 'control'){ - return null; - } - return win.doc.selection.createRange().text; - } - }, - - getSelectedHtml: function(){ - // summary: - // Return the html text of the current selection or null if unavailable - if(win.doc.getSelection){ - // W3C path - var selection = win.global.getSelection(); - if(selection && selection.rangeCount){ - var i; - var html = ""; - for(i = 0; i < selection.rangeCount; i++){ - //Handle selections spanning ranges, such as Opera - var frag = selection.getRangeAt(i).cloneContents(); - var div = win.doc.createElement("div"); - div.appendChild(frag); - html += div.innerHTML; - } - return html; //String - } - return null; - }else{ - // IE6-8 - if(dijit._editor.selection.getType() == 'control'){ - return null; - } - return win.doc.selection.createRange().htmlText; - } - }, - - getSelectedElement: function(){ - // summary: - // Retrieves the selected element (if any), just in the case that - // a single element (object like and image or a table) is - // selected. - if(dijit._editor.selection.getType() == "control"){ - if(win.doc.getSelection){ - // W3C path - var selection = win.global.getSelection(); - return selection.anchorNode.childNodes[ selection.anchorOffset ]; - }else{ - // IE6-8 - var range = win.doc.selection.createRange(); - if(range && range.item){ - return win.doc.selection.createRange().item(0); - } - } - } - return null; - }, - - getParentElement: function(){ - // summary: - // Get the parent element of the current selection - if(dijit._editor.selection.getType() == "control"){ - var p = this.getSelectedElement(); - if(p){ return p.parentNode; } - }else{ - if(win.doc.getSelection){ - var selection = win.global.getSelection(); - if(selection){ - var node = selection.anchorNode; - while(node && (node.nodeType != 1)){ // not an element - node = node.parentNode; - } - return node; - } - }else{ - var r = win.doc.selection.createRange(); - r.collapse(true); - return r.parentElement(); - } - } - return null; - }, - - hasAncestorElement: function(/*String*/ tagName /* ... */){ - // summary: - // Check whether current selection has a parent element which is - // of type tagName (or one of the other specified tagName) - // tagName: String - // The tag name to determine if it has an ancestor of. - return this.getAncestorElement.apply(this, arguments) != null; //Boolean - }, - - getAncestorElement: function(/*String*/ tagName /* ... */){ - // summary: - // Return the parent element of the current selection which is of - // type tagName (or one of the other specified tagName) - // tagName: String - // The tag name to determine if it has an ancestor of. - var node = this.getSelectedElement() || this.getParentElement(); - return this.getParentOfType(node, arguments); //DOMNode - }, - - isTag: function(/*DomNode*/ node, /*String[]*/ tags){ - // summary: - // Function to determine if a node is one of an array of tags. - // node: - // The node to inspect. - // tags: - // An array of tag name strings to check to see if the node matches. - if(node && node.tagName){ - var _nlc = node.tagName.toLowerCase(); - for(var i=0; i<tags.length; i++){ - var _tlc = String(tags[i]).toLowerCase(); - if(_nlc == _tlc){ - return _tlc; // String - } - } - } - return ""; - }, - - getParentOfType: function(/*DomNode*/ node, /*String[]*/ tags){ - // summary: - // Function to locate a parent node that matches one of a set of tags - // node: - // The node to inspect. - // tags: - // An array of tag name strings to check to see if the node matches. - while(node){ - if(this.isTag(node, tags).length){ - return node; // DOMNode - } - node = node.parentNode; - } - return null; - }, - - collapse: function(/*Boolean*/ beginning){ - // summary: - // Function to collapse (clear), the current selection - // beginning: Boolean - // Indicates whether to collapse the cursor to the beginning of the selection or end. - if(win.doc.getSelection){ - // W3C path - var selection = win.global.getSelection(); - if(selection.removeAllRanges){ // Mozilla - if(beginning){ - selection.collapseToStart(); - }else{ - selection.collapseToEnd(); - } - }else{ // Safari - // pulled from WebCore/ecma/kjs_window.cpp, line 2536 - selection.collapse(beginning); - } - }else{ - // IE6-8 - var range = win.doc.selection.createRange(); - range.collapse(beginning); - range.select(); - } - }, - - remove: function(){ - // summary: - // Function to delete the currently selected content from the document. - var sel = win.doc.selection; - if(win.doc.getSelection){ - // W3C path - sel = win.global.getSelection(); - sel.deleteFromDocument(); - return sel; //Selection - }else{ - // IE6-8 - if(sel.type.toLowerCase() != "none"){ - sel.clear(); - } - return sel; //Selection - } - }, - - selectElementChildren: function(/*DomNode*/ element, /*Boolean?*/ nochangefocus){ - // summary: - // clear previous selection and select the content of the node - // (excluding the node itself) - // element: DOMNode - // The element you wish to select the children content of. - // nochangefocus: Boolean - // Indicates if the focus should change or not. - var doc = win.doc; - var range; - element = dom.byId(element); - if(win.doc.getSelection){ - // W3C - var selection = win.global.getSelection(); - if(has("opera")){ - //Opera's selectAllChildren doesn't seem to work right - //against <body> nodes and possibly others ... so - //we use the W3C range API - if(selection.rangeCount){ - range = selection.getRangeAt(0); - }else{ - range = doc.createRange(); - } - range.setStart(element, 0); - range.setEnd(element,(element.nodeType == 3) ? element.length : element.childNodes.length); - selection.addRange(range); - }else{ - selection.selectAllChildren(element); - } - }else{ - // IE6-8 - range = element.ownerDocument.body.createTextRange(); - range.moveToElementText(element); - if(!nochangefocus){ - try{ - range.select(); // IE throws an exception here if the widget is hidden. See #5439 - }catch(e){ /* squelch */} - } - } - }, - - selectElement: function(/*DomNode*/ element, /*Boolean?*/ nochangefocus){ - // summary: - // clear previous selection and select element (including all its children) - // element: DOMNode - // The element to select. - // nochangefocus: Boolean - // Boolean indicating if the focus should be changed. IE only. - var range; - element = dom.byId(element); // TODO: remove for 2.0 or sooner, spec listed above doesn't allow for string - var doc = element.ownerDocument; - var global = win.global; // TODO: use winUtils.get(doc)? - if(doc.getSelection){ - // W3C path - var selection = global.getSelection(); - range = doc.createRange(); - if(selection.removeAllRanges){ // Mozilla - // FIXME: does this work on Safari? - if(has("opera")){ - //Opera works if you use the current range on - //the selection if present. - if(selection.getRangeAt(0)){ - range = selection.getRangeAt(0); - } - } - range.selectNode(element); - selection.removeAllRanges(); - selection.addRange(range); - } - }else{ - // IE6-8 - try{ - var tg = element.tagName ? element.tagName.toLowerCase() : ""; - if(tg === "img" || tg === "table"){ - range = win.body(doc).createControlRange(); - }else{ - range = win.body(doc).createRange(); - } - range.addElement(element); - if(!nochangefocus){ - range.select(); - } - }catch(e){ - this.selectElementChildren(element, nochangefocus); - } - } - }, - - inSelection: function(node){ - // summary: - // This function determines if 'node' is - // in the current selection. - // tags: - // public - if(node){ - var newRange; - var doc = win.doc; - var range; - - if(win.doc.getSelection){ - // WC3 - var sel = win.global.getSelection(); - if(sel && sel.rangeCount > 0){ - range = sel.getRangeAt(0); - } - if(range && range.compareBoundaryPoints && doc.createRange){ - try{ - newRange = doc.createRange(); - newRange.setStart(node, 0); - if(range.compareBoundaryPoints(range.START_TO_END, newRange) === 1){ - return true; - } - }catch(e){ /* squelch */} - } - }else{ - // IE6-8, so we can't use the range object as the pseudo - // range doesn't implement the boundary checking, we have to - // use IE specific crud. - range = doc.selection.createRange(); - try{ - newRange = node.ownerDocument.body.createControlRange(); - if(newRange){ - newRange.addElement(node); - } - }catch(e1){ - try{ - newRange = node.ownerDocument.body.createTextRange(); - newRange.moveToElementText(node); - }catch(e2){/* squelch */} - } - if(range && newRange){ - // We can finally compare similar to W3C - if(range.compareEndPoints("EndToStart", newRange) === 1){ - return true; - } - } - } - } - return false; // Boolean - } -}; - - -lang.setObject("dijit._editor.selection", selection); - -return selection; -}); diff --git a/lib/dijit/_tree/dndSource.js.uncompressed.js b/lib/dijit/_tree/dndSource.js.uncompressed.js deleted file mode 100644 index 155e3ff38..000000000 --- a/lib/dijit/_tree/dndSource.js.uncompressed.js +++ /dev/null @@ -1,20 +0,0 @@ -define("dijit/_tree/dndSource", [ - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.setObject - "../tree/dndSource" -], function(kernel, lang, dndSource){ - // module: - // dijit/_tree/dndSource - - /*===== - return { - // summary: - // Deprecated module, use dijit/tree/dndSource instead. - }; - =====*/ - - // TODO: remove this file in 2.0 - kernel.deprecated("dijit._tree.dndSource has been moved to dijit.tree.dndSource, use that instead", "", "2.0"); - - lang.setObject("dijit._tree.dndSource", dndSource); -}); diff --git a/lib/dijit/a11y.js.uncompressed.js b/lib/dijit/a11y.js.uncompressed.js deleted file mode 100644 index 91a57d2ca..000000000 --- a/lib/dijit/a11y.js.uncompressed.js +++ /dev/null @@ -1,177 +0,0 @@ -define("dijit/a11y", [ - "dojo/_base/array", // array.forEach array.map - "dojo/_base/config", // defaultDuration - "dojo/_base/declare", // declare - "dojo/dom", // dom.byId - "dojo/dom-attr", // domAttr.attr domAttr.has - "dojo/dom-style", // style.style - "dojo/sniff", // has("ie") - "./main" // for exporting methods to dijit namespace -], function(array, config, declare, dom, domAttr, domStyle, has, dijit){ - - // module: - // dijit/a11y - - var shown = (dijit._isElementShown = function(/*Element*/ elem){ - var s = domStyle.get(elem); - return (s.visibility != "hidden") - && (s.visibility != "collapsed") - && (s.display != "none") - && (domAttr.get(elem, "type") != "hidden"); - }); - - dijit.hasDefaultTabStop = function(/*Element*/ elem){ - // summary: - // Tests if element is tab-navigable even without an explicit tabIndex setting - - // No explicit tabIndex setting, need to investigate node type - switch(elem.nodeName.toLowerCase()){ - case "a": - // An <a> w/out a tabindex is only navigable if it has an href - return domAttr.has(elem, "href"); - case "area": - case "button": - case "input": - case "object": - case "select": - case "textarea": - // These are navigable by default - return true; - case "iframe": - // If it's an editor <iframe> then it's tab navigable. - var body; - try{ - // non-IE - var contentDocument = elem.contentDocument; - if("designMode" in contentDocument && contentDocument.designMode == "on"){ - return true; - } - body = contentDocument.body; - }catch(e1){ - // contentWindow.document isn't accessible within IE7/8 - // if the iframe.src points to a foreign url and this - // page contains an element, that could get focus - try{ - body = elem.contentWindow.document.body; - }catch(e2){ - return false; - } - } - return body && (body.contentEditable == 'true' || - (body.firstChild && body.firstChild.contentEditable == 'true')); - default: - return elem.contentEditable == 'true'; - } - }; - - var isTabNavigable = (dijit.isTabNavigable = function(/*Element*/ elem){ - // summary: - // Tests if an element is tab-navigable - - // TODO: convert (and rename method) to return effective tabIndex; will save time in _getTabNavigable() - if(domAttr.get(elem, "disabled")){ - return false; - }else if(domAttr.has(elem, "tabIndex")){ - // Explicit tab index setting - return domAttr.get(elem, "tabIndex") >= 0; // boolean - }else{ - // No explicit tabIndex setting, so depends on node type - return dijit.hasDefaultTabStop(elem); - } - }); - - dijit._getTabNavigable = function(/*DOMNode*/ root){ - // summary: - // Finds descendants of the specified root node. - // description: - // Finds the following descendants of the specified root node: - // - // - the first tab-navigable element in document order - // without a tabIndex or with tabIndex="0" - // - the last tab-navigable element in document order - // without a tabIndex or with tabIndex="0" - // - the first element in document order with the lowest - // positive tabIndex value - // - the last element in document order with the highest - // positive tabIndex value - var first, last, lowest, lowestTabindex, highest, highestTabindex, radioSelected = {}; - - function radioName(node){ - // If this element is part of a radio button group, return the name for that group. - return node && node.tagName.toLowerCase() == "input" && - node.type && node.type.toLowerCase() == "radio" && - node.name && node.name.toLowerCase(); - } - - var walkTree = function(/*DOMNode*/ parent){ - for(var child = parent.firstChild; child; child = child.nextSibling){ - // Skip text elements, hidden elements, and also non-HTML elements (those in custom namespaces) in IE, - // since show() invokes getAttribute("type"), which crash on VML nodes in IE. - if(child.nodeType != 1 || (has("ie") <= 9 && child.scopeName !== "HTML") || !shown(child)){ - continue; - } - - if(isTabNavigable(child)){ - var tabindex = +domAttr.get(child, "tabIndex"); // + to convert string --> number - if(!domAttr.has(child, "tabIndex") || tabindex == 0){ - if(!first){ - first = child; - } - last = child; - }else if(tabindex > 0){ - if(!lowest || tabindex < lowestTabindex){ - lowestTabindex = tabindex; - lowest = child; - } - if(!highest || tabindex >= highestTabindex){ - highestTabindex = tabindex; - highest = child; - } - } - var rn = radioName(child); - if(domAttr.get(child, "checked") && rn){ - radioSelected[rn] = child; - } - } - if(child.nodeName.toUpperCase() != 'SELECT'){ - walkTree(child); - } - } - }; - if(shown(root)){ - walkTree(root); - } - function rs(node){ - // substitute checked radio button for unchecked one, if there is a checked one with the same name. - return radioSelected[radioName(node)] || node; - } - - return { first: rs(first), last: rs(last), lowest: rs(lowest), highest: rs(highest) }; - }; - dijit.getFirstInTabbingOrder = function(/*String|DOMNode*/ root, /*Document?*/ doc){ - // summary: - // Finds the descendant of the specified root node - // that is first in the tabbing order - var elems = dijit._getTabNavigable(dom.byId(root, doc)); - return elems.lowest ? elems.lowest : elems.first; // DomNode - }; - - dijit.getLastInTabbingOrder = function(/*String|DOMNode*/ root, /*Document?*/ doc){ - // summary: - // Finds the descendant of the specified root node - // that is last in the tabbing order - var elems = dijit._getTabNavigable(dom.byId(root, doc)); - return elems.last ? elems.last : elems.highest; // DomNode - }; - - return { - // summary: - // Accessibility utility functions (keyboard, tab stops, etc.) - - hasDefaultTabStop: dijit.hasDefaultTabStop, - isTabNavigable: dijit.isTabNavigable, - _getTabNavigable: dijit._getTabNavigable, - getFirstInTabbingOrder: dijit.getFirstInTabbingOrder, - getLastInTabbingOrder: dijit.getLastInTabbingOrder - }; -}); diff --git a/lib/dijit/a11yclick.js.uncompressed.js b/lib/dijit/a11yclick.js.uncompressed.js deleted file mode 100644 index ed92308dd..000000000 --- a/lib/dijit/a11yclick.js.uncompressed.js +++ /dev/null @@ -1,131 +0,0 @@ -define("dijit/a11yclick", [ - "dojo/on", - "dojo/_base/array", // array.forEach - "dojo/keys", // keys.ENTER keys.SPACE - "dojo/_base/declare", // declare - "dojo/has", // has("dom-addeventlistener") - "dojo/_base/unload", // unload.addOnWindowUnload - "dojo/_base/window" // win.doc.addEventListener win.doc.attachEvent win.doc.detachEvent -], function(on, array, keys, declare, has, unload, win){ - - // module: - // dijit/a11yclick - - // Keep track of where the last keydown event was, to help avoid generating - // spurious ondijitclick events when: - // 1. focus is on a <button> or <a> - // 2. user presses then releases the ENTER key - // 3. onclick handler fires and shifts focus to another node, with an ondijitclick handler - // 4. onkeyup event fires, causing the ondijitclick handler to fire - var lastKeyDownNode = null; - if(has("dom-addeventlistener")){ - win.doc.addEventListener('keydown', function(evt){ - lastKeyDownNode = evt.target; - }, true); - }else{ - // Fallback path for IE6-8 - (function(){ - var keydownCallback = function(evt){ - lastKeyDownNode = evt.srcElement; - }; - win.doc.attachEvent('onkeydown', keydownCallback); - unload.addOnWindowUnload(function(){ - win.doc.detachEvent('onkeydown', keydownCallback); - }); - })(); - } - - function clickKey(/*Event*/ e){ - return (e.keyCode === keys.ENTER || e.keyCode === keys.SPACE) && - !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey; - } - - return function(node, listener){ - // summary: - // Custom a11yclick (a.k.a. ondijitclick) event - // which triggers on a mouse click, touch, or space/enter keyup. - - if(/input|button/i.test(node.nodeName)){ - // pass through, the browser already generates click event on SPACE/ENTER key - return on(node, "click", listener); - }else{ - // Don't fire the click event unless both the keydown and keyup occur on this node. - // Avoids problems where focus shifted to this node or away from the node on keydown, - // either causing this node to process a stray keyup event, or causing another node - // to get a stray keyup event. - - var handles = [ - on(node, "keydown", function(e){ - //console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", lastKeyDownNode, ", equality is ", (e.target === lastKeyDownNode)); - if(clickKey(e)){ - // needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work - lastKeyDownNode = e.target; - - // Prevent viewport scrolling on space key in IE<9. - // (Reproducible on test_Button.html on any of the first dijit/form/Button examples) - e.preventDefault(); - } - }), - - on(node, "keyup", function(e){ - //console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", lastKeyDownNode, ", equality is ", (e.target === lastKeyDownNode)); - if(clickKey(e) && e.target == lastKeyDownNode){ // === breaks greasemonkey - //need reset here or have problems in FF when focus returns to trigger element after closing popup/alert - lastKeyDownNode = null; - on.emit(e.target, "click", { - cancelable: true, - bubbles: true - }); - } - }), - - on(node, "click", function(e){ - // catch mouse clicks, plus the on.emit() calls from above and below - listener.call(this, e); - }) - ]; - - if(has("touch")){ - // touchstart-->touchend will automatically generate a click event, but there are problems - // on iOS after focus has been programatically shifted (#14604, #14918), so setup a failsafe - // if click doesn't fire naturally. - - var clickTimer; - handles.push( - on(node, "touchend", function(e){ - var target = e.target; - clickTimer = setTimeout(function(){ - clickTimer = null; - on.emit(target, "click", { - cancelable: true, - bubbles: true - }); - }, 600); - }), - on(node, "click", function(e){ - // If browser generates a click naturally, clear the timer to fire a synthetic click event - if(clickTimer){ - clearTimeout(clickTimer); - } - }) - // TODO: if the touchstart and touchend were <100ms apart, and then there's another touchstart - // event <300ms after the touchend event, then clear the synthetic click timer, because user - // is doing a zoom. Alternately monitor screen.deviceXDPI (or something similar) to see if - // zoom level has changed. - ); - } - - return { - remove: function(){ - array.forEach(handles, function(h){ h.remove(); }); - if(clickTimer){ - clearTimeout(clickTimer); - clickTimer = null; - } - } - }; - } - }; - - return ret; -}); diff --git a/lib/dijit/dijit-all.js.uncompressed.js b/lib/dijit/dijit-all.js.uncompressed.js deleted file mode 100644 index 6aaf97636..000000000 --- a/lib/dijit/dijit-all.js.uncompressed.js +++ /dev/null @@ -1,75 +0,0 @@ -define("dijit/dijit-all", [ - "./main", - "./dijit", - "./ColorPalette", - "./Declaration", - "./Dialog", - "./DialogUnderlay", - "./TooltipDialog", - "./Editor", - "./_editor/plugins/FontChoice", - "./_editor/plugins/LinkDialog", - "./Menu", - "./MenuItem", - "./PopupMenuItem", - "./CheckedMenuItem", - "./MenuBar", - "./MenuBarItem", - "./PopupMenuBarItem", - "./MenuSeparator", - "./ProgressBar", - "./TitlePane", - "./Toolbar", - "./Tooltip", - "./Tree", - "./InlineEditBox", - "./form/Form", - "./form/Button", - "./form/DropDownButton", - "./form/ComboButton", - "./form/ToggleButton", - "./form/CheckBox", - "./form/RadioButton", - "./form/TextBox", - "./form/ValidationTextBox", - "./form/CurrencyTextBox", - "./form/DateTextBox", - "./form/TimeTextBox", - "./form/NumberSpinner", - "./form/NumberTextBox", - "./form/ComboBox", - "./form/FilteringSelect", - "./form/MultiSelect", - "./form/Select", - "./form/HorizontalSlider", - "./form/VerticalSlider", - "./form/HorizontalRule", - "./form/VerticalRule", - "./form/HorizontalRuleLabels", - "./form/VerticalRuleLabels", - "./form/SimpleTextarea", - "./form/Textarea", - "./layout/AccordionContainer", - "./layout/ContentPane", - "./layout/BorderContainer", - "./layout/LayoutContainer", - "./layout/LinkPane", - "./layout/SplitContainer", - "./layout/StackContainer", - "./layout/TabContainer" -], function(dijit){ - - // module: - // dijit/dijit-all - - /*===== - return { - // summary: - // A rollup that includes every dijit. You probably don't need this. - }; - =====*/ - - console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool"); - - return dijit; -}); diff --git a/lib/dijit/dijit.js.uncompressed.js b/lib/dijit/dijit.js.uncompressed.js deleted file mode 100644 index f4204b94a..000000000 --- a/lib/dijit/dijit.js.uncompressed.js +++ /dev/null @@ -1,26 +0,0 @@ -define("dijit/dijit", [ - "./main", - "./_base", - "dojo/parser", - "./_Widget", - "./_TemplatedMixin", - "./_Container", - "./layout/_LayoutWidget", - "./form/_FormWidget", - "./form/_FormValueWidget" -], function(dijit){ - - // module: - // dijit/dijit - - /*===== - return { - // summary: - // A roll-up for common dijit methods - // All the stuff in _base (these are the function that are guaranteed available without an explicit dojo.require) - // And some other stuff that we tend to pull in all the time anyway - }; - =====*/ - - return dijit; -}); diff --git a/lib/dijit/focus.js.uncompressed.js b/lib/dijit/focus.js.uncompressed.js deleted file mode 100644 index 3bf92b36a..000000000 --- a/lib/dijit/focus.js.uncompressed.js +++ /dev/null @@ -1,364 +0,0 @@ -define("dijit/focus", [ - "dojo/aspect", - "dojo/_base/declare", // declare - "dojo/dom", // domAttr.get dom.isDescendant - "dojo/dom-attr", // domAttr.get dom.isDescendant - "dojo/dom-construct", // connect to domConstruct.empty, domConstruct.destroy - "dojo/Evented", - "dojo/_base/lang", // lang.hitch - "dojo/on", - "dojo/ready", - "dojo/sniff", // has("ie") - "dojo/Stateful", - "dojo/_base/unload", // unload.addOnWindowUnload - "dojo/_base/window", // win.body - "dojo/window", // winUtils.get - "./a11y", // a11y.isTabNavigable - "./registry", // registry.byId - "./main" // to set dijit.focus -], function(aspect, declare, dom, domAttr, domConstruct, Evented, lang, on, ready, has, Stateful, unload, win, winUtils, - a11y, registry, dijit){ - - // module: - // dijit/focus - - var FocusManager = declare([Stateful, Evented], { - // summary: - // Tracks the currently focused node, and which widgets are currently "active". - // Access via require(["dijit/focus"], function(focus){ ... }). - // - // A widget is considered active if it or a descendant widget has focus, - // or if a non-focusable node of this widget or a descendant was recently clicked. - // - // Call focus.watch("curNode", callback) to track the current focused DOMNode, - // or focus.watch("activeStack", callback) to track the currently focused stack of widgets. - // - // Call focus.on("widget-blur", func) or focus.on("widget-focus", ...) to monitor when - // when widgets become active/inactive - // - // Finally, focus(node) will focus a node, suppressing errors if the node doesn't exist. - - // curNode: DomNode - // Currently focused item on screen - curNode: null, - - // activeStack: dijit/_WidgetBase[] - // List of currently active widgets (focused widget and it's ancestors) - activeStack: [], - - constructor: function(){ - // Don't leave curNode/prevNode pointing to bogus elements - var check = lang.hitch(this, function(node){ - if(dom.isDescendant(this.curNode, node)){ - this.set("curNode", null); - } - if(dom.isDescendant(this.prevNode, node)){ - this.set("prevNode", null); - } - }); - aspect.before(domConstruct, "empty", check); - aspect.before(domConstruct, "destroy", check); - }, - - registerIframe: function(/*DomNode*/ iframe){ - // summary: - // Registers listeners on the specified iframe so that any click - // or focus event on that iframe (or anything in it) is reported - // as a focus/click event on the `<iframe>` itself. - // description: - // Currently only used by editor. - // returns: - // Handle with remove() method to deregister. - return this.registerWin(iframe.contentWindow, iframe); - }, - - registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){ - // summary: - // Registers listeners on the specified window (either the main - // window or an iframe's window) to detect when the user has clicked somewhere - // or focused somewhere. - // description: - // Users should call registerIframe() instead of this method. - // targetWindow: - // If specified this is the window associated with the iframe, - // i.e. iframe.contentWindow. - // effectiveNode: - // If specified, report any focus events inside targetWindow as - // an event on effectiveNode, rather than on evt.target. - // returns: - // Handle with remove() method to deregister. - - // TODO: make this function private in 2.0; Editor/users should call registerIframe(), - - var _this = this; - var mousedownListener = function(evt){ - _this._justMouseDowned = true; - setTimeout(function(){ _this._justMouseDowned = false; }, 0); - - // workaround weird IE bug where the click is on an orphaned node - // (first time clicking a Select/DropDownButton inside a TooltipDialog) - if(has("ie") && evt && evt.srcElement && evt.srcElement.parentNode == null){ - return; - } - - _this._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse"); - }; - - // Listen for blur and focus events on targetWindow's document. - // Using attachEvent()/addEventListener() rather than on() to try to catch mouseDown events even - // if other code calls evt.stopPropagation(). But rethink for 2.0 since that doesn't work for attachEvent(), - // which watches events at the bubbling phase rather than capturing phase, like addEventListener(..., false). - // Connect to <html> (rather than document) on IE to avoid memory leaks, but document on other browsers because - // (at least for FF) the focus event doesn't fire on <html> or <body>. - var doc = has("ie") ? targetWindow.document.documentElement : targetWindow.document; - if(doc){ - if(has("ie")){ - targetWindow.document.body.attachEvent('onmousedown', mousedownListener); - var focusinListener = function(evt){ - // IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1, - // ignore those events - var tag = evt.srcElement.tagName.toLowerCase(); - if(tag == "#document" || tag == "body"){ return; } - - // Previous code called _onTouchNode() for any activate event on a non-focusable node. Can - // probably just ignore such an event as it will be handled by onmousedown handler above, but - // leaving the code for now. - if(a11y.isTabNavigable(evt.srcElement)){ - _this._onFocusNode(effectiveNode || evt.srcElement); - }else{ - _this._onTouchNode(effectiveNode || evt.srcElement); - } - }; - doc.attachEvent('onfocusin', focusinListener); - var focusoutListener = function(evt){ - _this._onBlurNode(effectiveNode || evt.srcElement); - }; - doc.attachEvent('onfocusout', focusoutListener); - - return { - remove: function(){ - targetWindow.document.detachEvent('onmousedown', mousedownListener); - doc.detachEvent('onfocusin', focusinListener); - doc.detachEvent('onfocusout', focusoutListener); - doc = null; // prevent memory leak (apparent circular reference via closure) - } - }; - }else{ - doc.body.addEventListener('mousedown', mousedownListener, true); - doc.body.addEventListener('touchstart', mousedownListener, true); - var focusListener = function(evt){ - _this._onFocusNode(effectiveNode || evt.target); - }; - doc.addEventListener('focus', focusListener, true); - var blurListener = function(evt){ - _this._onBlurNode(effectiveNode || evt.target); - }; - doc.addEventListener('blur', blurListener, true); - - return { - remove: function(){ - doc.body.removeEventListener('mousedown', mousedownListener, true); - doc.body.removeEventListener('touchstart', mousedownListener, true); - doc.removeEventListener('focus', focusListener, true); - doc.removeEventListener('blur', blurListener, true); - doc = null; // prevent memory leak (apparent circular reference via closure) - } - }; - } - } - }, - - _onBlurNode: function(/*DomNode*/ node){ - // summary: - // Called when focus leaves a node. - // Usually ignored, _unless_ it *isn't* followed by touching another node, - // which indicates that we tabbed off the last field on the page, - // in which case every widget is marked inactive - - // If the blur event isn't followed by a focus event, it means the user clicked on something unfocusable, - // so clear focus. - if(this._clearFocusTimer){ - clearTimeout(this._clearFocusTimer); - } - this._clearFocusTimer = setTimeout(lang.hitch(this, function(){ - this.set("prevNode", this.curNode); - this.set("curNode", null); - }), 0); - - if(this._justMouseDowned){ - // the mouse down caused a new widget to be marked as active; this blur event - // is coming late, so ignore it. - return; - } - - // If the blur event isn't followed by a focus or touch event then mark all widgets as inactive. - if(this._clearActiveWidgetsTimer){ - clearTimeout(this._clearActiveWidgetsTimer); - } - this._clearActiveWidgetsTimer = setTimeout(lang.hitch(this, function(){ - delete this._clearActiveWidgetsTimer; - this._setStack([]); - }), 0); - }, - - _onTouchNode: function(/*DomNode*/ node, /*String*/ by){ - // summary: - // Callback when node is focused or mouse-downed - // node: - // The node that was touched. - // by: - // "mouse" if the focus/touch was caused by a mouse down event - - // ignore the recent blurNode event - if(this._clearActiveWidgetsTimer){ - clearTimeout(this._clearActiveWidgetsTimer); - delete this._clearActiveWidgetsTimer; - } - - // compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem) - var newStack=[]; - try{ - while(node){ - var popupParent = domAttr.get(node, "dijitPopupParent"); - if(popupParent){ - node=registry.byId(popupParent).domNode; - }else if(node.tagName && node.tagName.toLowerCase() == "body"){ - // is this the root of the document or just the root of an iframe? - if(node === win.body()){ - // node is the root of the main document - break; - } - // otherwise, find the iframe this node refers to (can't access it via parentNode, - // need to do this trick instead). window.frameElement is supported in IE/FF/Webkit - node=winUtils.get(node.ownerDocument).frameElement; - }else{ - // if this node is the root node of a widget, then add widget id to stack, - // except ignore clicks on disabled widgets (actually focusing a disabled widget still works, - // to support MenuItem) - var id = node.getAttribute && node.getAttribute("widgetId"), - widget = id && registry.byId(id); - if(widget && !(by == "mouse" && widget.get("disabled"))){ - newStack.unshift(id); - } - node=node.parentNode; - } - } - }catch(e){ /* squelch */ } - - this._setStack(newStack, by); - }, - - _onFocusNode: function(/*DomNode*/ node){ - // summary: - // Callback when node is focused - - if(!node){ - return; - } - - if(node.nodeType == 9){ - // Ignore focus events on the document itself. This is here so that - // (for example) clicking the up/down arrows of a spinner - // (which don't get focus) won't cause that widget to blur. (FF issue) - return; - } - - // There was probably a blur event right before this event, but since we have a new focus, don't - // do anything with the blur - if(this._clearFocusTimer){ - clearTimeout(this._clearFocusTimer); - delete this._clearFocusTimer; - } - - this._onTouchNode(node); - - if(node == this.curNode){ return; } - this.set("prevNode", this.curNode); - this.set("curNode", node); - }, - - _setStack: function(/*String[]*/ newStack, /*String*/ by){ - // summary: - // The stack of active widgets has changed. Send out appropriate events and records new stack. - // newStack: - // array of widget id's, starting from the top (outermost) widget - // by: - // "mouse" if the focus/touch was caused by a mouse down event - - var oldStack = this.activeStack; - this.set("activeStack", newStack); - - // compare old stack to new stack to see how many elements they have in common - for(var nCommon=0; nCommon<Math.min(oldStack.length, newStack.length); nCommon++){ - if(oldStack[nCommon] != newStack[nCommon]){ - break; - } - } - - var widget; - // for all elements that have gone out of focus, set focused=false - for(var i=oldStack.length-1; i>=nCommon; i--){ - widget = registry.byId(oldStack[i]); - if(widget){ - widget._hasBeenBlurred = true; // TODO: used by form widgets, should be moved there - widget.set("focused", false); - if(widget._focusManager == this){ - widget._onBlur(by); - } - this.emit("widget-blur", widget, by); - } - } - - // for all element that have come into focus, set focused=true - for(i=nCommon; i<newStack.length; i++){ - widget = registry.byId(newStack[i]); - if(widget){ - widget.set("focused", true); - if(widget._focusManager == this){ - widget._onFocus(by); - } - this.emit("widget-focus", widget, by); - } - } - }, - - focus: function(node){ - // summary: - // Focus the specified node, suppressing errors if they occur - if(node){ - try{ node.focus(); }catch(e){/*quiet*/} - } - } - }); - - var singleton = new FocusManager(); - - // register top window and all the iframes it contains - ready(function(){ - var handle = singleton.registerWin(winUtils.get(win.doc)); - if(has("ie")){ - unload.addOnWindowUnload(function(){ - if(handle){ // because this gets called twice when doh.robot is running - handle.remove(); - handle = null; - } - }); - } - }); - - // Setup dijit.focus as a pointer to the singleton but also (for backwards compatibility) - // as a function to set focus. Remove for 2.0. - dijit.focus = function(node){ - singleton.focus(node); // indirection here allows dijit/_base/focus.js to override behavior - }; - for(var attr in singleton){ - if(!/^_/.test(attr)){ - dijit.focus[attr] = typeof singleton[attr] == "function" ? lang.hitch(singleton, attr) : singleton[attr]; - } - } - singleton.watch(function(attr, oldVal, newVal){ - dijit.focus[attr] = newVal; - }); - - return singleton; -}); diff --git a/lib/dijit/form/Button.js.uncompressed.js b/lib/dijit/form/Button.js.uncompressed.js deleted file mode 100644 index 40bbbcf39..000000000 --- a/lib/dijit/form/Button.js.uncompressed.js +++ /dev/null @@ -1,121 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/Button.html':"<span class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" role=\"presentation\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">●</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\"\n\t\ttabIndex=\"-1\" role=\"presentation\" data-dojo-attach-point=\"valueNode\"\n/></span>\n"}}); -define("dijit/form/Button", [ - "require", - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.toggle - "dojo/has", // has("dijit-legacy-requires") - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.trim - "dojo/ready", - "./_FormWidget", - "./_ButtonMixin", - "dojo/text!./templates/Button.html" -], function(require, declare, domClass, has, kernel, lang, ready, _FormWidget, _ButtonMixin, template){ - -// module: -// dijit/form/Button - -// Back compat w/1.6, remove for 2.0 -if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/form/DropDownButton", "dijit/form/ComboButton", "dijit/form/ToggleButton"]; - require(requires); // use indirection so modules not rolled into a build - }); -} - -return declare("dijit.form.Button", [_FormWidget, _ButtonMixin], { - // summary: - // Basically the same thing as a normal HTML button, but with special styling. - // description: - // Buttons can display a label, an icon, or both. - // A label should always be specified (through innerHTML) or the label - // attribute. It can be hidden via showLabel=false. - // example: - // | <button data-dojo-type="dijit/form/Button" onClick="...">Hello world</button> - // - // example: - // | var button1 = new Button({label: "hello world", onClick: foo}); - // | dojo.body().appendChild(button1.domNode); - - // showLabel: Boolean - // Set this to true to hide the label text and display only the icon. - // (If showLabel=false then iconClass must be specified.) - // Especially useful for toolbars. - // If showLabel=true, the label will become the title (a.k.a. tooltip/hint) of the icon. - // - // The exception case is for computers in high-contrast mode, where the label - // will still be displayed, since the icon doesn't appear. - showLabel: true, - - // iconClass: String - // Class to apply to DOMNode in button to make it display an icon - iconClass: "dijitNoIcon", - _setIconClassAttr: { node: "iconNode", type: "class" }, - - baseClass: "dijitButton", - - templateString: template, - - // Map widget attributes to DOMNode attributes. - _setValueAttr: "valueNode", - - _onClick: function(/*Event*/ e){ - // summary: - // Internal function to handle click actions - var ok = this.inherited(arguments); - if(ok){ - if(this.valueNode){ - this.valueNode.click(); - e.preventDefault(); // cancel BUTTON click and continue with hidden INPUT click - e.stopPropagation(); // avoid two events bubbling from Button widget - // leave ok = true so that subclasses can do what they need to do - } - } - return ok; - }, - - _fillContent: function(/*DomNode*/ source){ - // Overrides _Templated._fillContent(). - // If button label is specified as srcNodeRef.innerHTML rather than - // this.params.label, handle it here. - // TODO: remove the method in 2.0, parser will do it all for me - if(source && (!this.params || !("label" in this.params))){ - var sourceLabel = lang.trim(source.innerHTML); - if(sourceLabel){ - this.label = sourceLabel; // _applyAttributes will be called after buildRendering completes to update the DOM - } - } - }, - - _setShowLabelAttr: function(val){ - if(this.containerNode){ - domClass.toggle(this.containerNode, "dijitDisplayNone", !val); - } - this._set("showLabel", val); - }, - - setLabel: function(/*String*/ content){ - // summary: - // Deprecated. Use set('label', ...) instead. - kernel.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0"); - this.set("label", content); - }, - - _setLabelAttr: function(/*String*/ content){ - // summary: - // Hook for set('label', ...) to work. - // description: - // Set the label (text) of the button; takes an HTML string. - // If the label is hidden (showLabel=false) then and no title has - // been specified, then label is also set as title attribute of icon. - this.inherited(arguments); - if(!this.showLabel && !("title" in this.params)){ - this.titleNode.title = lang.trim(this.containerNode.innerText || this.containerNode.textContent || ''); - } - } -}); - - -}); - diff --git a/lib/dijit/form/CheckBox.js.uncompressed.js b/lib/dijit/form/CheckBox.js.uncompressed.js deleted file mode 100644 index 4e65ca30a..000000000 --- a/lib/dijit/form/CheckBox.js.uncompressed.js +++ /dev/null @@ -1,116 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/CheckBox.html':"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" role=\"${type}\" aria-checked=\"false\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n"}}); -define("dijit/form/CheckBox", [ - "require", - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/has", // has("dijit-legacy-requires") - "dojo/query", // query - "dojo/ready", - "./ToggleButton", - "./_CheckBoxMixin", - "dojo/text!./templates/CheckBox.html", - "dojo/NodeList-dom" // NodeList.addClass/removeClass -], function(require, declare, domAttr, has, query, ready, ToggleButton, _CheckBoxMixin, template){ - - // module: - // dijit/form/CheckBox - - // Back compat w/1.6, remove for 2.0 - if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/form/RadioButton"]; - require(requires); // use indirection so modules not rolled into a build - }); - } - - return declare("dijit.form.CheckBox", [ToggleButton, _CheckBoxMixin], { - // summary: - // Same as an HTML checkbox, but with fancy styling. - // - // description: - // User interacts with real html inputs. - // On onclick (which occurs by mouse click, space-bar, or - // using the arrow keys to switch the selected radio button), - // we update the state of the checkbox/radio. - // - // There are two modes: - // - // 1. High contrast mode - // 2. Normal mode - // - // In case 1, the regular html inputs are shown and used by the user. - // In case 2, the regular html inputs are invisible but still used by - // the user. They are turned quasi-invisible and overlay the background-image. - - templateString: template, - - baseClass: "dijitCheckBox", - - _setValueAttr: function(/*String|Boolean*/ newValue, /*Boolean*/ priorityChange){ - // summary: - // Handler for value= attribute to constructor, and also calls to - // set('value', val). - // description: - // During initialization, just saves as attribute to the `<input type=checkbox>`. - // - // After initialization, - // when passed a boolean, controls whether or not the CheckBox is checked. - // If passed a string, changes the value attribute of the CheckBox (the one - // specified as "value" when the CheckBox was constructed - // (ex: `<input data-dojo-type="dijit/CheckBox" value="chicken">`). - // - // `widget.set('value', string)` will check the checkbox and change the value to the - // specified string. - // - // `widget.set('value', boolean)` will change the checked state. - - if(typeof newValue == "string"){ - this.inherited(arguments); - newValue = true; - } - if(this._created){ - this.set('checked', newValue, priorityChange); - } - }, - _getValueAttr: function(){ - // summary: - // Hook so get('value') works. - // description: - // If the CheckBox is checked, returns the value attribute. - // Otherwise returns false. - return (this.checked ? this.value : false); - }, - - // Override behavior from Button, since we don't have an iconNode - _setIconClassAttr: null, - - postMixInProperties: function(){ - this.inherited(arguments); - - // Need to set initial checked state as part of template, so that form submit works. - // domAttr.set(node, "checked", bool) doesn't work on IE until node has been attached - // to <body>, see #8666 - this.checkedAttrSetting = this.checked ? "checked" : ""; - }, - - _fillContent: function(){ - // Override Button::_fillContent() since it doesn't make sense for CheckBox, - // since CheckBox doesn't even have a container - }, - - _onFocus: function(){ - if(this.id){ - query("label[for='"+this.id+"']").addClass("dijitFocusedLabel"); - } - this.inherited(arguments); - }, - - _onBlur: function(){ - if(this.id){ - query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel"); - } - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/form/ComboBox.js.uncompressed.js b/lib/dijit/form/ComboBox.js.uncompressed.js deleted file mode 100644 index b883af242..000000000 --- a/lib/dijit/form/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,27 +0,0 @@ -define("dijit/form/ComboBox", [ - "dojo/_base/declare", // declare - "./ValidationTextBox", - "./ComboBoxMixin" -], function(declare, ValidationTextBox, ComboBoxMixin){ - - // module: - // dijit/form/ComboBox - - return declare("dijit.form.ComboBox", [ValidationTextBox, ComboBoxMixin], { - // summary: - // Auto-completing text box - // - // description: - // The drop down box's values are populated from an class called - // a data provider, which returns a list of values based on the characters - // that the user has typed into the input box. - // If OPTION tags are used as the data provider via markup, - // then the OPTION tag's child text node is used as the widget value - // when selected. The OPTION tag's value attribute is ignored. - // To set the default value when using OPTION tags, specify the selected - // attribute on 1 of the child OPTION tags. - // - // Some of the options to the ComboBox are actually arguments to the data - // provider. - }); -}); diff --git a/lib/dijit/form/ComboBoxMixin.js.uncompressed.js b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js deleted file mode 100644 index bafccb44b..000000000 --- a/lib/dijit/form/ComboBoxMixin.js.uncompressed.js +++ /dev/null @@ -1,143 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/DropDownBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"button presentation\" aria-hidden=\"true\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}}); -define("dijit/form/ComboBoxMixin", [ - "dojo/_base/declare", // declare - "dojo/_base/Deferred", - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.mixin - "dojo/store/util/QueryResults", - "./_AutoCompleterMixin", - "./_ComboBoxMenu", - "../_HasDropDown", - "dojo/text!./templates/DropDownBox.html" -], function(declare, Deferred, kernel, lang, QueryResults, _AutoCompleterMixin, _ComboBoxMenu, _HasDropDown, template){ - - - // module: - // dijit/form/ComboBoxMixin - - return declare("dijit.form.ComboBoxMixin", [_HasDropDown, _AutoCompleterMixin], { - // summary: - // Provides main functionality of ComboBox widget - - // dropDownClass: [protected extension] Function String - // Dropdown widget class used to select a date/time. - // Subclasses should specify this. - dropDownClass: _ComboBoxMenu, - - // hasDownArrow: Boolean - // Set this textbox to have a down arrow button, to display the drop down list. - // Defaults to true. - hasDownArrow: true, - - templateString: template, - - baseClass: "dijitTextBox dijitComboBox", - - /*===== - // store: [const] dojo/store/api/Store|dojo/data/api/Read - // Reference to data provider object used by this ComboBox. - // - // Should be dojo/store/api/Store, but dojo/data/api/Read supported - // for backwards compatibility. - store: null, - =====*/ - - // Set classes like dijitDownArrowButtonHover depending on - // mouse action over button node - cssStateNodes: { - "_buttonNode": "dijitDownArrowButton" - }, - - _setHasDownArrowAttr: function(/*Boolean*/ val){ - this._set("hasDownArrow", val); - this._buttonNode.style.display = val ? "" : "none"; - }, - - _showResultList: function(){ - // hide the tooltip - this.displayMessage(""); - this.inherited(arguments); - }, - - _setStoreAttr: function(store){ - // For backwards-compatibility, accept dojo.data store in addition to dojo/store/api/Store. Remove in 2.0. - if(!store.get){ - lang.mixin(store, { - _oldAPI: true, - get: function(id){ - // summary: - // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity. - // Like dojo/store/DataStore.get() except returns native item. - var deferred = new Deferred(); - this.fetchItemByIdentity({ - identity: id, - onItem: function(object){ - deferred.resolve(object); - }, - onError: function(error){ - deferred.reject(error); - } - }); - return deferred.promise; - }, - query: function(query, options){ - // summary: - // Queries the store for objects. Like dojo/store/DataStore.query() - // except returned Deferred contains array of native items. - var deferred = new Deferred(function(){ fetchHandle.abort && fetchHandle.abort(); }); - deferred.total = new Deferred(); - var fetchHandle = this.fetch(lang.mixin({ - query: query, - onBegin: function(count){ - deferred.total.resolve(count); - }, - onComplete: function(results){ - deferred.resolve(results); - }, - onError: function(error){ - deferred.reject(error); - } - }, options)); - return QueryResults(deferred); - } - }); - } - this._set("store", store); - }, - - postMixInProperties: function(){ - // Since _setValueAttr() depends on this.store, _setStoreAttr() needs to execute first. - // Unfortunately, without special code, it ends up executing second. - var store = this.params.store || this.store; - if(store){ - this._setStoreAttr(store); - } - - this.inherited(arguments); - - // User may try to access this.store.getValue() etc. in a custom labelFunc() function. - // It's not available with the new data store for handling inline <option> tags, so add it. - if(!this.params.store && !this.store._oldAPI){ - var clazz = this.declaredClass; - lang.mixin(this.store, { - getValue: function(item, attr){ - kernel.deprecated(clazz + ".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly", "", "2.0"); - return item[attr]; - }, - getLabel: function(item){ - kernel.deprecated(clazz + ".store.getLabel(item) is deprecated for builtin store. Use item.label directly", "", "2.0"); - return item.name; - }, - fetch: function(args){ - kernel.deprecated(clazz + ".store.fetch() is deprecated for builtin store.", "Use store.query()", "2.0"); - var shim = ["dojo/data/ObjectStore"]; // indirection so it doesn't get rolled into a build - require(shim, lang.hitch(this, function(ObjectStore){ - new ObjectStore({objectStore: this}).fetch(args); - })); - } - }); - } - } - }); -}); diff --git a/lib/dijit/form/ComboButton.js.uncompressed.js b/lib/dijit/form/ComboButton.js.uncompressed.js deleted file mode 100644 index 7805c20e7..000000000 --- a/lib/dijit/form/ComboButton.js.uncompressed.js +++ /dev/null @@ -1,85 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/ComboButton.html':"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" data-dojo-attach-point=\"buttonNode\" data-dojo-attach-event=\"ondijitclick:_onClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" data-dojo-attach-point=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdata-dojo-attach-point=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdata-dojo-attach-event=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">▼</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" data-dojo-attach-point=\"valueNode\" role=\"presentation\"\n\t\t/></td></tr></tbody\n></table>\n"}}); -define("dijit/form/ComboButton", [ - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/keys", // keys - "../focus", // focus.focus() - "./DropDownButton", - "dojo/text!./templates/ComboButton.html" -], function(declare, event, keys, focus, DropDownButton, template){ - -// module: -// dijit/form/ComboButton - -return declare("dijit.form.ComboButton", DropDownButton, { - // summary: - // A combination button and drop-down button. - // Users can click one side to "press" the button, or click an arrow - // icon to display the drop down. - // - // example: - // | <button data-dojo-type="dijit/form/ComboButton" onClick="..."> - // | <span>Hello world</span> - // | <div data-dojo-type="dijit/Menu">...</div> - // | </button> - // - // example: - // | var button1 = new ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"}); - // | dojo.body().appendChild(button1.domNode); - // - - templateString: template, - - // Map widget attributes to DOMNode attributes. - _setIdAttr: "", // override _FormWidgetMixin which puts id on the focusNode - _setTabIndexAttr: ["focusNode", "titleNode"], - _setTitleAttr: "titleNode", - - // optionsTitle: String - // Text that describes the options menu (accessibility) - optionsTitle: "", - - baseClass: "dijitComboButton", - - // Set classes like dijitButtonContentsHover or dijitArrowButtonActive depending on - // mouse action over specified node - cssStateNodes: { - "buttonNode": "dijitButtonNode", - "titleNode": "dijitButtonContents", - "_popupStateNode": "dijitDownArrowButton" - }, - - _focusedNode: null, - - _onButtonKeyPress: function(/*Event*/ evt){ - // summary: - // Handler for right arrow key when focus is on left part of button - if(evt.charOrCode == keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){ - focus.focus(this._popupStateNode); - event.stop(evt); - } - }, - - _onArrowKeyPress: function(/*Event*/ evt){ - // summary: - // Handler for left arrow key when focus is on right part of button - if(evt.charOrCode == keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){ - focus.focus(this.titleNode); - event.stop(evt); - } - }, - - focus: function(/*String*/ position){ - // summary: - // Focuses this widget to according to position, if specified, - // otherwise on arrow node - // position: - // "start" or "end" - if(!this.disabled){ - focus.focus(position == "start" ? this.titleNode : this._popupStateNode); - } - } -}); - -}); diff --git a/lib/dijit/form/CurrencyTextBox.js.uncompressed.js b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js deleted file mode 100644 index fb13899a5..000000000 --- a/lib/dijit/form/CurrencyTextBox.js.uncompressed.js +++ /dev/null @@ -1,85 +0,0 @@ -define("dijit/form/CurrencyTextBox", [ - "dojo/currency", // currency._mixInDefaults currency.format currency.parse currency.regexp - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.hitch - "./NumberTextBox" -], function(currency, declare, lang, NumberTextBox){ - - // module: - // dijit/form/CurrencyTextBox - - /*===== - var __Constraints = declare([NumberTextBox.__Constraints, currency.__FormatOptions, currency.__ParseOptions], { - // summary: - // Specifies both the rules on valid/invalid values (minimum, maximum, - // number of required decimal places), and also formatting options for - // displaying the value when the field is not focused (currency symbol, - // etc.) - // description: - // Follows the pattern of `dijit/form/NumberTextBox.__Constraints`. - // In general developers won't need to set this parameter - // example: - // To ensure that the user types in the cents (for example, 1.00 instead of just 1): - // | {fractional:true} - }); - =====*/ - - return declare("dijit.form.CurrencyTextBox", NumberTextBox, { - // summary: - // A validating currency textbox - // description: - // CurrencyTextBox is similar to `dijit/form/NumberTextBox` but has a few - // extra features related to currency: - // - // 1. After specifying the currency type (american dollars, euros, etc.) it automatically - // sets parse/format options such as how many decimal places to show. - // 2. The currency mark (dollar sign, euro mark, etc.) is displayed when the field is blurred - // but erased during editing, so that the user can just enter a plain number. - - // currency: [const] String - // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD" - currency: "", - - /*===== - // constraints: __Constraints - // Despite the name, this parameter specifies both constraints on the input - // (including minimum/maximum allowed values) as well as - // formatting options. - constraints: {}, - ======*/ - - baseClass: "dijitTextBox dijitCurrencyTextBox", - - // Override pattern ValidationTextBox.pattern.... we use a reg-ex generating function rather - // than a straight regexp to deal with locale (plus formatting options too?) - pattern: function(constraints){ - // if focused, accept either currency data or NumberTextBox format - return '(' + (this.focused ? this.inherited(arguments, [ lang.mixin({}, constraints, this.editOptions) ]) + '|' : '') - + currency.regexp(constraints) + ')'; - }, - - // Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45" - _formatter: currency.format, - - _parser: currency.parse, - - parse: function(/*String*/ value, /*Object*/ constraints){ - // summary: - // Parses string value as a Currency, according to the constraints object - // tags: - // protected extension - var v = this.inherited(arguments); - if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse - v = lang.hitch(lang.mixin({}, this, { _parser: NumberTextBox.prototype._parser }), "inherited")(arguments); - } - return v; - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - if(!constraints.currency && this.currency){ - constraints.currency = this.currency; - } - this.inherited(arguments, [ currency._mixInDefaults(lang.mixin(constraints, { exponent: false })) ]); // get places - } - }); -}); diff --git a/lib/dijit/form/DataList.js.uncompressed.js b/lib/dijit/form/DataList.js.uncompressed.js deleted file mode 100644 index 2b2e062cf..000000000 --- a/lib/dijit/form/DataList.js.uncompressed.js +++ /dev/null @@ -1,70 +0,0 @@ -define("dijit/form/DataList", [ - "dojo/_base/declare", // declare - "dojo/dom", // dom.byId - "dojo/_base/lang", // lang.trim - "dojo/query", // query - "dojo/store/Memory", - "../registry" // registry.add registry.remove -], function(declare, dom, lang, query, MemoryStore, registry){ - - // module: - // dijit/form/DataList - - function toItem(/*DOMNode*/ option){ - // summary: - // Convert `<option>` node to hash - return { - id: option.value, - value: option.value, - name: lang.trim(option.innerText || option.textContent || '') - }; - } - - return declare("dijit.form.DataList", MemoryStore, { - // summary: - // Inefficient but small data store specialized for inlined data via OPTION tags - // - // description: - // Provides a store for inlined data like: - // - // | <datalist> - // | <option value="AL">Alabama</option> - // | ... - - constructor: function(params, srcNodeRef){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String - // Attach widget to this DOM node. - - // store pointer to original DOM tree - this.domNode = dom.byId(srcNodeRef); - - lang.mixin(this, params); - if(this.id){ - registry.add(this); // add to registry so it can be easily found by id - } - this.domNode.style.display = "none"; - - this.inherited(arguments, [{ - data: query("option", this.domNode).map(toItem) - }]); - }, - - destroy: function(){ - registry.remove(this.id); - }, - - fetchSelectedItem: function(){ - // summary: - // Get the option marked as selected, like `<option selected>`. - // Not part of dojo.data API. - var option = query("> option[selected]", this.domNode)[0] || query("> option", this.domNode)[0]; - return option && toItem(option); - } - }); -}); diff --git a/lib/dijit/form/DateTextBox.js.uncompressed.js b/lib/dijit/form/DateTextBox.js.uncompressed.js deleted file mode 100644 index 41b56bdeb..000000000 --- a/lib/dijit/form/DateTextBox.js.uncompressed.js +++ /dev/null @@ -1,28 +0,0 @@ -define("dijit/form/DateTextBox", [ - "dojo/_base/declare", // declare - "../Calendar", - "./_DateTimeTextBox" -], function(declare, Calendar, _DateTimeTextBox){ - - // module: - // dijit/form/DateTextBox - - return declare("dijit.form.DateTextBox", _DateTimeTextBox, { - // summary: - // A validating, serializable, range-bound date text box with a drop down calendar - // example: - // | new DateTextBox({value: new Date(2009, 0, 20)}) - // example: - // | <input data-dojo-type='dijit/form/DateTextBox' value='2009-01-20'> - - baseClass: "dijitTextBox dijitComboBox dijitDateTextBox", - popupClass: Calendar, - _selector: "date", - - // value: Date - // The value of this widget as a JavaScript Date object, with only year/month/day specified. - // If specified in markup, use the format specified in `stamp.fromISOString`. - // set("value", ...) accepts either a Date object or a string. - value: new Date("") // value.toString()="NaN" - }); -}); diff --git a/lib/dijit/form/DropDownButton.js.uncompressed.js b/lib/dijit/form/DropDownButton.js.uncompressed.js deleted file mode 100644 index 007e924d7..000000000 --- a/lib/dijit/form/DropDownButton.js.uncompressed.js +++ /dev/null @@ -1,99 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/DropDownButton.html':"<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" data-dojo-attach-point=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdata-dojo-attach-point=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">▼</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-point=\"valueNode\" role=\"presentation\"\n/></span>\n"}}); -define("dijit/form/DropDownButton", [ - "dojo/_base/declare", // declare - "dojo/_base/lang", // hitch - "dojo/query", // query - "../registry", // registry.byNode - "../popup", // dijit.popup2.hide - "./Button", - "../_Container", - "../_HasDropDown", - "dojo/text!./templates/DropDownButton.html" -], function(declare, lang, query, registry, popup, Button, _Container, _HasDropDown, template){ - -// module: -// dijit/form/DropDownButton - - -return declare("dijit.form.DropDownButton", [Button, _Container, _HasDropDown], { - // summary: - // A button with a drop down - // - // example: - // | <button data-dojo-type="dijit/form/DropDownButton"> - // | Hello world - // | <div data-dojo-type="dijit/Menu">...</div> - // | </button> - // - // example: - // | var button1 = new DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) }); - // | win.body().appendChild(button1); - // - - baseClass : "dijitDropDownButton", - - templateString: template, - - _fillContent: function(){ - // Overrides Button._fillContent(). - // - // My inner HTML contains both the button contents and a drop down widget, like - // <DropDownButton> <span>push me</span> <Menu> ... </Menu> </DropDownButton> - // The first node is assumed to be the button content. The widget is the popup. - - if(this.srcNodeRef){ // programatically created buttons might not define srcNodeRef - //FIXME: figure out how to filter out the widget and use all remaining nodes as button - // content, not just nodes[0] - var nodes = query("*", this.srcNodeRef); - this.inherited(arguments, [nodes[0]]); - - // save pointer to srcNode so we can grab the drop down widget after it's instantiated - this.dropDownContainer = this.srcNodeRef; - } - }, - - startup: function(){ - if(this._started){ return; } - - // the child widget from srcNodeRef is the dropdown widget. Insert it in the page DOM, - // make it invisible, and store a reference to pass to the popup code. - if(!this.dropDown && this.dropDownContainer){ - var dropDownNode = query("[widgetId]", this.dropDownContainer)[0]; - this.dropDown = registry.byNode(dropDownNode); - delete this.dropDownContainer; - } - if(this.dropDown){ - popup.hide(this.dropDown); - } - - this.inherited(arguments); - }, - - isLoaded: function(){ - // Returns whether or not we are loaded - if our dropdown has an href, - // then we want to check that. - var dropDown = this.dropDown; - return (!!dropDown && (!dropDown.href || dropDown.isLoaded)); - }, - - loadDropDown: function(/*Function*/ callback){ - // Default implementation assumes that drop down already exists, - // but hasn't loaded it's data (ex: ContentPane w/href). - // App must override if the drop down is lazy-created. - var dropDown = this.dropDown; - var handler = dropDown.on("load", lang.hitch(this, function(){ - handler.remove(); - callback(); - })); - dropDown.refresh(); // tell it to load - }, - - isFocusable: function(){ - // Overridden so that focus is handled by the _HasDropDown mixin, not by - // the _FormWidget mixin. - return this.inherited(arguments) && !this._mouseDown; - } -}); - -}); diff --git a/lib/dijit/form/FilteringSelect.js.uncompressed.js b/lib/dijit/form/FilteringSelect.js.uncompressed.js deleted file mode 100644 index 84ad938c8..000000000 --- a/lib/dijit/form/FilteringSelect.js.uncompressed.js +++ /dev/null @@ -1,234 +0,0 @@ -define("dijit/form/FilteringSelect", [ - "dojo/data/util/filter", // filter.patternToRegExp - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.mixin - "dojo/when", - "./MappedTextBox", - "./ComboBoxMixin" -], function(filter, declare, lang, when, MappedTextBox, ComboBoxMixin){ - - // module: - // dijit/form/FilteringSelect - - return declare("dijit.form.FilteringSelect", [MappedTextBox, ComboBoxMixin], { - // summary: - // An enhanced version of the HTML SELECT tag, populated dynamically - // - // description: - // An enhanced version of the HTML SELECT tag, populated dynamically. It works - // very nicely with very large data sets because it can load and page data as needed. - // It also resembles ComboBox, but does not allow values outside of the provided ones. - // If OPTION tags are used as the data provider via markup, then the - // OPTION tag's child text node is used as the displayed value when selected - // while the OPTION tag's value attribute is used as the widget value on form submit. - // To set the default value when using OPTION tags, specify the selected - // attribute on 1 of the child OPTION tags. - // - // Similar features: - // - // - There is a drop down list of possible values. - // - You can only enter a value from the drop down list. (You can't - // enter an arbitrary value.) - // - The value submitted with the form is the hidden value (ex: CA), - // not the displayed value a.k.a. label (ex: California) - // - // Enhancements over plain HTML version: - // - // - If you type in some text then it will filter down the list of - // possible values in the drop down list. - // - List can be specified either as a static list or via a javascript - // function (that can get the list from a server) - - // required: Boolean - // True (default) if user is required to enter a value into this field. - required: true, - - _lastDisplayedValue: "", - - _isValidSubset: function(){ - return this._opened; - }, - - isValid: function(){ - // Overrides ValidationTextBox.isValid() - return !!this.item || (!this.required && this.get('displayedValue') == ""); // #5974 - }, - - _refreshState: function(){ - if(!this.searchTimer){ // state will be refreshed after results are returned - this.inherited(arguments); - } - }, - - _callbackSetLabel: function( - /*Array*/ result, - /*Object*/ query, - /*Object*/ options, - /*Boolean?*/ priorityChange){ - // summary: - // Callback from dojo.store after lookup of user entered value finishes - - // setValue does a synchronous lookup, - // so it calls _callbackSetLabel directly, - // and so does not pass dataObject - // still need to test against _lastQuery in case it came too late - if((query && query[this.searchAttr] !== this._lastQuery) || (!query && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){ - return; - } - if(!result.length){ - //#3268: don't modify display value on bad input - //#3285: change CSS to indicate error - this.set("value", '', priorityChange || (priorityChange === undefined && !this.focused), this.textbox.value, null); - }else{ - this.set('item', result[0], priorityChange); - } - }, - - _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){ - // Callback when a data store query completes. - // Overrides ComboBox._openResultList() - - // #3285: tap into search callback to see if user's query resembles a match - if(query[this.searchAttr] !== this._lastQuery){ - return; - } - this.inherited(arguments); - - if(this.item === undefined){ // item == undefined for keyboard search - // If the search returned no items that means that the user typed - // in something invalid (and they can't make it valid by typing more characters), - // so flag the FilteringSelect as being in an invalid state - this.validate(true); - } - }, - - _getValueAttr: function(){ - // summary: - // Hook for get('value') to work. - - // don't get the textbox value but rather the previously set hidden value. - // Use this.valueNode.value which isn't always set for other MappedTextBox widgets until blur - return this.valueNode.value; - }, - - _getValueField: function(){ - // Overrides ComboBox._getValueField() - return "value"; - }, - - _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the select. - // Also sets the label to the corresponding value by reverse lookup. - if(!this._onChangeActive){ priorityChange = null; } - - if(item === undefined){ - if(value === null || value === ''){ - value = ''; - if(!lang.isString(displayedValue)){ - this._setDisplayedValueAttr(displayedValue||'', priorityChange); - return; - } - } - - var self = this; - this._lastQuery = value; - when(this.store.get(value), function(item){ - self._callbackSetLabel(item? [item] : [], undefined, undefined, priorityChange); - }); - }else{ - this.valueNode.value = value; - this.inherited(arguments); - } - }, - - _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ - // summary: - // Set the displayed valued in the input box, and the hidden value - // that gets submitted, based on a dojo.data store item. - // description: - // Users shouldn't call this function; they should be calling - // set('item', value) - // tags: - // private - this.inherited(arguments); - this._lastDisplayedValue = this.textbox.value; - }, - - _getDisplayQueryString: function(/*String*/ text){ - return text.replace(/([\\\*\?])/g, "\\$1"); - }, - - _setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('displayedValue', label) works. - // description: - // Sets textbox to display label. Also performs reverse lookup - // to set the hidden value. label should corresponding to item.searchAttr. - - if(label == null){ label = ''; } - - // This is called at initialization along with every custom setter. - // Usually (or always?) the call can be ignored. If it needs to be - // processed then at least make sure that the XHR request doesn't trigger an onChange() - // event, even if it returns after creation has finished - if(!this._created){ - if(!("displayedValue" in this.params)){ - return; - } - priorityChange = false; - } - - // Do a reverse lookup to map the specified displayedValue to the hidden value. - // Note that if there's a custom labelFunc() this code - if(this.store){ - this.closeDropDown(); - var query = lang.clone(this.query); // #6196: populate query with user-specifics - - // Generate query - var qs = this._getDisplayQueryString(label), q; - if(this.store._oldAPI){ - // remove this branch for 2.0 - q = qs; - }else{ - // Query on searchAttr is a regex for benefit of dojo/store/Memory, - // but with a toString() method to help dojo/store/JsonRest. - // Search string like "Co*" converted to regex like /^Co.*$/i. - q = filter.patternToRegExp(qs, this.ignoreCase); - q.toString = function(){ return qs; }; - } - this._lastQuery = query[this.searchAttr] = q; - - // If the label is not valid, the callback will never set it, - // so the last valid value will get the warning textbox. Set the - // textbox value now so that the impending warning will make - // sense to the user - this.textbox.value = label; - this._lastDisplayedValue = label; - this._set("displayedValue", label); // for watch("displayedValue") notification - var _this = this; - var options = { - ignoreCase: this.ignoreCase, - deep: true - }; - lang.mixin(options, this.fetchProperties); - this._fetchHandle = this.store.query(query, options); - when(this._fetchHandle, function(result){ - _this._fetchHandle = null; - _this._callbackSetLabel(result || [], query, options, priorityChange); - }, function(err){ - _this._fetchHandle = null; - if(!_this._cancelingQuery){ // don't treat canceled query as an error - console.error('dijit.form.FilteringSelect: ' + err.toString()); - } - }); - } - }, - - undo: function(){ - this.set('displayedValue', this._lastDisplayedValue); - } - }); -}); diff --git a/lib/dijit/form/Form.js.uncompressed.js b/lib/dijit/form/Form.js.uncompressed.js deleted file mode 100644 index 0a3b7eb71..000000000 --- a/lib/dijit/form/Form.js.uncompressed.js +++ /dev/null @@ -1,163 +0,0 @@ -define("dijit/form/Form", [ - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/_base/event", // event.stop - "dojo/_base/kernel", // kernel.deprecated - "dojo/sniff", // has("ie") - "../_Widget", - "../_TemplatedMixin", - "./_FormMixin", - "../layout/_ContentPaneResizeMixin" -], function(declare, domAttr, event, kernel, has, _Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin){ - - // module: - // dijit/form/Form - - - return declare("dijit.form.Form", [_Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin], { - // summary: - // Widget corresponding to HTML form tag, for validation and serialization - // - // example: - // | <form data-dojo-type="dijit/form/Form" id="myForm"> - // | Name: <input type="text" name="name" /> - // | </form> - // | myObj = {name: "John Doe"}; - // | dijit.byId('myForm').set('value', myObj); - // | - // | myObj=dijit.byId('myForm').get('value'); - - // HTML <FORM> attributes - - // name: String? - // Name of form for scripting. - name: "", - - // action: String? - // Server-side form handler. - action: "", - - // method: String? - // HTTP method used to submit the form, either "GET" or "POST". - method: "", - - // encType: String? - // Encoding type for the form, ex: application/x-www-form-urlencoded. - encType: "", - - // accept-charset: String? - // List of supported charsets. - "accept-charset": "", - - // accept: String? - // List of MIME types for file upload. - accept: "", - - // target: String? - // Target frame for the document to be opened in. - target: "", - - templateString: "<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>", - - postMixInProperties: function(){ - // Setup name=foo string to be referenced from the template (but only if a name has been specified) - // Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8660 - this.nameAttrSetting = this.name ? ("name='" + this.name + "'") : ""; - this.inherited(arguments); - }, - - execute: function(/*Object*/ /*===== formContents =====*/){ - // summary: - // Deprecated: use submit() - // tags: - // deprecated - }, - - onExecute: function(){ - // summary: - // Deprecated: use onSubmit() - // tags: - // deprecated - }, - - _setEncTypeAttr: function(/*String*/ value){ - this.encType = value; - domAttr.set(this.domNode, "encType", value); - if(has("ie")){ this.domNode.encoding = value; } - }, - - reset: function(/*Event?*/ e){ - // summary: - // restores all widget values back to their init values, - // calls onReset() which can cancel the reset by returning false - - // create fake event so we can know if preventDefault() is called - var faux = { - returnValue: true, // the IE way - preventDefault: function(){ // not IE - this.returnValue = false; - }, - stopPropagation: function(){}, - currentTarget: e ? e.target : this.domNode, - target: e ? e.target : this.domNode - }; - // if return value is not exactly false, and haven't called preventDefault(), then reset - if(!(this.onReset(faux) === false) && faux.returnValue){ - this.inherited(arguments, []); - } - }, - - onReset: function(/*Event?*/ /*===== e =====*/){ - // summary: - // Callback when user resets the form. This method is intended - // to be over-ridden. When the `reset` method is called - // programmatically, the return value from `onReset` is used - // to compute whether or not resetting should proceed - // tags: - // callback - return true; // Boolean - }, - - _onReset: function(e){ - this.reset(e); - event.stop(e); - return false; - }, - - _onSubmit: function(e){ - var fp = this.constructor.prototype; - // TODO: remove this if statement beginning with 2.0 - if(this.execute != fp.execute || this.onExecute != fp.onExecute){ - kernel.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0"); - this.onExecute(); - this.execute(this.getValues()); - } - if(this.onSubmit(e) === false){ // only exactly false stops submit - event.stop(e); - } - }, - - onSubmit: function(/*Event?*/ /*===== e =====*/){ - // summary: - // Callback when user submits the form. - // description: - // This method is intended to be over-ridden, but by default it checks and - // returns the validity of form elements. When the `submit` - // method is called programmatically, the return value from - // `onSubmit` is used to compute whether or not submission - // should proceed - // tags: - // extension - - return this.isValid(); // Boolean - }, - - submit: function(){ - // summary: - // programmatically submit form if and only if the `onSubmit` returns true - if(!(this.onSubmit() === false)){ - this.containerNode.submit(); - } - } - }); -}); diff --git a/lib/dijit/form/HorizontalRule.js.uncompressed.js b/lib/dijit/form/HorizontalRule.js.uncompressed.js deleted file mode 100644 index 6e9577ddc..000000000 --- a/lib/dijit/form/HorizontalRule.js.uncompressed.js +++ /dev/null @@ -1,69 +0,0 @@ -define("dijit/form/HorizontalRule", [ - "dojo/_base/declare", // declare - "../_Widget", - "../_TemplatedMixin" -], function(declare, _Widget, _TemplatedMixin){ - -// module: -// dijit/form/HorizontalRule - - -return declare("dijit.form.HorizontalRule", [_Widget, _TemplatedMixin], { - // summary: - // Hash marks for `dijit/form/HorizontalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>', - - // count: Integer - // Number of hash marks to generate - count: 3, - - // container: String - // For HorizontalSlider, this is either "topDecoration" or "bottomDecoration", - // and indicates whether this rule goes above or below the slider. - container: "containerNode", - - // ruleStyle: String - // CSS style to apply to individual hash marks - ruleStyle: "", - - _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkH" style="left:', - _positionSuffix: '%;', - _suffix: '"></div>', - - _genHTML: function(pos){ - return this._positionPrefix + pos + this._positionSuffix + this.ruleStyle + this._suffix; - }, - - // _isHorizontal: [protected extension] Boolean - // VerticalRule will override this... - _isHorizontal: true, - - buildRendering: function(){ - this.inherited(arguments); - - var innerHTML; - if(this.count == 1){ - innerHTML = this._genHTML(50, 0); - }else{ - var i; - var interval = 100 / (this.count-1); - if(!this._isHorizontal || this.isLeftToRight()){ - innerHTML = this._genHTML(0, 0); - for(i=1; i < this.count-1; i++){ - innerHTML += this._genHTML(interval*i, i); - } - innerHTML += this._genHTML(100, this.count-1); - }else{ - innerHTML = this._genHTML(100, 0); - for(i=1; i < this.count-1; i++){ - innerHTML += this._genHTML(100-interval*i, i); - } - innerHTML += this._genHTML(0, this.count-1); - } - } - this.domNode.innerHTML = innerHTML; - } -}); - -}); diff --git a/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js deleted file mode 100644 index f8f418748..000000000 --- a/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js +++ /dev/null @@ -1,92 +0,0 @@ -define("dijit/form/HorizontalRuleLabels", [ - "dojo/_base/declare", // declare - "dojo/number", // number.format - "dojo/query", // query - "./HorizontalRule" -], function(declare, number, query, HorizontalRule){ - -// module: -// dijit/form/HorizontalRuleLabels - -return declare("dijit.form.HorizontalRuleLabels", HorizontalRule, { - // summary: - // Labels for `dijit/form/HorizontalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH"></div>', - - // labelStyle: String - // CSS style to apply to individual text labels - labelStyle: "", - - // labels: String[]? - // Array of text labels to render - evenly spaced from left-to-right or bottom-to-top. - // Alternately, minimum and maximum can be specified, to get numeric labels. - labels: [], - - // numericMargin: Integer - // Number of generated numeric labels that should be rendered as '' on the ends when labels[] are not specified - numericMargin: 0, - - // numericMinimum: Integer - // Leftmost label value for generated numeric labels when labels[] are not specified - minimum: 0, - - // numericMaximum: Integer - // Rightmost label value for generated numeric labels when labels[] are not specified - maximum: 1, - - // constraints: Object - // pattern, places, lang, et al (see dojo.number) for generated numeric labels when labels[] are not specified - constraints: {pattern:"#%"}, - - _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerH" style="left:', - _labelPrefix: '"><div class="dijitRuleLabel dijitRuleLabelH">', - _suffix: '</div></div>', - - _calcPosition: function(pos){ - // summary: - // Returns the value to be used in HTML for the label as part of the left: attribute - // tags: - // protected extension - return pos; - }, - - _genHTML: function(pos, ndx){ - return this._positionPrefix + this._calcPosition(pos) + this._positionSuffix + this.labelStyle + this._labelPrefix + this.labels[ndx] + this._suffix; - }, - - getLabels: function(){ - // summary: - // Overridable function to return array of labels to use for this slider. - // Can specify a getLabels() method instead of a labels[] array, or min/max attributes. - // tags: - // protected extension - - // if the labels array was not specified directly, then see if <li> children were - var labels = this.labels; - if(!labels.length && this.srcNodeRef){ - // for markup creation, labels are specified as child elements - labels = query("> li", this.srcNodeRef).map(function(node){ - return String(node.innerHTML); - }); - } - // if the labels were not specified directly and not as <li> children, then calculate numeric labels - if(!labels.length && this.count > 1){ - var start = this.minimum; - var inc = (this.maximum - start) / (this.count-1); - for(var i=0; i < this.count; i++){ - labels.push((i < this.numericMargin || i >= (this.count-this.numericMargin)) ? '' : number.format(start, this.constraints)); - start += inc; - } - } - return labels; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - this.labels = this.getLabels(); - this.count = this.labels.length; - } -}); - -}); diff --git a/lib/dijit/form/HorizontalSlider.js.uncompressed.js b/lib/dijit/form/HorizontalSlider.js.uncompressed.js deleted file mode 100644 index 571ef835c..000000000 --- a/lib/dijit/form/HorizontalSlider.js.uncompressed.js +++ /dev/null @@ -1,349 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/HorizontalSlider.html':"<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\trole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" data-dojo-attach-event=\"press:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"}}); -define("dijit/form/HorizontalSlider", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dnd/move", - "dojo/_base/event", // event.stop - "dojo/_base/fx", // fx.animateProperty - "dojo/dom-geometry", // domGeometry.position - "dojo/dom-style", // domStyle.getComputedStyle - "dojo/keys", // keys.DOWN_ARROW keys.END keys.HOME keys.LEFT_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.RIGHT_ARROW keys.UP_ARROW - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("ie") has("mozilla") - "dojo/dnd/Moveable", // Moveable - "dojo/dnd/Mover", // Mover Mover.prototype.destroy.apply - "dojo/query", // query - "dojo/mouse", // mouse.wheel - "../registry", // registry.findWidgets - "../focus", // focus.focus() - "../typematic", - "./Button", - "./_FormValueWidget", - "../_Container", - "dojo/text!./templates/HorizontalSlider.html" -], function(array, declare, move, event, fx, domGeometry, domStyle, keys, lang, has, Moveable, Mover, query, mouse, - registry, focus, typematic, Button, _FormValueWidget, _Container, template){ - -// module: -// dijit/form/HorizontalSlider - - -var _SliderMover = declare("dijit.form._SliderMover", Mover, { - onMouseMove: function(e){ - var widget = this.widget; - var abspos = widget._abspos; - if(!abspos){ - abspos = widget._abspos = domGeometry.position(widget.sliderBarContainer, true); - widget._setPixelValue_ = lang.hitch(widget, "_setPixelValue"); - widget._isReversed_ = widget._isReversed(); - } - var pixelValue = e[widget._mousePixelCoord] - abspos[widget._startingPixelCoord]; - widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false); - }, - - destroy: function(e){ - Mover.prototype.destroy.apply(this, arguments); - var widget = this.widget; - widget._abspos = null; - widget._setValueAttr(widget.value, true); - } -}); - -var HorizontalSlider = declare("dijit.form.HorizontalSlider", [_FormValueWidget, _Container], { - // summary: - // A form widget that allows one to select a value with a horizontally draggable handle - - templateString: template, - - // Overrides FormValueWidget.value to indicate numeric value - value: 0, - - // showButtons: [const] Boolean - // Show increment/decrement buttons at the ends of the slider? - showButtons: true, - - // minimum: [const] Integer - // The minimum value the slider can be set to. - minimum: 0, - - // maximum: [const] Integer - // The maximum value the slider can be set to. - maximum: 100, - - // discreteValues: Integer - // If specified, indicates that the slider handle has only 'discreteValues' possible positions, - // and that after dragging the handle, it will snap to the nearest possible position. - // Thus, the slider has only 'discreteValues' possible values. - // - // For example, if minimum=10, maxiumum=30, and discreteValues=3, then the slider handle has - // three possible positions, representing values 10, 20, or 30. - // - // If discreteValues is not specified or if it's value is higher than the number of pixels - // in the slider bar, then the slider handle can be moved freely, and the slider's value will be - // computed/reported based on pixel position (in this case it will likely be fractional, - // such as 123.456789). - discreteValues: Infinity, - - // pageIncrement: Integer - // If discreteValues is also specified, this indicates the amount of clicks (ie, snap positions) - // that the slider handle is moved via pageup/pagedown keys. - // If discreteValues is not specified, it indicates the number of pixels. - pageIncrement: 2, - - // clickSelect: Boolean - // If clicking the slider bar changes the value or not - clickSelect: true, - - // slideDuration: Number - // The time in ms to take to animate the slider handle from 0% to 100%, - // when clicking the slider bar to make the handle move. - slideDuration: registry.defaultDuration, - - // Map widget attributes to DOMNode attributes. - _setIdAttr: "", // Override _FormWidget which sends id to focusNode - - baseClass: "dijitSlider", - - // Apply CSS classes to up/down arrows and handle per mouse state - cssStateNodes: { - incrementButton: "dijitSliderIncrementButton", - decrementButton: "dijitSliderDecrementButton", - focusNode: "dijitSliderThumb" - }, - - _mousePixelCoord: "pageX", - _pixelCount: "w", - _startingPixelCoord: "x", - _handleOffsetCoord: "left", - _progressPixelSize: "width", - - _onKeyUp: function(/*Event*/ e){ - if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; } - this._setValueAttr(this.value, true); - }, - - _onKeyPress: function(/*Event*/ e){ - if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; } - switch(e.charOrCode){ - case keys.HOME: - this._setValueAttr(this.minimum, false); - break; - case keys.END: - this._setValueAttr(this.maximum, false); - break; - // this._descending === false: if ascending vertical (min on top) - // (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical - case ((this._descending || this.isLeftToRight()) ? keys.RIGHT_ARROW : keys.LEFT_ARROW): - case (this._descending === false ? keys.DOWN_ARROW : keys.UP_ARROW): - case (this._descending === false ? keys.PAGE_DOWN : keys.PAGE_UP): - this.increment(e); - break; - case ((this._descending || this.isLeftToRight()) ? keys.LEFT_ARROW : keys.RIGHT_ARROW): - case (this._descending === false ? keys.UP_ARROW : keys.DOWN_ARROW): - case (this._descending === false ? keys.PAGE_UP : keys.PAGE_DOWN): - this.decrement(e); - break; - default: - return; - } - event.stop(e); - }, - - _onHandleClick: function(e){ - if(this.disabled || this.readOnly){ return; } - if(!has("ie")){ - // make sure you get focus when dragging the handle - // (but don't do on IE because it causes a flicker on mouse up (due to blur then focus) - focus.focus(this.sliderHandle); - } - event.stop(e); - }, - - _isReversed: function(){ - // summary: - // Returns true if direction is from right to left - // tags: - // protected extension - return !this.isLeftToRight(); - }, - - _onBarClick: function(e){ - if(this.disabled || this.readOnly || !this.clickSelect){ return; } - focus.focus(this.sliderHandle); - event.stop(e); - var abspos = domGeometry.position(this.sliderBarContainer, true); - var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord]; - this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true); - this._movable.onMouseDown(e); - }, - - _setPixelValue: function(/*Number*/ pixelValue, /*Number*/ maxPixels, /*Boolean?*/ priorityChange){ - if(this.disabled || this.readOnly){ return; } - var count = this.discreteValues; - if(count <= 1 || count == Infinity){ count = maxPixels; } - count--; - var pixelsPerValue = maxPixels / count; - var wholeIncrements = Math.round(pixelValue / pixelsPerValue); - this._setValueAttr(Math.max(Math.min((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, this.maximum), this.minimum), priorityChange); - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', value) works. - this._set("value", value); - this.valueNode.value = value; - this.focusNode.setAttribute("aria-valuenow", value); - this.inherited(arguments); - var percent = (value - this.minimum) / (this.maximum - this.minimum); - var progressBar = (this._descending === false) ? this.remainingBar : this.progressBar; - var remainingBar = (this._descending === false) ? this.progressBar : this.remainingBar; - if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){ - this._inProgressAnim.stop(true); - } - if(priorityChange && this.slideDuration > 0 && progressBar.style[this._progressPixelSize]){ - // animate the slider - var _this = this; - var props = {}; - var start = parseFloat(progressBar.style[this._progressPixelSize]); - var duration = this.slideDuration * (percent-start/100); - if(duration == 0){ return; } - if(duration < 0){ duration = 0 - duration; } - props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" }; - this._inProgressAnim = fx.animateProperty({ node: progressBar, duration: duration, - onAnimate: function(v){ - remainingBar.style[_this._progressPixelSize] = (100 - parseFloat(v[_this._progressPixelSize])) + "%"; - }, - onEnd: function(){ - delete _this._inProgressAnim; - }, - properties: props - }); - this._inProgressAnim.play(); - }else{ - progressBar.style[this._progressPixelSize] = (percent*100) + "%"; - remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%"; - } - }, - - _bumpValue: function(signedChange, /*Boolean?*/ priorityChange){ - if(this.disabled || this.readOnly){ return; } - var s = domStyle.getComputedStyle(this.sliderBarContainer); - var c = domGeometry.getContentBox(this.sliderBarContainer, s); - var count = this.discreteValues; - if(count <= 1 || count == Infinity){ count = c[this._pixelCount]; } - count--; - var value = (this.value - this.minimum) * count / (this.maximum - this.minimum) + signedChange; - if(value < 0){ value = 0; } - if(value > count){ value = count; } - value = value * (this.maximum - this.minimum) / count + this.minimum; - this._setValueAttr(value, priorityChange); - }, - - _onClkBumper: function(val){ - if(this.disabled || this.readOnly || !this.clickSelect){ return; } - this._setValueAttr(val, true); - }, - - _onClkIncBumper: function(){ - this._onClkBumper(this._descending === false ? this.minimum : this.maximum); - }, - - _onClkDecBumper: function(){ - this._onClkBumper(this._descending === false ? this.maximum : this.minimum); - }, - - decrement: function(/*Event*/ e){ - // summary: - // Decrement slider - // tags: - // private - this._bumpValue(e.charOrCode == keys.PAGE_DOWN ? -this.pageIncrement : -1); - }, - - increment: function(/*Event*/ e){ - // summary: - // Increment slider - // tags: - // private - this._bumpValue(e.charOrCode == keys.PAGE_UP ? this.pageIncrement : 1); - }, - - _mouseWheeled: function(/*Event*/ evt){ - // summary: - // Event handler for mousewheel where supported - event.stop(evt); - this._bumpValue(evt.wheelDelta < 0 ? -1 : 1, true); // negative scroll acts like a decrement - }, - - startup: function(){ - if(this._started){ return; } - - array.forEach(this.getChildren(), function(child){ - if(this[child.container] != this.containerNode){ - this[child.container].appendChild(child.domNode); - } - }, this); - - this.inherited(arguments); - }, - - _typematicCallback: function(/*Number*/ count, /*Object*/ button, /*Event*/ e){ - if(count == -1){ - this._setValueAttr(this.value, true); - }else{ - this[(button == (this._descending? this.incrementButton : this.decrementButton)) ? "decrement" : "increment"](e); - } - }, - - buildRendering: function(){ - this.inherited(arguments); - if(this.showButtons){ - this.incrementButton.style.display=""; - this.decrementButton.style.display=""; - } - - // find any associated label element and add to slider focusnode. - var label = query('label[for="'+this.id+'"]'); - if(label.length){ - if(!label[0].id){ label[0].id = this.id + "_label"; } - this.focusNode.setAttribute("aria-labelledby", label[0].id); - } - - this.focusNode.setAttribute("aria-valuemin", this.minimum); - this.focusNode.setAttribute("aria-valuemax", this.maximum); - }, - - postCreate: function(){ - this.inherited(arguments); - - if(this.showButtons){ - this.own( - typematic.addMouseListener(this.decrementButton, this, "_typematicCallback", 25, 500), - typematic.addMouseListener(this.incrementButton, this, "_typematicCallback", 25, 500) - ); - } - this.connect(this.domNode, mouse.wheel, "_mouseWheeled"); - - // define a custom constructor for a SliderMover that points back to me - var mover = declare(_SliderMover, { - widget: this - }); - this._movable = new Moveable(this.sliderHandle, {mover: mover}); - - this._layoutHackIE7(); - }, - - destroy: function(){ - this._movable.destroy(); - if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){ - this._inProgressAnim.stop(true); - } - this.inherited(arguments); - } -}); - -HorizontalSlider._Mover = _SliderMover; // for monkey patching - -return HorizontalSlider; -}); diff --git a/lib/dijit/form/MappedTextBox.js.uncompressed.js b/lib/dijit/form/MappedTextBox.js.uncompressed.js deleted file mode 100644 index 1f9ed7509..000000000 --- a/lib/dijit/form/MappedTextBox.js.uncompressed.js +++ /dev/null @@ -1,81 +0,0 @@ -define("dijit/form/MappedTextBox", [ - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.place - "./ValidationTextBox" -], function(declare, domConstruct, ValidationTextBox){ - - // module: - // dijit/form/MappedTextBox - - return declare("dijit.form.MappedTextBox", ValidationTextBox, { - // summary: - // A dijit/form/ValidationTextBox subclass which provides a base class for widgets that have - // a visible formatted display value, and a serializable - // value in a hidden input field which is actually sent to the server. - // description: - // The visible display may - // be locale-dependent and interactive. The value sent to the server is stored in a hidden - // input field which uses the `name` attribute declared by the original widget. That value sent - // to the server is defined by the dijit/form/MappedTextBox.serialize() method and is typically - // locale-neutral. - // tags: - // protected - - postMixInProperties: function(){ - this.inherited(arguments); - - // we want the name attribute to go to the hidden <input>, not the displayed <input>, - // so override _FormWidget.postMixInProperties() setting of nameAttrSetting - this.nameAttrSetting = ""; - }, - - // Override default behavior to assign name to focusNode - _setNameAttr: null, - - serialize: function(val /*=====, options =====*/){ - // summary: - // Overridable function used to convert the get('value') result to a canonical - // (non-localized) string. For example, will print dates in ISO format, and - // numbers the same way as they are represented in javascript. - // val: anything - // options: Object? - // tags: - // protected extension - return val.toString ? val.toString() : ""; // String - }, - - toString: function(){ - // summary: - // Returns widget as a printable string using the widget's value - // tags: - // protected - var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized - return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String - }, - - validate: function(){ - // Overrides `dijit/form/TextBox.validate` - this.valueNode.value = this.toString(); - return this.inherited(arguments); - }, - - buildRendering: function(){ - // Overrides `dijit/_TemplatedMixin/buildRendering` - - this.inherited(arguments); - - // Create a hidden <input> node with the serialized value used for submit - // (as opposed to the displayed value). - // Passing in name as markup rather than calling domConstruct.create() with an attrs argument - // to make query(input[name=...]) work on IE. (see #8660) - this.valueNode = domConstruct.place("<input type='hidden'" + (this.name ? ' name="' + this.name.replace(/"/g, """) + '"' : "") + "/>", this.textbox, "after"); - }, - - reset: function(){ - // Overrides `dijit/form/ValidationTextBox.reset` to - // reset the hidden textbox value to '' - this.valueNode.value = ''; - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/form/MultiSelect.js.uncompressed.js b/lib/dijit/form/MultiSelect.js.uncompressed.js deleted file mode 100644 index 4686e5c75..000000000 --- a/lib/dijit/form/MultiSelect.js.uncompressed.js +++ /dev/null @@ -1,134 +0,0 @@ -define("dijit/form/MultiSelect", [ - "dojo/_base/array", // array.indexOf, array.map - "dojo/_base/declare", // declare - "dojo/dom-geometry", // domGeometry.setMarginBox - "dojo/query", // query - "./_FormValueWidget" -], function(array, declare, domGeometry, query, _FormValueWidget){ - -// module: -// dijit/form/MultiSelect - -return declare("dijit.form.MultiSelect", _FormValueWidget, { - // summary: - // Widget version of a `<select multiple=true>` element, - // for selecting multiple options. - - // size: Number - // Number of elements to display on a page - // NOTE: may be removed in version 2.0, since elements may have variable height; - // set the size via style="..." or CSS class names instead. - size: 7, - - templateString: "<select multiple='true' ${!nameAttrSetting} data-dojo-attach-point='containerNode,focusNode' data-dojo-attach-event='onchange: _onChange'></select>", - - addSelected: function(/*dijit/form/MultiSelect*/ select){ - // summary: - // Move the selected nodes of a passed Select widget - // instance to this Select widget. - // - // example: - // | // move all the selected values from "bar" to "foo" - // | dijit.byId("foo").addSelected(dijit.byId("bar")); - - select.getSelected().forEach(function(n){ - if(this.restoreOriginalText){ - n.text = this.enforceTextDirWithUcc(this.restoreOriginalText(n), n.text); - } - this.containerNode.appendChild(n); - // scroll to bottom to see item - // cannot use scrollIntoView since <option> tags don't support all attributes - // does not work on IE due to a bug where <select> always shows scrollTop = 0 - this.domNode.scrollTop = this.domNode.offsetHeight; // overshoot will be ignored - // scrolling the source select is trickier esp. on safari who forgets to change the scrollbar size - var oldscroll = select.domNode.scrollTop; - select.domNode.scrollTop = 0; - select.domNode.scrollTop = oldscroll; - },this); - this._set('value', this.get('value')); - }, - - getSelected: function(){ - // summary: - // Access the NodeList of the selected options directly - return query("option",this.containerNode).filter(function(n){ - return n.selected; // Boolean - }); // dojo/NodeList - }, - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works. - // description: - // Returns an array of the selected options' values. - - // Don't call getSelect.map() because it doesn't return a real array, - // and that messes up dojo.toJson() calls like in the Form.html test - return array.map(this.getSelected(), function(n){ - return n.value; - }); - }, - - multiple: true, // for Form - - _setValueAttr: function(/*Array*/ values, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', values) works. - // description: - // Set the value(s) of this Select based on passed values - query("option",this.containerNode).forEach(function(n){ - n.selected = (array.indexOf(values,n.value) != -1); - }); - this.inherited(arguments); - }, - - invertSelection: function(/*Boolean?*/ onChange){ - // summary: - // Invert the selection - // onChange: Boolean - // If false, onChange is not fired. - var val = []; - query("option",this.containerNode).forEach(function(n){ - if(!n.selected){ val.push(n.value); } - }); - this._setValueAttr(val, !(onChange === false || onChange == null)); - }, - - _onChange: function(/*Event*/){ - this._handleOnChange(this.get('value'), true); - }, - - // for layout widgets: - resize: function(/*Object*/ size){ - if(size){ - domGeometry.setMarginBox(this.domNode, size); - } - }, - - postCreate: function(){ - this._set('value', this.get('value')); - this.inherited(arguments); - }, - - _setTextDirAttr: function(textDir){ - // to insure the code executed only when _BidiSupport loaded, and only - // when there was a change in textDir - if((this.textDir != textDir || !this._created) && this.enforceTextDirWithUcc){ - this._set("textDir", textDir); - - query("option",this.containerNode).forEach(function(option){ - // If the value wasn't defined explicitly, it the same object as - // option.text. Since the option.text will be modified (by wrapping of UCC) - // we want to save the original option.value for form submission. - if(!this._created && option.value === option.text){ - option.value = option.text; - } - // apply the bidi support - option.text = this.enforceTextDirWithUcc(option, option.originalText || option.text); - },this); - } - } - -}); - -}); diff --git a/lib/dijit/form/NumberSpinner.js.uncompressed.js b/lib/dijit/form/NumberSpinner.js.uncompressed.js deleted file mode 100644 index 87b417f40..000000000 --- a/lib/dijit/form/NumberSpinner.js.uncompressed.js +++ /dev/null @@ -1,69 +0,0 @@ -define("dijit/form/NumberSpinner", [ - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/keys", // keys.END keys.HOME - "./_Spinner", - "./NumberTextBox" -], function(declare, event, keys, _Spinner, NumberTextBox){ - -// module: -// dijit/form/NumberSpinner - - -return declare("dijit.form.NumberSpinner", [_Spinner, NumberTextBox.Mixin], { - // summary: - // Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value - // - // description: - // A `dijit/form/NumberTextBox` extension to provide keyboard accessible value selection - // as well as icons for spinning direction. When using the keyboard, the typematic rules - // apply, meaning holding the key will gradually increase or decrease the value and - // accelerate. - // - // example: - // | new NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput"); - - baseClass: "dijitTextBox dijitSpinner dijitNumberTextBox", - - adjust: function(/*Object*/ val, /*Number*/ delta){ - // summary: - // Change Number val by the given amount - // tags: - // protected - - var tc = this.constraints, - v = isNaN(val), - gotMax = !isNaN(tc.max), - gotMin = !isNaN(tc.min) - ; - if(v && delta != 0){ // blank or invalid value and they want to spin, so create defaults - val = (delta > 0) ? - gotMin ? tc.min : gotMax ? tc.max : 0 : - gotMax ? this.constraints.max : gotMin ? tc.min : 0 - ; - } - var newval = val + delta; - if(v || isNaN(newval)){ return val; } - if(gotMax && (newval > tc.max)){ - newval = tc.max; - } - if(gotMin && (newval < tc.min)){ - newval = tc.min; - } - return newval; - }, - - _onKeyPress: function(e){ - if((e.charOrCode == keys.HOME || e.charOrCode == keys.END) && !(e.ctrlKey || e.altKey || e.metaKey) - && typeof this.get('value') != 'undefined' /* gibberish, so HOME and END are default editing keys*/){ - var value = this.constraints[(e.charOrCode == keys.HOME ? "min" : "max")]; - if(typeof value == "number"){ - this._setValueAttr(value, false); - } - // eat home or end key whether we change the value or not - event.stop(e); - } - } -}); - -}); diff --git a/lib/dijit/form/NumberTextBox.js.uncompressed.js b/lib/dijit/form/NumberTextBox.js.uncompressed.js deleted file mode 100644 index 6a7b7a24f..000000000 --- a/lib/dijit/form/NumberTextBox.js.uncompressed.js +++ /dev/null @@ -1,275 +0,0 @@ -define("dijit/form/NumberTextBox", [ - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.hitch lang.mixin - "dojo/number", // number._realNumberRegexp number.format number.parse number.regexp - "./RangeBoundTextBox" -], function(declare, lang, number, RangeBoundTextBox){ - - // module: - // dijit/form/NumberTextBox - - - var NumberTextBoxMixin = declare("dijit.form.NumberTextBoxMixin", null, { - // summary: - // A mixin for all number textboxes - // tags: - // protected - - // Override ValidationTextBox.pattern.... we use a reg-ex generating function rather - // than a straight regexp to deal with locale (plus formatting options too?) - pattern: number.regexp, - - /*===== - // constraints: NumberTextBox.__Constraints - // Despite the name, this parameter specifies both constraints on the input - // (including minimum/maximum allowed values) as well as - // formatting options like places (the number of digits to display after - // the decimal point). - constraints: {}, - ======*/ - - // value: Number - // The value of this NumberTextBox as a Javascript Number (i.e., not a String). - // If the displayed value is blank, the value is NaN, and if the user types in - // an gibberish value (like "hello world"), the value is undefined - // (i.e. get('value') returns undefined). - // - // Symmetrically, set('value', NaN) will clear the displayed value, - // whereas set('value', undefined) will have no effect. - value: NaN, - - // editOptions: [protected] Object - // Properties to mix into constraints when the value is being edited. - // This is here because we edit the number in the format "12345", which is - // different than the display value (ex: "12,345") - editOptions: { pattern: '#.######' }, - - /*===== - _formatter: function(value, options){ - // summary: - // _formatter() is called by format(). It's the base routine for formatting a number, - // as a string, for example converting 12345 into "12,345". - // value: Number - // The number to be converted into a string. - // options: number.__FormatOptions? - // Formatting options - // tags: - // protected extension - - return "12345"; // String - }, - =====*/ - _formatter: number.format, - - postMixInProperties: function(){ - this.inherited(arguments); - this._set("type", "text"); // in case type="number" was specified which messes up parse/format - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - var places = typeof constraints.places == "number"? constraints.places : 0; - if(places){ places++; } // decimal rounding errors take away another digit of precision - if(typeof constraints.max != "number"){ - constraints.max = 9 * Math.pow(10, 15-places); - } - if(typeof constraints.min != "number"){ - constraints.min = -9 * Math.pow(10, 15-places); - } - this.inherited(arguments, [ constraints ]); - if(this.focusNode && this.focusNode.value && !isNaN(this.value)){ - this.set('value', this.value); - } - }, - - _onFocus: function(){ - if(this.disabled){ return; } - var val = this.get('value'); - if(typeof val == "number" && !isNaN(val)){ - var formattedValue = this.format(val, this.constraints); - if(formattedValue !== undefined){ - this.textbox.value = formattedValue; - } - } - this.inherited(arguments); - }, - - format: function(/*Number*/ value, /*number.__FormatOptions*/ constraints){ - // summary: - // Formats the value as a Number, according to constraints. - // tags: - // protected - - var formattedValue = String(value); - if(typeof value != "number"){ return formattedValue; } - if(isNaN(value)){ return ""; } - // check for exponential notation that dojo/number.format() chokes on - if(!("rangeCheck" in this && this.rangeCheck(value, constraints)) && constraints.exponent !== false && /\de[-+]?\d/i.test(formattedValue)){ - return formattedValue; - } - if(this.editOptions && this.focused){ - constraints = lang.mixin({}, constraints, this.editOptions); - } - return this._formatter(value, constraints); - }, - - /*===== - _parser: function(value, constraints){ - // summary: - // Parses the string value as a Number, according to constraints. - // value: String - // String representing a number - // constraints: number.__ParseOptions - // Formatting options - // tags: - // protected - - return 123.45; // Number - }, - =====*/ - _parser: number.parse, - - parse: function(/*String*/ value, /*number.__FormatOptions*/ constraints){ - // summary: - // Replaceable function to convert a formatted string to a number value - // tags: - // protected extension - - var v = this._parser(value, lang.mixin({}, constraints, (this.editOptions && this.focused) ? this.editOptions : {})); - if(this.editOptions && this.focused && isNaN(v)){ - v = this._parser(value, constraints); // parse w/o editOptions: not technically needed but is nice for the user - } - return v; - }, - - _getDisplayedValueAttr: function(){ - var v = this.inherited(arguments); - return isNaN(v) ? this.textbox.value : v; - }, - - filter: function(/*Number*/ value){ - // summary: - // This is called with both the display value (string), and the actual value (a number). - // When called with the actual value it does corrections so that '' etc. are represented as NaN. - // Otherwise it dispatches to the superclass's filter() method. - // - // See `dijit/form/TextBox.filter()` for more details. - return (value == null /* or undefined */ || value === '') ? NaN : this.inherited(arguments); // set('value', null||''||undefined) should fire onChange(NaN) - }, - - serialize: function(/*Number*/ value, /*Object?*/ options){ - // summary: - // Convert value (a Number) into a canonical string (ie, how the number literal is written in javascript/java/C/etc.) - // tags: - // protected - return (typeof value != "number" || isNaN(value)) ? '' : this.inherited(arguments); - }, - - _setBlurValue: function(){ - var val = lang.hitch(lang.mixin({}, this, { focused: true }), "get")('value'); // parse with editOptions - this._setValueAttr(val, true); - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Hook so set('value', ...) works. - if(value !== undefined && formattedValue === undefined){ - formattedValue = String(value); - if(typeof value == "number"){ - if(isNaN(value)){ formattedValue = '' } - // check for exponential notation that number.format chokes on - else if(("rangeCheck" in this && this.rangeCheck(value, this.constraints)) || this.constraints.exponent === false || !/\de[-+]?\d/i.test(formattedValue)){ - formattedValue = undefined; // lets format compute a real string value - } - }else if(!value){ // 0 processed in if branch above, ''|null|undefined flows through here - formattedValue = ''; - value = NaN; - }else{ // non-numeric values - value = undefined; - } - } - this.inherited(arguments, [value, priorityChange, formattedValue]); - }, - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works. - // Returns Number, NaN for '', or undefined for unparseable text - var v = this.inherited(arguments); // returns Number for all values accepted by parse() or NaN for all other displayed values - - // If the displayed value of the textbox is gibberish (ex: "hello world"), this.inherited() above - // returns NaN; this if() branch converts the return value to undefined. - // Returning undefined prevents user text from being overwritten when doing _setValueAttr(_getValueAttr()). - // A blank displayed value is still returned as NaN. - if(isNaN(v) && this.textbox.value !== ''){ - if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value) && (new RegExp("^"+number._realNumberRegexp(lang.mixin({}, this.constraints))+"$").test(this.textbox.value))){ // check for exponential notation that parse() rejected (erroneously?) - var n = Number(this.textbox.value); - return isNaN(n) ? undefined : n; // return exponential Number or undefined for random text (may not be possible to do with the above RegExp check) - }else{ - return undefined; // gibberish - } - }else{ - return v; // Number or NaN for '' - } - }, - - isValid: function(/*Boolean*/ isFocused){ - // Overrides dijit/form/RangeBoundTextBox.isValid() to check that the editing-mode value is valid since - // it may not be formatted according to the regExp validation rules - if(!this.focused || this._isEmpty(this.textbox.value)){ - return this.inherited(arguments); - }else{ - var v = this.get('value'); - if(!isNaN(v) && this.rangeCheck(v, this.constraints)){ - if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value)){ // exponential, parse doesn't like it - return true; // valid exponential number in range - }else{ - return this.inherited(arguments); - } - }else{ - return false; - } - } - } - }); - - var NumberTextBox = declare("dijit.form.NumberTextBox", [RangeBoundTextBox, NumberTextBoxMixin], { - // summary: - // A TextBox for entering numbers, with formatting and range checking - // description: - // NumberTextBox is a textbox for entering and displaying numbers, supporting - // the following main features: - // - // 1. Enforce minimum/maximum allowed values (as well as enforcing that the user types - // a number rather than a random string) - // 2. NLS support (altering roles of comma and dot as "thousands-separator" and "decimal-point" - // depending on locale). - // 3. Separate modes for editing the value and displaying it, specifically that - // the thousands separator character (typically comma) disappears when editing - // but reappears after the field is blurred. - // 4. Formatting and constraints regarding the number of places (digits after the decimal point) - // allowed on input, and number of places displayed when blurred (see `constraints` parameter). - - baseClass: "dijitTextBox dijitNumberTextBox" - }); - - NumberTextBox.Mixin = NumberTextBoxMixin; // for monkey patching - - /*===== - NumberTextBox.__Constraints = declare([RangeBoundTextBox.__Constraints, number.__FormatOptions, number.__ParseOptions], { - // summary: - // Specifies both the rules on valid/invalid values (minimum, maximum, - // number of required decimal places), and also formatting options for - // displaying the value when the field is not focused. - // example: - // Minimum/maximum: - // To specify a field between 0 and 120: - // | {min:0,max:120} - // To specify a field that must be an integer: - // | {fractional:false} - // To specify a field where 0 to 3 decimal places are allowed on input: - // | {places:'0,3'} - }); - =====*/ - - return NumberTextBox; -}); diff --git a/lib/dijit/form/RadioButton.js.uncompressed.js b/lib/dijit/form/RadioButton.js.uncompressed.js deleted file mode 100644 index a7f723bd0..000000000 --- a/lib/dijit/form/RadioButton.js.uncompressed.js +++ /dev/null @@ -1,16 +0,0 @@ -define("dijit/form/RadioButton", [ - "dojo/_base/declare", // declare - "./CheckBox", - "./_RadioButtonMixin" -], function(declare, CheckBox, _RadioButtonMixin){ - - // module: - // dijit/form/RadioButton - - return declare("dijit.form.RadioButton", [CheckBox, _RadioButtonMixin], { - // summary: - // Same as an HTML radio, but with fancy styling. - - baseClass: "dijitRadio" - }); -}); diff --git a/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js deleted file mode 100644 index f617df512..000000000 --- a/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js +++ /dev/null @@ -1,110 +0,0 @@ -define("dijit/form/RangeBoundTextBox", [ - "dojo/_base/declare", // declare - "dojo/i18n", // i18n.getLocalization - "./MappedTextBox" -], function(declare, i18n, MappedTextBox){ - - // module: - // dijit/form/RangeBoundTextBox - - - var RangeBoundTextBox = declare("dijit.form.RangeBoundTextBox", MappedTextBox, { - // summary: - // Base class for textbox form widgets which defines a range of valid values. - - // rangeMessage: String - // The message to display if value is out-of-range - rangeMessage: "", - - /*===== - // constraints: RangeBoundTextBox.__Constraints - constraints: {}, - ======*/ - - rangeCheck: function(/*Number*/ primitive, /*dijit/form/RangeBoundTextBox.__Constraints*/ constraints){ - // summary: - // Overridable function used to validate the range of the numeric input value. - // tags: - // protected - return ("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) && - ("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean - }, - - isInRange: function(/*Boolean*/ /*===== isFocused =====*/){ - // summary: - // Tests if the value is in the min/max range specified in constraints - // tags: - // protected - return this.rangeCheck(this.get('value'), this.constraints); - }, - - _isDefinitelyOutOfRange: function(){ - // summary: - // Returns true if the value is out of range and will remain - // out of range even if the user types more characters - var val = this.get('value'); - if(val == null){ return false; } // not yet valid enough to compare to - var outOfRange = false; - if("min" in this.constraints){ - var min = this.constraints.min; - outOfRange = this.compare(val, ((typeof min == "number") && min >= 0 && val != 0) ? 0 : min) < 0; - } - if(!outOfRange && ("max" in this.constraints)){ - var max = this.constraints.max; - outOfRange = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0) > 0; - } - return outOfRange; - }, - - _isValidSubset: function(){ - // summary: - // Overrides `dijit/form/ValidationTextBox._isValidSubset()`. - // Returns true if the input is syntactically valid, and either within - // range or could be made in range by more typing. - return this.inherited(arguments) && !this._isDefinitelyOutOfRange(); - }, - - isValid: function(/*Boolean*/ isFocused){ - // Overrides dijit/form/ValidationTextBox.isValid() to check that the value is also in range. - return this.inherited(arguments) && - ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean - }, - - getErrorMessage: function(/*Boolean*/ isFocused){ - // Overrides dijit/form/ValidationTextBox.getErrorMessage() to print "out of range" message if appropriate - var v = this.get('value'); - if(v != null /* and !undefined */ && v !== '' && (typeof v != "number" || !isNaN(v)) && !this.isInRange(isFocused)){ // don't check isInRange w/o a real value - return this.rangeMessage; // String - } - return this.inherited(arguments); - }, - - postMixInProperties: function(){ - this.inherited(arguments); - if(!this.rangeMessage){ - this.messages = i18n.getLocalization("dijit.form", "validate", this.lang); - this.rangeMessage = this.messages.rangeMessage; - } - }, - - applyTextDir: function(/*===== element, text =====*/){ - // summary: - // The function overridden in the _BidiSupport module, - // originally used for setting element.dir according to this.textDir. - // In this case does nothing. - // element: Object - // text: String - // tags: - // protected. - } - }); - /*===== - RangeBoundTextBox.__Constraints = declare(null, { - // min: Number - // Minimum signed value. Default is -Infinity - // max: Number - // Maximum signed value. Default is +Infinity - }); - =====*/ - return RangeBoundTextBox; -}); diff --git a/lib/dijit/form/Select.js.uncompressed.js b/lib/dijit/form/Select.js.uncompressed.js deleted file mode 100644 index 43c45960a..000000000 --- a/lib/dijit/form/Select.js.uncompressed.js +++ /dev/null @@ -1,406 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/Select.html':"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdata-dojo-attach-point=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"listbox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitInputField dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitValidationContainer\"\n\t\t\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t/></div\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td\n\t\t><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer\"\n\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\n\t\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t${_buttonInputDisabled}\n\t\t/></td\n\t></tr></tbody\n></table>\n"}}); -define("dijit/form/Select", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/dom-class", // domClass.add domClass.remove domClass.toggle - "dojo/dom-geometry", // domGeometry.setMarginBox - "dojo/_base/event", // event.stop - "dojo/i18n", // i18n.getLocalization - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("ie") - "./_FormSelectWidget", - "../_HasDropDown", - "../Menu", - "../MenuItem", - "../MenuSeparator", - "../Tooltip", - "dojo/text!./templates/Select.html", - "dojo/i18n!./nls/validate" -], function(array, declare, domAttr, domClass, domGeometry, event, i18n, lang, has, - _FormSelectWidget, _HasDropDown, Menu, MenuItem, MenuSeparator, Tooltip, template){ - -// module: -// dijit/form/Select - - -var _SelectMenu = declare("dijit.form._SelectMenu", Menu, { - // summary: - // An internally-used menu for dropdown that allows us a vertical scrollbar - - // Override Menu.autoFocus setting so that opening a Select highlights the current value. - autoFocus: true, - - buildRendering: function(){ - // summary: - // Stub in our own changes, so that our domNode is not a table - // otherwise, we won't respond correctly to heights/overflows - this.inherited(arguments); - var o = (this.menuTableNode = this.domNode); - var n = (this.domNode = this.ownerDocument.createElement("div")); - n.style.cssText = "overflow-x: hidden; overflow-y: scroll"; - if(o.parentNode){ - o.parentNode.replaceChild(n, o); - } - domClass.remove(o, "dijitMenuTable"); - n.className = o.className + " dijitSelectMenu"; - o.className = "dijitReset dijitMenuTable"; - o.setAttribute("role", "listbox"); - n.setAttribute("role", "presentation"); - n.appendChild(o); - }, - - postCreate: function(){ - // summary: - // stop mousemove from selecting text on IE to be consistent with other browsers - - this.inherited(arguments); - - this.connect(this.domNode, "onselectstart", event.stop); - }, - - - focus: function(){ - // summary: - // Overridden so that the previously selected value will be focused instead of only the first item - var found = false, - val = this.parentWidget.value; - if(lang.isArray(val)){ - val = val[val.length-1]; - } - if(val){ // if focus selected - array.forEach(this.parentWidget._getChildren(), function(child){ - if(child.option && (val === child.option.value)){ // find menu item widget with this value - found = true; - this.focusChild(child, false); // focus previous selection - } - }, this); - } - if(!found){ - this.inherited(arguments); // focus first item by default - } - }, - - resize: function(/*Object*/ mb){ - // summary: - // Overridden so that we are able to handle resizing our - // internal widget. Note that this is not a "full" resize - // implementation - it only works correctly if you pass it a - // marginBox. - // - // mb: Object - // The margin box to set this dropdown to. - if(mb){ - domGeometry.setMarginBox(this.domNode, mb); - if("w" in mb){ - // We've explicitly set the wrapper <div>'s width, so set <table> width to match. - // 100% is safer than a pixel value because there may be a scroll bar with - // browser/OS specific width. - this.menuTableNode.style.width = "100%"; - } - } - } -}); - -var Select = declare("dijit.form.Select", [_FormSelectWidget, _HasDropDown], { - // summary: - // This is a "styleable" select box - it is basically a DropDownButton which - // can take a `<select>` as its input. - - baseClass: "dijitSelect dijitValidationTextBox", - - templateString: template, - - _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events - - // required: Boolean - // Can be true or false, default is false. - required: false, - - // state: [readonly] String - // "Incomplete" if this select is required but unset (i.e. blank value), "" otherwise - state: "", - - // message: String - // Currently displayed error/prompt message - message: "", - - // tooltipPosition: String[] - // See description of `dijit/Tooltip.defaultPosition` for details on this parameter. - tooltipPosition: [], - - // emptyLabel: string - // What to display in an "empty" dropdown - emptyLabel: " ", // - - // _isLoaded: Boolean - // Whether or not we have been loaded - _isLoaded: false, - - // _childrenLoaded: Boolean - // Whether or not our children have been loaded - _childrenLoaded: false, - - _fillContent: function(){ - // summary: - // Set the value to be the first, or the selected index - this.inherited(arguments); - // set value from selected option - if(this.options.length && !this.value && this.srcNodeRef){ - var si = this.srcNodeRef.selectedIndex || 0; // || 0 needed for when srcNodeRef is not a SELECT - this.value = this.options[si >= 0 ? si : 0].value; - } - // Create the dropDown widget - this.dropDown = new _SelectMenu({ id: this.id + "_menu", parentWidget: this }); - domClass.add(this.dropDown.domNode, this.baseClass.replace(/\s+|$/g, "Menu ")); - }, - - _getMenuItemForOption: function(/*_FormSelectWidget.__SelectOption*/ option){ - // summary: - // For the given option, return the menu item that should be - // used to display it. This can be overridden as needed - if(!option.value && !option.label){ - // We are a separator (no label set for it) - return new MenuSeparator({ownerDocument: this.ownerDocument}); - }else{ - // Just a regular menu option - var click = lang.hitch(this, "_setValueAttr", option); - var item = new MenuItem({ - option: option, - label: option.label || this.emptyLabel, - onClick: click, - ownerDocument: this.ownerDocument, - dir: this.dir, - disabled: option.disabled || false - }); - item.focusNode.setAttribute("role", "option"); - return item; - } - }, - - _addOptionItem: function(/*_FormSelectWidget.__SelectOption*/ option){ - // summary: - // For the given option, add an option to our dropdown. - // If the option doesn't have a value, then a separator is added - // in that place. - if(this.dropDown){ - this.dropDown.addChild(this._getMenuItemForOption(option)); - } - }, - - _getChildren: function(){ - if(!this.dropDown){ - return []; - } - return this.dropDown.getChildren(); - }, - - _loadChildren: function(/*Boolean*/ loadMenuItems){ - // summary: - // Resets the menu and the length attribute of the button - and - // ensures that the label is appropriately set. - // loadMenuItems: Boolean - // actually loads the child menu items - we only do this when we are - // populating for showing the dropdown. - - if(loadMenuItems === true){ - // this.inherited destroys this.dropDown's child widgets (MenuItems). - // Avoid this.dropDown (Menu widget) having a pointer to a destroyed widget (which will cause - // issues later in _setSelected). (see #10296) - if(this.dropDown){ - delete this.dropDown.focusedChild; - } - if(this.options.length){ - this.inherited(arguments); - }else{ - // Drop down menu is blank but add one blank entry just so something appears on the screen - // to let users know that they are no choices (mimicing native select behavior) - array.forEach(this._getChildren(), function(child){ child.destroyRecursive(); }); - var item = new MenuItem({ - ownerDocument: this.ownerDocument, - label: this.emptyLabel - }); - this.dropDown.addChild(item); - } - }else{ - this._updateSelection(); - } - - this._isLoaded = false; - this._childrenLoaded = true; - - if(!this._loadingStore){ - // Don't call this if we are loading - since we will handle it later - this._setValueAttr(this.value, false); - } - }, - - _refreshState: function(){ - if(this._started){ - this.validate(this.focused); - } - }, - - startup: function(){ - this.inherited(arguments); - this._refreshState(); // after all _set* methods have run - }, - - _setValueAttr: function(value){ - this.inherited(arguments); - domAttr.set(this.valueNode, "value", this.get("value")); - this._refreshState(); // to update this.state - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - this.inherited(arguments); - this._refreshState(); // to update this.state - }, - - _setRequiredAttr: function(/*Boolean*/ value){ - this._set("required", value); - this.focusNode.setAttribute("aria-required", value); - this._refreshState(); // to update this.state - }, - - _setOptionsAttr: function(/*Array*/ options){ - this._isLoaded = false; - this._set('options', options); - }, - - _setDisplay: function(/*String*/ newDisplay){ - // summary: - // sets the display for the given value (or values) - var lbl = newDisplay || this.emptyLabel; - this.containerNode.innerHTML = '<span role="option" class="dijitReset dijitInline ' + this.baseClass.replace(/\s+|$/g, "Label ")+'">' + lbl + '</span>'; - }, - - validate: function(/*Boolean*/ isFocused){ - // summary: - // Called by oninit, onblur, and onkeypress, and whenever required/disabled state changes - // description: - // Show missing or invalid messages if appropriate, and highlight textbox field. - // Used when a select is initially set to no value and the user is required to - // set the value. - - var isValid = this.disabled || this.isValid(isFocused); - this._set("state", isValid ? "" : (this._hasBeenBlurred ? "Error" : "Incomplete")); - this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true"); - var message = isValid ? "" : this._missingMsg; - if(message && this.focused && this._hasBeenBlurred){ - Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); - }else{ - Tooltip.hide(this.domNode); - } - this._set("message", message); - return isValid; - }, - - isValid: function(/*Boolean*/ /*===== isFocused =====*/){ - // summary: - // Whether or not this is a valid value. The only way a Select - // can be invalid is when it's required but nothing is selected. - return (!this.required || this.value === 0 || !(/^\s*$/.test(this.value || ""))); // handle value is null or undefined - }, - - reset: function(){ - // summary: - // Overridden so that the state will be cleared. - this.inherited(arguments); - Tooltip.hide(this.domNode); - this._refreshState(); // to update this.state - }, - - postMixInProperties: function(){ - // summary: - // set the missing message - this.inherited(arguments); - this._missingMsg = i18n.getLocalization("dijit.form", "validate", this.lang).missingMessage; - }, - - postCreate: function(){ - // summary: - // stop mousemove from selecting text on IE to be consistent with other browsers - - this.inherited(arguments); - - this.connect(this.domNode, "onselectstart", event.stop); - this.domNode.setAttribute("aria-expanded", "false"); - - if(has("ie") < 9){ - // IE INPUT tag fontFamily has to be set directly using STYLE - // the defer gives IE a chance to render the TextBox and to deal with font inheritance - this.defer(function(){ - try{ - var s = domStyle.getComputedStyle(this.domNode); // can throw an exception if widget is immediately destroyed - if(s){ - var ff = s.fontFamily; - if(ff){ - var inputs = this.domNode.getElementsByTagName("INPUT"); - if(inputs){ - for(var i=0; i < inputs.length; i++){ - inputs[i].style.fontFamily = ff; - } - } - } - } - }catch(e){/*when used in a Dialog, and this is called before the dialog is - shown, s.fontFamily would trigger "Invalid Argument" error.*/} - }); - } - }, - - _setStyleAttr: function(/*String||Object*/ value){ - this.inherited(arguments); - domClass.toggle(this.domNode, this.baseClass.replace(/\s+|$/g, "FixedWidth "), !!this.domNode.style.width); - }, - - isLoaded: function(){ - return this._isLoaded; - }, - - loadDropDown: function(/*Function*/ loadCallback){ - // summary: - // populates the menu - this._loadChildren(true); - this._isLoaded = true; - loadCallback(); - }, - - closeDropDown: function(){ - // overriding _HasDropDown.closeDropDown() - this.inherited(arguments); - - if(this.dropDown && this.dropDown.menuTableNode){ - // Erase possible width: 100% setting from _SelectMenu.resize(). - // Leaving it would interfere with the next openDropDown() call, which - // queries the natural size of the drop down. - this.dropDown.menuTableNode.style.width = ""; - } - }, - - destroy: function(preserveDom){ - if(this.dropDown && !this.dropDown._destroyed){ - this.dropDown.destroyRecursive(preserveDom); - delete this.dropDown; - } - this.inherited(arguments); - }, - - _onFocus: function(){ - this.validate(true); // show tooltip if second focus of required tooltip, but no selection - this.inherited(arguments); - }, - - _onBlur: function(){ - Tooltip.hide(this.domNode); - this.inherited(arguments); - this.validate(false); - } -}); - -Select._Menu = _SelectMenu; // for monkey patching - -return Select; -}); diff --git a/lib/dijit/form/SimpleTextarea.js.uncompressed.js b/lib/dijit/form/SimpleTextarea.js.uncompressed.js deleted file mode 100644 index f3a9cf2e8..000000000 --- a/lib/dijit/form/SimpleTextarea.js.uncompressed.js +++ /dev/null @@ -1,92 +0,0 @@ -define("dijit/form/SimpleTextarea", [ - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add - "dojo/sniff", // has("ie") has("opera") - "./TextBox" -], function(declare, domClass, has, TextBox){ - -// module: -// dijit/form/SimpleTextarea - - -return declare("dijit.form.SimpleTextarea", TextBox, { - // summary: - // A simple textarea that degrades, and responds to - // minimal LayoutContainer usage, and works with dijit/form/Form. - // Doesn't automatically size according to input, like Textarea. - // - // example: - // | <textarea data-dojo-type="dijit/form/SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea> - // - // example: - // | new SimpleTextarea({ rows:20, cols:30 }, "foo"); - - baseClass: "dijitTextBox dijitTextArea", - - // rows: Number - // The number of rows of text. - rows: "3", - - // rows: Number - // The number of characters per line. - cols: "20", - - templateString: "<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>", - - postMixInProperties: function(){ - // Copy value from srcNodeRef, unless user specified a value explicitly (or there is no srcNodeRef) - // TODO: parser will handle this in 2.0 - if(!this.value && this.srcNodeRef){ - this.value = this.srcNodeRef.value; - } - this.inherited(arguments); - }, - - buildRendering: function(){ - this.inherited(arguments); - if(has("ie") && this.cols){ // attribute selectors is not supported in IE6 - domClass.add(this.textbox, "dijitTextAreaCols"); - } - }, - - filter: function(/*String*/ value){ - // Override TextBox.filter to deal with newlines... specifically (IIRC) this is for IE which writes newlines - // as \r\n instead of just \n - if(value){ - value = value.replace(/\r/g,""); - } - return this.inherited(arguments); - }, - - _onInput: function(/*Event?*/ e){ - // Override TextBox._onInput() to enforce maxLength restriction - if(this.maxLength){ - var maxLength = parseInt(this.maxLength); - var value = this.textbox.value.replace(/\r/g,''); - var overflow = value.length - maxLength; - if(overflow > 0){ - var textarea = this.textbox; - if(textarea.selectionStart){ - var pos = textarea.selectionStart; - var cr = 0; - if(has("opera")){ - cr = (this.textbox.value.substring(0,pos).match(/\r/g) || []).length; - } - this.textbox.value = value.substring(0,pos-overflow-cr)+value.substring(pos-cr); - textarea.setSelectionRange(pos-overflow, pos-overflow); - }else if(this.ownerDocument.selection){ //IE - textarea.focus(); - var range = this.ownerDocument.selection.createRange(); - // delete overflow characters - range.moveStart("character", -overflow); - range.text = ''; - // show cursor - range.select(); - } - } - } - this.inherited(arguments); - } -}); - -}); diff --git a/lib/dijit/form/Slider.js.uncompressed.js b/lib/dijit/form/Slider.js.uncompressed.js deleted file mode 100644 index 1fb7bdfcf..000000000 --- a/lib/dijit/form/Slider.js.uncompressed.js +++ /dev/null @@ -1,23 +0,0 @@ -define("dijit/form/Slider", [ - "dojo/_base/kernel", // kernel.deprecated - "./HorizontalSlider", - "./VerticalSlider", - "./HorizontalRule", - "./VerticalRule", - "./HorizontalRuleLabels", - "./VerticalRuleLabels" -], function(kernel){ - - // module: - // dijit/form/Slider - - kernel.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself", "", "2.0"); - - /*===== - return { - // summary: - // Rollup of all the the Slider related widgets - // For back-compat, remove for 2.0 - }; - =====*/ -}); diff --git a/lib/dijit/form/TextBox.js.uncompressed.js b/lib/dijit/form/TextBox.js.uncompressed.js deleted file mode 100644 index 656a1ac14..000000000 --- a/lib/dijit/form/TextBox.js.uncompressed.js +++ /dev/null @@ -1,157 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/TextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}}); -define("dijit/form/TextBox", [ - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.create - "dojo/dom-style", // domStyle.getComputedStyle - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("ie") has("mozilla") - "./_FormValueWidget", - "./_TextBoxMixin", - "dojo/text!./templates/TextBox.html", - "../main" // to export dijit._setSelectionRange, remove in 2.0 -], function(declare, domConstruct, domStyle, kernel, lang, has, - _FormValueWidget, _TextBoxMixin, template, dijit){ - - // module: - // dijit/form/TextBox - - var TextBox = declare("dijit.form.TextBox", [_FormValueWidget, _TextBoxMixin], { - // summary: - // A base class for textbox form inputs - - templateString: template, - _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" data-dojo-attach-point="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />', - - _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events - - baseClass: "dijitTextBox", - - postMixInProperties: function(){ - var type = this.type.toLowerCase(); - if(this.templateString && this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == this.constructor.prototype.templateString)){ - this.templateString = this._singleNodeTemplate; - } - this.inherited(arguments); - }, - - postCreate: function(){ - this.inherited(arguments); - - if(has("ie") < 9){ - // IE INPUT tag fontFamily has to be set directly using STYLE - // the defer gives IE a chance to render the TextBox and to deal with font inheritance - this.defer(function(){ - try{ - var s = domStyle.getComputedStyle(this.domNode); // can throw an exception if widget is immediately destroyed - if(s){ - var ff = s.fontFamily; - if(ff){ - var inputs = this.domNode.getElementsByTagName("INPUT"); - if(inputs){ - for(var i=0; i < inputs.length; i++){ - inputs[i].style.fontFamily = ff; - } - } - } - } - }catch(e){/*when used in a Dialog, and this is called before the dialog is - shown, s.fontFamily would trigger "Invalid Argument" error.*/} - }); - } - }, - - _onInput: function(e){ - this.inherited(arguments); - if(this.intermediateChanges){ // _TextBoxMixin uses onInput - // allow the key to post to the widget input box - this.defer(function(){ this._handleOnChange(this.get('value'), false); }); - } - }, - - _setPlaceHolderAttr: function(v){ - this._set("placeHolder", v); - if(!this._phspan){ - this._attachPoints.push('_phspan'); - // dijitInputField class gives placeHolder same padding as the input field - // parent node already has dijitInputField class but it doesn't affect this <span> - // since it's position: absolute. - this._phspan = domConstruct.create('span',{ onmousedown:function(e){ e.preventDefault(); }, className:'dijitPlaceHolder dijitInputField'},this.textbox,'after'); - } - this._phspan.innerHTML=""; - this._phspan.appendChild(this._phspan.ownerDocument.createTextNode(v)); - this._updatePlaceHolder(); - }, - - _updatePlaceHolder: function(){ - if(this._phspan){ - this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none"; - } - }, - - _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - this.inherited(arguments); - this._updatePlaceHolder(); - }, - - getDisplayedValue: function(){ - // summary: - // Deprecated. Use get('displayedValue') instead. - // tags: - // deprecated - kernel.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use get('displayedValue') instead.", "", "2.0"); - return this.get('displayedValue'); - }, - - setDisplayedValue: function(/*String*/ value){ - // summary: - // Deprecated. Use set('displayedValue', ...) instead. - // tags: - // deprecated - kernel.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.", "", "2.0"); - this.set('displayedValue', value); - }, - - _onBlur: function(e){ - if(this.disabled){ return; } - this.inherited(arguments); - this._updatePlaceHolder(); - - if(has("mozilla")){ - if(this.selectOnClick){ - // clear selection so that the next mouse click doesn't reselect - this.textbox.selectionStart = this.textbox.selectionEnd = undefined; - } - } - }, - - _onFocus: function(/*String*/ by){ - if(this.disabled || this.readOnly){ return; } - this.inherited(arguments); - this._updatePlaceHolder(); - } - }); - - if(has("ie")){ - TextBox.prototype._isTextSelected = function(){ - var range = this.ownerDocument.selection.createRange(); - var parent = range.parentElement(); - return parent == this.textbox && range.text.length > 0; - }; - - // Overrides definition of _setSelectionRange from _TextBoxMixin (TODO: move to _TextBoxMixin.js?) - dijit._setSelectionRange = _TextBoxMixin._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ - if(element.createTextRange){ - var r = element.createTextRange(); - r.collapse(true); - r.moveStart("character", -99999); // move to 0 - r.moveStart("character", start); // delta from 0 is the correct position - r.moveEnd("character", stop-start); - r.select(); - } - } - } - - return TextBox; -}); diff --git a/lib/dijit/form/Textarea.js.uncompressed.js b/lib/dijit/form/Textarea.js.uncompressed.js deleted file mode 100644 index c3c738bdd..000000000 --- a/lib/dijit/form/Textarea.js.uncompressed.js +++ /dev/null @@ -1,42 +0,0 @@ -define("dijit/form/Textarea", [ - "dojo/_base/declare", // declare - "dojo/dom-style", // domStyle.set - "./_ExpandingTextAreaMixin", - "./SimpleTextarea" -], function(declare, domStyle, _ExpandingTextAreaMixin, SimpleTextarea){ - -// module: -// dijit/form/Textarea - - -return declare("dijit.form.Textarea", [SimpleTextarea, _ExpandingTextAreaMixin], { - // summary: - // A textarea widget that adjusts it's height according to the amount of data. - // - // description: - // A textarea that dynamically expands/contracts (changing it's height) as - // the user types, to display all the text without requiring a scroll bar. - // - // Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes. - // Rows is not supported since this widget adjusts the height. - // - // example: - // | <textarea data-dojo-type="dijit/form/TextArea">...</textarea> - - - // TODO: for 2.0, rename this to ExpandingTextArea, and rename SimpleTextarea to TextArea - - baseClass: "dijitTextBox dijitTextArea dijitExpandingTextArea", - - // Override SimpleTextArea.cols to default to width:100%, for backward compatibility - cols: "", - - buildRendering: function(){ - this.inherited(arguments); - - // tweak textarea style to reduce browser differences - domStyle.set(this.textbox, { overflowY: 'hidden', overflowX: 'auto', boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' }); - } -}); - -}); diff --git a/lib/dijit/form/TimeTextBox.js.uncompressed.js b/lib/dijit/form/TimeTextBox.js.uncompressed.js deleted file mode 100644 index ba81e1acd..000000000 --- a/lib/dijit/form/TimeTextBox.js.uncompressed.js +++ /dev/null @@ -1,79 +0,0 @@ -define("dijit/form/TimeTextBox", [ - "dojo/_base/declare", // declare - "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE keys.TAB keys.UP_ARROW - "dojo/_base/lang", // lang.hitch - "../_TimePicker", - "./_DateTimeTextBox" -], function(declare, keys, lang, _TimePicker, _DateTimeTextBox){ - - // module: - // dijit/form/TimeTextBox - - - /*===== - var __Constraints = declare([_DateTimeTextBox.__Constraints, _TimePicker.__Constraints], { - }); - =====*/ - - return declare("dijit.form.TimeTextBox", _DateTimeTextBox, { - // summary: - // A validating, serializable, range-bound time text box with a drop down time picker - - baseClass: "dijitTextBox dijitComboBox dijitTimeTextBox", - popupClass: _TimePicker, - _selector: "time", - -/*===== - // constraints: __Constraints - constraints:{}, -=====*/ - - // value: Date - // The value of this widget as a JavaScript Date object. Note that the date portion implies time zone and daylight savings rules. - // - // Example: - // | new dijit/form/TimeTextBox({value: stamp.fromISOString("T12:59:59", new Date())}) - // - // When passed to the parser in markup, must be specified according to locale-independent - // `stamp.fromISOString` format. - // - // Example: - // | <input data-dojo-type='dijit/form/TimeTextBox' value='T12:34:00'> - value: new Date(""), // value.toString()="NaN" - //FIXME: in markup, you have no control over daylight savings - - _onKey: function(evt){ - if(this.disabled || this.readOnly){ return; } - this.inherited(arguments); - - // If the user has backspaced or typed some numbers, then filter the result list - // by what they typed. Maybe there's a better way to detect this, like _handleOnChange()? - switch(evt.keyCode){ - case keys.ENTER: - case keys.TAB: - case keys.ESCAPE: - case keys.DOWN_ARROW: - case keys.UP_ARROW: - // these keys have special meaning - break; - default: - // defer() because the keystroke hasn't yet appeared in the <input>, - // so the get('displayedValue') call below won't give the result we want. - this.defer(function(){ - // set this.filterString to the filter to apply to the drop down list; - // it will be used in openDropDown() - var val = this.get('displayedValue'); - this.filterString = (val && !this.parse(val, this.constraints)) ? val.toLowerCase() : ""; - - // close the drop down and reopen it, in order to filter the items shown in the list - // and also since the drop down may need to be repositioned if the number of list items has changed - // and it's being displayed above the <input> - if(this._opened){ - this.closeDropDown(); - } - this.openDropDown(); - }); - } - } - }); -}); diff --git a/lib/dijit/form/ToggleButton.js.uncompressed.js b/lib/dijit/form/ToggleButton.js.uncompressed.js deleted file mode 100644 index 5cffd4f78..000000000 --- a/lib/dijit/form/ToggleButton.js.uncompressed.js +++ /dev/null @@ -1,26 +0,0 @@ -define("dijit/form/ToggleButton", [ - "dojo/_base/declare", // declare - "dojo/_base/kernel", // kernel.deprecated - "./Button", - "./_ToggleButtonMixin" -], function(declare, kernel, Button, _ToggleButtonMixin){ - - // module: - // dijit/form/ToggleButton - - - return declare("dijit.form.ToggleButton", [Button, _ToggleButtonMixin], { - // summary: - // A templated button widget that can be in two states (checked or not). - // Can be base class for things like tabs or checkbox or radio buttons. - - baseClass: "dijitToggleButton", - - setChecked: function(/*Boolean*/ checked){ - // summary: - // Deprecated. Use set('checked', true/false) instead. - kernel.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0"); - this.set('checked', checked); - } - }); -}); diff --git a/lib/dijit/form/ValidationTextBox.js.uncompressed.js b/lib/dijit/form/ValidationTextBox.js.uncompressed.js deleted file mode 100644 index b03b29ac2..000000000 --- a/lib/dijit/form/ValidationTextBox.js.uncompressed.js +++ /dev/null @@ -1,332 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/ValidationTextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}}); -define("dijit/form/ValidationTextBox", [ - "dojo/_base/declare", // declare - "dojo/_base/kernel", // kernel.deprecated - "dojo/i18n", // i18n.getLocalization - "./TextBox", - "../Tooltip", - "dojo/text!./templates/ValidationTextBox.html", - "dojo/i18n!./nls/validate" -], function(declare, kernel, i18n, TextBox, Tooltip, template){ - - // module: - // dijit/form/ValidationTextBox - - - /*===== - var __Constraints = { - // locale: String - // locale used for validation, picks up value from this widget's lang attribute - // _flags_: anything - // various flags passed to pattern function - }; - =====*/ - - var ValidationTextBox; - return ValidationTextBox = declare("dijit.form.ValidationTextBox", TextBox, { - // summary: - // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. - - templateString: template, - - // required: Boolean - // User is required to enter data into this field. - required: false, - - // promptMessage: String - // If defined, display this hint string immediately on focus to the textbox, if empty. - // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). - // Think of this like a tooltip that tells the user what to do, not an error message - // that tells the user what they've done wrong. - // - // Message disappears when user starts typing. - promptMessage: "", - - // invalidMessage: String - // The message to display if value is invalid. - // The translated string value is read from the message file by default. - // Set to "" to use the promptMessage instead. - invalidMessage: "$_unset_$", - - // missingMessage: String - // The message to display if value is empty and the field is required. - // The translated string value is read from the message file by default. - // Set to "" to use the invalidMessage instead. - missingMessage: "$_unset_$", - - // message: String - // Currently error/prompt message. - // When using the default tooltip implementation, this will only be - // displayed when the field is focused. - message: "", - - // constraints: __Constraints - // user-defined object needed to pass parameters to the validator functions - constraints: {}, - - // pattern: [extension protected] String|Function(constraints) returning a string. - // This defines the regular expression used to validate the input. - // Do not add leading ^ or $ characters since the widget adds these. - // A function may be used to generate a valid pattern when dependent on constraints or other runtime factors. - // set('pattern', String|Function). - pattern: ".*", - - // regExp: Deprecated [extension protected] String. Use "pattern" instead. - regExp: "", - - regExpGen: function(/*__Constraints*/ /*===== constraints =====*/){ - // summary: - // Deprecated. Use set('pattern', Function) instead. - }, - - // state: [readonly] String - // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) - state: "", - - // tooltipPosition: String[] - // See description of `dijit/Tooltip.defaultPosition` for details on this parameter. - tooltipPosition: [], - - _deprecateRegExp: function(attr, value){ - if(value != ValidationTextBox.prototype[attr]){ - kernel.deprecated("ValidationTextBox id="+this.id+", set('" + attr + "', ...) is deprecated. Use set('pattern', ...) instead.", "", "2.0"); - this.set('pattern', value); - } - }, - _setRegExpGenAttr: function(/*Function*/ newFcn){ - this._deprecateRegExp("regExpGen", newFcn); - this.regExpGen = this._getPatternAttr; // backward compat with this.regExpGen(this.constraints) - }, - _setRegExpAttr: function(/*String*/ value){ - this._deprecateRegExp("regExp", value); - }, - - _setValueAttr: function(){ - // summary: - // Hook so set('value', ...) works. - this.inherited(arguments); - this.validate(this.focused); - }, - - validator: function(/*anything*/ value, /*__Constraints*/ constraints){ - // summary: - // Overridable function used to validate the text input against the regular expression. - // tags: - // protected - return (new RegExp("^(?:" + this._getPatternAttr(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && - (!this.required || !this._isEmpty(value)) && - (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean - }, - - _isValidSubset: function(){ - // summary: - // Returns true if the value is either already valid or could be made valid by appending characters. - // This is used for validation while the user [may be] still typing. - return this.textbox.value.search(this._partialre) == 0; - }, - - isValid: function(/*Boolean*/ /*===== isFocused =====*/){ - // summary: - // Tests if value is valid. - // Can override with your own routine in a subclass. - // tags: - // protected - return this.validator(this.textbox.value, this.constraints); - }, - - _isEmpty: function(value){ - // summary: - // Checks for whitespace - return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean - }, - - getErrorMessage: function(/*Boolean*/ /*===== isFocused =====*/){ - // summary: - // Return an error message to show if appropriate - // tags: - // protected - var invalid = this.invalidMessage == "$_unset_$" ? this.messages.invalidMessage : - !this.invalidMessage ? this.promptMessage : this.invalidMessage; - var missing = this.missingMessage == "$_unset_$" ? this.messages.missingMessage : - !this.missingMessage ? invalid : this.missingMessage; - return (this.required && this._isEmpty(this.textbox.value)) ? missing : invalid; // String - }, - - getPromptMessage: function(/*Boolean*/ /*===== isFocused =====*/){ - // summary: - // Return a hint message to show when widget is first focused - // tags: - // protected - return this.promptMessage; // String - }, - - _maskValidSubsetError: true, - validate: function(/*Boolean*/ isFocused){ - // summary: - // Called by oninit, onblur, and onkeypress. - // description: - // Show missing or invalid messages if appropriate, and highlight textbox field. - // tags: - // protected - var message = ""; - var isValid = this.disabled || this.isValid(isFocused); - if(isValid){ this._maskValidSubsetError = true; } - var isEmpty = this._isEmpty(this.textbox.value); - var isValidSubset = !isValid && isFocused && this._isValidSubset(); - this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && (this._maskValidSubsetError || (isValidSubset && !this._hasBeenBlurred && isFocused))) ? "Incomplete" : "Error")); - this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true"); - - if(this.state == "Error"){ - this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus - message = this.getErrorMessage(isFocused); - }else if(this.state == "Incomplete"){ - message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete - this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused - }else if(isEmpty){ - message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text - } - this.set("message", message); - - return isValid; - }, - - displayMessage: function(/*String*/ message){ - // summary: - // Overridable method to display validation errors/hints. - // By default uses a tooltip. - // tags: - // extension - if(message && this.focused){ - Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); - }else{ - Tooltip.hide(this.domNode); - } - }, - - _refreshState: function(){ - // Overrides TextBox._refreshState() - if(this._created){ - this.validate(this.focused); - } - this.inherited(arguments); - }, - - //////////// INITIALIZATION METHODS /////////////////////////////////////// - - constructor: function(params /*===== , srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree. - - this.constraints = {}; - this.baseClass += ' dijitValidationTextBox'; - }, - - startup: function(){ - this.inherited(arguments); - this._refreshState(); // after all _set* methods have run - }, - - _setConstraintsAttr: function(/*__Constraints*/ constraints){ - if(!constraints.locale && this.lang){ - constraints.locale = this.lang; - } - this._set("constraints", constraints); - this._refreshState(); - }, - - _setPatternAttr: function(/*String|Function*/ pattern){ - this._set("pattern", pattern); // don't set on INPUT to avoid native HTML5 validation - }, - - _getPatternAttr: function(/*__Constraints*/ constraints){ - // summary: - // Hook to get the current regExp and to compute the partial validation RE. - var p = this.pattern; - var type = (typeof p).toLowerCase(); - if(type == "function"){ - p = this.pattern(constraints || this.constraints); - } - if(p != this._lastRegExp){ - var partialre = ""; - this._lastRegExp = p; - // parse the regexp and produce a new regexp that matches valid subsets - // if the regexp is .* then there's no use in matching subsets since everything is valid - if(p != ".*"){ - p.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, - function(re){ - switch(re.charAt(0)){ - case '{': - case '+': - case '?': - case '*': - case '^': - case '$': - case '|': - case '(': - partialre += re; - break; - case ")": - partialre += "|$)"; - break; - default: - partialre += "(?:"+re+"|$)"; - break; - } - }); - } - try{ // this is needed for now since the above regexp parsing needs more test verification - "".search(partialre); - }catch(e){ // should never be here unless the original RE is bad or the parsing is bad - partialre = this.pattern; - console.warn('RegExp error in ' + this.declaredClass + ': ' + this.pattern); - } // should never be here unless the original RE is bad or the parsing is bad - this._partialre = "^(?:" + partialre + ")$"; - } - return p; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - this.messages = i18n.getLocalization("dijit.form", "validate", this.lang); - this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - this.inherited(arguments); // call FormValueWidget._setDisabledAttr() - this._refreshState(); - }, - - _setRequiredAttr: function(/*Boolean*/ value){ - this._set("required", value); - this.focusNode.setAttribute("aria-required", value); - this._refreshState(); - }, - - _setMessageAttr: function(/*String*/ message){ - this._set("message", message); - this.displayMessage(message); - }, - - reset:function(){ - // Overrides dijit/form/TextBox.reset() by also - // hiding errors about partial matches - this._maskValidSubsetError = true; - this.inherited(arguments); - }, - - _onBlur: function(){ - // the message still exists but for back-compat, and to erase the tooltip - // (if the message is being displayed as a tooltip), call displayMessage('') - this.displayMessage(''); - - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/form/VerticalRule.js.uncompressed.js b/lib/dijit/form/VerticalRule.js.uncompressed.js deleted file mode 100644 index c7203286b..000000000 --- a/lib/dijit/form/VerticalRule.js.uncompressed.js +++ /dev/null @@ -1,28 +0,0 @@ -define("dijit/form/VerticalRule", [ - "dojo/_base/declare", // declare - "./HorizontalRule" -], function(declare, HorizontalRule){ - - // module: - // dijit/form/VerticalRule - - return declare("dijit.form.VerticalRule", HorizontalRule, { - // summary: - // Hash marks for the `dijit/form/VerticalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>', - _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:', - - /*===== - // container: String - // This is either "leftDecoration" or "rightDecoration", - // to indicate whether this rule goes to the left or to the right of the slider. - // Note that on RTL system, "leftDecoration" would actually go to the right, and vice-versa. - container: "", - =====*/ - - // Overrides HorizontalRule._isHorizontal - _isHorizontal: false - - }); -}); diff --git a/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js deleted file mode 100644 index c5a1839cb..000000000 --- a/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js +++ /dev/null @@ -1,26 +0,0 @@ -define("dijit/form/VerticalRuleLabels", [ - "dojo/_base/declare", // declare - "./HorizontalRuleLabels" -], function(declare, HorizontalRuleLabels){ - - // module: - // dijit/form/VerticalRuleLabels - - return declare("dijit.form.VerticalRuleLabels", HorizontalRuleLabels, { - // summary: - // Labels for the `dijit/form/VerticalSlider` - - templateString: '<div class="dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV"></div>', - - _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:', - _labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">', - - _calcPosition: function(pos){ - // Overrides HorizontalRuleLabel._calcPosition() - return 100-pos; - }, - - // needed to prevent labels from being reversed in RTL mode - _isHorizontal: false - }); -}); diff --git a/lib/dijit/form/VerticalSlider.js.uncompressed.js b/lib/dijit/form/VerticalSlider.js.uncompressed.js deleted file mode 100644 index 297d50fbb..000000000 --- a/lib/dijit/form/VerticalSlider.js.uncompressed.js +++ /dev/null @@ -1,35 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/VerticalSlider.html':"<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\trole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td data-dojo-attach-point=\"leftDecoration\" class=\"dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" data-dojo-attach-event=\"press:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td data-dojo-attach-point=\"containerNode,rightDecoration\" class=\"dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"}}); -define("dijit/form/VerticalSlider", [ - "dojo/_base/declare", // declare - "./HorizontalSlider", - "dojo/text!./templates/VerticalSlider.html" -], function(declare, HorizontalSlider, template){ - - // module: - // dijit/form/VerticalSlider - - return declare("dijit.form.VerticalSlider", HorizontalSlider, { - // summary: - // A form widget that allows one to select a value with a vertically draggable handle - - templateString: template, - _mousePixelCoord: "pageY", - _pixelCount: "h", - _startingPixelCoord: "y", - _handleOffsetCoord: "top", - _progressPixelSize: "height", - - // _descending: Boolean - // Specifies if the slider values go from high-on-top (true), or low-on-top (false) - // TODO: expose this in 1.2 - the css progress/remaining bar classes need to be reversed - _descending: true, - - _isReversed: function(){ - // summary: - // Overrides HorizontalSlider._isReversed. - // Indicates if values are high on top (with low numbers on the bottom). - return this._descending; - } - }); -}); diff --git a/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js deleted file mode 100644 index edbc137a2..000000000 --- a/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js +++ /dev/null @@ -1,581 +0,0 @@ -define("dijit/form/_AutoCompleterMixin", [ - "dojo/data/util/filter", // patternToRegExp - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.get - "dojo/_base/event", // event.stop - "dojo/keys", - "dojo/_base/lang", // lang.clone lang.hitch - "dojo/query", // query - "dojo/regexp", // regexp.escapeString - "dojo/sniff", // has("ie") - "dojo/string", // string.substitute - "./DataList", - "../registry", // registry.byId - "./_TextBoxMixin", // defines _TextBoxMixin.selectInputText - "./_SearchMixin" -], function(filter, declare, domAttr, event, keys, lang, query, regexp, has, string, - DataList, registry, _TextBoxMixin, SearchMixin){ - - // module: - // dijit/form/_AutoCompleterMixin - - return declare("dijit.form._AutoCompleterMixin", SearchMixin, { - // summary: - // A mixin that implements the base functionality for `dijit/form/ComboBox`/`dijit/form/FilteringSelect` - // description: - // All widgets that mix in dijit/form/_AutoCompleterMixin must extend `dijit/form/_FormValueWidget`. - // tags: - // protected - - // item: Object - // This is the item returned by the dojo/store/api/Store implementation that - // provides the data for this ComboBox, it's the currently selected item. - item: null, - - // autoComplete: Boolean - // If user types in a partial string, and then tab out of the `<input>` box, - // automatically copy the first entry displayed in the drop down list to - // the `<input>` field - autoComplete: true, - - // highlightMatch: String - // One of: "first", "all" or "none". - // - // If the ComboBox/FilteringSelect opens with the search results and the searched - // string can be found, it will be highlighted. If set to "all" - // then will probably want to change `queryExpr` parameter to '*${0}*' - // - // Highlighting is only performed when `labelType` is "text", so as to not - // interfere with any HTML markup an HTML label might contain. - highlightMatch: "first", - - // labelAttr: String? - // The entries in the drop down list come from this attribute in the - // dojo.data items. - // If not specified, the searchAttr attribute is used instead. - labelAttr: "", - - // labelType: String - // Specifies how to interpret the labelAttr in the data store items. - // Can be "html" or "text". - labelType: "text", - - // Flags to _HasDropDown to limit height of drop down to make it fit in viewport - maxHeight: -1, - - // For backwards compatibility let onClick events propagate, even clicks on the down arrow button - _stopClickEvents: false, - - _getCaretPos: function(/*DomNode*/ element){ - // khtml 3.5.2 has selection* methods as does webkit nightlies from 2005-06-22 - var pos = 0; - if(typeof(element.selectionStart) == "number"){ - // FIXME: this is totally borked on Moz < 1.3. Any recourse? - pos = element.selectionStart; - }else if(has("ie")){ - // in the case of a mouse click in a popup being handled, - // then the win.doc.selection is not the textarea, but the popup - // var r = win.doc.selection.createRange(); - // hack to get IE 6 to play nice. What a POS browser. - var tr = element.ownerDocument.selection.createRange().duplicate(); - var ntr = element.createTextRange(); - tr.move("character",0); - ntr.move("character",0); - try{ - // If control doesn't have focus, you get an exception. - // Seems to happen on reverse-tab, but can also happen on tab (seems to be a race condition - only happens sometimes). - // There appears to be no workaround for this - googled for quite a while. - ntr.setEndPoint("EndToEnd", tr); - pos = String(ntr.text).replace(/\r/g,"").length; - }catch(e){ - // If focus has shifted, 0 is fine for caret pos. - } - } - return pos; - }, - - _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){ - location = parseInt(location); - _TextBoxMixin.selectInputText(element, location, location); - }, - - _setDisabledAttr: function(/*Boolean*/ value){ - // Additional code to set disabled state of ComboBox node. - // Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr(). - this.inherited(arguments); - this.domNode.setAttribute("aria-disabled", value ? "true" : "false"); - }, - - _onKey: function(/*Event*/ evt){ - // summary: - // Handles keyboard events - - if(evt.charCode >= 32){ return; } // alphanumeric reserved for searching - - var key = evt.charCode || evt.keyCode; - - // except for cutting/pasting case - ctrl + x/v - if(key == keys.ALT || key == keys.CTRL || key == keys.META || key == keys.SHIFT){ - return; // throw out spurious events - } - - var pw = this.dropDown; - var highlighted = null; - this._abortQuery(); - - // _HasDropDown will do some of the work: - // - // 1. when drop down is not yet shown: - // - if user presses the down arrow key, call loadDropDown() - // 2. when drop down is already displayed: - // - on ESC key, call closeDropDown() - // - otherwise, call dropDown.handleKey() to process the keystroke - this.inherited(arguments); - - if(evt.altKey || evt.ctrlKey || evt.metaKey){ return; } // don't process keys with modifiers - but we want shift+TAB - - if(this._opened){ - highlighted = pw.getHighlightedOption(); - } - switch(key){ - case keys.PAGE_DOWN: - case keys.DOWN_ARROW: - case keys.PAGE_UP: - case keys.UP_ARROW: - // Keystroke caused ComboBox_menu to move to a different item. - // Copy new item to <input> box. - if(this._opened){ - this._announceOption(highlighted); - } - event.stop(evt); - break; - - case keys.ENTER: - // prevent submitting form if user presses enter. Also - // prevent accepting the value if either Next or Previous - // are selected - if(highlighted){ - // only stop event on prev/next - if(highlighted == pw.nextButton){ - this._nextSearch(1); - event.stop(evt); // prevent submit - break; - }else if(highlighted == pw.previousButton){ - this._nextSearch(-1); - event.stop(evt); // prevent submit - break; - } - event.stop(evt); // prevent submit if ENTER was to choose an item - }else{ - // Update 'value' (ex: KY) according to currently displayed text - this._setBlurValue(); // set value if needed - this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting - } - // fall through - - case keys.TAB: - var newvalue = this.get('displayedValue'); - // if the user had More Choices selected fall into the - // _onBlur handler - if(pw && ( - newvalue == pw._messages["previousMessage"] || - newvalue == pw._messages["nextMessage"]) - ){ - break; - } - if(highlighted){ - this._selectOption(highlighted); - } - // fall through - - case keys.ESCAPE: - if(this._opened){ - this._lastQuery = null; // in case results come back later - this.closeDropDown(); - } - break; - } - }, - - _autoCompleteText: function(/*String*/ text){ - // summary: - // Fill in the textbox with the first item from the drop down - // list, and highlight the characters that were - // auto-completed. For example, if user typed "CA" and the - // drop down list appeared, the textbox would be changed to - // "California" and "ifornia" would be highlighted. - - var fn = this.focusNode; - - // IE7: clear selection so next highlight works all the time - _TextBoxMixin.selectInputText(fn, fn.value.length); - // does text autoComplete the value in the textbox? - var caseFilter = this.ignoreCase? 'toLowerCase' : 'substr'; - if(text[caseFilter](0).indexOf(this.focusNode.value[caseFilter](0)) == 0){ - var cpos = this.autoComplete ? this._getCaretPos(fn) : fn.value.length; - // only try to extend if we added the last character at the end of the input - if((cpos+1) > fn.value.length){ - // only add to input node as we would overwrite Capitalisation of chars - // actually, that is ok - fn.value = text;//.substr(cpos); - // visually highlight the autocompleted characters - _TextBoxMixin.selectInputText(fn, cpos); - } - }else{ - // text does not autoComplete; replace the whole value and highlight - fn.value = text; - _TextBoxMixin.selectInputText(fn); - } - }, - - _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){ - // summary: - // Callback when a search completes. - // description: - // 1. generates drop-down list and calls _showResultList() to display it - // 2. if this result list is from user pressing "more choices"/"previous choices" - // then tell screen reader to announce new option - var wasSelected = this.dropDown.getHighlightedOption(); - this.dropDown.clearResultList(); - if(!results.length && options.start == 0){ // if no results and not just the previous choices button - this.closeDropDown(); - return; - } - this._nextSearch = this.dropDown.onPage = lang.hitch(this, function(direction){ - results.nextPage(direction !== -1); - this.focus(); - }); - - // Fill in the textbox with the first item from the drop down list, - // and highlight the characters that were auto-completed. For - // example, if user typed "CA" and the drop down list appeared, the - // textbox would be changed to "California" and "ifornia" would be - // highlighted. - - this.dropDown.createOptions( - results, - options, - lang.hitch(this, "_getMenuLabelFromItem") - ); - - // show our list (only if we have content, else nothing) - this._showResultList(); - - // #4091: - // tell the screen reader that the paging callback finished by - // shouting the next choice - if("direction" in options){ - if(options.direction){ - this.dropDown.highlightFirstOption(); - }else if(!options.direction){ - this.dropDown.highlightLastOption(); - } - if(wasSelected){ - this._announceOption(this.dropDown.getHighlightedOption()); - } - }else if(this.autoComplete && !this._prev_key_backspace - // when the user clicks the arrow button to show the full list, - // startSearch looks for "*". - // it does not make sense to autocomplete - // if they are just previewing the options available. - && !/^[*]+$/.test(query[this.searchAttr].toString())){ - this._announceOption(this.dropDown.containerNode.firstChild.nextSibling); // 1st real item - } - }, - - _showResultList: function(){ - // summary: - // Display the drop down if not already displayed, or if it is displayed, then - // reposition it if necessary (reposition may be necessary if drop down's height changed). - this.closeDropDown(true); - this.openDropDown(); - this.domNode.setAttribute("aria-expanded", "true"); - }, - - loadDropDown: function(/*Function*/ /*===== callback =====*/){ - // Overrides _HasDropDown.loadDropDown(). - // This is called when user has pressed button icon or pressed the down arrow key - // to open the drop down. - this._startSearchAll(); - }, - - isLoaded: function(){ - // signal to _HasDropDown that it needs to call loadDropDown() to load the - // drop down asynchronously before displaying it - return false; - }, - - closeDropDown: function(){ - // Overrides _HasDropDown.closeDropDown(). Closes the drop down (assuming that it's open). - // This method is the callback when the user types ESC or clicking - // the button icon while the drop down is open. It's also called by other code. - this._abortQuery(); - if(this._opened){ - this.inherited(arguments); - this.domNode.setAttribute("aria-expanded", "false"); - this.focusNode.removeAttribute("aria-activedescendant"); - } - }, - - _setBlurValue: function(){ - // if the user clicks away from the textbox OR tabs away, set the - // value to the textbox value - // #4617: - // if value is now more choices or previous choices, revert - // the value - var newvalue = this.get('displayedValue'); - var pw = this.dropDown; - if(pw && ( - newvalue == pw._messages["previousMessage"] || - newvalue == pw._messages["nextMessage"] - ) - ){ - this._setValueAttr(this._lastValueReported, true); - }else if(typeof this.item == "undefined"){ - // Update 'value' (ex: KY) according to currently displayed text - this.item = null; - this.set('displayedValue', newvalue); - }else{ - if(this.value != this._lastValueReported){ - this._handleOnChange(this.value, true); - } - this._refreshState(); - } - }, - - _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ - // summary: - // Set the displayed valued in the input box, and the hidden value - // that gets submitted, based on a dojo.data store item. - // description: - // Users shouldn't call this function; they should be calling - // set('item', value) - // tags: - // private - var value = ''; - if(item){ - if(!displayedValue){ - displayedValue = this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API) - this.store.getValue(item, this.searchAttr) : item[this.searchAttr]; - } - value = this._getValueField() != this.searchAttr ? this.store.getIdentity(item) : displayedValue; - } - this.set('value', value, priorityChange, displayedValue, item); - }, - - _announceOption: function(/*Node*/ node){ - // summary: - // a11y code that puts the highlighted option in the textbox. - // This way screen readers will know what is happening in the - // menu. - - if(!node){ - return; - } - // pull the text value from the item attached to the DOM node - var newValue; - if(node == this.dropDown.nextButton || - node == this.dropDown.previousButton){ - newValue = node.innerHTML; - this.item = undefined; - this.value = ''; - }else{ - var item = this.dropDown.items[node.getAttribute("item")]; - newValue = (this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API) - this.store.getValue(item, this.searchAttr) : item[this.searchAttr]).toString(); - this.set('item', item, false, newValue); - } - // get the text that the user manually entered (cut off autocompleted text) - this.focusNode.value = this.focusNode.value.substring(0, this._lastInput.length); - // set up ARIA activedescendant - this.focusNode.setAttribute("aria-activedescendant", domAttr.get(node, "id")); - // autocomplete the rest of the option to announce change - this._autoCompleteText(newValue); - }, - - _selectOption: function(/*DomNode*/ target){ - // summary: - // Menu callback function, called when an item in the menu is selected. - this.closeDropDown(); - if(target){ - this._announceOption(target); - } - this._setCaretPos(this.focusNode, this.focusNode.value.length); - this._handleOnChange(this.value, true); - }, - - _startSearchAll: function(){ - this._startSearch(''); - }, - - _startSearchFromInput: function(){ - this.item = undefined; // undefined means item needs to be set - this.inherited(arguments); - }, - - _startSearch: function(/*String*/ key){ - // summary: - // Starts a search for elements matching key (key=="" means to return all items), - // and calls _openResultList() when the search completes, to display the results. - if(!this.dropDown){ - var popupId = this.id + "_popup", - dropDownConstructor = lang.isString(this.dropDownClass) ? - lang.getObject(this.dropDownClass, false) : this.dropDownClass; - this.dropDown = new dropDownConstructor({ - onChange: lang.hitch(this, this._selectOption), - id: popupId, - dir: this.dir, - textDir: this.textDir - }); - this.focusNode.removeAttribute("aria-activedescendant"); - this.textbox.setAttribute("aria-owns",popupId); // associate popup with textbox - } - this._lastInput = key; // Store exactly what was entered by the user. - this.inherited(arguments); - }, - - _getValueField: function(){ - // summary: - // Helper for postMixInProperties() to set this.value based on data inlined into the markup. - // Returns the attribute name in the item (in dijit/form/_ComboBoxDataStore) to use as the value. - return this.searchAttr; - }, - - //////////// INITIALIZATION METHODS /////////////////////////////////////// - - postMixInProperties: function(){ - this.inherited(arguments); - if(!this.store){ - var srcNodeRef = this.srcNodeRef; - // if user didn't specify store, then assume there are option tags - this.store = new DataList({}, srcNodeRef); - - // if there is no value set and there is an option list, set - // the value to the first value to be consistent with native Select - // Firefox and Safari set value - // IE6 and Opera set selectedIndex, which is automatically set - // by the selected attribute of an option tag - // IE6 does not set value, Opera sets value = selectedIndex - if(!("value" in this.params)){ - var item = (this.item = this.store.fetchSelectedItem()); - if(item){ - var valueField = this._getValueField(); - // remove getValue() for 2.0 (old dojo.data API) - this.value = this.store._oldAPI ? this.store.getValue(item, valueField) : item[valueField]; - } - } - } - }, - - postCreate: function(){ - // summary: - // Subclasses must call this method from their postCreate() methods - // tags: - // protected - - // find any associated label element and add to ComboBox node. - var label=query('label[for="'+this.id+'"]'); - if(label.length){ - if(!label[0].id){ label[0].id = this.id + "_label"; } - this.domNode.setAttribute("aria-labelledby", label[0].id); - - } - this.inherited(arguments); - this.connect(this, "onSearch", "_openResultList"); - }, - - _getMenuLabelFromItem: function(/*Item*/ item){ - var label = this.labelFunc(item, this.store), - labelType = this.labelType; - // If labelType is not "text" we don't want to screw any markup ot whatever. - if(this.highlightMatch != "none" && this.labelType == "text" && this._lastInput){ - label = this.doHighlight(label, this._lastInput); - labelType = "html"; - } - return {html: labelType == "html", label: label}; - }, - - doHighlight: function(/*String*/ label, /*String*/ find){ - // summary: - // Highlights the string entered by the user in the menu. By default this - // highlights the first occurrence found. Override this method - // to implement your custom highlighting. - // tags: - // protected - - var - // Add (g)lobal modifier when this.highlightMatch == "all" and (i)gnorecase when this.ignoreCase == true - modifiers = (this.ignoreCase ? "i" : "") + (this.highlightMatch == "all" ? "g" : ""), - i = this.queryExpr.indexOf("${0}"); - find = regexp.escapeString(find); // escape regexp special chars - //If < appears in label, and user presses t, we don't want to highlight the t in the escaped "<" - //first find out every occurences of "find", wrap each occurence in a pair of "\uFFFF" characters (which - //should not appear in any string). then html escape the whole string, and replace '\uFFFF" with the - //HTML highlight markup. - return this._escapeHtml(label.replace( - new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers), - '\uFFFF$1\uFFFF')).replace( - /\uFFFF([^\uFFFF]+)\uFFFF/g, '<span class="dijitComboBoxHighlightMatch">$1</span>' - ); // returns String, (almost) valid HTML (entities encoded) - }, - - _escapeHtml: function(/*String*/ str){ - // TODO Should become dojo.html.entities(), when exists use instead - // summary: - // Adds escape sequences for special characters in XML: `&<>"'` - str = String(str).replace(/&/gm, "&").replace(/</gm, "<") - .replace(/>/gm, ">").replace(/"/gm, """); //balance" - return str; // string - }, - - reset: function(){ - // Overrides the _FormWidget.reset(). - // Additionally reset the .item (to clean up). - this.item = null; - this.inherited(arguments); - }, - - labelFunc: function(item, store){ - // summary: - // Computes the label to display based on the dojo.data store item. - // item: Object - // The item from the store - // store: dojo/store/api/Store - // The store. - // returns: - // The label that the ComboBox should display - // tags: - // private - - // Use toString() because XMLStore returns an XMLItem whereas this - // method is expected to return a String (#9354). - // Remove getValue() for 2.0 (old dojo.data API) - return (store._oldAPI ? store.getValue(item, this.labelAttr || this.searchAttr) : - item[this.labelAttr || this.searchAttr]).toString(); // String - }, - - _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the select. - this._set("item", item||null); // value not looked up in store - if(value == null /* or undefined */){ value = ''; } // null translates to blank - this.inherited(arguments); - }, - _setTextDirAttr: function(/*String*/ textDir){ - // summary: - // Setter for textDir, needed for the dropDown's textDir update. - // description: - // Users shouldn't call this function; they should be calling - // set('textDir', value) - // tags: - // private - this.inherited(arguments); - // update the drop down also (_ComboBoxMenuMixin) - if(this.dropDown){ - this.dropDown._set("textDir", textDir); - } - } - }); -}); diff --git a/lib/dijit/form/_ButtonMixin.js.uncompressed.js b/lib/dijit/form/_ButtonMixin.js.uncompressed.js deleted file mode 100644 index a38465804..000000000 --- a/lib/dijit/form/_ButtonMixin.js.uncompressed.js +++ /dev/null @@ -1,84 +0,0 @@ -define("dijit/form/_ButtonMixin", [ - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "dojo/_base/event", // event.stop - "../registry" // registry.byNode -], function(declare, dom, event, registry){ - -// module: -// dijit/form/_ButtonMixin - -return declare("dijit.form._ButtonMixin", null, { - // summary: - // A mixin to add a thin standard API wrapper to a normal HTML button - // description: - // A label should always be specified (through innerHTML) or the label attribute. - // - // Attach points: - // - // - focusNode (required): this node receives focus - // - valueNode (optional): this node's value gets submitted with FORM elements - // - containerNode (optional): this node gets the innerHTML assignment for label - // example: - // | <button data-dojo-type="dijit/form/Button" onClick="...">Hello world</button> - // example: - // | var button1 = new Button({label: "hello world", onClick: foo}); - // | dojo.body().appendChild(button1.domNode); - - // label: HTML String - // Content to display in button. - label: "", - - // type: [const] String - // Type of button (submit, reset, button, checkbox, radio) - type: "button", - - _onClick: function(/*Event*/ e){ - // summary: - // Internal function to handle click actions - if(this.disabled){ - event.stop(e); - return false; - } - var preventDefault = this.onClick(e) === false; // user click actions - if(!preventDefault && this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a non-form widget needs to be signalled - for(var node=this.domNode; node.parentNode; node=node.parentNode){ - var widget=registry.byNode(node); - if(widget && typeof widget._onSubmit == "function"){ - widget._onSubmit(e); - preventDefault = true; - break; - } - } - } - if(preventDefault){ - e.preventDefault(); - } - return !preventDefault; - }, - - postCreate: function(){ - this.inherited(arguments); - dom.setSelectable(this.focusNode, false); - }, - - onClick: function(/*Event*/ /*===== e =====*/){ - // summary: - // Callback for when button is clicked. - // If type="submit", return true to perform submit, or false to cancel it. - // type: - // callback - return true; // Boolean - }, - - _setLabelAttr: function(/*String*/ content){ - // summary: - // Hook for set('label', ...) to work. - // description: - // Set the label (text) of the button; takes an HTML string. - this._set("label", content); - (this.containerNode||this.focusNode).innerHTML = content; - } -}); - -}); diff --git a/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js b/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js deleted file mode 100644 index 7bcaa4b1c..000000000 --- a/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js +++ /dev/null @@ -1,77 +0,0 @@ -define("dijit/form/_CheckBoxMixin", [ - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/_base/event" // event.stop -], function(declare, domAttr, event){ - - // module: - // dijit/form/_CheckBoxMixin - - return declare("dijit.form._CheckBoxMixin", null, { - // summary: - // Mixin to provide widget functionality corresponding to an HTML checkbox - // - // description: - // User interacts with real html inputs. - // On onclick (which occurs by mouse click, space-bar, or - // using the arrow keys to switch the selected radio button), - // we update the state of the checkbox/radio. - // - - // type: [private] String - // type attribute on `<input>` node. - // Overrides `dijit/form/Button.type`. Users should not change this value. - type: "checkbox", - - // value: String - // As an initialization parameter, equivalent to value field on normal checkbox - // (if checked, the value is passed as the value when form is submitted). - value: "on", - - // readOnly: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "readOnly". - // Similar to disabled except readOnly form values are submitted. - readOnly: false, - - // aria-pressed for toggle buttons, and aria-checked for checkboxes - _aria_attr: "aria-checked", - - _setReadOnlyAttr: function(/*Boolean*/ value){ - this._set("readOnly", value); - domAttr.set(this.focusNode, 'readOnly', value); - }, - - // Override dijit/form/Button._setLabelAttr() since we don't even have a containerNode. - // Normally users won't try to set label, except when CheckBox or RadioButton is the child of a dojox/layout/TabContainer - _setLabelAttr: undefined, - - _getSubmitValue: function(/*String*/ value){ - return !value && value !== 0 ? "on" : value; - }, - - _setValueAttr: function(newValue){ - newValue = this._getSubmitValue(newValue); // "on" to match browser native behavior when value unspecified - this._set("value", newValue); - domAttr.set(this.focusNode, "value", newValue); - }, - - reset: function(){ - this.inherited(arguments); - // Handle unlikely event that the <input type=checkbox> value attribute has changed - this._set("value", this.params.value || "on"); - domAttr.set(this.focusNode, 'value', this.value); - }, - - _onClick: function(/*Event*/ e){ - // summary: - // Internal function to handle click actions - need to check - // readOnly, since button no longer does that check. - if(this.readOnly){ - event.stop(e); - return false; - } - return this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js deleted file mode 100644 index c7ed63b9c..000000000 --- a/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js +++ /dev/null @@ -1,131 +0,0 @@ -define("dijit/form/_ComboBoxMenu", [ - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-style", // domStyle.get - "dojo/keys", // keys.DOWN_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.UP_ARROW - "../_WidgetBase", - "../_TemplatedMixin", - "./_ComboBoxMenuMixin", - "./_ListMouseMixin" -], function(declare, domClass, domStyle, keys, - _WidgetBase, _TemplatedMixin, _ComboBoxMenuMixin, _ListMouseMixin){ - - - // module: - // dijit/form/_ComboBoxMenu - - return declare("dijit.form._ComboBoxMenu",[_WidgetBase, _TemplatedMixin, _ListMouseMixin, _ComboBoxMenuMixin], { - // summary: - // Focus-less menu for internal use in `dijit/form/ComboBox` - // Abstract methods that must be defined externally: - // - // - onChange: item was explicitly chosen (mousedown somewhere on the menu and mouseup somewhere on the menu) - // - onPage: next(1) or previous(-1) button pressed - // tags: - // private - - templateString: "<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;' role='listbox'>" - +"<div class='dijitMenuItem dijitMenuPreviousButton' data-dojo-attach-point='previousButton' role='option'></div>" - +"<div class='dijitMenuItem dijitMenuNextButton' data-dojo-attach-point='nextButton' role='option'></div>" - +"</div>", - - baseClass: "dijitComboBoxMenu", - - postCreate: function(){ - this.inherited(arguments); - if(!this.isLeftToRight()){ - domClass.add(this.previousButton, "dijitMenuItemRtl"); - domClass.add(this.nextButton, "dijitMenuItemRtl"); - } - }, - - _createMenuItem: function(){ - // note: not using domConstruct.create() because need to specify document - var item = this.ownerDocument.createElement("div"); - item.className = "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"); - item.setAttribute("role", "option"); - return item; - }, - - onHover: function(/*DomNode*/ node){ - // summary: - // Add hover CSS - domClass.add(node, "dijitMenuItemHover"); - }, - - onUnhover: function(/*DomNode*/ node){ - // summary: - // Remove hover CSS - domClass.remove(node, "dijitMenuItemHover"); - }, - - onSelect: function(/*DomNode*/ node){ - // summary: - // Add selected CSS - domClass.add(node, "dijitMenuItemSelected"); - }, - - onDeselect: function(/*DomNode*/ node){ - // summary: - // Remove selected CSS - domClass.remove(node, "dijitMenuItemSelected"); - }, - - _page: function(/*Boolean*/ up){ - // summary: - // Handles page-up and page-down keypresses - - var scrollamount = 0; - var oldscroll = this.domNode.scrollTop; - var height = domStyle.get(this.domNode, "height"); - // if no item is highlighted, highlight the first option - if(!this.getHighlightedOption()){ - this.selectNextNode(); - } - while(scrollamount<height){ - var highlighted_option = this.getHighlightedOption(); - if(up){ - // stop at option 1 - if(!highlighted_option.previousSibling || - highlighted_option.previousSibling.style.display == "none"){ - break; - } - this.selectPreviousNode(); - }else{ - // stop at last option - if(!highlighted_option.nextSibling || - highlighted_option.nextSibling.style.display == "none"){ - break; - } - this.selectNextNode(); - } - // going backwards - var newscroll = this.domNode.scrollTop; - scrollamount += (newscroll-oldscroll)*(up ? -1:1); - oldscroll = newscroll; - } - }, - - handleKey: function(evt){ - // summary: - // Handle keystroke event forwarded from ComboBox, returning false if it's - // a keystroke I recognize and process, true otherwise. - switch(evt.keyCode){ - case keys.DOWN_ARROW: - this.selectNextNode(); - return false; - case keys.PAGE_DOWN: - this._page(false); - return false; - case keys.UP_ARROW: - this.selectPreviousNode(); - return false; - case keys.PAGE_UP: - this._page(true); - return false; - default: - return true; - } - } - }); -}); diff --git a/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js deleted file mode 100644 index b386be715..000000000 --- a/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js +++ /dev/null @@ -1,189 +0,0 @@ -define("dijit/form/_ComboBoxMenuMixin", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/i18n", // i18n.getLocalization - "dojo/i18n!./nls/ComboBox" -], function(array, declare, domAttr, i18n){ - -// module: -// dijit/form/_ComboBoxMenuMixin - -return declare( "dijit.form._ComboBoxMenuMixin", null, { - // summary: - // Focus-less menu for internal use in `dijit/form/ComboBox` - // tags: - // private - - // _messages: Object - // Holds "next" and "previous" text for paging buttons on drop down - _messages: null, - - postMixInProperties: function(){ - this.inherited(arguments); - this._messages = i18n.getLocalization("dijit.form", "ComboBox", this.lang); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // fill in template with i18n messages - this.previousButton.innerHTML = this._messages["previousMessage"]; - this.nextButton.innerHTML = this._messages["nextMessage"]; - }, - - _setValueAttr: function(/*Object*/ value){ - this.value = value; - this.onChange(value); - }, - - onClick: function(/*DomNode*/ node){ - if(node == this.previousButton){ - this._setSelectedAttr(null); - this.onPage(-1); - }else if(node == this.nextButton){ - this._setSelectedAttr(null); - this.onPage(1); - }else{ - this.onChange(node); - } - }, - - // stubs - onChange: function(/*Number*/ /*===== direction =====*/){ - // summary: - // Notifies ComboBox/FilteringSelect that user selected an option. - // tags: - // callback - }, - - onPage: function(/*Number*/ /*===== direction =====*/){ - // summary: - // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page. - // tags: - // callback - }, - - onClose: function(){ - // summary: - // Callback from dijit.popup code to this widget, notifying it that it closed - // tags: - // private - this._setSelectedAttr(null); - }, - - _createOption: function(/*Object*/ item, labelFunc){ - // summary: - // Creates an option to appear on the popup menu subclassed by - // `dijit/form/FilteringSelect`. - - var menuitem = this._createMenuItem(); - var labelObject = labelFunc(item); - if(labelObject.html){ - menuitem.innerHTML = labelObject.label; - }else{ - menuitem.appendChild( - menuitem.ownerDocument.createTextNode(labelObject.label) - ); - } - // #3250: in blank options, assign a normal height - if(menuitem.innerHTML == ""){ - menuitem.innerHTML = " "; // - } - - // update menuitem.dir if BidiSupport was required - this.applyTextDir(menuitem, (menuitem.innerText || menuitem.textContent || "")); - - return menuitem; - }, - - createOptions: function(results, options, labelFunc){ - // summary: - // Fills in the items in the drop down list - // results: - // Array of items - // options: - // The options to the query function of the store - // - // labelFunc: - // Function to produce a label in the drop down list from a dojo.data item - - this.items = results; - - // display "Previous . . ." button - this.previousButton.style.display = (options.start == 0) ? "none" : ""; - domAttr.set(this.previousButton, "id", this.id + "_prev"); - // create options using _createOption function defined by parent - // ComboBox (or FilteringSelect) class - // #2309: - // iterate over cache nondestructively - array.forEach(results, function(item, i){ - var menuitem = this._createOption(item, labelFunc); - menuitem.setAttribute("item", i); // index to this.items; use indirection to avoid mem leak - domAttr.set(menuitem, "id", this.id + i); - this.nextButton.parentNode.insertBefore(menuitem, this.nextButton); - }, this); - // display "Next . . ." button - var displayMore = false; - // Try to determine if we should show 'more'... - if(results.total && !results.total.then && results.total != -1){ - if((options.start + options.count) < results.total){ - displayMore = true; - }else if((options.start + options.count) > results.total && options.count == results.length){ - // Weird return from a data store, where a start + count > maxOptions - // implies maxOptions isn't really valid and we have to go into faking it. - // And more or less assume more if count == results.length - displayMore = true; - } - }else if(options.count == results.length){ - //Don't know the size, so we do the best we can based off count alone. - //So, if we have an exact match to count, assume more. - displayMore = true; - } - - this.nextButton.style.display = displayMore ? "" : "none"; - domAttr.set(this.nextButton,"id", this.id + "_next"); - }, - - clearResultList: function(){ - // summary: - // Clears the entries in the drop down list, but of course keeps the previous and next buttons. - var container = this.containerNode; - while(container.childNodes.length > 2){ - container.removeChild(container.childNodes[container.childNodes.length-2]); - } - this._setSelectedAttr(null); - }, - - highlightFirstOption: function(){ - // summary: - // Highlight the first real item in the list (not Previous Choices). - this.selectFirstNode(); - }, - - highlightLastOption: function(){ - // summary: - // Highlight the last real item in the list (not More Choices). - this.selectLastNode(); - }, - - selectFirstNode: function(){ - this.inherited(arguments); - if(this.getHighlightedOption() == this.previousButton){ - this.selectNextNode(); - } - }, - - selectLastNode: function(){ - this.inherited(arguments); - if(this.getHighlightedOption() == this.nextButton){ - this.selectPreviousNode(); - } - }, - - getHighlightedOption: function(){ - return this.selected; - } -}); - -}); diff --git a/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js deleted file mode 100644 index b95001288..000000000 --- a/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js +++ /dev/null @@ -1,260 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/DropDownBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"button presentation\" aria-hidden=\"true\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}}); -define("dijit/form/_DateTimeTextBox", [ - "dojo/date", // date date.compare - "dojo/date/locale", // locale.regexp - "dojo/date/stamp", // stamp.fromISOString stamp.toISOString - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.getObject - "./RangeBoundTextBox", - "../_HasDropDown", - "dojo/text!./templates/DropDownBox.html" -], function(date, locale, stamp, declare, lang, RangeBoundTextBox, _HasDropDown, template){ - - // module: - // dijit/form/_DateTimeTextBox - - new Date("X"); // workaround for #11279, new Date("") == NaN - - var _DateTimeTextBox = declare("dijit.form._DateTimeTextBox", [RangeBoundTextBox, _HasDropDown], { - // summary: - // Base class for validating, serializable, range-bound date or time text box. - - templateString: template, - - // hasDownArrow: [const] Boolean - // Set this textbox to display a down arrow button, to open the drop down list. - hasDownArrow: true, - - // Set classes like dijitDownArrowButtonHover depending on mouse action over button node - cssStateNodes: { - "_buttonNode": "dijitDownArrowButton" - }, - - /*===== - // constraints: _DateTimeTextBox.__Constraints - // Despite the name, this parameter specifies both constraints on the input - // (including starting/ending dates/times allowed) as well as - // formatting options like whether the date is displayed in long (ex: December 25, 2005) - // or short (ex: 12/25/2005) format. See `dijit/form/_DateTimeTextBox.__Constraints` for details. - constraints: {}, - ======*/ - - // Override ValidationTextBox.pattern.... we use a reg-ex generating function rather - // than a straight regexp to deal with locale (plus formatting options too?) - pattern: locale.regexp, - - // datePackage: String - // JavaScript namespace to find calendar routines. If unspecified, uses Gregorian calendar routines - // at dojo/date and dojo/date/locale. - datePackage: "", - // TODO: for 2.0, replace datePackage with dateModule and dateLocalModule attributes specifying MIDs, - // or alternately just get rid of this completely and tell user to use module ID remapping - // via require - - postMixInProperties: function(){ - this.inherited(arguments); - this._set("type", "text"); // in case type="date"|"time" was specified which messes up parse/format - }, - - // Override _FormWidget.compare() to work for dates/times - compare: function(/*Date*/ val1, /*Date*/ val2){ - var isInvalid1 = this._isInvalidDate(val1); - var isInvalid2 = this._isInvalidDate(val2); - return isInvalid1 ? (isInvalid2 ? 0 : -1) : (isInvalid2 ? 1 : date.compare(val1, val2, this._selector)); - }, - - // flag to _HasDropDown to make drop down Calendar width == <input> width - forceWidth: true, - - format: function(/*Date*/ value, /*locale.__FormatOptions*/ constraints){ - // summary: - // Formats the value as a Date, according to specified locale (second argument) - // tags: - // protected - if(!value){ return ''; } - return this.dateLocaleModule.format(value, constraints); - }, - - "parse": function(/*String*/ value, /*locale.__FormatOptions*/ constraints){ - // summary: - // Parses as string as a Date, according to constraints - // tags: - // protected - - return this.dateLocaleModule.parse(value, constraints) || (this._isEmpty(value) ? null : undefined); // Date - }, - - // Overrides ValidationTextBox.serialize() to serialize a date in canonical ISO format. - serialize: function(/*anything*/ val, /*Object?*/ options){ - if(val.toGregorian){ - val = val.toGregorian(); - } - return stamp.toISOString(val, options); - }, - - // dropDownDefaultValue: Date - // The default value to focus in the popupClass widget when the textbox value is empty. - dropDownDefaultValue : new Date(), - - // value: Date - // The value of this widget as a JavaScript Date object. Use get("value") / set("value", val) to manipulate. - // When passed to the parser in markup, must be specified according to `dojo/date/stamp.fromISOString()` - value: new Date(""), // value.toString()="NaN" - - _blankValue: null, // used by filter() when the textbox is blank - - // popupClass: [protected extension] String - // Name of the popup widget class used to select a date/time. - // Subclasses should specify this. - popupClass: "", // default is no popup = text only - - - // _selector: [protected extension] String - // Specifies constraints.selector passed to dojo.date functions, should be either - // "date" or "time". - // Subclass must specify this. - _selector: "", - - constructor: function(params /*===== , srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree - - this.dateModule = params.datePackage ? lang.getObject(params.datePackage, false) : date; - this.dateClassObj = this.dateModule.Date || Date; - this.dateLocaleModule = params.datePackage ? lang.getObject(params.datePackage+".locale", false) : locale; - this._set('pattern', this.dateLocaleModule.regexp); - this._invalidDate = this.constructor.prototype.value.toString(); - }, - - buildRendering: function(){ - this.inherited(arguments); - - if(!this.hasDownArrow){ - this._buttonNode.style.display = "none"; - } - - // If hasDownArrow is false, we basically just want to treat the whole widget as the - // button. - if(!this.hasDownArrow){ - this._buttonNode = this.domNode; - this.baseClass += " dijitComboBoxOpenOnClick"; - } - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - constraints.selector = this._selector; - constraints.fullYear = true; // see #5465 - always format with 4-digit years - var fromISO = stamp.fromISOString; - if(typeof constraints.min == "string"){ constraints.min = fromISO(constraints.min); } - if(typeof constraints.max == "string"){ constraints.max = fromISO(constraints.max); } - this.inherited(arguments); - }, - - _isInvalidDate: function(/*Date*/ value){ - // summary: - // Runs various tests on the value, checking for invalid conditions - // tags: - // private - return !value || isNaN(value) || typeof value != "object" || value.toString() == this._invalidDate; - }, - - _setValueAttr: function(/*Date|String*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Sets the date on this textbox. Note: value can be a JavaScript Date literal or a string to be parsed. - if(value !== undefined){ - if(typeof value == "string"){ - value = stamp.fromISOString(value); - } - if(this._isInvalidDate(value)){ - value = null; - } - if(value instanceof Date && !(this.dateClassObj instanceof Date)){ - value = new this.dateClassObj(value); - } - } - this.inherited(arguments); - if(this.value instanceof Date){ - this.filterString = ""; - } - if(this.dropDown){ - this.dropDown.set('value', value, false); - } - }, - - _set: function(attr, value){ - // Avoid spurious watch() notifications when value is changed to new Date object w/the same value - if(attr == "value" && this.value instanceof Date && this.compare(value, this.value) == 0){ - return; - } - this.inherited(arguments); - }, - - _setDropDownDefaultValueAttr: function(/*Date*/ val){ - if(this._isInvalidDate(val)){ - // convert null setting into today's date, since there needs to be *some* default at all times. - val = new this.dateClassObj(); - } - this.dropDownDefaultValue = val; - }, - - openDropDown: function(/*Function*/ callback){ - // rebuild drop down every time, so that constraints get copied (#6002) - if(this.dropDown){ - this.dropDown.destroy(); - } - var PopupProto = lang.isString(this.popupClass) ? lang.getObject(this.popupClass, false) : this.popupClass, - textBox = this, - value = this.get("value"); - this.dropDown = new PopupProto({ - onChange: function(value){ - // this will cause InlineEditBox and other handlers to do stuff so make sure it's last - textBox.set('value', value, true); - }, - id: this.id + "_popup", - dir: textBox.dir, - lang: textBox.lang, - value: value, - currentFocus: !this._isInvalidDate(value) ? value : this.dropDownDefaultValue, - constraints: textBox.constraints, - filterString: textBox.filterString, // for TimeTextBox, to filter times shown - datePackage: textBox.params.datePackage, - isDisabledDate: function(/*Date*/ date){ - // summary: - // disables dates outside of the min/max of the _DateTimeTextBox - return !textBox.rangeCheck(date, textBox.constraints); - } - }); - - this.inherited(arguments); - }, - - _getDisplayedValueAttr: function(){ - return this.textbox.value; - }, - - _setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){ - this._setValueAttr(this.parse(value, this.constraints), priorityChange, value); - } - }); - - - /*===== - _DateTimeTextBox.__Constraints = declare([RangeBoundTextBox.__Constraints, locale.__FormatOptions], { - // summary: - // Specifies both the rules on valid/invalid values (first/last date/time allowed), - // and also formatting options for how the date/time is displayed. - // example: - // To restrict to dates within 2004, displayed in a long format like "December 25, 2005": - // | {min:'2004-01-01',max:'2004-12-31', formatLength:'long'} - }); - =====*/ - - return _DateTimeTextBox; -}); diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js deleted file mode 100644 index 382663e98..000000000 --- a/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js +++ /dev/null @@ -1,130 +0,0 @@ -define("dijit/form/_ExpandingTextAreaMixin", [ - "dojo/_base/declare", // declare - "dojo/dom-construct", // domConstruct.create - "dojo/has", - "dojo/_base/lang", // lang.hitch - "dojo/on", - "dojo/_base/window", // win.body - "../Viewport" -], function(declare, domConstruct, has, lang, on, win, Viewport){ - - // module: - // dijit/form/_ExpandingTextAreaMixin - - // feature detection, true for mozilla and webkit - has.add("textarea-needs-help-shrinking", function(){ - var body = win.body(), // note: if multiple documents exist, doesn't matter which one we use - te = domConstruct.create('textarea', { - rows:"5", - cols:"20", - value: ' ', - style: {zoom:1, fontSize:"12px", height:"96px", overflow:'hidden', visibility:'hidden', position:'absolute', border:"5px solid white", margin:"0", padding:"0", boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' } - }, body, "last"); - var needsHelpShrinking = te.scrollHeight >= te.clientHeight; - body.removeChild(te); - return needsHelpShrinking; - }); - - return declare("dijit.form._ExpandingTextAreaMixin", null, { - // summary: - // Mixin for textarea widgets to add auto-expanding capability - - _setValueAttr: function(){ - this.inherited(arguments); - this.resize(); - }, - - postCreate: function(){ - this.inherited(arguments); - var textarea = this.textbox; - textarea.style.overflowY = "hidden"; - this.own(on(textarea, "focus, resize", lang.hitch(this, "_resizeLater"))); - }, - - startup: function(){ - this.inherited(arguments); - this.own(Viewport.on("resize", lang.hitch(this, "_resizeLater"))); - this._resizeLater(); - }, - - _onInput: function(e){ - this.inherited(arguments); - this.resize(); - }, - - _estimateHeight: function(){ - // summary: - // Approximate the height when the textarea is invisible with the number of lines in the text. - // Fails when someone calls setValue with a long wrapping line, but the layout fixes itself when the user clicks inside so . . . - // In IE, the resize event is supposed to fire when the textarea becomes visible again and that will correct the size automatically. - // - var textarea = this.textbox; - // #rows = #newlines+1 - textarea.rows = (textarea.value.match(/\n/g) || []).length + 1; - }, - - _resizeLater: function(){ - this.defer("resize"); - }, - - resize: function(){ - // summary: - // Resizes the textarea vertically (should be called after a style/value change) - - var textarea = this.textbox; - - function textareaScrollHeight(){ - var empty = false; - if(textarea.value === ''){ - textarea.value = ' '; - empty = true; - } - var sh = textarea.scrollHeight; - if(empty){ textarea.value = ''; } - return sh; - } - - if(textarea.style.overflowY == "hidden"){ textarea.scrollTop = 0; } - if(this.busyResizing){ return; } - this.busyResizing = true; - if(textareaScrollHeight() || textarea.offsetHeight){ - var newH = textareaScrollHeight() + Math.max(textarea.offsetHeight - textarea.clientHeight, 0); - var newHpx = newH + "px"; - if(newHpx != textarea.style.height){ - textarea.style.height = newHpx; - textarea.rows = 1; // rows can act like a minHeight if not cleared - } - if(has("textarea-needs-help-shrinking")){ - var origScrollHeight = textareaScrollHeight(), - newScrollHeight = origScrollHeight, - origMinHeight = textarea.style.minHeight, - decrement = 4, // not too fast, not too slow - thisScrollHeight, - origScrollTop = textarea.scrollTop; - textarea.style.minHeight = newHpx; // maintain current height - textarea.style.height = "auto"; // allow scrollHeight to change - while(newH > 0){ - textarea.style.minHeight = Math.max(newH - decrement, 4) + "px"; - thisScrollHeight = textareaScrollHeight(); - var change = newScrollHeight - thisScrollHeight; - newH -= change; - if(change < decrement){ - break; // scrollHeight didn't shrink - } - newScrollHeight = thisScrollHeight; - decrement <<= 1; - } - textarea.style.height = newH + "px"; - textarea.style.minHeight = origMinHeight; - textarea.scrollTop = origScrollTop; - } - textarea.style.overflowY = textareaScrollHeight() > textarea.clientHeight ? "auto" : "hidden"; - if(textarea.style.overflowY == "hidden"){ textarea.scrollTop = 0; } - }else{ - // hidden content of unknown size - this._estimateHeight(); - } - this.busyResizing = false; - } - }); -}); diff --git a/lib/dijit/form/_FormMixin.js.uncompressed.js b/lib/dijit/form/_FormMixin.js.uncompressed.js deleted file mode 100644 index 2218c0c20..000000000 --- a/lib/dijit/form/_FormMixin.js.uncompressed.js +++ /dev/null @@ -1,456 +0,0 @@ -define("dijit/form/_FormMixin", [ - "dojo/_base/array", // array.every array.filter array.forEach array.indexOf array.map - "dojo/_base/declare", // declare - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.hitch lang.isArray - "dojo/on", - "dojo/window" // winUtils.scrollIntoView -], function(array, declare, kernel, lang, on, winUtils){ - - // module: - // dijit/form/_FormMixin - - return declare("dijit.form._FormMixin", null, { - // summary: - // Mixin for containers of form widgets (i.e. widgets that represent a single value - // and can be children of a `<form>` node or `dijit/form/Form` widget) - // description: - // Can extract all the form widgets - // values and combine them into a single javascript object, or alternately - // take such an object and set the values for all the contained - // form widgets - - /*===== - // value: Object - // Name/value hash for each child widget with a name and value. - // Child widgets without names are not part of the hash. - // - // If there are multiple child widgets w/the same name, value is an array, - // unless they are radio buttons in which case value is a scalar (since only - // one radio button can be checked at a time). - // - // If a child widget's name is a dot separated list (like a.b.c.d), it's a nested structure. - // - // Example: - // | { name: "John Smith", interests: ["sports", "movies"] } - =====*/ - - // state: [readonly] String - // Will be "Error" if one or more of the child widgets has an invalid value, - // "Incomplete" if not all of the required child widgets are filled in. Otherwise, "", - // which indicates that the form is ready to be submitted. - state: "", - - // TODO: - // * Repeater - // * better handling for arrays. Often form elements have names with [] like - // * people[3].sex (for a list of people [{name: Bill, sex: M}, ...]) - - - _getDescendantFormWidgets: function(/*dijit/_WidgetBase[]?*/ children){ - // summary: - // Returns all form widget descendants, searching through non-form child widgets like BorderContainer - var res = []; - array.forEach(children || this.getChildren(), function(child){ - if("value" in child){ - res.push(child); - }else{ - res = res.concat(this._getDescendantFormWidgets(child.getChildren())); - } - }, this); - return res; - }, - - reset: function(){ - array.forEach(this._getDescendantFormWidgets(), function(widget){ - if(widget.reset){ - widget.reset(); - } - }); - }, - - validate: function(){ - // summary: - // returns if the form is valid - same as isValid - but - // provides a few additional (ui-specific) features: - // - // 1. it will highlight any sub-widgets that are not valid - // 2. it will call focus() on the first invalid sub-widget - var didFocus = false; - return array.every(array.map(this._getDescendantFormWidgets(), function(widget){ - // Need to set this so that "required" widgets get their - // state set. - widget._hasBeenBlurred = true; - var valid = widget.disabled || !widget.validate || widget.validate(); - if(!valid && !didFocus){ - // Set focus of the first non-valid widget - winUtils.scrollIntoView(widget.containerNode || widget.domNode); - widget.focus(); - didFocus = true; - } - return valid; - }), function(item){ return item; }); - }, - - setValues: function(val){ - kernel.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0"); - return this.set('value', val); - }, - _setValueAttr: function(/*Object*/ obj){ - // summary: - // Fill in form values from according to an Object (in the format returned by get('value')) - - // generate map from name --> [list of widgets with that name] - var map = { }; - array.forEach(this._getDescendantFormWidgets(), function(widget){ - if(!widget.name){ return; } - var entry = map[widget.name] || (map[widget.name] = [] ); - entry.push(widget); - }); - - for(var name in map){ - if(!map.hasOwnProperty(name)){ - continue; - } - var widgets = map[name], // array of widgets w/this name - values = lang.getObject(name, false, obj); // list of values for those widgets - - if(values === undefined){ - continue; - } - if(!lang.isArray(values)){ - values = [ values ]; - } - if(typeof widgets[0].checked == 'boolean'){ - // for checkbox/radio, values is a list of which widgets should be checked - array.forEach(widgets, function(w){ - w.set('value', array.indexOf(values, w.value) != -1); - }); - }else if(widgets[0].multiple){ - // it takes an array (e.g. multi-select) - widgets[0].set('value', values); - }else{ - // otherwise, values is a list of values to be assigned sequentially to each widget - array.forEach(widgets, function(w, i){ - w.set('value', values[i]); - }); - } - } - - /*** - * TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets) - - array.forEach(this.containerNode.elements, function(element){ - if(element.name == ''){return}; // like "continue" - var namePath = element.name.split("."); - var myObj=obj; - var name=namePath[namePath.length-1]; - for(var j=1,len2=namePath.length;j<len2;++j){ - var p=namePath[j - 1]; - // repeater support block - var nameA=p.split("["); - if(nameA.length > 1){ - if(typeof(myObj[nameA[0]]) == "undefined"){ - myObj[nameA[0]]=[ ]; - } // if - - nameIndex=parseInt(nameA[1]); - if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ - myObj[nameA[0]][nameIndex] = { }; - } - myObj=myObj[nameA[0]][nameIndex]; - continue; - } // repeater support ends - - if(typeof(myObj[p]) == "undefined"){ - myObj=undefined; - break; - }; - myObj=myObj[p]; - } - - if(typeof(myObj) == "undefined"){ - return; // like "continue" - } - if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){ - return; // like "continue" - } - - // TODO: widget values (just call set('value', ...) on the widget) - - // TODO: maybe should call dojo.getNodeProp() instead - switch(element.type){ - case "checkbox": - element.checked = (name in myObj) && - array.some(myObj[name], function(val){ return val == element.value; }); - break; - case "radio": - element.checked = (name in myObj) && myObj[name] == element.value; - break; - case "select-multiple": - element.selectedIndex=-1; - array.forEach(element.options, function(option){ - option.selected = array.some(myObj[name], function(val){ return option.value == val; }); - }); - break; - case "select-one": - element.selectedIndex="0"; - array.forEach(element.options, function(option){ - option.selected = option.value == myObj[name]; - }); - break; - case "hidden": - case "text": - case "textarea": - case "password": - element.value = myObj[name] || ""; - break; - } - }); - */ - - // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events - // which I am monitoring. - }, - - getValues: function(){ - kernel.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get('value'); - }, - _getValueAttr: function(){ - // summary: - // Returns Object representing form values. See description of `value` for details. - // description: - - // The value is updated into this.value every time a child has an onChange event, - // so in the common case this function could just return this.value. However, - // that wouldn't work when: - // - // 1. User presses return key to submit a form. That doesn't fire an onchange event, - // and even if it did it would come too late due to the defer(...) in _handleOnChange() - // - // 2. app for some reason calls this.get("value") while the user is typing into a - // form field. Not sure if that case needs to be supported or not. - - // get widget values - var obj = { }; - array.forEach(this._getDescendantFormWidgets(), function(widget){ - var name = widget.name; - if(!name || widget.disabled){ return; } - - // Single value widget (checkbox, radio, or plain <input> type widget) - var value = widget.get('value'); - - // Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays - if(typeof widget.checked == 'boolean'){ - if(/Radio/.test(widget.declaredClass)){ - // radio button - if(value !== false){ - lang.setObject(name, value, obj); - }else{ - // give radio widgets a default of null - value = lang.getObject(name, false, obj); - if(value === undefined){ - lang.setObject(name, null, obj); - } - } - }else{ - // checkbox/toggle button - var ary=lang.getObject(name, false, obj); - if(!ary){ - ary=[]; - lang.setObject(name, ary, obj); - } - if(value !== false){ - ary.push(value); - } - } - }else{ - var prev=lang.getObject(name, false, obj); - if(typeof prev != "undefined"){ - if(lang.isArray(prev)){ - prev.push(value); - }else{ - lang.setObject(name, [prev, value], obj); - } - }else{ - // unique name - lang.setObject(name, value, obj); - } - } - }); - - /*** - * code for plain input boxes (see also domForm.formToObject, can we use that instead of this code? - * but it doesn't understand [] notation, presumably) - var obj = { }; - array.forEach(this.containerNode.elements, function(elm){ - if(!elm.name) { - return; // like "continue" - } - var namePath = elm.name.split("."); - var myObj=obj; - var name=namePath[namePath.length-1]; - for(var j=1,len2=namePath.length;j<len2;++j){ - var nameIndex = null; - var p=namePath[j - 1]; - var nameA=p.split("["); - if(nameA.length > 1){ - if(typeof(myObj[nameA[0]]) == "undefined"){ - myObj[nameA[0]]=[ ]; - } // if - nameIndex=parseInt(nameA[1]); - if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ - myObj[nameA[0]][nameIndex] = { }; - } - }else if(typeof(myObj[nameA[0]]) == "undefined"){ - myObj[nameA[0]] = { } - } // if - - if(nameA.length == 1){ - myObj=myObj[nameA[0]]; - }else{ - myObj=myObj[nameA[0]][nameIndex]; - } // if - } // for - - if((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type == "radio" && elm.checked)){ - if(name == name.split("[")[0]){ - myObj[name]=elm.value; - }else{ - // can not set value when there is no name - } - }else if(elm.type == "checkbox" && elm.checked){ - if(typeof(myObj[name]) == 'undefined'){ - myObj[name]=[ ]; - } - myObj[name].push(elm.value); - }else if(elm.type == "select-multiple"){ - if(typeof(myObj[name]) == 'undefined'){ - myObj[name]=[ ]; - } - for(var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){ - if(elm.options[jdx].selected){ - myObj[name].push(elm.options[jdx].value); - } - } - } // if - name=undefined; - }); // forEach - ***/ - return obj; - }, - - isValid: function(){ - // summary: - // Returns true if all of the widgets are valid. - // Deprecated, will be removed in 2.0. Use get("state") instead. - - return this.state == ""; - }, - - onValidStateChange: function(/*Boolean*/ /*===== isValid =====*/){ - // summary: - // Stub function to connect to if you want to do something - // (like disable/enable a submit button) when the valid - // state changes on the form as a whole. - // - // Deprecated. Will be removed in 2.0. Use watch("state", ...) instead. - }, - - _getState: function(){ - // summary: - // Compute what this.state should be based on state of children - var states = array.map(this._descendants, function(w){ - return w.get("state") || ""; - }); - - return array.indexOf(states, "Error") >= 0 ? "Error" : - array.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : ""; - }, - - disconnectChildren: function(){ - // summary: - // Deprecated method. Applications no longer need to call this. Remove for 2.0. - }, - - connectChildren: function(/*Boolean*/ inStartup){ - // summary: - // You can call this function directly, ex. in the event that you - // programmatically add a widget to the form *after* the form has been - // initialized. - - // TODO: rename for 2.0 - - this._descendants = this._getDescendantFormWidgets(); - - // To get notifications from children they need to be started. Children didn't used to need to be started, - // so for back-compat, start them here - array.forEach(this._descendants, function(child){ - if(!child._started){ child.startup(); } - }); - - if(!inStartup){ - this._onChildChange(); - } - }, - - _onChildChange: function(/*String*/ attr){ - // summary: - // Called when child's value or disabled state changes - - // The unit tests expect state update to be synchronous, so update it immediately. - if(!attr || attr == "state" || attr == "disabled"){ - this._set("state", this._getState()); - } - - // Use defer() to collapse value changes in multiple children into a single - // update to my value. Multiple updates will occur on: - // 1. Form.set() - // 2. Form.reset() - // 3. user selecting a radio button (which will de-select another radio button, - // causing two onChange events) - if(!attr || attr == "value" || attr == "disabled" || attr == "checked"){ - if(this._onChangeDelayTimer){ - this._onChangeDelayTimer.remove(); - } - this._onChangeDelayTimer = this.defer(function(){ - delete this._onChangeDelayTimer; - this._set("value", this.get("value")); - }, 10); - } - }, - - startup: function(){ - this.inherited(arguments); - - // Set initial this.value and this.state. Don't emit watch() notifications. - this._descendants = this._getDescendantFormWidgets(); - this.value = this.get("value"); - this.state = this._getState(); - - // Initialize value and valid/invalid state tracking. - var self = this; - this.own( - on( - this.containerNode, - "attrmodified-state, attrmodified-disabled, attrmodified-value, attrmodified-checked", - function(evt){ - if(evt.target == self.domNode){ - return; // ignore events that I fire on myself because my children changed - } - self._onChildChange(evt.type.replace("attrmodified-", "")); - } - ) - ); - - // Make state change call onValidStateChange(), will be removed in 2.0 - this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); }); - }, - - destroy: function(){ - this.inherited(arguments); - } - - }); -}); diff --git a/lib/dijit/form/_FormSelectWidget.js.uncompressed.js b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js deleted file mode 100644 index 4a40c51d0..000000000 --- a/lib/dijit/form/_FormSelectWidget.js.uncompressed.js +++ /dev/null @@ -1,707 +0,0 @@ -define("dijit/form/_FormSelectWidget", [ - "dojo/_base/array", // array.filter array.forEach array.map array.some - "dojo/_base/Deferred", - "dojo/aspect", // aspect.after - "dojo/data/util/sorter", // util.sorter.createSortFunction - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "dojo/dom-class", // domClass.toggle - "dojo/_base/kernel", // _scopeName - "dojo/_base/lang", // lang.delegate lang.isArray lang.isObject lang.hitch - "dojo/query", // query - "dojo/when", - "dojo/store/util/QueryResults", - "./_FormValueWidget" -], function(array, Deferred, aspect, sorter, declare, dom, domClass, kernel, lang, query, when, - QueryResults, _FormValueWidget){ - -// module: -// dijit/form/_FormSelectWidget - -/*===== -var __SelectOption = { - // value: String - // The value of the option. Setting to empty (or missing) will - // place a separator at that location - // label: String - // The label for our option. It can contain html tags. - // selected: Boolean - // Whether or not we are a selected option - // disabled: Boolean - // Whether or not this specific option is disabled -}; -=====*/ - -var _FormSelectWidget = declare("dijit.form._FormSelectWidget", _FormValueWidget, { - // summary: - // Extends _FormValueWidget in order to provide "select-specific" - // values - i.e., those values that are unique to `<select>` elements. - // This also provides the mechanism for reading the elements from - // a store, if desired. - - // multiple: [const] Boolean - // Whether or not we are multi-valued - multiple: false, - - // options: __SelectOption[] - // The set of options for our select item. Roughly corresponds to - // the html `<option>` tag. - options: null, - - // store: dojo/store/api/Store - // A store to use for getting our list of options - rather than reading them - // from the `<option>` html tags. Should support getIdentity(). - // For back-compat store can also be a dojo/data/api/Identity. - store: null, - - // query: object - // A query to use when fetching items from our store - query: null, - - // queryOptions: object - // Query options to use when fetching from the store - queryOptions: null, - - // labelAttr: String? - // The entries in the drop down list come from this attribute in the dojo.store items. - // If ``store`` is set, labelAttr must be set too, unless store is an old-style - // dojo.data store rather than a new dojo/store. - labelAttr: "", - - // onFetch: Function - // A callback to do with an onFetch - but before any items are actually - // iterated over (i.e. to filter even further what you want to add) - onFetch: null, - - // sortByLabel: Boolean - // Flag to sort the options returned from a store by the label of - // the store. - sortByLabel: true, - - - // loadChildrenOnOpen: Boolean - // By default loadChildren is called when the items are fetched from the - // store. This property allows delaying loadChildren (and the creation - // of the options/menuitems) until the user clicks the button to open the - // dropdown. - loadChildrenOnOpen: false, - - // onLoadDeferred: [readonly] dojo.Deferred - // This is the `dojo.Deferred` returned by setStore(). - // Calling onLoadDeferred.then() registers your - // callback to be called only once, when the prior setStore completes. - onLoadDeferred: null, - - getOptions: function(/*anything*/ valueOrIdx){ - // summary: - // Returns a given option (or options). - // valueOrIdx: - // If passed in as a string, that string is used to look up the option - // in the array of options - based on the value property. - // (See dijit/form/_FormSelectWidget.__SelectOption). - // - // If passed in a number, then the option with the given index (0-based) - // within this select will be returned. - // - // If passed in a dijit/form/_FormSelectWidget.__SelectOption, the same option will be - // returned if and only if it exists within this select. - // - // If passed an array, then an array will be returned with each element - // in the array being looked up. - // - // If not passed a value, then all options will be returned - // - // returns: - // The option corresponding with the given value or index. null - // is returned if any of the following are true: - // - // - A string value is passed in which doesn't exist - // - An index is passed in which is outside the bounds of the array of options - // - A dijit/form/_FormSelectWidget.__SelectOption is passed in which is not a part of the select - - // NOTE: the compare for passing in a dijit/form/_FormSelectWidget.__SelectOption checks - // if the value property matches - NOT if the exact option exists - // NOTE: if passing in an array, null elements will be placed in the returned - // array when a value is not found. - var lookupValue = valueOrIdx, opts = this.options || [], l = opts.length; - - if(lookupValue === undefined){ - return opts; // __SelectOption[] - } - if(lang.isArray(lookupValue)){ - return array.map(lookupValue, "return this.getOptions(item);", this); // __SelectOption[] - } - if(lang.isObject(valueOrIdx)){ - // We were passed an option - so see if it's in our array (directly), - // and if it's not, try and find it by value. - if(!array.some(this.options, function(o, idx){ - if(o === lookupValue || - (o.value && o.value === lookupValue.value)){ - lookupValue = idx; - return true; - } - return false; - })){ - lookupValue = -1; - } - } - if(typeof lookupValue == "string"){ - for(var i=0; i<l; i++){ - if(opts[i].value === lookupValue){ - lookupValue = i; - break; - } - } - } - if(typeof lookupValue == "number" && lookupValue >= 0 && lookupValue < l){ - return this.options[lookupValue]; // __SelectOption - } - return null; // null - }, - - addOption: function(/*__SelectOption|__SelectOption[]*/ option){ - // summary: - // Adds an option or options to the end of the select. If value - // of the option is empty or missing, a separator is created instead. - // Passing in an array of options will yield slightly better performance - // since the children are only loaded once. - if(!lang.isArray(option)){ option = [option]; } - array.forEach(option, function(i){ - if(i && lang.isObject(i)){ - this.options.push(i); - } - }, this); - this._loadChildren(); - }, - - removeOption: function(/*String|__SelectOption|Number|Array*/ valueOrIdx){ - // summary: - // Removes the given option or options. You can remove by string - // (in which case the value is removed), number (in which case the - // index in the options array is removed), or select option (in - // which case, the select option with a matching value is removed). - // You can also pass in an array of those values for a slightly - // better performance since the children are only loaded once. - if(!lang.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; } - var oldOpts = this.getOptions(valueOrIdx); - array.forEach(oldOpts, function(i){ - // We can get null back in our array - if our option was not found. In - // that case, we don't want to blow up... - if(i){ - this.options = array.filter(this.options, function(node){ - return (node.value !== i.value || node.label !== i.label); - }); - this._removeOptionItem(i); - } - }, this); - this._loadChildren(); - }, - - updateOption: function(/*__SelectOption|__SelectOption[]*/ newOption){ - // summary: - // Updates the values of the given option. The option to update - // is matched based on the value of the entered option. Passing - // in an array of new options will yield better performance since - // the children will only be loaded once. - if(!lang.isArray(newOption)){ newOption = [newOption]; } - array.forEach(newOption, function(i){ - var oldOpt = this.getOptions(i), k; - if(oldOpt){ - for(k in i){ oldOpt[k] = i[k]; } - } - }, this); - this._loadChildren(); - }, - - setStore: function(store, - selectedValue, - fetchArgs){ - // summary: - // Sets the store you would like to use with this select widget. - // The selected value is the value of the new store to set. This - // function returns the original store, in case you want to reuse - // it or something. - // store: dojo/store/api/Store - // The dojo.store you would like to use - it MUST implement getIdentity() - // and MAY implement observe(). - // For backwards-compatibility this can also be a data.data store, in which case - // it MUST implement dojo/data/api/Identity, - // and MAY implement dojo/data/api/Notification. - // selectedValue: anything? - // The value that this widget should set itself to *after* the store - // has been loaded - // fetchArgs: Object? - // Hash of parameters to set filter on store, etc. - // - // - query: new value for Select.query, - // - queryOptions: new value for Select.queryOptions, - // - onFetch: callback function for each item in data (Deprecated) - var oStore = this.store; - fetchArgs = fetchArgs || {}; - - if(oStore !== store){ - // Our store has changed, so cancel any listeners on old store (remove for 2.0) - var h; - while((h = this._notifyConnections.pop())){ h.remove(); } - - // For backwards-compatibility, accept dojo.data store in addition to dojo.store.store. Remove in 2.0. - if(!store.get){ - lang.mixin(store, { - _oldAPI: true, - get: function(id){ - // summary: - // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity. - // Like dojo.store.DataStore.get() except returns native item. - var deferred = new Deferred(); - this.fetchItemByIdentity({ - identity: id, - onItem: function(object){ - deferred.resolve(object); - }, - onError: function(error){ - deferred.reject(error); - } - }); - return deferred.promise; - }, - query: function(query, options){ - // summary: - // Queries the store for objects. Like dojo/store/DataStore.query() - // except returned Deferred contains array of native items. - var deferred = new Deferred(function(){ if(fetchHandle.abort){ fetchHandle.abort(); } } ); - deferred.total = new Deferred(); - var fetchHandle = this.fetch(lang.mixin({ - query: query, - onBegin: function(count){ - deferred.total.resolve(count); - }, - onComplete: function(results){ - deferred.resolve(results); - }, - onError: function(error){ - deferred.reject(error); - } - }, options)); - return new QueryResults(deferred); - } - }); - - if(store.getFeatures()["dojo.data.api.Notification"]){ - this._notifyConnections = [ - aspect.after(store, "onNew", lang.hitch(this, "_onNewItem"), true), - aspect.after(store, "onDelete", lang.hitch(this, "_onDeleteItem"), true), - aspect.after(store, "onSet", lang.hitch(this, "_onSetItem"), true) - ]; - } - } - this._set("store", store); // Our store has changed, so update our notifications - } - - // Remove existing options (if there are any) - if(this.options && this.options.length){ - this.removeOption(this.options); - } - - // Cancel listener for updates to old store - if(this._queryRes && this._queryRes.close){ - this._queryRes.close(); - } - - // If user has specified new query and query options along with this new store, then use them. - if(fetchArgs.query){ - this._set("query", fetchArgs.query); - this._set("queryOptions", fetchArgs.queryOptions); - } - - // Add our new options - if(store){ - this._loadingStore = true; - this.onLoadDeferred = new Deferred(); - - // Run query - // Save result in this._queryRes so we can cancel the listeners we register below - this._queryRes = store.query(this.query, this.queryOptions); - when(this._queryRes, lang.hitch(this, function(items){ - - if(this.sortByLabel && !fetchArgs.sort && items.length){ - if(items[0].getValue){ - // Old dojo.data API to access items, remove for 2.0 - items.sort(sorter.createSortFunction([{ - attribute: store.getLabelAttributes(items[0])[0] - }], store)); - }else{ - var labelAttr = this.labelAttr; - items.sort(function(a, b){ - return a[labelAttr] > b[labelAttr] ? 1 : b[labelAttr] > a[labelAttr] ? -1 : 0; - }); - } - } - - if(fetchArgs.onFetch){ - items = fetchArgs.onFetch.call(this, items, fetchArgs); - } - - // TODO: Add these guys as a batch, instead of separately - array.forEach(items, function(i){ - this._addOptionForItem(i); - }, this); - - // Register listener for store updates - if(this._queryRes.observe){ - this._queryRes.observe(lang.hitch(this, function(object, deletedFrom, insertedInto){ - if(deletedFrom == insertedInto){ - this._onSetItem(object); - }else{ - if(deletedFrom != -1){ - this._onDeleteItem(object); - } - if(insertedInto != -1){ - this._onNewItem(object); - } - } - }), true); - } - - // Set our value (which might be undefined), and then tweak - // it to send a change event with the real value - this._loadingStore = false; - this.set("value", "_pendingValue" in this ? this._pendingValue : selectedValue); - delete this._pendingValue; - - if(!this.loadChildrenOnOpen){ - this._loadChildren(); - }else{ - this._pseudoLoadChildren(items); - } - this.onLoadDeferred.resolve(true); - this.onSetStore(); - }), function(err){ - console.error('dijit.form.Select: ' + err.toString()); - this.onLoadDeferred.reject(err); - }); - } - return oStore; // dojo/data/api/Identity - }, - - // TODO: implement set() and watch() for store and query, although not sure how to handle - // setting them individually rather than together (as in setStore() above) - - _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // set the value of the widget. - // If a string is passed, then we set our value from looking it up. - if(!this._onChangeActive){ priorityChange = null; } - if(this._loadingStore){ - // Our store is loading - so save our value, and we'll set it when - // we're done - this._pendingValue = newValue; - return; - } - var opts = this.getOptions() || []; - if(!lang.isArray(newValue)){ - newValue = [newValue]; - } - array.forEach(newValue, function(i, idx){ - if(!lang.isObject(i)){ - i = i + ""; - } - if(typeof i === "string"){ - newValue[idx] = array.filter(opts, function(node){ - return node.value === i; - })[0] || {value: "", label: ""}; - } - }, this); - - // Make sure some sane default is set - newValue = array.filter(newValue, function(i){ return i && i.value; }); - if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){ - newValue[0] = opts[0]; - } - array.forEach(opts, function(i){ - i.selected = array.some(newValue, function(v){ return v.value === i.value; }); - }); - var val = array.map(newValue, function(i){ return i.value; }), - disp = array.map(newValue, function(i){ return i.label; }); - - if(typeof val == "undefined" || typeof val[0] == "undefined"){ return; } // not fully initialized yet or a failed value lookup - this._setDisplay(this.multiple ? disp : disp[0]); - this.inherited(arguments, [ this.multiple ? val : val[0], priorityChange ]); - this._updateSelection(); - }, - - _getDisplayedValueAttr: function(){ - // summary: - // returns the displayed value of the widget - var val = this.get("value"); - if(!lang.isArray(val)){ - val = [val]; - } - var ret = array.map(this.getOptions(val), function(v){ - if(v && "label" in v){ - return v.label; - }else if(v){ - return v.value; - } - return null; - }, this); - return this.multiple ? ret : ret[0]; - }, - - _loadChildren: function(){ - // summary: - // Loads the children represented by this widget's options. - // reset the menu to make it populatable on the next click - if(this._loadingStore){ return; } - array.forEach(this._getChildren(), function(child){ - child.destroyRecursive(); - }); - // Add each menu item - array.forEach(this.options, this._addOptionItem, this); - - // Update states - this._updateSelection(); - }, - - _updateSelection: function(){ - // summary: - // Sets the "selected" class on the item for styling purposes - this._set("value", this._getValueFromOpts()); - var val = this.value; - if(!lang.isArray(val)){ - val = [val]; - } - if(val && val[0]){ - array.forEach(this._getChildren(), function(child){ - var isSelected = array.some(val, function(v){ - return child.option && (v === child.option.value); - }); - domClass.toggle(child.domNode, this.baseClass.replace(/\s+|$/g, "SelectedOption "), isSelected); - child.domNode.setAttribute("aria-selected", isSelected ? "true" : "false"); - }, this); - } - }, - - _getValueFromOpts: function(){ - // summary: - // Returns the value of the widget by reading the options for - // the selected flag - var opts = this.getOptions() || []; - if(!this.multiple && opts.length){ - // Mirror what a select does - choose the first one - var opt = array.filter(opts, function(i){ - return i.selected; - })[0]; - if(opt && opt.value){ - return opt.value; - }else{ - opts[0].selected = true; - return opts[0].value; - } - }else if(this.multiple){ - // Set value to be the sum of all selected - return array.map(array.filter(opts, function(i){ - return i.selected; - }), function(i){ - return i.value; - }) || []; - } - return ""; - }, - - // Internal functions to call when we have store notifications come in - _onNewItem: function(/*item*/ item, /*Object?*/ parentInfo){ - if(!parentInfo || !parentInfo.parent){ - // Only add it if we are top-level - this._addOptionForItem(item); - } - }, - _onDeleteItem: function(/*item*/ item){ - var store = this.store; - this.removeOption(store.getIdentity(item)); - }, - _onSetItem: function(/*item*/ item){ - this.updateOption(this._getOptionObjForItem(item)); - }, - - _getOptionObjForItem: function(item){ - // summary: - // Returns an option object based off the given item. The "value" - // of the option item will be the identity of the item, the "label" - // of the option will be the label of the item. - - // remove getLabel() call for 2.0 (it's to support the old dojo.data API) - var store = this.store, - label = (this.labelAttr && this.labelAttr in item) ? item[this.labelAttr] : store.getLabel(item), - value = (label ? store.getIdentity(item) : null); - return {value: value, label: label, item: item}; // __SelectOption - }, - - _addOptionForItem: function(/*item*/ item){ - // summary: - // Creates (and adds) the option for the given item - var store = this.store; - if(store.isItemLoaded && !store.isItemLoaded(item)){ - // We are not loaded - so let's load it and add later. - // Remove for 2.0 (it's the old dojo.data API) - store.loadItem({item: item, onItem: function(i){ - this._addOptionForItem(i); - }, - scope: this}); - return; - } - var newOpt = this._getOptionObjForItem(item); - this.addOption(newOpt); - }, - - constructor: function(params /*===== , srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree - - // Saves off our value, if we have an initial one set so we - // can use it if we have a store as well (see startup()) - this._oValue = (params || {}).value || null; - this._notifyConnections = []; // remove for 2.0 - }, - - buildRendering: function(){ - this.inherited(arguments); - dom.setSelectable(this.focusNode, false); - }, - - _fillContent: function(){ - // summary: - // Loads our options and sets up our dropdown correctly. We - // don't want any content, so we don't call any inherit chain - // function. - if(!this.options){ - this.options = - this.srcNodeRef - ? query("> *", this.srcNodeRef).map( - function(node){ - if(node.getAttribute("type") === "separator"){ - return { value: "", label: "", selected: false, disabled: false }; - } - return { - value: (node.getAttribute("data-" + kernel._scopeName + "-value") || node.getAttribute("value")), - label: String(node.innerHTML), - // FIXME: disabled and selected are not valid on complex markup children (which is why we're - // looking for data-dojo-value above. perhaps we should data-dojo-props="" this whole thing?) - // decide before 1.6 - selected: node.getAttribute("selected") || false, - disabled: node.getAttribute("disabled") || false - }; - }, - this) - : []; - } - if(!this.value){ - this._set("value", this._getValueFromOpts()); - }else if(this.multiple && typeof this.value == "string"){ - this._set("value", this.value.split(",")); - } - }, - - postCreate: function(){ - // summary: - // sets up our event handling that we need for functioning - // as a select - this.inherited(arguments); - - // Make our event connections for updating state - this.connect(this, "onChange", "_updateSelection"); - - // moved from startup - // Connects in our store, if we have one defined - var store = this.store; - if(store && (store.getIdentity || store.getFeatures()["dojo.data.api.Identity"])){ - // Temporarily set our store to null so that it will get set - // and connected appropriately - this.store = null; - this.setStore(store, this._oValue); - } - }, - - startup: function(){ - // summary: - this._loadChildren(); - this.inherited(arguments); - }, - - destroy: function(){ - // summary: - // Clean up our connections - - var h; - while((h = this._notifyConnections.pop())){ h.remove(); } - - // Cancel listener for store updates - if(this._queryRes && this._queryRes.close){ - this._queryRes.close(); - } - - this.inherited(arguments); - }, - - _addOptionItem: function(/*__SelectOption*/ /*===== option =====*/){ - // summary: - // User-overridable function which, for the given option, adds an - // item to the select. If the option doesn't have a value, then a - // separator is added in that place. Make sure to store the option - // in the created option widget. - }, - - _removeOptionItem: function(/*__SelectOption*/ /*===== option =====*/){ - // summary: - // User-overridable function which, for the given option, removes - // its item from the select. - }, - - _setDisplay: function(/*String or String[]*/ /*===== newDisplay =====*/){ - // summary: - // Overridable function which will set the display for the - // widget. newDisplay is either a string (in the case of - // single selects) or array of strings (in the case of multi-selects) - }, - - _getChildren: function(){ - // summary: - // Overridable function to return the children that this widget contains. - return []; - }, - - _getSelectedOptionsAttr: function(){ - // summary: - // hooks into this.attr to provide a mechanism for getting the - // option items for the current value of the widget. - return this.getOptions(this.get("value")); - }, - - _pseudoLoadChildren: function(/*item[]*/ /*===== items =====*/){ - // summary: - // a function that will "fake" loading children, if needed, and - // if we have set to not load children until the widget opens. - // items: - // An array of items that will be loaded, when needed - }, - - onSetStore: function(){ - // summary: - // a function that can be connected to in order to receive a - // notification that the store has finished loading and all options - // from that store are available - } -}); - -/*===== -_FormSelectWidget.__SelectOption = __SelectOption; -=====*/ - -return _FormSelectWidget; - -}); diff --git a/lib/dijit/form/_FormValueMixin.js.uncompressed.js b/lib/dijit/form/_FormValueMixin.js.uncompressed.js deleted file mode 100644 index 4944631ef..000000000 --- a/lib/dijit/form/_FormValueMixin.js.uncompressed.js +++ /dev/null @@ -1,89 +0,0 @@ -define("dijit/form/_FormValueMixin", [ - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/keys", // keys.ESCAPE - "dojo/sniff", // has("ie"), has("quirks") - "./_FormWidgetMixin" -], function(declare, domAttr, keys, has, _FormWidgetMixin){ - - // module: - // dijit/form/_FormValueMixin - - return declare("dijit.form._FormValueMixin", _FormWidgetMixin, { - // summary: - // Mixin for widgets corresponding to native HTML elements such as `<input>` or `<select>` - // that have user changeable values. - // description: - // Each _FormValueMixin represents a single input value, and has a (possibly hidden) `<input>` element, - // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?) - // works as expected. - - // readOnly: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "readOnly". - // Similar to disabled except readOnly form values are submitted. - readOnly: false, - - _setReadOnlyAttr: function(/*Boolean*/ value){ - domAttr.set(this.focusNode, 'readOnly', value); - this._set("readOnly", value); - }, - - postCreate: function(){ - this.inherited(arguments); - - if(has("ie")){ // IE won't stop the event with keypress - this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown); - } - // Update our reset value if it hasn't yet been set (because this.set() - // is only called when there *is* a value) - if(this._resetValue === undefined){ - this._lastValueReported = this._resetValue = this.value; - } - }, - - _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the widget. - // If the value has changed, then fire onChange event, unless priorityChange - // is specified as null (or false?) - this._handleOnChange(newValue, priorityChange); - }, - - _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // Called when the value of the widget has changed. Saves the new value in this.value, - // and calls onChange() if appropriate. See _FormWidget._handleOnChange() for details. - this._set("value", newValue); - this.inherited(arguments); - }, - - undo: function(){ - // summary: - // Restore the value to the last value passed to onChange - this._setValueAttr(this._lastValueReported, false); - }, - - reset: function(){ - // summary: - // Reset the widget's value to what it was at initialization time - this._hasBeenBlurred = false; - this._setValueAttr(this._resetValue, true); - }, - - _onKeyDown: function(e){ - if(e.keyCode == keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){ - if(has("ie") < 9 || (has("ie") && has("quirks"))){ - e.preventDefault(); // default behavior needs to be stopped here since keypress is too late - var node = e.srcElement, - te = node.ownerDocument.createEventObject(); - te.keyCode = keys.ESCAPE; - te.shiftKey = e.shiftKey; - node.fireEvent('onkeypress', te); - } - } - } - }); -}); diff --git a/lib/dijit/form/_FormValueWidget.js.uncompressed.js b/lib/dijit/form/_FormValueWidget.js.uncompressed.js deleted file mode 100644 index 9edbf2e83..000000000 --- a/lib/dijit/form/_FormValueWidget.js.uncompressed.js +++ /dev/null @@ -1,51 +0,0 @@ -define("dijit/form/_FormValueWidget", [ - "dojo/_base/declare", // declare - "dojo/sniff", // has("ie") - "./_FormWidget", - "./_FormValueMixin" -], function(declare, has, _FormWidget, _FormValueMixin){ - -// module: -// dijit/form/_FormValueWidget - -return declare("dijit.form._FormValueWidget", [_FormWidget, _FormValueMixin], -{ - // summary: - // Base class for widgets corresponding to native HTML elements such as `<input>` or `<select>` - // that have user changeable values. - // description: - // Each _FormValueWidget represents a single input value, and has a (possibly hidden) `<input>` element, - // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?) - // works as expected. - - // Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared - // directly in the template as read by the parser in order to function. IE is known to specifically - // require the 'name' attribute at element creation time. See #8484, #8660. - - _layoutHackIE7: function(){ - // summary: - // Work around table sizing bugs on IE7 by forcing redraw - - if(has("ie") == 7){ // fix IE7 layout bug when the widget is scrolled out of sight - var domNode = this.domNode; - var parent = domNode.parentNode; - var pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter - var origFilter = pingNode.style.filter; // save custom filter, most likely nothing - var _this = this; - while(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet - (function ping(){ - var disconnectHandle = _this.connect(parent, "onscroll", - function(){ - _this.disconnect(disconnectHandle); // only call once - pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique - _this.defer(function(){ pingNode.style.filter = origFilter; }); // restore custom filter, if any - } - ); - })(); - parent = parent.parentNode; - } - } - } -}); - -}); diff --git a/lib/dijit/form/_FormWidget.js.uncompressed.js b/lib/dijit/form/_FormWidget.js.uncompressed.js deleted file mode 100644 index ada09eb0e..000000000 --- a/lib/dijit/form/_FormWidget.js.uncompressed.js +++ /dev/null @@ -1,71 +0,0 @@ -define("dijit/form/_FormWidget", [ - "dojo/_base/declare", // declare - "dojo/has", // has("dijit-legacy-requires") - "dojo/_base/kernel", // kernel.deprecated - "dojo/ready", - "../_Widget", - "../_CssStateMixin", - "../_TemplatedMixin", - "./_FormWidgetMixin" -], function(declare, has, kernel, ready, _Widget, _CssStateMixin, _TemplatedMixin, _FormWidgetMixin){ - - -// module: -// dijit/form/_FormWidget - -// Back compat w/1.6, remove for 2.0 -if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/form/_FormValueWidget"]; - require(requires); // use indirection so modules not rolled into a build - }); -} - -return declare("dijit.form._FormWidget", [_Widget, _TemplatedMixin, _CssStateMixin, _FormWidgetMixin], { - // summary: - // Base class for widgets corresponding to native HTML elements such as `<checkbox>` or `<button>`, - // which can be children of a `<form>` node or a `dijit/form/Form` widget. - // - // description: - // Represents a single HTML element. - // All these widgets should have these attributes just like native HTML input elements. - // You can set them during widget construction or afterwards, via `dijit/_WidgetBase.set()`. - // - // They also share some common methods. - - setDisabled: function(/*Boolean*/ disabled){ - // summary: - // Deprecated. Use set('disabled', ...) instead. - kernel.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0"); - this.set('disabled', disabled); - }, - - setValue: function(/*String*/ value){ - // summary: - // Deprecated. Use set('value', ...) instead. - kernel.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use set('value',"+value+") instead.", "", "2.0"); - this.set('value', value); - }, - - getValue: function(){ - // summary: - // Deprecated. Use get('value') instead. - kernel.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get('value'); - }, - - postMixInProperties: function(){ - // Setup name=foo string to be referenced from the template (but only if a name has been specified) - // Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8484, #8660. - // Regarding escaping, see heading "Attribute values" in - // http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2 - this.nameAttrSetting = this.name ? ('name="' + this.name.replace(/"/g, """) + '"') : ''; - this.inherited(arguments); - }, - - // Override automatic assigning type --> focusNode, it causes exception on IE. - // Instead, type must be specified as ${type} in the template, as part of the original DOM - _setTypeAttr: null -}); - -}); diff --git a/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js b/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js deleted file mode 100644 index 873466d53..000000000 --- a/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js +++ /dev/null @@ -1,227 +0,0 @@ -define("dijit/form/_FormWidgetMixin", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/dom-style", // domStyle.get - "dojo/_base/lang", // lang.hitch lang.isArray - "dojo/mouse", // mouse.isLeft - "dojo/sniff", // has("webkit") - "dojo/window", // winUtils.scrollIntoView - "../a11y" // a11y.hasDefaultTabStop -], function(array, declare, domAttr, domStyle, lang, mouse, has, winUtils, a11y){ - -// module: -// dijit/form/_FormWidgetMixin - -return declare("dijit.form._FormWidgetMixin", null, { - // summary: - // Mixin for widgets corresponding to native HTML elements such as `<checkbox>` or `<button>`, - // which can be children of a `<form>` node or a `dijit/form/Form` widget. - // - // description: - // Represents a single HTML element. - // All these widgets should have these attributes just like native HTML input elements. - // You can set them during widget construction or afterwards, via `dijit/_WidgetBase.set()`. - // - // They also share some common methods. - - // name: [const] String - // Name used when submitting form; same as "name" attribute or plain HTML elements - name: "", - - // alt: String - // Corresponds to the native HTML `<input>` element's attribute. - alt: "", - - // value: String - // Corresponds to the native HTML `<input>` element's attribute. - value: "", - - // type: [const] String - // Corresponds to the native HTML `<input>` element's attribute. - type: "text", - - // type: String - // Apply aria-label in markup to the widget's focusNode - "aria-label": "focusNode", - - // tabIndex: String - // Order fields are traversed when user hits the tab key - tabIndex: "0", - _setTabIndexAttr: "focusNode", // force copy even when tabIndex default value, needed since Button is <span> - - // disabled: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "disabled='disabled'", or just "disabled". - disabled: false, - - // intermediateChanges: Boolean - // Fires onChange for each value change or only on demand - intermediateChanges: false, - - // scrollOnFocus: Boolean - // On focus, should this widget scroll into view? - scrollOnFocus: true, - - // Override _WidgetBase mapping id to this.domNode, needs to be on focusNode so <label> etc. - // works with screen reader - _setIdAttr: "focusNode", - - _setDisabledAttr: function(/*Boolean*/ value){ - this._set("disabled", value); - domAttr.set(this.focusNode, 'disabled', value); - if(this.valueNode){ - domAttr.set(this.valueNode, 'disabled', value); - } - this.focusNode.setAttribute("aria-disabled", value ? "true" : "false"); - - if(value){ - // reset these, because after the domNode is disabled, we can no longer receive - // mouse related events, see #4200 - this._set("hovering", false); - this._set("active", false); - - // clear tab stop(s) on this widget's focusable node(s) (ComboBox has two focusable nodes) - var attachPointNames = "tabIndex" in this.attributeMap ? this.attributeMap.tabIndex : - ("_setTabIndexAttr" in this) ? this._setTabIndexAttr : "focusNode"; - array.forEach(lang.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){ - var node = this[attachPointName]; - // complex code because tabIndex=-1 on a <div> doesn't work on FF - if(has("webkit") || a11y.hasDefaultTabStop(node)){ // see #11064 about webkit bug - node.setAttribute('tabIndex', "-1"); - }else{ - node.removeAttribute('tabIndex'); - } - }, this); - }else{ - if(this.tabIndex != ""){ - this.set('tabIndex', this.tabIndex); - } - } - }, - - _onFocus: function(/*String*/ by){ - // If user clicks on the widget, even if the mouse is released outside of it, - // this widget's focusNode should get focus (to mimic native browser hehavior). - // Browsers often need help to make sure the focus via mouse actually gets to the focusNode. - if(by == "mouse" && this.isFocusable()){ - // IE exhibits strange scrolling behavior when refocusing a node so only do it when !focused. - var focusConnector = this.connect(this.focusNode, "onfocus", function(){ - this.disconnect(mouseUpConnector); - this.disconnect(focusConnector); - }); - // Set a global event to handle mouseup, so it fires properly - // even if the cursor leaves this.domNode before the mouse up event. - var mouseUpConnector = this.connect(this.ownerDocumentBody, "onmouseup", function(){ - this.disconnect(mouseUpConnector); - this.disconnect(focusConnector); - // if here, then the mousedown did not focus the focusNode as the default action - if(this.focused){ - this.focus(); - } - }); - } - if(this.scrollOnFocus){ - this.defer(function(){ winUtils.scrollIntoView(this.domNode); }); // without defer, the input caret position can change on mouse click - } - this.inherited(arguments); - }, - - isFocusable: function(){ - // summary: - // Tells if this widget is focusable or not. Used internally by dijit. - // tags: - // protected - return !this.disabled && this.focusNode && (domStyle.get(this.domNode, "display") != "none"); - }, - - focus: function(){ - // summary: - // Put focus on this widget - if(!this.disabled && this.focusNode.focus){ - try{ this.focusNode.focus(); }catch(e){}/*squelch errors from hidden nodes*/ - } - }, - - compare: function(/*anything*/ val1, /*anything*/ val2){ - // summary: - // Compare 2 values (as returned by get('value') for this widget). - // tags: - // protected - if(typeof val1 == "number" && typeof val2 == "number"){ - return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; - }else if(val1 > val2){ - return 1; - }else if(val1 < val2){ - return -1; - }else{ - return 0; - } - }, - - onChange: function(/*===== newValue =====*/){ - // summary: - // Callback when this widget's value is changed. - // tags: - // callback - }, - - // _onChangeActive: [private] Boolean - // Indicates that changes to the value should call onChange() callback. - // This is false during widget initialization, to avoid calling onChange() - // when the initial value is set. - _onChangeActive: false, - - _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ - // summary: - // Called when the value of the widget is set. Calls onChange() if appropriate - // newValue: - // the new value - // priorityChange: - // For a slider, for example, dragging the slider is priorityChange==false, - // but on mouse up, it's priorityChange==true. If intermediateChanges==false, - // onChange is only called form priorityChange=true events. - // tags: - // private - if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){ - // this block executes not for a change, but during initialization, - // and is used to store away the original value (or for ToggleButton, the original checked state) - this._resetValue = this._lastValueReported = newValue; - } - this._pendingOnChange = this._pendingOnChange - || (typeof newValue != typeof this._lastValueReported) - || (this.compare(newValue, this._lastValueReported) != 0); - if((this.intermediateChanges || priorityChange || priorityChange === undefined) && this._pendingOnChange){ - this._lastValueReported = newValue; - this._pendingOnChange = false; - if(this._onChangeActive){ - if(this._onChangeHandle){ - this._onChangeHandle.remove(); - } - // defer allows hidden value processing to run and - // also the onChange handler can safely adjust focus, etc - this._onChangeHandle = this.defer( - function(){ - this._onChangeHandle = null; - this.onChange(newValue); - }); // try to collapse multiple onChange's fired faster than can be processed - } - } - }, - - create: function(){ - // Overrides _Widget.create() - this.inherited(arguments); - this._onChangeActive = true; - }, - - destroy: function(){ - if(this._onChangeHandle){ // destroy called before last onChange has fired - this._onChangeHandle.remove(); - this.onChange(this._lastValueReported); - } - this.inherited(arguments); - } -}); - -}); diff --git a/lib/dijit/form/_ListBase.js.uncompressed.js b/lib/dijit/form/_ListBase.js.uncompressed.js deleted file mode 100644 index ea32c3ceb..000000000 --- a/lib/dijit/form/_ListBase.js.uncompressed.js +++ /dev/null @@ -1,135 +0,0 @@ -define("dijit/form/_ListBase", [ - "dojo/_base/declare", // declare - "dojo/on", - "dojo/window" // winUtils.scrollIntoView -], function(declare, on, winUtils){ - -// module: -// dijit/form/_ListBase - -return declare( "dijit.form._ListBase", null, { - // summary: - // Focus-less menu to handle UI events consistently - // Abstract methods that must be defined externally: - // - // - onSelect: item is active (mousedown but not yet mouseup, or keyboard arrow selected but no Enter) - // - onDeselect: cancels onSelect - // tags: - // private - - // selected: DOMNode - // currently selected node - selected: null, - - _listConnect: function(/*String|Function*/ eventType, /*String*/ callbackFuncName){ - // summary: - // Connects 'containerNode' to specified method of this object - // and automatically registers for 'disconnect' on widget destroy. - // description: - // Provide widget-specific analog to 'connect'. - // The callback function is called with the normal event object, - // but also a second parameter is passed that indicates which list item - // actually received the event. - // returns: - // A handle that can be passed to `disconnect` in order to disconnect - // before the widget is destroyed. - // tags: - // private - - var self = this; - return self.own(on(self.containerNode, - on.selector( - function(eventTarget, selector, target){ - return eventTarget.parentNode == target; - }, - eventType - ), - function(evt){ - evt.preventDefault(); - self[callbackFuncName](evt, this); - } - )); - }, - - selectFirstNode: function(){ - // summary: - // Select the first displayed item in the list. - var first = this.containerNode.firstChild; - while(first && first.style.display == "none"){ - first = first.nextSibling; - } - this._setSelectedAttr(first); - }, - - selectLastNode: function(){ - // summary: - // Select the last displayed item in the list - var last = this.containerNode.lastChild; - while(last && last.style.display == "none"){ - last = last.previousSibling; - } - this._setSelectedAttr(last); - }, - - selectNextNode: function(){ - // summary: - // Select the item just below the current selection. - // If nothing selected, select first node. - var selectedNode = this.selected; - if(!selectedNode){ - this.selectFirstNode(); - }else{ - var next = selectedNode.nextSibling; - while(next && next.style.display == "none"){ - next = next.nextSibling; - } - if(!next){ - this.selectFirstNode(); - }else{ - this._setSelectedAttr(next); - } - } - }, - - selectPreviousNode: function(){ - // summary: - // Select the item just above the current selection. - // If nothing selected, select last node (if - // you select Previous and try to keep scrolling up the list). - var selectedNode = this.selected; - if(!selectedNode){ - this.selectLastNode(); - }else{ - var prev = selectedNode.previousSibling; - while(prev && prev.style.display == "none"){ - prev = prev.previousSibling; - } - if(!prev){ - this.selectLastNode(); - }else{ - this._setSelectedAttr(prev); - } - } - }, - - _setSelectedAttr: function(/*DomNode*/ node){ - // summary: - // Does the actual select. - if(this.selected != node){ - var selectedNode = this.selected; - if(selectedNode){ - this.onDeselect(selectedNode); - this.selected = null; - } - if(node){ - this.selected = node; - winUtils.scrollIntoView(node); - this.onSelect(node); - } - }else if(node){ - this.onSelect(node); - } - } -}); - -}); diff --git a/lib/dijit/form/_ListMouseMixin.js.uncompressed.js b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js deleted file mode 100644 index 118f6fdfb..000000000 --- a/lib/dijit/form/_ListMouseMixin.js.uncompressed.js +++ /dev/null @@ -1,79 +0,0 @@ -define("dijit/form/_ListMouseMixin", [ - "dojo/_base/declare", // declare - "dojo/mouse", - "dojo/on", - "dojo/touch", - "./_ListBase" -], function(declare, mouse, on, touch, _ListBase){ - -// module: -// dijit/form/_ListMouseMixin - -return declare( "dijit.form._ListMouseMixin", _ListBase, { - // summary: - // a Mixin to handle mouse or touch events for a focus-less menu - // Abstract methods that must be defined externally: - // - // - onClick: item was chosen (mousedown somewhere on the menu and mouseup somewhere on the menu) - // tags: - // private - - postCreate: function(){ - this.inherited(arguments); - - this.own(on(this.domNode, touch.press, function(evt){ evt.preventDefault(); })); // prevent focus shift on list scrollbar press - - this._listConnect(touch.press, "_onMouseDown"); - this._listConnect(touch.release, "_onMouseUp"); - this._listConnect(mouse.enter, "_onMouseOver"); - this._listConnect(mouse.leave, "_onMouseOut"); - }, - - _onMouseDown: function(/*Event*/ evt, /*DomNode*/ target){ - if(this._hoveredNode){ - this.onUnhover(this._hoveredNode); - this._hoveredNode = null; - } - this._isDragging = true; - this._setSelectedAttr(target); - }, - - _onMouseUp: function(/*Event*/ evt, /*DomNode*/ target){ - this._isDragging = false; - var selectedNode = this.selected; - var hoveredNode = this._hoveredNode; - if(selectedNode && target == selectedNode){ - this.onClick(selectedNode); - }else if(hoveredNode && target == hoveredNode){ // drag to select - this._setSelectedAttr(hoveredNode); - this.onClick(hoveredNode); - } - }, - - _onMouseOut: function(/*Event*/ evt, /*DomNode*/ target){ - if(this._hoveredNode){ - this.onUnhover(this._hoveredNode); - this._hoveredNode = null; - } - if(this._isDragging){ - this._cancelDrag = (new Date()).getTime() + 1000; // cancel in 1 second if no _onMouseOver fires - } - }, - - _onMouseOver: function(/*Event*/ evt, /*DomNode*/ target){ - if(this._cancelDrag){ - var time = (new Date()).getTime(); - if(time > this._cancelDrag){ - this._isDragging = false; - } - this._cancelDrag = null; - } - this._hoveredNode = target; - this.onHover(target); - if(this._isDragging){ - this._setSelectedAttr(target); - } - } -}); - -}); diff --git a/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js deleted file mode 100644 index 757d843ac..000000000 --- a/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js +++ /dev/null @@ -1,71 +0,0 @@ -define("dijit/form/_RadioButtonMixin", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-attr", // domAttr.set - "dojo/_base/event", // event.stop - "dojo/_base/lang", // lang.hitch - "dojo/query", // query - "../registry" // registry.getEnclosingWidget -], function(array, declare, domAttr, event, lang, query, registry){ - - // module: - // dijit/form/_RadioButtonMixin - - return declare("dijit.form._RadioButtonMixin", null, { - // summary: - // Mixin to provide widget functionality for an HTML radio button - - // type: [private] String - // type attribute on `<input>` node. - // Users should not change this value. - type: "radio", - - _getRelatedWidgets: function(){ - // Private function needed to help iterate over all radio buttons in a group. - var ary = []; - query("input[type=radio]", this.focusNode.form || this.ownerDocument).forEach( // can't use name= since query doesn't support [] in the name - lang.hitch(this, function(inputNode){ - if(inputNode.name == this.name && inputNode.form == this.focusNode.form){ - var widget = registry.getEnclosingWidget(inputNode); - if(widget){ - ary.push(widget); - } - } - }) - ); - return ary; - }, - - _setCheckedAttr: function(/*Boolean*/ value){ - // If I am being checked then have to deselect currently checked radio button - this.inherited(arguments); - if(!this._created){ return; } - if(value){ - array.forEach(this._getRelatedWidgets(), lang.hitch(this, function(widget){ - if(widget != this && widget.checked){ - widget.set('checked', false); - } - })); - } - }, - - _getSubmitValue: function(/*String*/ value){ - return value === null ? "on" : value; - }, - - _onClick: function(/*Event*/ e){ - if(this.checked || this.disabled){ // nothing to do - event.stop(e); - return false; - } - if(this.readOnly){ // ignored by some browsers so we have to resync the DOM elements with widget values - event.stop(e); - array.forEach(this._getRelatedWidgets(), lang.hitch(this, function(widget){ - domAttr.set(this.focusNode || this.domNode, 'checked', widget.checked); - })); - return false; - } - return this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/form/_SearchMixin.js.uncompressed.js b/lib/dijit/form/_SearchMixin.js.uncompressed.js deleted file mode 100644 index 9cd69fcf7..000000000 --- a/lib/dijit/form/_SearchMixin.js.uncompressed.js +++ /dev/null @@ -1,264 +0,0 @@ -define("dijit/form/_SearchMixin", [ - "dojo/data/util/filter", // patternToRegExp - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/keys", // keys - "dojo/_base/lang", // lang.clone lang.hitch - "dojo/query", // query - "dojo/sniff", // has("ie") - "dojo/string", // string.substitute - "dojo/when", - "../registry" // registry.byId -], function(filter, declare, event, keys, lang, query, has, string, when, registry){ - - // module: - // dijit/form/_SearchMixin - - - return declare("dijit.form._SearchMixin", null, { - // summary: - // A mixin that implements the base functionality to search a store based upon user-entered text such as - // with `dijit/form/ComboBox` or `dijit/form/FilteringSelect` - // tags: - // protected - - // pageSize: Integer - // Argument to data provider. - // Specifies maximum number of search results to return per query - pageSize: Infinity, - - // store: [const] dojo/store/api/Store - // Reference to data provider object used by this ComboBox. - // The store must accept an object hash of properties for its query. See `query` and `queryExpr` for details. - store: null, - - // fetchProperties: Object - // Mixin to the store's fetch. - // For example, to set the sort order of the ComboBox menu, pass: - // | { sort: [{attribute:"name",descending: true}] } - // To override the default queryOptions so that deep=false, do: - // | { queryOptions: {ignoreCase: true, deep: false} } - fetchProperties:{}, - - // query: Object - // A query that can be passed to `store` to initially filter the items. - // ComboBox overwrites any reference to the `searchAttr` and sets it to the `queryExpr` with the user's input substituted. - query: {}, - - // searchDelay: Integer - // Delay in milliseconds between when user types something and we start - // searching based on that value - searchDelay: 200, - - // searchAttr: String - // Search for items in the data store where this attribute (in the item) - // matches what the user typed - searchAttr: "name", - - // queryExpr: String - // This specifies what query is sent to the data store, - // based on what the user has typed. Changing this expression will modify - // whether the results are only exact matches, a "starting with" match, - // etc. - // dojo.data query expression pattern. - // `${0}` will be substituted for the user text. - // `*` is used for wildcards. - // `${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is" - queryExpr: "${0}*", - - // ignoreCase: Boolean - // Set true if the query should ignore case when matching possible items - ignoreCase: true, - - _abortQuery: function(){ - // stop in-progress query - if(this.searchTimer){ - this.searchTimer = this.searchTimer.remove(); - } - if(this._queryDeferHandle){ - this._queryDeferHandle = this._queryDeferHandle.remove(); - } - if(this._fetchHandle){ - if(this._fetchHandle.abort){ - this._cancelingQuery = true; - this._fetchHandle.abort(); - this._cancelingQuery = false; - } - if(this._fetchHandle.cancel){ - this._cancelingQuery = true; - this._fetchHandle.cancel(); - this._cancelingQuery = false; - } - this._fetchHandle = null; - } - }, - - _processInput: function(/*Event*/ evt){ - // summary: - // Handles input (keyboard/paste) events - if(this.disabled || this.readOnly){ return; } - var key = evt.charOrCode; - - // except for cutting/pasting case - ctrl + x/v - if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == keys.SHIFT){ - return; // throw out weird key combinations and spurious events - } - - var doSearch = false; - this._prev_key_backspace = false; - - switch(key){ - case keys.DELETE: - case keys.BACKSPACE: - this._prev_key_backspace = true; - this._maskValidSubsetError = true; - doSearch = true; - break; - - default: - // Non char keys (F1-F12 etc..) shouldn't start a search.. - // Ascii characters and IME input (Chinese, Japanese etc.) should. - //IME input produces keycode == 229. - doSearch = typeof key == 'string' || key == 229; - } - if(doSearch){ - // need to wait a tad before start search so that the event - // bubbles through DOM and we have value visible - if(!this.store){ - this.onSearch(); - }else{ - this.searchTimer = this.defer("_startSearchFromInput", 1); - } - } - }, - - onSearch: function(/*===== results, query, options =====*/){ - // summary: - // Callback when a search completes. - // - // results: Object - // An array of items from the originating _SearchMixin's store. - // - // query: Object - // A copy of the originating _SearchMixin's query property. - // - // options: Object - // The additional parameters sent to the originating _SearchMixin's store, including: start, count, queryOptions. - // - // tags: - // callback - }, - - _startSearchFromInput: function(){ - this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1")); - }, - - _startSearch: function(/*String*/ text){ - // summary: - // Starts a search for elements matching text (text=="" means to return all items), - // and calls onSearch(...) when the search completes, to display the results. - - this._abortQuery(); - var - _this = this, - // Setup parameters to be passed to store.query(). - // Create a new query to prevent accidentally querying for a hidden - // value from FilteringSelect's keyField - query = lang.clone(this.query), // #5970 - options = { - start: 0, - count: this.pageSize, - queryOptions: { // remove for 2.0 - ignoreCase: this.ignoreCase, - deep: true - } - }, - qs = string.substitute(this.queryExpr, [text]), - q, - startQuery = function(){ - var resPromise = _this._fetchHandle = _this.store.query(query, options); - if(_this.disabled || _this.readOnly || (q !== _this._lastQuery)){ - return; - } // avoid getting unwanted notify - when(resPromise, function(res){ - _this._fetchHandle = null; - if(!_this.disabled && !_this.readOnly && (q === _this._lastQuery)){ // avoid getting unwanted notify - when(resPromise.total, function(total){ - res.total = total; - var pageSize = _this.pageSize; - if(isNaN(pageSize) || pageSize > res.total){ pageSize = res.total; } - // Setup method to fetching the next page of results - res.nextPage = function(direction){ - // tell callback the direction of the paging so the screen - // reader knows which menu option to shout - options.direction = direction = direction !== false; - options.count = pageSize; - if(direction){ - options.start += res.length; - if(options.start >= res.total){ - options.count = 0; - } - }else{ - options.start -= pageSize; - if(options.start < 0){ - options.count = Math.max(pageSize + options.start, 0); - options.start = 0; - } - } - if(options.count <= 0){ - res.length = 0; - _this.onSearch(res, query, options); - }else{ - startQuery(); - } - }; - _this.onSearch(res, query, options); - }); - } - }, function(err){ - _this._fetchHandle = null; - if(!_this._cancelingQuery){ // don't treat canceled query as an error - console.error(_this.declaredClass + ' ' + err.toString()); - } - }); - }; - - lang.mixin(options, this.fetchProperties); - - // Generate query - if(this.store._oldAPI){ - // remove this branch for 2.0 - q = qs; - }else{ - // Query on searchAttr is a regex for benefit of dojo/store/Memory, - // but with a toString() method to help dojo/store/JsonRest. - // Search string like "Co*" converted to regex like /^Co.*$/i. - q = filter.patternToRegExp(qs, this.ignoreCase); - q.toString = function(){ return qs; }; - } - - // set _lastQuery, *then* start the timeout - // otherwise, if the user types and the last query returns before the timeout, - // _lastQuery won't be set and their input gets rewritten - this._lastQuery = query[this.searchAttr] = q; - this._queryDeferHandle = this.defer(startQuery, this.searchDelay); - }, - - //////////// INITIALIZATION METHODS /////////////////////////////////////// - - constructor: function(){ - this.query={}; - this.fetchProperties={}; - }, - - postMixInProperties: function(){ - if(!this.store){ - var list = this.list; - if(list){ - this.store = registry.byId(list); - } - } - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/form/_Spinner.js.uncompressed.js b/lib/dijit/form/_Spinner.js.uncompressed.js deleted file mode 100644 index d4c6bc9df..000000000 --- a/lib/dijit/form/_Spinner.js.uncompressed.js +++ /dev/null @@ -1,160 +0,0 @@ -require({cache:{ -'url:dijit/form/templates/Spinner.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdata-dojo-attach-point=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▲ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdata-dojo-attach-point=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"Χ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' data-dojo-attach-point=\"textbox,focusNode\" type=\"${type}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"}}); -define("dijit/form/_Spinner", [ - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/keys", // keys keys.DOWN_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.UP_ARROW - "dojo/_base/lang", // lang.hitch - "dojo/sniff", // has("mozilla") - "dojo/mouse", // mouse.wheel - "../typematic", - "./RangeBoundTextBox", - "dojo/text!./templates/Spinner.html", - "./_TextBoxMixin" // selectInputText -], function(declare, event, keys, lang, has, mouse, typematic, RangeBoundTextBox, template, _TextBoxMixin){ - - // module: - // dijit/form/_Spinner - - return declare("dijit.form._Spinner", RangeBoundTextBox, { - // summary: - // Mixin for validation widgets with a spinner. - // description: - // This class basically (conceptually) extends `dijit/form/ValidationTextBox`. - // It modifies the template to have up/down arrows, and provides related handling code. - - // defaultTimeout: Number - // Number of milliseconds before a held arrow key or up/down button becomes typematic - defaultTimeout: 500, - - // minimumTimeout: Number - // minimum number of milliseconds that typematic event fires when held key or button is held - minimumTimeout: 10, - - // timeoutChangeRate: Number - // Fraction of time used to change the typematic timer between events. - // 1.0 means that each typematic event fires at defaultTimeout intervals. - // Less than 1.0 means that each typematic event fires at an increasing faster rate. - timeoutChangeRate: 0.90, - - // smallDelta: Number - // Adjust the value by this much when spinning using the arrow keys/buttons - smallDelta: 1, - - // largeDelta: Number - // Adjust the value by this much when spinning using the PgUp/Dn keys - largeDelta: 10, - - templateString: template, - - baseClass: "dijitTextBox dijitSpinner", - - // Set classes like dijitUpArrowButtonHover or dijitDownArrowButtonActive depending on - // mouse action over specified node - cssStateNodes: { - "upArrowNode": "dijitUpArrowButton", - "downArrowNode": "dijitDownArrowButton" - }, - - adjust: function(val /*=====, delta =====*/){ - // summary: - // Overridable function used to adjust a primitive value(Number/Date/...) by the delta amount specified. - // The val is adjusted in a way that makes sense to the object type. - // val: Object - // delta: Number - // tags: - // protected extension - return val; - }, - - _arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction, /*Number*/ increment){ - // summary: - // Handler for arrow button or arrow key being pressed - if(this.disabled || this.readOnly){ return; } - this._setValueAttr(this.adjust(this.get('value'), direction*increment), false); - _TextBoxMixin.selectInputText(this.textbox, this.textbox.value.length); - }, - - _arrowReleased: function(/*Node*/ /*===== node =====*/){ - // summary: - // Handler for arrow button or arrow key being released - this._wheelTimer = null; - }, - - _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){ - var inc=this.smallDelta; - if(node == this.textbox){ - var key = evt.charOrCode; - inc = (key == keys.PAGE_UP || key == keys.PAGE_DOWN) ? this.largeDelta : this.smallDelta; - node = (key == keys.UP_ARROW || key == keys.PAGE_UP) ? this.upArrowNode : this.downArrowNode; - } - if(count == -1){ this._arrowReleased(node); } - else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1, inc); } - }, - - _wheelTimer: null, - _mouseWheeled: function(/*Event*/ evt){ - // summary: - // Mouse wheel listener where supported - - event.stop(evt); - // FIXME: Safari bubbles - - // be nice to DOH and scroll as much as the event says to - var wheelDelta = evt.wheelDelta / 120; - if(Math.floor(wheelDelta) != wheelDelta){ - // If not an int multiple of 120, then its touchpad scrolling. - // This can change very fast so just assume 1 wheel click to make it more manageable. - wheelDelta = evt.wheelDelta > 0 ? 1 : -1; - } - var scrollAmount = evt.detail ? (evt.detail * -1) : wheelDelta; - if(scrollAmount !== 0){ - var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )]; - - this._arrowPressed(node, scrollAmount, this.smallDelta); - - if(this._wheelTimer){ - this._wheelTimer.remove(); - } - this._wheelTimer = this.defer(function(){ this._arrowReleased(node); }, 50); - } - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - this.inherited(arguments); - if(this.focusNode){ // not set when called from postMixInProperties - if(this.constraints.min !== undefined){ - this.focusNode.setAttribute("aria-valuemin", this.constraints.min); - }else{ - this.focusNode.removeAttribute("aria-valuemin"); - } - if(this.constraints.max !== undefined){ - this.focusNode.setAttribute("aria-valuemax", this.constraints.max); - }else{ - this.focusNode.removeAttribute("aria-valuemax"); - } - } - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', ...) works. - - this.focusNode.setAttribute("aria-valuenow", value); - this.inherited(arguments); - }, - - postCreate: function(){ - this.inherited(arguments); - - // extra listeners - this.connect(this.domNode, mouse.wheel, "_mouseWheeled"); - this.own( - typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout), - typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout), - typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout), - typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout) - ); - } - }); -}); diff --git a/lib/dijit/form/_TextBoxMixin.js.uncompressed.js b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js deleted file mode 100644 index 7c010bcb3..000000000 --- a/lib/dijit/form/_TextBoxMixin.js.uncompressed.js +++ /dev/null @@ -1,474 +0,0 @@ -define("dijit/form/_TextBoxMixin", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom", // dom.byId - "dojo/_base/event", // event.stop - "dojo/keys", // keys.ALT keys.CAPS_LOCK keys.CTRL keys.META keys.SHIFT - "dojo/_base/lang", // lang.mixin - "dojo/on", // on - "../main" // for exporting dijit._setSelectionRange, dijit.selectInputText -], function(array, declare, dom, event, keys, lang, on, dijit){ - -// module: -// dijit/form/_TextBoxMixin - -var _TextBoxMixin = declare("dijit.form._TextBoxMixin", null, { - // summary: - // A mixin for textbox form input widgets - - // trim: Boolean - // Removes leading and trailing whitespace if true. Default is false. - trim: false, - - // uppercase: Boolean - // Converts all characters to uppercase if true. Default is false. - uppercase: false, - - // lowercase: Boolean - // Converts all characters to lowercase if true. Default is false. - lowercase: false, - - // propercase: Boolean - // Converts the first character of each word to uppercase if true. - propercase: false, - - // maxLength: String - // HTML INPUT tag maxLength declaration. - maxLength: "", - - // selectOnClick: [const] Boolean - // If true, all text will be selected when focused with mouse - selectOnClick: false, - - // placeHolder: String - // Defines a hint to help users fill out the input field (as defined in HTML 5). - // This should only contain plain text (no html markup). - placeHolder: "", - - _getValueAttr: function(){ - // summary: - // Hook so get('value') works as we like. - // description: - // For `dijit/form/TextBox` this basically returns the value of the `<input>`. - // - // For `dijit/form/MappedTextBox` subclasses, which have both - // a "displayed value" and a separate "submit value", - // This treats the "displayed value" as the master value, computing the - // submit value from it via this.parse(). - return this.parse(this.get('displayedValue'), this.constraints); - }, - - _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ - // summary: - // Hook so set('value', ...) works. - // - // description: - // Sets the value of the widget to "value" which can be of - // any type as determined by the widget. - // - // value: - // The visual element value is also set to a corresponding, - // but not necessarily the same, value. - // - // formattedValue: - // If specified, used to set the visual element value, - // otherwise a computed visual value is used. - // - // priorityChange: - // If true, an onChange event is fired immediately instead of - // waiting for the next blur event. - - var filteredValue; - if(value !== undefined){ - // TODO: this is calling filter() on both the display value and the actual value. - // I added a comment to the filter() definition about this, but it should be changed. - filteredValue = this.filter(value); - if(typeof formattedValue != "string"){ - if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){ - formattedValue = this.filter(this.format(filteredValue, this.constraints)); - }else{ formattedValue = ''; } - } - } - if(formattedValue != null /* and !undefined */ && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ - this.textbox.value = formattedValue; - this._set("displayedValue", this.get("displayedValue")); - } - - if(this.textDir == "auto"){ - this.applyTextDir(this.focusNode, formattedValue); - } - - this.inherited(arguments, [filteredValue, priorityChange]); - }, - - // displayedValue: String - // For subclasses like ComboBox where the displayed value - // (ex: Kentucky) and the serialized value (ex: KY) are different, - // this represents the displayed value. - // - // Setting 'displayedValue' through set('displayedValue', ...) - // updates 'value', and vice-versa. Otherwise 'value' is updated - // from 'displayedValue' periodically, like onBlur etc. - // - // TODO: move declaration to MappedTextBox? - // Problem is that ComboBox references displayedValue, - // for benefit of FilteringSelect. - displayedValue: "", - - _getDisplayedValueAttr: function(){ - // summary: - // Hook so get('displayedValue') works. - // description: - // Returns the displayed value (what the user sees on the screen), - // after filtering (ie, trimming spaces etc.). - // - // For some subclasses of TextBox (like ComboBox), the displayed value - // is different from the serialized value that's actually - // sent to the server (see `dijit/form/ValidationTextBox.serialize()`) - - // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need - // this method - // TODO: this isn't really the displayed value when the user is typing - return this.filter(this.textbox.value); - }, - - _setDisplayedValueAttr: function(/*String*/ value){ - // summary: - // Hook so set('displayedValue', ...) works. - // description: - // Sets the value of the visual element to the string "value". - // The widget value is also set to a corresponding, - // but not necessarily the same, value. - - if(value == null /* or undefined */){ value = '' } - else if(typeof value != "string"){ value = String(value) } - - this.textbox.value = value; - - // sets the serialized value to something corresponding to specified displayedValue - // (if possible), and also updates the textbox.value, for example converting "123" - // to "123.00" - this._setValueAttr(this.get('value'), undefined); - - this._set("displayedValue", this.get('displayedValue')); - - // textDir support - if(this.textDir == "auto"){ - this.applyTextDir(this.focusNode, value); - } - }, - - format: function(value /*=====, constraints =====*/){ - // summary: - // Replaceable function to convert a value to a properly formatted string. - // value: String - // constraints: Object - // tags: - // protected extension - return value == null /* or undefined */ ? "" : (value.toString ? value.toString() : value); - }, - - parse: function(value /*=====, constraints =====*/){ - // summary: - // Replaceable function to convert a formatted string to a value - // value: String - // constraints: Object - // tags: - // protected extension - - return value; // String - }, - - _refreshState: function(){ - // summary: - // After the user types some characters, etc., this method is - // called to check the field for validity etc. The base method - // in `dijit/form/TextBox` does nothing, but subclasses override. - // tags: - // protected - }, - - /*===== - onInput: function(event){ - // summary: - // Connect to this function to receive notifications of various user data-input events. - // Return false to cancel the event and prevent it from being processed. - // event: - // keydown | keypress | cut | paste | input - // tags: - // callback - }, - =====*/ - onInput: function(){}, - - __skipInputEvent: false, - _onInput: function(/*Event*/ evt){ - // summary: - // Called AFTER the input event has happened - - // set text direction according to textDir that was defined in creation - if(this.textDir == "auto"){ - this.applyTextDir(this.focusNode, this.focusNode.value); - } - - this._processInput(evt); - }, - - _processInput: function(/*Event*/ evt){ - // summary: - // Default action handler for user input events - - this._refreshState(); - - // In case someone is watch()'ing for changes to displayedValue - this._set("displayedValue", this.get("displayedValue")); - }, - - postCreate: function(){ - // setting the value here is needed since value="" in the template causes "undefined" - // and setting in the DOM (instead of the JS object) helps with form reset actions - this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same - - this.inherited(arguments); - - // normalize input events to reduce spurious event processing - // onkeydown: do not forward modifier keys - // set charOrCode to numeric keycode - // onkeypress: do not forward numeric charOrCode keys (already sent through onkeydown) - // onpaste & oncut: set charOrCode to 229 (IME) - // oninput: if primary event not already processed, set charOrCode to 229 (IME), else do not forward - var handleEvent = function(e){ - var charOrCode; - if(e.type == "keydown"){ - charOrCode = e.keyCode; - switch(charOrCode){ // ignore state keys - case keys.SHIFT: - case keys.ALT: - case keys.CTRL: - case keys.META: - case keys.CAPS_LOCK: - case keys.NUM_LOCK: - case keys.SCROLL_LOCK: - return; - } - if(!e.ctrlKey && !e.metaKey && !e.altKey){ // no modifiers - switch(charOrCode){ // ignore location keys - case keys.NUMPAD_0: - case keys.NUMPAD_1: - case keys.NUMPAD_2: - case keys.NUMPAD_3: - case keys.NUMPAD_4: - case keys.NUMPAD_5: - case keys.NUMPAD_6: - case keys.NUMPAD_7: - case keys.NUMPAD_8: - case keys.NUMPAD_9: - case keys.NUMPAD_MULTIPLY: - case keys.NUMPAD_PLUS: - case keys.NUMPAD_ENTER: - case keys.NUMPAD_MINUS: - case keys.NUMPAD_PERIOD: - case keys.NUMPAD_DIVIDE: - return; - } - if((charOrCode >= 65 && charOrCode <= 90) || (charOrCode >= 48 && charOrCode <= 57) || charOrCode == keys.SPACE){ - return; // keypress will handle simple non-modified printable keys - } - var named = false; - for(var i in keys){ - if(keys[i] === e.keyCode){ - named = true; - break; - } - } - if(!named){ return; } // only allow named ones through - } - } - charOrCode = e.charCode >= 32 ? String.fromCharCode(e.charCode) : e.charCode; - if(!charOrCode){ - charOrCode = (e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == keys.SPACE ? String.fromCharCode(e.keyCode) : e.keyCode; - } - if(!charOrCode){ - charOrCode = 229; // IME - } - if(e.type == "keypress"){ - if(typeof charOrCode != "string"){ return; } - if((charOrCode >= 'a' && charOrCode <= 'z') || (charOrCode >= 'A' && charOrCode <= 'Z') || (charOrCode >= '0' && charOrCode <= '9') || (charOrCode === ' ')){ - if(e.ctrlKey || e.metaKey || e.altKey){ return; } // can only be stopped reliably in keydown - } - } - if(e.type == "input"){ - if(this.__skipInputEvent){ // duplicate event - this.__skipInputEvent = false; - return; - } - }else{ - this.__skipInputEvent = true; - } - // create fake event to set charOrCode and to know if preventDefault() was called - var faux = { faux: true }, attr; - for(attr in e){ - if(attr != "layerX" && attr != "layerY"){ // prevent WebKit warnings - var v = e[attr]; - if(typeof v != "function" && typeof v != "undefined"){ faux[attr] = v; } - } - } - lang.mixin(faux, { - charOrCode: charOrCode, - _wasConsumed: false, - preventDefault: function(){ - faux._wasConsumed = true; - e.preventDefault(); - }, - stopPropagation: function(){ e.stopPropagation(); } - }); - // give web page author a chance to consume the event - //console.log(faux.type + ', charOrCode = (' + (typeof charOrCode) + ') ' + charOrCode + ', ctrl ' + !!faux.ctrlKey + ', alt ' + !!faux.altKey + ', meta ' + !!faux.metaKey + ', shift ' + !!faux.shiftKey); - if(this.onInput(faux) === false){ // return false means stop - faux.preventDefault(); - faux.stopPropagation(); - } - if(faux._wasConsumed){ return; } // if preventDefault was called - this.defer(function(){ this._onInput(faux); }); // widget notification after key has posted - }; - this.own(on(this.textbox, "keydown, keypress, paste, cut, input, compositionend", lang.hitch(this, handleEvent))); - }, - - _blankValue: '', // if the textbox is blank, what value should be reported - filter: function(val){ - // summary: - // Auto-corrections (such as trimming) that are applied to textbox - // value on blur or form submit. - // description: - // For MappedTextBox subclasses, this is called twice - // - // - once with the display value - // - once the value as set/returned by set('value', ...) - // - // and get('value'), ex: a Number for NumberTextBox. - // - // In the latter case it does corrections like converting null to NaN. In - // the former case the NumberTextBox.filter() method calls this.inherited() - // to execute standard trimming code in TextBox.filter(). - // - // TODO: break this into two methods in 2.0 - // - // tags: - // protected extension - if(val === null){ return this._blankValue; } - if(typeof val != "string"){ return val; } - if(this.trim){ - val = lang.trim(val); - } - if(this.uppercase){ - val = val.toUpperCase(); - } - if(this.lowercase){ - val = val.toLowerCase(); - } - if(this.propercase){ - val = val.replace(/[^\s]+/g, function(word){ - return word.substring(0,1).toUpperCase() + word.substring(1); - }); - } - return val; - }, - - _setBlurValue: function(){ - this._setValueAttr(this.get('value'), true); - }, - - _onBlur: function(e){ - if(this.disabled){ return; } - this._setBlurValue(); - this.inherited(arguments); - }, - - _isTextSelected: function(){ - return this.textbox.selectionStart != this.textbox.selectionEnd; - }, - - _onFocus: function(/*String*/ by){ - if(this.disabled || this.readOnly){ return; } - - // Select all text on focus via click if nothing already selected. - // Since mouse-up will clear the selection, need to defer selection until after mouse-up. - // Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event. - if(this.selectOnClick && by == "mouse"){ - this._selectOnClickHandle = this.connect(this.domNode, "onmouseup", function(){ - // Only select all text on first click; otherwise users would have no way to clear - // the selection. - this.disconnect(this._selectOnClickHandle); - this._selectOnClickHandle = null; - - // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up) - // and if not, then select all the text - if(!this._isTextSelected()){ - _TextBoxMixin.selectInputText(this.textbox); - } - }); - // in case the mouseup never comes - this.defer(function(){ - if(this._selectOnClickHandle){ - this.disconnect(this._selectOnClickHandle); - this._selectOnClickHandle = null; - } - }, 500); // if mouseup not received soon, then treat it as some gesture - } - // call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport - // (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip - this.inherited(arguments); - - this._refreshState(); - }, - - reset: function(){ - // Overrides `dijit/_FormWidget/reset()`. - // Additionally resets the displayed textbox value to '' - this.textbox.value = ''; - this.inherited(arguments); - }, - - _setTextDirAttr: function(/*String*/ textDir){ - // summary: - // Setter for textDir. - // description: - // Users shouldn't call this function; they should be calling - // set('textDir', value) - // tags: - // private - - // only if new textDir is different from the old one - // and on widgets creation. - if(!this._created - || this.textDir != textDir){ - this._set("textDir", textDir); - // so the change of the textDir will take place immediately. - this.applyTextDir(this.focusNode, this.focusNode.value); - } - } -}); - - -_TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ - if(element.setSelectionRange){ - element.setSelectionRange(start, stop); - } -}; - -_TextBoxMixin.selectInputText = dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){ - // summary: - // Select text in the input element argument, from start (default 0), to stop (default end). - - // TODO: use functions in _editor/selection.js? - element = dom.byId(element); - if(isNaN(start)){ start = 0; } - if(isNaN(stop)){ stop = element.value ? element.value.length : 0; } - try{ - element.focus(); - _TextBoxMixin._setSelectionRange(element, start, stop); - }catch(e){ /* squelch random errors (esp. on IE) from unexpected focus changes or DOM nodes being hidden */ } -}; - -return _TextBoxMixin; -}); diff --git a/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js deleted file mode 100644 index dabd07928..000000000 --- a/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js +++ /dev/null @@ -1,55 +0,0 @@ -define("dijit/form/_ToggleButtonMixin", [ - "dojo/_base/declare", // declare - "dojo/dom-attr" // domAttr.set -], function(declare, domAttr){ - -// module: -// dijit/form/_ToggleButtonMixin - -return declare("dijit.form._ToggleButtonMixin", null, { - // summary: - // A mixin to provide functionality to allow a button that can be in two states (checked or not). - - // checked: Boolean - // Corresponds to the native HTML `<input>` element's attribute. - // In markup, specified as "checked='checked'" or just "checked". - // True if the button is depressed, or the checkbox is checked, - // or the radio button is selected, etc. - checked: false, - - // aria-pressed for toggle buttons, and aria-checked for checkboxes - _aria_attr: "aria-pressed", - - _onClick: function(/*Event*/ evt){ - var original = this.checked; - this._set('checked', !original); // partially set the toggled value, assuming the toggle will work, so it can be overridden in the onclick handler - var ret = this.inherited(arguments); // the user could reset the value here - this.set('checked', ret ? this.checked : original); // officially set the toggled or user value, or reset it back - return ret; - }, - - _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){ - this._set("checked", value); - var node = this.focusNode || this.domNode; - domAttr.set(node, "checked", !!value); // "mixed" -> true - if(value){ - node.setAttribute("checked", ""); - }else{ - node.removeAttribute("checked"); - } - node.setAttribute(this._aria_attr, String(value)); // aria values should be strings - this._handleOnChange(value, priorityChange); - }, - - reset: function(){ - // summary: - // Reset the widget's value to what it was at initialization time - - this._hasBeenBlurred = false; - - // set checked state to original setting - this.set('checked', this.params.checked || false); - } -}); - -}); diff --git a/lib/dijit/form/nls/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ComboBox.js.uncompressed.js deleted file mode 100644 index dd9807dda..000000000 --- a/lib/dijit/form/nls/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,40 +0,0 @@ -define("dijit/form/nls/ComboBox", { root: -//begin v1.x content -({ - previousMessage: "Previous choices", - nextMessage: "More choices" -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/form/nls/Textarea.js.uncompressed.js b/lib/dijit/form/nls/Textarea.js.uncompressed.js deleted file mode 100644 index 2d05609c1..000000000 --- a/lib/dijit/form/nls/Textarea.js.uncompressed.js +++ /dev/null @@ -1,43 +0,0 @@ -define("dijit/form/nls/Textarea", { root: -//begin v1.x content -// used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'edit area', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'edit area frame' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js deleted file mode 100644 index 6712ff35d..000000000 --- a/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/ar/ComboBox", ({ - previousMessage: "الاختيارات السابقة", - nextMessage: "مزيد من الاختيارات" -}) -); diff --git a/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js deleted file mode 100644 index f3b1a2780..000000000 --- a/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/ar/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'مساحة التحرير', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'اطار مساحة التحرير' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/ar/validate.js.uncompressed.js b/lib/dijit/form/nls/ar/validate.js.uncompressed.js deleted file mode 100644 index 9445e2e07..000000000 --- a/lib/dijit/form/nls/ar/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/ar/validate", ({ - invalidMessage: "القيمة التي تم ادخالها غير صحيحة.", - missingMessage: "يجب ادخال هذه القيمة.", - rangeMessage: "هذه القيمة ليس بالمدى الصحيح." -}) -); diff --git a/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js deleted file mode 100644 index 4522d81f6..000000000 --- a/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/az/ComboBox", ({ - "previousMessage" : "Əvvəlki variantlar", - "nextMessage" : "Başqa variantlar" -}) -); diff --git a/lib/dijit/form/nls/az/Textarea.js.uncompressed.js b/lib/dijit/form/nls/az/Textarea.js.uncompressed.js deleted file mode 100644 index 065fc024e..000000000 --- a/lib/dijit/form/nls/az/Textarea.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/az/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - "iframeEditTitle" : "Redaktə sahəsi", - "iframeFocusTitle" : "Redaktə sahəsi çərçivəsi" -}) -); diff --git a/lib/dijit/form/nls/az/validate.js.uncompressed.js b/lib/dijit/form/nls/az/validate.js.uncompressed.js deleted file mode 100644 index 641097ab0..000000000 --- a/lib/dijit/form/nls/az/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/az/validate", ({ - "rangeMessage" : "Bu dəyər aralıq xaricində.", - "invalidMessage" : "Girilən dəyər keçərli deyil.", - "missingMessage" : "Bu deyər lazımlı." -}) -); diff --git a/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js deleted file mode 100644 index 1de0e3e9c..000000000 --- a/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/ca/ComboBox", ({ - previousMessage: "Opcions anteriors", - nextMessage: "Més opcions" -}) -); diff --git a/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js deleted file mode 100644 index 6c24ee46e..000000000 --- a/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/ca/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'àrea d\'edició', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'Marc de l\'àrea d\'edició' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/ca/validate.js.uncompressed.js b/lib/dijit/form/nls/ca/validate.js.uncompressed.js deleted file mode 100644 index f5badf7cf..000000000 --- a/lib/dijit/form/nls/ca/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/ca/validate", ({ - invalidMessage: "El valor introduït no és vàlid", - missingMessage: "Aquest valor és necessari", - rangeMessage: "Aquest valor és fora de l'interval" -}) -); diff --git a/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js deleted file mode 100644 index 0976a71e4..000000000 --- a/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/cs/ComboBox", ({ - previousMessage: "Předchozí volby", - nextMessage: "Další volby" -}) -); diff --git a/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js b/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js deleted file mode 100644 index ff81072e2..000000000 --- a/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/cs/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'oblast úprav', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'rámec oblasti úprav' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/cs/validate.js.uncompressed.js b/lib/dijit/form/nls/cs/validate.js.uncompressed.js deleted file mode 100644 index 4409056a0..000000000 --- a/lib/dijit/form/nls/cs/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/cs/validate", ({ - invalidMessage: "Zadaná hodnota není platná.", - missingMessage: "Tato hodnota je vyžadována.", - rangeMessage: "Tato hodnota je mimo rozsah." -}) -); diff --git a/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js deleted file mode 100644 index a5c78b81b..000000000 --- a/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/da/ComboBox", ({ - previousMessage: "Forrige valg", - nextMessage: "Flere valg" -}) -); diff --git a/lib/dijit/form/nls/da/Textarea.js.uncompressed.js b/lib/dijit/form/nls/da/Textarea.js.uncompressed.js deleted file mode 100644 index 9c259d4df..000000000 --- a/lib/dijit/form/nls/da/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/da/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'ramme om redigeringsområde' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/da/validate.js.uncompressed.js b/lib/dijit/form/nls/da/validate.js.uncompressed.js deleted file mode 100644 index 43dbdc57c..000000000 --- a/lib/dijit/form/nls/da/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/da/validate", ({ - invalidMessage: "Den angivne værdi er ugyldig.", - missingMessage: "Værdien er påkrævet.", - rangeMessage: "Værdien er uden for intervallet." -}) -); diff --git a/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js deleted file mode 100644 index 9117ccd52..000000000 --- a/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/de/ComboBox", ({ - previousMessage: "Vorherige Auswahl", - nextMessage: "Weitere Auswahlmöglichkeiten" -}) -); diff --git a/lib/dijit/form/nls/de/Textarea.js.uncompressed.js b/lib/dijit/form/nls/de/Textarea.js.uncompressed.js deleted file mode 100644 index f5703e383..000000000 --- a/lib/dijit/form/nls/de/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/de/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'Editierbereich', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'Rahmen für Editierbereich' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/de/validate.js.uncompressed.js b/lib/dijit/form/nls/de/validate.js.uncompressed.js deleted file mode 100644 index 5fd19699c..000000000 --- a/lib/dijit/form/nls/de/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/de/validate", ({ - invalidMessage: "Der eingegebene Wert ist ungültig. ", - missingMessage: "Dieser Wert ist erforderlich.", - rangeMessage: "Dieser Wert liegt außerhalb des gültigen Bereichs. " -}) -); diff --git a/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js deleted file mode 100644 index e749e7166..000000000 --- a/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/el/ComboBox", ({ - previousMessage: "Προηγούμενες επιλογές", - nextMessage: "Περισσότερες επιλογές" -}) -); diff --git a/lib/dijit/form/nls/el/Textarea.js.uncompressed.js b/lib/dijit/form/nls/el/Textarea.js.uncompressed.js deleted file mode 100644 index 383c37aa9..000000000 --- a/lib/dijit/form/nls/el/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/el/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'περιοχή επεξεργασίας', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'πλαίσιο περιοχής επεξεργασίας' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/el/validate.js.uncompressed.js b/lib/dijit/form/nls/el/validate.js.uncompressed.js deleted file mode 100644 index 626a9ad60..000000000 --- a/lib/dijit/form/nls/el/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/el/validate", ({ - invalidMessage: "Η τιμή που καταχωρήσατε δεν είναι έγκυρη.", - missingMessage: "Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί.", - rangeMessage: "Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών." -}) -); diff --git a/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js deleted file mode 100644 index 3421e0e76..000000000 --- a/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/es/ComboBox", ({ - previousMessage: "Opciones anteriores", - nextMessage: "Más opciones" -}) -); diff --git a/lib/dijit/form/nls/es/Textarea.js.uncompressed.js b/lib/dijit/form/nls/es/Textarea.js.uncompressed.js deleted file mode 100644 index 89b9e0bdd..000000000 --- a/lib/dijit/form/nls/es/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/es/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'área de edición', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'marco del área de edición' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/es/validate.js.uncompressed.js b/lib/dijit/form/nls/es/validate.js.uncompressed.js deleted file mode 100644 index 5f54b3cc8..000000000 --- a/lib/dijit/form/nls/es/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/es/validate", ({ - invalidMessage: "El valor especificado no es válido.", - missingMessage: "Este valor es necesario.", - rangeMessage: "Este valor está fuera del intervalo." -}) -); diff --git a/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js deleted file mode 100644 index 8bb153b2f..000000000 --- a/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/fi/ComboBox", ({ - previousMessage: "Edelliset valinnat", - nextMessage: "Lisää valintoja" -}) -); diff --git a/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js b/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js deleted file mode 100644 index a71666147..000000000 --- a/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/fi/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'muokkausalue', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'muokkausalueen kehys' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/fi/validate.js.uncompressed.js b/lib/dijit/form/nls/fi/validate.js.uncompressed.js deleted file mode 100644 index f081ee0af..000000000 --- a/lib/dijit/form/nls/fi/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/fi/validate", ({ - invalidMessage: "Annettu arvo ei kelpaa.", - missingMessage: "Tämä arvo on pakollinen.", - rangeMessage: "Tämä arvo on sallitun alueen ulkopuolella." -}) -); diff --git a/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js deleted file mode 100644 index db10552b6..000000000 --- a/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/fr/ComboBox", ({ - previousMessage: "Choix précédents", - nextMessage: "Plus de choix" -}) -); diff --git a/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js deleted file mode 100644 index 564a98c4f..000000000 --- a/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/fr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'zone d\'édition', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'cadre de la zone d\'édition' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/fr/validate.js.uncompressed.js b/lib/dijit/form/nls/fr/validate.js.uncompressed.js deleted file mode 100644 index b706349dc..000000000 --- a/lib/dijit/form/nls/fr/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/fr/validate", ({ - invalidMessage: "La valeur indiquée n'est pas correcte.", - missingMessage: "Cette valeur est requise.", - rangeMessage: "Cette valeur n'est pas comprise dans la plage autorisée." -}) -); diff --git a/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js deleted file mode 100644 index be6411478..000000000 --- a/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/he/ComboBox", ({ - previousMessage: "האפשרויות הקודמות", - nextMessage: "אפשרויות נוספות" -}) -); diff --git a/lib/dijit/form/nls/he/Textarea.js.uncompressed.js b/lib/dijit/form/nls/he/Textarea.js.uncompressed.js deleted file mode 100644 index 770ddb75b..000000000 --- a/lib/dijit/form/nls/he/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/he/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'אזור עריכה', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'מסגרת אזור עריכה' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/he/validate.js.uncompressed.js b/lib/dijit/form/nls/he/validate.js.uncompressed.js deleted file mode 100644 index c52edfb9d..000000000 --- a/lib/dijit/form/nls/he/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/he/validate", ({ - invalidMessage: "הערך שצוין אינו חוקי.", - missingMessage: "זהו ערך דרוש.", - rangeMessage: "הערך מחוץ לטווח." -}) -); diff --git a/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js deleted file mode 100644 index c242142cd..000000000 --- a/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/hr/ComboBox", ({ - previousMessage: "Prethodni izbori", - nextMessage: "Više izbora" -}) -); diff --git a/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js deleted file mode 100644 index bfe511dc9..000000000 --- a/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/hr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'područje uređivanja', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'okvir područja uređivanja' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/hr/validate.js.uncompressed.js b/lib/dijit/form/nls/hr/validate.js.uncompressed.js deleted file mode 100644 index 80784c8e1..000000000 --- a/lib/dijit/form/nls/hr/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/hr/validate", ({ - invalidMessage: "Unesena vrijednost nije važeća.", - missingMessage: "Potrebna je ova vrijednost.", - rangeMessage: "Ova vrijednost je izvan raspona." -}) -); diff --git a/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js deleted file mode 100644 index e29e01583..000000000 --- a/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/hu/ComboBox", ({ - previousMessage: "Előző menüpontok", - nextMessage: "További menüpontok" -}) -); diff --git a/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js b/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js deleted file mode 100644 index cd65cd35f..000000000 --- a/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/hu/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'szerkesztési terület', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'szerkesztési terület keret' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/hu/validate.js.uncompressed.js b/lib/dijit/form/nls/hu/validate.js.uncompressed.js deleted file mode 100644 index 129d268bd..000000000 --- a/lib/dijit/form/nls/hu/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/hu/validate", ({ - invalidMessage: "A megadott érték érvénytelen.", - missingMessage: "Meg kell adni egy értéket.", - rangeMessage: "Az érték kívül van a megengedett tartományon." -}) -); diff --git a/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js deleted file mode 100644 index a8710ea92..000000000 --- a/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/it/ComboBox", ({ - previousMessage: "Scelte precedenti", - nextMessage: "Scelte successive" -}) -); diff --git a/lib/dijit/form/nls/it/Textarea.js.uncompressed.js b/lib/dijit/form/nls/it/Textarea.js.uncompressed.js deleted file mode 100644 index 21953ee4c..000000000 --- a/lib/dijit/form/nls/it/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/it/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'modifica area', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'modifica frame area' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/it/validate.js.uncompressed.js b/lib/dijit/form/nls/it/validate.js.uncompressed.js deleted file mode 100644 index 0e61395ea..000000000 --- a/lib/dijit/form/nls/it/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/it/validate", ({ - invalidMessage: "Il valore immesso non è valido.", - missingMessage: "Questo valore è obbligatorio.", - rangeMessage: "Questo valore è fuori dall'intervallo consentito." -}) -); diff --git a/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js deleted file mode 100644 index 7b7cfe934..000000000 --- a/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/ja/ComboBox", ({ - previousMessage: "以前の選択項目", - nextMessage: "追加の選択項目" -}) -); diff --git a/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js deleted file mode 100644 index dc0218f3d..000000000 --- a/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/ja/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: '編集域', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: '編集域フレーム' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/ja/validate.js.uncompressed.js b/lib/dijit/form/nls/ja/validate.js.uncompressed.js deleted file mode 100644 index e5d2c4d6e..000000000 --- a/lib/dijit/form/nls/ja/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/ja/validate", ({ - invalidMessage: "入力した値は無効です。", - missingMessage: "この値は必須です。", - rangeMessage: "この値は範囲外です。" -}) -); diff --git a/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js deleted file mode 100644 index 123045ac2..000000000 --- a/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/kk/ComboBox", ({ - previousMessage: "Алдыңғы нұсқалар", - nextMessage: "Басқа нұсқалар" -}) -); diff --git a/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js b/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js deleted file mode 100644 index 17e849eaa..000000000 --- a/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/kk/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'өңдеу аумағы', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'өңдеу аумағының жақтауы' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/kk/validate.js.uncompressed.js b/lib/dijit/form/nls/kk/validate.js.uncompressed.js deleted file mode 100644 index c5a2828d6..000000000 --- a/lib/dijit/form/nls/kk/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/kk/validate", ({ - invalidMessage: "Енгізілген мән жарамды емес.", - missingMessage: "Бұл мән міндетті.", - rangeMessage: "Бұл мән ауқымнан тыс." -}) -); diff --git a/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js deleted file mode 100644 index ab3fbad6a..000000000 --- a/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/ko/ComboBox", ({ - previousMessage: "이전 선택사항", - nextMessage: "기타 선택사항" -}) -); diff --git a/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js deleted file mode 100644 index 670dceaa9..000000000 --- a/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/ko/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: '편집 영역', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: '편집 영역 프레임' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/ko/validate.js.uncompressed.js b/lib/dijit/form/nls/ko/validate.js.uncompressed.js deleted file mode 100644 index 2b38c0a92..000000000 --- a/lib/dijit/form/nls/ko/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/ko/validate", ({ - invalidMessage: "입력된 값이 올바르지 않습니다.", - missingMessage: "이 값은 필수입니다.", - rangeMessage: "이 값은 범위를 벗어납니다." -}) -); diff --git a/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js deleted file mode 100644 index c05fcd36b..000000000 --- a/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/nb/ComboBox", ({ - previousMessage: "Tidligere valg", - nextMessage: "Flere valg" -}) -); diff --git a/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js b/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js deleted file mode 100644 index 656fd191b..000000000 --- a/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/nb/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'ramme for redigeringsområde' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/nb/validate.js.uncompressed.js b/lib/dijit/form/nls/nb/validate.js.uncompressed.js deleted file mode 100644 index bab0094bb..000000000 --- a/lib/dijit/form/nls/nb/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/nb/validate", ({ - invalidMessage: "Den angitte verdien er ikke gyldig.", - missingMessage: "Denne verdien er obligatorisk.", - rangeMessage: "Denne verdien er utenfor gyldig område." -}) -); diff --git a/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js deleted file mode 100644 index 2aa44597d..000000000 --- a/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/nl/ComboBox", ({ - previousMessage: "Eerdere opties", - nextMessage: "Meer opties" -}) -); diff --git a/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js deleted file mode 100644 index 5f26a130b..000000000 --- a/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/nl/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'veld bewerken', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'veldkader bewerken' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/nl/validate.js.uncompressed.js b/lib/dijit/form/nls/nl/validate.js.uncompressed.js deleted file mode 100644 index e62882456..000000000 --- a/lib/dijit/form/nls/nl/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/nl/validate", ({ - invalidMessage: "De opgegeven waarde is ongeldig.", - missingMessage: "Deze waarde is verplicht.", - rangeMessage: "Deze waarde is niet toegestaan." -}) -); diff --git a/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js deleted file mode 100644 index b1e34aada..000000000 --- a/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/pl/ComboBox", ({ - previousMessage: "Poprzednie wybory", - nextMessage: "Więcej wyborów" -}) -); diff --git a/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js deleted file mode 100644 index 99a7c2afc..000000000 --- a/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/pl/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'edycja obszaru', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'edycja ramki obszaru' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/pl/validate.js.uncompressed.js b/lib/dijit/form/nls/pl/validate.js.uncompressed.js deleted file mode 100644 index 0c115c1c0..000000000 --- a/lib/dijit/form/nls/pl/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/pl/validate", ({ - invalidMessage: "Wprowadzona wartość jest nieprawidłowa.", - missingMessage: "Ta wartość jest wymagana.", - rangeMessage: "Ta wartość jest spoza zakresu." -}) -); diff --git a/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js deleted file mode 100644 index df9b05f2c..000000000 --- a/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/pt-pt/ComboBox", ({ - previousMessage: "Opções anteriores", - nextMessage: "Mais opções" -}) -); diff --git a/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js deleted file mode 100644 index 1a65b1c23..000000000 --- a/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/pt-pt/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'área de edição', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'painel da área de edição' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js deleted file mode 100644 index e64416837..000000000 --- a/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/pt-pt/validate", ({ - invalidMessage: "O valor introduzido não é válido.", - missingMessage: "Este valor é requerido.", - rangeMessage: "Este valor encontra-se fora do intervalo." -}) -); diff --git a/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js deleted file mode 100644 index a3675f7f1..000000000 --- a/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/pt/ComboBox", ({ - previousMessage: "Opções anteriores", - nextMessage: "Mais opções" -}) -); diff --git a/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js deleted file mode 100644 index 69a1c3a03..000000000 --- a/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/pt/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'editar área', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'editar quadro da área' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/pt/validate.js.uncompressed.js b/lib/dijit/form/nls/pt/validate.js.uncompressed.js deleted file mode 100644 index bf2b583bb..000000000 --- a/lib/dijit/form/nls/pt/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/pt/validate", ({ - invalidMessage: "O valor inserido não é válido.", - missingMessage: "Este valor é necessário.", - rangeMessage: "Este valor está fora do intervalo. " -}) -); diff --git a/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js deleted file mode 100644 index ad4e57210..000000000 --- a/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/ro/ComboBox", ({ - previousMessage: "Alegeri anterioare", - nextMessage: "Mai multe alegeri" -}) -); diff --git a/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js deleted file mode 100644 index e691fbec5..000000000 --- a/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/ro/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'zonă de editare', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'cadru zonă de editare' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/ro/validate.js.uncompressed.js b/lib/dijit/form/nls/ro/validate.js.uncompressed.js deleted file mode 100644 index 841221c24..000000000 --- a/lib/dijit/form/nls/ro/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/ro/validate", ({ - invalidMessage: "Valoarea introdusă nu este validă.", - missingMessage: "Această valoare este necesară.", - rangeMessage: "Această valoare este în afara intervalului. " -}) -); diff --git a/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js deleted file mode 100644 index 5782c3930..000000000 --- a/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/ru/ComboBox", ({ - previousMessage: "Предыдущие варианты", - nextMessage: "Следующие варианты" -}) -); diff --git a/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js deleted file mode 100644 index fa9705a8e..000000000 --- a/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/ru/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'область редактирования', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'фрейм области редактирования' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/ru/validate.js.uncompressed.js b/lib/dijit/form/nls/ru/validate.js.uncompressed.js deleted file mode 100644 index 50174b18d..000000000 --- a/lib/dijit/form/nls/ru/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/ru/validate", ({ - invalidMessage: "Указано недопустимое значение.", - missingMessage: "Это обязательное значение.", - rangeMessage: "Это значение вне диапазона." -}) -); diff --git a/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js deleted file mode 100644 index 98602c530..000000000 --- a/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/sk/ComboBox", ({ - previousMessage: "Predchádzajúce možnosti", - nextMessage: "Viac možností" -}) -); diff --git a/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js deleted file mode 100644 index 0bc6f107c..000000000 --- a/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/sk/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'upraviť oblasť', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'upraviť rámec oblasti' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/sk/validate.js.uncompressed.js b/lib/dijit/form/nls/sk/validate.js.uncompressed.js deleted file mode 100644 index 747907a59..000000000 --- a/lib/dijit/form/nls/sk/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/sk/validate", ({ - invalidMessage: "Zadaná hodnota nie je platná.", - missingMessage: "Táto hodnota je povinná.", - rangeMessage: "Táto hodnota je mimo rozsah." -}) -); diff --git a/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js deleted file mode 100644 index 45e3d998c..000000000 --- a/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/sl/ComboBox", ({ - previousMessage: "Prejšnje izbire", - nextMessage: "Dodatne izbire" -}) -); diff --git a/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js deleted file mode 100644 index 6420d6a47..000000000 --- a/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/sl/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'urejevalno področje', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'okvir urejevalnega področja' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/sl/validate.js.uncompressed.js b/lib/dijit/form/nls/sl/validate.js.uncompressed.js deleted file mode 100644 index e23377b24..000000000 --- a/lib/dijit/form/nls/sl/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/sl/validate", ({ - invalidMessage: "Vnesena vrednost ni veljavna.", - missingMessage: "Ta vrednost je zahtevana.", - rangeMessage: "Ta vrednost je izven območja." -}) -); diff --git a/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js deleted file mode 100644 index 2096aa739..000000000 --- a/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/sv/ComboBox", ({ - previousMessage: "Tidigare val", - nextMessage: "Fler val" -}) -); diff --git a/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js deleted file mode 100644 index 33a0b812b..000000000 --- a/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/sv/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'redigeringsområdesram' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/sv/validate.js.uncompressed.js b/lib/dijit/form/nls/sv/validate.js.uncompressed.js deleted file mode 100644 index 62d235516..000000000 --- a/lib/dijit/form/nls/sv/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/sv/validate", ({ - invalidMessage: "Angivet värde är inte giltigt.", - missingMessage: "Värdet krävs.", - rangeMessage: "Värdet ligger utanför intervallet." -}) -); diff --git a/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js deleted file mode 100644 index 035df3f3c..000000000 --- a/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/th/ComboBox", ({ - previousMessage: "การเลือกก่อนหน้า", - nextMessage: "การเลือกเพิ่มเติม" -}) -); diff --git a/lib/dijit/form/nls/th/Textarea.js.uncompressed.js b/lib/dijit/form/nls/th/Textarea.js.uncompressed.js deleted file mode 100644 index a306e27b0..000000000 --- a/lib/dijit/form/nls/th/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/th/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'พื้นที่แก้ไข', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'กรอบพื้นที่แก้ไข' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/th/validate.js.uncompressed.js b/lib/dijit/form/nls/th/validate.js.uncompressed.js deleted file mode 100644 index 512cd4fc7..000000000 --- a/lib/dijit/form/nls/th/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/th/validate", ({ - invalidMessage: "ค่าที่ป้อนไม่ถูกต้อง", - missingMessage: "จำเป็นต้องมีค่านี้", - rangeMessage: "ค่านี้เกินช่วง" -}) -); diff --git a/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js deleted file mode 100644 index ca5af6817..000000000 --- a/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/tr/ComboBox", ({ - previousMessage: "Önceki seçenekler", - nextMessage: "Diğer seçenekler" -}) -); diff --git a/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js deleted file mode 100644 index d9e4e8fe7..000000000 --- a/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/tr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: 'düzenleme alanı', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: 'düzenleme alanı çerçevesi' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/tr/validate.js.uncompressed.js b/lib/dijit/form/nls/tr/validate.js.uncompressed.js deleted file mode 100644 index b00351fc7..000000000 --- a/lib/dijit/form/nls/tr/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/tr/validate", ({ - invalidMessage: "Girilen değer geçersiz.", - missingMessage: "Bu değer gerekli.", - rangeMessage: "Bu değer aralık dışında." -}) -); diff --git a/lib/dijit/form/nls/validate.js.uncompressed.js b/lib/dijit/form/nls/validate.js.uncompressed.js deleted file mode 100644 index 421ddb51a..000000000 --- a/lib/dijit/form/nls/validate.js.uncompressed.js +++ /dev/null @@ -1,41 +0,0 @@ -define("dijit/form/nls/validate", { root: -//begin v1.x content -({ - invalidMessage: "The value entered is not valid.", - missingMessage: "This value is required.", - rangeMessage: "This value is out of range." -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js deleted file mode 100644 index c85710946..000000000 --- a/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/zh-tw/ComboBox", ({ - previousMessage: "前一個選擇項", - nextMessage: "其他選擇項" -}) -); diff --git a/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js deleted file mode 100644 index e36c60bbc..000000000 --- a/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/zh-tw/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: '編輯區', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: '編輯區框' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js deleted file mode 100644 index f6d052f96..000000000 --- a/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/zh-tw/validate", ({ - invalidMessage: "輸入的值無效。", - missingMessage: "必須提供此值。", - rangeMessage: "此值超出範圍。" -}) -); diff --git a/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js deleted file mode 100644 index 177ee8117..000000000 --- a/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/form/nls/zh/ComboBox", ({ - previousMessage: "先前选项", - nextMessage: "更多选项" -}) -); diff --git a/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js b/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js deleted file mode 100644 index 09fe9c853..000000000 --- a/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js +++ /dev/null @@ -1,9 +0,0 @@ -define( -"dijit/form/nls/zh/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users -({ - iframeEditTitle: '编辑区域', // primary title for editable IFRAME, for screen readers when focus is in the editing area - iframeFocusTitle: '编辑区域框' // secondary title for editable IFRAME when focus is on outer container - // to let user know that focus has moved out of editing area and to the - // parent element of the editing area -}) -); diff --git a/lib/dijit/form/nls/zh/validate.js.uncompressed.js b/lib/dijit/form/nls/zh/validate.js.uncompressed.js deleted file mode 100644 index ed5178f97..000000000 --- a/lib/dijit/form/nls/zh/validate.js.uncompressed.js +++ /dev/null @@ -1,7 +0,0 @@ -define( -"dijit/form/nls/zh/validate", ({ - invalidMessage: "输入的值无效。", - missingMessage: "该值是必需的。", - rangeMessage: "此值超出范围。" -}) -); diff --git a/lib/dijit/hccss.js.uncompressed.js b/lib/dijit/hccss.js.uncompressed.js deleted file mode 100644 index 9e0ac88e8..000000000 --- a/lib/dijit/hccss.js.uncompressed.js +++ /dev/null @@ -1,23 +0,0 @@ -define("dijit/hccss", ["dojo/dom-class", "dojo/hccss", "dojo/ready", "dojo/_base/window"], function(domClass, has, ready, win){ - - // module: - // dijit/hccss - - /*===== - return function(){ - // summary: - // Test if computer is in high contrast mode, and sets `dijit_a11y` flag on `<body>` if it is. - // Deprecated, use ``dojo/hccss`` instead. - }; - =====*/ - - // Priority is 90 to run ahead of parser priority of 100. For 2.0, remove the ready() call and instead - // change this module to depend on dojo/domReady! - ready(90, function(){ - if(has("highcontrast")){ - domClass.add(win.body(), "dijit_a11y"); - } - }); - - return has; -}); diff --git a/lib/dijit/layout/AccordionContainer.js.uncompressed.js b/lib/dijit/layout/AccordionContainer.js.uncompressed.js deleted file mode 100644 index 68f9856bf..000000000 --- a/lib/dijit/layout/AccordionContainer.js.uncompressed.js +++ /dev/null @@ -1,540 +0,0 @@ -require({cache:{ -'url:dijit/layout/templates/AccordionButton.html':"<div data-dojo-attach-event='onclick:_onTitleClick' class='dijitAccordionTitle' role=\"presentation\">\n\t<div data-dojo-attach-point='titleNode,focusNode' data-dojo-attach-event='onkeypress:_onTitleKeyPress'\n\t\t\tclass='dijitAccordionTitleFocus' role=\"tab\" aria-expanded=\"false\"\n\t\t><span class='dijitInline dijitAccordionArrow' role=\"presentation\"></span\n\t\t><span class='arrowTextUp' role=\"presentation\">+</span\n\t\t><span class='arrowTextDown' role=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" data-dojo-attach-point='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" data-dojo-attach-point='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"}}); -define("dijit/layout/AccordionContainer", [ - "require", - "dojo/_base/array", // array.forEach array.map - "dojo/_base/declare", // declare - "dojo/_base/event", // event.stop - "dojo/_base/fx", // fx.Animation - "dojo/dom", // dom.setSelectable - "dojo/dom-attr", // domAttr.attr - "dojo/dom-class", // domClass.remove - "dojo/dom-construct", // domConstruct.place - "dojo/dom-geometry", - "dojo/keys", // keys - "dojo/_base/lang", // lang.getObject lang.hitch - "dojo/sniff", // has("ie") has("dijit-legacy-requires") - "dojo/topic", // publish - "../focus", // focus.focus() - "../_base/manager", // manager.defaultDuration - "dojo/ready", - "../_Widget", - "../_Container", - "../_TemplatedMixin", - "../_CssStateMixin", - "./StackContainer", - "./ContentPane", - "dojo/text!./templates/AccordionButton.html" -], function(require, array, declare, event, fx, dom, domAttr, domClass, domConstruct, domGeometry, - keys, lang, has, topic, focus, manager, ready, - _Widget, _Container, _TemplatedMixin, _CssStateMixin, StackContainer, ContentPane, template){ - - // module: - // dijit/layout/AccordionContainer - - - // Design notes: - // - // An AccordionContainer is a StackContainer, but each child (typically ContentPane) - // is wrapped in a _AccordionInnerContainer. This is hidden from the caller. - // - // The resulting markup will look like: - // - // <div class=dijitAccordionContainer> - // <div class=dijitAccordionInnerContainer> (one pane) - // <div class=dijitAccordionTitle> (title bar) ... </div> - // <div class=dijtAccordionChildWrapper> (content pane) </div> - // </div> - // </div> - // - // Normally the dijtAccordionChildWrapper is hidden for all but one child (the shown - // child), so the space for the content pane is all the title bars + the one dijtAccordionChildWrapper, - // which on claro has a 1px border plus a 2px bottom margin. - // - // During animation there are two dijtAccordionChildWrapper's shown, so we need - // to compensate for that. - - - var AccordionButton = declare("dijit.layout._AccordionButton", [_Widget, _TemplatedMixin, _CssStateMixin], { - // summary: - // The title bar to click to open up an accordion pane. - // Internal widget used by AccordionContainer. - // tags: - // private - - templateString: template, - - // label: String - // Title of the pane - label: "", - _setLabelAttr: {node: "titleTextNode", type: "innerHTML" }, - - // title: String - // Tooltip that appears on hover - title: "", - _setTitleAttr: {node: "titleTextNode", type: "attribute", attribute: "title"}, - - // iconClassAttr: String - // CSS class for icon to left of label - iconClassAttr: "", - _setIconClassAttr: { node: "iconNode", type: "class" }, - - baseClass: "dijitAccordionTitle", - - getParent: function(){ - // summary: - // Returns the AccordionContainer parent. - // tags: - // private - return this.parent; - }, - - buildRendering: function(){ - this.inherited(arguments); - var titleTextNodeId = this.id.replace(' ','_'); - domAttr.set(this.titleTextNode, "id", titleTextNodeId+"_title"); - this.focusNode.setAttribute("aria-labelledby", domAttr.get(this.titleTextNode, "id")); - dom.setSelectable(this.domNode, false); - }, - - getTitleHeight: function(){ - // summary: - // Returns the height of the title dom node. - return domGeometry.getMarginSize(this.domNode).h; // Integer - }, - - // TODO: maybe the parent should set these methods directly rather than forcing the code - // into the button widget? - _onTitleClick: function(){ - // summary: - // Callback when someone clicks my title. - var parent = this.getParent(); - parent.selectChild(this.contentWidget, true); - focus.focus(this.focusNode); - }, - - _onTitleKeyPress: function(/*Event*/ evt){ - return this.getParent()._onKeyPress(evt, this.contentWidget); - }, - - _setSelectedAttr: function(/*Boolean*/ isSelected){ - this._set("selected", isSelected); - this.focusNode.setAttribute("aria-expanded", isSelected ? "true" : "false"); - this.focusNode.setAttribute("aria-selected", isSelected ? "true" : "false"); - this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1"); - } - }); - - var AccordionInnerContainer = declare("dijit.layout._AccordionInnerContainer", [_Widget, _CssStateMixin], { - // summary: - // Internal widget placed as direct child of AccordionContainer.containerNode. - // When other widgets are added as children to an AccordionContainer they are wrapped in - // this widget. - -/*===== - // buttonWidget: Function|String - // Class to use to instantiate title - // (Wish we didn't have a separate widget for just the title but maintaining it - // for backwards compatibility, is it worth it?) - buttonWidget: null, -=====*/ - -/*===== - // contentWidget: dijit/_WidgetBase - // Pointer to the real child widget - contentWidget: null, -=====*/ - - baseClass: "dijitAccordionInnerContainer", - - // tell nested layout widget that we will take care of sizing - isLayoutContainer: true, - - buildRendering: function(){ - // Builds a template like: - // <div class=dijitAccordionInnerContainer> - // Button - // <div class=dijitAccordionChildWrapper> - // ContentPane - // </div> - // </div> - - // Create wrapper div, placed where the child is now - this.domNode = domConstruct.place("<div class='" + this.baseClass + - "' role='presentation'>", this.contentWidget.domNode, "after"); - - // wrapper div's first child is the button widget (ie, the title bar) - var child = this.contentWidget, - cls = lang.isString(this.buttonWidget) ? lang.getObject(this.buttonWidget) : this.buttonWidget; - this.button = child._buttonWidget = (new cls({ - contentWidget: child, - label: child.title, - title: child.tooltip, - dir: child.dir, - lang: child.lang, - textDir: child.textDir, - iconClass: child.iconClass, - id: child.id + "_button", - parent: this.parent - })).placeAt(this.domNode); - - // and then the actual content widget (changing it from prior-sibling to last-child), - // wrapped by a <div class=dijitAccordionChildWrapper> - this.containerNode = domConstruct.place("<div class='dijitAccordionChildWrapper' style='display:none'>", this.domNode); - domConstruct.place(this.contentWidget.domNode, this.containerNode); - }, - - postCreate: function(){ - this.inherited(arguments); - - // Map changes in content widget's title etc. to changes in the button - var button = this.button; - this._contentWidgetWatches = [ - this.contentWidget.watch('title', lang.hitch(this, function(name, oldValue, newValue){ - button.set("label", newValue); - })), - this.contentWidget.watch('tooltip', lang.hitch(this, function(name, oldValue, newValue){ - button.set("title", newValue); - })), - this.contentWidget.watch('iconClass', lang.hitch(this, function(name, oldValue, newValue){ - button.set("iconClass", newValue); - })) - ]; - }, - - _setSelectedAttr: function(/*Boolean*/ isSelected){ - this._set("selected", isSelected); - this.button.set("selected", isSelected); - if(isSelected){ - var cw = this.contentWidget; - if(cw.onSelected){ cw.onSelected(); } - } - }, - - startup: function(){ - // Called by _Container.addChild() - this.contentWidget.startup(); - }, - - destroy: function(){ - this.button.destroyRecursive(); - - array.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); }); - - delete this.contentWidget._buttonWidget; - delete this.contentWidget._wrapperWidget; - - this.inherited(arguments); - }, - - destroyDescendants: function(/*Boolean*/ preserveDom){ - // since getChildren isn't working for me, have to code this manually - this.contentWidget.destroyRecursive(preserveDom); - } - }); - - var AccordionContainer = declare("dijit.layout.AccordionContainer", StackContainer, { - // summary: - // Holds a set of panes where every pane's title is visible, but only one pane's content is visible at a time, - // and switching between panes is visualized by sliding the other panes up/down. - // example: - // | <div data-dojo-type="dijit/layout/AccordionContainer"> - // | <div data-dojo-type="dijit/layout/ContentPane" title="pane 1"> - // | </div> - // | <div data-dojo-type="dijit/layout/ContentPane" title="pane 2"> - // | <p>This is some text</p> - // | </div> - // | </div> - - // duration: Integer - // Amount of time (in ms) it takes to slide panes - duration: manager.defaultDuration, - - // buttonWidget: [const] String - // The name of the widget used to display the title of each pane - buttonWidget: AccordionButton, - -/*===== - // _verticalSpace: Number - // Pixels of space available for the open pane - // (my content box size minus the cumulative size of all the title bars) - _verticalSpace: 0, -=====*/ - baseClass: "dijitAccordionContainer", - - buildRendering: function(){ - this.inherited(arguments); - this.domNode.style.overflow = "hidden"; // TODO: put this in dijit.css - this.domNode.setAttribute("role", "tablist"); // TODO: put this in template - }, - - startup: function(){ - if(this._started){ return; } - this.inherited(arguments); - if(this.selectedChildWidget){ - this.selectedChildWidget._wrapperWidget.set("selected", true); - } - }, - - layout: function(){ - // Implement _LayoutWidget.layout() virtual method. - // Set the height of the open pane based on what room remains. - - var openPane = this.selectedChildWidget; - - if(!openPane){ return;} - - // space taken up by title, plus wrapper div (with border/margin) for open pane - var wrapperDomNode = openPane._wrapperWidget.domNode, - wrapperDomNodeMargin = domGeometry.getMarginExtents(wrapperDomNode), - wrapperDomNodePadBorder = domGeometry.getPadBorderExtents(wrapperDomNode), - wrapperContainerNode = openPane._wrapperWidget.containerNode, - wrapperContainerNodeMargin = domGeometry.getMarginExtents(wrapperContainerNode), - wrapperContainerNodePadBorder = domGeometry.getPadBorderExtents(wrapperContainerNode), - mySize = this._contentBox; - - // get cumulative height of all the unselected title bars - var totalCollapsedHeight = 0; - array.forEach(this.getChildren(), function(child){ - if(child != openPane){ - // Using domGeometry.getMarginSize() rather than domGeometry.position() since claro has 1px bottom margin - // to separate accordion panes. Not sure that works perfectly, it's probably putting a 1px - // margin below the bottom pane (even though we don't want one). - totalCollapsedHeight += domGeometry.getMarginSize(child._wrapperWidget.domNode).h; - } - }); - this._verticalSpace = mySize.h - totalCollapsedHeight - wrapperDomNodeMargin.h - - wrapperDomNodePadBorder.h - wrapperContainerNodeMargin.h - wrapperContainerNodePadBorder.h - - openPane._buttonWidget.getTitleHeight(); - - // Memo size to make displayed child - this._containerContentBox = { - h: this._verticalSpace, - w: this._contentBox.w - wrapperDomNodeMargin.w - wrapperDomNodePadBorder.w - - wrapperContainerNodeMargin.w - wrapperContainerNodePadBorder.w - }; - - if(openPane){ - openPane.resize(this._containerContentBox); - } - }, - - _setupChild: function(child){ - // Overrides _LayoutWidget._setupChild(). - // Put wrapper widget around the child widget, showing title - - child._wrapperWidget = AccordionInnerContainer({ - contentWidget: child, - buttonWidget: this.buttonWidget, - id: child.id + "_wrapper", - dir: child.dir, - lang: child.lang, - textDir: child.textDir, - parent: this - }); - - this.inherited(arguments); - }, - - addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){ - // Overrides _LayoutWidget.addChild(). - if(this._started){ - // Adding a child to a started Accordion is complicated because children have - // wrapper widgets. Default code path (calling this.inherited()) would add - // the new child inside another child's wrapper. - - // First add in child as a direct child of this AccordionContainer - var refNode = this.containerNode; - if(insertIndex && typeof insertIndex == "number"){ - var children = _Widget.prototype.getChildren.call(this); // get wrapper panes - if(children && children.length >= insertIndex){ - refNode = children[insertIndex-1].domNode; - insertIndex = "after"; - } - } - domConstruct.place(child.domNode, refNode, insertIndex); - - if(!child._started){ - child.startup(); - } - - // Then stick the wrapper widget around the child widget - this._setupChild(child); - - // Code below copied from StackContainer - topic.publish(this.id+"-addChild", child, insertIndex); // publish - this.layout(); - if(!this.selectedChildWidget){ - this.selectChild(child); - } - }else{ - // We haven't been started yet so just add in the child widget directly, - // and the wrapper will be created on startup() - this.inherited(arguments); - } - }, - - removeChild: function(child){ - // Overrides _LayoutWidget.removeChild(). - - // Destroy wrapper widget first, before StackContainer.getChildren() call. - // Replace wrapper widget with true child widget (ContentPane etc.). - // This step only happens if the AccordionContainer has been started; otherwise there's no wrapper. - if(child._wrapperWidget){ - domConstruct.place(child.domNode, child._wrapperWidget.domNode, "after"); - child._wrapperWidget.destroy(); - delete child._wrapperWidget; - } - - domClass.remove(child.domNode, "dijitHidden"); - - this.inherited(arguments); - }, - - getChildren: function(){ - // Overrides _Container.getChildren() to return content panes rather than internal AccordionInnerContainer panes - return array.map(this.inherited(arguments), function(child){ - return child.declaredClass == "dijit.layout._AccordionInnerContainer" ? child.contentWidget : child; - }, this); - }, - - destroy: function(){ - if(this._animation){ - this._animation.stop(); - } - array.forEach(this.getChildren(), function(child){ - // If AccordionContainer has been started, then each child has a wrapper widget which - // also needs to be destroyed. - if(child._wrapperWidget){ - child._wrapperWidget.destroy(); - }else{ - child.destroyRecursive(); - } - }); - this.inherited(arguments); - }, - - _showChild: function(child){ - // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode - child._wrapperWidget.containerNode.style.display="block"; - return this.inherited(arguments); - }, - - _hideChild: function(child){ - // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode - child._wrapperWidget.containerNode.style.display="none"; - this.inherited(arguments); - }, - - _transition: function(/*dijit/_WidgetBase?*/ newWidget, /*dijit/_WidgetBase?*/ oldWidget, /*Boolean*/ animate){ - // Overrides StackContainer._transition() to provide sliding of title bars etc. - - if(has("ie") < 8){ - // workaround animation bugs by not animating; not worth supporting animation for IE6 & 7 - animate = false; - } - - if(this._animation){ - // there's an in-progress animation. speedily end it so we can do the newly requested one - this._animation.stop(true); - delete this._animation; - } - - var self = this; - - if(newWidget){ - newWidget._wrapperWidget.set("selected", true); - - var d = this._showChild(newWidget); // prepare widget to be slid in - - // Size the new widget, in case this is the first time it's being shown, - // or I have been resized since the last time it was shown. - // Note that page must be visible for resizing to work. - if(this.doLayout && newWidget.resize){ - newWidget.resize(this._containerContentBox); - } - } - - if(oldWidget){ - oldWidget._wrapperWidget.set("selected", false); - if(!animate){ - this._hideChild(oldWidget); - } - } - - if(animate){ - var newContents = newWidget._wrapperWidget.containerNode, - oldContents = oldWidget._wrapperWidget.containerNode; - - // During the animation we will be showing two dijitAccordionChildWrapper nodes at once, - // which on claro takes up 4px extra space (compared to stable AccordionContainer). - // Have to compensate for that by immediately shrinking the pane being closed. - var wrapperContainerNode = newWidget._wrapperWidget.containerNode, - wrapperContainerNodeMargin = domGeometry.getMarginExtents(wrapperContainerNode), - wrapperContainerNodePadBorder = domGeometry.getPadBorderExtents(wrapperContainerNode), - animationHeightOverhead = wrapperContainerNodeMargin.h + wrapperContainerNodePadBorder.h; - - oldContents.style.height = (self._verticalSpace - animationHeightOverhead) + "px"; - - this._animation = new fx.Animation({ - node: newContents, - duration: this.duration, - curve: [1, this._verticalSpace - animationHeightOverhead - 1], - onAnimate: function(value){ - value = Math.floor(value); // avoid fractional values - newContents.style.height = value + "px"; - oldContents.style.height = (self._verticalSpace - animationHeightOverhead - value) + "px"; - }, - onEnd: function(){ - delete self._animation; - newContents.style.height = "auto"; - oldWidget._wrapperWidget.containerNode.style.display = "none"; - oldContents.style.height = "auto"; - self._hideChild(oldWidget); - } - }); - this._animation.onStop = this._animation.onEnd; - this._animation.play(); - } - - return d; // If child has an href, promise that fires when the widget has finished loading - }, - - // note: we are treating the container as controller here - _onKeyPress: function(/*Event*/ e, /*dijit/_WidgetBase*/ fromTitle){ - // summary: - // Handle keypress events - // description: - // This is called from a handler on AccordionContainer.domNode - // (setup in StackContainer), and is also called directly from - // the click handler for accordion labels - if(this.disabled || e.altKey || !(fromTitle || e.ctrlKey)){ - return; - } - var c = e.charOrCode; - if((fromTitle && (c == keys.LEFT_ARROW || c == keys.UP_ARROW)) || - (e.ctrlKey && c == keys.PAGE_UP)){ - this._adjacent(false)._buttonWidget._onTitleClick(); - event.stop(e); - }else if((fromTitle && (c == keys.RIGHT_ARROW || c == keys.DOWN_ARROW)) || - (e.ctrlKey && (c == keys.PAGE_DOWN || c == keys.TAB))){ - this._adjacent(true)._buttonWidget._onTitleClick(); - event.stop(e); - } - } - }); - - // Back compat w/1.6, remove for 2.0 - if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/layout/AccordionPane"]; - require(requires); // use indirection so modules not rolled into a build - }); - } - - // For monkey patching - AccordionContainer._InnerContainer = AccordionInnerContainer; - AccordionContainer._Button = AccordionButton; - - return AccordionContainer; -}); diff --git a/lib/dijit/layout/AccordionPane.js.uncompressed.js b/lib/dijit/layout/AccordionPane.js.uncompressed.js deleted file mode 100644 index 957f96daf..000000000 --- a/lib/dijit/layout/AccordionPane.js.uncompressed.js +++ /dev/null @@ -1,25 +0,0 @@ -define("dijit/layout/AccordionPane", [ - "dojo/_base/declare", // declare - "dojo/_base/kernel", // kernel.deprecated - "./ContentPane" -], function(declare, kernel, ContentPane){ - - // module: - // dijit/layout/AccordionPane - - return declare("dijit.layout.AccordionPane", ContentPane, { - // summary: - // Deprecated widget. Use `dijit/layout/ContentPane` instead. - // tags: - // deprecated - - constructor: function(){ - kernel.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead", "", "2.0"); - }, - - onSelected: function(){ - // summary: - // called when this pane is selected - } - }); -}); diff --git a/lib/dijit/layout/BorderContainer.js.uncompressed.js b/lib/dijit/layout/BorderContainer.js.uncompressed.js deleted file mode 100644 index bcb0619a0..000000000 --- a/lib/dijit/layout/BorderContainer.js.uncompressed.js +++ /dev/null @@ -1,547 +0,0 @@ -define("dijit/layout/BorderContainer", [ - "dojo/_base/array", // array.filter array.forEach array.map - "dojo/cookie", // cookie - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.remove domClass.toggle - "dojo/dom-construct", // domConstruct.destroy domConstruct.place - "dojo/dom-geometry", // domGeometry.marginBox - "dojo/dom-style", // domStyle.style - "dojo/_base/event", // event.stop - "dojo/keys", - "dojo/_base/lang", // lang.getObject lang.hitch - "dojo/on", - "dojo/touch", - "../_WidgetBase", - "../_Widget", - "../_TemplatedMixin", - "./_LayoutWidget", - "./utils" // layoutUtils.layoutChildren -], function(array, cookie, declare, domClass, domConstruct, domGeometry, domStyle, event, keys, lang, on, touch, - _WidgetBase, _Widget, _TemplatedMixin, _LayoutWidget, layoutUtils){ - -// module: -// dijit/layout/BorderContainer - -var _Splitter = declare("dijit.layout._Splitter", [_Widget, _TemplatedMixin ], -{ - // summary: - // A draggable spacer between two items in a `dijit/layout/BorderContainer`. - // description: - // This is instantiated by `dijit/layout/BorderContainer`. Users should not - // create it directly. - // tags: - // private - -/*===== - // container: [const] dijit/layout/BorderContainer - // Pointer to the parent BorderContainer - container: null, - - // child: [const] dijit/layout/_LayoutWidget - // Pointer to the pane associated with this splitter - child: null, - - // region: [const] String - // Region of pane associated with this splitter. - // "top", "bottom", "left", "right". - region: null, -=====*/ - - // live: [const] Boolean - // If true, the child's size changes and the child widget is redrawn as you drag the splitter; - // otherwise, the size doesn't change until you drop the splitter (by mouse-up) - live: true, - - templateString: '<div class="dijitSplitter" data-dojo-attach-event="onkeypress:_onKeyPress,press:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" role="separator"><div class="dijitSplitterThumb"></div></div>', - - constructor: function(){ - this._handlers = []; - }, - - postMixInProperties: function(){ - this.inherited(arguments); - - this.horizontal = /top|bottom/.test(this.region); - this._factor = /top|left/.test(this.region) ? 1 : -1; - this._cookieName = this.container.id + "_" + this.region; - }, - - buildRendering: function(){ - this.inherited(arguments); - - domClass.add(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V")); - - if(this.container.persist){ - // restore old size - var persistSize = cookie(this._cookieName); - if(persistSize){ - this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize; - } - } - }, - - _computeMaxSize: function(){ - // summary: - // Return the maximum size that my corresponding pane can be set to - - var dim = this.horizontal ? 'h' : 'w', - childSize = domGeometry.getMarginBox(this.child.domNode)[dim], - center = array.filter(this.container.getChildren(), function(child){ return child.region == "center";})[0], - spaceAvailable = domGeometry.getMarginBox(center.domNode)[dim]; // can expand until center is crushed to 0 - - return Math.min(this.child.maxSize, childSize + spaceAvailable); - }, - - _startDrag: function(e){ - if(!this.cover){ - this.cover = domConstruct.place("<div class=dijitSplitterCover></div>", this.child.domNode, "after"); - } - domClass.add(this.cover, "dijitSplitterCoverActive"); - - // Safeguard in case the stop event was missed. Shouldn't be necessary if we always get the mouse up. - if(this.fake){ domConstruct.destroy(this.fake); } - if(!(this._resize = this.live)){ //TODO: disable live for IE6? - // create fake splitter to display at old position while we drag - (this.fake = this.domNode.cloneNode(true)).removeAttribute("id"); - domClass.add(this.domNode, "dijitSplitterShadow"); - domConstruct.place(this.fake, this.domNode, "after"); - } - domClass.add(this.domNode, "dijitSplitterActive dijitSplitter" + (this.horizontal ? "H" : "V") + "Active"); - if(this.fake){ - domClass.remove(this.fake, "dijitSplitterHover dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover"); - } - - //Performance: load data info local vars for onmousevent function closure - var factor = this._factor, - isHorizontal = this.horizontal, - axis = isHorizontal ? "pageY" : "pageX", - pageStart = e[axis], - splitterStyle = this.domNode.style, - dim = isHorizontal ? 'h' : 'w', - childStart = domGeometry.getMarginBox(this.child.domNode)[dim], - max = this._computeMaxSize(), - min = this.child.minSize || 20, - region = this.region, - splitterAttr = region == "top" || region == "bottom" ? "top" : "left", // style attribute of splitter to adjust - splitterStart = parseInt(splitterStyle[splitterAttr], 10), - resize = this._resize, - layoutFunc = lang.hitch(this.container, "_layoutChildren", this.child.id), - de = this.ownerDocument; - - this._handlers = this._handlers.concat([ - on(de, touch.move, this._drag = function(e, forceResize){ - var delta = e[axis] - pageStart, - childSize = factor * delta + childStart, - boundChildSize = Math.max(Math.min(childSize, max), min); - - if(resize || forceResize){ - layoutFunc(boundChildSize); - } - // TODO: setting style directly (usually) sets content box size, need to set margin box size - splitterStyle[splitterAttr] = delta + splitterStart + factor*(boundChildSize - childSize) + "px"; - }), - on(de, "dragstart", event.stop), - on(this.ownerDocumentBody, "selectstart", event.stop), - on(de, touch.release, lang.hitch(this, "_stopDrag")) - ]); - event.stop(e); - }, - - _onMouse: function(e){ - // summary: - // Handler for onmouseenter / onmouseleave events - var o = (e.type == "mouseover" || e.type == "mouseenter"); - domClass.toggle(this.domNode, "dijitSplitterHover", o); - domClass.toggle(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover", o); - }, - - _stopDrag: function(e){ - try{ - if(this.cover){ - domClass.remove(this.cover, "dijitSplitterCoverActive"); - } - if(this.fake){ domConstruct.destroy(this.fake); } - domClass.remove(this.domNode, "dijitSplitterActive dijitSplitter" - + (this.horizontal ? "H" : "V") + "Active dijitSplitterShadow"); - this._drag(e); //TODO: redundant with onmousemove? - this._drag(e, true); - }finally{ - this._cleanupHandlers(); - delete this._drag; - } - - if(this.container.persist){ - cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"], {expires:365}); - } - }, - - _cleanupHandlers: function(){ - var h; - while(h = this._handlers.pop()){ h.remove(); } - }, - - _onKeyPress: function(/*Event*/ e){ - // should we apply typematic to this? - this._resize = true; - var horizontal = this.horizontal; - var tick = 1; - switch(e.charOrCode){ - case horizontal ? keys.UP_ARROW : keys.LEFT_ARROW: - tick *= -1; -// break; - case horizontal ? keys.DOWN_ARROW : keys.RIGHT_ARROW: - break; - default: -// this.inherited(arguments); - return; - } - var childSize = domGeometry.getMarginSize(this.child.domNode)[ horizontal ? 'h' : 'w' ] + this._factor * tick; - this.container._layoutChildren(this.child.id, Math.max(Math.min(childSize, this._computeMaxSize()), this.child.minSize)); - event.stop(e); - }, - - destroy: function(){ - this._cleanupHandlers(); - delete this.child; - delete this.container; - delete this.cover; - delete this.fake; - this.inherited(arguments); - } -}); - -var _Gutter = declare("dijit.layout._Gutter", [_Widget, _TemplatedMixin], -{ - // summary: - // Just a spacer div to separate side pane from center pane. - // Basically a trick to lookup the gutter/splitter width from the theme. - // description: - // Instantiated by `dijit/layout/BorderContainer`. Users should not - // create directly. - // tags: - // private - - templateString: '<div class="dijitGutter" role="presentation"></div>', - - postMixInProperties: function(){ - this.inherited(arguments); - this.horizontal = /top|bottom/.test(this.region); - }, - - buildRendering: function(){ - this.inherited(arguments); - domClass.add(this.domNode, "dijitGutter" + (this.horizontal ? "H" : "V")); - } -}); - -var BorderContainer = declare("dijit.layout.BorderContainer", _LayoutWidget, { - // summary: - // Provides layout in up to 5 regions, a mandatory center with optional borders along its 4 sides. - // description: - // A BorderContainer is a box with a specified size, such as style="width: 500px; height: 500px;", - // that contains a child widget marked region="center" and optionally children widgets marked - // region equal to "top", "bottom", "leading", "trailing", "left" or "right". - // Children along the edges will be laid out according to width or height dimensions and may - // include optional splitters (splitter="true") to make them resizable by the user. The remaining - // space is designated for the center region. - // - // The outer size must be specified on the BorderContainer node. Width must be specified for the sides - // and height for the top and bottom, respectively. No dimensions should be specified on the center; - // it will fill the remaining space. Regions named "leading" and "trailing" may be used just like - // "left" and "right" except that they will be reversed in right-to-left environments. - // - // For complex layouts, multiple children can be specified for a single region. In this case, the - // layoutPriority flag on the children determines which child is closer to the edge (low layoutPriority) - // and which child is closer to the center (high layoutPriority). layoutPriority can also be used - // instead of the design attribute to control layout precedence of horizontal vs. vertical panes. - // - // See `BorderContainer.ChildWidgetProperties` for details on the properties that can be set on - // children of a `BorderContainer`. - // example: - // | <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design: 'sidebar', gutters: false" - // | style="width: 400px; height: 300px;"> - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'top'">header text</div> - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'right', splitter: true" style="width: 200px;">table of contents</div> - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'">client area</div> - // | </div> - - // design: String - // Which design is used for the layout: - // - // - "headline" (default) where the top and bottom extend the full width of the container - // - "sidebar" where the left and right sides extend from top to bottom. - design: "headline", - - // gutters: [const] Boolean - // Give each pane a border and margin. - // Margin determined by domNode.paddingLeft. - // When false, only resizable panes have a gutter (i.e. draggable splitter) for resizing. - gutters: true, - - // liveSplitters: [const] Boolean - // Specifies whether splitters resize as you drag (true) or only upon mouseup (false) - liveSplitters: true, - - // persist: Boolean - // Save splitter positions in a cookie. - persist: false, - - baseClass: "dijitBorderContainer", - - // _splitterClass: Function||String - // Optional hook to override the default Splitter widget used by BorderContainer - _splitterClass: _Splitter, - - postMixInProperties: function(){ - // change class name to indicate that BorderContainer is being used purely for - // layout (like LayoutContainer) rather than for pretty formatting. - if(!this.gutters){ - this.baseClass += "NoGutter"; - } - this.inherited(arguments); - }, - - startup: function(){ - if(this._started){ return; } - array.forEach(this.getChildren(), this._setupChild, this); - this.inherited(arguments); - }, - - _setupChild: function(/*dijit/_WidgetBase*/ child){ - // Override _LayoutWidget._setupChild(). - - var region = child.region; - if(region){ - this.inherited(arguments); - - domClass.add(child.domNode, this.baseClass+"Pane"); - - var ltr = this.isLeftToRight(); - if(region == "leading"){ region = ltr ? "left" : "right"; } - if(region == "trailing"){ region = ltr ? "right" : "left"; } - - // Create draggable splitter for resizing pane, - // or alternately if splitter=false but BorderContainer.gutters=true then - // insert dummy div just for spacing - if(region != "center" && (child.splitter || this.gutters) && !child._splitterWidget){ - var _Splitter = child.splitter ? this._splitterClass : _Gutter; - if(lang.isString(_Splitter)){ - _Splitter = lang.getObject(_Splitter); // for back-compat, remove in 2.0 - } - var splitter = new _Splitter({ - id: child.id + "_splitter", - container: this, - child: child, - region: region, - live: this.liveSplitters - }); - splitter.isSplitter = true; - child._splitterWidget = splitter; - - domConstruct.place(splitter.domNode, child.domNode, "after"); - - // Splitters aren't added as Contained children, so we need to call startup explicitly - splitter.startup(); - } - child.region = region; // TODO: technically wrong since it overwrites "trailing" with "left" etc. - } - }, - - layout: function(){ - // Implement _LayoutWidget.layout() virtual method. - this._layoutChildren(); - }, - - addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){ - // Override _LayoutWidget.addChild(). - this.inherited(arguments); - if(this._started){ - this.layout(); //OPT - } - }, - - removeChild: function(/*dijit/_WidgetBase*/ child){ - // Override _LayoutWidget.removeChild(). - - var region = child.region; - var splitter = child._splitterWidget; - if(splitter){ - splitter.destroy(); - delete child._splitterWidget; - } - this.inherited(arguments); - - if(this._started){ - this._layoutChildren(); - } - // Clean up whatever style changes we made to the child pane. - // Unclear how height and width should be handled. - domClass.remove(child.domNode, this.baseClass+"Pane"); - domStyle.set(child.domNode, { - top: "auto", - bottom: "auto", - left: "auto", - right: "auto", - position: "static" - }); - domStyle.set(child.domNode, region == "top" || region == "bottom" ? "width" : "height", "auto"); - }, - - getChildren: function(){ - // Override _LayoutWidget.getChildren() to only return real children, not the splitters. - return array.filter(this.inherited(arguments), function(widget){ - return !widget.isSplitter; - }); - }, - - // TODO: remove in 2.0 - getSplitter: function(/*String*/region){ - // summary: - // Returns the widget responsible for rendering the splitter associated with region - // tags: - // deprecated - return array.filter(this.getChildren(), function(child){ - return child.region == region; - })[0]._splitterWidget; - }, - - resize: function(newSize, currentSize){ - // Overrides _LayoutWidget.resize(). - - // resetting potential padding to 0px to provide support for 100% width/height + padding - // TODO: this hack doesn't respect the box model and is a temporary fix - if(!this.cs || !this.pe){ - var node = this.domNode; - this.cs = domStyle.getComputedStyle(node); - this.pe = domGeometry.getPadExtents(node, this.cs); - this.pe.r = domStyle.toPixelValue(node, this.cs.paddingRight); - this.pe.b = domStyle.toPixelValue(node, this.cs.paddingBottom); - - domStyle.set(node, "padding", "0px"); - } - - this.inherited(arguments); - }, - - _layoutChildren: function(/*String?*/ changedChildId, /*Number?*/ changedChildSize){ - // summary: - // This is the main routine for setting size/position of each child. - // description: - // With no arguments, measures the height of top/bottom panes, the width - // of left/right panes, and then sizes all panes accordingly. - // - // With changedRegion specified (as "left", "top", "bottom", or "right"), - // it changes that region's width/height to changedRegionSize and - // then resizes other regions that were affected. - // changedChildId: - // Id of the child which should be resized because splitter was dragged. - // changedChildSize: - // The new width/height (in pixels) to make specified child - - if(!this._borderBox || !this._borderBox.h){ - // We are currently hidden, or we haven't been sized by our parent yet. - // Abort. Someone will resize us later. - return; - } - - // Generate list of wrappers of my children in the order that I want layoutChildren() - // to process them (i.e. from the outside to the inside) - var wrappers = array.map(this.getChildren(), function(child, idx){ - return { - pane: child, - weight: [ - child.region == "center" ? Infinity : 0, - child.layoutPriority, - (this.design == "sidebar" ? 1 : -1) * (/top|bottom/.test(child.region) ? 1 : -1), - idx - ] - }; - }, this); - wrappers.sort(function(a, b){ - var aw = a.weight, bw = b.weight; - for(var i=0; i<aw.length; i++){ - if(aw[i] != bw[i]){ - return aw[i] - bw[i]; - } - } - return 0; - }); - - // Make new list, combining the externally specified children with splitters and gutters - var childrenAndSplitters = []; - array.forEach(wrappers, function(wrapper){ - var pane = wrapper.pane; - childrenAndSplitters.push(pane); - if(pane._splitterWidget){ - childrenAndSplitters.push(pane._splitterWidget); - } - }); - - // Compute the box in which to lay out my children - var dim = { - l: this.pe.l, - t: this.pe.t, - w: this._borderBox.w - this.pe.w, - h: this._borderBox.h - this.pe.h - }; - - // Layout the children, possibly changing size due to a splitter drag - layoutUtils.layoutChildren(this.domNode, dim, childrenAndSplitters, - changedChildId, changedChildSize); - }, - - destroyRecursive: function(){ - // Destroy splitters first, while getChildren() still works - array.forEach(this.getChildren(), function(child){ - var splitter = child._splitterWidget; - if(splitter){ - splitter.destroy(); - } - delete child._splitterWidget; - }); - - // Then destroy the real children, and myself - this.inherited(arguments); - } -}); - -BorderContainer.ChildWidgetProperties = { - // summary: - // These properties can be specified for the children of a BorderContainer. - - // region: [const] String - // Values: "top", "bottom", "leading", "trailing", "left", "right", "center". - // See the `dijit/layout/BorderContainer` description for details. - region: '', - - // layoutPriority: [const] Number - // Children with a higher layoutPriority will be placed closer to the BorderContainer center, - // between children with a lower layoutPriority. - layoutPriority: 0, - - // splitter: [const] Boolean - // Parameter for children where region != "center". - // If true, enables user to resize the widget by putting a draggable splitter between - // this widget and the region=center widget. - splitter: false, - - // minSize: [const] Number - // Specifies a minimum size (in pixels) for this widget when resized by a splitter. - minSize: 0, - - // maxSize: [const] Number - // Specifies a maximum size (in pixels) for this widget when resized by a splitter. - maxSize: Infinity -}; - -// Since any widget can be specified as a LayoutContainer child, mix it -// into the base widget class. (This is a hack, but it's effective.) -// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer. -lang.extend(_WidgetBase, /*===== {} || =====*/ BorderContainer.ChildWidgetProperties); - -// For monkey patching -BorderContainer._Splitter = _Splitter; -BorderContainer._Gutter = _Gutter; - -return BorderContainer; -}); diff --git a/lib/dijit/layout/ContentPane.js.uncompressed.js b/lib/dijit/layout/ContentPane.js.uncompressed.js deleted file mode 100644 index 1b861aa29..000000000 --- a/lib/dijit/layout/ContentPane.js.uncompressed.js +++ /dev/null @@ -1,646 +0,0 @@ -define("dijit/layout/ContentPane", [ - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.mixin lang.delegate lang.hitch lang.isFunction lang.isObject - "../_Widget", - "../_Container", - "./_ContentPaneResizeMixin", - "dojo/string", // string.substitute - "dojo/html", // html._ContentSetter - "dojo/i18n!../nls/loading", - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/_base/Deferred", // Deferred - "dojo/dom", // dom.byId - "dojo/dom-attr", // domAttr.attr - "dojo/dom-construct", // empty() - "dojo/_base/xhr", // xhr.get - "dojo/i18n", // i18n.getLocalization - "dojo/when" -], function(kernel, lang, _Widget, _Container, _ContentPaneResizeMixin, string, html, nlsLoading, - array, declare, Deferred, dom, domAttr, domConstruct, xhr, i18n, when){ - -// module: -// dijit/layout/ContentPane - - -return declare("dijit.layout.ContentPane", [_Widget, _Container, _ContentPaneResizeMixin], { - // summary: - // A widget containing an HTML fragment, specified inline - // or by uri. Fragment may include widgets. - // - // description: - // This widget embeds a document fragment in the page, specified - // either by uri, javascript generated markup or DOM reference. - // Any widgets within this content are instantiated and managed, - // but laid out according to the HTML structure. Unlike IFRAME, - // ContentPane embeds a document fragment as would be found - // inside the BODY tag of a full HTML document. It should not - // contain the HTML, HEAD, or BODY tags. - // For more advanced functionality with scripts and - // stylesheets, see dojox/layout/ContentPane. This widget may be - // used stand alone or as a base class for other widgets. - // ContentPane is useful as a child of other layout containers - // such as BorderContainer or TabContainer, but note that those - // widgets can contain any widget as a child. - // - // example: - // Some quick samples: - // To change the innerHTML: - // | cp.set('content', '<b>new content</b>')` - // Or you can send it a NodeList: - // | cp.set('content', dojo.query('div [class=selected]', userSelection)) - // To do an ajax update: - // | cp.set('href', url) - - // href: String - // The href of the content that displays now. - // Set this at construction if you want to load data externally when the - // pane is shown. (Set preload=true to load it immediately.) - // Changing href after creation doesn't have any effect; Use set('href', ...); - href: "", - - // content: String|DomNode|NodeList|dijit/_Widget - // The innerHTML of the ContentPane. - // Note that the initialization parameter / argument to set("content", ...) - // can be a String, DomNode, Nodelist, or _Widget. - content: "", - - // extractContent: Boolean - // Extract visible content from inside of `<body> .... </body>`. - // I.e., strip `<html>` and `<head>` (and it's contents) from the href - extractContent: false, - - // parseOnLoad: Boolean - // Parse content and create the widgets, if any. - parseOnLoad: true, - - // parserScope: String - // Flag passed to parser. Root for attribute names to search for. If scopeName is dojo, - // will search for data-dojo-type (or dojoType). For backwards compatibility - // reasons defaults to dojo._scopeName (which is "dojo" except when - // multi-version support is used, when it will be something like dojo16, dojo20, etc.) - parserScope: kernel._scopeName, - - // preventCache: Boolean - // Prevent caching of data from href's by appending a timestamp to the href. - preventCache: false, - - // preload: Boolean - // Force load of data on initialization even if pane is hidden. - preload: false, - - // refreshOnShow: Boolean - // Refresh (re-download) content when pane goes from hidden to shown - refreshOnShow: false, - - // loadingMessage: String - // Message that shows while downloading - loadingMessage: "<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>", - - // errorMessage: String - // Message that shows if an error occurs - errorMessage: "<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>", - - // isLoaded: [readonly] Boolean - // True if the ContentPane has data in it, either specified - // during initialization (via href or inline content), or set - // via set('content', ...) / set('href', ...) - // - // False if it doesn't have any content, or if ContentPane is - // still in the process of downloading href. - isLoaded: false, - - baseClass: "dijitContentPane", - - /*====== - // ioMethod: dojo/_base/xhr.get|dojo._base/xhr.post - // Function that should grab the content specified via href. - ioMethod: dojo.xhrGet, - ======*/ - - // ioArgs: Object - // Parameters to pass to xhrGet() request, for example: - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="href: './bar', ioArgs: {timeout: 500}"> - ioArgs: {}, - - // onLoadDeferred: [readonly] dojo.Deferred - // This is the `dojo.Deferred` returned by set('href', ...) and refresh(). - // Calling onLoadDeferred.then() registers your - // callback to be called only once, when the prior set('href', ...) call or - // the initial href parameter to the constructor finishes loading. - // - // This is different than an onLoad() handler which gets called any time any href - // or content is loaded. - onLoadDeferred: null, - - // Cancel _WidgetBase's _setTitleAttr because we don't want the title attribute (used to specify - // tab labels) to be copied to ContentPane.domNode... otherwise a tooltip shows up over the - // entire pane. - _setTitleAttr: null, - - // Flag to parser that I'll parse my contents, so it shouldn't. - stopParser: true, - - // template: [private] Boolean - // Flag from the parser that this ContentPane is inside a template - // so the contents are pre-parsed. - // TODO: this declaration can be commented out in 2.0 - template: false, - - create: function(params, srcNodeRef){ - // Convert a srcNodeRef argument into a content parameter, so that the original contents are - // processed in the same way as contents set via set("content", ...), calling the parser etc. - // Avoid modifying original params object since that breaks NodeList instantiation, see #11906. - if((!params || !params.template) && srcNodeRef && !("href" in params) && !("content" in params)){ - srcNodeRef = dom.byId(srcNodeRef); - var df = srcNodeRef.ownerDocument.createDocumentFragment(); - while(srcNodeRef.firstChild){ - df.appendChild(srcNodeRef.firstChild); - } - params = lang.delegate(params, {content: df}); - } - this.inherited(arguments, [params, srcNodeRef]); - }, - - postMixInProperties: function(){ - this.inherited(arguments); - var messages = i18n.getLocalization("dijit", "loading", this.lang); - this.loadingMessage = string.substitute(this.loadingMessage, messages); - this.errorMessage = string.substitute(this.errorMessage, messages); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // Since we have no template we need to set this.containerNode ourselves, to make getChildren() work. - // For subclasses of ContentPane that do have a template, does nothing. - if(!this.containerNode){ - this.containerNode = this.domNode; - } - - // remove the title attribute so it doesn't show up when hovering - // over a node (TODO: remove in 2.0, no longer needed after #11490) - this.domNode.title = ""; - - if(!domAttr.get(this.domNode,"role")){ - this.domNode.setAttribute("role", "group"); - } - }, - - startup: function(){ - // summary: - // Call startup() on all children including non _Widget ones like dojo/dnd/Source objects - - // This starts all the widgets - this.inherited(arguments); - - // And this catches stuff like dojo/dnd/Source - if(this._contentSetter){ - array.forEach(this._contentSetter.parseResults, function(obj){ - if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){ - obj.startup(); - obj._started = true; - } - }, this); - } - }, - - _startChildren: function(){ - // summary: - // Called when content is loaded. Calls startup on each child widget. Similar to ContentPane.startup() - // itself, but avoids marking the ContentPane itself as "restarted" (see #15581). - - // This starts all the widgets - array.forEach(this.getChildren(), function(obj){ - if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){ - obj.startup(); - obj._started = true; - } - }); - - // And this catches stuff like dojo/dnd/Source - if(this._contentSetter){ - array.forEach(this._contentSetter.parseResults, function(obj){ - if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){ - obj.startup(); - obj._started = true; - } - }, this); - } - }, - - setHref: function(/*String|Uri*/ href){ - // summary: - // Deprecated. Use set('href', ...) instead. - kernel.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.", "", "2.0"); - return this.set("href", href); - }, - _setHrefAttr: function(/*String|Uri*/ href){ - // summary: - // Hook so set("href", ...) works. - // description: - // Reset the (external defined) content of this pane and replace with new url - // Note: It delays the download until widget is shown if preload is false. - // href: - // url to the page you want to get, must be within the same domain as your mainpage - - // Cancel any in-flight requests (a set('href', ...) will cancel any in-flight set('href', ...)) - this.cancel(); - - this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel")); - this.onLoadDeferred.then(lang.hitch(this, "onLoad")); - - this._set("href", href); - - // _setHrefAttr() is called during creation and by the user, after creation. - // Assuming preload == false, only in the second case do we actually load the URL; - // otherwise it's done in startup(), and only if this widget is shown. - if(this.preload || (this._created && this._isShown())){ - this._load(); - }else{ - // Set flag to indicate that href needs to be loaded the next time the - // ContentPane is made visible - this._hrefChanged = true; - } - - return this.onLoadDeferred; // Deferred - }, - - setContent: function(/*String|DomNode|Nodelist*/data){ - // summary: - // Deprecated. Use set('content', ...) instead. - kernel.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.", "", "2.0"); - this.set("content", data); - }, - _setContentAttr: function(/*String|DomNode|Nodelist*/data){ - // summary: - // Hook to make set("content", ...) work. - // Replaces old content with data content, include style classes from old content - // data: - // the new Content may be String, DomNode or NodeList - // - // if data is a NodeList (or an array of nodes) nodes are copied - // so you can import nodes from another document implicitly - - // clear href so we can't run refresh and clear content - // refresh should only work if we downloaded the content - this._set("href", ""); - - // Cancel any in-flight requests (a set('content', ...) will cancel any in-flight set('href', ...)) - this.cancel(); - - // Even though user is just setting content directly, still need to define an onLoadDeferred - // because the _onLoadHandler() handler is still getting called from setContent() - this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel")); - if(this._created){ - // For back-compat reasons, call onLoad() for set('content', ...) - // calls but not for content specified in srcNodeRef (ie: <div data-dojo-type=ContentPane>...</div>) - // or as initialization parameter (ie: new ContentPane({content: ...}) - this.onLoadDeferred.then(lang.hitch(this, "onLoad")); - } - - this._setContent(data || ""); - - this._isDownloaded = false; // mark that content is from a set('content') not a set('href') - - return this.onLoadDeferred; // Deferred - }, - _getContentAttr: function(){ - // summary: - // Hook to make get("content") work - return this.containerNode.innerHTML; - }, - - cancel: function(){ - // summary: - // Cancels an in-flight download of content - if(this._xhrDfd && (this._xhrDfd.fired == -1)){ - this._xhrDfd.cancel(); - } - delete this._xhrDfd; // garbage collect - - this.onLoadDeferred = null; - }, - - destroy: function(){ - this.cancel(); - this.inherited(arguments); - }, - - destroyRecursive: function(/*Boolean*/ preserveDom){ - // summary: - // Destroy the ContentPane and its contents - - // if we have multiple controllers destroying us, bail after the first - if(this._beingDestroyed){ - return; - } - this.inherited(arguments); - }, - - _onShow: function(){ - // summary: - // Called when the ContentPane is made visible - // description: - // For a plain ContentPane, this is called on initialization, from startup(). - // If the ContentPane is a hidden pane of a TabContainer etc., then it's - // called whenever the pane is made visible. - // - // Does necessary processing, including href download and layout/resize of - // child widget(s) - - this.inherited(arguments); - - if(this.href){ - if(!this._xhrDfd && // if there's an href that isn't already being loaded - (!this.isLoaded || this._hrefChanged || this.refreshOnShow) - ){ - return this.refresh(); // If child has an href, promise that fires when the load is complete - } - } - }, - - refresh: function(){ - // summary: - // [Re]download contents of href and display - // description: - // 1. cancels any currently in-flight requests - // 2. posts "loading..." message - // 3. sends XHR to download new data - - // Cancel possible prior in-flight request - this.cancel(); - - this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel")); - this.onLoadDeferred.then(lang.hitch(this, "onLoad")); - this._load(); - return this.onLoadDeferred; // If child has an href, promise that fires when refresh is complete - }, - - _load: function(){ - // summary: - // Load/reload the href specified in this.href - - // display loading message - this._setContent(this.onDownloadStart(), true); - - var self = this; - var getArgs = { - preventCache: (this.preventCache || this.refreshOnShow), - url: this.href, - handleAs: "text" - }; - if(lang.isObject(this.ioArgs)){ - lang.mixin(getArgs, this.ioArgs); - } - - var hand = (this._xhrDfd = (this.ioMethod || xhr.get)(getArgs)), - returnedHtml; - - hand.then( - function(html){ - returnedHtml = html; - try{ - self._isDownloaded = true; - return self._setContent(html, false); - }catch(err){ - self._onError('Content', err); // onContentError - } - }, - function(err){ - if(!hand.canceled){ - // show error message in the pane - self._onError('Download', err); // onDownloadError - } - delete self._xhrDfd; - return err; - } - ).then(function(){ - self.onDownloadEnd(); - delete self._xhrDfd; - return returnedHtml; - }); - - // Remove flag saying that a load is needed - delete this._hrefChanged; - }, - - _onLoadHandler: function(data){ - // summary: - // This is called whenever new content is being loaded - this._set("isLoaded", true); - try{ - this.onLoadDeferred.resolve(data); - }catch(e){ - console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message); - } - }, - - _onUnloadHandler: function(){ - // summary: - // This is called whenever the content is being unloaded - this._set("isLoaded", false); - try{ - this.onUnload(); - }catch(e){ - console.error('Error '+this.widgetId+' running custom onUnload code: ' + e.message); - } - }, - - destroyDescendants: function(/*Boolean*/ preserveDom){ - // summary: - // Destroy all the widgets inside the ContentPane and empty containerNode - - // Make sure we call onUnload (but only when the ContentPane has real content) - if(this.isLoaded){ - this._onUnloadHandler(); - } - - // Even if this.isLoaded == false there might still be a "Loading..." message - // to erase, so continue... - - // For historical reasons we need to delete all widgets under this.containerNode, - // even ones that the user has created manually. - var setter = this._contentSetter; - array.forEach(this.getChildren(), function(widget){ - if(widget.destroyRecursive){ - // All widgets will hit this branch - widget.destroyRecursive(preserveDom); - }else if(widget.destroy){ - // Things like dojo/dnd/Source have destroy(), not destroyRecursive() - widget.destroy(preserveDom); - } - widget._destroyed = true; - }); - if(setter){ - // Most of the widgets in setter.parseResults have already been destroyed, but - // things like Menu that have been moved to <body> haven't yet - array.forEach(setter.parseResults, function(widget){ - if(!widget._destroyed){ - if(widget.destroyRecursive){ - // All widgets will hit this branch - widget.destroyRecursive(preserveDom); - }else if(widget.destroy){ - // Things like dojo/dnd/Source have destroy(), not destroyRecursive() - widget.destroy(preserveDom); - } - widget._destroyed = true; - } - }); - delete setter.parseResults; - } - - // And then clear away all the DOM nodes - if(!preserveDom){ - domConstruct.empty(this.containerNode); - } - - // Delete any state information we have about current contents - delete this._singleChild; - }, - - _setContent: function(/*String|DocumentFragment*/ cont, /*Boolean*/ isFakeContent){ - // summary: - // Insert the content into the container node - // returns: - // Returns a Deferred promise that is resolved when the content is parsed. - - // first get rid of child widgets - this.destroyDescendants(); - - // html.set will take care of the rest of the details - // we provide an override for the error handling to ensure the widget gets the errors - // configure the setter instance with only the relevant widget instance properties - // NOTE: unless we hook into attr, or provide property setters for each property, - // we need to re-configure the ContentSetter with each use - var setter = this._contentSetter; - if(! (setter && setter instanceof html._ContentSetter)){ - setter = this._contentSetter = new html._ContentSetter({ - node: this.containerNode, - _onError: lang.hitch(this, this._onError), - onContentError: lang.hitch(this, function(e){ - // fires if a domfault occurs when we are appending this.errorMessage - // like for instance if domNode is a UL and we try append a DIV - var errMess = this.onContentError(e); - try{ - this.containerNode.innerHTML = errMess; - }catch(e){ - console.error('Fatal '+this.id+' could not change content due to '+e.message, e); - } - })/*, - _onError */ - }); - } - - var setterParams = lang.mixin({ - cleanContent: this.cleanContent, - extractContent: this.extractContent, - parseContent: !cont.domNode && this.parseOnLoad, - parserScope: this.parserScope, - startup: false, - dir: this.dir, - lang: this.lang, - textDir: this.textDir - }, this._contentSetterParams || {}); - - var p = setter.set( (lang.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams ); - - // dojox/layout/html/_base::_ContentSetter.set() returns a Promise that indicates when everything is completed. - // dojo/html::_ContentSetter.set() currently returns the DOMNode, but that will be changed for 2.0. - // So, if set() returns a promise then use it, otherwise fallback to waiting on setter.parseDeferred - var self = this; - return when(p && p.then ? p : setter.parseDeferred, function(){ - // setter params must be pulled afresh from the ContentPane each time - delete self._contentSetterParams; - - if(!isFakeContent){ - if(self._started){ - // Startup each top level child widget (and they will start their children, recursively) - self._startChildren(); - - // Call resize() on each of my child layout widgets, - // or resize() on my single child layout widget... - // either now (if I'm currently visible) or when I become visible - self._scheduleLayout(); - } - self._onLoadHandler(cont); - } - }); - }, - - _onError: function(type, err, consoleText){ - this.onLoadDeferred.reject(err); - - // shows user the string that is returned by on[type]Error - // override on[type]Error and return your own string to customize - var errText = this['on' + type + 'Error'].call(this, err); - if(consoleText){ - console.error(consoleText, err); - }else if(errText){// a empty string won't change current content - this._setContent(errText, true); - } - }, - - // EVENT's, should be overide-able - onLoad: function(/*===== data =====*/){ - // summary: - // Event hook, is called after everything is loaded and widgetified - // tags: - // callback - }, - - onUnload: function(){ - // summary: - // Event hook, is called before old content is cleared - // tags: - // callback - }, - - onDownloadStart: function(){ - // summary: - // Called before download starts. - // description: - // The string returned by this function will be the html - // that tells the user we are loading something. - // Override with your own function if you want to change text. - // tags: - // extension - return this.loadingMessage; - }, - - onContentError: function(/*Error*/ /*===== error =====*/){ - // summary: - // Called on DOM faults, require faults etc. in content. - // - // In order to display an error message in the pane, return - // the error message from this method, as an HTML string. - // - // By default (if this method is not overriden), it returns - // nothing, so the error message is just printed to the console. - // tags: - // extension - }, - - onDownloadError: function(/*Error*/ /*===== error =====*/){ - // summary: - // Called when download error occurs. - // - // In order to display an error message in the pane, return - // the error message from this method, as an HTML string. - // - // Default behavior (if this method is not overriden) is to display - // the error message inside the pane. - // tags: - // extension - return this.errorMessage; - }, - - onDownloadEnd: function(){ - // summary: - // Called when download is finished. - // tags: - // callback - } -}); - -}); diff --git a/lib/dijit/layout/LayoutContainer.js.uncompressed.js b/lib/dijit/layout/LayoutContainer.js.uncompressed.js deleted file mode 100644 index ce301d0d4..000000000 --- a/lib/dijit/layout/LayoutContainer.js.uncompressed.js +++ /dev/null @@ -1,91 +0,0 @@ -define("dijit/layout/LayoutContainer", [ - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", - "dojo/_base/declare", // declare - "../_WidgetBase", - "./_LayoutWidget", - "./utils" // layoutUtils.layoutChildren -], function(kernel, lang, declare, _WidgetBase, _LayoutWidget, layoutUtils){ - -// module: -// dijit/layout/LayoutContainer - -var LayoutContainer = declare("dijit.layout.LayoutContainer", _LayoutWidget, { - // summary: - // Deprecated. Use `dijit/layout/BorderContainer` instead. - // description: - // Provides Delphi-style panel layout semantics. - // - // A LayoutContainer is a box with a specified size (like style="width: 500px; height: 500px;"), - // that contains children widgets marked with "layoutAlign" of "left", "right", "bottom", "top", and "client". - // It takes it's children marked as left/top/bottom/right, and lays them out along the edges of the box, - // and then it takes the child marked "client" and puts it into the remaining space in the middle. - // - // Left/right positioning is similar to CSS's "float: left" and "float: right", - // and top/bottom positioning would be similar to "float: top" and "float: bottom", if there were such - // CSS. - // - // Note that there can only be one client element, but there can be multiple left, right, top, - // or bottom elements. - // - // See `LayoutContainer.ChildWidgetProperties` for details on the properties that can be set on - // children of a `LayoutContainer`. - // - // example: - // | <style> - // | html, body{ height: 100%; width: 100%; } - // | </style> - // | <div data-dojo-type="dijit/layout/LayoutContainer" style="width: 100%; height: 100%"> - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="layoutAlign: 'top'">header text</div> - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="layoutAlign: 'left'" style="width: 200px;">table of contents</div> - // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="layoutAlign: 'client'">client area</div> - // | </div> - // - // Lays out each child in the natural order the children occur in. - // Basically each child is laid out into the "remaining space", where "remaining space" is initially - // the content area of this widget, but is reduced to a smaller rectangle each time a child is added. - // tags: - // deprecated - - baseClass: "dijitLayoutContainer", - - constructor: function(){ - kernel.deprecated("dijit.layout.LayoutContainer is deprecated", "use BorderContainer instead", 2.0); - }, - - layout: function(){ - layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren()); - }, - - addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){ - this.inherited(arguments); - if(this._started){ - layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren()); - } - }, - - removeChild: function(/*dijit/_WidgetBase*/ widget){ - this.inherited(arguments); - if(this._started){ - layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren()); - } - } -}); - -LayoutContainer.ChildWidgetProperties = { - // summary: - // This property can be specified for the children of a LayoutContainer. - - // layoutAlign: String - // "none", "left", "right", "bottom", "top", and "client". - // See the LayoutContainer description for details on this parameter. - layoutAlign: 'none' -}; - -// Since any widget can be specified as a LayoutContainer child, mix it -// into the base widget class. (This is a hack, but it's effective.) -// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer. -lang.extend(_WidgetBase, /*===== {} || =====*/ LayoutContainer.ChildWidgetProperties); - -return LayoutContainer; -}); diff --git a/lib/dijit/layout/LinkPane.js.uncompressed.js b/lib/dijit/layout/LinkPane.js.uncompressed.js deleted file mode 100644 index c8a77f7cf..000000000 --- a/lib/dijit/layout/LinkPane.js.uncompressed.js +++ /dev/null @@ -1,44 +0,0 @@ -define("dijit/layout/LinkPane", [ - "./ContentPane", - "../_TemplatedMixin", - "dojo/_base/declare" // declare -], function(ContentPane, _TemplatedMixin, declare){ - - // module: - // dijit/layout/LinkPane - - - return declare("dijit.layout.LinkPane", [ContentPane, _TemplatedMixin], { - // summary: - // A ContentPane with an href where (when declared in markup) - // the title is specified as innerHTML rather than as a title attribute. - // description: - // LinkPane is just a ContentPane that is declared in markup similarly - // to an anchor. The anchor's body (the words between `<a>` and `</a>`) - // become the title of the widget (used for TabContainer, AccordionContainer, etc.) - // example: - // | <a href="foo.html">my title</a> - - // I'm using a template because the user may specify the input as - // <a href="foo.html">title</a>, in which case we need to get rid of the - // <a> because we don't want a link. - templateString: '<div class="dijitLinkPane" data-dojo-attach-point="containerNode"></div>', - - postMixInProperties: function(){ - // If user has specified node contents, they become the title - // (the link must be plain text) - if(this.srcNodeRef){ - this.title += this.srcNodeRef.innerHTML; - } - this.inherited(arguments); - }, - - _fillContent: function(){ - // Overrides _Templated._fillContent(). - - // _Templated._fillContent() relocates srcNodeRef innerHTML to templated container node, - // but in our case the srcNodeRef innerHTML is the title, so shouldn't be - // copied - } - }); -}); diff --git a/lib/dijit/layout/ScrollingTabController.js.uncompressed.js b/lib/dijit/layout/ScrollingTabController.js.uncompressed.js deleted file mode 100644 index 63896d622..000000000 --- a/lib/dijit/layout/ScrollingTabController.js.uncompressed.js +++ /dev/null @@ -1,500 +0,0 @@ -require({cache:{ -'url:dijit/layout/templates/ScrollingTabController.html':"<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\"\n\t\t\tdata-dojo-props=\"containerId: '${containerId}', iconClass: 'dijitTabStripMenuIcon',\n\t\t\t\t\tdropDownPosition: ['below-alt', 'above-alt']\"\n\t\t\tdata-dojo-attach-point=\"_menuBtn\" showLabel=\"false\" title=\"\">▼</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideLeftIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_leftBtn\" data-dojo-attach-event=\"onClick: doSlideLeft\">◀</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideRightIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_rightBtn\" data-dojo-attach-event=\"onClick: doSlideRight\">▶</div>\n\t<div class='dijitTabListWrapper' data-dojo-attach-point='tablistWrapper'>\n\t\t<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'\n\t\t\t\tdata-dojo-attach-point='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>", -'url:dijit/layout/templates/_ScrollingTabControllerButton.html':"<div data-dojo-attach-event=\"onclick:_onClick\" class=\"dijitTabInnerDiv dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"focusNode\">\n\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n</div>"}}); -define("dijit/layout/ScrollingTabController", [ - "dojo/_base/array", // array.forEach - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.contains - "dojo/dom-geometry", // domGeometry.contentBox - "dojo/dom-style", // domStyle.style - "dojo/_base/fx", // Animation - "dojo/_base/lang", // lang.hitch - "dojo/on", - "dojo/query", // query - "dojo/sniff", // has("ie"), has("webkit"), has("quirks") - "../registry", // registry.byId() - "dojo/text!./templates/ScrollingTabController.html", - "dojo/text!./templates/_ScrollingTabControllerButton.html", - "./TabController", - "./utils", // marginBox2contextBox, layoutChildren - "../_WidgetsInTemplateMixin", - "../Menu", - "../MenuItem", - "../form/Button", - "../_HasDropDown", - "dojo/NodeList-dom" // NodeList.style -], function(array, declare, domClass, domGeometry, domStyle, fx, lang, on, query, has, - registry, tabControllerTemplate, buttonTemplate, TabController, layoutUtils, _WidgetsInTemplateMixin, - Menu, MenuItem, Button, _HasDropDown){ - -// module: -// dijit/layout/ScrollingTabController - - -var ScrollingTabController = declare("dijit.layout.ScrollingTabController", [TabController, _WidgetsInTemplateMixin], { - // summary: - // Set of tabs with left/right arrow keys and a menu to switch between tabs not - // all fitting on a single row. - // Works only for horizontal tabs (either above or below the content, not to the left - // or right). - // tags: - // private - - baseClass: "dijitTabController dijitScrollingTabController", - - templateString: tabControllerTemplate, - - // useMenu: [const] Boolean - // True if a menu should be used to select tabs when they are too - // wide to fit the TabContainer, false otherwise. - useMenu: true, - - // useSlider: [const] Boolean - // True if a slider should be used to select tabs when they are too - // wide to fit the TabContainer, false otherwise. - useSlider: true, - - // tabStripClass: [const] String - // The css class to apply to the tab strip, if it is visible. - tabStripClass: "", - - widgetsInTemplate: true, - - // _minScroll: Number - // The distance in pixels from the edge of the tab strip which, - // if a scroll animation is less than, forces the scroll to - // go all the way to the left/right. - _minScroll: 5, - - // Override default behavior mapping class to DOMNode - _setClassAttr: { node: "containerNode", type: "class" }, - - buildRendering: function(){ - this.inherited(arguments); - var n = this.domNode; - - this.scrollNode = this.tablistWrapper; - this._initButtons(); - - if(!this.tabStripClass){ - this.tabStripClass = "dijitTabContainer" + - this.tabPosition.charAt(0).toUpperCase() + - this.tabPosition.substr(1).replace(/-.*/, "") + - "None"; - domClass.add(n, "tabStrip-disabled") - } - - domClass.add(this.tablistWrapper, this.tabStripClass); - }, - - onStartup: function(){ - this.inherited(arguments); - - // TabController is hidden until it finishes drawing, to give - // a less visually jumpy instantiation. When it's finished, set visibility to "" - // to that the tabs are hidden/shown depending on the container's visibility setting. - domStyle.set(this.domNode, "visibility", ""); - this._postStartup = true; - - // changes to the tab button label or iconClass will have changed the width of the - // buttons, so do a resize - this.own(on(this.containerNode, "attrmodified-label, attrmodified-iconclass", lang.hitch(this, function(evt){ - if(this._dim){ - this.resize(this._dim); - } - }))); - }, - - onAddChild: function(page, insertIndex){ - this.inherited(arguments); - - // Increment the width of the wrapper when a tab is added - // This makes sure that the buttons never wrap. - // The value 200 is chosen as it should be bigger than most - // Tab button widths. - domStyle.set(this.containerNode, "width", - (domStyle.get(this.containerNode, "width") + 200) + "px"); - }, - - onRemoveChild: function(page, insertIndex){ - // null out _selectedTab because we are about to delete that dom node - var button = this.pane2button[page.id]; - if(this._selectedTab === button.domNode){ - this._selectedTab = null; - } - - this.inherited(arguments); - }, - - _initButtons: function(){ - // summary: - // Creates the buttons used to scroll to view tabs that - // may not be visible if the TabContainer is too narrow. - - // Make a list of the buttons to display when the tab labels become - // wider than the TabContainer, and hide the other buttons. - // Also gets the total width of the displayed buttons. - this._btnWidth = 0; - this._buttons = query("> .tabStripButton", this.domNode).filter(function(btn){ - if((this.useMenu && btn == this._menuBtn.domNode) || - (this.useSlider && (btn == this._rightBtn.domNode || btn == this._leftBtn.domNode))){ - this._btnWidth += domGeometry.getMarginSize(btn).w; - return true; - }else{ - domStyle.set(btn, "display", "none"); - return false; - } - }, this); - }, - - _getTabsWidth: function(){ - var children = this.getChildren(); - if(children.length){ - var leftTab = children[this.isLeftToRight() ? 0 : children.length - 1].domNode, - rightTab = children[this.isLeftToRight() ? children.length - 1 : 0].domNode; - return rightTab.offsetLeft + rightTab.offsetWidth - leftTab.offsetLeft; - }else{ - return 0; - } - }, - - _enableBtn: function(width){ - // summary: - // Determines if the tabs are wider than the width of the TabContainer, and - // thus that we need to display left/right/menu navigation buttons. - var tabsWidth = this._getTabsWidth(); - width = width || domStyle.get(this.scrollNode, "width"); - return tabsWidth > 0 && width < tabsWidth; - }, - - resize: function(dim){ - // summary: - // Hides or displays the buttons used to scroll the tab list and launch the menu - // that selects tabs. - - // Save the dimensions to be used when a child is renamed. - this._dim = dim; - - // Set my height to be my natural height (tall enough for one row of tab labels), - // and my content-box width based on margin-box width specified in dim parameter. - // But first reset scrollNode.height in case it was set by layoutChildren() call - // in a previous run of this method. - this.scrollNode.style.height = "auto"; - var cb = this._contentBox = layoutUtils.marginBox2contentBox(this.domNode, {h: 0, w: dim.w}); - cb.h = this.scrollNode.offsetHeight; - domGeometry.setContentSize(this.domNode, cb); - - // Show/hide the left/right/menu navigation buttons depending on whether or not they - // are needed. - var enable = this._enableBtn(this._contentBox.w); - this._buttons.style("display", enable ? "" : "none"); - - // Position and size the navigation buttons and the tablist - this._leftBtn.layoutAlign = "left"; - this._rightBtn.layoutAlign = "right"; - this._menuBtn.layoutAlign = this.isLeftToRight() ? "right" : "left"; - layoutUtils.layoutChildren(this.domNode, this._contentBox, - [this._menuBtn, this._leftBtn, this._rightBtn, {domNode: this.scrollNode, layoutAlign: "client"}]); - - // set proper scroll so that selected tab is visible - if(this._selectedTab){ - if(this._anim && this._anim.status() == "playing"){ - this._anim.stop(); - } - this.scrollNode.scrollLeft = this._convertToScrollLeft(this._getScrollForSelectedTab()); - } - - // Enable/disabled left right buttons depending on whether or not user can scroll to left or right - this._setButtonClass(this._getScroll()); - - this._postResize = true; - - // Return my size so layoutChildren() can use it. - // Also avoids IE9 layout glitch on browser resize when scroll buttons present - return {h: this._contentBox.h, w: dim.w}; - }, - - _getScroll: function(){ - // summary: - // Returns the current scroll of the tabs where 0 means - // "scrolled all the way to the left" and some positive number, based on # - // of pixels of possible scroll (ex: 1000) means "scrolled all the way to the right" - return (this.isLeftToRight() || has("ie") < 8 || (has("ie") && has("quirks")) || has("webkit")) ? this.scrollNode.scrollLeft : - domStyle.get(this.containerNode, "width") - domStyle.get(this.scrollNode, "width") - + (has("ie") >= 8 ? -1 : 1) * this.scrollNode.scrollLeft; - }, - - _convertToScrollLeft: function(val){ - // summary: - // Given a scroll value where 0 means "scrolled all the way to the left" - // and some positive number, based on # of pixels of possible scroll (ex: 1000) - // means "scrolled all the way to the right", return value to set this.scrollNode.scrollLeft - // to achieve that scroll. - // - // This method is to adjust for RTL funniness in various browsers and versions. - if(this.isLeftToRight() || has("ie") < 8 || (has("ie") && has("quirks")) || has("webkit")){ - return val; - }else{ - var maxScroll = domStyle.get(this.containerNode, "width") - domStyle.get(this.scrollNode, "width"); - return (has("ie") >= 8 ? -1 : 1) * (val - maxScroll); - } - }, - - onSelectChild: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Smoothly scrolls to a tab when it is selected. - - var tab = this.pane2button[page.id]; - if(!tab || !page){return;} - - var node = tab.domNode; - - // Save the selection - if(node != this._selectedTab){ - this._selectedTab = node; - - // Scroll to the selected tab, except on startup, when scrolling is handled in resize() - if(this._postResize){ - var sl = this._getScroll(); - - if(sl > node.offsetLeft || - sl + domStyle.get(this.scrollNode, "width") < - node.offsetLeft + domStyle.get(node, "width")){ - this.createSmoothScroll().play(); - } - } - } - - this.inherited(arguments); - }, - - _getScrollBounds: function(){ - // summary: - // Returns the minimum and maximum scroll setting to show the leftmost and rightmost - // tabs (respectively) - var children = this.getChildren(), - scrollNodeWidth = domStyle.get(this.scrollNode, "width"), // about 500px - containerWidth = domStyle.get(this.containerNode, "width"), // 50,000px - maxPossibleScroll = containerWidth - scrollNodeWidth, // scrolling until right edge of containerNode visible - tabsWidth = this._getTabsWidth(); - - if(children.length && tabsWidth > scrollNodeWidth){ - // Scrolling should happen - return { - min: this.isLeftToRight() ? 0 : children[children.length-1].domNode.offsetLeft, - max: this.isLeftToRight() ? - (children[children.length-1].domNode.offsetLeft + children[children.length-1].domNode.offsetWidth) - scrollNodeWidth : - maxPossibleScroll - }; - }else{ - // No scrolling needed, all tabs visible, we stay either scrolled to far left or far right (depending on dir) - var onlyScrollPosition = this.isLeftToRight() ? 0 : maxPossibleScroll; - return { - min: onlyScrollPosition, - max: onlyScrollPosition - }; - } - }, - - _getScrollForSelectedTab: function(){ - // summary: - // Returns the scroll value setting so that the selected tab - // will appear in the center - var w = this.scrollNode, - n = this._selectedTab, - scrollNodeWidth = domStyle.get(this.scrollNode, "width"), - scrollBounds = this._getScrollBounds(); - - // TODO: scroll minimal amount (to either right or left) so that - // selected tab is fully visible, and just return if it's already visible? - var pos = (n.offsetLeft + domStyle.get(n, "width")/2) - scrollNodeWidth/2; - pos = Math.min(Math.max(pos, scrollBounds.min), scrollBounds.max); - - // TODO: - // If scrolling close to the left side or right side, scroll - // all the way to the left or right. See this._minScroll. - // (But need to make sure that doesn't scroll the tab out of view...) - return pos; - }, - - createSmoothScroll: function(x){ - // summary: - // Creates a dojo._Animation object that smoothly scrolls the tab list - // either to a fixed horizontal pixel value, or to the selected tab. - // description: - // If an number argument is passed to the function, that horizontal - // pixel position is scrolled to. Otherwise the currently selected - // tab is scrolled to. - // x: Integer? - // An optional pixel value to scroll to, indicating distance from left. - - // Calculate position to scroll to - if(arguments.length > 0){ - // position specified by caller, just make sure it's within bounds - var scrollBounds = this._getScrollBounds(); - x = Math.min(Math.max(x, scrollBounds.min), scrollBounds.max); - }else{ - // scroll to center the current tab - x = this._getScrollForSelectedTab(); - } - - if(this._anim && this._anim.status() == "playing"){ - this._anim.stop(); - } - - var self = this, - w = this.scrollNode, - anim = new fx.Animation({ - beforeBegin: function(){ - if(this.curve){ delete this.curve; } - var oldS = w.scrollLeft, - newS = self._convertToScrollLeft(x); - anim.curve = new fx._Line(oldS, newS); - }, - onAnimate: function(val){ - w.scrollLeft = val; - } - }); - this._anim = anim; - - // Disable/enable left/right buttons according to new scroll position - this._setButtonClass(x); - - return anim; // dojo/_base/fx/Animation - }, - - _getBtnNode: function(/*Event*/ e){ - // summary: - // Gets a button DOM node from a mouse click event. - // e: - // The mouse click event. - var n = e.target; - while(n && !domClass.contains(n, "tabStripButton")){ - n = n.parentNode; - } - return n; - }, - - doSlideRight: function(/*Event*/ e){ - // summary: - // Scrolls the menu to the right. - // e: - // The mouse click event. - this.doSlide(1, this._getBtnNode(e)); - }, - - doSlideLeft: function(/*Event*/ e){ - // summary: - // Scrolls the menu to the left. - // e: - // The mouse click event. - this.doSlide(-1,this._getBtnNode(e)); - }, - - doSlide: function(/*Number*/ direction, /*DomNode*/ node){ - // summary: - // Scrolls the tab list to the left or right by 75% of the widget width. - // direction: - // If the direction is 1, the widget scrolls to the right, if it is -1, - // it scrolls to the left. - - if(node && domClass.contains(node, "dijitTabDisabled")){return;} - - var sWidth = domStyle.get(this.scrollNode, "width"); - var d = (sWidth * 0.75) * direction; - - var to = this._getScroll() + d; - - this._setButtonClass(to); - - this.createSmoothScroll(to).play(); - }, - - _setButtonClass: function(/*Number*/ scroll){ - // summary: - // Disables the left scroll button if the tabs are scrolled all the way to the left, - // or the right scroll button in the opposite case. - // scroll: Integer - // amount of horizontal scroll - - var scrollBounds = this._getScrollBounds(); - this._leftBtn.set("disabled", scroll <= scrollBounds.min); - this._rightBtn.set("disabled", scroll >= scrollBounds.max); - } -}); - - -var ScrollingTabControllerButtonMixin = declare("dijit.layout._ScrollingTabControllerButtonMixin", null, { - baseClass: "dijitTab tabStripButton", - - templateString: buttonTemplate, - - // Override inherited tabIndex: 0 from dijit/form/Button, because user shouldn't be - // able to tab to the left/right/menu buttons - tabIndex: "", - - // Similarly, override FormWidget.isFocusable() because clicking a button shouldn't focus it - // either (this override avoids focus() call in FormWidget.js) - isFocusable: function(){ return false; } -}); - -// Class used in template -declare("dijit.layout._ScrollingTabControllerButton", - [Button, ScrollingTabControllerButtonMixin]); - -// Class used in template -declare( - "dijit.layout._ScrollingTabControllerMenuButton", - [Button, _HasDropDown, ScrollingTabControllerButtonMixin], -{ - // id of the TabContainer itself - containerId: "", - - // -1 so user can't tab into the button, but so that button can still be focused programatically. - // Because need to move focus to the button (or somewhere) before the menu is hidden or IE6 will crash. - tabIndex: "-1", - - isLoaded: function(){ - // recreate menu every time, in case the TabContainer's list of children (or their icons/labels) have changed - return false; - }, - - loadDropDown: function(callback){ - this.dropDown = new Menu({ - id: this.containerId + "_menu", - ownerDocument: this.ownerDocument, - dir: this.dir, - lang: this.lang, - textDir: this.textDir - }); - var container = registry.byId(this.containerId); - array.forEach(container.getChildren(), function(page){ - var menuItem = new MenuItem({ - id: page.id + "_stcMi", - label: page.title, - iconClass: page.iconClass, - disabled: page.disabled, - ownerDocument: this.ownerDocument, - dir: page.dir, - lang: page.lang, - textDir: page.textDir, - onClick: function(){ - container.selectChild(page); - } - }); - this.dropDown.addChild(menuItem); - }, this); - callback(); - }, - - closeDropDown: function(/*Boolean*/ focus){ - this.inherited(arguments); - if(this.dropDown){ - this.dropDown.destroyRecursive(); - delete this.dropDown; - } - } -}); - -return ScrollingTabController; -}); diff --git a/lib/dijit/layout/SplitContainer.js.uncompressed.js b/lib/dijit/layout/SplitContainer.js.uncompressed.js deleted file mode 100644 index 0b5d44500..000000000 --- a/lib/dijit/layout/SplitContainer.js.uncompressed.js +++ /dev/null @@ -1,584 +0,0 @@ -define("dijit/layout/SplitContainer", [ - "dojo/_base/array", // array.forEach array.indexOf array.some - "dojo/cookie", // cookie - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "dojo/dom-class", // domClass.add - "dojo/dom-construct", // domConstruct.create domConstruct.destroy - "dojo/dom-geometry", // domGeometry.marginBox domGeometry.position - "dojo/dom-style", // domStyle.style - "dojo/_base/event", // event.stop - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.extend lang.hitch - "dojo/on", - "dojo/sniff", // has("mozilla") - "../registry", // registry.getUniqueId() - "../_WidgetBase", - "./_LayoutWidget" -], function(array, cookie, declare, dom, domClass, domConstruct, domGeometry, domStyle, - event, kernel, lang, on, has, registry, _WidgetBase, _LayoutWidget){ - -// module: -// dijit/layout/SplitContainer - -// -// FIXME: make it prettier -// FIXME: active dragging upwards doesn't always shift other bars (direction calculation is wrong in this case) -// FIXME: sizeWidth should be a CSS attribute (at 7 because css wants it to be 7 until we fix to css) -// - -var SplitContainer = declare("dijit.layout.SplitContainer", _LayoutWidget, { - // summary: - // Deprecated. Use `dijit/layout/BorderContainer` instead. - // description: - // A Container widget with sizing handles in-between each child. - // Contains multiple children widgets, all of which are displayed side by side - // (either horizontally or vertically); there's a bar between each of the children, - // and you can adjust the relative size of each child by dragging the bars. - // - // You must specify a size (width and height) for the SplitContainer. - // - // See `SplitContainer.ChildWidgetProperties` for details on the properties that can be set on - // children of a `SplitContainer`. - // tags: - // deprecated - - constructor: function(){ - kernel.deprecated("dijit.layout.SplitContainer is deprecated", "use BorderContainer with splitter instead", 2.0); - }, - - // activeSizing: Boolean - // If true, the children's size changes as you drag the bar; - // otherwise, the sizes don't change until you drop the bar (by mouse-up) - activeSizing: false, - - // sizerWidth: Integer - // Size in pixels of the bar between each child - sizerWidth: 7, - - // orientation: String - // either 'horizontal' or vertical; indicates whether the children are - // arranged side-by-side or up/down. - orientation: 'horizontal', - - // persist: Boolean - // Save splitter positions in a cookie - persist: true, - - baseClass: "dijitSplitContainer", - - postMixInProperties: function(){ - this.inherited("postMixInProperties",arguments); - this.isHorizontal = (this.orientation == 'horizontal'); - }, - - postCreate: function(){ - this.inherited(arguments); - this.sizers = []; - - // overflow has to be explicitly hidden for splitContainers using gekko (trac #1435) - // to keep other combined css classes from inadvertantly making the overflow visible - if(has("mozilla")){ - this.domNode.style.overflow = '-moz-scrollbars-none'; // hidden doesn't work - } - - // create the fake dragger - if(typeof this.sizerWidth == "object"){ - try{ //FIXME: do this without a try/catch - this.sizerWidth = parseInt(this.sizerWidth.toString()); - }catch(e){ this.sizerWidth = 7; } - } - var sizer = this.ownerDocument.createElement('div'); - this.virtualSizer = sizer; - sizer.style.position = 'relative'; - - // #1681: work around the dreaded 'quirky percentages in IE' layout bug - // If the splitcontainer's dimensions are specified in percentages, it - // will be resized when the virtualsizer is displayed in _showSizingLine - // (typically expanding its bounds unnecessarily). This happens because - // we use position: relative for .dijitSplitContainer. - // The workaround: instead of changing the display style attribute, - // switch to changing the zIndex (bring to front/move to back) - - sizer.style.zIndex = 10; - sizer.className = this.isHorizontal ? 'dijitSplitContainerVirtualSizerH' : 'dijitSplitContainerVirtualSizerV'; - this.domNode.appendChild(sizer); - dom.setSelectable(sizer, false); - }, - - destroy: function(){ - delete this.virtualSizer; - if(this._ownconnects){ - var h; - while(h = this._ownconnects.pop()){ h.remove(); } - } - this.inherited(arguments); - }, - startup: function(){ - if(this._started){ return; } - - array.forEach(this.getChildren(), function(child, i, children){ - // attach the children and create the draggers - this._setupChild(child); - - if(i < children.length-1){ - this._addSizer(); - } - }, this); - - if(this.persist){ - this._restoreState(); - } - - this.inherited(arguments); - }, - - _setupChild: function(/*dijit/_WidgetBase*/ child){ - this.inherited(arguments); - child.domNode.style.position = "absolute"; - domClass.add(child.domNode, "dijitSplitPane"); - }, - - _onSizerMouseDown: function(e){ - if(e.target.id){ - for(var i=0;i<this.sizers.length;i++){ - if(this.sizers[i].id == e.target.id){ - break; - } - } - if(i<this.sizers.length){ - this.beginSizing(e,i); - } - } - }, - _addSizer: function(index){ - index = index === undefined ? this.sizers.length : index; - - // TODO: use a template for this!!! - var sizer = this.ownerDocument.createElement('div'); - sizer.id=registry.getUniqueId('dijit_layout_SplitterContainer_Splitter'); - this.sizers.splice(index,0,sizer); - this.domNode.appendChild(sizer); - - sizer.className = this.isHorizontal ? 'dijitSplitContainerSizerH' : 'dijitSplitContainerSizerV'; - - // add the thumb div - var thumb = this.ownerDocument.createElement('div'); - thumb.className = 'thumb'; - sizer.appendChild(thumb); - - // FIXME: are you serious? why aren't we using mover start/stop combo? - this.connect(sizer, "onmousedown", '_onSizerMouseDown'); - - dom.setSelectable(sizer, false); - }, - - removeChild: function(widget){ - // summary: - // Remove sizer, but only if widget is really our child and - // we have at least one sizer to throw away - if(this.sizers.length){ - var i = array.indexOf(this.getChildren(), widget); - if(i != -1){ - if(i == this.sizers.length){ - i--; - } - domConstruct.destroy(this.sizers[i]); - this.sizers.splice(i,1); - } - } - - // Remove widget and repaint - this.inherited(arguments); - if(this._started){ - this.layout(); - } - }, - - addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){ - // summary: - // Add a child widget to the container - // child: - // a widget to add - // insertIndex: - // postion in the "stack" to add the child widget - - this.inherited(arguments); - - if(this._started){ - // Do the stuff that startup() does for each widget - var children = this.getChildren(); - if(children.length > 1){ - this._addSizer(insertIndex); - } - - // and then reposition (ie, shrink) every pane to make room for the new guy - this.layout(); - } - }, - - layout: function(){ - // summary: - // Do layout of panels - - // base class defines this._contentBox on initial creation and also - // on resize - this.paneWidth = this._contentBox.w; - this.paneHeight = this._contentBox.h; - - var children = this.getChildren(); - if(!children.length){ return; } - - // - // calculate space - // - - var space = this.isHorizontal ? this.paneWidth : this.paneHeight; - if(children.length > 1){ - space -= this.sizerWidth * (children.length - 1); - } - - // - // calculate total of SizeShare values - // - var outOf = 0; - array.forEach(children, function(child){ - outOf += child.sizeShare; - }); - - // - // work out actual pixels per sizeshare unit - // - var pixPerUnit = space / outOf; - - // - // set the SizeActual member of each pane - // - var totalSize = 0; - array.forEach(children.slice(0, children.length - 1), function(child){ - var size = Math.round(pixPerUnit * child.sizeShare); - child.sizeActual = size; - totalSize += size; - }); - - children[children.length-1].sizeActual = space - totalSize; - - // - // make sure the sizes are ok - // - this._checkSizes(); - - // - // now loop, positioning each pane and letting children resize themselves - // - - var pos = 0; - var size = children[0].sizeActual; - this._movePanel(children[0], pos, size); - children[0].position = pos; - pos += size; - - // if we don't have any sizers, our layout method hasn't been called yet - // so bail until we are called..TODO: REVISIT: need to change the startup - // algorithm to guaranteed the ordering of calls to layout method - if(!this.sizers){ - return; - } - - array.some(children.slice(1), function(child, i){ - // error-checking - if(!this.sizers[i]){ - return true; - } - // first we position the sizing handle before this pane - this._moveSlider(this.sizers[i], pos, this.sizerWidth); - this.sizers[i].position = pos; - pos += this.sizerWidth; - - size = child.sizeActual; - this._movePanel(child, pos, size); - child.position = pos; - pos += size; - }, this); - }, - - _movePanel: function(panel, pos, size){ - var box; - if(this.isHorizontal){ - panel.domNode.style.left = pos + 'px'; // TODO: resize() takes l and t parameters too, don't need to set manually - panel.domNode.style.top = 0; - box = {w: size, h: this.paneHeight}; - if(panel.resize){ - panel.resize(box); - }else{ - domGeometry.setMarginBox(panel.domNode, box); - } - }else{ - panel.domNode.style.left = 0; // TODO: resize() takes l and t parameters too, don't need to set manually - panel.domNode.style.top = pos + 'px'; - box = {w: this.paneWidth, h: size}; - if(panel.resize){ - panel.resize(box); - }else{ - domGeometry.setMarginBox(panel.domNode, box); - } - } - }, - - _moveSlider: function(slider, pos, size){ - if(this.isHorizontal){ - slider.style.left = pos + 'px'; - slider.style.top = 0; - domGeometry.setMarginBox(slider, { w: size, h: this.paneHeight }); - }else{ - slider.style.left = 0; - slider.style.top = pos + 'px'; - domGeometry.setMarginBox(slider, { w: this.paneWidth, h: size }); - } - }, - - _growPane: function(growth, pane){ - if(growth > 0){ - if(pane.sizeActual > pane.sizeMin){ - if((pane.sizeActual - pane.sizeMin) > growth){ - - // stick all the growth in this pane - pane.sizeActual = pane.sizeActual - growth; - growth = 0; - }else{ - // put as much growth in here as we can - growth -= pane.sizeActual - pane.sizeMin; - pane.sizeActual = pane.sizeMin; - } - } - } - return growth; - }, - - _checkSizes: function(){ - - var totalMinSize = 0; - var totalSize = 0; - var children = this.getChildren(); - - array.forEach(children, function(child){ - totalSize += child.sizeActual; - totalMinSize += child.sizeMin; - }); - - // only make adjustments if we have enough space for all the minimums - - if(totalMinSize <= totalSize){ - - var growth = 0; - - array.forEach(children, function(child){ - if(child.sizeActual < child.sizeMin){ - growth += child.sizeMin - child.sizeActual; - child.sizeActual = child.sizeMin; - } - }); - - if(growth > 0){ - var list = this.isDraggingLeft ? children.reverse() : children; - array.forEach(list, function(child){ - growth = this._growPane(growth, child); - }, this); - } - }else{ - array.forEach(children, function(child){ - child.sizeActual = Math.round(totalSize * (child.sizeMin / totalMinSize)); - }); - } - }, - - beginSizing: function(e, i){ - // summary: - // Begin dragging the splitter between child[i] and child[i+1] - - var children = this.getChildren(); - - this.paneBefore = children[i]; - this.paneAfter = children[i+1]; - - this.paneBefore.sizeBeforeDrag = this.paneBefore.sizeActual; - this.paneAfter.sizeBeforeDrag = this.paneAfter.sizeActual; - this.paneAfter.positionBeforeDrag = this.paneAfter.position; - - this.isSizing = true; - this.sizingSplitter = this.sizers[i]; - this.sizingSplitter.positionBeforeDrag = domStyle.get(this.sizingSplitter,(this.isHorizontal ? "left" : "top")); - - if(!this.cover){ - this.cover = domConstruct.create('div', { - style: { - position:'absolute', - zIndex:5, - top: 0, - left: 0, - width: "100%", - height: "100%" - } - }, this.domNode); - }else{ - this.cover.style.zIndex = 5; - } - this.sizingSplitter.style.zIndex = 6; - - // startPoint is the e.pageX or e.pageY at start of drag - this.startPoint = this.lastPoint = (this.isHorizontal ? e.pageX : e.pageY); - - // Calculate maximum to the left or right that splitter is allowed to be dragged - // minDelta is negative to indicate left/upward drag where end.pageX < start.pageX. - this.maxDelta = this.paneAfter.sizeActual - this.paneAfter.sizeMin; - this.minDelta = -1 * (this.paneBefore.sizeActual - this.paneBefore.sizeMin); - - if(!this.activeSizing){ - this._showSizingLine(); - } - - // attach mouse events - this._ownconnects = [ - on(this.ownerDocument.documentElement, "mousemove", lang.hitch(this, "changeSizing")), - on(this.ownerDocument.documentElement, "mouseup", lang.hitch(this, "endSizing")) - ]; - - event.stop(e); - }, - - changeSizing: function(e){ - // summary: - // Called on mousemove while dragging the splitter - - if(!this.isSizing){ return; } - - // lastPoint is the most recent e.pageX or e.pageY during the drag - this.lastPoint = this.isHorizontal ? e.pageX : e.pageY; - var delta = Math.max(Math.min(this.lastPoint - this.startPoint, this.maxDelta), this.minDelta); - - if(this.activeSizing){ - this._updateSize(delta); - }else{ - this._moveSizingLine(delta); - } - event.stop(e); - }, - - endSizing: function(){ - if(!this.isSizing){ return; } - if(this.cover){ - this.cover.style.zIndex = -1; - } - if(!this.activeSizing){ - this._hideSizingLine(); - } - - var delta = Math.max(Math.min(this.lastPoint - this.startPoint, this.maxDelta), this.minDelta); - this._updateSize(delta); - - this.isSizing = false; - - if(this.persist){ - this._saveState(this); - } - - var h; - while(h = this._ownconnects.pop()){ h.remove(); } - }, - - _updateSize: function(/*Number*/ delta){ - // summary: - // Resets sizes of panes before and after splitter being dragged. - // Called during a drag, for active sizing, or at the end of a drag otherwise. - // delta: Number - // Change in slider position compared to start of drag. But note that - // this function may be called multiple times during drag. - - this.paneBefore.sizeActual = this.paneBefore.sizeBeforeDrag + delta; - this.paneAfter.position = this.paneAfter.positionBeforeDrag + delta; - this.paneAfter.sizeActual = this.paneAfter.sizeBeforeDrag - delta; - - array.forEach(this.getChildren(), function(child){ - child.sizeShare = child.sizeActual; - }); - - if(this._started){ - this.layout(); - } - }, - - _showSizingLine: function(){ - // summary: - // Show virtual splitter, for non-active resizing - - this._moveSizingLine(0); - - domGeometry.setMarginBox(this.virtualSizer, - this.isHorizontal ? { w: this.sizerWidth, h: this.paneHeight } : { w: this.paneWidth, h: this.sizerWidth }); - - this.virtualSizer.style.display = 'block'; - }, - - _hideSizingLine: function(){ - this.virtualSizer.style.display = 'none'; - }, - - _moveSizingLine: function(/*Number*/ delta){ - // summary: - // Called for non-active resizing, to move the virtual splitter without adjusting the size of the panes - var pos = delta + this.sizingSplitter.positionBeforeDrag; - domStyle.set(this.virtualSizer,(this.isHorizontal ? "left" : "top"),pos+"px"); - }, - - _getCookieName: function(i){ - return this.id + "_" + i; - }, - - _restoreState: function(){ - array.forEach(this.getChildren(), function(child, i){ - var cookieName = this._getCookieName(i); - var cookieValue = cookie(cookieName); - if(cookieValue){ - var pos = parseInt(cookieValue); - if(typeof pos == "number"){ - child.sizeShare = pos; - } - } - }, this); - }, - - _saveState: function(){ - if(!this.persist){ - return; - } - array.forEach(this.getChildren(), function(child, i){ - cookie(this._getCookieName(i), child.sizeShare, {expires:365}); - }, this); - } -}); - -SplitContainer.ChildWidgetProperties = { - // summary: - // These properties can be specified for the children of a SplitContainer. - - // sizeMin: [deprecated] Integer - // Minimum size (width or height) of a child of a SplitContainer. - // The value is relative to other children's sizeShare properties. - sizeMin: 10, - - // sizeShare: [deprecated] Integer - // Size (width or height) of a child of a SplitContainer. - // The value is relative to other children's sizeShare properties. - // For example, if there are two children and each has sizeShare=10, then - // each takes up 50% of the available space. - sizeShare: 10 -}; - -// Since any widget can be specified as a SplitContainer child, mix them -// into the base widget class. (This is a hack, but it's effective.) -// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer. -lang.extend(_WidgetBase, /*===== {} || =====*/ SplitContainer.ChildWidgetProperties); - -return SplitContainer; - -}); diff --git a/lib/dijit/layout/StackContainer.js.uncompressed.js b/lib/dijit/layout/StackContainer.js.uncompressed.js deleted file mode 100644 index 864c4f478..000000000 --- a/lib/dijit/layout/StackContainer.js.uncompressed.js +++ /dev/null @@ -1,374 +0,0 @@ -define("dijit/layout/StackContainer", [ - "dojo/_base/array", // array.forEach array.indexOf array.some - "dojo/cookie", // cookie - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.replace - "dojo/has", // has("dijit-legacy-requires") - "dojo/_base/lang", // lang.extend - "dojo/ready", - "dojo/topic", // publish - "../registry", // registry.byId - "../_WidgetBase", - "./_LayoutWidget", - "dojo/i18n!../nls/common" -], function(array, cookie, declare, domClass, has, lang, ready, topic, - registry, _WidgetBase, _LayoutWidget){ - -// module: -// dijit/layout/StackContainer - -// Back compat w/1.6, remove for 2.0 -if(has("dijit-legacy-requires")){ - ready(0, function(){ - var requires = ["dijit/layout/StackController"]; - require(requires); // use indirection so modules not rolled into a build - }); -} - -var StackContainer = declare("dijit.layout.StackContainer", _LayoutWidget, { - // summary: - // A container that has multiple children, but shows only - // one child at a time - // - // description: - // A container for widgets (ContentPanes, for example) That displays - // only one Widget at a time. - // - // Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild - // - // Can be base class for container, Wizard, Show, etc. - // - // See `StackContainer.ChildWidgetProperties` for details on the properties that can be set on - // children of a `StackContainer`. - - // doLayout: Boolean - // If true, change the size of my currently displayed child to match my size - doLayout: true, - - // persist: Boolean - // Remembers the selected child across sessions - persist: false, - - baseClass: "dijitStackContainer", - -/*===== - // selectedChildWidget: [readonly] dijit._Widget - // References the currently selected child widget, if any. - // Adjust selected child with selectChild() method. - selectedChildWidget: null, -=====*/ - - buildRendering: function(){ - this.inherited(arguments); - domClass.add(this.domNode, "dijitLayoutContainer"); - this.containerNode.setAttribute("role", "tabpanel"); - }, - - postCreate: function(){ - this.inherited(arguments); - this.connect(this.domNode, "onkeypress", this._onKeyPress); - }, - - startup: function(){ - if(this._started){ return; } - - var children = this.getChildren(); - - // Setup each page panel to be initially hidden - array.forEach(children, this._setupChild, this); - - // Figure out which child to initially display, defaulting to first one - if(this.persist){ - this.selectedChildWidget = registry.byId(cookie(this.id + "_selectedChild")); - }else{ - array.some(children, function(child){ - if(child.selected){ - this.selectedChildWidget = child; - } - return child.selected; - }, this); - } - var selected = this.selectedChildWidget; - if(!selected && children[0]){ - selected = this.selectedChildWidget = children[0]; - selected.selected = true; - } - - // Publish information about myself so any StackControllers can initialize. - // This needs to happen before this.inherited(arguments) so that for - // TabContainer, this._contentBox doesn't include the space for the tab labels. - topic.publish(this.id+"-startup", {children: children, selected: selected}); - - // Startup each child widget, and do initial layout like setting this._contentBox, - // then calls this.resize() which does the initial sizing on the selected child. - this.inherited(arguments); - }, - - resize: function(){ - // Overrides _LayoutWidget.resize() - // Resize is called when we are first made visible (it's called from startup() - // if we are initially visible). If this is the first time we've been made - // visible then show our first child. - if(!this._hasBeenShown){ - this._hasBeenShown = true; - var selected = this.selectedChildWidget; - if(selected){ - this._showChild(selected); - } - } - this.inherited(arguments); - }, - - _setupChild: function(/*dijit/_WidgetBase*/ child){ - // Overrides _LayoutWidget._setupChild() - - this.inherited(arguments); - - domClass.replace(child.domNode, "dijitHidden", "dijitVisible"); - - // remove the title attribute so it doesn't show up when i hover - // over a node - child.domNode.title = ""; - }, - - addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){ - // Overrides _Container.addChild() to do layout and publish events - - this.inherited(arguments); - - if(this._started){ - topic.publish(this.id+"-addChild", child, insertIndex); // publish - - // in case the tab titles have overflowed from one line to two lines - // (or, if this if first child, from zero lines to one line) - // TODO: w/ScrollingTabController this is no longer necessary, although - // ScrollTabController.resize() does need to get called to show/hide - // the navigation buttons as appropriate, but that's handled in ScrollingTabController.onAddChild(). - // If this is updated to not layout [except for initial child added / last child removed], update - // "childless startup" test in StackContainer.html to check for no resize event after second addChild() - this.layout(); - - // if this is the first child, then select it - if(!this.selectedChildWidget){ - this.selectChild(child); - } - } - }, - - removeChild: function(/*dijit/_WidgetBase*/ page){ - // Overrides _Container.removeChild() to do layout and publish events - - this.inherited(arguments); - - if(this._started){ - // this will notify any tablists to remove a button; do this first because it may affect sizing - topic.publish(this.id + "-removeChild", page); // publish - } - - // If all our children are being destroyed than don't run the code below (to select another page), - // because we are deleting every page one by one - if(this._descendantsBeingDestroyed){ return; } - - // Select new page to display, also updating TabController to show the respective tab. - // Do this before layout call because it can affect the height of the TabController. - if(this.selectedChildWidget === page){ - this.selectedChildWidget = undefined; - if(this._started){ - var children = this.getChildren(); - if(children.length){ - this.selectChild(children[0]); - } - } - } - - if(this._started){ - // In case the tab titles now take up one line instead of two lines - // (note though that ScrollingTabController never overflows to multiple lines), - // or the height has changed slightly because of addition/removal of tab which close icon - this.layout(); - } - }, - - selectChild: function(/*dijit/_WidgetBase|String*/ page, /*Boolean*/ animate){ - // summary: - // Show the given widget (which must be one of my children) - // page: - // Reference to child widget or id of child widget - - page = registry.byId(page); - - if(this.selectedChildWidget != page){ - // Deselect old page and select new one - var d = this._transition(page, this.selectedChildWidget, animate); - this._set("selectedChildWidget", page); - topic.publish(this.id+"-selectChild", page); // publish - - if(this.persist){ - cookie(this.id + "_selectedChild", this.selectedChildWidget.id); - } - } - - return d; // If child has an href, promise that fires when the child's href finishes loading - }, - - _transition: function(newWidget, oldWidget /*===== , animate =====*/){ - // summary: - // Hide the old widget and display the new widget. - // Subclasses should override this. - // newWidget: dijit/_WidgetBase - // The newly selected widget. - // oldWidget: dijit/_WidgetBase - // The previously selected widget. - // animate: Boolean - // Used by AccordionContainer to turn on/off slide effect. - // tags: - // protected extension - if(oldWidget){ - this._hideChild(oldWidget); - } - var d = this._showChild(newWidget); - - // Size the new widget, in case this is the first time it's being shown, - // or I have been resized since the last time it was shown. - // Note that page must be visible for resizing to work. - if(newWidget.resize){ - if(this.doLayout){ - newWidget.resize(this._containerContentBox || this._contentBox); - }else{ - // the child should pick it's own size but we still need to call resize() - // (with no arguments) to let the widget lay itself out - newWidget.resize(); - } - } - - return d; // If child has an href, promise that fires when the child's href finishes loading - }, - - _adjacent: function(/*Boolean*/ forward){ - // summary: - // Gets the next/previous child widget in this container from the current selection. - - // TODO: remove for 2.0 if this isn't being used. Otherwise, fix to skip disabled tabs. - - var children = this.getChildren(); - var index = array.indexOf(children, this.selectedChildWidget); - index += forward ? 1 : children.length - 1; - return children[ index % children.length ]; // dijit/_WidgetBase - }, - - forward: function(){ - // summary: - // Advance to next page. - return this.selectChild(this._adjacent(true), true); - }, - - back: function(){ - // summary: - // Go back to previous page. - return this.selectChild(this._adjacent(false), true); - }, - - _onKeyPress: function(e){ - topic.publish(this.id+"-containerKeyPress", { e: e, page: this}); // publish - }, - - layout: function(){ - // Implement _LayoutWidget.layout() virtual method. - var child = this.selectedChildWidget; - if(child && child.resize){ - if(this.doLayout){ - child.resize(this._containerContentBox || this._contentBox); - }else{ - child.resize(); - } - } - }, - - _showChild: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Show the specified child by changing it's CSS, and call _onShow()/onShow() so - // it can do any updates it needs regarding loading href's etc. - // returns: - // Promise that fires when page has finished showing, or true if there's no href - var children = this.getChildren(); - page.isFirstChild = (page == children[0]); - page.isLastChild = (page == children[children.length-1]); - page._set("selected", true); - - domClass.replace(page.domNode, "dijitVisible", "dijitHidden"); - - return (page._onShow && page._onShow()) || true; - }, - - _hideChild: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Hide the specified child by changing it's CSS, and call _onHide() so - // it's notified. - page._set("selected", false); - domClass.replace(page.domNode, "dijitHidden", "dijitVisible"); - - page.onHide && page.onHide(); - }, - - closeChild: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Callback when user clicks the [X] to remove a page. - // If onClose() returns true then remove and destroy the child. - // tags: - // private - var remove = page.onClose(this, page); - if(remove){ - this.removeChild(page); - // makes sure we can clean up executeScripts in ContentPane onUnLoad - page.destroyRecursive(); - } - }, - - destroyDescendants: function(/*Boolean*/ preserveDom){ - this._descendantsBeingDestroyed = true; - this.selectedChildWidget = undefined; - array.forEach(this.getChildren(), function(child){ - if(!preserveDom){ - this.removeChild(child); - } - child.destroyRecursive(preserveDom); - }, this); - this._descendantsBeingDestroyed = false; - } -}); - -StackContainer.ChildWidgetProperties = { - // summary: - // These properties can be specified for the children of a StackContainer. - - // selected: Boolean - // Specifies that this widget should be the initially displayed pane. - // Note: to change the selected child use `dijit/layout/StackContainer.selectChild` - selected: false, - - // disabled: Boolean - // Specifies that the button to select this pane should be disabled. - // Doesn't affect programmatic selection of the pane, nor does it deselect the pane if it is currently selected. - disabled: false, - - // closable: Boolean - // True if user can close (destroy) this child, such as (for example) clicking the X on the tab. - closable: false, - - // iconClass: String - // CSS Class specifying icon to use in label associated with this pane. - iconClass: "dijitNoIcon", - - // showTitle: Boolean - // When true, display title of this widget as tab label etc., rather than just using - // icon specified in iconClass - showTitle: true -}; - -// Since any widget can be specified as a StackContainer child, mix them -// into the base widget class. (This is a hack, but it's effective.) -// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer. -lang.extend(_WidgetBase, /*===== {} || =====*/ StackContainer.ChildWidgetProperties); - -return StackContainer; -}); diff --git a/lib/dijit/layout/StackController.js.uncompressed.js b/lib/dijit/layout/StackController.js.uncompressed.js deleted file mode 100644 index 47e09ed46..000000000 --- a/lib/dijit/layout/StackController.js.uncompressed.js +++ /dev/null @@ -1,390 +0,0 @@ -define("dijit/layout/StackController", [ - "dojo/_base/array", // array.forEach array.indexOf array.map - "dojo/_base/declare", // declare - "dojo/dom-class", - "dojo/_base/event", // event.stop - "dojo/keys", // keys - "dojo/_base/lang", // lang.getObject - "dojo/on", - "../focus", // focus.focus() - "../registry", // registry.byId - "../_Widget", - "../_TemplatedMixin", - "../_Container", - "../form/ToggleButton", - "dojo/i18n!../nls/common" -], function(array, declare, domClass, event, keys, lang, on, - focus, registry, _Widget, _TemplatedMixin, _Container, ToggleButton){ - - // module: - // dijit/layout/StackController - - var StackButton = declare("dijit.layout._StackButton", ToggleButton, { - // summary: - // Internal widget used by StackContainer. - // description: - // The button-like or tab-like object you click to select or delete a page - // tags: - // private - - // Override _FormWidget.tabIndex. - // StackContainer buttons are not in the tab order by default. - // Probably we should be calling this.startupKeyNavChildren() instead. - tabIndex: "-1", - - // closeButton: Boolean - // When true, display close button for this tab - closeButton: false, - - _aria_attr: "aria-selected", - - buildRendering: function(/*Event*/ evt){ - this.inherited(arguments); - (this.focusNode || this.domNode).setAttribute("role", "tab"); - } - }); - - - var StackController = declare("dijit.layout.StackController", [_Widget, _TemplatedMixin, _Container], { - // summary: - // Set of buttons to select a page in a `dijit/layout/StackContainer` - // description: - // Monitors the specified StackContainer, and whenever a page is - // added, deleted, or selected, updates itself accordingly. - - baseClass: "dijitStackController", - - templateString: "<span role='tablist' data-dojo-attach-event='onkeypress'></span>", - - // containerId: [const] String - // The id of the page container that I point to - containerId: "", - - // buttonWidget: [const] Constructor - // The button widget to create to correspond to each page - buttonWidget: StackButton, - - // buttonWidgetCloseClass: String - // CSS class of [x] close icon, used by event delegation code to tell when close button was clicked - buttonWidgetCloseClass: "dijitStackCloseButton", - - constructor: function(params /*===== , srcNodeRef =====*/){ - // summary: - // Create the widget. - // params: Object|null - // Hash of initialization parameters for widget, including scalar values (like title, duration etc.) - // and functions, typically callbacks like onClick. - // The hash can contain any of the widget's properties, excluding read-only properties. - // srcNodeRef: DOMNode|String? - // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree - - this.pane2button = {}; // mapping from pane id to buttons - }, - - postCreate: function(){ - this.inherited(arguments); - - // Listen to notifications from StackContainer. - // TODO: do this through bubbled events instead of topics - this.subscribe(this.containerId+"-startup", "onStartup"); - this.subscribe(this.containerId+"-addChild", "onAddChild"); - this.subscribe(this.containerId+"-removeChild", "onRemoveChild"); - this.subscribe(this.containerId+"-selectChild", "onSelectChild"); - this.subscribe(this.containerId+"-containerKeyPress", "onContainerKeyPress"); - - // Listen for click events to select or close tabs. - // No need to worry about ENTER/SPACE key handling: tabs are selected via left/right arrow keys, - // and closed via shift-F10 (to show the close menu). - this.connect(this.containerNode, 'click', function(evt){ - var button = registry.getEnclosingWidget(evt.target); - if(button != this.containerNode && !button.disabled && button.page){ - for(var target = evt.target; target !== this.containerNode; target = target.parentNode){ - if(domClass.contains(target, this.buttonWidgetCloseClass)){ - this.onCloseButtonClick(button.page); - break; - }else if(target == button.domNode){ - this.onButtonClick(button.page); - break; - } - } - } - }); - }, - - onStartup: function(/*Object*/ info){ - // summary: - // Called after StackContainer has finished initializing - // tags: - // private - array.forEach(info.children, this.onAddChild, this); - if(info.selected){ - // Show button corresponding to selected pane (unless selected - // is null because there are no panes) - this.onSelectChild(info.selected); - } - - // Reflect events like page title changes to tab buttons - var containerNode = registry.byId(this.containerId).containerNode, - pane2button = this.pane2button, - paneToButtonAttr = { - "title": "label", - "showtitle": "showLabel", - "iconclass": "iconClass", - "closable": "closeButton", - "tooltip": "title", - "disabled": "disabled" - }, - connectFunc = function(attr, buttonAttr){ - return on(containerNode, "attrmodified-" + attr, function(evt){ - var button = pane2button[evt.detail && evt.detail.widget && evt.detail.widget.id]; - if(button){ - button.set(buttonAttr, evt.detail.newValue); - } - }); - }; - for(var attr in paneToButtonAttr){ - this.own(connectFunc(attr, paneToButtonAttr[attr])); - } - }, - - destroy: function(){ - // Since the buttons are internal to the StackController widget, destroy() should remove them, which is - // done by calling onRemoveChild(). - for(var pane in this.pane2button){ - this.onRemoveChild(registry.byId(pane)); - } - - // TODO: destroyRecursive() will call destroy() on each child button twice. Once from the above code, - // and once because _WidgetBase.destroyDescendants() deletes anything inside of this.containerNode. - // Probably shouldn't attach that DOMNode as this.containerNode. - - this.inherited(arguments); - }, - - onAddChild: function(/*dijit/_WidgetBase*/ page, /*Integer?*/ insertIndex){ - // summary: - // Called whenever a page is added to the container. - // Create button corresponding to the page. - // tags: - // private - - // create an instance of the button widget - // (remove typeof buttonWidget == string support in 2.0) - var Cls = lang.isString(this.buttonWidget) ? lang.getObject(this.buttonWidget) : this.buttonWidget; - var button = new Cls({ - id: this.id + "_" + page.id, - name: this.id + "_" + page.id, - label: page.title, - disabled: page.disabled, - ownerDocument: this.ownerDocument, - dir: page.dir, - lang: page.lang, - textDir: page.textDir, - showLabel: page.showTitle, - iconClass: page.iconClass, - closeButton: page.closable, - title: page.tooltip, - page: page - }); - - this.addChild(button, insertIndex); - this.pane2button[page.id] = button; - page.controlButton = button; // this value might be overwritten if two tabs point to same container - if(!this._currentChild){ - // If this is the first child then StackContainer will soon publish that it's selected, - // but before that StackContainer calls layout(), and before layout() is called the - // StackController needs to have the proper height... which means that the button needs - // to be marked as selected now. See test_TabContainer_CSS.html for test. - this.onSelectChild(page); - } - }, - - onRemoveChild: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Called whenever a page is removed from the container. - // Remove the button corresponding to the page. - // tags: - // private - - if(this._currentChild === page){ this._currentChild = null; } - - var button = this.pane2button[page.id]; - if(button){ - this.removeChild(button); - delete this.pane2button[page.id]; - button.destroy(); - } - delete page.controlButton; - }, - - onSelectChild: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Called when a page has been selected in the StackContainer, either by me or by another StackController - // tags: - // private - - if(!page){ return; } - - if(this._currentChild){ - var oldButton=this.pane2button[this._currentChild.id]; - oldButton.set('checked', false); - oldButton.focusNode.setAttribute("tabIndex", "-1"); - } - - var newButton=this.pane2button[page.id]; - newButton.set('checked', true); - this._currentChild = page; - newButton.focusNode.setAttribute("tabIndex", "0"); - var container = registry.byId(this.containerId); - container.containerNode.setAttribute("aria-labelledby", newButton.id); - }, - - onButtonClick: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Called whenever one of my child buttons is pressed in an attempt to select a page - // tags: - // private - - var button = this.pane2button[page.id]; - - // For TabContainer where the tabs are <span>, need to set focus explicitly when left/right arrow - focus.focus(button.focusNode); - - if(this._currentChild && this._currentChild.id === page.id) { - //In case the user clicked the checked button, keep it in the checked state because it remains to be the selected stack page. - button.set('checked', true); - } - var container = registry.byId(this.containerId); - container.selectChild(page); - }, - - onCloseButtonClick: function(/*dijit/_WidgetBase*/ page){ - // summary: - // Called whenever one of my child buttons [X] is pressed in an attempt to close a page - // tags: - // private - - var container = registry.byId(this.containerId); - container.closeChild(page); - if(this._currentChild){ - var b = this.pane2button[this._currentChild.id]; - if(b){ - focus.focus(b.focusNode || b.domNode); - } - } - }, - - // TODO: this is a bit redundant with forward, back api in StackContainer - adjacent: function(/*Boolean*/ forward){ - // summary: - // Helper for onkeypress to find next/previous button - // tags: - // private - - if(!this.isLeftToRight() && (!this.tabPosition || /top|bottom/.test(this.tabPosition))){ forward = !forward; } - // find currently focused button in children array - var children = this.getChildren(); - var idx = array.indexOf(children, this.pane2button[this._currentChild.id]), - current = children[idx]; - - // Pick next/previous non-disabled button to focus on. If we get back to the original button it means - // that all buttons must be disabled, so return current child to avoid an infinite loop. - var child; - do{ - idx = (idx + (forward ? 1 : children.length - 1)) % children.length; - child = children[idx]; - }while(child.disabled && child != current); - - return child; // dijit/_WidgetBase - }, - - onkeypress: function(/*Event*/ e){ - // summary: - // Handle keystrokes on the page list, for advancing to next/previous button - // and closing the current page if the page is closable. - // tags: - // private - - if(this.disabled || e.altKey ){ return; } - var forward = null; - if(e.ctrlKey || !e._djpage){ - switch(e.charOrCode){ - case keys.LEFT_ARROW: - case keys.UP_ARROW: - if(!e._djpage){ forward = false; } - break; - case keys.PAGE_UP: - if(e.ctrlKey){ forward = false; } - break; - case keys.RIGHT_ARROW: - case keys.DOWN_ARROW: - if(!e._djpage){ forward = true; } - break; - case keys.PAGE_DOWN: - if(e.ctrlKey){ forward = true; } - break; - case keys.HOME: - // Navigate to first non-disabled child - var children = this.getChildren(); - for(var idx = 0; idx < children.length; idx++){ - var child = children[idx]; - if(!child.disabled){ - this.onButtonClick(child.page); - break; - } - } - event.stop(e); - break; - case keys.END: - // Navigate to last non-disabled child - var children = this.getChildren(); - for(var idx = children.length-1; idx >= 0; idx--){ - var child = children[idx]; - if(!child.disabled){ - this.onButtonClick(child.page); - break; - } - } - event.stop(e); - break; - case keys.DELETE: - if(this._currentChild.closable){ - this.onCloseButtonClick(this._currentChild); - } - event.stop(e); - break; - default: - if(e.ctrlKey){ - if(e.charOrCode === keys.TAB){ - this.onButtonClick(this.adjacent(!e.shiftKey).page); - event.stop(e); - }else if(e.charOrCode == "w"){ - if(this._currentChild.closable){ - this.onCloseButtonClick(this._currentChild); - } - event.stop(e); // avoid browser tab closing. - } - } - } - // handle next/previous page navigation (left/right arrow, etc.) - if(forward !== null){ - this.onButtonClick(this.adjacent(forward).page); - event.stop(e); - } - } - }, - - onContainerKeyPress: function(/*Object*/ info){ - // summary: - // Called when there was a keypress on the container - // tags: - // private - info.e._djpage = info.page; - this.onkeypress(info.e); - } - }); - - StackController.StackButton = StackButton; // for monkey patching - - return StackController; -}); diff --git a/lib/dijit/layout/TabContainer.js.uncompressed.js b/lib/dijit/layout/TabContainer.js.uncompressed.js deleted file mode 100644 index 929f9e21d..000000000 --- a/lib/dijit/layout/TabContainer.js.uncompressed.js +++ /dev/null @@ -1,77 +0,0 @@ -define("dijit/layout/TabContainer", [ - "dojo/_base/lang", // lang.getObject - "dojo/_base/declare", // declare - "./_TabContainerBase", - "./TabController", - "./ScrollingTabController" -], function(lang, declare, _TabContainerBase, TabController, ScrollingTabController){ - - // module: - // dijit/layout/TabContainer - - - return declare("dijit.layout.TabContainer", _TabContainerBase, { - // summary: - // A Container with tabs to select each child (only one of which is displayed at a time). - // description: - // A TabContainer is a container that has multiple panes, but shows only - // one pane at a time. There are a set of tabs corresponding to each pane, - // where each tab has the name (aka title) of the pane, and optionally a close button. - // - // See `StackContainer.ChildWidgetProperties` for details on the properties that can be set on - // children of a `TabContainer`. - - // useMenu: [const] Boolean - // True if a menu should be used to select tabs when they are too - // wide to fit the TabContainer, false otherwise. - useMenu: true, - - // useSlider: [const] Boolean - // True if a slider should be used to select tabs when they are too - // wide to fit the TabContainer, false otherwise. - useSlider: true, - - // controllerWidget: Class - // An optional parameter to override the widget used to display the tab labels - controllerWidget: "", - - _makeController: function(/*DomNode*/ srcNode){ - // summary: - // Instantiate tablist controller widget and return reference to it. - // Callback from _TabContainerBase.postCreate(). - // tags: - // protected extension - - // "string" branch for back-compat, remove for 2.0 - var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"), - TabController = typeof this.controllerWidget == "string" ? lang.getObject(this.controllerWidget) : - this.controllerWidget; - - return new TabController({ - id: this.id + "_tablist", - ownerDocument: this.ownerDocument, - dir: this.dir, - lang: this.lang, - textDir: this.textDir, - tabPosition: this.tabPosition, - doLayout: this.doLayout, - containerId: this.id, - "class": cls, - nested: this.nested, - useMenu: this.useMenu, - useSlider: this.useSlider, - tabStripClass: this.tabStrip ? this.baseClass + (this.tabStrip ? "":"No") + "Strip": null - }, srcNode); - }, - - postMixInProperties: function(){ - this.inherited(arguments); - - // Scrolling controller only works for horizontal non-nested tabs - if(!this.controllerWidget){ - this.controllerWidget = (this.tabPosition == "top" || this.tabPosition == "bottom") && !this.nested ? - ScrollingTabController : TabController; - } - } - }); -}); diff --git a/lib/dijit/layout/TabController.js.uncompressed.js b/lib/dijit/layout/TabController.js.uncompressed.js deleted file mode 100644 index fd061540e..000000000 --- a/lib/dijit/layout/TabController.js.uncompressed.js +++ /dev/null @@ -1,171 +0,0 @@ -require({cache:{ -'url:dijit/layout/templates/_TabButton.html':"<div role=\"presentation\" data-dojo-attach-point=\"titleNode,innerDiv,tabContent\" class=\"dijitTabInner dijitTabContent\">\n\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode'/>\n\t<span data-dojo-attach-point='containerNode,focusNode' class='tabLabel'></span>\n\t<span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t role=\"presentation\">\n\t\t<span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t\t\t></span>\n</div>\n"}}); -define("dijit/layout/TabController", [ - "dojo/_base/declare", // declare - "dojo/dom", // dom.setSelectable - "dojo/dom-attr", // domAttr.attr - "dojo/dom-class", // domClass.toggle - "dojo/i18n", // i18n.getLocalization - "dojo/_base/lang", // lang.hitch lang.trim - "./StackController", - "../registry", - "../Menu", - "../MenuItem", - "dojo/text!./templates/_TabButton.html", - "dojo/i18n!../nls/common" -], function(declare, dom, domAttr, domClass, i18n, lang, StackController, registry, Menu, MenuItem, template){ - - // module: - // dijit/layout/TabController - - var TabButton = declare("dijit.layout._TabButton", StackController.StackButton, { - // summary: - // A tab (the thing you click to select a pane). - // description: - // Contains the title of the pane, and optionally a close-button to destroy the pane. - // This is an internal widget and should not be instantiated directly. - // tags: - // private - - // baseClass: String - // The CSS class applied to the domNode. - baseClass: "dijitTab", - - // Apply dijitTabCloseButtonHover when close button is hovered - cssStateNodes: { - closeNode: "dijitTabCloseButton" - }, - - templateString: template, - - // Override _FormWidget.scrollOnFocus. - // Don't scroll the whole tab container into view when the button is focused. - scrollOnFocus: false, - - buildRendering: function(){ - this.inherited(arguments); - - dom.setSelectable(this.containerNode, false); - }, - - startup: function(){ - this.inherited(arguments); - var n = this.domNode; - - // Required to give IE6 a kick, as it initially hides the - // tabs until they are focused on. - this.defer(function(){ - n.className = n.className; - }, 1); - }, - - _setCloseButtonAttr: function(/*Boolean*/ disp){ - // summary: - // Hide/show close button - this._set("closeButton", disp); - domClass.toggle(this.domNode, "dijitClosable", disp); - this.closeNode.style.display = disp ? "" : "none"; - if(disp){ - var _nlsResources = i18n.getLocalization("dijit", "common"); - if(this.closeNode){ - domAttr.set(this.closeNode, "title", _nlsResources.itemClose); - } - } - }, - - _setDisabledAttr: function(/*Boolean*/ disabled){ - // summary: - // Make tab selected/unselectable - - this.inherited(arguments); - - // Don't show tooltip for close button when tab is disabled - if(this.closeNode){ - if(disabled){ - domAttr.remove(this.closeNode, "title"); - }else{ - var _nlsResources = i18n.getLocalization("dijit", "common"); - domAttr.set(this.closeNode, "title", _nlsResources.itemClose); - } - } - }, - - _setLabelAttr: function(/*String*/ content){ - // summary: - // Hook for set('label', ...) to work. - // description: - // takes an HTML string. - // Inherited ToggleButton implementation will Set the label (text) of the button; - // Need to set the alt attribute of icon on tab buttons if no label displayed - this.inherited(arguments); - if(!this.showLabel && !this.params.title){ - this.iconNode.alt = lang.trim(this.containerNode.innerText || this.containerNode.textContent || ''); - } - } - }); - - var TabController = declare("dijit.layout.TabController", StackController, { - // summary: - // Set of tabs (the things with titles and a close button, that you click to show a tab panel). - // Used internally by `dijit/layout/TabContainer`. - // description: - // Lets the user select the currently shown pane in a TabContainer or StackContainer. - // TabController also monitors the TabContainer, and whenever a pane is - // added or deleted updates itself accordingly. - // tags: - // private - - baseClass: "dijitTabController", - - templateString: "<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'></div>", - - // tabPosition: String - // Defines where tabs go relative to the content. - // "top", "bottom", "left-h", "right-h" - tabPosition: "top", - - // buttonWidget: Constructor - // The tab widget to create to correspond to each page - buttonWidget: TabButton, - - // buttonWidgetCloseClass: String - // Class of [x] close icon, used by event delegation code to tell when close button was clicked - buttonWidgetCloseClass: "dijitTabCloseButton", - - postCreate: function(){ - this.inherited(arguments); - - // Setup a close menu to be shared between all the closable tabs (excluding disabled tabs) - var closeMenu = new Menu({ - id: this.id+"_Menu", - ownerDocument: this.ownerDocument, - dir: this.dir, - lang: this.lang, - textDir: this.textDir, - targetNodeIds: [this.domNode], - selector: function(node){ - return domClass.contains(node, "dijitClosable") && !domClass.contains(node, "dijitTabDisabled"); - } - }); - this.own(closeMenu); - - var _nlsResources = i18n.getLocalization("dijit", "common"), - controller = this; - closeMenu.addChild(new MenuItem({ - label: _nlsResources.itemClose, - ownerDocument: this.ownerDocument, - dir: this.dir, - lang: this.lang, - textDir: this.textDir, - onClick: function(evt){ - var button = registry.byNode(this.getParent().currentTarget); - controller.onCloseButtonClick(button.page); - } - })); - } - }); - - TabController.TabButton = TabButton; // for monkey patching - - return TabController; -}); diff --git a/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js b/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js deleted file mode 100644 index bb48aa562..000000000 --- a/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js +++ /dev/null @@ -1,234 +0,0 @@ -define("dijit/layout/_ContentPaneResizeMixin", [ - "dojo/_base/array", // array.filter array.forEach - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.contains domClass.toggle - "dojo/dom-geometry",// domGeometry.contentBox domGeometry.marginBox - "dojo/dom-style", - "dojo/_base/lang", // lang.mixin - "dojo/query", // query - "dojo/sniff", // has("ie") - "../registry", // registry.byId - "../Viewport", - "./utils" // marginBox2contextBox -], function(array, declare, domClass, domGeometry, domStyle, lang, query, has, - registry, Viewport, layoutUtils){ - -// module: -// dijit/layout/_ContentPaneResizeMixin - - -return declare("dijit.layout._ContentPaneResizeMixin", null, { - // summary: - // Resize() functionality of ContentPane. If there's a single layout widget - // child then it will call resize() with the same dimensions as the ContentPane. - // Otherwise just calls resize on each child. - // - // Also implements basic startup() functionality, where starting the parent - // will start the children - - // doLayout: Boolean - // - false - don't adjust size of children - // - true - if there is a single visible child widget, set it's size to however big the ContentPane is - doLayout: true, - - // isLayoutContainer: [protected] Boolean - // Indicates that this widget will call resize() on it's child widgets - // when they become visible. - isLayoutContainer: true, - - startup: function(){ - // summary: - // See `dijit/layout/_LayoutWidget.startup()` for description. - // Although ContentPane doesn't extend _LayoutWidget, it does implement - // the same API. - - if(this._started){ return; } - - var parent = this.getParent(); - this._childOfLayoutWidget = parent && parent.isLayoutContainer; - - // I need to call resize() on my child/children (when I become visible), unless - // I'm the child of a layout widget in which case my parent will call resize() on me and I'll do it then. - this._needLayout = !this._childOfLayoutWidget; - - this.inherited(arguments); - - if(this._isShown()){ - this._onShow(); - } - - if(!this._childOfLayoutWidget){ - // Since my parent isn't a layout container, and my style *may be* width=height=100% - // or something similar (either set directly or via a CSS class), - // monitor when viewport size changes so that I can re-layout. - // This is more for subclasses of ContentPane than ContentPane itself, although it - // could be useful for a ContentPane if it has a single child widget inheriting ContentPane's size. - this.own(Viewport.on("resize", lang.hitch(this, "resize"))); - } - }, - - _checkIfSingleChild: function(){ - // summary: - // Test if we have exactly one visible widget as a child, - // and if so assume that we are a container for that widget, - // and should propagate startup() and resize() calls to it. - // Skips over things like data stores since they aren't visible. - - var candidateWidgets = [], - otherVisibleNodes = false; - - query("> *", this.containerNode).some(function(node){ - var widget = registry.byNode(node); - if(widget && widget.resize){ - candidateWidgets.push(widget); - }else if(node.offsetHeight){ - otherVisibleNodes = true; - } - }); - - this._singleChild = candidateWidgets.length == 1 && !otherVisibleNodes ? - candidateWidgets[0] : null; - - // So we can set overflow: hidden to avoid a safari bug w/scrollbars showing up (#9449) - domClass.toggle(this.containerNode, this.baseClass + "SingleChild", !!this._singleChild); - }, - - resize: function(changeSize, resultSize){ - // summary: - // See `dijit/layout/_LayoutWidget.resize()` for description. - // Although ContentPane doesn't extend _LayoutWidget, it does implement - // the same API. - - this._resizeCalled = true; - - this._scheduleLayout(changeSize, resultSize); - }, - - _scheduleLayout: function(changeSize, resultSize){ - // summary: - // Resize myself, and call resize() on each of my child layout widgets, either now - // (if I'm currently visible) or when I become visible - if(this._isShown()){ - this._layout(changeSize, resultSize); - }else{ - this._needLayout = true; - this._changeSize = changeSize; - this._resultSize = resultSize; - } - }, - - _layout: function(changeSize, resultSize){ - // summary: - // Resize myself according to optional changeSize/resultSize parameters, like a layout widget. - // Also, since I am an isLayoutContainer widget, each of my children expects me to - // call resize() or layout() on it. - // - // Should be called on initialization and also whenever we get new content - // (from an href, or from set('content', ...))... but deferred until - // the ContentPane is visible - - delete this._needLayout; - - // For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is - // never called directly, so resize() is our trigger to do the initial href download (see [20099]). - // However, don't load href for closed TitlePanes. - if(!this._wasShown && this.open !== false){ - this._onShow(); - } - - // Set margin box size, unless it wasn't specified, in which case use current size. - if(changeSize){ - domGeometry.setMarginBox(this.domNode, changeSize); - } - - // Compute content box size of containerNode in case we [later] need to size our single child. - var cn = this.containerNode; - if(cn === this.domNode){ - // If changeSize or resultSize was passed to this method and this.containerNode == - // this.domNode then we can compute the content-box size without querying the node, - // which is more reliable (similar to LayoutWidget.resize) (see for example #9449). - var mb = resultSize || {}; - lang.mixin(mb, changeSize || {}); // changeSize overrides resultSize - if(!("h" in mb) || !("w" in mb)){ - mb = lang.mixin(domGeometry.getMarginBox(cn), mb); // just use domGeometry.setMarginBox() to fill in missing values - } - this._contentBox = layoutUtils.marginBox2contentBox(cn, mb); - }else{ - this._contentBox = domGeometry.getContentBox(cn); - } - - this._layoutChildren(); - }, - - _layoutChildren: function(){ - // Call _checkIfSingleChild() again in case app has manually mucked w/the content - // of the ContentPane (rather than changing it through the set("content", ...) API. - if(this.doLayout){ - this._checkIfSingleChild(); - } - - if(this._singleChild && this._singleChild.resize){ - var cb = this._contentBox || domGeometry.getContentBox(this.containerNode); - - // note: if widget has padding this._contentBox will have l and t set, - // but don't pass them to resize() or it will doubly-offset the child - this._singleChild.resize({w: cb.w, h: cb.h}); - }else{ - // All my child widgets are independently sized (rather than matching my size), - // but I still need to call resize() on each child to make it layout. - array.forEach(this.getChildren(), function(widget){ - if(widget.resize){ - widget.resize(); - } - }); - } - }, - - _isShown: function(){ - // summary: - // Returns true if the content is currently shown. - // description: - // If I am a child of a layout widget then it actually returns true if I've ever been visible, - // not whether I'm currently visible, since that's much faster than tracing up the DOM/widget - // tree every call, and at least solves the performance problem on page load by deferring loading - // hidden ContentPanes until they are first shown - - if(this._childOfLayoutWidget){ - // If we are TitlePane, etc - we return that only *IF* we've been resized - if(this._resizeCalled && "open" in this){ - return this.open; - } - return this._resizeCalled; - }else if("open" in this){ - return this.open; // for TitlePane, etc. - }else{ - var node = this.domNode, parent = this.domNode.parentNode; - return (node.style.display != 'none') && (node.style.visibility != 'hidden') && !domClass.contains(node, "dijitHidden") && - parent && parent.style && (parent.style.display != 'none'); - } - }, - - _onShow: function(){ - // summary: - // Called when the ContentPane is made visible - // description: - // For a plain ContentPane, this is called on initialization, from startup(). - // If the ContentPane is a hidden pane of a TabContainer etc., then it's - // called whenever the pane is made visible. - // - // Does layout/resize of child widget(s) - - // Need to keep track of whether ContentPane has been shown (which is different than - // whether or not it's currently visible). - this._wasShown = true; - - if(this._needLayout){ - // If a layout has been scheduled for when we become visible, do it now - this._layout(this._changeSize, this._resultSize); - } - - this.inherited(arguments); - } -}); - -}); diff --git a/lib/dijit/layout/_LayoutWidget.js.uncompressed.js b/lib/dijit/layout/_LayoutWidget.js.uncompressed.js deleted file mode 100644 index 855d0d221..000000000 --- a/lib/dijit/layout/_LayoutWidget.js.uncompressed.js +++ /dev/null @@ -1,185 +0,0 @@ -define("dijit/layout/_LayoutWidget", [ - "dojo/_base/lang", // lang.mixin - "../_Widget", - "../_Container", - "../_Contained", - "../Viewport", - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-geometry", // domGeometry.marginBox - "dojo/dom-style" // domStyle.getComputedStyle -], function(lang, _Widget, _Container, _Contained, Viewport, - declare, domClass, domGeometry, domStyle){ - - // module: - // dijit/layout/_LayoutWidget - - - return declare("dijit.layout._LayoutWidget", [_Widget, _Container, _Contained], { - // summary: - // Base class for a _Container widget which is responsible for laying out its children. - // Widgets which mixin this code must define layout() to manage placement and sizing of the children. - - // baseClass: [protected extension] String - // This class name is applied to the widget's domNode - // and also may be used to generate names for sub nodes, - // for example dijitTabContainer-content. - baseClass: "dijitLayoutContainer", - - // isLayoutContainer: [protected] Boolean - // Indicates that this widget is going to call resize() on its - // children widgets, setting their size, when they become visible. - isLayoutContainer: true, - - buildRendering: function(){ - this.inherited(arguments); - domClass.add(this.domNode, "dijitContainer"); - }, - - startup: function(){ - // summary: - // Called after all the widgets have been instantiated and their - // dom nodes have been inserted somewhere under win.doc.body. - // - // Widgets should override this method to do any initialization - // dependent on other widgets existing, and then call - // this superclass method to finish things off. - // - // startup() in subclasses shouldn't do anything - // size related because the size of the widget hasn't been set yet. - - if(this._started){ return; } - - // Need to call inherited first - so that child widgets get started - // up correctly - this.inherited(arguments); - - // If I am a not being controlled by a parent layout widget... - var parent = this.getParent && this.getParent(); - if(!(parent && parent.isLayoutContainer)){ - // Do recursive sizing and layout of all my descendants - // (passing in no argument to resize means that it has to glean the size itself) - this.resize(); - - // Since my parent isn't a layout container, and my style *may be* width=height=100% - // or something similar (either set directly or via a CSS class), - // monitor when viewport size changes so that I can re-layout. - this.own(Viewport.on("resize", lang.hitch(this, "resize"))); - } - }, - - resize: function(changeSize, resultSize){ - // summary: - // Call this to resize a widget, or after its size has changed. - // description: - // ####Change size mode: - // - // When changeSize is specified, changes the marginBox of this widget - // and forces it to re-layout its contents accordingly. - // changeSize may specify height, width, or both. - // - // If resultSize is specified it indicates the size the widget will - // become after changeSize has been applied. - // - // ####Notification mode: - // - // When changeSize is null, indicates that the caller has already changed - // the size of the widget, or perhaps it changed because the browser - // window was resized. Tells widget to re-layout its contents accordingly. - // - // If resultSize is also specified it indicates the size the widget has - // become. - // - // In either mode, this method also: - // - // 1. Sets this._borderBox and this._contentBox to the new size of - // the widget. Queries the current domNode size if necessary. - // 2. Calls layout() to resize contents (and maybe adjust child widgets). - // changeSize: Object? - // Sets the widget to this margin-box size and position. - // May include any/all of the following properties: - // | {w: int, h: int, l: int, t: int} - // resultSize: Object? - // The margin-box size of this widget after applying changeSize (if - // changeSize is specified). If caller knows this size and - // passes it in, we don't need to query the browser to get the size. - // | {w: int, h: int} - - var node = this.domNode; - - // set margin box size, unless it wasn't specified, in which case use current size - if(changeSize){ - domGeometry.setMarginBox(node, changeSize); - } - - // If either height or width wasn't specified by the user, then query node for it. - // But note that setting the margin box and then immediately querying dimensions may return - // inaccurate results, so try not to depend on it. - var mb = resultSize || {}; - lang.mixin(mb, changeSize || {}); // changeSize overrides resultSize - if( !("h" in mb) || !("w" in mb) ){ - mb = lang.mixin(domGeometry.getMarginBox(node), mb); // just use domGeometry.marginBox() to fill in missing values - } - - // Compute and save the size of my border box and content box - // (w/out calling domGeometry.getContentBox() since that may fail if size was recently set) - var cs = domStyle.getComputedStyle(node); - var me = domGeometry.getMarginExtents(node, cs); - var be = domGeometry.getBorderExtents(node, cs); - var bb = (this._borderBox = { - w: mb.w - (me.w + be.w), - h: mb.h - (me.h + be.h) - }); - var pe = domGeometry.getPadExtents(node, cs); - this._contentBox = { - l: domStyle.toPixelValue(node, cs.paddingLeft), - t: domStyle.toPixelValue(node, cs.paddingTop), - w: bb.w - pe.w, - h: bb.h - pe.h - }; - - // Callback for widget to adjust size of its children - this.layout(); - }, - - layout: function(){ - // summary: - // Widgets override this method to size and position their contents/children. - // When this is called this._contentBox is guaranteed to be set (see resize()). - // - // This is called after startup(), and also when the widget's size has been - // changed. - // tags: - // protected extension - }, - - _setupChild: function(/*dijit/_WidgetBase*/child){ - // summary: - // Common setup for initial children and children which are added after startup - // tags: - // protected extension - - var cls = this.baseClass + "-child " - + (child.baseClass ? this.baseClass + "-" + child.baseClass : ""); - domClass.add(child.domNode, cls); - }, - - addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){ - // Overrides _Container.addChild() to call _setupChild() - this.inherited(arguments); - if(this._started){ - this._setupChild(child); - } - }, - - removeChild: function(/*dijit/_WidgetBase*/ child){ - // Overrides _Container.removeChild() to remove class added by _setupChild() - var cls = this.baseClass + "-child" - + (child.baseClass ? - " " + this.baseClass + "-" + child.baseClass : ""); - domClass.remove(child.domNode, cls); - - this.inherited(arguments); - } - }); -}); diff --git a/lib/dijit/layout/_TabContainerBase.js.uncompressed.js b/lib/dijit/layout/_TabContainerBase.js.uncompressed.js deleted file mode 100644 index 6080d32b0..000000000 --- a/lib/dijit/layout/_TabContainerBase.js.uncompressed.js +++ /dev/null @@ -1,146 +0,0 @@ -require({cache:{ -'url:dijit/layout/templates/TabContainer.html':"<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" data-dojo-attach-point=\"tablistNode\"></div>\n\t<div data-dojo-attach-point=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" data-dojo-attach-point=\"containerNode\"></div>\n</div>\n"}}); -define("dijit/layout/_TabContainerBase", [ - "dojo/text!./templates/TabContainer.html", - "./StackContainer", - "./utils", // marginBox2contextBox, layoutChildren - "../_TemplatedMixin", - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add - "dojo/dom-geometry", // domGeometry.contentBox - "dojo/dom-style" // domStyle.style -], function(template, StackContainer, layoutUtils, _TemplatedMixin, declare, domClass, domGeometry, domStyle){ - -// module: -// dijit/layout/_TabContainerBase - - -return declare("dijit.layout._TabContainerBase", [StackContainer, _TemplatedMixin], { - // summary: - // Abstract base class for TabContainer. Must define _makeController() to instantiate - // and return the widget that displays the tab labels - // description: - // A TabContainer is a container that has multiple panes, but shows only - // one pane at a time. There are a set of tabs corresponding to each pane, - // where each tab has the name (aka title) of the pane, and optionally a close button. - - // tabPosition: String - // Defines where tabs go relative to tab content. - // "top", "bottom", "left-h", "right-h" - tabPosition: "top", - - baseClass: "dijitTabContainer", - - // tabStrip: [const] Boolean - // Defines whether the tablist gets an extra class for layouting, putting a border/shading - // around the set of tabs. Not supported by claro theme. - tabStrip: false, - - // nested: [const] Boolean - // If true, use styling for a TabContainer nested inside another TabContainer. - // For tundra etc., makes tabs look like links, and hides the outer - // border since the outer TabContainer already has a border. - nested: false, - - templateString: template, - - postMixInProperties: function(){ - // set class name according to tab position, ex: dijitTabContainerTop - this.baseClass += this.tabPosition.charAt(0).toUpperCase() + this.tabPosition.substr(1).replace(/-.*/, ""); - - this.srcNodeRef && domStyle.set(this.srcNodeRef, "visibility", "hidden"); - - this.inherited(arguments); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // Create the tab list that will have a tab (a.k.a. tab button) for each tab panel - this.tablist = this._makeController(this.tablistNode); - - if(!this.doLayout){ domClass.add(this.domNode, "dijitTabContainerNoLayout"); } - - if(this.nested){ - /* workaround IE's lack of support for "a > b" selectors by - * tagging each node in the template. - */ - domClass.add(this.domNode, "dijitTabContainerNested"); - domClass.add(this.tablist.containerNode, "dijitTabContainerTabListNested"); - domClass.add(this.tablistSpacer, "dijitTabContainerSpacerNested"); - domClass.add(this.containerNode, "dijitTabPaneWrapperNested"); - }else{ - domClass.add(this.domNode, "tabStrip-" + (this.tabStrip ? "enabled" : "disabled")); - } - }, - - _setupChild: function(/*dijit/_WidgetBase*/ tab){ - // Overrides StackContainer._setupChild(). - domClass.add(tab.domNode, "dijitTabPane"); - this.inherited(arguments); - }, - - startup: function(){ - if(this._started){ return; } - - // wire up the tablist and its tabs - this.tablist.startup(); - - this.inherited(arguments); - }, - - layout: function(){ - // Overrides StackContainer.layout(). - // Configure the content pane to take up all the space except for where the tabs are - - if(!this._contentBox || typeof(this._contentBox.l) == "undefined"){return;} - - var sc = this.selectedChildWidget; - - if(this.doLayout){ - // position and size the titles and the container node - var titleAlign = this.tabPosition.replace(/-h/, ""); - this.tablist.layoutAlign = titleAlign; - var children = [this.tablist, { - domNode: this.tablistSpacer, - layoutAlign: titleAlign - }, { - domNode: this.containerNode, - layoutAlign: "client" - }]; - layoutUtils.layoutChildren(this.domNode, this._contentBox, children); - - // Compute size to make each of my children. - // children[2] is the margin-box size of this.containerNode, set by layoutChildren() call above - this._containerContentBox = layoutUtils.marginBox2contentBox(this.containerNode, children[2]); - - if(sc && sc.resize){ - sc.resize(this._containerContentBox); - } - }else{ - // just layout the tab controller, so it can position left/right buttons etc. - if(this.tablist.resize){ - //make the tabs zero width so that they don't interfere with width calc, then reset - var s = this.tablist.domNode.style; - s.width="0"; - var width = domGeometry.getContentBox(this.domNode).w; - s.width=""; - this.tablist.resize({w: width}); - } - - // and call resize() on the selected pane just to tell it that it's been made visible - if(sc && sc.resize){ - sc.resize(); - } - } - }, - - destroy: function(){ - if(this.tablist){ - this.tablist.destroy(); - } - this.inherited(arguments); - } -}); - -}); diff --git a/lib/dijit/layout/utils.js.uncompressed.js b/lib/dijit/layout/utils.js.uncompressed.js deleted file mode 100644 index 9c1786b0c..000000000 --- a/lib/dijit/layout/utils.js.uncompressed.js +++ /dev/null @@ -1,145 +0,0 @@ -define("dijit/layout/utils", [ - "dojo/_base/array", // array.filter array.forEach - "dojo/dom-class", // domClass.add domClass.remove - "dojo/dom-geometry", // domGeometry.marginBox - "dojo/dom-style", // domStyle.getComputedStyle - "dojo/_base/lang", // lang.mixin - "../main" // for exporting symbols to dijit, remove in 2.0 -], function(array, domClass, domGeometry, domStyle, lang, dijit){ - - // module: - // dijit/layout/utils - - var layout = lang.getObject("layout", true, dijit); - /*===== - layout = { - // summary: - // marginBox2contentBox() and layoutChildren() - }; - =====*/ - - layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){ - // summary: - // Given the margin-box size of a node, return its content box size. - // Functions like domGeometry.contentBox() but is more reliable since it doesn't have - // to wait for the browser to compute sizes. - var cs = domStyle.getComputedStyle(node); - var me = domGeometry.getMarginExtents(node, cs); - var pb = domGeometry.getPadBorderExtents(node, cs); - return { - l: domStyle.toPixelValue(node, cs.paddingLeft), - t: domStyle.toPixelValue(node, cs.paddingTop), - w: mb.w - (me.w + pb.w), - h: mb.h - (me.h + pb.h) - }; - }; - - function capitalize(word){ - return word.substring(0,1).toUpperCase() + word.substring(1); - } - - function size(widget, dim){ - // size the child - var newSize = widget.resize ? widget.resize(dim) : domGeometry.setMarginBox(widget.domNode, dim); - - // record child's size - if(newSize){ - // if the child returned it's new size then use that - lang.mixin(widget, newSize); - }else{ - // otherwise, call getMarginBox(), but favor our own numbers when we have them. - // the browser lies sometimes - lang.mixin(widget, domGeometry.getMarginBox(widget.domNode)); - lang.mixin(widget, dim); - } - } - - layout.layoutChildren = function(/*DomNode*/ container, /*Object*/ dim, /*Widget[]*/ children, - /*String?*/ changedRegionId, /*Number?*/ changedRegionSize){ - // summary: - // Layout a bunch of child dom nodes within a parent dom node - // container: - // parent node - // dim: - // {l, t, w, h} object specifying dimensions of container into which to place children - // children: - // An array of Widgets or at least objects containing: - // - // - domNode: pointer to DOM node to position - // - region or layoutAlign: position to place DOM node - // - resize(): (optional) method to set size of node - // - id: (optional) Id of widgets, referenced from resize object, below. - // changedRegionId: - // If specified, the slider for the region with the specified id has been dragged, and thus - // the region's height or width should be adjusted according to changedRegionSize - // changedRegionSize: - // See changedRegionId. - - // copy dim because we are going to modify it - dim = lang.mixin({}, dim); - - domClass.add(container, "dijitLayoutContainer"); - - // Move "client" elements to the end of the array for layout. a11y dictates that the author - // needs to be able to put them in the document in tab-order, but this algorithm requires that - // client be last. TODO: move these lines to LayoutContainer? Unneeded other places I think. - children = array.filter(children, function(item){ return item.region != "center" && item.layoutAlign != "client"; }) - .concat(array.filter(children, function(item){ return item.region == "center" || item.layoutAlign == "client"; })); - - // set positions/sizes - array.forEach(children, function(child){ - var elm = child.domNode, - pos = (child.region || child.layoutAlign); - if(!pos){ - throw new Error("No region setting for " + child.id) - } - - // set elem to upper left corner of unused space; may move it later - var elmStyle = elm.style; - elmStyle.left = dim.l+"px"; - elmStyle.top = dim.t+"px"; - elmStyle.position = "absolute"; - - domClass.add(elm, "dijitAlign" + capitalize(pos)); - - // Size adjustments to make to this child widget - var sizeSetting = {}; - - // Check for optional size adjustment due to splitter drag (height adjustment for top/bottom align - // panes and width adjustment for left/right align panes. - if(changedRegionId && changedRegionId == child.id){ - sizeSetting[child.region == "top" || child.region == "bottom" ? "h" : "w"] = changedRegionSize; - } - - // set size && adjust record of remaining space. - // note that setting the width of a <div> may affect its height. - if(pos == "top" || pos == "bottom"){ - sizeSetting.w = dim.w; - size(child, sizeSetting); - dim.h -= child.h; - if(pos == "top"){ - dim.t += child.h; - }else{ - elmStyle.top = dim.t + dim.h + "px"; - } - }else if(pos == "left" || pos == "right"){ - sizeSetting.h = dim.h; - size(child, sizeSetting); - dim.w -= child.w; - if(pos == "left"){ - dim.l += child.w; - }else{ - elmStyle.left = dim.l + dim.w + "px"; - } - }else if(pos == "client" || pos == "center"){ - size(child, dim); - } - }); - }; - - - return { - marginBox2contentBox: layout.marginBox2contentBox, - layoutChildren: layout.layoutChildren - }; -}); diff --git a/lib/dijit/main.js.uncompressed.js b/lib/dijit/main.js.uncompressed.js deleted file mode 100644 index d64763516..000000000 --- a/lib/dijit/main.js.uncompressed.js +++ /dev/null @@ -1,16 +0,0 @@ -define("dijit/main", [ - "dojo/_base/kernel" -], function(dojo){ - // module: - // dijit/main - -/*===== -return { - // summary: - // The dijit package main module. - // Deprecated. Users should access individual modules (ex: dijit/registry) directly. -}; -=====*/ - - return dojo.dijit; -}); diff --git a/lib/dijit/nls/ar/common.js.uncompressed.js b/lib/dijit/nls/ar/common.js.uncompressed.js deleted file mode 100644 index d5cb387fb..000000000 --- a/lib/dijit/nls/ar/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/ar/common", ({ - buttonOk: "حسنا", - buttonCancel: "الغاء", - buttonSave: "حفظ", - itemClose: "اغلاق" -}) -); diff --git a/lib/dijit/nls/ar/loading.js.uncompressed.js b/lib/dijit/nls/ar/loading.js.uncompressed.js deleted file mode 100644 index 2c639825b..000000000 --- a/lib/dijit/nls/ar/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/ar/loading", ({ - loadingState: "جاري التحميل...", - errorState: "عفوا، حدث خطأ" -}) -); diff --git a/lib/dijit/nls/az/common.js.uncompressed.js b/lib/dijit/nls/az/common.js.uncompressed.js deleted file mode 100644 index ca676914f..000000000 --- a/lib/dijit/nls/az/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/az/common", ({ - "buttonOk" : "Ok", - "buttonCancel" : "Ləğv et", - "buttonSave" : "Saxla", - "itemClose" : "Bağla" -}) -); diff --git a/lib/dijit/nls/az/loading.js.uncompressed.js b/lib/dijit/nls/az/loading.js.uncompressed.js deleted file mode 100644 index 31c98056a..000000000 --- a/lib/dijit/nls/az/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/az/loading", ({ - "loadingState" : "Yüklənir...", - "errorState" : "Problem yarandı" -}) -); diff --git a/lib/dijit/nls/ca/common.js.uncompressed.js b/lib/dijit/nls/ca/common.js.uncompressed.js deleted file mode 100644 index 1cc649b9a..000000000 --- a/lib/dijit/nls/ca/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/ca/common", ({ - buttonOk: "D'acord", - buttonCancel: "Cancel·la", - buttonSave: "Desa", - itemClose: "Tanca" -}) -); diff --git a/lib/dijit/nls/ca/loading.js.uncompressed.js b/lib/dijit/nls/ca/loading.js.uncompressed.js deleted file mode 100644 index 8beed26da..000000000 --- a/lib/dijit/nls/ca/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/ca/loading", ({ - loadingState: "S'està carregant...", - errorState: "Ens sap greu. S'ha produït un error." -}) -); diff --git a/lib/dijit/nls/common.js.uncompressed.js b/lib/dijit/nls/common.js.uncompressed.js deleted file mode 100644 index f638be148..000000000 --- a/lib/dijit/nls/common.js.uncompressed.js +++ /dev/null @@ -1,42 +0,0 @@ -define("dijit/nls/common", { root: -//begin v1.x content -({ - buttonOk: "OK", - buttonCancel: "Cancel", - buttonSave: "Save", - itemClose: "Close" -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/nls/cs/common.js.uncompressed.js b/lib/dijit/nls/cs/common.js.uncompressed.js deleted file mode 100644 index 14f49d6bd..000000000 --- a/lib/dijit/nls/cs/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/cs/common", ({ - buttonOk: "OK", - buttonCancel: "Storno", - buttonSave: "Uložit", - itemClose: "Zavřít" -}) -); diff --git a/lib/dijit/nls/cs/loading.js.uncompressed.js b/lib/dijit/nls/cs/loading.js.uncompressed.js deleted file mode 100644 index 2427fb005..000000000 --- a/lib/dijit/nls/cs/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/cs/loading", ({ - loadingState: "Probíhá načítání...", - errorState: "Omlouváme se, došlo k chybě" -}) -); diff --git a/lib/dijit/nls/da/common.js.uncompressed.js b/lib/dijit/nls/da/common.js.uncompressed.js deleted file mode 100644 index 77ee211ef..000000000 --- a/lib/dijit/nls/da/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/da/common", ({ - buttonOk: "OK", - buttonCancel: "Annullér", - buttonSave: "Gem", - itemClose: "Luk" -}) -); diff --git a/lib/dijit/nls/da/loading.js.uncompressed.js b/lib/dijit/nls/da/loading.js.uncompressed.js deleted file mode 100644 index e0424ee64..000000000 --- a/lib/dijit/nls/da/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/da/loading", ({ - loadingState: "Indlæser...", - errorState: "Der er opstået en fejl" -}) -); diff --git a/lib/dijit/nls/de/common.js.uncompressed.js b/lib/dijit/nls/de/common.js.uncompressed.js deleted file mode 100644 index 9be3f0f9f..000000000 --- a/lib/dijit/nls/de/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/de/common", ({ - buttonOk: "OK", - buttonCancel: "Abbrechen", - buttonSave: "Speichern", - itemClose: "Schließen" -}) -); diff --git a/lib/dijit/nls/de/loading.js.uncompressed.js b/lib/dijit/nls/de/loading.js.uncompressed.js deleted file mode 100644 index 0655f3f57..000000000 --- a/lib/dijit/nls/de/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/de/loading", ({ - loadingState: "Wird geladen...", - errorState: "Es ist ein Fehler aufgetreten." -}) -); diff --git a/lib/dijit/nls/el/common.js.uncompressed.js b/lib/dijit/nls/el/common.js.uncompressed.js deleted file mode 100644 index efcb6175c..000000000 --- a/lib/dijit/nls/el/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/el/common", ({ - buttonOk: "ΟΚ", - buttonCancel: "Ακύρωση", - buttonSave: "Αποθήκευση", - itemClose: "Κλείσιμο" -}) -); diff --git a/lib/dijit/nls/el/loading.js.uncompressed.js b/lib/dijit/nls/el/loading.js.uncompressed.js deleted file mode 100644 index f19d8c644..000000000 --- a/lib/dijit/nls/el/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/el/loading", ({ - loadingState: "Φόρτωση...", - errorState: "Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα" -}) -); diff --git a/lib/dijit/nls/es/common.js.uncompressed.js b/lib/dijit/nls/es/common.js.uncompressed.js deleted file mode 100644 index 5b6be8098..000000000 --- a/lib/dijit/nls/es/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/es/common", ({ - buttonOk: "Aceptar", - buttonCancel: "Cancelar", - buttonSave: "Guardar", - itemClose: "Cerrar" -}) -); diff --git a/lib/dijit/nls/es/loading.js.uncompressed.js b/lib/dijit/nls/es/loading.js.uncompressed.js deleted file mode 100644 index 2e0c84abb..000000000 --- a/lib/dijit/nls/es/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/es/loading", ({ - loadingState: "Cargando...", - errorState: "Lo siento, se ha producido un error" -}) -); diff --git a/lib/dijit/nls/fi/common.js.uncompressed.js b/lib/dijit/nls/fi/common.js.uncompressed.js deleted file mode 100644 index 1e6a6f423..000000000 --- a/lib/dijit/nls/fi/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/fi/common", ({ - buttonOk: "OK", - buttonCancel: "Peruuta", - buttonSave: "Tallenna", - itemClose: "Sulje" -}) -); diff --git a/lib/dijit/nls/fi/loading.js.uncompressed.js b/lib/dijit/nls/fi/loading.js.uncompressed.js deleted file mode 100644 index aa118100f..000000000 --- a/lib/dijit/nls/fi/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/fi/loading", ({ - loadingState: "Lataus on meneillään...", - errorState: "On ilmennyt virhe." -}) -); diff --git a/lib/dijit/nls/fr/common.js.uncompressed.js b/lib/dijit/nls/fr/common.js.uncompressed.js deleted file mode 100644 index 177690ba2..000000000 --- a/lib/dijit/nls/fr/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/fr/common", ({ - buttonOk: "OK", - buttonCancel: "Annuler", - buttonSave: "Enregistrer", - itemClose: "Fermer" -}) -); diff --git a/lib/dijit/nls/fr/loading.js.uncompressed.js b/lib/dijit/nls/fr/loading.js.uncompressed.js deleted file mode 100644 index 12dee580a..000000000 --- a/lib/dijit/nls/fr/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/fr/loading", ({ - loadingState: "Chargement...", - errorState: "Une erreur est survenue" -}) -); diff --git a/lib/dijit/nls/he/common.js.uncompressed.js b/lib/dijit/nls/he/common.js.uncompressed.js deleted file mode 100644 index 5a337ac67..000000000 --- a/lib/dijit/nls/he/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/he/common", ({ - buttonOk: "אישור", - buttonCancel: "ביטול", - buttonSave: "שמירה", - itemClose: "סגירה" -}) -); diff --git a/lib/dijit/nls/he/loading.js.uncompressed.js b/lib/dijit/nls/he/loading.js.uncompressed.js deleted file mode 100644 index 6ee23ed69..000000000 --- a/lib/dijit/nls/he/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/he/loading", ({ - loadingState: "טעינה...", - errorState: "אירעה שגיאה" -}) -); diff --git a/lib/dijit/nls/hr/common.js.uncompressed.js b/lib/dijit/nls/hr/common.js.uncompressed.js deleted file mode 100644 index 80f3e6185..000000000 --- a/lib/dijit/nls/hr/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/hr/common", ({ - buttonOk: "OK", - buttonCancel: "Opoziv", - buttonSave: "Spremi", - itemClose: "Zatvori" -}) -); diff --git a/lib/dijit/nls/hr/loading.js.uncompressed.js b/lib/dijit/nls/hr/loading.js.uncompressed.js deleted file mode 100644 index 75ef351aa..000000000 --- a/lib/dijit/nls/hr/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/hr/loading", ({ - loadingState: "Učitavanje...", - errorState: "Žao nam je, došlo je do greške" -}) -); diff --git a/lib/dijit/nls/hu/common.js.uncompressed.js b/lib/dijit/nls/hu/common.js.uncompressed.js deleted file mode 100644 index 65803718a..000000000 --- a/lib/dijit/nls/hu/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/hu/common", ({ - buttonOk: "OK", - buttonCancel: "Mégse", - buttonSave: "Mentés", - itemClose: "Bezárás" -}) -); diff --git a/lib/dijit/nls/hu/loading.js.uncompressed.js b/lib/dijit/nls/hu/loading.js.uncompressed.js deleted file mode 100644 index 9aa36871c..000000000 --- a/lib/dijit/nls/hu/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/hu/loading", ({ - loadingState: "Betöltés...", - errorState: "Sajnálom, hiba történt" -}) -); diff --git a/lib/dijit/nls/it/common.js.uncompressed.js b/lib/dijit/nls/it/common.js.uncompressed.js deleted file mode 100644 index 41d3fd34c..000000000 --- a/lib/dijit/nls/it/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/it/common", ({ - buttonOk: "Ok", - buttonCancel: "Annulla", - buttonSave: "Salva", - itemClose: "Chiudi" -}) -); diff --git a/lib/dijit/nls/it/loading.js.uncompressed.js b/lib/dijit/nls/it/loading.js.uncompressed.js deleted file mode 100644 index e2a4ea84c..000000000 --- a/lib/dijit/nls/it/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/it/loading", ({ - loadingState: "Caricamento in corso...", - errorState: "Si è verificato un errore" -}) -); diff --git a/lib/dijit/nls/ja/common.js.uncompressed.js b/lib/dijit/nls/ja/common.js.uncompressed.js deleted file mode 100644 index ae97a2491..000000000 --- a/lib/dijit/nls/ja/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/ja/common", ({ - buttonOk: "OK", - buttonCancel: "キャンセル", - buttonSave: "保存", - itemClose: "閉じる" -}) -); diff --git a/lib/dijit/nls/ja/loading.js.uncompressed.js b/lib/dijit/nls/ja/loading.js.uncompressed.js deleted file mode 100644 index 245a150cf..000000000 --- a/lib/dijit/nls/ja/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/ja/loading", ({ - loadingState: "ロード中...", - errorState: "エラーが発生しました。" -}) -); diff --git a/lib/dijit/nls/kk/common.js.uncompressed.js b/lib/dijit/nls/kk/common.js.uncompressed.js deleted file mode 100644 index 41b8a2a4b..000000000 --- a/lib/dijit/nls/kk/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/kk/common", ({ - buttonOk: "OK", - buttonCancel: "Болдырмау", - buttonSave: "Сақтау", - itemClose: "Жабу" -}) -); diff --git a/lib/dijit/nls/kk/loading.js.uncompressed.js b/lib/dijit/nls/kk/loading.js.uncompressed.js deleted file mode 100644 index 2ca42618e..000000000 --- a/lib/dijit/nls/kk/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/kk/loading", ({ - loadingState: "Қотарылуда...", - errorState: "Кешіріңіз, қате орын алды" -}) -); diff --git a/lib/dijit/nls/ko/common.js.uncompressed.js b/lib/dijit/nls/ko/common.js.uncompressed.js deleted file mode 100644 index 2fb94ce98..000000000 --- a/lib/dijit/nls/ko/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/ko/common", ({ - buttonOk: "확인", - buttonCancel: "취소", - buttonSave: "저장", - itemClose: "닫기" -}) -); diff --git a/lib/dijit/nls/ko/loading.js.uncompressed.js b/lib/dijit/nls/ko/loading.js.uncompressed.js deleted file mode 100644 index 1a1c019e0..000000000 --- a/lib/dijit/nls/ko/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/ko/loading", ({ - loadingState: "로드 중...", - errorState: "죄송합니다. 오류가 발생했습니다." -}) -); diff --git a/lib/dijit/nls/loading.js.uncompressed.js b/lib/dijit/nls/loading.js.uncompressed.js deleted file mode 100644 index 6361c98a1..000000000 --- a/lib/dijit/nls/loading.js.uncompressed.js +++ /dev/null @@ -1,40 +0,0 @@ -define("dijit/nls/loading", { root: -//begin v1.x content -({ - loadingState: "Loading...", - errorState: "Sorry, an error occurred" -}) -//end v1.x content -, -"zh": true, -"zh-tw": true, -"tr": true, -"th": true, -"sv": true, -"sl": true, -"sk": true, -"ru": true, -"ro": true, -"pt": true, -"pt-pt": true, -"pl": true, -"nl": true, -"nb": true, -"ko": true, -"kk": true, -"ja": true, -"it": true, -"hu": true, -"hr": true, -"he": true, -"fr": true, -"fi": true, -"es": true, -"el": true, -"de": true, -"da": true, -"cs": true, -"ca": true, -"az": true, -"ar": true -}); diff --git a/lib/dijit/nls/nb/common.js.uncompressed.js b/lib/dijit/nls/nb/common.js.uncompressed.js deleted file mode 100644 index a4ba51c8a..000000000 --- a/lib/dijit/nls/nb/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/nb/common", ({ - buttonOk: "OK", - buttonCancel: "Avbryt", - buttonSave: "Lagre", - itemClose: "Lukk" -}) -); diff --git a/lib/dijit/nls/nb/loading.js.uncompressed.js b/lib/dijit/nls/nb/loading.js.uncompressed.js deleted file mode 100644 index 220b90494..000000000 --- a/lib/dijit/nls/nb/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/nb/loading", ({ - loadingState: "Laster inn...", - errorState: "Det oppsto en feil" -}) -); diff --git a/lib/dijit/nls/nl/common.js.uncompressed.js b/lib/dijit/nls/nl/common.js.uncompressed.js deleted file mode 100644 index 6a1997d27..000000000 --- a/lib/dijit/nls/nl/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/nl/common", ({ - buttonOk: "OK", - buttonCancel: "Annuleren", - buttonSave: "Opslaan", - itemClose: "Sluiten" -}) -); diff --git a/lib/dijit/nls/nl/loading.js.uncompressed.js b/lib/dijit/nls/nl/loading.js.uncompressed.js deleted file mode 100644 index 3f2bd58d7..000000000 --- a/lib/dijit/nls/nl/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/nl/loading", ({ - loadingState: "Bezig met laden...", - errorState: "Er is een fout opgetreden" -}) -); diff --git a/lib/dijit/nls/pl/common.js.uncompressed.js b/lib/dijit/nls/pl/common.js.uncompressed.js deleted file mode 100644 index d02cbdd0e..000000000 --- a/lib/dijit/nls/pl/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/pl/common", ({ - buttonOk: "OK", - buttonCancel: "Anuluj", - buttonSave: "Zapisz", - itemClose: "Zamknij" -}) -); diff --git a/lib/dijit/nls/pl/loading.js.uncompressed.js b/lib/dijit/nls/pl/loading.js.uncompressed.js deleted file mode 100644 index 96bcbf72a..000000000 --- a/lib/dijit/nls/pl/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/pl/loading", ({ - loadingState: "Ładowanie...", - errorState: "Niestety, wystąpił błąd" -}) -); diff --git a/lib/dijit/nls/pt-pt/common.js.uncompressed.js b/lib/dijit/nls/pt-pt/common.js.uncompressed.js deleted file mode 100644 index 1205cb286..000000000 --- a/lib/dijit/nls/pt-pt/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/pt-pt/common", ({ - buttonOk: "OK", - buttonCancel: "Cancelar", - buttonSave: "Guardar", - itemClose: "Fechar" -}) -); diff --git a/lib/dijit/nls/pt-pt/loading.js.uncompressed.js b/lib/dijit/nls/pt-pt/loading.js.uncompressed.js deleted file mode 100644 index 5409c5585..000000000 --- a/lib/dijit/nls/pt-pt/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/pt-pt/loading", ({ - loadingState: "A carregar...", - errorState: "Lamentamos, mas ocorreu um erro" -}) -); diff --git a/lib/dijit/nls/pt/common.js.uncompressed.js b/lib/dijit/nls/pt/common.js.uncompressed.js deleted file mode 100644 index e63ec18cd..000000000 --- a/lib/dijit/nls/pt/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/pt/common", ({ - buttonOk: "OK", - buttonCancel: "Cancelar", - buttonSave: "Salvar", - itemClose: "Fechar" -}) -); diff --git a/lib/dijit/nls/pt/loading.js.uncompressed.js b/lib/dijit/nls/pt/loading.js.uncompressed.js deleted file mode 100644 index 72e1f8d90..000000000 --- a/lib/dijit/nls/pt/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/pt/loading", ({ - loadingState: "Carregando...", - errorState: "Desculpe, ocorreu um erro" -}) -); diff --git a/lib/dijit/nls/ro/common.js.uncompressed.js b/lib/dijit/nls/ro/common.js.uncompressed.js deleted file mode 100644 index bd68178cb..000000000 --- a/lib/dijit/nls/ro/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/ro/common", ({ - buttonOk: "OK", - buttonCancel: "Anulare", - buttonSave: "Salvare", - itemClose: "Închidere" -}) -); diff --git a/lib/dijit/nls/ro/loading.js.uncompressed.js b/lib/dijit/nls/ro/loading.js.uncompressed.js deleted file mode 100644 index 1fe120e47..000000000 --- a/lib/dijit/nls/ro/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/ro/loading", ({ - loadingState: "Încărcare...", - errorState: "Ne pare rău, a apărut o eroare " -}) -); diff --git a/lib/dijit/nls/ru/common.js.uncompressed.js b/lib/dijit/nls/ru/common.js.uncompressed.js deleted file mode 100644 index 354a7c882..000000000 --- a/lib/dijit/nls/ru/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/ru/common", ({ - buttonOk: "OK", - buttonCancel: "Отмена", - buttonSave: "Сохранить", - itemClose: "Закрыть" -}) -); diff --git a/lib/dijit/nls/ru/loading.js.uncompressed.js b/lib/dijit/nls/ru/loading.js.uncompressed.js deleted file mode 100644 index 8861e02aa..000000000 --- a/lib/dijit/nls/ru/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/ru/loading", ({ - loadingState: "Загрузка...", - errorState: "Извините, возникла ошибка" -}) -); diff --git a/lib/dijit/nls/sk/common.js.uncompressed.js b/lib/dijit/nls/sk/common.js.uncompressed.js deleted file mode 100644 index 9b9398f6a..000000000 --- a/lib/dijit/nls/sk/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/sk/common", ({ - buttonOk: "OK", - buttonCancel: "Zrušiť", - buttonSave: "Uložiť", - itemClose: "Zatvoriť" -}) -); diff --git a/lib/dijit/nls/sk/loading.js.uncompressed.js b/lib/dijit/nls/sk/loading.js.uncompressed.js deleted file mode 100644 index cd633acf4..000000000 --- a/lib/dijit/nls/sk/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/sk/loading", ({ - loadingState: "Zavádza sa...", - errorState: "Ľutujeme, ale vyskytla sa chyba" -}) -); diff --git a/lib/dijit/nls/sl/common.js.uncompressed.js b/lib/dijit/nls/sl/common.js.uncompressed.js deleted file mode 100644 index d12fbbd4f..000000000 --- a/lib/dijit/nls/sl/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/sl/common", ({ - buttonOk: "V redu", - buttonCancel: "Prekliči", - buttonSave: "Shrani", - itemClose: "Zapri" -}) -); diff --git a/lib/dijit/nls/sl/loading.js.uncompressed.js b/lib/dijit/nls/sl/loading.js.uncompressed.js deleted file mode 100644 index bdd063c22..000000000 --- a/lib/dijit/nls/sl/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/sl/loading", ({ - loadingState: "Nalaganje ...", - errorState: "Oprostite, prišlo je do napake." -}) -); diff --git a/lib/dijit/nls/sv/common.js.uncompressed.js b/lib/dijit/nls/sv/common.js.uncompressed.js deleted file mode 100644 index beee35a07..000000000 --- a/lib/dijit/nls/sv/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/sv/common", ({ - buttonOk: "OK", - buttonCancel: "Avbryt", - buttonSave: "Spara", - itemClose: "Stäng" -}) -); diff --git a/lib/dijit/nls/sv/loading.js.uncompressed.js b/lib/dijit/nls/sv/loading.js.uncompressed.js deleted file mode 100644 index c839060e0..000000000 --- a/lib/dijit/nls/sv/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/sv/loading", ({ - loadingState: "Läser in...", - errorState: "Det har inträffat ett fel." -}) -); diff --git a/lib/dijit/nls/th/common.js.uncompressed.js b/lib/dijit/nls/th/common.js.uncompressed.js deleted file mode 100644 index 9c6337e4e..000000000 --- a/lib/dijit/nls/th/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/th/common", ({ - buttonOk: "ตกลง", - buttonCancel: "ยกเลิก", - buttonSave: "บันทึก", - itemClose: "ปิด" -}) -); diff --git a/lib/dijit/nls/th/loading.js.uncompressed.js b/lib/dijit/nls/th/loading.js.uncompressed.js deleted file mode 100644 index 9391c9ad4..000000000 --- a/lib/dijit/nls/th/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/th/loading", ({ - loadingState: "กำลังโหลด...", - errorState: "ขออภัย เกิดข้อผิดพลาด" -}) -); diff --git a/lib/dijit/nls/tr/common.js.uncompressed.js b/lib/dijit/nls/tr/common.js.uncompressed.js deleted file mode 100644 index bbe5754e9..000000000 --- a/lib/dijit/nls/tr/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/tr/common", ({ - buttonOk: "Tamam", - buttonCancel: "İptal", - buttonSave: "Kaydet", - itemClose: "Kapat" -}) -); diff --git a/lib/dijit/nls/tr/loading.js.uncompressed.js b/lib/dijit/nls/tr/loading.js.uncompressed.js deleted file mode 100644 index 39ce2e997..000000000 --- a/lib/dijit/nls/tr/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/tr/loading", ({ - loadingState: "Yükleniyor...", - errorState: "Üzgünüz, bir hata oluştu" -}) -); diff --git a/lib/dijit/nls/zh-tw/common.js.uncompressed.js b/lib/dijit/nls/zh-tw/common.js.uncompressed.js deleted file mode 100644 index 856ff7250..000000000 --- a/lib/dijit/nls/zh-tw/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/zh-tw/common", ({ - buttonOk: "確定", - buttonCancel: "取消", - buttonSave: "儲存", - itemClose: "關閉" -}) -); diff --git a/lib/dijit/nls/zh-tw/loading.js.uncompressed.js b/lib/dijit/nls/zh-tw/loading.js.uncompressed.js deleted file mode 100644 index 4c7240c11..000000000 --- a/lib/dijit/nls/zh-tw/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/zh-tw/loading", ({ - loadingState: "載入中...", - errorState: "抱歉,發生錯誤" -}) -); diff --git a/lib/dijit/nls/zh/common.js.uncompressed.js b/lib/dijit/nls/zh/common.js.uncompressed.js deleted file mode 100644 index 77250ccd3..000000000 --- a/lib/dijit/nls/zh/common.js.uncompressed.js +++ /dev/null @@ -1,8 +0,0 @@ -define( -"dijit/nls/zh/common", ({ - buttonOk: "确定", - buttonCancel: "取消", - buttonSave: "保存", - itemClose: "关闭" -}) -); diff --git a/lib/dijit/nls/zh/loading.js.uncompressed.js b/lib/dijit/nls/zh/loading.js.uncompressed.js deleted file mode 100644 index 9c9c1d184..000000000 --- a/lib/dijit/nls/zh/loading.js.uncompressed.js +++ /dev/null @@ -1,6 +0,0 @@ -define( -"dijit/nls/zh/loading", ({ - loadingState: "正在加载...", - errorState: "对不起,发生了错误" -}) -); diff --git a/lib/dijit/place.js.uncompressed.js b/lib/dijit/place.js.uncompressed.js deleted file mode 100644 index 7e10724df..000000000 --- a/lib/dijit/place.js.uncompressed.js +++ /dev/null @@ -1,367 +0,0 @@ -define("dijit/place", [ - "dojo/_base/array", // array.forEach array.map array.some - "dojo/dom-geometry", // domGeometry.position - "dojo/dom-style", // domStyle.getComputedStyle - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/window", // win.body - "dojo/window", // winUtils.getBox - "./main" // dijit (defining dijit.place to match API doc) -], function(array, domGeometry, domStyle, kernel, win, winUtils, dijit){ - - // module: - // dijit/place - - - function _place(/*DomNode*/ node, choices, layoutNode, aroundNodeCoords){ - // summary: - // Given a list of spots to put node, put it at the first spot where it fits, - // of if it doesn't fit anywhere then the place with the least overflow - // choices: Array - // Array of elements like: {corner: 'TL', pos: {x: 10, y: 20} } - // Above example says to put the top-left corner of the node at (10,20) - // layoutNode: Function(node, aroundNodeCorner, nodeCorner, size) - // for things like tooltip, they are displayed differently (and have different dimensions) - // based on their orientation relative to the parent. This adjusts the popup based on orientation. - // It also passes in the available size for the popup, which is useful for tooltips to - // tell them that their width is limited to a certain amount. layoutNode() may return a value expressing - // how much the popup had to be modified to fit into the available space. This is used to determine - // what the best placement is. - // aroundNodeCoords: Object - // Size of aroundNode, ex: {w: 200, h: 50} - - // get {x: 10, y: 10, w: 100, h:100} type obj representing position of - // viewport over document - var view = winUtils.getBox(node.ownerDocument); - - // This won't work if the node is inside a <div style="position: relative">, - // so reattach it to win.doc.body. (Otherwise, the positioning will be wrong - // and also it might get cutoff) - if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){ - win.body(node.ownerDocument).appendChild(node); - } - - var best = null; - array.some(choices, function(choice){ - var corner = choice.corner; - var pos = choice.pos; - var overflow = 0; - - // calculate amount of space available given specified position of node - var spaceAvailable = { - w: { - 'L': view.l + view.w - pos.x, - 'R': pos.x - view.l, - 'M': view.w - }[corner.charAt(1)], - h: { - 'T': view.t + view.h - pos.y, - 'B': pos.y - view.t, - 'M': view.h - }[corner.charAt(0)] - }; - - // Clear left/right position settings set earlier so they don't interfere with calculations, - // specifically when layoutNode() (a.k.a. Tooltip.orient()) measures natural width of Tooltip - var s = node.style; - s.left = s.right = "auto"; - - // configure node to be displayed in given position relative to button - // (need to do this in order to get an accurate size for the node, because - // a tooltip's size changes based on position, due to triangle) - if(layoutNode){ - var res = layoutNode(node, choice.aroundCorner, corner, spaceAvailable, aroundNodeCoords); - overflow = typeof res == "undefined" ? 0 : res; - } - - // get node's size - var style = node.style; - var oldDisplay = style.display; - var oldVis = style.visibility; - if(style.display == "none"){ - style.visibility = "hidden"; - style.display = ""; - } - var bb = domGeometry.position(node); - style.display = oldDisplay; - style.visibility = oldVis; - - // coordinates and size of node with specified corner placed at pos, - // and clipped by viewport - var - startXpos = { - 'L': pos.x, - 'R': pos.x - bb.w, - 'M': Math.max(view.l, Math.min(view.l + view.w, pos.x + (bb.w >> 1)) - bb.w) // M orientation is more flexible - }[corner.charAt(1)], - startYpos = { - 'T': pos.y, - 'B': pos.y - bb.h, - 'M': Math.max(view.t, Math.min(view.t + view.h, pos.y + (bb.h >> 1)) - bb.h) - }[corner.charAt(0)], - startX = Math.max(view.l, startXpos), - startY = Math.max(view.t, startYpos), - endX = Math.min(view.l + view.w, startXpos + bb.w), - endY = Math.min(view.t + view.h, startYpos + bb.h), - width = endX - startX, - height = endY - startY; - - overflow += (bb.w - width) + (bb.h - height); - - if(best == null || overflow < best.overflow){ - best = { - corner: corner, - aroundCorner: choice.aroundCorner, - x: startX, - y: startY, - w: width, - h: height, - overflow: overflow, - spaceAvailable: spaceAvailable - }; - } - - return !overflow; - }); - - // In case the best position is not the last one we checked, need to call - // layoutNode() again. - if(best.overflow && layoutNode){ - layoutNode(node, best.aroundCorner, best.corner, best.spaceAvailable, aroundNodeCoords); - } - - // And then position the node. Do this last, after the layoutNode() above - // has sized the node, due to browser quirks when the viewport is scrolled - // (specifically that a Tooltip will shrink to fit as though the window was - // scrolled to the left). - // - // In RTL mode, set style.right rather than style.left so in the common case, - // window resizes move the popup along with the aroundNode. - var l = domGeometry.isBodyLtr(node.ownerDocument), - s = node.style; - s.top = best.y + "px"; - s[l ? "left" : "right"] = (l ? best.x : view.w - best.x - best.w) + "px"; - s[l ? "right" : "left"] = "auto"; // needed for FF or else tooltip goes to far left - - return best; - } - - var place = { - // summary: - // Code to place a DOMNode relative to another DOMNode. - // Load using require(["dijit/place"], function(place){ ... }). - - at: function(node, pos, corners, padding){ - // summary: - // Positions one of the node's corners at specified position - // such that node is fully visible in viewport. - // description: - // NOTE: node is assumed to be absolutely or relatively positioned. - // node: DOMNode - // The node to position - // pos: dijit/place.__Position - // Object like {x: 10, y: 20} - // corners: String[] - // Array of Strings representing order to try corners in, like ["TR", "BL"]. - // Possible values are: - // - // - "BL" - bottom left - // - "BR" - bottom right - // - "TL" - top left - // - "TR" - top right - // padding: dijit/place.__Position? - // optional param to set padding, to put some buffer around the element you want to position. - // example: - // Try to place node's top right corner at (10,20). - // If that makes node go (partially) off screen, then try placing - // bottom left corner at (10,20). - // | place(node, {x: 10, y: 20}, ["TR", "BL"]) - var choices = array.map(corners, function(corner){ - var c = { corner: corner, pos: {x:pos.x,y:pos.y} }; - if(padding){ - c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x; - c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y; - } - return c; - }); - - return _place(node, choices); - }, - - around: function( - /*DomNode*/ node, - /*DomNode|dijit/place.__Rectangle*/ anchor, - /*String[]*/ positions, - /*Boolean*/ leftToRight, - /*Function?*/ layoutNode){ - - // summary: - // Position node adjacent or kitty-corner to anchor - // such that it's fully visible in viewport. - // description: - // Place node such that corner of node touches a corner of - // aroundNode, and that node is fully visible. - // anchor: - // Either a DOMNode or a rectangle (object with x, y, width, height). - // positions: - // Ordered list of positions to try matching up. - // - // - before: places drop down to the left of the anchor node/widget, or to the right in the case - // of RTL scripts like Hebrew and Arabic; aligns either the top of the drop down - // with the top of the anchor, or the bottom of the drop down with bottom of the anchor. - // - after: places drop down to the right of the anchor node/widget, or to the left in the case - // of RTL scripts like Hebrew and Arabic; aligns either the top of the drop down - // with the top of the anchor, or the bottom of the drop down with bottom of the anchor. - // - before-centered: centers drop down to the left of the anchor node/widget, or to the right - // in the case of RTL scripts like Hebrew and Arabic - // - after-centered: centers drop down to the right of the anchor node/widget, or to the left - // in the case of RTL scripts like Hebrew and Arabic - // - above-centered: drop down is centered above anchor node - // - above: drop down goes above anchor node, left sides aligned - // - above-alt: drop down goes above anchor node, right sides aligned - // - below-centered: drop down is centered above anchor node - // - below: drop down goes below anchor node - // - below-alt: drop down goes below anchor node, right sides aligned - // layoutNode: Function(node, aroundNodeCorner, nodeCorner) - // For things like tooltip, they are displayed differently (and have different dimensions) - // based on their orientation relative to the parent. This adjusts the popup based on orientation. - // leftToRight: - // True if widget is LTR, false if widget is RTL. Affects the behavior of "above" and "below" - // positions slightly. - // example: - // | placeAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'}); - // This will try to position node such that node's top-left corner is at the same position - // as the bottom left corner of the aroundNode (ie, put node below - // aroundNode, with left edges aligned). If that fails it will try to put - // the bottom-right corner of node where the top right corner of aroundNode is - // (ie, put node above aroundNode, with right edges aligned) - // - - // if around is a DOMNode (or DOMNode id), convert to coordinates - var aroundNodePos = (typeof anchor == "string" || "offsetWidth" in anchor) - ? domGeometry.position(anchor, true) - : anchor; - - // Compute position and size of visible part of anchor (it may be partially hidden by ancestor nodes w/scrollbars) - if(anchor.parentNode){ - // ignore nodes between position:relative and position:absolute - var sawPosAbsolute = domStyle.getComputedStyle(anchor).position == "absolute"; - var parent = anchor.parentNode; - while(parent && parent.nodeType == 1 && parent.nodeName != "BODY"){ //ignoring the body will help performance - var parentPos = domGeometry.position(parent, true), - pcs = domStyle.getComputedStyle(parent); - if(/relative|absolute/.test(pcs.position)){ - sawPosAbsolute = false; - } - if(!sawPosAbsolute && /hidden|auto|scroll/.test(pcs.overflow)){ - var bottomYCoord = Math.min(aroundNodePos.y + aroundNodePos.h, parentPos.y + parentPos.h); - var rightXCoord = Math.min(aroundNodePos.x + aroundNodePos.w, parentPos.x + parentPos.w); - aroundNodePos.x = Math.max(aroundNodePos.x, parentPos.x); - aroundNodePos.y = Math.max(aroundNodePos.y, parentPos.y); - aroundNodePos.h = bottomYCoord - aroundNodePos.y; - aroundNodePos.w = rightXCoord - aroundNodePos.x; - } - if(pcs.position == "absolute"){ - sawPosAbsolute = true; - } - parent = parent.parentNode; - } - } - - var x = aroundNodePos.x, - y = aroundNodePos.y, - width = "w" in aroundNodePos ? aroundNodePos.w : (aroundNodePos.w = aroundNodePos.width), - height = "h" in aroundNodePos ? aroundNodePos.h : (kernel.deprecated("place.around: dijit/place.__Rectangle: { x:"+x+", y:"+y+", height:"+aroundNodePos.height+", width:"+width+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+aroundNodePos.height+", w:"+width+" }", "", "2.0"), aroundNodePos.h = aroundNodePos.height); - - // Convert positions arguments into choices argument for _place() - var choices = []; - function push(aroundCorner, corner){ - choices.push({ - aroundCorner: aroundCorner, - corner: corner, - pos: { - x: { - 'L': x, - 'R': x + width, - 'M': x + (width >> 1) - }[aroundCorner.charAt(1)], - y: { - 'T': y, - 'B': y + height, - 'M': y + (height >> 1) - }[aroundCorner.charAt(0)] - } - }) - } - array.forEach(positions, function(pos){ - var ltr = leftToRight; - switch(pos){ - case "above-centered": - push("TM", "BM"); - break; - case "below-centered": - push("BM", "TM"); - break; - case "after-centered": - ltr = !ltr; - // fall through - case "before-centered": - push(ltr ? "ML" : "MR", ltr ? "MR" : "ML"); - break; - case "after": - ltr = !ltr; - // fall through - case "before": - push(ltr ? "TL" : "TR", ltr ? "TR" : "TL"); - push(ltr ? "BL" : "BR", ltr ? "BR" : "BL"); - break; - case "below-alt": - ltr = !ltr; - // fall through - case "below": - // first try to align left borders, next try to align right borders (or reverse for RTL mode) - push(ltr ? "BL" : "BR", ltr ? "TL" : "TR"); - push(ltr ? "BR" : "BL", ltr ? "TR" : "TL"); - break; - case "above-alt": - ltr = !ltr; - // fall through - case "above": - // first try to align left borders, next try to align right borders (or reverse for RTL mode) - push(ltr ? "TL" : "TR", ltr ? "BL" : "BR"); - push(ltr ? "TR" : "TL", ltr ? "BR" : "BL"); - break; - default: - // To assist dijit/_base/place, accept arguments of type {aroundCorner: "BL", corner: "TL"}. - // Not meant to be used directly. - push(pos.aroundCorner, pos.corner); - } - }); - - var position = _place(node, choices, layoutNode, {w: width, h: height}); - position.aroundNodePos = aroundNodePos; - - return position; - } - }; - - /*===== - place.__Position = { - // x: Integer - // horizontal coordinate in pixels, relative to document body - // y: Integer - // vertical coordinate in pixels, relative to document body - }; - place.__Rectangle = { - // x: Integer - // horizontal offset in pixels, relative to document body - // y: Integer - // vertical offset in pixels, relative to document body - // w: Integer - // width in pixels. Can also be specified as "width" for backwards-compatibility. - // h: Integer - // height in pixels. Can also be specified as "height" for backwards-compatibility. - }; - =====*/ - - return dijit.place = place; // setting dijit.place for back-compat, remove for 2.0 -}); diff --git a/lib/dijit/popup.js.uncompressed.js b/lib/dijit/popup.js.uncompressed.js deleted file mode 100644 index 58b35fd97..000000000 --- a/lib/dijit/popup.js.uncompressed.js +++ /dev/null @@ -1,318 +0,0 @@ -define("dijit/popup", [ - "dojo/_base/array", // array.forEach array.some - "dojo/aspect", - "dojo/_base/connect", // connect._keypress - "dojo/_base/declare", // declare - "dojo/dom", // dom.isDescendant - "dojo/dom-attr", // domAttr.set - "dojo/dom-construct", // domConstruct.create domConstruct.destroy - "dojo/dom-geometry", // domGeometry.isBodyLtr - "dojo/dom-style", // domStyle.set - "dojo/_base/event", // event.stop - "dojo/keys", - "dojo/_base/lang", // lang.hitch - "dojo/on", - "dojo/sniff", // has("ie") has("mozilla") - "./place", - "./BackgroundIframe", - "./main" // dijit (defining dijit.popup to match API doc) -], function(array, aspect, connect, declare, dom, domAttr, domConstruct, domGeometry, domStyle, event, keys, lang, on, has, - place, BackgroundIframe, dijit){ - - // module: - // dijit/popup - - /*===== - var __OpenArgs = { - // popup: Widget - // widget to display - // parent: Widget - // the button etc. that is displaying this popup - // around: DomNode - // DOM node (typically a button); place popup relative to this node. (Specify this *or* "x" and "y" parameters.) - // x: Integer - // Absolute horizontal position (in pixels) to place node at. (Specify this *or* "around" parameter.) - // y: Integer - // Absolute vertical position (in pixels) to place node at. (Specify this *or* "around" parameter.) - // orient: Object|String - // When the around parameter is specified, orient should be a list of positions to try, ex: - // | [ "below", "above" ] - // For backwards compatibility it can also be an (ordered) hash of tuples of the form - // (around-node-corner, popup-node-corner), ex: - // | { "BL": "TL", "TL": "BL" } - // where BL means "bottom left" and "TL" means "top left", etc. - // - // dijit/popup.open() tries to position the popup according to each specified position, in order, - // until the popup appears fully within the viewport. - // - // The default value is ["below", "above"] - // - // When an (x,y) position is specified rather than an around node, orient is either - // "R" or "L". R (for right) means that it tries to put the popup to the right of the mouse, - // specifically positioning the popup's top-right corner at the mouse position, and if that doesn't - // fit in the viewport, then it tries, in order, the bottom-right corner, the top left corner, - // and the top-right corner. - // onCancel: Function - // callback when user has canceled the popup by: - // - // 1. hitting ESC or - // 2. by using the popup widget's proprietary cancel mechanism (like a cancel button in a dialog); - // i.e. whenever popupWidget.onCancel() is called, args.onCancel is called - // onClose: Function - // callback whenever this popup is closed - // onExecute: Function - // callback when user "executed" on the popup/sub-popup by selecting a menu choice, etc. (top menu only) - // padding: place.__Position - // adding a buffer around the opening position. This is only useful when around is not set. - }; - =====*/ - - function destroyWrapper(){ - // summary: - // Function to destroy wrapper when popup widget is destroyed. - // Left in this scope to avoid memory leak on IE8 on refresh page, see #15206. - if(this._popupWrapper){ - domConstruct.destroy(this._popupWrapper); - delete this._popupWrapper; - } - } - - var PopupManager = declare(null, { - // summary: - // Used to show drop downs (ex: the select list of a ComboBox) - // or popups (ex: right-click context menus). - - // _stack: dijit/_WidgetBase[] - // Stack of currently popped up widgets. - // (someone opened _stack[0], and then it opened _stack[1], etc.) - _stack: [], - - // _beginZIndex: Number - // Z-index of the first popup. (If first popup opens other - // popups they get a higher z-index.) - _beginZIndex: 1000, - - _idGen: 1, - - _createWrapper: function(/*Widget*/ widget){ - // summary: - // Initialization for widgets that will be used as popups. - // Puts widget inside a wrapper DIV (if not already in one), - // and returns pointer to that wrapper DIV. - - var wrapper = widget._popupWrapper, - node = widget.domNode; - - if(!wrapper){ - // Create wrapper <div> for when this widget [in the future] will be used as a popup. - // This is done early because of IE bugs where creating/moving DOM nodes causes focus - // to go wonky, see tests/robot/Toolbar.html to reproduce - wrapper = domConstruct.create("div", { - "class":"dijitPopup", - style:{ display: "none"}, - role: "presentation" - }, widget.ownerDocumentBody); - wrapper.appendChild(node); - - var s = node.style; - s.display = ""; - s.visibility = ""; - s.position = ""; - s.top = "0px"; - - widget._popupWrapper = wrapper; - aspect.after(widget, "destroy", destroyWrapper, true); - } - - return wrapper; - }, - - moveOffScreen: function(/*Widget*/ widget){ - // summary: - // Moves the popup widget off-screen. - // Do not use this method to hide popups when not in use, because - // that will create an accessibility issue: the offscreen popup is - // still in the tabbing order. - - // Create wrapper if not already there - var wrapper = this._createWrapper(widget); - - domStyle.set(wrapper, { - visibility: "hidden", - top: "-9999px", // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111) - display: "" - }); - }, - - hide: function(/*Widget*/ widget){ - // summary: - // Hide this popup widget (until it is ready to be shown). - // Initialization for widgets that will be used as popups - // - // Also puts widget inside a wrapper DIV (if not already in one) - // - // If popup widget needs to layout it should - // do so when it is made visible, and popup._onShow() is called. - - // Create wrapper if not already there - var wrapper = this._createWrapper(widget); - - domStyle.set(wrapper, "display", "none"); - }, - - getTopPopup: function(){ - // summary: - // Compute the closest ancestor popup that's *not* a child of another popup. - // Ex: For a TooltipDialog with a button that spawns a tree of menus, find the popup of the button. - var stack = this._stack; - for(var pi=stack.length-1; pi > 0 && stack[pi].parent === stack[pi-1].widget; pi--){ - /* do nothing, just trying to get right value for pi */ - } - return stack[pi]; - }, - - open: function(/*__OpenArgs*/ args){ - // summary: - // Popup the widget at the specified position - // - // example: - // opening at the mouse position - // | popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY}); - // - // example: - // opening the widget as a dropdown - // | popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}}); - // - // Note that whatever widget called dijit/popup.open() should also listen to its own _onBlur callback - // (fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed. - - var stack = this._stack, - widget = args.popup, - orient = args.orient || ["below", "below-alt", "above", "above-alt"], - ltr = args.parent ? args.parent.isLeftToRight() : domGeometry.isBodyLtr(widget.ownerDocument), - around = args.around, - id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+this._idGen++); - - // If we are opening a new popup that isn't a child of a currently opened popup, then - // close currently opened popup(s). This should happen automatically when the old popups - // gets the _onBlur() event, except that the _onBlur() event isn't reliable on IE, see [22198]. - while(stack.length && (!args.parent || !dom.isDescendant(args.parent.domNode, stack[stack.length-1].widget.domNode))){ - this.close(stack[stack.length-1].widget); - } - - // Get pointer to popup wrapper, and create wrapper if it doesn't exist - var wrapper = this._createWrapper(widget); - - - domAttr.set(wrapper, { - id: id, - style: { - zIndex: this._beginZIndex + stack.length - }, - "class": "dijitPopup " + (widget.baseClass || widget["class"] || "").split(" ")[0] +"Popup", - dijitPopupParent: args.parent ? args.parent.id : "" - }); - - if(has("ie") || has("mozilla")){ - if(!widget.bgIframe){ - // setting widget.bgIframe triggers cleanup in _Widget.destroy() - widget.bgIframe = new BackgroundIframe(wrapper); - } - } - - // position the wrapper node and make it visible - var best = around ? - place.around(wrapper, around, orient, ltr, widget.orient ? lang.hitch(widget, "orient") : null) : - place.at(wrapper, args, orient == 'R' ? ['TR','BR','TL','BL'] : ['TL','BL','TR','BR'], args.padding); - - wrapper.style.display = ""; - wrapper.style.visibility = "visible"; - widget.domNode.style.visibility = "visible"; // counteract effects from _HasDropDown - - var handlers = []; - - // provide default escape and tab key handling - // (this will work for any widget, not just menu) - handlers.push(on(wrapper, connect._keypress, lang.hitch(this, function(evt){ - if(evt.charOrCode == keys.ESCAPE && args.onCancel){ - event.stop(evt); - args.onCancel(); - }else if(evt.charOrCode === keys.TAB){ - event.stop(evt); - var topPopup = this.getTopPopup(); - if(topPopup && topPopup.onCancel){ - topPopup.onCancel(); - } - } - }))); - - // watch for cancel/execute events on the popup and notify the caller - // (for a menu, "execute" means clicking an item) - if(widget.onCancel && args.onCancel){ - handlers.push(widget.on("cancel", args.onCancel)); - } - - handlers.push(widget.on(widget.onExecute ? "execute" : "change", lang.hitch(this, function(){ - var topPopup = this.getTopPopup(); - if(topPopup && topPopup.onExecute){ - topPopup.onExecute(); - } - }))); - - stack.push({ - widget: widget, - parent: args.parent, - onExecute: args.onExecute, - onCancel: args.onCancel, - onClose: args.onClose, - handlers: handlers - }); - - if(widget.onOpen){ - // TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here) - widget.onOpen(best); - } - - return best; - }, - - close: function(/*Widget?*/ popup){ - // summary: - // Close specified popup and any popups that it parented. - // If no popup is specified, closes all popups. - - var stack = this._stack; - - // Basically work backwards from the top of the stack closing popups - // until we hit the specified popup, but IIRC there was some issue where closing - // a popup would cause others to close too. Thus if we are trying to close B in [A,B,C] - // closing C might close B indirectly and then the while() condition will run where stack==[A]... - // so the while condition is constructed defensively. - while((popup && array.some(stack, function(elem){return elem.widget == popup;})) || - (!popup && stack.length)){ - var top = stack.pop(), - widget = top.widget, - onClose = top.onClose; - - if(widget.onClose){ - // TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here) - widget.onClose(); - } - - var h; - while(h = top.handlers.pop()){ h.remove(); } - - // Hide the widget and it's wrapper unless it has already been destroyed in above onClose() etc. - if(widget && widget.domNode){ - this.hide(widget); - } - - if(onClose){ - onClose(); - } - } - } - }); - - return (dijit.popup = new PopupManager()); -}); diff --git a/lib/dijit/registry.js.uncompressed.js b/lib/dijit/registry.js.uncompressed.js deleted file mode 100644 index c19954aae..000000000 --- a/lib/dijit/registry.js.uncompressed.js +++ /dev/null @@ -1,161 +0,0 @@ -define("dijit/registry", [ - "dojo/_base/array", // array.forEach array.map - "dojo/sniff", // has("ie") - "dojo/_base/unload", // unload.addOnWindowUnload - "dojo/_base/window", // win.body - "./main" // dijit._scopeName -], function(array, has, unload, win, dijit){ - - // module: - // dijit/registry - - var _widgetTypeCtr = {}, hash = {}; - - var registry = { - // summary: - // Registry of existing widget on page, plus some utility methods. - - // length: Number - // Number of registered widgets - length: 0, - - add: function(widget){ - // summary: - // Add a widget to the registry. If a duplicate ID is detected, a error is thrown. - // widget: dijit/_WidgetBase - // Any dijit/_WidgetBase subclass. - if(hash[widget.id]){ - throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered"); - } - hash[widget.id] = widget; - this.length++; - }, - - remove: function(/*String*/ id){ - // summary: - // Remove a widget from the registry. Does not destroy the widget; simply - // removes the reference. - if(hash[id]){ - delete hash[id]; - this.length--; - } - }, - - byId: function(/*String|Widget*/ id){ - // summary: - // Find a widget by it's id. - // If passed a widget then just returns the widget. - return typeof id == "string" ? hash[id] : id; // dijit/_WidgetBase - }, - - byNode: function(/*DOMNode*/ node){ - // summary: - // Returns the widget corresponding to the given DOMNode - return hash[node.getAttribute("widgetId")]; // dijit/_WidgetBase - }, - - toArray: function(){ - // summary: - // Convert registry into a true Array - // - // example: - // Work with the widget .domNodes in a real Array - // | array.map(registry.toArray(), function(w){ return w.domNode; }); - - var ar = []; - for(var id in hash){ - ar.push(hash[id]); - } - return ar; // dijit/_WidgetBase[] - }, - - getUniqueId: function(/*String*/widgetType){ - // summary: - // Generates a unique id for a given widgetType - - var id; - do{ - id = widgetType + "_" + - (widgetType in _widgetTypeCtr ? - ++_widgetTypeCtr[widgetType] : _widgetTypeCtr[widgetType] = 0); - }while(hash[id]); - return dijit._scopeName == "dijit" ? id : dijit._scopeName + "_" + id; // String - }, - - findWidgets: function(root, skipNode){ - // summary: - // Search subtree under root returning widgets found. - // Doesn't search for nested widgets (ie, widgets inside other widgets). - // root: DOMNode - // Node to search under. - // skipNode: DOMNode - // If specified, don't search beneath this node (usually containerNode). - - var outAry = []; - - function getChildrenHelper(root){ - for(var node = root.firstChild; node; node = node.nextSibling){ - if(node.nodeType == 1){ - var widgetId = node.getAttribute("widgetId"); - if(widgetId){ - var widget = hash[widgetId]; - if(widget){ // may be null on page w/multiple dojo's loaded - outAry.push(widget); - } - }else if(node !== skipNode){ - getChildrenHelper(node); - } - } - } - } - - getChildrenHelper(root); - return outAry; - }, - - _destroyAll: function(){ - // summary: - // Code to destroy all widgets and do other cleanup on page unload - - // Clean up focus manager lingering references to widgets and nodes - dijit._curFocus = null; - dijit._prevFocus = null; - dijit._activeStack = []; - - // Destroy all the widgets, top down - array.forEach(registry.findWidgets(win.body()), function(widget){ - // Avoid double destroy of widgets like Menu that are attached to <body> - // even though they are logically children of other widgets. - if(!widget._destroyed){ - if(widget.destroyRecursive){ - widget.destroyRecursive(); - }else if(widget.destroy){ - widget.destroy(); - } - } - }); - }, - - getEnclosingWidget: function(/*DOMNode*/ node){ - // summary: - // Returns the widget whose DOM tree contains the specified DOMNode, or null if - // the node is not contained within the DOM tree of any widget - while(node){ - var id = node.nodeType == 1 && node.getAttribute("widgetId"); - if(id){ - return hash[id]; - } - node = node.parentNode; - } - return null; - }, - - // In case someone needs to access hash. - // Actually, this is accessed from WidgetSet back-compatibility code - _hash: hash - }; - - dijit.registry = registry; - - return registry; -}); diff --git a/lib/dijit/tree/ForestStoreModel.js.uncompressed.js b/lib/dijit/tree/ForestStoreModel.js.uncompressed.js deleted file mode 100644 index 2ef8d1546..000000000 --- a/lib/dijit/tree/ForestStoreModel.js.uncompressed.js +++ /dev/null @@ -1,279 +0,0 @@ -define("dijit/tree/ForestStoreModel", [ - "dojo/_base/array", // array.indexOf array.some - "dojo/_base/declare", // declare - "dojo/_base/kernel", // global - "dojo/_base/lang", // lang.hitch - "./TreeStoreModel" -], function(array, declare, kernel, lang, TreeStoreModel){ - -// module: -// dijit/tree/ForestStoreModel - -return declare("dijit.tree.ForestStoreModel", TreeStoreModel, { - // summary: - // Interface between a dijit.Tree and a dojo.data store that doesn't have a root item, - // a.k.a. a store that has multiple "top level" items. - // - // description: - // Use this class to wrap a dojo.data store, making all the items matching the specified query - // appear as children of a fabricated "root item". If no query is specified then all the - // items returned by fetch() on the underlying store become children of the root item. - // This class allows dijit.Tree to assume a single root item, even if the store doesn't have one. - // - // When using this class the developer must override a number of methods according to their app and - // data, including: - // - // - onNewRootItem - // - onAddToRoot - // - onLeaveRoot - // - onNewItem - // - onSetItem - - // Parameters to constructor - - // rootId: String - // ID of fabricated root item - rootId: "$root$", - - // rootLabel: String - // Label of fabricated root item - rootLabel: "ROOT", - - // query: String - // Specifies the set of children of the root item. - // example: - // | {type:'continent'} - query: null, - - // End of parameters to constructor - - constructor: function(params){ - // summary: - // Sets up variables, etc. - // tags: - // private - - // Make dummy root item - this.root = { - store: this, - root: true, - id: params.rootId, - label: params.rootLabel, - children: params.rootChildren // optional param - }; - }, - - // ======================================================================= - // Methods for traversing hierarchy - - mayHaveChildren: function(/*dojo/data/Item*/ item){ - // summary: - // Tells if an item has or may have children. Implementing logic here - // avoids showing +/- expando icon for nodes that we know don't have children. - // (For efficiency reasons we may not want to check if an element actually - // has children until user clicks the expando node) - // tags: - // extension - return item === this.root || this.inherited(arguments); - }, - - getChildren: function(/*dojo/data/Item*/ parentItem, /*function(items)*/ callback, /*function*/ onError){ - // summary: - // Calls onComplete() with array of child items of given parent item, all loaded. - if(parentItem === this.root){ - if(this.root.children){ - // already loaded, just return - callback(this.root.children); - }else{ - this.store.fetch({ - query: this.query, - onComplete: lang.hitch(this, function(items){ - this.root.children = items; - callback(items); - }), - onError: onError - }); - } - }else{ - this.inherited(arguments); - } - }, - - // ======================================================================= - // Inspecting items - - isItem: function(/* anything */ something){ - return (something === this.root) ? true : this.inherited(arguments); - }, - - fetchItemByIdentity: function(/* object */ keywordArgs){ - if(keywordArgs.identity == this.root.id){ - var scope = keywordArgs.scope || kernel.global; - if(keywordArgs.onItem){ - keywordArgs.onItem.call(scope, this.root); - } - }else{ - this.inherited(arguments); - } - }, - - getIdentity: function(/* item */ item){ - return (item === this.root) ? this.root.id : this.inherited(arguments); - }, - - getLabel: function(/* item */ item){ - return (item === this.root) ? this.root.label : this.inherited(arguments); - }, - - // ======================================================================= - // Write interface - - newItem: function(/* dijit/tree/dndSource.__Item */ args, /*Item*/ parent, /*int?*/ insertIndex){ - // summary: - // Creates a new item. See dojo/data/api/Write for details on args. - // Used in drag & drop when item from external source dropped onto tree. - if(parent === this.root){ - this.onNewRootItem(args); - return this.store.newItem(args); - }else{ - return this.inherited(arguments); - } - }, - - onNewRootItem: function(/* dijit/tree/dndSource.__Item */ /*===== args =====*/){ - // summary: - // User can override this method to modify a new element that's being - // added to the root of the tree, for example to add a flag like root=true - }, - - pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){ - // summary: - // Move or copy an item from one parent item to another. - // Used in drag & drop - if(oldParentItem === this.root){ - if(!bCopy){ - // It's onLeaveRoot()'s responsibility to modify the item so it no longer matches - // this.query... thus triggering an onChildrenChange() event to notify the Tree - // that this element is no longer a child of the root node - this.onLeaveRoot(childItem); - } - } - this.inherited(arguments, [childItem, - oldParentItem === this.root ? null : oldParentItem, - newParentItem === this.root ? null : newParentItem, - bCopy, - insertIndex - ]); - if(newParentItem === this.root){ - // It's onAddToRoot()'s responsibility to modify the item so it matches - // this.query... thus triggering an onChildrenChange() event to notify the Tree - // that this element is now a child of the root node - this.onAddToRoot(childItem); - } - }, - - // ======================================================================= - // Handling for top level children - - onAddToRoot: function(/* item */ item){ - // summary: - // Called when item added to root of tree; user must override this method - // to modify the item so that it matches the query for top level items - // example: - // | store.setValue(item, "root", true); - // tags: - // extension - console.log(this, ": item ", item, " added to root"); - }, - - onLeaveRoot: function(/* item */ item){ - // summary: - // Called when item removed from root of tree; user must override this method - // to modify the item so it doesn't match the query for top level items - // example: - // | store.unsetAttribute(item, "root"); - // tags: - // extension - console.log(this, ": item ", item, " removed from root"); - }, - - // ======================================================================= - // Events from data store - - _requeryTop: function(){ - // reruns the query for the children of the root node, - // sending out an onSet notification if those children have changed - var oldChildren = this.root.children || []; - this.store.fetch({ - query: this.query, - onComplete: lang.hitch(this, function(newChildren){ - this.root.children = newChildren; - - // If the list of children or the order of children has changed... - if(oldChildren.length != newChildren.length || - array.some(oldChildren, function(item, idx){ return newChildren[idx] != item;})){ - this.onChildrenChange(this.root, newChildren); - } - }) - }); - }, - - onNewItem: function(/* dojo/data/api/Item */ item, /* Object */ parentInfo){ - // summary: - // Handler for when new items appear in the store. Developers should override this - // method to be more efficient based on their app/data. - // description: - // Note that the default implementation requeries the top level items every time - // a new item is created, since any new item could be a top level item (even in - // addition to being a child of another item, since items can have multiple parents). - // - // If developers can detect which items are possible top level items (based on the item and the - // parentInfo parameters), they should override this method to only call _requeryTop() for top - // level items. Often all top level items have parentInfo==null, but - // that will depend on which store you use and what your data is like. - // tags: - // extension - this._requeryTop(); - - this.inherited(arguments); - }, - - onDeleteItem: function(/*Object*/ item){ - // summary: - // Handler for delete notifications from underlying store - - // check if this was a child of root, and if so send notification that root's children - // have changed - if(array.indexOf(this.root.children, item) != -1){ - this._requeryTop(); - } - - this.inherited(arguments); - }, - - onSetItem: function(/* item */ item, - /* attribute-name-string */ attribute, - /* Object|Array */ oldValue, - /* Object|Array */ newValue){ - // summary: - // Updates the tree view according to changes to an item in the data store. - // Developers should override this method to be more efficient based on their app/data. - // description: - // Handles updates to an item's children by calling onChildrenChange(), and - // other updates to an item by calling onChange(). - // - // Also, any change to any item re-executes the query for the tree's top-level items, - // since this modified item may have started/stopped matching the query for top level items. - // - // If possible, developers should override this function to only call _requeryTop() when - // the change to the item has caused it to stop/start being a top level item in the tree. - // tags: - // extension - - this._requeryTop(); - this.inherited(arguments); - } - -}); - -}); diff --git a/lib/dijit/tree/ObjectStoreModel.js.uncompressed.js b/lib/dijit/tree/ObjectStoreModel.js.uncompressed.js deleted file mode 100644 index 901f85f1b..000000000 --- a/lib/dijit/tree/ObjectStoreModel.js.uncompressed.js +++ /dev/null @@ -1,250 +0,0 @@ -define("dijit/tree/ObjectStoreModel", [ - "dojo/_base/array", // array.filter array.forEach array.indexOf array.some - "dojo/aspect", // aspect.before, aspect.after - "dojo/_base/declare", // declare - "dojo/_base/lang", // lang.hitch - "dojo/when" -], function(array, aspect, declare, lang, when){ - - // module: - // dijit/tree/ObjectStoreModel - - return declare("dijit.tree.ObjectStoreModel", null, { - // summary: - // Implements dijit/tree/model connecting dijit/Tree to a dojo/store/api/Store that implements - // getChildren(). - // - // If getChildren() returns an array with an observe() method, then it will be leveraged to reflect - // store updates to the tree. So, this class will work best when: - // - // 1. the store implements dojo/store/Observable - // 2. getChildren() is implemented as a query to the server (i.e. it calls store.query()) - // - // Drag and Drop: To support drag and drop, besides implementing getChildren() - // and dojo/store/Observable, the store must support the parent option to put(). - // And in order to have child elements ordered according to how the user dropped them, - // put() must support the before option. - - // store: dojo/store/api/Store - // Underlying store - store: null, - - // labelAttr: String - // Get label for tree node from this attribute - labelAttr: "name", - - // root: [readonly] Object - // Pointer to the root item from the dojo/store/api/Store (read only, not a parameter) - root: null, - - // query: anything - // Specifies datastore query to return the root item for the tree. - // Must only return a single item. Alternately can just pass in pointer - // to root item. - // example: - // | {id:'ROOT'} - query: null, - - constructor: function(/* Object */ args){ - // summary: - // Passed the arguments listed above (store, etc) - // tags: - // private - - lang.mixin(this, args); - - this.childrenCache = {}; // map from id to array of children - }, - - destroy: function(){ - // TODO: should cancel any in-progress processing of getRoot(), getChildren() - for(var id in this.childrenCache){ - this.childrenCache[id].close && this.childrenCache[id].close(); - } - }, - - // ======================================================================= - // Methods for traversing hierarchy - - getRoot: function(onItem, onError){ - // summary: - // Calls onItem with the root item for the tree, possibly a fabricated item. - // Calls onError on error. - if(this.root){ - onItem(this.root); - }else{ - var res; - when(res = this.store.query(this.query), - lang.hitch(this, function(items){ - //console.log("queried root: ", res); - if(items.length != 1){ - throw new Error("dijit.tree.ObjectStoreModel: root query returned " + items.length + - " items, but must return exactly one"); - } - this.root = items[0]; - onItem(this.root); - - // Setup listener to detect if root item changes - if(res.observe){ - res.observe(lang.hitch(this, function(obj){ - // Presumably removedFrom == insertedInto == 1, and this call indicates item has changed. - //console.log("root changed: ", obj); - this.onChange(obj); - }), true); // true to listen for updates to obj - } - }), - onError - ); - } - }, - - mayHaveChildren: function(/*===== item =====*/){ - // summary: - // Tells if an item has or may have children. Implementing logic here - // avoids showing +/- expando icon for nodes that we know don't have children. - // (For efficiency reasons we may not want to check if an element actually - // has children until user clicks the expando node). - // - // Application code should override this method based on the data, for example - // it could be `return item.leaf == true;`. - // item: Object - // Item from the dojo/store - return true; - }, - - getChildren: function(/*Object*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){ - // summary: - // Calls onComplete() with array of child items of given parent item. - // parentItem: - // Item from the dojo/store - - var id = this.store.getIdentity(parentItem); - if(this.childrenCache[id]){ - when(this.childrenCache[id], onComplete, onError); - return; - } - - var res = this.childrenCache[id] = this.store.getChildren(parentItem); - - // User callback - when(res, onComplete, onError); - - // Setup listener in case children list changes, or the item(s) in the children list are - // updated in some way. - if(res.observe){ - res.observe(lang.hitch(this, function(obj, removedFrom, insertedInto){ - //console.log("observe on children of ", id, ": ", obj, removedFrom, insertedInto); - - // If removedFrom == insertedInto, this call indicates that the item has changed. - // Even if removedFrom != insertedInto, the item may have changed. - this.onChange(obj); - - if(removedFrom != insertedInto){ - // Indicates an item was added, removed, or re-parented. The children[] array (returned from - // res.then(...)) has already been updated (like a live collection), so just use it. - when(res, lang.hitch(this, "onChildrenChange", parentItem)); - } - }), true); // true means to notify on item changes - } - }, - - // ======================================================================= - // Inspecting items - - isItem: function(/*===== something =====*/){ - return true; // Boolean - }, - - fetchItemByIdentity: function(/* object */ keywordArgs){ - this.store.get(keywordArgs.identity).then( - lang.hitch(keywordArgs.scope, keywordArgs.onItem), - lang.hitch(keywordArgs.scope, keywordArgs.onError) - ); - }, - - getIdentity: function(/* item */ item){ - return this.store.getIdentity(item); // Object - }, - - getLabel: function(/*dojo/data/Item*/ item){ - // summary: - // Get the label for an item - return item[this.labelAttr]; // String - }, - - // ======================================================================= - // Write interface, for DnD - - newItem: function(/* dijit/tree/dndSource.__Item */ args, /*Item*/ parent, /*int?*/ insertIndex, /*Item*/ before){ - // summary: - // Creates a new item. See `dojo/data/api/Write` for details on args. - // Used in drag & drop when item from external source dropped onto tree. - - return this.store.put(args, { - parent: parent, - before: before - }); - }, - - pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, - /*Boolean*/ bCopy, /*int?*/ insertIndex, /*Item*/ before){ - // summary: - // Move or copy an item from one parent item to another. - // Used in drag & drop - - if(!bCopy){ - // In order for DnD moves to work correctly, childItem needs to be orphaned from oldParentItem - // before being adopted by newParentItem. That way, the TreeNode is moved rather than - // an additional TreeNode being created, and the old TreeNode subsequently being deleted. - // The latter loses information such as selection and opened/closed children TreeNodes. - // Unfortunately simply calling this.store.put() will send notifications in a random order, based - // on when the TreeNodes in question originally appeared, and not based on the drag-from - // TreeNode vs. the drop-onto TreeNode. - - var oldParentChildren = [].concat(this.childrenCache[this.getIdentity(oldParentItem)]), // concat to make copy - index = array.indexOf(oldParentChildren, childItem); - oldParentChildren.splice(index, 1); - this.onChildrenChange(oldParentItem, oldParentChildren); - } - - return this.store.put(childItem, { - overwrite: true, - parent: newParentItem, - before: before - }); - }, - - // ======================================================================= - // Callbacks - - onChange: function(/*dojo/data/Item*/ /*===== item =====*/){ - // summary: - // Callback whenever an item has changed, so that Tree - // can update the label, icon, etc. Note that changes - // to an item's children or parent(s) will trigger an - // onChildrenChange() so you can ignore those changes here. - // tags: - // callback - }, - - onChildrenChange: function(/*===== parent, newChildrenList =====*/){ - // summary: - // Callback to do notifications about new, updated, or deleted items. - // parent: dojo/data/Item - // newChildrenList: Object[] - // Items from the store - // tags: - // callback - }, - - onDelete: function(/*dojo/data/Item*/ /*===== item =====*/){ - // summary: - // Callback when an item has been deleted. - // Actually we have no way of knowing this with the new dojo.store API, - // so this method is never called (but it's left here since Tree connects - // to it). - // tags: - // callback - } - }); -}); diff --git a/lib/dijit/tree/TreeStoreModel.js.uncompressed.js b/lib/dijit/tree/TreeStoreModel.js.uncompressed.js deleted file mode 100644 index 307de04cb..000000000 --- a/lib/dijit/tree/TreeStoreModel.js.uncompressed.js +++ /dev/null @@ -1,379 +0,0 @@ -define("dijit/tree/TreeStoreModel", [ - "dojo/_base/array", // array.filter array.forEach array.indexOf array.some - "dojo/aspect", // aspect.after - "dojo/_base/declare", // declare - "dojo/_base/lang" // lang.hitch -], function(array, aspect, declare, lang){ - - // module: - // dijit/tree/TreeStoreModel - - return declare("dijit.tree.TreeStoreModel", null, { - // summary: - // Implements dijit/Tree/model connecting to a dojo.data store with a single - // root item. Any methods passed into the constructor will override - // the ones defined here. - - // store: dojo/data/api/Read - // Underlying store - store: null, - - // childrenAttrs: String[] - // One or more attribute names (attributes in the dojo.data item) that specify that item's children - childrenAttrs: ["children"], - - // newItemIdAttr: String - // Name of attribute in the Object passed to newItem() that specifies the id. - // - // If newItemIdAttr is set then it's used when newItem() is called to see if an - // item with the same id already exists, and if so just links to the old item - // (so that the old item ends up with two parents). - // - // Setting this to null or "" will make every drop create a new item. - newItemIdAttr: "id", - - // labelAttr: String - // If specified, get label for tree node from this attribute, rather - // than by calling store.getLabel() - labelAttr: "", - - // root: [readonly] dojo/data/Item - // Pointer to the root item (read only, not a parameter) - root: null, - - // query: anything - // Specifies datastore query to return the root item for the tree. - // Must only return a single item. Alternately can just pass in pointer - // to root item. - // example: - // | {id:'ROOT'} - query: null, - - // deferItemLoadingUntilExpand: Boolean - // Setting this to true will cause the TreeStoreModel to defer calling loadItem on nodes - // until they are expanded. This allows for lazying loading where only one - // loadItem (and generally one network call, consequently) per expansion - // (rather than one for each child). - // This relies on partial loading of the children items; each children item of a - // fully loaded item should contain the label and info about having children. - deferItemLoadingUntilExpand: false, - - constructor: function(/* Object */ args){ - // summary: - // Passed the arguments listed above (store, etc) - // tags: - // private - - lang.mixin(this, args); - - this.connects = []; - - var store = this.store; - if(!store.getFeatures()['dojo.data.api.Identity']){ - throw new Error("dijit.tree.TreeStoreModel: store must support dojo.data.Identity"); - } - - // if the store supports Notification, subscribe to the notification events - if(store.getFeatures()['dojo.data.api.Notification']){ - this.connects = this.connects.concat([ - aspect.after(store, "onNew", lang.hitch(this, "onNewItem"), true), - aspect.after(store, "onDelete", lang.hitch(this, "onDeleteItem"), true), - aspect.after(store, "onSet", lang.hitch(this, "onSetItem"), true) - ]); - } - }, - - destroy: function(){ - var h; - while(h = this.connects.pop()){ h.remove(); } - // TODO: should cancel any in-progress processing of getRoot(), getChildren() - }, - - // ======================================================================= - // Methods for traversing hierarchy - - getRoot: function(onItem, onError){ - // summary: - // Calls onItem with the root item for the tree, possibly a fabricated item. - // Calls onError on error. - if(this.root){ - onItem(this.root); - }else{ - this.store.fetch({ - query: this.query, - onComplete: lang.hitch(this, function(items){ - if(items.length != 1){ - throw new Error("dijit.tree.TreeStoreModel: root query returned " + items.length + - " items, but must return exactly one"); - } - this.root = items[0]; - onItem(this.root); - }), - onError: onError - }); - } - }, - - mayHaveChildren: function(/*dojo/data/Item*/ item){ - // summary: - // Tells if an item has or may have children. Implementing logic here - // avoids showing +/- expando icon for nodes that we know don't have children. - // (For efficiency reasons we may not want to check if an element actually - // has children until user clicks the expando node) - return array.some(this.childrenAttrs, function(attr){ - return this.store.hasAttribute(item, attr); - }, this); - }, - - getChildren: function(/*dojo/data/Item*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){ - // summary: - // Calls onComplete() with array of child items of given parent item, all loaded. - - var store = this.store; - if(!store.isItemLoaded(parentItem)){ - // The parent is not loaded yet, we must be in deferItemLoadingUntilExpand - // mode, so we will load it and just return the children (without loading each - // child item) - var getChildren = lang.hitch(this, arguments.callee); - store.loadItem({ - item: parentItem, - onItem: function(parentItem){ - getChildren(parentItem, onComplete, onError); - }, - onError: onError - }); - return; - } - // get children of specified item - var childItems = []; - for(var i=0; i<this.childrenAttrs.length; i++){ - var vals = store.getValues(parentItem, this.childrenAttrs[i]); - childItems = childItems.concat(vals); - } - - // count how many items need to be loaded - var _waitCount = 0; - if(!this.deferItemLoadingUntilExpand){ - array.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } }); - } - - if(_waitCount == 0){ - // all items are already loaded (or we aren't loading them). proceed... - onComplete(childItems); - }else{ - // still waiting for some or all of the items to load - array.forEach(childItems, function(item, idx){ - if(!store.isItemLoaded(item)){ - store.loadItem({ - item: item, - onItem: function(item){ - childItems[idx] = item; - if(--_waitCount == 0){ - // all nodes have been loaded, send them to the tree - onComplete(childItems); - } - }, - onError: onError - }); - } - }); - } - }, - - // ======================================================================= - // Inspecting items - - isItem: function(/* anything */ something){ - return this.store.isItem(something); // Boolean - }, - - fetchItemByIdentity: function(/* object */ keywordArgs){ - this.store.fetchItemByIdentity(keywordArgs); - }, - - getIdentity: function(/* item */ item){ - return this.store.getIdentity(item); // Object - }, - - getLabel: function(/*dojo/data/Item*/ item){ - // summary: - // Get the label for an item - if(this.labelAttr){ - return this.store.getValue(item,this.labelAttr); // String - }else{ - return this.store.getLabel(item); // String - } - }, - - // ======================================================================= - // Write interface - - newItem: function(/* dijit/tree/dndSource.__Item */ args, /*dojo/data/api/Item*/ parent, /*int?*/ insertIndex){ - // summary: - // Creates a new item. See `dojo/data/api/Write` for details on args. - // Used in drag & drop when item from external source dropped onto tree. - // description: - // Developers will need to override this method if new items get added - // to parents with multiple children attributes, in order to define which - // children attribute points to the new item. - - var pInfo = {parent: parent, attribute: this.childrenAttrs[0]}, LnewItem; - - if(this.newItemIdAttr && args[this.newItemIdAttr]){ - // Maybe there's already a corresponding item in the store; if so, reuse it. - this.fetchItemByIdentity({identity: args[this.newItemIdAttr], scope: this, onItem: function(item){ - if(item){ - // There's already a matching item in store, use it - this.pasteItem(item, null, parent, true, insertIndex); - }else{ - // Create new item in the tree, based on the drag source. - LnewItem=this.store.newItem(args, pInfo); - if(LnewItem && (insertIndex!=undefined)){ - // Move new item to desired position - this.pasteItem(LnewItem, parent, parent, false, insertIndex); - } - } - }}); - }else{ - // [as far as we know] there is no id so we must assume this is a new item - LnewItem=this.store.newItem(args, pInfo); - if(LnewItem && (insertIndex!=undefined)){ - // Move new item to desired position - this.pasteItem(LnewItem, parent, parent, false, insertIndex); - } - } - }, - - pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){ - // summary: - // Move or copy an item from one parent item to another. - // Used in drag & drop - var store = this.store, - parentAttr = this.childrenAttrs[0]; // name of "children" attr in parent item - - // remove child from source item, and record the attribute that child occurred in - if(oldParentItem){ - array.forEach(this.childrenAttrs, function(attr){ - if(store.containsValue(oldParentItem, attr, childItem)){ - if(!bCopy){ - var values = array.filter(store.getValues(oldParentItem, attr), function(x){ - return x != childItem; - }); - store.setValues(oldParentItem, attr, values); - } - parentAttr = attr; - } - }); - } - - // modify target item's children attribute to include this item - if(newParentItem){ - if(typeof insertIndex == "number"){ - // call slice() to avoid modifying the original array, confusing the data store - var childItems = store.getValues(newParentItem, parentAttr).slice(); - childItems.splice(insertIndex, 0, childItem); - store.setValues(newParentItem, parentAttr, childItems); - }else{ - store.setValues(newParentItem, parentAttr, - store.getValues(newParentItem, parentAttr).concat(childItem)); - } - } - }, - - // ======================================================================= - // Callbacks - - onChange: function(/*dojo/data/Item*/ /*===== item =====*/){ - // summary: - // Callback whenever an item has changed, so that Tree - // can update the label, icon, etc. Note that changes - // to an item's children or parent(s) will trigger an - // onChildrenChange() so you can ignore those changes here. - // tags: - // callback - }, - - onChildrenChange: function(/*===== parent, newChildrenList =====*/){ - // summary: - // Callback to do notifications about new, updated, or deleted items. - // parent: dojo/data/Item - // newChildrenList: dojo/data/Item[] - // tags: - // callback - }, - - onDelete: function(/*dojo/data/Item*/ /*===== item =====*/){ - // summary: - // Callback when an item has been deleted. - // description: - // Note that there will also be an onChildrenChange() callback for the parent - // of this item. - // tags: - // callback - }, - - // ======================================================================= - // Events from data store - - onNewItem: function(/* dojo/data/Item */ item, /* Object */ parentInfo){ - // summary: - // Handler for when new items appear in the store, either from a drop operation - // or some other way. Updates the tree view (if necessary). - // description: - // If the new item is a child of an existing item, - // calls onChildrenChange() with the new list of children - // for that existing item. - // - // tags: - // extension - - // We only care about the new item if it has a parent that corresponds to a TreeNode - // we are currently displaying - if(!parentInfo){ - return; - } - - // Call onChildrenChange() on parent (ie, existing) item with new list of children - // In the common case, the new list of children is simply parentInfo.newValue or - // [ parentInfo.newValue ], although if items in the store has multiple - // child attributes (see `childrenAttr`), then it's a superset of parentInfo.newValue, - // so call getChildren() to be sure to get right answer. - this.getChildren(parentInfo.item, lang.hitch(this, function(children){ - this.onChildrenChange(parentInfo.item, children); - })); - }, - - onDeleteItem: function(/*Object*/ item){ - // summary: - // Handler for delete notifications from underlying store - this.onDelete(item); - }, - - onSetItem: function(item, attribute /*===== , oldValue, newValue =====*/){ - // summary: - // Updates the tree view according to changes in the data store. - // description: - // Handles updates to an item's children by calling onChildrenChange(), and - // other updates to an item by calling onChange(). - // - // See `onNewItem` for more details on handling updates to an item's children. - // item: Item - // attribute: attribute-name-string - // oldValue: Object|Array - // newValue: Object|Array - // tags: - // extension - - if(array.indexOf(this.childrenAttrs, attribute) != -1){ - // item's children list changed - this.getChildren(item, lang.hitch(this, function(children){ - // See comments in onNewItem() about calling getChildren() - this.onChildrenChange(item, children); - })); - }else{ - // item's label/icon/etc. changed. - this.onChange(item); - } - } - }); -}); diff --git a/lib/dijit/tree/_dndContainer.js.uncompressed.js b/lib/dijit/tree/_dndContainer.js.uncompressed.js deleted file mode 100644 index c4ad84d01..000000000 --- a/lib/dijit/tree/_dndContainer.js.uncompressed.js +++ /dev/null @@ -1,165 +0,0 @@ -define("dijit/tree/_dndContainer", [ - "dojo/aspect", // aspect.after - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add domClass.remove domClass.replace - "dojo/_base/event", // event.stop - "dojo/_base/lang", // lang.mixin lang.hitch - "dojo/on", - "dojo/touch" -], function(aspect, declare,domClass, event, lang, on, touch){ - - // module: - // dijit/tree/_dndContainer - - /*===== - var __Args = { - // summary: - // A dict of parameters for Tree source configuration. - // isSource: Boolean? - // Can be used as a DnD source. Defaults to true. - // accept: String[] - // List of accepted types (text strings) for a target; defaults to - // ["text", "treeNode"] - // copyOnly: Boolean? - // Copy items, if true, use a state of Ctrl key otherwise, - // dragThreshold: Number - // The move delay in pixels before detecting a drag; 0 by default - // betweenThreshold: Integer - // Distance from upper/lower edge of node to allow drop to reorder nodes - }; - =====*/ - - return declare("dijit.tree._dndContainer", null, { - - // summary: - // This is a base class for `dijit/tree/_dndSelector`, and isn't meant to be used directly. - // It's modeled after `dojo/dnd/Container`. - // tags: - // protected - - /*===== - // current: DomNode - // The currently hovered TreeNode.rowNode (which is the DOM node - // associated w/a given node in the tree, excluding it's descendants) - current: null, - =====*/ - - constructor: function(tree, params){ - // summary: - // A constructor of the Container - // tree: Node - // Node or node's id to build the container on - // params: __Args - // A dict of parameters, which gets mixed into the object - // tags: - // private - this.tree = tree; - this.node = tree.domNode; // TODO: rename; it's not a TreeNode but the whole Tree - lang.mixin(this, params); - - // class-specific variables - this.current = null; // current TreeNode's DOM node - - // states - this.containerState = ""; - domClass.add(this.node, "dojoDndContainer"); - - // set up events - this.events = [ - // Mouse (or touch) enter/leave on Tree itself - on(this.node, touch.enter, lang.hitch(this, "onOverEvent")), - on(this.node, touch.leave, lang.hitch(this, "onOutEvent")), - - // switching between TreeNodes - aspect.after(this.tree, "_onNodeMouseEnter", lang.hitch(this, "onMouseOver"), true), - aspect.after(this.tree, "_onNodeMouseLeave", lang.hitch(this, "onMouseOut"), true), - - // cancel text selection and text dragging - on(this.node, "dragstart", lang.hitch(event, "stop")), - on(this.node, "selectstart", lang.hitch(event, "stop")) - ]; - }, - - destroy: function(){ - // summary: - // Prepares this object to be garbage-collected - - var h; - while(h = this.events.pop()){ h.remove(); } - - // this.clearItems(); - this.node = this.parent = null; - }, - - // mouse events - onMouseOver: function(widget /*===== , evt =====*/){ - // summary: - // Called when mouse is moved over a TreeNode - // widget: TreeNode - // evt: Event - // tags: - // protected - this.current = widget; - }, - - onMouseOut: function(/*===== widget, evt =====*/){ - // summary: - // Called when mouse is moved away from a TreeNode - // widget: TreeNode - // evt: Event - // tags: - // protected - this.current = null; - }, - - _changeState: function(type, newState){ - // summary: - // Changes a named state to new state value - // type: String - // A name of the state to change - // newState: String - // new state - var prefix = "dojoDnd" + type; - var state = type.toLowerCase() + "State"; - //domClass.replace(this.node, prefix + newState, prefix + this[state]); - domClass.replace(this.node, prefix + newState, prefix + this[state]); - this[state] = newState; - }, - - _addItemClass: function(node, type){ - // summary: - // Adds a class with prefix "dojoDndItem" - // node: Node - // A node - // type: String - // A variable suffix for a class name - domClass.add(node, "dojoDndItem" + type); - }, - - _removeItemClass: function(node, type){ - // summary: - // Removes a class with prefix "dojoDndItem" - // node: Node - // A node - // type: String - // A variable suffix for a class name - domClass.remove(node, "dojoDndItem" + type); - }, - - onOverEvent: function(){ - // summary: - // This function is called once, when mouse is over our container - // tags: - // protected - this._changeState("Container", "Over"); - }, - - onOutEvent: function(){ - // summary: - // This function is called once, when mouse is out of our container - // tags: - // protected - this._changeState("Container", ""); - } - }); -}); diff --git a/lib/dijit/tree/_dndSelector.js.uncompressed.js b/lib/dijit/tree/_dndSelector.js.uncompressed.js deleted file mode 100644 index 82423fb20..000000000 --- a/lib/dijit/tree/_dndSelector.js.uncompressed.js +++ /dev/null @@ -1,356 +0,0 @@ -define("dijit/tree/_dndSelector", [ - "dojo/_base/array", // array.filter array.forEach array.map - "dojo/_base/connect", // connect.isCopyKey - "dojo/_base/declare", // declare - "dojo/_base/Deferred", // Deferred - "dojo/_base/kernel", // global - "dojo/_base/lang", // lang.hitch - "dojo/cookie", // cookie - "dojo/mouse", // mouse.isLeft - "dojo/on", - "dojo/touch", - "./_dndContainer" -], function(array, connect, declare, Deferred, kernel, lang, cookie, mouse, on, touch, _dndContainer){ - - // module: - // dijit/tree/_dndSelector - - - return declare("dijit.tree._dndSelector", _dndContainer, { - // summary: - // This is a base class for `dijit/tree/dndSource` , and isn't meant to be used directly. - // It's based on `dojo/dnd/Selector`. - // tags: - // protected - - /*===== - // selection: Object - // (id to DomNode) map for every TreeNode that's currently selected. - // The DOMNode is the TreeNode.rowNode. - selection: {}, - =====*/ - - constructor: function(){ - // summary: - // Initialization - // tags: - // private - - this.selection={}; - this.anchor = null; - - if(!this.cookieName && this.tree.id){ - this.cookieName = this.tree.id + "SaveSelectedCookie"; - } - - this.events.push( - on(this.tree.domNode, touch.press, lang.hitch(this,"onMouseDown")), - on(this.tree.domNode, touch.release, lang.hitch(this,"onMouseUp")), - on(this.tree.domNode, touch.move, lang.hitch(this,"onMouseMove")) - ); - }, - - // singular: Boolean - // Allows selection of only one element, if true. - // Tree hasn't been tested in singular=true mode, unclear if it works. - singular: false, - - // methods - getSelectedTreeNodes: function(){ - // summary: - // Returns a list of selected node(s). - // Used by dndSource on the start of a drag. - // tags: - // protected - var nodes=[], sel = this.selection; - for(var i in sel){ - nodes.push(sel[i]); - } - return nodes; - }, - - selectNone: function(){ - // summary: - // Unselects all items - // tags: - // private - - this.setSelection([]); - return this; // self - }, - - destroy: function(){ - // summary: - // Prepares the object to be garbage-collected - this.inherited(arguments); - this.selection = this.anchor = null; - }, - addTreeNode: function(/*dijit/Tree._TreeNode*/ node, /*Boolean?*/isAnchor){ - // summary: - // add node to current selection - // node: Node - // node to add - // isAnchor: Boolean - // Whether the node should become anchor. - - this.setSelection(this.getSelectedTreeNodes().concat( [node] )); - if(isAnchor){ this.anchor = node; } - return node; - }, - removeTreeNode: function(/*dijit/Tree._TreeNode*/ node){ - // summary: - // remove node from current selection - // node: Node - // node to remove - this.setSelection(this._setDifference(this.getSelectedTreeNodes(), [node])); - return node; - }, - isTreeNodeSelected: function(/*dijit/Tree._TreeNode*/ node){ - // summary: - // return true if node is currently selected - // node: Node - // the node to check whether it's in the current selection - - return node.id && !!this.selection[node.id]; - }, - setSelection: function(/*dijit/Tree._TreeNode[]*/ newSelection){ - // summary: - // set the list of selected nodes to be exactly newSelection. All changes to the - // selection should be passed through this function, which ensures that derived - // attributes are kept up to date. Anchor will be deleted if it has been removed - // from the selection, but no new anchor will be added by this function. - // newSelection: Node[] - // list of tree nodes to make selected - var oldSelection = this.getSelectedTreeNodes(); - array.forEach(this._setDifference(oldSelection, newSelection), lang.hitch(this, function(node){ - node.setSelected(false); - if(this.anchor == node){ - delete this.anchor; - } - delete this.selection[node.id]; - })); - array.forEach(this._setDifference(newSelection, oldSelection), lang.hitch(this, function(node){ - node.setSelected(true); - this.selection[node.id] = node; - })); - this._updateSelectionProperties(); - }, - _setDifference: function(xs,ys){ - // summary: - // Returns a copy of xs which lacks any objects - // occurring in ys. Checks for membership by - // modifying and then reading the object, so it will - // not properly handle sets of numbers or strings. - - array.forEach(ys, function(y){ y.__exclude__ = true; }); - var ret = array.filter(xs, function(x){ return !x.__exclude__; }); - - // clean up after ourselves. - array.forEach(ys, function(y){ delete y['__exclude__'] }); - return ret; - }, - _updateSelectionProperties: function(){ - // summary: - // Update the following tree properties from the current selection: - // path[s], selectedItem[s], selectedNode[s] - - var selected = this.getSelectedTreeNodes(); - var paths = [], nodes = [], selects = []; - array.forEach(selected, function(node){ - var ary = node.getTreePath(), model = this.tree.model; - nodes.push(node); - paths.push(ary); - ary = array.map(ary, function(item){ - return model.getIdentity(item); - }, this); - selects.push(ary.join("/")) - }, this); - var items = array.map(nodes,function(node){ return node.item; }); - this.tree._set("paths", paths); - this.tree._set("path", paths[0] || []); - this.tree._set("selectedNodes", nodes); - this.tree._set("selectedNode", nodes[0] || null); - this.tree._set("selectedItems", items); - this.tree._set("selectedItem", items[0] || null); - if (this.tree.persist && selects.length > 0) { - cookie(this.cookieName, selects.join(","), {expires:365}); - } - }, - _getSavedPaths: function(){ - // summary: - // Returns paths of nodes that were selected previously and saved in the cookie. - - var tree = this.tree; - if(tree.persist && tree.dndController.cookieName){ - var oreo, paths = []; - oreo = cookie(tree.dndController.cookieName); - if(oreo){ - paths = array.map(oreo.split(","), function(path){ - return path.split("/"); - }) - } - return paths; - } - }, - // mouse events - onMouseDown: function(e){ - // summary: - // Event processor for onmousedown/ontouchstart - // e: Event - // onmousedown/ontouchstart event - // tags: - // protected - - // ignore click on expando node - if(!this.current || this.tree.isExpandoNode(e.target, this.current)){ return; } - - if(mouse.isLeft(e)){ - // Prevent text selection while dragging on desktop, see #16328. But don't call preventDefault() - // for mobile because it will break things completely, see #15838. - e.preventDefault(); - }else if(e.type != "touchstart"){ - // Ignore right click - return; - } - - var treeNode = this.current, - copy = connect.isCopyKey(e), id = treeNode.id; - - // if shift key is not pressed, and the node is already in the selection, - // delay deselection until onmouseup so in the case of DND, deselection - // will be canceled by onmousemove. - if(!this.singular && !e.shiftKey && this.selection[id]){ - this._doDeselect = true; - return; - }else{ - this._doDeselect = false; - } - this.userSelect(treeNode, copy, e.shiftKey); - }, - - onMouseUp: function(e){ - // summary: - // Event processor for onmouseup/ontouchend - // e: Event - // onmouseup/ontouchend event - // tags: - // protected - - // _doDeselect is the flag to indicate that the user wants to either ctrl+click on - // a already selected item (to deselect the item), or click on a not-yet selected item - // (which should remove all current selection, and add the clicked item). This can not - // be done in onMouseDown, because the user may start a drag after mousedown. By moving - // the deselection logic here, the user can drags an already selected item. - if(!this._doDeselect){ return; } - this._doDeselect = false; - this.userSelect(this.current, connect.isCopyKey(e), e.shiftKey); - }, - onMouseMove: function(/*===== e =====*/){ - // summary: - // event processor for onmousemove/ontouchmove - // e: Event - // onmousemove/ontouchmove event - this._doDeselect = false; - }, - - _compareNodes: function(n1, n2){ - if(n1 === n2){ - return 0; - } - - if('sourceIndex' in document.documentElement){ //IE - //TODO: does not yet work if n1 and/or n2 is a text node - return n1.sourceIndex - n2.sourceIndex; - }else if('compareDocumentPosition' in document.documentElement){ //FF, Opera - return n1.compareDocumentPosition(n2) & 2 ? 1: -1; - }else if(document.createRange){ //Webkit - var r1 = doc.createRange(); - r1.setStartBefore(n1); - - var r2 = doc.createRange(); - r2.setStartBefore(n2); - - return r1.compareBoundaryPoints(r1.END_TO_END, r2); - }else{ - throw Error("dijit.tree._compareNodes don't know how to compare two different nodes in this browser"); - } - }, - - userSelect: function(node, multi, range){ - // summary: - // Add or remove the given node from selection, responding - // to a user action such as a click or keypress. - // multi: Boolean - // Indicates whether this is meant to be a multi-select action (e.g. ctrl-click) - // range: Boolean - // Indicates whether this is meant to be a ranged action (e.g. shift-click) - // tags: - // protected - - if(this.singular){ - if(this.anchor == node && multi){ - this.selectNone(); - }else{ - this.setSelection([node]); - this.anchor = node; - } - }else{ - if(range && this.anchor){ - var cr = this._compareNodes(this.anchor.rowNode, node.rowNode), - begin, end, anchor = this.anchor; - - if(cr < 0){ //current is after anchor - begin = anchor; - end = node; - }else{ //current is before anchor - begin = node; - end = anchor; - } - var nodes = []; - //add everything betweeen begin and end inclusively - while(begin != end){ - nodes.push(begin); - begin = this.tree._getNextNode(begin); - } - nodes.push(end); - - this.setSelection(nodes); - }else{ - if( this.selection[ node.id ] && multi ){ - this.removeTreeNode( node ); - }else if(multi){ - this.addTreeNode(node, true); - }else{ - this.setSelection([node]); - this.anchor = node; - } - } - } - }, - - getItem: function(/*String*/ key){ - // summary: - // Returns the dojo/dnd/Container._Item (representing a dragged node) by it's key (id). - // Called by dojo/dnd/Source.checkAcceptance(). - // tags: - // protected - - var widget = this.selection[key]; - return { - data: widget, - type: ["treeNode"] - }; // dojo/dnd/Container._Item - }, - - forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){ - // summary: - // Iterates over selected items; - // see `dojo/dnd/Container.forInItems()` for details - o = o || kernel.global; - for(var id in this.selection){ - // console.log("selected item id: " + id); - f.call(o, this.getItem(id), id, this); - } - } - }); -}); diff --git a/lib/dijit/tree/dndSource.js.uncompressed.js b/lib/dijit/tree/dndSource.js.uncompressed.js deleted file mode 100644 index 2cd1b07ca..000000000 --- a/lib/dijit/tree/dndSource.js.uncompressed.js +++ /dev/null @@ -1,564 +0,0 @@ -define("dijit/tree/dndSource", [ - "dojo/_base/array", // array.forEach array.indexOf array.map - "dojo/_base/connect", // isCopyKey - "dojo/_base/declare", // declare - "dojo/dom-class", // domClass.add - "dojo/dom-geometry", // domGeometry.position - "dojo/_base/lang", // lang.mixin lang.hitch - "dojo/on", // subscribe - "dojo/touch", - "dojo/topic", - "dojo/dnd/Manager", // DNDManager.manager - "./_dndSelector" -], function(array, connect, declare, domClass, domGeometry, lang, on, touch, topic, DNDManager, _dndSelector){ - -// module: -// dijit/tree/dndSource -// summary: -// Handles drag and drop operations (as a source or a target) for `dijit.Tree` - -/*===== -var __Item = { - // summary: - // New item to be added to the Tree, like: - // id: Anything - id: "", - // name: String - name: "" -}; -=====*/ - -var dndSource = declare("dijit.tree.dndSource", _dndSelector, { - // summary: - // Handles drag and drop operations (as a source or a target) for `dijit.Tree` - - // isSource: Boolean - // Can be used as a DnD source. - isSource: true, - - // accept: String[] - // List of accepted types (text strings) for the Tree; defaults to - // ["text"] - accept: ["text", "treeNode"], - - // copyOnly: [private] Boolean - // Copy items, if true, use a state of Ctrl key otherwise - copyOnly: false, - - // dragThreshold: Number - // The move delay in pixels before detecting a drag; 5 by default - dragThreshold: 5, - - // betweenThreshold: Integer - // Distance from upper/lower edge of node to allow drop to reorder nodes - betweenThreshold: 0, - - // Flag used by Avatar.js to signal to generate text node when dragging - generateText: true, - - constructor: function(/*dijit/Tree*/ tree, /*dijit/tree/dndSource*/ params){ - // summary: - // a constructor of the Tree DnD Source - // tags: - // private - if(!params){ params = {}; } - lang.mixin(this, params); - var type = params.accept instanceof Array ? params.accept : ["text", "treeNode"]; - this.accept = null; - if(type.length){ - this.accept = {}; - for(var i = 0; i < type.length; ++i){ - this.accept[type[i]] = 1; - } - } - - // class-specific variables - this.isDragging = false; - this.mouseDown = false; - this.targetAnchor = null; // DOMNode corresponding to the currently moused over TreeNode - this.targetBox = null; // coordinates of this.targetAnchor - this.dropPosition = ""; // whether mouse is over/after/before this.targetAnchor - this._lastX = 0; - this._lastY = 0; - - // states - this.sourceState = ""; - if(this.isSource){ - domClass.add(this.node, "dojoDndSource"); - } - this.targetState = ""; - if(this.accept){ - domClass.add(this.node, "dojoDndTarget"); - } - - // set up events - this.topics = [ - topic.subscribe("/dnd/source/over", lang.hitch(this, "onDndSourceOver")), - topic.subscribe("/dnd/start", lang.hitch(this, "onDndStart")), - topic.subscribe("/dnd/drop", lang.hitch(this, "onDndDrop")), - topic.subscribe("/dnd/cancel", lang.hitch(this, "onDndCancel")) - ]; - }, - - // methods - checkAcceptance: function(/*===== source, nodes =====*/){ - // summary: - // Checks if the target can accept nodes from this source - // source: dijit/tree/dndSource - // The source which provides items - // nodes: DOMNode[] - // Array of DOM nodes corresponding to nodes being dropped, dijitTreeRow nodes if - // source is a dijit/Tree. - // tags: - // extension - return true; // Boolean - }, - - copyState: function(keyPressed){ - // summary: - // Returns true, if we need to copy items, false to move. - // It is separated to be overwritten dynamically, if needed. - // keyPressed: Boolean - // The "copy" control key was pressed - // tags: - // protected - return this.copyOnly || keyPressed; // Boolean - }, - destroy: function(){ - // summary: - // Prepares the object to be garbage-collected. - this.inherited(arguments); - var h; - while(h = this.topics.pop()){ h.remove(); } - this.targetAnchor = null; - }, - - _onDragMouse: function(e, firstTime){ - // summary: - // Helper method for processing onmousemove/onmouseover events while drag is in progress. - // Keeps track of current drop target. - // e: Event - // The mousemove event. - // firstTime: Boolean? - // If this flag is set, this is the first mouse move event of the drag, so call m.canDrop() etc. - // even if newTarget == null because the user quickly dragged a node in the Tree to a position - // over Tree.containerNode but not over any TreeNode (#7971) - - var m = DNDManager.manager(), - oldTarget = this.targetAnchor, // the TreeNode corresponding to TreeNode mouse was previously over - newTarget = this.current, // TreeNode corresponding to TreeNode mouse is currently over - oldDropPosition = this.dropPosition; // the previous drop position (over/before/after) - - // calculate if user is indicating to drop the dragged node before, after, or over - // (i.e., to become a child of) the target node - var newDropPosition = "Over"; - if(newTarget && this.betweenThreshold > 0){ - // If mouse is over a new TreeNode, then get new TreeNode's position and size - if(!this.targetBox || oldTarget != newTarget){ - this.targetBox = domGeometry.position(newTarget.rowNode, true); - } - if((e.pageY - this.targetBox.y) <= this.betweenThreshold){ - newDropPosition = "Before"; - }else if((e.pageY - this.targetBox.y) >= (this.targetBox.h - this.betweenThreshold)){ - newDropPosition = "After"; - } - } - - if(firstTime || newTarget != oldTarget || newDropPosition != oldDropPosition){ - if(oldTarget){ - this._removeItemClass(oldTarget.rowNode, oldDropPosition); - } - if(newTarget){ - this._addItemClass(newTarget.rowNode, newDropPosition); - } - - // Check if it's ok to drop the dragged node on/before/after the target node. - if(!newTarget){ - m.canDrop(false); - }else if(newTarget == this.tree.rootNode && newDropPosition != "Over"){ - // Can't drop before or after tree's root node; the dropped node would just disappear (at least visually) - m.canDrop(false); - }else{ - // Guard against dropping onto yourself (TODO: guard against dropping onto your descendant, #7140) - var sameId = false; - if(m.source == this){ - for(var dragId in this.selection){ - var dragNode = this.selection[dragId]; - if(dragNode.item === newTarget.item){ - sameId = true; - break; - } - } - } - if(sameId){ - m.canDrop(false); - }else if(this.checkItemAcceptance(newTarget.rowNode, m.source, newDropPosition.toLowerCase()) - && !this._isParentChildDrop(m.source, newTarget.rowNode)){ - m.canDrop(true); - }else{ - m.canDrop(false); - } - } - - this.targetAnchor = newTarget; - this.dropPosition = newDropPosition; - } - }, - - onMouseMove: function(e){ - // summary: - // Called for any onmousemove/ontouchmove events over the Tree - // e: Event - // onmousemouse/ontouchmove event - // tags: - // private - if(this.isDragging && this.targetState == "Disabled"){ return; } - this.inherited(arguments); - var m = DNDManager.manager(); - if(this.isDragging){ - this._onDragMouse(e); - }else{ - if(this.mouseDown && this.isSource && - (Math.abs(e.pageX-this._lastX)>=this.dragThreshold || Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){ - var nodes = this.getSelectedTreeNodes(); - if(nodes.length){ - if(nodes.length > 1){ - //filter out all selected items which has one of their ancestor selected as well - var seen = this.selection, i = 0, r = [], n, p; - nextitem: while((n = nodes[i++])){ - for(p = n.getParent(); p && p !== this.tree; p = p.getParent()){ - if(seen[p.id]){ //parent is already selected, skip this node - continue nextitem; - } - } - //this node does not have any ancestors selected, add it - r.push(n); - } - nodes = r; - } - nodes = array.map(nodes, function(n){return n.domNode}); - m.startDrag(this, nodes, this.copyState(connect.isCopyKey(e))); - this._onDragMouse(e, true); // because this may be the only mousemove event we get before the drop - } - } - } - }, - - onMouseDown: function(e){ - // summary: - // Event processor for onmousedown/ontouchstart - // e: Event - // onmousedown/ontouchend event - // tags: - // private - this.mouseDown = true; - this.mouseButton = e.button; - this._lastX = e.pageX; - this._lastY = e.pageY; - this.inherited(arguments); - }, - - onMouseUp: function(e){ - // summary: - // Event processor for onmouseup/ontouchend - // e: Event - // onmouseup/ontouchend event - // tags: - // private - if(this.mouseDown){ - this.mouseDown = false; - this.inherited(arguments); - } - }, - - onMouseOut: function(){ - // summary: - // Event processor for when mouse is moved away from a TreeNode - // tags: - // private - this.inherited(arguments); - this._unmarkTargetAnchor(); - }, - - checkItemAcceptance: function(/*===== target, source, position =====*/){ - // summary: - // Stub function to be overridden if one wants to check for the ability to drop at the node/item level - // description: - // In the base case, this is called to check if target can become a child of source. - // When betweenThreshold is set, position="before" or "after" means that we - // are asking if the source node can be dropped before/after the target node. - // target: DOMNode - // The dijitTreeRoot DOM node inside of the TreeNode that we are dropping on to - // Use dijit.getEnclosingWidget(target) to get the TreeNode. - // source: dijit/tree/dndSource - // The (set of) nodes we are dropping - // position: String - // "over", "before", or "after" - // tags: - // extension - return true; - }, - - // topic event processors - onDndSourceOver: function(source){ - // summary: - // Topic event processor for /dnd/source/over, called when detected a current source. - // source: Object - // The dijit/tree/dndSource / dojo/dnd/Source which has the mouse over it - // tags: - // private - if(this != source){ - this.mouseDown = false; - this._unmarkTargetAnchor(); - }else if(this.isDragging){ - var m = DNDManager.manager(); - m.canDrop(false); - } - }, - onDndStart: function(source, nodes, copy){ - // summary: - // Topic event processor for /dnd/start, called to initiate the DnD operation - // source: Object - // The dijit/tree/dndSource / dojo/dnd/Source which is providing the items - // nodes: DomNode[] - // The list of transferred items, dndTreeNode nodes if dragging from a Tree - // copy: Boolean - // Copy items, if true, move items otherwise - // tags: - // private - - if(this.isSource){ - this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : ""); - } - var accepted = this.checkAcceptance(source, nodes); - - this._changeState("Target", accepted ? "" : "Disabled"); - - if(this == source){ - DNDManager.manager().overSource(this); - } - - this.isDragging = true; - }, - - itemCreator: function(nodes /*===== , target, source =====*/){ - // summary: - // Returns objects passed to `Tree.model.newItem()` based on DnD nodes - // dropped onto the tree. Developer must override this method to enable - // dropping from external sources onto this Tree, unless the Tree.model's items - // happen to look like {id: 123, name: "Apple" } with no other attributes. - // description: - // For each node in nodes[], which came from source, create a hash of name/value - // pairs to be passed to Tree.model.newItem(). Returns array of those hashes. - // nodes: DomNode[] - // target: DomNode - // source: dojo/dnd/Source - // returns: __Item[] - // Array of name/value hashes for each new item to be added to the Tree - // tags: - // extension - - // TODO: for 2.0 refactor so itemCreator() is called once per drag node, and - // make signature itemCreator(sourceItem, node, target) (or similar). - - return array.map(nodes, function(node){ - return { - "id": node.id, - "name": node.textContent || node.innerText || "" - }; - }); // Object[] - }, - - onDndDrop: function(source, nodes, copy){ - // summary: - // Topic event processor for /dnd/drop, called to finish the DnD operation. - // description: - // Updates data store items according to where node was dragged from and dropped - // to. The tree will then respond to those data store updates and redraw itself. - // source: Object - // The dijit/tree/dndSource / dojo/dnd/Source which is providing the items - // nodes: DomNode[] - // The list of transferred items, dndTreeNode nodes if dragging from a Tree - // copy: Boolean - // Copy items, if true, move items otherwise - // tags: - // protected - if(this.containerState == "Over"){ - var tree = this.tree, - model = tree.model, - target = this.targetAnchor; - - this.isDragging = false; - - // Compute the new parent item - var newParentItem; - var insertIndex; - var before; // drop source before (aka previous sibling) of target - newParentItem = (target && target.item) || tree.item; - if(this.dropPosition == "Before" || this.dropPosition == "After"){ - // TODO: if there is no parent item then disallow the drop. - // Actually this should be checked during onMouseMove too, to make the drag icon red. - newParentItem = (target.getParent() && target.getParent().item) || tree.item; - // Compute the insert index for reordering - insertIndex = target.getIndexInParent(); - if(this.dropPosition == "After"){ - insertIndex = target.getIndexInParent() + 1; - before = target.getNextSibling() && target.getNextSibling().item; - }else{ - before = target.item; - } - }else{ - newParentItem = (target && target.item) || tree.item; - } - - // If necessary, use this variable to hold array of hashes to pass to model.newItem() - // (one entry in the array for each dragged node). - var newItemsParams; - - array.forEach(nodes, function(node, idx){ - // dojo/dnd/Item representing the thing being dropped. - // Don't confuse the use of item here (meaning a DnD item) with the - // uses below where item means dojo.data item. - var sourceItem = source.getItem(node.id); - - // Information that's available if the source is another Tree - // (possibly but not necessarily this tree, possibly but not - // necessarily the same model as this Tree) - if(array.indexOf(sourceItem.type, "treeNode") != -1){ - var childTreeNode = sourceItem.data, - childItem = childTreeNode.item, - oldParentItem = childTreeNode.getParent().item; - } - - if(source == this){ - // This is a node from my own tree, and we are moving it, not copying. - // Remove item from old parent's children attribute. - // TODO: dijit/tree/dndSelector should implement deleteSelectedNodes() - // and this code should go there. - - if(typeof insertIndex == "number"){ - if(newParentItem == oldParentItem && childTreeNode.getIndexInParent() < insertIndex){ - insertIndex -= 1; - } - } - model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex, before); - }else if(model.isItem(childItem)){ - // Item from same model - // (maybe we should only do this branch if the source is a tree?) - model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex, before); - }else{ - // Get the hash to pass to model.newItem(). A single call to - // itemCreator() returns an array of hashes, one for each drag source node. - if(!newItemsParams){ - newItemsParams = this.itemCreator(nodes, target.rowNode, source); - } - - // Create new item in the tree, based on the drag source. - model.newItem(newItemsParams[idx], newParentItem, insertIndex, before); - } - }, this); - - // Expand the target node (if it's currently collapsed) so the user can see - // where their node was dropped. In particular since that node is still selected. - this.tree._expandNode(target); - } - this.onDndCancel(); - }, - - onDndCancel: function(){ - // summary: - // Topic event processor for /dnd/cancel, called to cancel the DnD operation - // tags: - // private - this._unmarkTargetAnchor(); - this.isDragging = false; - this.mouseDown = false; - delete this.mouseButton; - this._changeState("Source", ""); - this._changeState("Target", ""); - }, - - // When focus moves in/out of the entire Tree - onOverEvent: function(){ - // summary: - // This method is called when mouse is moved over our container (like onmouseenter) - // tags: - // private - this.inherited(arguments); - DNDManager.manager().overSource(this); - }, - onOutEvent: function(){ - // summary: - // This method is called when mouse is moved out of our container (like onmouseleave) - // tags: - // private - this._unmarkTargetAnchor(); - var m = DNDManager.manager(); - if(this.isDragging){ - m.canDrop(false); - } - m.outSource(this); - - this.inherited(arguments); - }, - - _isParentChildDrop: function(source, targetRow){ - // summary: - // Checks whether the dragged items are parent rows in the tree which are being - // dragged into their own children. - // - // source: - // The DragSource object. - // - // targetRow: - // The tree row onto which the dragged nodes are being dropped. - // - // tags: - // private - - // If the dragged object is not coming from the tree this widget belongs to, - // it cannot be invalid. - if(!source.tree || source.tree != this.tree){ - return false; - } - - - var root = source.tree.domNode; - var ids = source.selection; - - var node = targetRow.parentNode; - - // Iterate up the DOM hierarchy from the target drop row, - // checking of any of the dragged nodes have the same ID. - while(node != root && !ids[node.id]){ - node = node.parentNode; - } - - return node.id && ids[node.id]; - }, - - _unmarkTargetAnchor: function(){ - // summary: - // Removes hover class of the current target anchor - // tags: - // private - if(!this.targetAnchor){ return; } - this._removeItemClass(this.targetAnchor.rowNode, this.dropPosition); - this.targetAnchor = null; - this.targetBox = null; - this.dropPosition = null; - }, - - _markDndStatus: function(copy){ - // summary: - // Changes source's state based on "copy" status - this._changeState("Source", copy ? "Copied" : "Moved"); - } -}); - -/*===== -dndSource.__Item = __Item; -=====*/ - -return dndSource; -}); diff --git a/lib/dijit/tree/model.js.uncompressed.js b/lib/dijit/tree/model.js.uncompressed.js deleted file mode 100644 index cae349890..000000000 --- a/lib/dijit/tree/model.js.uncompressed.js +++ /dev/null @@ -1,150 +0,0 @@ -define("dijit/tree/model", ["dojo/_base/declare"], function(declare){ - -return declare( - "dijit.tree.model", - null, -{ - // summary: - // Contract for any data provider object for the tree. - // description: - // Tree passes in values to the constructor to specify the callbacks. - // "item" is typically a dojo/data/Item but it's just a black box so - // it could be anything. - // - // This (like `dojo/data/api/Read`) is just documentation, and not meant to be used. - - destroy: function(){ - // summary: - // Destroys this object, releasing connections to the store - // tags: - // extension - }, - - // ======================================================================= - // Methods for traversing hierarchy - - getRoot: function(onItem){ - // summary: - // Calls onItem with the root item for the tree, possibly a fabricated item. - // Throws exception on error. - // tags: - // extension - }, - - mayHaveChildren: function(item){ - // summary: - // Tells if an item has or may have children. Implementing logic here - // avoids showing +/- expando icon for nodes that we know don't have children. - // (For efficiency reasons we may not want to check if an element actually - // has children until user clicks the expando node) - // item: dojo/data/Item - // tags: - // extension - }, - - getChildren: function(parentItem, onComplete){ - // summary: - // Calls onComplete() with array of child items of given parent item, all loaded. - // Throws exception on error. - // parentItem: dojo/data/Item - // onComplete: function(items) - // tags: - // extension - }, - - // ======================================================================= - // Inspecting items - - isItem: function(something){ - // summary: - // Returns true if *something* is an item and came from this model instance. - // Returns false if *something* is a literal, an item from another model instance, - // or is any object other than an item. - // tags: - // extension - }, - - fetchItemByIdentity: function(keywordArgs){ - // summary: - // Given the identity of an item, this method returns the item that has - // that identity through the onItem callback. Conforming implementations - // should return null if there is no item with the given identity. - // Implementations of fetchItemByIdentity() may sometimes return an item - // from a local cache and may sometimes fetch an item from a remote server. - // tags: - // extension - }, - - getIdentity: function(item){ - // summary: - // Returns identity for an item - // tags: - // extension - }, - - getLabel: function(item){ - // summary: - // Get the label for an item - // tags: - // extension - }, - - // ======================================================================= - // Write interface - - newItem: function(args, parent, insertIndex, before){ - // summary: - // Creates a new item. See `dojo/data/api/Write` for details on args. - // args: dijit/tree/dndSource.__Item - // parent: Item - // insertIndex: int? - // Allows to insert the new item as the n'th child of `parent`. - // before: Item? - // Insert the new item as the previous sibling of this item. `before` must be a child of `parent`. - // tags: - // extension - }, - - pasteItem: function(childItem, oldParentItem, newParentItem, bCopy, insertIndex, before){ - // summary: - // Move or copy an item from one parent item to another. - // Used in drag & drop. - // If oldParentItem is specified and bCopy is false, childItem is removed from oldParentItem. - // If newParentItem is specified, childItem is attached to newParentItem. - // childItem: Item - // oldParentItem: Item - // newParentItem: Item - // bCopy: Boolean - // insertIndex: int? - // Allows to insert the new item as the n'th child of `parent`. - // before: Item? - // Insert the new item as the previous sibling of this item. `before` must be a child of `parent`. - // tags: - // extension - }, - - // ======================================================================= - // Callbacks - - onChange: function(item){ - // summary: - // Callback whenever an item has changed, so that Tree - // can update the label, icon, etc. Note that changes - // to an item's children or parent(s) will trigger an - // onChildrenChange() so you can ignore those changes here. - // item: dojo/data/Item - // tags: - // callback - }, - - onChildrenChange: function(parent, newChildrenList){ - // summary: - // Callback to do notifications about new, updated, or deleted items. - // parent: dojo/data/Item - // newChildrenList: dojo/data/Item[] - // tags: - // callback - } -}); - -});
\ No newline at end of file diff --git a/lib/dijit/typematic.js.uncompressed.js b/lib/dijit/typematic.js.uncompressed.js deleted file mode 100644 index 476b8f0db..000000000 --- a/lib/dijit/typematic.js.uncompressed.js +++ /dev/null @@ -1,201 +0,0 @@ -define("dijit/typematic", [ - "dojo/_base/array", // array.forEach - "dojo/_base/connect", // connect.connect - "dojo/_base/event", // event.stop - "dojo/_base/kernel", // kernel.deprecated - "dojo/_base/lang", // lang.mixin, lang.hitch - "dojo/on", - "dojo/sniff", // has("ie") - "./main" // setting dijit.typematic global -], function(array, connect, event, kernel, lang, on, has, dijit){ - -// module: -// dijit/typematic - -var typematic = (dijit.typematic = { - // summary: - // These functions are used to repetitively call a user specified callback - // method when a specific key or mouse click over a specific DOM node is - // held down for a specific amount of time. - // Only 1 such event is allowed to occur on the browser page at 1 time. - - _fireEventAndReload: function(){ - this._timer = null; - this._callback(++this._count, this._node, this._evt); - - // Schedule next event, timer is at most minDelay (default 10ms) to avoid - // browser overload (particularly avoiding starving DOH robot so it never gets to send a mouseup) - this._currentTimeout = Math.max( - this._currentTimeout < 0 ? this._initialDelay : - (this._subsequentDelay > 1 ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay)), - this._minDelay); - this._timer = setTimeout(lang.hitch(this, "_fireEventAndReload"), this._currentTimeout); - }, - - trigger: function(/*Event*/ evt, /*Object*/ _this, /*DOMNode*/ node, /*Function*/ callback, /*Object*/ obj, /*Number?*/ subsequentDelay, /*Number?*/ initialDelay, /*Number?*/ minDelay){ - // summary: - // Start a timed, repeating callback sequence. - // If already started, the function call is ignored. - // This method is not normally called by the user but can be - // when the normal listener code is insufficient. - // evt: - // key or mouse event object to pass to the user callback - // _this: - // pointer to the user's widget space. - // node: - // the DOM node object to pass the the callback function - // callback: - // function to call until the sequence is stopped called with 3 parameters: - // count: - // integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped - // node: - // the DOM node object passed in - // evt: - // key or mouse event object - // obj: - // user space object used to uniquely identify each typematic sequence - // subsequentDelay: - // if > 1, the number of milliseconds until the 3->n events occur - // or else the fractional time multiplier for the next event's delay, default=0.9 - // initialDelay: - // the number of milliseconds until the 2nd event occurs, default=500ms - // minDelay: - // the maximum delay in milliseconds for event to fire, default=10ms - if(obj != this._obj){ - this.stop(); - this._initialDelay = initialDelay || 500; - this._subsequentDelay = subsequentDelay || 0.90; - this._minDelay = minDelay || 10; - this._obj = obj; - this._node = node; - this._currentTimeout = -1; - this._count = -1; - this._callback = lang.hitch(_this, callback); - this._evt = { faux: true }; - for(var attr in evt){ - if(attr != "layerX" && attr != "layerY"){ // prevent WebKit warnings - var v = evt[attr]; - if(typeof v != "function" && typeof v != "undefined"){ this._evt[attr] = v } - } - } - this._fireEventAndReload(); - } - }, - - stop: function(){ - // summary: - // Stop an ongoing timed, repeating callback sequence. - if(this._timer){ - clearTimeout(this._timer); - this._timer = null; - } - if(this._obj){ - this._callback(-1, this._node, this._evt); - this._obj = null; - } - }, - - addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ - // summary: - // Start listening for a specific typematic key. - // See also the trigger method for other parameters. - // keyObject: - // an object defining the key to listen for: - // - // - charOrCode: the printable character (string) or keyCode (number) to listen for. - // - keyCode: (deprecated - use charOrCode) the keyCode (number) to listen for (implies charCode = 0). - // - charCode: (deprecated - use charOrCode) the charCode (number) to listen for. - // - ctrlKey: desired ctrl key state to initiate the callback sequence: - // - pressed (true) - // - released (false) - // - either (unspecified) - // - altKey: same as ctrlKey but for the alt key - // - shiftKey: same as ctrlKey but for the shift key - // returns: - // a connection handle - - if(keyObject.keyCode){ - keyObject.charOrCode = keyObject.keyCode; - kernel.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0"); - }else if(keyObject.charCode){ - keyObject.charOrCode = String.fromCharCode(keyObject.charCode); - kernel.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0"); - } - var handles = [ - on(node, connect._keypress, lang.hitch(this, function(evt){ - if(evt.charOrCode == keyObject.charOrCode && - (keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) && - (keyObject.altKey === undefined || keyObject.altKey == evt.altKey) && - (keyObject.metaKey === undefined || keyObject.metaKey == (evt.metaKey || false)) && // IE doesn't even set metaKey - (keyObject.shiftKey === undefined || keyObject.shiftKey == evt.shiftKey)){ - event.stop(evt); - typematic.trigger(evt, _this, node, callback, keyObject, subsequentDelay, initialDelay, minDelay); - }else if(typematic._obj == keyObject){ - typematic.stop(); - } - })), - on(node, "keyup", lang.hitch(this, function(){ - if(typematic._obj == keyObject){ - typematic.stop(); - } - })) - ]; - return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } }; - }, - - addMouseListener: function(/*DOMNode*/ node, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ - // summary: - // Start listening for a typematic mouse click. - // See the trigger method for other parameters. - // returns: - // a connection handle - var handles = [ - on(node, "mousedown", lang.hitch(this, function(evt){ - evt.preventDefault(); - typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay); - })), - on(node, "mouseup", lang.hitch(this, function(evt){ - if(this._obj){ - evt.preventDefault(); - } - typematic.stop(); - })), - on(node, "mouseout", lang.hitch(this, function(evt){ - if(this._obj){ - evt.preventDefault(); - } - typematic.stop(); - })), - on(node, "dblclick", lang.hitch(this, function(evt){ - evt.preventDefault(); - if(has("ie") < 9){ - typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay); - setTimeout(lang.hitch(this, typematic.stop), 50); - } - })) - ]; - return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } }; - }, - - addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){ - // summary: - // Start listening for a specific typematic key and mouseclick. - // This is a thin wrapper to addKeyListener and addMouseListener. - // See the addMouseListener and addKeyListener methods for other parameters. - // mouseNode: - // the DOM node object to listen on for mouse events. - // keyNode: - // the DOM node object to listen on for key events. - // returns: - // a connection handle - var handles = [ - this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay, minDelay), - this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay, minDelay) - ]; - return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } }; - } -}); - -return typematic; - -}); |