/* Copyright (c) 2004-2008, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/book/dojo-book-0-9/introduction/licensing */ /* This is a compiled version of Dojo, built for deployment and not for development. To get an editable version, please visit: http://dojotoolkit.org for documentation and information on getting the source. */ if(!dojo._hasResource["dojo.colors"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo.colors"] = true; dojo.provide("dojo.colors"); //TODO: this module appears to break naming conventions /*===== dojo.colors = { // summary: Color utilities } =====*/ (function(){ // this is a standard conversion prescribed by the CSS3 Color Module var hue2rgb = function(m1, m2, h){ if(h < 0){ ++h; } if(h > 1){ --h; } var h6 = 6 * h; if(h6 < 1){ return m1 + (m2 - m1) * h6; } if(2 * h < 1){ return m2; } if(3 * h < 2){ return m1 + (m2 - m1) * (2 / 3 - h) * 6; } return m1; }; dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){ // summary: // get rgb(a) array from css-style color declarations // description: // this function can handle all 4 CSS3 Color Module formats: rgb, // rgba, hsl, hsla, including rgb(a) with percentage values. var m = color.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/); if(m){ var c = m[2].split(/\s*,\s*/), l = c.length, t = m[1]; if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){ var r = c[0]; if(r.charAt(r.length - 1) == "%"){ // 3 rgb percentage values var a = dojo.map(c, function(x){ return parseFloat(x) * 2.56; }); if(l == 4){ a[3] = c[3]; } return dojo.colorFromArray(a, obj); // dojo.Color } return dojo.colorFromArray(c, obj); // dojo.Color } if((t == "hsl" && l == 3) || (t == "hsla" && l == 4)){ // normalize hsl values var H = ((parseFloat(c[0]) % 360) + 360) % 360 / 360, S = parseFloat(c[1]) / 100, L = parseFloat(c[2]) / 100, // calculate rgb according to the algorithm // recommended by the CSS3 Color Module m2 = L <= 0.5 ? L * (S + 1) : L + S - L * S, m1 = 2 * L - m2, a = [hue2rgb(m1, m2, H + 1 / 3) * 256, hue2rgb(m1, m2, H) * 256, hue2rgb(m1, m2, H - 1 / 3) * 256, 1]; if(l == 4){ a[3] = c[3]; } return dojo.colorFromArray(a, obj); // dojo.Color } } return null; // dojo.Color }; var confine = function(c, low, high){ // summary: // sanitize a color component by making sure it is a number, // and clamping it to valid values c = Number(c); return isNaN(c) ? high : c < low ? low : c > high ? high : c; // Number }; dojo.Color.prototype.sanitize = function(){ // summary: makes sure that the object has correct attributes var t = this; t.r = Math.round(confine(t.r, 0, 255)); t.g = Math.round(confine(t.g, 0, 255)); t.b = Math.round(confine(t.b, 0, 255)); t.a = confine(t.a, 0, 1); return this; // dojo.Color }; })(); dojo.colors.makeGrey = function(/*Number*/ g, /*Number?*/ a){ // summary: creates a greyscale color with an optional alpha return dojo.colorFromArray([g, g, g, a]); }; // mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings dojo.Color.named = dojo.mixin({ aliceblue: [240,248,255], antiquewhite: [250,235,215], aquamarine: [127,255,212], azure: [240,255,255], beige: [245,245,220], bisque: [255,228,196], blanchedalmond: [255,235,205], blueviolet: [138,43,226], brown: [165,42,42], burlywood: [222,184,135], cadetblue: [95,158,160], chartreuse: [127,255,0], chocolate: [210,105,30], coral: [255,127,80], cornflowerblue: [100,149,237], cornsilk: [255,248,220], crimson: [220,20,60], cyan: [0,255,255], darkblue: [0,0,139], darkcyan: [0,139,139], darkgoldenrod: [184,134,11], darkgray: [169,169,169], darkgreen: [0,100,0], darkgrey: [169,169,169], darkkhaki: [189,183,107], darkmagenta: [139,0,139], darkolivegreen: [85,107,47], darkorange: [255,140,0], darkorchid: [153,50,204], darkred: [139,0,0], darksalmon: [233,150,122], darkseagreen: [143,188,143], darkslateblue: [72,61,139], darkslategray: [47,79,79], darkslategrey: [47,79,79], darkturquoise: [0,206,209], darkviolet: [148,0,211], deeppink: [255,20,147], deepskyblue: [0,191,255], dimgray: [105,105,105], dimgrey: [105,105,105], dodgerblue: [30,144,255], firebrick: [178,34,34], floralwhite: [255,250,240], forestgreen: [34,139,34], gainsboro: [220,220,220], ghostwhite: [248,248,255], gold: [255,215,0], goldenrod: [218,165,32], greenyellow: [173,255,47], grey: [128,128,128], honeydew: [240,255,240], hotpink: [255,105,180], indianred: [205,92,92], indigo: [75,0,130], ivory: [255,255,240], khaki: [240,230,140], lavender: [230,230,250], lavenderblush: [255,240,245], lawngreen: [124,252,0], lemonchiffon: [255,250,205], lightblue: [173,216,230], lightcoral: [240,128,128], lightcyan: [224,255,255], lightgoldenrodyellow: [250,250,210], lightgray: [211,211,211], lightgreen: [144,238,144], lightgrey: [211,211,211], lightpink: [255,182,193], lightsalmon: [255,160,122], lightseagreen: [32,178,170], lightskyblue: [135,206,250], lightslategray: [119,136,153], lightslategrey: [119,136,153], lightsteelblue: [176,196,222], lightyellow: [255,255,224], limegreen: [50,205,50], linen: [250,240,230], magenta: [255,0,255], mediumaquamarine: [102,205,170], mediumblue: [0,0,205], mediumorchid: [186,85,211], mediumpurple: [147,112,219], mediumseagreen: [60,179,113], mediumslateblue: [123,104,238], mediumspringgreen: [0,250,154], mediumturquoise: [72,209,204], mediumvioletred: [199,21,133], midnightblue: [25,25,112], mintcream: [245,255,250], mistyrose: [255,228,225], moccasin: [255,228,181], navajowhite: [255,222,173], oldlace: [253,245,230], olivedrab: [107,142,35], orange: [255,165,0], orangered: [255,69,0], orchid: [218,112,214], palegoldenrod: [238,232,170], palegreen: [152,251,152], paleturquoise: [175,238,238], palevioletred: [219,112,147], papayawhip: [255,239,213], peachpuff: [255,218,185], peru: [205,133,63], pink: [255,192,203], plum: [221,160,221], powderblue: [176,224,230], rosybrown: [188,143,143], royalblue: [65,105,225], saddlebrown: [139,69,19], salmon: [250,128,114], sandybrown: [244,164,96], seagreen: [46,139,87], seashell: [255,245,238], sienna: [160,82,45], skyblue: [135,206,235], slateblue: [106,90,205], slategray: [112,128,144], slategrey: [112,128,144], snow: [255,250,250], springgreen: [0,255,127], steelblue: [70,130,180], tan: [210,180,140], thistle: [216,191,216], tomato: [255,99,71], transparent: [0, 0, 0, 0], turquoise: [64,224,208], violet: [238,130,238], wheat: [245,222,179], whitesmoke: [245,245,245], yellowgreen: [154,205,50] }, dojo.Color.named); } if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojo.i18n"] = true; dojo.provide("dojo.i18n"); /*===== dojo.i18n = { // summary: Utility classes to enable loading of resources for internationalization (i18n) }; =====*/ dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){ // summary: // Returns an Object containing the localization for a given resource // bundle in a package, matching the specified locale. // description: // Returns a hash containing name/value pairs in its prototypesuch // that values can be easily overridden. Throws an exception if the // bundle is not found. Bundle must have already been loaded by // `dojo.requireLocalization()` or by a build optimization step. NOTE: // try not to call this method as part of an object property // definition (`var foo = { bar: dojo.i18n.getLocalization() }`). In // some loading situations, the bundle may not be available in time // for the object definition. Instead, call this method inside a // function that is run after all modules load or the page loads (like // in `dojo.addOnLoad()`), or in a widget lifecycle method. // packageName: // package which is associated with this resource // bundleName: // the base filename of the resource bundle (without the ".js" suffix) // locale: // the variant to load (optional). By default, the locale defined by // the host environment: dojo.locale locale = dojo.i18n.normalizeLocale(locale); // look for nearest locale match var elements = locale.split('-'); var module = [packageName,"nls",bundleName].join('.'); var bundle = dojo._loadedModules[module]; if(bundle){ var localization; for(var i = elements.length; i > 0; i--){ var loc = elements.slice(0, i).join('_'); if(bundle[loc]){ localization = bundle[loc]; break; } } if(!localization){ localization = bundle.ROOT; } // make a singleton prototype so that the caller won't accidentally change the values globally if(localization){ var clazz = function(){}; clazz.prototype = localization; return new clazz(); // Object } } throw new Error("Bundle not found: " + bundleName + " in " + packageName+" , locale=" + locale); }; dojo.i18n.normalizeLocale = function(/*String?*/locale){ // summary: // Returns canonical form of locale, as used by Dojo. // // description: // All variants are case-insensitive and are separated by '-' as specified in [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt). // If no locale is specified, the dojo.locale is returned. dojo.locale is defined by // the user agent's locale unless overridden by djConfig. var result = locale ? locale.toLowerCase() : dojo.locale; if(result == "root"){ result = "ROOT"; } return result; // String }; dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){ // summary: // See dojo.requireLocalization() // description: // Called by the bootstrap, but factored out so that it is only // included in the build when needed. var targetLocale = dojo.i18n.normalizeLocale(locale); var bundlePackage = [moduleName, "nls", bundleName].join("."); // NOTE: // When loading these resources, the packaging does not match what is // on disk. This is an implementation detail, as this is just a // private data structure to hold the loaded resources. e.g. // `tests/hello/nls/en-us/salutations.js` is loaded as the object // `tests.hello.nls.salutations.en_us={...}` The structure on disk is // intended to be most convenient for developers and translators, but // in memory it is more logical and efficient to store in a different // order. Locales cannot use dashes, since the resulting path will // not evaluate as valid JS, so we translate them to underscores. //Find the best-match locale to load if we have available flat locales. var bestLocale = ""; if(availableFlatLocales){ var flatLocales = availableFlatLocales.split(","); for(var i = 0; i < flatLocales.length; i++){ //Locale must match from start of string. if(targetLocale.indexOf(flatLocales[i]) == 0){ if(flatLocales[i].length > bestLocale.length){ bestLocale = flatLocales[i]; } } } if(!bestLocale){ bestLocale = "ROOT"; } } //See if the desired locale is already loaded. var tempLocale = availableFlatLocales ? bestLocale : targetLocale; var bundle = dojo._loadedModules[bundlePackage]; var localizedBundle = null; if(bundle){ if(dojo.config.localizationComplete && bundle._built){return;} var jsLoc = tempLocale.replace(/-/g, '_'); var translationPackage = bundlePackage+"."+jsLoc; localizedBundle = dojo._loadedModules[translationPackage]; } if(!localizedBundle){ bundle = dojo["provide"](bundlePackage); var syms = dojo._getModuleSymbols(moduleName); var modpath = syms.concat("nls").join("/"); var parent; dojo.i18n._searchLocalePath(tempLocale, availableFlatLocales, function(loc){ var jsLoc = loc.replace(/-/g, '_'); var translationPackage = bundlePackage + "." + jsLoc; var loaded = false; if(!dojo._loadedModules[translationPackage]){ // Mark loaded whether it's found or not, so that further load attempts will not be made dojo["provide"](translationPackage); var module = [modpath]; if(loc != "ROOT"){module.push(loc);} module.push(bundleName); var filespec = module.join("/") + '.js'; loaded = dojo._loadPath(filespec, null, function(hash){ // Use singleton with prototype to point to parent bundle, then mix-in result from loadPath var clazz = function(){}; clazz.prototype = parent; bundle[jsLoc] = new clazz(); for(var j in hash){ bundle[jsLoc][j] = hash[j]; } }); }else{ loaded = true; } if(loaded && bundle[jsLoc]){ parent = bundle[jsLoc]; }else{ bundle[jsLoc] = parent; } if(availableFlatLocales){ //Stop the locale path searching if we know the availableFlatLocales, since //the first call to this function will load the only bundle that is needed. return true; } }); } //Save the best locale bundle as the target locale bundle when we know the //the available bundles. if(availableFlatLocales && targetLocale != bestLocale){ bundle[targetLocale.replace(/-/g, '_')] = bundle[bestLocale.replace(/-/g, '_')]; } }; (function(){ // If other locales are used, dojo.requireLocalization should load them as // well, by default. // // Override dojo.requireLocalization to do load the default bundle, then // iterate through the extraLocale list and load those translations as // well, unless a particular locale was requested. var extra = dojo.config.extraLocale; if(extra){ if(!extra instanceof Array){ extra = [extra]; } var req = dojo.i18n._requireLocalization; dojo.i18n._requireLocalization = function(m, b, locale, availableFlatLocales){ req(m,b,locale, availableFlatLocales); if(locale){return;} for(var i=0; i 0; i--){ searchlist.push(elements.slice(0, i).join('-')); } searchlist.push(false); if(down){searchlist.reverse();} for(var j = searchlist.length - 1; j >= 0; j--){ var loc = searchlist[j] || "ROOT"; var stop = searchFunc(loc); if(stop){ break; } } }; dojo.i18n._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated){ // summary: // Load built, flattened resource bundles, if available for all // locales used in the page. Only called by built layer files. function preload(locale){ locale = dojo.i18n.normalizeLocale(locale); dojo.i18n._searchLocalePath(locale, true, function(loc){ for(var i=0; i // // example: // | var picker = new dijit.ColorPalette({ },srcNode); // | picker.startup(); // // 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 // < 1.0 means that each typematic event fires at an increasing faster rate timeoutChangeRate: 0.90, // palette: String // Size of grid, either "7x10" or "3x4". palette: "7x10", //_value: String // The value of the selected color. value: null, //_currentFocus: Integer // Index of the currently focused color. _currentFocus: 0, // _xDim: Integer // This is the number of colors horizontally across. _xDim: null, // _yDim: Integer /// This is the number of colors vertically down. _yDim: null, // _palettes: Map // This represents the value of the colors. // The first level is a hashmap of the different arrays 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"]] }, // _imagePaths: Map // This is stores the path to the palette images _imagePaths: { "7x10": dojo.moduleUrl("dijit", "templates/colors7x10.png"), "3x4": dojo.moduleUrl("dijit", "templates/colors3x4.png") }, // _paletteCoords: Map // This is a map that is used to calculate the coordinates of the // images that make up the palette. _paletteCoords: { "leftOffset": 3, "topOffset": 3, "cWidth": 20, "cHeight": 20 }, // templatePath: String // Path to the template of this widget. templateString:"
\n\t
\n\t\t\n\t
\t\n
\n", // _paletteDims: Object // Size of the supported palettes for alignment purposes. _paletteDims: { "7x10": {"width": "206px", "height": "145px"}, "3x4": {"width": "86px", "height": "64px"} }, // tabIndex: String // Widget tabindex. tabIndex: "0", postCreate: function(){ // A name has to be given to the colorMap, this needs to be unique per Palette. dojo.mixin(this.divNode.style, this._paletteDims[this.palette]); this.imageNode.setAttribute("src", this._imagePaths[this.palette]); var choices = this._palettes[this.palette]; this.domNode.style.position = "relative"; this._cellNodes = []; this.colorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang); var url = dojo.moduleUrl("dojo", "resources/blank.gif"), colorObject = new dojo.Color(), coords = this._paletteCoords; for(var row=0; row < choices.length; row++){ for(var col=0; col < choices[row].length; col++) { var imgNode = dojo.doc.createElement("img"); imgNode.src = url; dojo.addClass(imgNode, "dijitPaletteImg"); var color = choices[row][col], colorValue = colorObject.setColor(dojo.Color.named[color]); imgNode.alt = this.colorNames[color]; imgNode.color = colorValue.toHex(); var imgStyle = imgNode.style; imgStyle.color = imgStyle.backgroundColor = imgNode.color; var cellNode = dojo.doc.createElement("span"); cellNode.appendChild(imgNode); dojo.forEach(["Dijitclick", "MouseEnter", "Focus", "Blur"], function(handler) { this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler); }, this); this.divNode.appendChild(cellNode); var cellStyle = cellNode.style; cellStyle.top = coords.topOffset + (row * coords.cHeight) + "px"; cellStyle.left = coords.leftOffset + (col * coords.cWidth) + "px"; dojo.attr(cellNode, "tabindex", "-1"); cellNode.title = this.colorNames[color]; dojo.addClass(cellNode, "dijitPaletteCell"); dijit.setWaiRole(cellNode, "gridcell"); cellNode.index = this._cellNodes.length; this._cellNodes.push(cellNode); } } this._xDim = choices[0].length; this._yDim = choices.length; this.connect(this.divNode, "onfocus", "_onDivNodeFocus"); // 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 color. // 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: 1, LEFT_ARROW: -1 }; for(var key in keyIncrementMap){ this._connects.push(dijit.typematic.addKeyListener(this.domNode, {keyCode:dojo.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)); } }, focus: function(){ // summary: // Focus this ColorPalette. Puts focus on the first swatch. this._focusFirst(); }, onChange: function(color){ // summary: // Callback when a color is selected. // color: String // Hex value corresponding to color. // console.debug("Color selected is: "+color); }, _focusFirst: function(){ this._currentFocus = 0; var cellNode = this._cellNodes[this._currentFocus]; window.setTimeout(function(){dijit.focus(cellNode)}, 0); }, _onDivNodeFocus: function(evt){ // focus bubbles on Firefox 2, so just make sure that focus has really // gone to the container if(evt.target === this.divNode){ this._focusFirst(); } }, _onFocus: function(){ // while focus is on the palette, set its tabindex to -1 so that on a // shift-tab from a cell, the container is not in the tab order dojo.attr(this.divNode, "tabindex", "-1"); }, _onBlur: function(){ this._removeCellHighlight(this._currentFocus); // when focus leaves the palette, restore its tabindex, since it was // modified by _onFocus(). dojo.attr(this.divNode, "tabindex", this.tabIndex); }, _onCellDijitclick: function(/*Event*/ evt){ // summary: // Handler for click, enter key & space key. Selects the color. // evt: // The event. var target = evt.currentTarget; if (this._currentFocus != target.index){ this._currentFocus = target.index; window.setTimeout(function(){dijit.focus(target)}, 0); } this._selectColor(target); dojo.stopEvent(evt); }, _onCellMouseEnter: function(/*Event*/ evt){ // summary: // Handler for onMouseOver. Put focus on the color under the mouse. // evt: // The mouse event. var target = evt.currentTarget; window.setTimeout(function(){dijit.focus(target)}, 0); }, _onCellFocus: function(/*Event*/ evt){ // summary: // Handler for onFocus. Removes highlight of // the color that just lost focus, and highlights // the new color. // evt: // The focus event. this._removeCellHighlight(this._currentFocus); this._currentFocus = evt.currentTarget.index; dojo.addClass(evt.currentTarget, "dijitPaletteCellHighlight"); }, _onCellBlur: function(/*Event*/ evt){ // summary: // needed for Firefox 2 on Mac OS X this._removeCellHighlight(this._currentFocus); }, _removeCellHighlight: function(index){ dojo.removeClass(this._cellNodes[index], "dijitPaletteCellHighlight"); }, _selectColor: function(selectNode){ // summary: // This selects a color. It triggers the onChange event // area: // The area node that covers the color being selected. var img = selectNode.getElementsByTagName("img")[0]; this.onChange(this.value = img.color); }, _navigateByKey: function(increment, typeCount){ // summary: // This is the callback for typematic. // It changes the focus and the highlighed color. // increment: // How much the key is navigated. // typeCount: // How many times typematic has fired. // typecount == -1 means the key is released. if(typeCount == -1){ return; } var newFocusIndex = this._currentFocus + increment; if(newFocusIndex < this._cellNodes.length && newFocusIndex > -1) { var focusNode = this._cellNodes[newFocusIndex]; focusNode.focus(); } } }); } if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dijit.Declaration"] = true; dojo.provide("dijit.Declaration"); dojo.declare( "dijit.Declaration", dijit._Widget, { // summary: // The Declaration widget allows a user to declare new widget // classes directly from a snippet of markup. _noScript: true, widgetClass: "", replaceVars: true, defaults: null, mixins: [], buildRendering: function(){ var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef); var preambles = dojo.query("> script[type='dojo/method'][event='preamble']", src).orphan(); var scripts = dojo.query("> script[type^='dojo/']", src).orphan(); var srcType = src.nodeName; var propList = this.defaults||{}; // map array of strings like [ "dijit.form.Button" ] to array of mixin objects // (note that dojo.map(this.mixins, dojo.getObject) doesn't work because it passes // a bogus third argument to getObject(), confusing it) this.mixins = this.mixins.length ? dojo.map(this.mixins, function(name){ return dojo.getObject(name); } ) : [ dijit._Widget, dijit._Templated ]; if(preambles.length){ // we only support one preamble. So be it. propList.preamble = dojo.parser._functionFromScript(preambles[0]); } var parsedScripts = dojo.map(scripts, function(s){ var evt = s.getAttribute("event")||"postscript"; return { event: evt, func: dojo.parser._functionFromScript(s) }; }); // do the connects for each "'+ ' dojoAttachPoint="iframe,styleNode" dojoAttachEvent="onblur:_onIframeBlur" class="dijitInline dijitInputField dijitTextArea">') + '' + ((dojo.isIE || dojo.isSafari || dojo.isFF >= 3) ? '':'') : '', setAttribute: function(/*String*/ attr, /*anything*/ value){ this.inherited(arguments); switch(attr){ case "disabled": this.formValueNode.disabled = this.disabled; case "readOnly": if(dojo.isIE || dojo.isSafari || dojo.isFF >= 3){ this.editNode.contentEditable = (!this.disabled && !this.readOnly); }else if(dojo.isFF){ this.iframe.contentDocument.designMode = (this.disabled || this.readOnly)? "off" : "on"; } } }, focus: function(){ // summary: Received focus, needed for the InlineEditBox widget if(!this.disabled && !this.readOnly){ this._changing(); // set initial height } dijit.focus(this.iframe || this.focusNode); }, setValue: function(/*String*/ value, /*Boolean, optional*/ priorityChange){ var editNode = this.editNode; if(typeof value == "string"){ editNode.innerHTML = ""; // wipe out old nodes if(value.split){ var _this=this; var isFirst = true; dojo.forEach(value.split("\n"), function(line){ if(isFirst){ isFirst = false; } else{ editNode.appendChild(dojo.doc.createElement("BR")); // preserve line breaks } if(line){ editNode.appendChild(dojo.doc.createTextNode(line)); // use text nodes so that imbedded tags can be edited } }); }else if(value){ editNode.appendChild(dojo.doc.createTextNode(value)); } if(!dojo.isIE){ editNode.appendChild(dojo.doc.createElement("BR")); // so that you see a cursor } }else{ // blah
blah --> blah\nblah //

blah

blah

--> blah\nblah //
blah
blah
--> blah\nblah // &<> -->&< > value = editNode.innerHTML; if(this.iframe){ // strip sizeNode value = value.replace(/
<\/div>\r?\n?$/i,""); } value = value.replace(/\s*\r?\n|^\s+|\s+$| /g,"").replace(/>\s+<").replace(/<\/(p|div)>$|^<(p|div)[^>]*>/gi,"").replace(/([^>])
/g,"$1\n").replace(/<\/p>\s*]*>|]*>|<\/div>\s*]*>/gi,"\n").replace(/<[^>]*>/g,"").replace(/&/gi,"\&").replace(/</gi,"<").replace(/>/gi,">"); if(!dojo.isIE){ value = value.replace(/\n$/,""); // remove added
} } this.value = this.formValueNode.value = value; if(this.iframe){ var sizeNode = dojo.doc.createElement('div'); editNode.appendChild(sizeNode); var newHeight = sizeNode.offsetTop; if(editNode.scrollWidth > editNode.clientWidth){ newHeight+=16; } // scrollbar space needed? if(this.lastHeight != newHeight){ // cache size so that we don't get a resize event because of a resize event if(newHeight == 0){ newHeight = 16; } // height = 0 causes the browser to not set scrollHeight dojo.contentBox(this.iframe, {h: newHeight}); this.lastHeight = newHeight; } editNode.removeChild(sizeNode); } dijit.form.Textarea.superclass.setValue.call(this, this.getValue(), priorityChange); }, getValue: function(){ return this.value.replace(/\r/g,""); }, postMixInProperties: function(){ this.inherited(arguments); // don't let the source text be converted to a DOM structure since we just want raw text if(this.srcNodeRef && this.srcNodeRef.innerHTML != ""){ this.value = this.srcNodeRef.innerHTML; this.srcNodeRef.innerHTML = ""; } if((!this.value || this.value == "") && this.srcNodeRef && this.srcNodeRef.value){ this.value = this.srcNodeRef.value; } if(!this.value){ this.value = ""; } this.value = this.value.replace(/\r\n/g,"\n").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&"); if(dojo.isFF == 2){ // In the case of Firefox an iframe is used and when the text gets focus, // focus is fired from the document object. There isn't a way to put a // waiRole on the document object and as a result screen readers don't // announce the role. As a result screen reader users are lost. // // An additional problem is that the browser gives the document object a // very cryptic accessible name, e.g. // wysiwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html // When focus is fired from the document object, the screen reader speaks // the accessible name. The cyptic accessile name is confusing. // // A workaround for both of these problems is to give the iframe's // document a title, the name of which is similar to a role name, i.e. // "edit area". This will be used as the accessible name which will replace // the cryptic name and will also convey the role information to the user. // Because it is read directly to the user, the string must be localized. // In addition, since a